diff --git a/docs/.generated/plugin-sdk-api-baseline.jsonl b/docs/.generated/plugin-sdk-api-baseline.jsonl index 6d5ea3d5bd3a..d34b0beb8677 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":"386470d290d980e3bf8cb8863a967d02bcf7b184acd9e33ae704649f5ff29f2f","declaration":"export function createOpenClawCodingTools(options?: OpenClawCodingToolsOptions): AnyAgentTool[];","entrypoint":"agent-harness","exportName":"createOpenClawCodingTools","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"function","recordType":"export"} +{"closureHash":"d0cc2d1a92a55bfe73ad51bb32078cf4e8911a2a5a2f1c2f3190ba044922e56b","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":"ba0ca4adfbc76bcafbbe9487387636983a2c78cf10d056c44c6a9fd9d5191914","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} -{"closureHash":"4914539ab49e7df134ad9aa32d4b13180cffe14571dd585092cfdf77d79c490a","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"d759a25775cb15d3f1804e39e98518f83b67b29ba3ab2fd84d4bf16106d9fdb9","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"bd666466495cef203461f4484eb439faa6a4fd10756c44a64a45ddef3b65961c","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":"21dd7ef82b095493961f4dd77b41c3574f64ea94fc0a7ef48aa24df1a51d015c","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} -{"closureHash":"38b2e8da7857da2d07a2d5b34968f66fbbad5d3e0254ddce3518c6a7e414f860","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"7cce5f7355df47a66ed208855889b16b2c40782a75575e8e1a8dce43517b801f","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness","kind":"type","recordType":"export"} +{"closureHash":"b56f77aa308700cc9ea82f50957a860852d0c83c006b5020d97f0d9b2d6c9d6a","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"} @@ -74,16 +74,16 @@ {"closureHash":"155d94754b1411dd9b9fdae11ca094cbce25610ffb1dd9a617f293596b3a78f7","declaration":"export function assertContextEngineHostSupport(params: { contextEngine: ContextEngine; operation: ContextEngineOperation; host: ContextEngineHostSupport; }): void;","entrypoint":"agent-harness-runtime","exportName":"assertContextEngineHostSupport","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"3209ee56dbd86be4de23a2de59903a4d310fc99ed912d220ebe57efd308ff14f","declaration":"export function assignMcpCatalogSafeServerNames(serverNames: Iterable): Map;","entrypoint":"agent-harness-runtime","exportName":"assignMcpCatalogSafeServerNames","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"911838521fabe5f74acfeadabfa855fd9857fa21671b3f0cad08779f3402825a","declaration":"export function attachModelProviderRequestTransport(model: TModel, request: ModelProviderRequestTransportOverrides | undefined): TModel;","entrypoint":"agent-harness-runtime","exportName":"attachModelProviderRequestTransport","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"5a1f9481bcbe41730c3259db1c42eb4562289a46d7f82f7a22e5c5f77469b746","declaration":"export function awaitAgentEndSideEffects(params: AgentEndSideEffectsParams): Promise;","entrypoint":"agent-harness-runtime","exportName":"awaitAgentEndSideEffects","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"9c31e4020485bc1867573ebdce41610a19c119c6072589c7f82c4c8c9d7d5986","declaration":"export function awaitAgentHarnessAgentEndHook(params: { event: PluginHookAgentEndEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"awaitAgentHarnessAgentEndHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"64e007f47389deb6c1a022f914aaff14269e34e906cd29a71464276a9f756560","declaration":"export function awaitAgentEndSideEffects(params: AgentEndSideEffectsParams): Promise;","entrypoint":"agent-harness-runtime","exportName":"awaitAgentEndSideEffects","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"ef4cde7cdb9402c3651d90cd36780563d7650cbbd3b83820c5cd94d74e8a9ee8","declaration":"export function awaitAgentHarnessAgentEndHook(params: { event: PluginHookAgentEndEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"awaitAgentHarnessAgentEndHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"73d8efb2d4171745da0c8f433ec80363cd9ce26b0d76be0cdddaa077489a5134","declaration":"export function bootstrapHarnessContextEngine(params: { hadSessionFile: boolean; contextEngine?: HarnessContextEngine; sessionId: string; sessionKey?: string; sessionTarget?: ContextEngineSessionTarget; sessionFile: string; sessionManager?: unknown; runtimeContext?: ContextEngineRuntimeContext; transcriptReadFence?: UserTurnTranscriptAdmissionReceipt; runtimeSettings?: ContextEngineRuntimeSettings; contextEngineHostSupport?: ContextEngineHostSupport; harnessId?: string | null; runtimeId?: string | null; providerId?: string | null; requestedModelId?: string | null; modelId?: string | null; maxOutputTokens?: number | null; fallbackReason?: string | null; degradedReason?: string | null; runMaintenance?: typeof runHarnessContextEngineMaintenance; config?: OpenClawConfig; warn: (message: string) => void; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"bootstrapHarnessContextEngine","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"fdd485fc00b19e46356354d24cc924c694fbb8c01a01e16048183880a3fbf50d","declaration":"export function buildAgentHarnessUserInputAnswers(questions: readonly AgentHarnessUserInputQuestion[], inputText: string): AgentHarnessUserInputAnswers;","entrypoint":"agent-harness-runtime","exportName":"buildAgentHarnessUserInputAnswers","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"bcc8554c0316257b42e7ca95e16c6b1f3bfb9794e5db7f41cf2bcdd2464bb218","declaration":"export function buildAgentHookContextChannelFields(params: { sessionKey?: string | null; messageChannel?: string | null; messageProvider?: string | null; currentChannelId?: string | null; messageTo?: string | null; senderId?: string | null; agentAccountId?: string | null; }): Pick;","entrypoint":"agent-harness-runtime","exportName":"buildAgentHookContextChannelFields","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"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":"b4fb9e08ae2a178eaa565903b17309bc3280fbfbdaff154641496fe1d0ababa1","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":"aee437c5a340973c5080306d7bbb072ceb1e2f23743161c9700578c295aedea9","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":"273bc789e32d09355911a553f30e7fd13f0ac7fc7d08f76d6c6ea96b8ab4e1d3","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":"9cd796a6dc567e647776b5d9af435e8c179796142948b64b088eb9e91c42ba66","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"} @@ -93,14 +93,14 @@ {"closureHash":"bf55b958c3286fea4672610d48a369742c4a6fec7b8ef0f0be14281d1699d4c9","declaration":"export function classifyAgentHarnessTerminalOutcome(params: AgentHarnessTerminalOutcomeInput): AgentHarnessTerminalOutcomeClassification | undefined;","entrypoint":"agent-harness-runtime","exportName":"classifyAgentHarnessTerminalOutcome","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c99df58ff424f25ee1d84c9908a09514bd261a3d506217eb93366f6f1110ee04","declaration":"export function classifyEmbeddedAgentRunResultForModelFallback(params: { provider: string; model: string; result: unknown; hasDirectlySentBlockReply?: boolean; hasBlockReplyPipelineOutput?: boolean; }): ModelFallbackResultClassification;","entrypoint":"agent-harness-runtime","exportName":"classifyEmbeddedAgentRunResultForModelFallback","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c99df58ff424f25ee1d84c9908a09514bd261a3d506217eb93366f6f1110ee04","declaration":"export function classifyEmbeddedPiRunResultForModelFallback(params: { provider: string; model: string; result: unknown; hasDirectlySentBlockReply?: boolean; hasBlockReplyPipelineOutput?: boolean; }): ModelFallbackResultClassification;","entrypoint":"agent-harness-runtime","exportName":"classifyEmbeddedPiRunResultForModelFallback","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"43cd462887e7d56ac059c7f6f9788ed976fb8a42dec7717d17aaf7ba08e60b45","declaration":"export function clearActiveEmbeddedRun(sessionId: string, handle: EmbeddedAgentQueueHandle, sessionKey?: string, sessionFile?: string, reason?: string): void;","entrypoint":"agent-harness-runtime","exportName":"clearActiveEmbeddedRun","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"9f0bd86cc988e82b14208406c6cff983a7bde6111e1e02e4f93376e5bc53017f","declaration":"export function clearActiveEmbeddedRun(sessionId: string, handle: EmbeddedAgentQueueHandle, sessionKey?: string, sessionFile?: string, reason?: string): void;","entrypoint":"agent-harness-runtime","exportName":"clearActiveEmbeddedRun","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"b35d595e75152211de29f3ecd18c3453660ee55598a26d6619d4bbde1f7472df","declaration":"export function compactContextEngineWithSafetyTimeout(contextEngine: Pick, params: ContextEngineCompactParams, timeoutMs?: number, abortSignal?: AbortSignal): Promise;","entrypoint":"agent-harness-runtime","exportName":"compactContextEngineWithSafetyTimeout","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c1107b4615dfdfa6fe68fcbc141df52041501f790649b0a008d7c23d6e499824","declaration":"export function compactWithSafetyTimeout(compact: (abortSignal?: AbortSignal) => Promise, timeoutMs?: number, opts?: { abortSignal?: AbortSignal; onCancel?: () => void; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"compactWithSafetyTimeout","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"ed18c0da74521f3ab5111f5a85ec652d7ee6bbb82baa64ee57f31ec4423be696","declaration":"export function consumeAdjustedParamsForToolCall(toolCallId: string, runId?: string): unknown;","entrypoint":"agent-harness-runtime","exportName":"consumeAdjustedParamsForToolCall","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"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":"2cc350195e83eedd882b89c97eb5cb04b1e3b3d305e428c55e20a65276642530","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":"1368f69c7a2b975961e4bec1a8709522669fed0df0eca2d669159c9e65eb1cf3","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"} @@ -123,7 +123,7 @@ {"closureHash":"5fa61424d7471cf6f3b142964294cca4723eefc5b673eff97b2b1a8b3f139172","declaration":"export function formatToolAggregate(toolName?: string, metas?: string[], options?: ToolAggregateOptions): string;","entrypoint":"agent-harness-runtime","exportName":"formatToolAggregate","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"cb9c705d6862116c7c61a3cc3941f8fea1c834ad14a628441cff1d1a697eb00b","declaration":"export function formatToolExecutionErrorMessage(error: unknown, fallback: string): string;","entrypoint":"agent-harness-runtime","exportName":"formatToolExecutionErrorMessage","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"16ca31a0ec0bec339d1a9ac63252eec5665d00d763c20075a93be176dc098239","declaration":"export function formatToolProgressOutput(output: string, options?: { maxChars?: number; }): string | undefined;","entrypoint":"agent-harness-runtime","exportName":"formatToolProgressOutput","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"43d14ee5a05c9d84c9d1b8b966882a48c1e8b68d6b7455d041a1d2d61156f4b8","declaration":"export function getAgentHarnessHookRunner(): AgentHarnessHookRunner;","entrypoint":"agent-harness-runtime","exportName":"getAgentHarnessHookRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"ed37bb17e6b49e1120950b88390fa7e9cb14202bf2aeab1bded96c07eb774f47","declaration":"export function getAgentHarnessHookRunner(): AgentHarnessHookRunner;","entrypoint":"agent-harness-runtime","exportName":"getAgentHarnessHookRunner","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"37c1f0f87fd002e7de9ddb6ec0e4389e7add214dd3ceb6001077038f395d8451","declaration":"export function getBeforeToolCallFailureDisposition(error: unknown): BeforeToolCallFailureDisposition | undefined;","entrypoint":"agent-harness-runtime","exportName":"getBeforeToolCallFailureDisposition","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"2f995f2a9777cac11240f0dd375d2041fdc11ca0ad57c65e102db3d0be6b6f62","declaration":"export function getBeforeToolCallPolicyDiagnosticState(): BeforeToolCallPolicyDiagnosticState;","entrypoint":"agent-harness-runtime","exportName":"getBeforeToolCallPolicyDiagnosticState","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"45828b5ebf771446b493a1af9dee71e58aa8b96a28957a633e5fd5f3d6bfcaa4","declaration":"export function getChannelAgentToolMeta(tool: ChannelAgentTool): ChannelAgentToolMeta | undefined;","entrypoint":"agent-harness-runtime","exportName":"getChannelAgentToolMeta","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} @@ -161,8 +161,8 @@ {"closureHash":"8f196b3b00a67083a3ce09ac958d3e620b2b24c76e76c012ff4d914785c6465e","declaration":"export function projectAgentHarnessTranscriptMessageForDisplay(params: { hidden: boolean; message: T; }): T;","entrypoint":"agent-harness-runtime","exportName":"projectAgentHarnessTranscriptMessageForDisplay","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"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":"2cbefa09010966eae028310dcf3e8f918b35e79339c5d662b6949dc8ac78a213","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":"28fce991efc7c1c2e4d24a5380acdeca72aea42a3e3b14d053ec352a84ab5211","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":"a5942178bfa7de60f6b738d58d5f511a7baa1abf25119454180b81daec365833","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"} @@ -190,21 +190,21 @@ {"closureHash":"f2fb5a4e5546086c8a69600795e5b6cde1817b2ba5a4680600c41297005b3ee2","declaration":"export function resolveUserPath(input: string, env?: NodeJS.ProcessEnv, homedir?: () => string): string;","entrypoint":"agent-harness-runtime","exportName":"resolveUserPath","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"4204798ce3bf40e0b488d6642a9617f361e53931f634042fcd09dde69f3924c4","declaration":"export function resolveWritableSandboxBindHostRoots(binds: readonly string[] | undefined): string[];","entrypoint":"agent-harness-runtime","exportName":"resolveWritableSandboxBindHostRoots","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"10e5de5d2202452344eca9023fccecd19bcede51b031fe7926bd6335e7767158","declaration":"export function runAgentCleanupStep(params: { runId: string; sessionId: string; step: string; cleanup: () => Promise; getTimeoutDetails?: () => string | undefined; log: AgentCleanupLogger; env?: NodeJS.ProcessEnv; timeoutMs?: number; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentCleanupStep","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"816bf59dedc19b85f9da621b41b7a73ac2c0b4c4729c044322948f57aa9bda4b","declaration":"export function runAgentEndSideEffects(params: AgentEndSideEffectsParams): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentEndSideEffects","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"8158f730012e93bff519315eb8188240fdd033e288ab0bb7350d41d693987f74","declaration":"export function runAgentEndSideEffects(params: AgentEndSideEffectsParams): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentEndSideEffects","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"a88818cc62232eeb75281bb6ccfbaf7928a4bb1390313c73c08b14c73e4e92bb","declaration":"export function runAgentHarnessAfterCompactionHook(params: { sessionFile: string; messages?: AgentMessage[]; ctx: AgentHarnessHookContext; compactedCount: number; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessAfterCompactionHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"d6517f30fc90c4fa8ef89ac0fe3d6499adcfad71fd3ab46cc66d3e4a2472a844","declaration":"export function runAgentHarnessAfterToolCallHook(params: { toolName: string; toolCallId: string; runId?: string; agentId?: string; sessionId?: string; sessionKey?: string; channelId?: string; startArgs: Record; result?: unknown; error?: string; startedAt?: number; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessAfterToolCallHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"58ae81c43c770b2b7586014081120e123c4c4223b89cdd7b9649eb2f98a1d9a0","declaration":"export function runAgentHarnessAgentEndHook(params: { event: PluginHookAgentEndEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessAgentEndHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"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":"63e138290e4629046b4b6f56e8601979be5e851ea930d9f95daef8eb8d6527c3","declaration":"export function runAgentHarnessAgentEndHook(params: { event: PluginHookAgentEndEvent; ctx: AgentHarnessHookContext; hookRunner?: AgentHarnessHookRunner; }): void;","entrypoint":"agent-harness-runtime","exportName":"runAgentHarnessAgentEndHook","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"da8b724c5858691b8a1c71c63294a397631c031270db92fdff9ef4493efa2492","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":"0fb8eda48df904e43c6cfd11ddc37f385e68249574bda1db6f6e4fe56ae05f32","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":"234d68d071e378bce7a3780dd308a39e6f611b722d86203c3366951420d9f1b1","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":"89aa32c12a44b446777bc4cfbb106a048dd9cbc668260525798a895a433256f4","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":"ba63f9cdd34249fba984af87a039494b75b3f93c0c70b925e884f3f98935b984","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"} {"closureHash":"35268edd668bcf1981dff5f000b8bbb5847a1a9bb7e8923769edc378e21108aa","declaration":"export function runHarnessContextEngineMaintenance(params: { contextEngine?: HarnessContextEngine; sessionId: string; sessionKey?: string; sessionTarget?: ContextEngineSessionTarget; sessionFile: string; reason: \"bootstrap\" | \"compaction\" | \"turn\"; sessionManager?: unknown; runtimeContext?: ContextEngineRuntimeContext; runtimeSettings?: ContextEngineRuntimeSettings; contextEngineHostSupport?: ContextEngineHostSupport; harnessId?: string | null; runtimeId?: string | null; providerId?: string | null; requestedModelId?: string | null; modelId?: string | null; tokenBudget?: number | null; maxOutputTokens?: number | null; fallbackReason?: string | null; degradedReason?: string | null; executionMode?: \"foreground\" | \"background\"; onDeferredMaintenance?: (promise: Promise) => void; withSessionManagerRewriteLock?: (operation: () => Promise | T) => Promise; config?: OpenClawConfig; }): Promise;","entrypoint":"agent-harness-runtime","exportName":"runHarnessContextEngineMaintenance","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"ac1ea146e8b2031b307790d708076df67f0120365804edffacbf9841edd86185","declaration":"export function sanitizeToolResult(result: unknown): unknown;","entrypoint":"agent-harness-runtime","exportName":"sanitizeToolResult","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"b09d666ed5aff56e2b666077ad2b5d2df2437df10e34a5e1c6a528ebb26869fc","declaration":"export function selectDefaultNodeFromList(nodes: NodeListNode[], options?: DefaultNodeSelectionOptions): NodeListNode | null;","entrypoint":"agent-harness-runtime","exportName":"selectDefaultNodeFromList","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} -{"closureHash":"0e6cc465d49b74f744890d2b9f9d675bf81e1d15519a1fd8f5ca2bd0b43c7560","declaration":"export function setActiveEmbeddedRun(sessionId: string, handle: EmbeddedAgentQueueHandle, sessionKey?: string, sessionFile?: string): void;","entrypoint":"agent-harness-runtime","exportName":"setActiveEmbeddedRun","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} +{"closureHash":"a0298a6edf34bcc27190d34e5e46f3281262bc2ff52396c18a87e24215f6b9ba","declaration":"export function setActiveEmbeddedRun(sessionId: string, handle: EmbeddedAgentQueueHandle, sessionKey?: string, sessionFile?: string): void;","entrypoint":"agent-harness-runtime","exportName":"setActiveEmbeddedRun","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"c60602d9b5f7da1173f1393d71789c4eae0cc3907a183c1567bac1f020c79f20","declaration":"export function setBeforeToolCallDiagnosticsEnabled(tool: AnyAgentTool, enabled: boolean): void;","entrypoint":"agent-harness-runtime","exportName":"setBeforeToolCallDiagnosticsEnabled","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"ea3e5a6f68c6814c68d7231c4aa47d92e62f6c8ed796cbe4b9f0008120bd752c","declaration":"export function shouldPreemptivelyCompactBeforePrompt(params: { messages: AgentMessage[]; unwindowedMessages?: AgentMessage[]; systemPrompt?: string; prompt: string; contextTokenBudget: number; reserveTokens: number; toolResultMaxChars?: number; llmBoundaryTokenPressure?: LlmBoundaryTokenPressure; }): PreemptiveCompactionDecision;","entrypoint":"agent-harness-runtime","exportName":"shouldPreemptivelyCompactBeforePrompt","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"function","recordType":"export"} {"closureHash":"f3fcfaa9fba7fede043a9818e8e91ab3ee84a512f60ed98bffcedb1727877444","declaration":"export function supportsModelTools(model: { compat?: unknown; }): boolean;","entrypoint":"agent-harness-runtime","exportName":"supportsModelTools","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":"a7f1fbe2e7e87de375ee95a655bb3de300a7357ed9cf723c93d830ab6c38a376","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":"c0f6b29e20cd3f18f1f123bc1e5d458f391013e2812541fd58698155bd72fe96","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":"ba0ca4adfbc76bcafbbe9487387636983a2c78cf10d056c44c6a9fd9d5191914","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness-runtime","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"ba0ca4adfbc76bcafbbe9487387636983a2c78cf10d056c44c6a9fd9d5191914","declaration":"export type AgentHarnessAttemptParams = AgentHarnessAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"f8eecc849fc5f66fc354207bb843e21ba796fe2bfff4f10ebce342bf8485d7d3","declaration":"export type AgentHarnessAttemptParamsV2 = AgentHarnessAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"d759a25775cb15d3f1804e39e98518f83b67b29ba3ab2fd84d4bf16106d9fdb9","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"agent-harness-runtime","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"d759a25775cb15d3f1804e39e98518f83b67b29ba3ab2fd84d4bf16106d9fdb9","declaration":"export type AgentHarnessAttemptParams = AgentHarnessAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"acb796810881f352798f8026ebebc9ba1ce3faf3286785e4b9a964367ebd24d9","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":"11ce5bb99fdea336e9aba3b87bf5ef6c7d9ed4582bc69370b4c29d92be811fb2","declaration":"export type AgentHarnessSideQuestionParams = AgentHarnessSideQuestionParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"0096a0e88085d1a45460673a7fad0fdd3893141f7a424b7c0b28758a584903d2","declaration":"export type AgentHarnessSideQuestionParamsV2 = AgentHarnessSideQuestionParamsV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"e2c320165e7f072dd5d053d82be3fa5db3b3648112d39a3b40e393d92b07033a","declaration":"export type AgentHarnessSideQuestionParams = AgentHarnessSideQuestionParams;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessSideQuestionParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"1311982296ef9a93957c4559b85e87fc6f3e414476b5c77418df522d2312f795","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":"4914539ab49e7df134ad9aa32d4b13180cffe14571dd585092cfdf77d79c490a","declaration":"export type AgentHarnessV2 = AgentHarnessV2;","entrypoint":"agent-harness-runtime","exportName":"AgentHarnessV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"bd666466495cef203461f4484eb439faa6a4fd10756c44a64a45ddef3b65961c","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":"21dd7ef82b095493961f4dd77b41c3574f64ea94fc0a7ef48aa24df1a51d015c","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} -{"closureHash":"38b2e8da7857da2d07a2d5b34968f66fbbad5d3e0254ddce3518c6a7e414f860","declaration":"export type EmbeddedRunAttemptParamsV2 = EmbeddedRunAttemptParamsV2;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParamsV2","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"7cce5f7355df47a66ed208855889b16b2c40782a75575e8e1a8dce43517b801f","declaration":"export type EmbeddedRunAttemptParams = EmbeddedRunAttemptParams;","entrypoint":"agent-harness-runtime","exportName":"EmbeddedRunAttemptParams","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"b56f77aa308700cc9ea82f50957a860852d0c83c006b5020d97f0d9b2d6c9d6a","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":"74122c798a2504074c02bea6ed6dbc1a4f7e937744740c7e65d0e751e3d48afe","declaration":"export type NativeHookRelayRegistrationHandle = NativeHookRelayRegistrationHandle;","entrypoint":"agent-harness-runtime","exportName":"NativeHookRelayRegistrationHandle","importSpecifier":"openclaw/plugin-sdk/agent-harness-runtime","kind":"type","recordType":"export"} +{"closureHash":"389e3f59bfd6a95d6edeeb1afc2dbd51e6b26828fda9bbcdef480d7314962976","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"} @@ -315,7 +315,7 @@ {"closureHash":"666634000ee5bf317dabcbd70524833961fad58edc2b3cd66fe5fa0172e89602","declaration":"export function getAgentScopedMediaLocalRoots(cfg: OpenClawConfig, agentId?: string): readonly string[];","entrypoint":"agent-media-payload","exportName":"getAgentScopedMediaLocalRoots","importSpecifier":"openclaw/plugin-sdk/agent-media-payload","kind":"function","recordType":"export"} {"closureHash":"160c685c3f4e7ed80fb24d3d76655a182116efe6a7b985bb3bc57b89fe436d2a","declaration":"export type AgentMediaPayload = AgentMediaPayload;","entrypoint":"agent-media-payload","exportName":"AgentMediaPayload","importSpecifier":"openclaw/plugin-sdk/agent-media-payload","kind":"type","recordType":"export"} {"category":"runtime","entrypoint":"agent-runtime","importSpecifier":"openclaw/plugin-sdk/agent-runtime","recordType":"module"} -{"closureHash":"43ac08073fbebd1cf557c950b35b0e08aeeaaffa49b5511427c490ed8ecb4b29","declaration":"export function agentCommandFromIngress(opts: AgentCommandIngressOpts, runtime?: RuntimeEnv, deps?: CliDeps): Promise<{ payloads: ReturnType; meta: EmbeddedAgentRunMeta; didSendViaMessagingTool?: boolean; messagingToolSentTexts?: string[]; messagingToolSentMediaUrls?: string[]; messagingToolSentTargets?: MessagingToolSend[]; deliverySucceeded?: boolean; deliveryStatus?: { requested: true; attempted: boolean; status: \"sent\" | \"suppressed\" | \"partial_failed\" | \"failed\"; succeeded: true | false | \"partial\"; error?: true; errorMessage?: string; reason?: string; resultCount?: number; sentBeforeError?: true; payloadOutcomes?: SerializedDurableMessagePayloadOutcome[]; }; }>;","entrypoint":"agent-runtime","exportName":"agentCommandFromIngress","importSpecifier":"openclaw/plugin-sdk/agent-runtime","kind":"function","recordType":"export"} +{"closureHash":"d676259fd3157772725733326c64420d7b5d750225551ac6501664954281135a","declaration":"export function agentCommandFromIngress(opts: AgentCommandIngressOpts, runtime?: RuntimeEnv, deps?: CliDeps): Promise<{ payloads: ReturnType; meta: EmbeddedAgentRunMeta; didSendViaMessagingTool?: boolean; messagingToolSentTexts?: string[]; messagingToolSentMediaUrls?: string[]; messagingToolSentTargets?: MessagingToolSend[]; deliverySucceeded?: boolean; deliveryStatus?: { requested: true; attempted: boolean; status: \"sent\" | \"suppressed\" | \"partial_failed\" | \"failed\"; succeeded: true | false | \"partial\"; error?: true; errorMessage?: string; reason?: string; resultCount?: number; sentBeforeError?: true; payloadOutcomes?: SerializedDurableMessagePayloadOutcome[]; }; }>;","entrypoint":"agent-runtime","exportName":"agentCommandFromIngress","importSpecifier":"openclaw/plugin-sdk/agent-runtime","kind":"function","recordType":"export"} {"closureHash":"cb95256473d5489ef80ec3e1d93c6a612b2cc733c26ab535f945f8797995b5cb","declaration":"export function buildConfiguredModelCatalog(params: { cfg: OpenClawConfig; workspaceDir?: string; manifestPlugins?: ModelManifestPlugins; }): ModelCatalogEntry[];","entrypoint":"agent-runtime","exportName":"buildConfiguredModelCatalog","importSpecifier":"openclaw/plugin-sdk/agent-runtime","kind":"function","recordType":"export"} {"closureHash":"4a71b73b60d846e9d99fa3881cb72eb7eaaebe7b3386b6bcbaa6cfa46eb3a073","declaration":"export function buildModelAliasIndex(params: BuildModelAliasIndexParams): ModelAliasIndex;","entrypoint":"agent-runtime","exportName":"buildModelAliasIndex","importSpecifier":"openclaw/plugin-sdk/agent-runtime","kind":"function","recordType":"export"} {"closureHash":"ae0f930ec291a0345c4e99e247711465a5d29a8bbdd63968900fa69f382b3a78","declaration":"export function clearExpiredCooldowns(store: AuthProfileStore, now?: number): boolean;","entrypoint":"agent-runtime","exportName":"clearExpiredCooldowns","importSpecifier":"openclaw/plugin-sdk/agent-runtime","kind":"function","recordType":"export"} @@ -743,7 +743,7 @@ {"closureHash":"e853372c016b9f5148efda1b2466856806115da9b8dada34cd316385c12b72c7","declaration":"export type ChannelMessageToolDiscovery = ChannelMessageToolDiscovery;","entrypoint":"channel-contract","exportName":"ChannelMessageToolDiscovery","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} {"closureHash":"f51ada16e9de0cd0a807d1cd9fafbf1e2728a131e737cec7e5f5b23b24f6f273","declaration":"export type ChannelMessageToolSchemaContribution = ChannelMessageToolSchemaContribution;","entrypoint":"channel-contract","exportName":"ChannelMessageToolSchemaContribution","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} {"closureHash":"2d11b6a98b1db3ecc77f52e02f2c09f8e9c155412c2e2669f29350d00428154b","declaration":"export type ChannelMeta = ChannelMeta;","entrypoint":"channel-contract","exportName":"ChannelMeta","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} -{"closureHash":"ec916ca974bd0242329b6532fb8467a63d038f1182ae9b2af3aa3b979b5fa589","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"channel-contract","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} +{"closureHash":"9002ead9bb685657b14a74835c7de0952a9122dcf77c02405e3f0d79cc5d4821","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"channel-contract","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} {"closureHash":"29e18f68ae937d972fe0add173ea937daadbf551605d04cb78fff000b561a324","declaration":"export type ChannelOutboundContext = ChannelOutboundContext;","entrypoint":"channel-contract","exportName":"ChannelOutboundContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} {"closureHash":"0f20b2ab7102dbff3b7454ea82506d47c2dccde2e2cd60c4c1d746fbe61953db","declaration":"export type ChannelOutboundPayloadHint = ChannelOutboundPayloadHint;","entrypoint":"channel-contract","exportName":"ChannelOutboundPayloadHint","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} {"closureHash":"9bde165ae968761eb8d13818b4d2e924866600a148bd97beb245dc50d17c451a","declaration":"export type ChannelResolveKind = ChannelResolveKind;","entrypoint":"channel-contract","exportName":"ChannelResolveKind","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export"} @@ -761,39 +761,39 @@ {"closureHash":"3ec2c091f2139a6c20b090ef4aa8a7e052440040bc620ce6cb7b8fd5ced3efa3","declaration":"export function buildThreadAwareOutboundSessionRoute(params: { route: ChannelOutboundSessionRoute; replyToId?: string | number | null; threadId?: string | number | null; currentSessionKey?: string | null; precedence?: readonly ThreadAwareOutboundSessionRouteThreadSource[]; useSuffix?: boolean; parentSessionKey?: string; normalizeThreadId?: (threadId: string) => string; canRecoverCurrentThread?: (context: ThreadAwareOutboundSessionRouteRecoveryContext) => boolean; }): ChannelOutboundSessionRoute;","entrypoint":"channel-core","exportName":"buildThreadAwareOutboundSessionRoute","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"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":"8f524c7449eac2abe9ad13db2dfe98a31b24dcfe8c861d147bb48b684759e4f8","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":"9e93bcdfc6299e65ef2a3d267047a9e8c856f0b2f8e9b79d570fb2a4cd238c74","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":"ad9a5a09235e9a426da9b310cd466830ad103dda2e5ce4891ef4131fdf50deda","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"} {"closureHash":"0f0c9fb9b983b0c977229de86091efa1fbb7c8294657bd993ecd5448b351f371","declaration":"export function stripChannelTargetPrefix(raw: string, ...providers: string[]): string;","entrypoint":"channel-core","exportName":"stripChannelTargetPrefix","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"closureHash":"ba015db1f7f7fad580c6bed6d69816f9ba04dea11bb0605cac1f2f2baddb7bca","declaration":"export function stripTargetKindPrefix(raw: string): string;","entrypoint":"channel-core","exportName":"stripTargetKindPrefix","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} {"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":"channel-core","exportName":"tryReadSecretFileSync","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"function","recordType":"export"} -{"closureHash":"6d0cf027948f001fedb7a9b507333351eb4a5ea40e321bc59175b330941d058b","declaration":"export const createChannelPluginBase: (params: { id: ChannelPlugin[\"id\"]; meta?: Partial[\"meta\"]>>; setupWizard?: NonNullable[\"setupWizard\"]>; capabilities?: ChannelPlugin[\"capabilities\"]; commands?: ChannelPlugin[\"commands\"]; doctor?: ChannelPlugin[\"doctor\"]; agentPrompt?: ChannelPlugin[\"agentPrompt\"]; streaming?: ChannelPlugin[\"streaming\"]; reload?: ChannelPlugin[\"reload\"]; gatewayMethods?: ChannelPlugin[\"gatewayMethods\"]; gatewayMethodDescriptors?: ChannelPlugin[\"gatewayMethodDescriptors\"]; configSchema?: ChannelPlugin[\"configSchema\"]; config?: ChannelConfigAdapter | undefined; security?: ChannelSecurityAdapter | undefined; setup?: NonNullable[\"setup\"]>; setupContract?: NonNullable[\"setupContract\"]>; groups?: ChannelPlugin[\"groups\"];}) => Pick, \"id\" | \"meta\"> & Partial, \"security\" | \"commands\" | \"groups\" | \"capabilities\" | \"streaming\" | \"config\" | \"reload\" | \"configSchema\" | \"setup\" | \"doctor\" | \"gatewayMethodDescriptors\" | \"setupContract\" | \"setupWizard\" | \"gatewayMethods\" | \"agentPrompt\">>;","entrypoint":"channel-core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"const","recordType":"export"} +{"closureHash":"0d08edea4bf51c0496c817bb1673f1586badcf75baf6cfc44a7c16028a45e17d","declaration":"export const createChannelPluginBase: (params: { id: ChannelPlugin[\"id\"]; meta?: Partial[\"meta\"]>>; setupWizard?: NonNullable[\"setupWizard\"]>; capabilities?: ChannelPlugin[\"capabilities\"]; commands?: ChannelPlugin[\"commands\"]; doctor?: ChannelPlugin[\"doctor\"]; agentPrompt?: ChannelPlugin[\"agentPrompt\"]; streaming?: ChannelPlugin[\"streaming\"]; reload?: ChannelPlugin[\"reload\"]; gatewayMethods?: ChannelPlugin[\"gatewayMethods\"]; gatewayMethodDescriptors?: ChannelPlugin[\"gatewayMethodDescriptors\"]; configSchema?: ChannelPlugin[\"configSchema\"]; config?: ChannelConfigAdapter | undefined; security?: ChannelSecurityAdapter | undefined; setup?: NonNullable[\"setup\"]>; setupContract?: NonNullable[\"setupContract\"]>; groups?: ChannelPlugin[\"groups\"];}) => Pick, \"id\" | \"meta\"> & Partial, \"security\" | \"commands\" | \"groups\" | \"capabilities\" | \"streaming\" | \"config\" | \"reload\" | \"configSchema\" | \"setup\" | \"doctor\" | \"gatewayMethodDescriptors\" | \"setupContract\" | \"setupWizard\" | \"gatewayMethods\" | \"agentPrompt\">>;","entrypoint":"channel-core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"const","recordType":"export"} {"closureHash":"db6db8b2272765050d9dab70b7793f052520d8745923290375a50661f3e33cc8","declaration":"export type ChannelConfigUiHint = ChannelConfigUiHint;","entrypoint":"channel-core","exportName":"ChannelConfigUiHint","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} {"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":"d02e5c7a995847180696d2a05d8ea092b364ef32b36753e4091fc97ffdaf44ab","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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","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"} +{"closureHash":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} +{"closureHash":"d9d24565b06f891a687f49672129beac9d38ccb817526ed1a6579efcb5825eb0","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"channel-core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/channel-core","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","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":"ade5895d56db98a9f2455d7cef729a3afbf19a99b798cab08dae0f540a182dc1","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":"b4912722dda44b4edad6b1d4a230b669006cc970de95687bab5e25754a8a5bc5","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":"5885bf21e94629126fa96a1a953d2c913eeeaac3fc603e9d23846e0700b53835","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":"237c32c30b7f6979b8e955acfd6520db3ac2d98a3c46539c3b083d5d1af48247","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":"95021e65b73f6bdc72919ece6b0ae62b64c920090f3b90ffae35cf72dc40f5b8","declaration":"export type BundledChannelEntryContract = BundledChannelEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"4b7913e3376b2de7370a5970d8330e81f65574e173a313aec21d5dc5428007dd","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":"881ff038bfc25dad609ec2af705bb9f8d358cb6c6a97fb61e6f02ecfcf4ba171","declaration":"export type BundledChannelSetupEntryContract = BundledChannelSetupEntryContract;","entrypoint":"channel-entry-contract","exportName":"BundledChannelSetupEntryContract","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"882a849a3b180ad11b9622cd5d38b932012672f8a7b7b67c229874bb1862ac48","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":"716afd752a579d491a3e55ac4bac0a2109dd839b73a815c2c044c6f8d5ce186e","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"} +{"closureHash":"d092260da21786feb5266e642269dc90807ac6a33131fffa66641d95b7544145","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-entry-contract","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"2a50f49bf524a67b6554ad9e3afc32487403828d09f966191930f7bb701032a1","declaration":"export type OpenClawPluginCommandDefinition = OpenClawPluginCommandDefinition;","entrypoint":"channel-entry-contract","exportName":"OpenClawPluginCommandDefinition","importSpecifier":"openclaw/plugin-sdk/channel-entry-contract","kind":"type","recordType":"export"} +{"closureHash":"627f955848f6970b3fce5e72f1ccccc136636d67355114ce38aedd886be38db8","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"} {"closureHash":"83654579574c8101c8158b4d1a49bd0f72918c26e588d86ac0079aab94bf04de","declaration":"export function createAckReactionHandle(params: { ackReactionValue: string; send: () => Promise; remove: () => Promise; onSendError?: (err: unknown) => void; }): AckReactionHandle | null;","entrypoint":"channel-feedback","exportName":"createAckReactionHandle","importSpecifier":"openclaw/plugin-sdk/channel-feedback","kind":"function","recordType":"export"} {"closureHash":"16650e7e9aa18195bea992878a273fa2ef564d088dcb872d895387f033fa76f0","declaration":"export function createStatusReactionController(params: { enabled: boolean; adapter: StatusReactionAdapter; initialEmoji: string; emojis?: StatusReactionEmojis; timing?: StatusReactionTiming; onError?: (err: unknown) => void; }): StatusReactionController;","entrypoint":"channel-feedback","exportName":"createStatusReactionController","importSpecifier":"openclaw/plugin-sdk/channel-feedback","kind":"function","recordType":"export"} @@ -834,10 +834,10 @@ {"closureHash":"dd949b517f4b679f06ad1b7bf97b3ab71c3ef22ffdaaee6616c786dcc925785c","declaration":"export function createDirectDmPreCryptoGuardPolicy(overrides?: DirectDmPreCryptoGuardPolicyOverrides): DirectDmPreCryptoGuardPolicy;","entrypoint":"channel-inbound","exportName":"createDirectDmPreCryptoGuardPolicy","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"d2a3f9dd1ffc16941bb39360012138d3a3cbcf5e8beb08106182831b1c269054","declaration":"export function createInboundDebouncer(params: InboundDebounceCreateParams): { enqueue: (item: T) => Promise; flushKey: (key: string) => Promise; cancelKey: (key: string) => boolean; drain: () => Promise; };","entrypoint":"channel-inbound","exportName":"createInboundDebouncer","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"0589d27aa139324b1ed177b814368d633ef11a77d07697d63ff9b7a6c11f4500","declaration":"export function createPreCryptoDirectDmAuthorizer(params: { resolveAccess: (senderId: string) => Promise | ResolvedInboundDirectDmAccess>; issuePairingChallenge?: (params: { senderId: string; reply: (text: string) => Promise; }) => Promise; onBlocked?: (params: { senderId: string; reason: string; reasonCode: DmGroupAccessReasonCode; }) => void; }): (input: { senderId: string; reply: (text: string) => Promise; }) => Promise<\"allow\" | \"block\" | \"pairing\">;","entrypoint":"channel-inbound","exportName":"createPreCryptoDirectDmAuthorizer","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} -{"closureHash":"e088ddef111b171ef5d034d9de6062cc551d6775412ddc8cfa7b72ca8f31c62d","declaration":"export function dispatchChannelInboundReply(params: AssembledInboundReply): Promise;","entrypoint":"channel-inbound","exportName":"dispatchChannelInboundReply","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} -{"closureHash":"62087d926004c2b89264e732b1d2b74e92a071ba85dcff4afd6f3a6703d4396a","declaration":"export function dispatchChannelInboundTurn(params: ChannelInboundTurnPlan<\"provider_message_sending\">): Promise;\nexport function dispatchChannelInboundTurn(params: ChannelInboundTurnPlan): Promise;","entrypoint":"channel-inbound","exportName":"dispatchChannelInboundTurn","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} +{"closureHash":"552aa82911f9aba585fee69fc351990ad892bd0ba4dd20e69ce6d3c286efc6d4","declaration":"export function dispatchChannelInboundReply(params: AssembledInboundReply): Promise;","entrypoint":"channel-inbound","exportName":"dispatchChannelInboundReply","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} +{"closureHash":"3090e3a3315715d8cc2107bf9a577446dc8bc30b05642f5c643b797f79fbb97e","declaration":"export function dispatchChannelInboundTurn(params: ChannelInboundTurnPlan<\"provider_message_sending\">): Promise;\nexport function dispatchChannelInboundTurn(params: ChannelInboundTurnPlan): Promise;","entrypoint":"channel-inbound","exportName":"dispatchChannelInboundTurn","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"2f997d08980c2c3f531382428c58204ca04e423a64ca201798f7667da15e774e","declaration":"export function dispatchInboundDirectDm(params: DispatchInboundDirectDmParams): Promise<{ route: DirectDmRoute; ctxPayload: FinalizedMsgContext; }>;","entrypoint":"channel-inbound","exportName":"dispatchInboundDirectDm","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} -{"closureHash":"ec2982579c800a9f5ee5917f5850c79651ea812e659f57ee143acf59ed9d157f","declaration":"export function dispatchInboundDirectDmWithRuntime(params: DispatchInboundDirectDmParams & { runtime: PluginRuntime; }): Promise<{ route: DirectDmRoute; storePath: string; ctxPayload: FinalizedMsgContext; }>;","entrypoint":"channel-inbound","exportName":"dispatchInboundDirectDmWithRuntime","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} +{"closureHash":"cdf4018d7d355ec02e9126fa21dc9061acda9d2f5612ef590ce0fb4011edf2b3","declaration":"export function dispatchInboundDirectDmWithRuntime(params: DispatchInboundDirectDmParams & { runtime: PluginRuntime; }): Promise<{ route: DirectDmRoute; storePath: string; ctxPayload: FinalizedMsgContext; }>;","entrypoint":"channel-inbound","exportName":"dispatchInboundDirectDmWithRuntime","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"33cb9d760233f3d322599f7745a42e0b9fe2c653ffb9310d8b579f2d70f7638c","declaration":"export function filterChannelInboundQuoteContext(contextVisibility: ContextVisibilityMode | undefined, quote: SupplementalContextFacts[\"quote\"] | undefined): SupplementalContextFacts[\"quote\"] | undefined;","entrypoint":"channel-inbound","exportName":"filterChannelInboundQuoteContext","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"793b9b84aacb8f5b12daf857de82efc579fa018ba6b2357b0acd044be3dcec5f","declaration":"export function filterChannelInboundSupplementalContext(params: { supplemental?: SupplementalContextFacts; contextVisibility?: ContextVisibilityMode; }): SupplementalContextFacts | undefined;","entrypoint":"channel-inbound","exportName":"filterChannelInboundSupplementalContext","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"ff1797f8e6adf2331d98af9947dcefef02d743c2c7619fc8b5a2462980cb7126","declaration":"export function finalizeChannelInboundContext>(params: FinalizeChannelInboundContextAsyncParams): Promise>;\nexport function finalizeChannelInboundContext>(params: FinalizeChannelInboundContextParams): FinalizeChannelInboundContextResult;","entrypoint":"channel-inbound","exportName":"finalizeChannelInboundContext","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} @@ -862,7 +862,7 @@ {"closureHash":"6b537112d5d84ed07c0b9fd24787eabc2f893f7bfdce1ed5915f88574a7e101c","declaration":"export function normalizeMentionText(text: string): string;","entrypoint":"channel-inbound","exportName":"normalizeMentionText","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"92900098c3cc5b73fba7622a3aa5a1a8c48462ff7ec0cfae8ee0a3aa6f8277f0","declaration":"export function normalizeOutboundLocation(value: unknown, label?: string): OutboundLocation | undefined;","entrypoint":"channel-inbound","exportName":"normalizeOutboundLocation","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"65f5f2725c1124096e437bcf5894983eee1023f7033be886f1a506044b77c58e","declaration":"export function recordChannelBotPairLoopAndCheckSuppression(params: ChannelBotLoopProtectionFacts): PairLoopGuardResult;","entrypoint":"channel-inbound","exportName":"recordChannelBotPairLoopAndCheckSuppression","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} -{"closureHash":"4917b14c7a1ed0988df25a89da6e23f4700407f9d231fc544f4cb50ddda43e5a","declaration":"export function recordChannelFeedbackEvent(params: { cfg: OpenClawConfig; agentId: string; sessionKey: string; event: Parameters[1]; }): Promise;","entrypoint":"channel-inbound","exportName":"recordChannelFeedbackEvent","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} +{"closureHash":"b8271620147b917162fda83897092229d5691a4e418288a79912ae41775e83da","declaration":"export function recordChannelFeedbackEvent(params: { cfg: OpenClawConfig; agentId: string; sessionKey: string; event: Parameters[1]; }): Promise;","entrypoint":"channel-inbound","exportName":"recordChannelFeedbackEvent","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"33b4280a69de6a4a87acf915c6d694b9ee41fc4f0262a1bb9836c46d53fe337c","declaration":"export function recordDroppedChannelInboundHistory(params: { input: NormalizedTurnInput; preflight: PreflightFacts; admission?: ChannelTurnAdmission; }): Promise;","entrypoint":"channel-inbound","exportName":"recordDroppedChannelInboundHistory","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"33b4280a69de6a4a87acf915c6d694b9ee41fc4f0262a1bb9836c46d53fe337c","declaration":"export function recordDroppedChannelTurnHistory(params: { input: NormalizedTurnInput; preflight: PreflightFacts; admission?: ChannelTurnAdmission; }): Promise;","entrypoint":"channel-inbound","exportName":"recordDroppedChannelTurnHistory","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"54b920fd80ac659a03000356b64e34d4a44ec22ae39a77accdd2ac97dc5a094e","declaration":"export function resolveChannelInboundRouteEnvelope(params: ResolveAgentRouteInput): { route: ResolvedAgentRoute; buildEnvelope: (input: ChannelInboundEnvelopeInput) => string; };","entrypoint":"channel-inbound","exportName":"resolveChannelInboundRouteEnvelope","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} @@ -876,7 +876,7 @@ {"closureHash":"5af56d49219f28e2d3a8104b771d2e758f14b4cd784e8ffc892b5a94634a3e73","declaration":"export function resolveMentionPatternPolicy(params: ResolveMentionPatternPolicyParams): ResolvedMentionPatternPolicy;","entrypoint":"channel-inbound","exportName":"resolveMentionPatternPolicy","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"1fb79e56b0b0e11f768f2075c9cdc060c3af281c79bbcd5334e5d887b99e5946","declaration":"export function resolveUnmentionedGroupInboundPolicy(params: { cfg: OpenClawConfig; agentId?: string; }): InboundEventKind;","entrypoint":"channel-inbound","exportName":"resolveUnmentionedGroupInboundPolicy","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"b06b5999074830bb40a3d6348a582fc5e1795997442acef561fca6a541d2b015","declaration":"export function runChannelFeedbackReflection(params: { cfg: OpenClawConfig; channel: string; channelLabel: string; accountId?: string; agentId: string; sessionKey: string; conversationId: string; conversationKind: \"direct\" | \"group\" | \"channel\"; thumbedDownResponse?: string; userComment?: string; cooldownMs?: number; onRecordError?: (error: unknown) => void; onDispatchError?: (error: unknown) => void; }): Promise;","entrypoint":"channel-inbound","exportName":"runChannelFeedbackReflection","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} -{"closureHash":"4cd63266d379acc2cdf9aba02f50b8ceb55500cf820787c370fc98d173fb1950","declaration":"export function runChannelInboundEvent(params: RunChannelTurnParams): Promise>;\nexport function runChannelInboundEvent(params: ChannelInboundEventRunnerParams): Promise>;","entrypoint":"channel-inbound","exportName":"runChannelInboundEvent","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} +{"closureHash":"871d3ff30c14af1a605fdb47c50923a910a7886f7cc886ba1cd9c2eff1ea8334","declaration":"export function runChannelInboundEvent(params: RunChannelTurnParams): Promise>;\nexport function runChannelInboundEvent(params: ChannelInboundEventRunnerParams): Promise>;","entrypoint":"channel-inbound","exportName":"runChannelInboundEvent","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"2c68496a174872b31aaf1ac8fad2789deb79d490c5ffbcb157325f1c95d1b51f","declaration":"export function runPreparedInboundReply(params: PreparedChannelTurn): Promise>;","entrypoint":"channel-inbound","exportName":"runPreparedInboundReply","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"7cd0e032be61b330962c9cee9ba6a4e67c31a90e22fd79850e28c97ea3200bd1","declaration":"export function shouldDebounceTextInbound(params: { text: string | null | undefined; cfg: OpenClawConfig; hasMedia?: boolean; commandOptions?: CommandNormalizeOptions; allowDebounce?: boolean; }): boolean;","entrypoint":"channel-inbound","exportName":"shouldDebounceTextInbound","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} {"closureHash":"8289a274f0ea2c1c7f0daaae77c4e9e0c5588f6a17148240e83720a59ec23604","declaration":"export function toHistoryMediaEntries(media: readonly ChannelInboundMediaInput[] | null | undefined, defaults?: { kind?: InboundMediaFacts[\"kind\"]; messageId?: string; }): HistoryMediaEntry[];","entrypoint":"channel-inbound","exportName":"toHistoryMediaEntries","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"function","recordType":"export"} @@ -886,7 +886,7 @@ {"closureHash":"c700a03f4222eb20560db6abb3c775940b35cfbdfb3d122b2644cdc521809fb4","declaration":"export const DEFAULT_CHANNEL_FEEDBACK_REFLECTION_COOLDOWN_MS: 300000;","entrypoint":"channel-inbound","exportName":"DEFAULT_CHANNEL_FEEDBACK_REFLECTION_COOLDOWN_MS","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"const","recordType":"export"} {"closureHash":"03bfa4a5365916c2d9f59e4e3c5c6ae3ee7952b2aec209c232bf73a5ccd2ae94","declaration":"export const filterChannelTurnSupplementalContext: (params: { supplemental?: SupplementalContextFacts; contextVisibility?: ContextVisibilityMode;}) => SupplementalContextFacts | undefined;","entrypoint":"channel-inbound","exportName":"filterChannelTurnSupplementalContext","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"const","recordType":"export"} {"closureHash":"b028978582295be29c22e06673b8f1b48819511b6b8c26cfff9e322ddc2834e3","declaration":"export type AccessGroupMembershipResolver = AccessGroupMembershipResolver;","entrypoint":"channel-inbound","exportName":"AccessGroupMembershipResolver","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} -{"closureHash":"ab30d0470348e3af7c18a273afc0d169d91f204fba557c75c4694e8a0ea6c936","declaration":"export type AssembledInboundReply = AssembledChannelTurn;","entrypoint":"channel-inbound","exportName":"AssembledInboundReply","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} +{"closureHash":"10d47ee68a65fa2df62012bf98988026560dd0bc30d2be56783ed4132864a149","declaration":"export type AssembledInboundReply = AssembledChannelTurn;","entrypoint":"channel-inbound","exportName":"AssembledInboundReply","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"16e04f044a9af3553fa26fec210bf6d2e6e101c4fe4db18b8914fce21dce573f","declaration":"export type BuildChannelInboundEventContextAsyncParams = BuildChannelInboundEventContextAsyncParams;","entrypoint":"channel-inbound","exportName":"BuildChannelInboundEventContextAsyncParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"bfda516454e1d03a16f685f9470c8ce4329328d5658b5ca26bc703c70c5d17c8","declaration":"export type BuildChannelInboundEventContextParams = BuildChannelInboundEventContextParams;","entrypoint":"channel-inbound","exportName":"BuildChannelInboundEventContextParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"b6ce3464585a1f042b94574c385dd57ca9be83740ef0fc929db769710dc78061","declaration":"export type BuildChannelTurnContextParams = BuildChannelTurnContextParams;","entrypoint":"channel-inbound","exportName":"BuildChannelTurnContextParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} @@ -897,11 +897,11 @@ {"closureHash":"bf7e13e0308a3f54e1686373d312f9883b1de82bf771ea1763379a5bf8f6e716","declaration":"export type ChannelFeedbackReflectionResult = ChannelFeedbackReflectionResult;","entrypoint":"channel-inbound","exportName":"ChannelFeedbackReflectionResult","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"f0da845bbdf49b30f6718a4b7ff012a0536deb98f65418583555dc90825797ca","declaration":"export type ChannelInboundDroppedHistoryOptions = ChannelTurnDroppedHistoryOptions;","entrypoint":"channel-inbound","exportName":"ChannelInboundDroppedHistoryOptions","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"359ec07a928d613ac5a9f96ded5561f4e3087fd1bf741e1f8e5e8a3b0fb30d29","declaration":"export type ChannelInboundEnvelopeInput = ChannelInboundEnvelopeInput;","entrypoint":"channel-inbound","exportName":"ChannelInboundEnvelopeInput","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} -{"closureHash":"809fd66291f793b3d61ddd275ed153cb2050b1d7a31767ef577489a20ee582d0","declaration":"export type ChannelInboundEventRunnerParams = ChannelInboundEventRunnerParams;","entrypoint":"channel-inbound","exportName":"ChannelInboundEventRunnerParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} +{"closureHash":"c579a83076937cade03409079c9173c85509753ed80e559f126d5939147c4261","declaration":"export type ChannelInboundEventRunnerParams = ChannelInboundEventRunnerParams;","entrypoint":"channel-inbound","exportName":"ChannelInboundEventRunnerParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"fce252e3d1ade4690deb2b6368c79ebee42243d49dffca65670e2ee7a9883e89","declaration":"export type ChannelInboundMediaInput = ChannelInboundMediaInput;","entrypoint":"channel-inbound","exportName":"ChannelInboundMediaInput","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"1a0f5a78203bfe24fd1e02389bd2535fbb1937daad45a11058f6fe27641bc792","declaration":"export type ChannelInboundMediaPayload = ChannelInboundMediaPayload;","entrypoint":"channel-inbound","exportName":"ChannelInboundMediaPayload","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"5725f1ae1cf4ac225068feb9ba49057cc24fb99862d768a9cfffe5485d6f410c","declaration":"export type ChannelInboundSupplementalResolutionOptions = ChannelInboundSupplementalResolutionOptions;","entrypoint":"channel-inbound","exportName":"ChannelInboundSupplementalResolutionOptions","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} -{"closureHash":"70e8655f976ef1cea98653416b9c454aa64b4151e9824d238dbdc8799b477839","declaration":"export type ChannelInboundTurnPlan = ChannelInboundTurnPlan;","entrypoint":"channel-inbound","exportName":"ChannelInboundTurnPlan","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} +{"closureHash":"641bf5e50dd2a236bad737a68ede3c5477d086e7a721d74ee4a140872b9db28d","declaration":"export type ChannelInboundTurnPlan = ChannelInboundTurnPlan;","entrypoint":"channel-inbound","exportName":"ChannelInboundTurnPlan","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"a5d806d7e29220e98d1fa3ce08ce3ffb12f07d70d6b24b22a3ee4907ed3b1677","declaration":"export type ChannelPartialDeliveryError = ChannelPartialDeliveryError;","entrypoint":"channel-inbound","exportName":"ChannelPartialDeliveryError","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"f0da845bbdf49b30f6718a4b7ff012a0536deb98f65418583555dc90825797ca","declaration":"export type ChannelTurnDroppedHistoryOptions = ChannelTurnDroppedHistoryOptions;","entrypoint":"channel-inbound","exportName":"ChannelTurnDroppedHistoryOptions","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"fce252e3d1ade4690deb2b6368c79ebee42243d49dffca65670e2ee7a9883e89","declaration":"export type ChannelTurnMediaInput = ChannelInboundMediaInput;","entrypoint":"channel-inbound","exportName":"ChannelTurnMediaInput","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} @@ -913,7 +913,7 @@ {"closureHash":"5b290ec7ab8715132069c413bf733e7fd5fb75eb0c58c9cb70060ff1ed99e2df","declaration":"export type DirectDmCommandAuthorizationRuntime = DirectDmCommandAuthorizationRuntime;","entrypoint":"channel-inbound","exportName":"DirectDmCommandAuthorizationRuntime","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"d9d5ec1b29d161f984b856302eada6c1938d8074dd7f986e541dd23d231826f9","declaration":"export type DirectDmPreCryptoGuardPolicy = DirectDmPreCryptoGuardPolicy;","entrypoint":"channel-inbound","exportName":"DirectDmPreCryptoGuardPolicy","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"07535b0137279843bc2608c9bea447f711a5639a23813bd9fab06bbf2d8e12a7","declaration":"export type DirectDmPreCryptoGuardPolicyOverrides = DirectDmPreCryptoGuardPolicyOverrides;","entrypoint":"channel-inbound","exportName":"DirectDmPreCryptoGuardPolicyOverrides","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} -{"closureHash":"4c1290dcec6d7fac7aec703ccec8b6b790ebbd4fa12c3c3c1d07f55b86075b5e","declaration":"export type DurableInboundReplyDeliveryParams = DurableInboundReplyDeliveryParams;","entrypoint":"channel-inbound","exportName":"DurableInboundReplyDeliveryParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} +{"closureHash":"6c4c3a1ddaae4323de2bfcf123e74a4f31ec79c79cd4bb3a0819fe6410f91874","declaration":"export type DurableInboundReplyDeliveryParams = DurableInboundReplyDeliveryParams;","entrypoint":"channel-inbound","exportName":"DurableInboundReplyDeliveryParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"717d223b4268561e60b088c97fbcf0bf35cccfcc3dd2606ed4a9dc92c0e688ac","declaration":"export type EnvelopeFormatOptions = EnvelopeFormatOptions;","entrypoint":"channel-inbound","exportName":"EnvelopeFormatOptions","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"cbb444147c25849545bd620c62e17effde08f4bd9225d86d8397b5effdba73e7","declaration":"export type FinalizeChannelInboundContextAsyncParams> = FinalizeChannelInboundContextAsyncParams;","entrypoint":"channel-inbound","exportName":"FinalizeChannelInboundContextAsyncParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} {"closureHash":"78b09d3b8c96eb315e7c61acfe81afda1e282178dfbe872f2581000c8daa24f8","declaration":"export type FinalizeChannelInboundContextParams> = FinalizeChannelInboundContextParams;","entrypoint":"channel-inbound","exportName":"FinalizeChannelInboundContextParams","importSpecifier":"openclaw/plugin-sdk/channel-inbound","kind":"type","recordType":"export"} @@ -1023,7 +1023,7 @@ {"closureHash":"2ee885cd4f5bd43dc0edc0bd8866bc2655e135dc229dcd08390ce24205a79e6a","declaration":"export function createChannelIngressError(name: string): ChannelIngressErrorClass;\nexport function createChannelIngressError(name: string, options: { withReason: true; }): ChannelIngressErrorClass;","entrypoint":"channel-message","exportName":"createChannelIngressError","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"1148ff7d1272453be5061ccbb1e4213c21701a4d034f7a09dc6539ac28c6122e","declaration":"export function createChannelIngressMonitor(options: CreateChannelIngressMonitorOptions): { admit: (raw: TRaw, admitOptions?: { receivedAt?: number; facts?: ChannelIngressMonitorFacts; }) => Promise<{ readonly kind: \"ignored\"; readonly queueResult?: undefined; } | { readonly kind: \"durable\"; readonly queueResult: { kind: \"failed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; failedAt: number; reason: string; message?: string; }; } | { kind: \"accepted\"; duplicate: false; record: ChannelIngressQueueRecord; } | { kind: \"pending\"; duplicate: true; record: ChannelIngressQueueRecord; } | { kind: \"claimed\"; duplicate: true; record: ChannelIngressQueueClaim; } | { kind: \"completed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; completedAt: number; metadata?: unknown; }; }; }>; admitBatch: (rawEvents: readonly TRaw[], admitOptions?: { receivedAt?: number; }) => Promise<({ readonly kind: \"ignored\"; readonly queueResult?: undefined; } | { readonly kind: \"durable\"; readonly queueResult: { kind: \"failed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; failedAt: number; reason: string; message?: string; }; } | { kind: \"accepted\"; duplicate: false; record: ChannelIngressQueueRecord; } | { kind: \"pending\"; duplicate: true; record: ChannelIngressQueueRecord; } | { kind: \"claimed\"; duplicate: true; record: ChannelIngressQueueClaim; } | { kind: \"completed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; completedAt: number; metadata?: unknown; }; }; })[]>; start: () => void; ensureQueueAvailable: () => void; requestDrain: () => void; pause: () => Promise; stop: () => Promise; waitForIdle: () => Promise; waitForDeferredClaims: () => Promise; waitForPumpIdle: () => Promise; isRunning: () => boolean; isStopped: () => boolean; };","entrypoint":"channel-message","exportName":"createChannelIngressMonitor","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"c2da77bb4d055b4058a10dc5125a8ddbeec764cd700a47280599cfbe000bc7b2","declaration":"export function createChannelMessageAdapterFromOutbound(params: CreateChannelMessageAdapterFromOutboundParams): ChannelMessageAdapterShape;","entrypoint":"channel-message","exportName":"createChannelMessageAdapterFromOutbound","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"1670536bbc6ed9619b06e87e8072687d0847218badf71f08b439bfea0bfc3c5b","declaration":"export function createChannelMessageReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-message","exportName":"createChannelMessageReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"291fd442e26d70ed6c961c96830a802fe523feb8f2ccce02b7d2fca552f85404","declaration":"export function createChannelMessageReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-message","exportName":"createChannelMessageReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"2871a1ae2423e62833646aa01bc69a1d32669d06436655df4c33d98a73e22d49","declaration":"export function createChannelProgressDraftCompositor(params: { entry: StreamingCompatEntry | null | undefined; mode: ChannelProgressDraftMode; active: boolean; seed: string; update: (text: string, options?: ChannelProgressDraftUpdateOptions) => Promise | boolean | void; deleteCurrent?: () => Promise | void; tryNativeUpdate?: (text: string) => Promise | boolean; updateOnLineChange?: boolean; rendersRollingLinesNatively?: boolean; formatLine?: (line: string) => string; isEmptyLine?: (line: ChannelProgressDraftCompositorLine | undefined) => boolean; shouldStartNow?: (line: ChannelProgressDraftCompositorLine | undefined) => boolean; reasoningLinePrefix?: string; commentaryLinePrefix?: string; reasoningGate?: boolean; commentaryItalics?: boolean; now?: () => number; setTimeoutFn?: typeof setTimeout; clearTimeoutFn?: typeof clearTimeout; buildProgressEventLine?: ChannelProgressDraftEventLineBuilder; }): { pushPlanProgress(steps?: AgentPlanStep[], options?: { explanation?: string; }): Promise; pushPreambleHeadline(text?: string, options?: { itemId?: string; }): Promise; pushNarrationProgress(text?: string): Promise; pushReasoningProgress(text?: string, options?: { snapshot?: boolean; }): Promise; pushCommentaryProgress(text?: string, options?: { itemId?: string; }): Promise; pushToolEvent: (payload: { name?: string | undefined; args?: Record | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; } & { detailMode?: \"explain\" | \"raw\"; }) => Promise; pushItemEvent: (payload: Omit<{ title?: string | undefined; meta?: string | undefined; status?: string | undefined; name?: string | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; summary?: string | undefined; progressText?: string | undefined; itemKind?: string | undefined; commandBearing?: boolean | undefined; }, \"itemKind\"> & { kind?: string; }) => Promise; pushApprovalEvent: (payload: { message?: string | undefined; title?: string | undefined; command?: string | undefined; reason?: string | undefined; phase?: string | undefined; }) => Promise; pushCommandOutputEvent: (payload: { title?: string | undefined; status?: string | undefined; name?: string | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; exitCode?: number | null | undefined; }) => Promise; pushPatchEvent: (payload: { title?: string | undefined; name?: string | undefined; phase?: string | undefined; deleted?: string[] | undefined; toolCallId?: string | undefined; itemId?: string | undefined; summary?: string | undefined; modified?: string[] | undefined; added?: string[] | undefined; }) => Promise; previewToolProgressEnabled: boolean; commentaryProgressEnabled: boolean; suppressDefaultToolProgressMessages: boolean; hasStarted: boolean; isVisible: boolean; hasStatusHeadline: boolean; hasPlanProgress: boolean; getSnapshot: () => ChannelProgressDraftCompositorSnapshot; markFinalReplyStarted(): void; markFinalReplyDelivered(): void; beginNewTurn(options?: { force?: boolean; }): boolean; reset(): void; resetReasoningProgress(): void; mergeReasoningProgress: (text?: string, options?: { snapshot?: boolean; }) => string; suppress(): void; cancel(): void; start(): Promise; noteActivity(options?: { startImmediately?: boolean; }): Promise; pushToolProgress: (line?: ChannelProgressDraftCompositorLine, options?: { toolName?: string; startImmediately?: boolean; }) => Promise; };","entrypoint":"channel-message","exportName":"createChannelProgressDraftCompositor","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"44c199920938c7a282e44d36eea187f1f8ce1d09bfb845180e1844124f497a3c","declaration":"export function createChannelProgressDraftGate(params: { onStart: () => void | Promise; initialDelayMs?: number; onStartError?: (error: unknown) => void; setTimeoutFn?: typeof setTimeout; clearTimeoutFn?: typeof clearTimeout; }): { readonly hasStarted: boolean; readonly workEvents: number; noteWork(): Promise; startNow(): Promise; cancel(): void; reset(): void; };","entrypoint":"channel-message","exportName":"createChannelProgressDraftGate","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"2204efb262a5e8af61346bce23492dd759c15037ce3b8500148c5cc8dce1c421","declaration":"export function createChannelProgressReceiptTracker(params?: { now?: () => number; }): { noteReasoning(): void; closeReasoning: () => void; noteToolCall(toolName?: string): void; noteCommentary(itemId?: string, text?: string): void; reset: () => void; buildSummaryLine(): string; };","entrypoint":"channel-message","exportName":"createChannelProgressReceiptTracker","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} @@ -1034,12 +1034,12 @@ {"closureHash":"acd64a0d6ce6dbd9db22f9e4a4497cef2110a9e962f240c6f5e90cef31505459","declaration":"export function createFinalizableDraftStreamControlsForState(params: { throttleMs: number; state: FinalizableDraftStreamState; sendOrEditStreamMessage: (value: T) => Promise; emptyValue?: T; isEmpty?: (value: T) => boolean; }): { loop: DraftStreamLoop & { takePending: () => T; }; update: (value: T) => void; stop: () => Promise; seal: () => Promise; discardPending: () => Promise; stopForClear: () => Promise; };","entrypoint":"channel-message","exportName":"createFinalizableDraftStreamControlsForState","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"f2bb1868ec1cf7d97e6b8eb0a9a8a37122ec53c9cd4e2bbfc8448c1555f3d382","declaration":"export function createMessageReceiptFromOutboundResults(params: { results: readonly MessageReceiptInputResult[]; kind?: MessageReceiptPartKind; threadId?: string; replyToId?: string; sentAt?: number; }): MessageReceipt;","entrypoint":"channel-message","exportName":"createMessageReceiptFromOutboundResults","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"3c150fb027a4e4a1685b572d26aa1f70b3838641bd7629434c4265bfda549d0a","declaration":"export function createMessageReceiveContext(params: { id: string; channel: string; accountId?: string; message: TMessage; ackPolicy?: MessageAckPolicy; receivedAt?: number; signal?: AbortSignal; onAck?: () => Promise | void; onNack?: (error: unknown) => Promise | void; }): MessageReceiveContext;","entrypoint":"channel-message","exportName":"createMessageReceiveContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"29dc350d8400b0a559c16bba62e4cbb6bac848e9afcc6220086498134fc3d49e","declaration":"export function createOutboundPayloadPlan(payloads: readonly ReplyPayload[], context?: OutboundPayloadPlanContext): OutboundPayloadPlan[];","entrypoint":"channel-message","exportName":"createOutboundPayloadPlan","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"93906d2c7105382007072ea3e79787732a62828361034e59306d3cd0f5b05a25","declaration":"export function createOutboundPayloadPlan(payloads: readonly ReplyPayload[], context?: OutboundPayloadPlanContext): OutboundPayloadPlan[];","entrypoint":"channel-message","exportName":"createOutboundPayloadPlan","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"7abc004852a9162c3f4241d6c80b9962c9732dd03d2d38a56e4080a4e92758a1","declaration":"export function createPreviewMessageReceipt(params: { id: unknown; threadId?: string; replyToId?: string; sentAt?: number; raw?: unknown; }): MessageReceipt;","entrypoint":"channel-message","exportName":"createPreviewMessageReceipt","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"00ea8c297cf2cb1d8f27d4177e14c2a8f95417806077b3e6206dd939106a4f42","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-message","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"f6f643d3ac733041c53ea9448c56ca76fef259032c480ba6f4bf3ad7c48c8108","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-message","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"449a8d46d726b3de6fdf7aabf60939d37565ef5701ef58dd91b817040712ab87","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-message","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"acb4b6a4562c6a6ac30594fcd9431a9aabb031135fff7faa41a74067139ab572","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-message","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"74fc19137203a84902b6a7cdaa10db8db714e6aed701e61d398d9edc1bbf2592","declaration":"export function createReplyToFanout(params: { replyToId?: string | null; replyToMode?: ReplyToMode; replyToIdSource?: ReplyToResolution[\"source\"]; }): () => string | undefined;","entrypoint":"channel-message","exportName":"createReplyToFanout","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"d934828dfca3782d302de428edb678320bafaaf43732a885df3a78c9775e49c6","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"channel-message","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"7e7949327c77ae964e33167e8f064680883ce46b75a4606a9f8e154cc0cec7a9","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"channel-message","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"1c08a759db76abcefee8ee1bab6313a396d321f42a105176b5705bef8ffa94ad","declaration":"export function createTypingCallbacks(params: CreateTypingCallbacksParams): TypingCallbacks;","entrypoint":"channel-message","exportName":"createTypingCallbacks","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"ba427dfdeef714736de2a030fcaef5c23a3b0e6351f7c5ebd786f19ff350e1bc","declaration":"export function createTypingKeepaliveLoop(params: { intervalMs: number; onTick: AsyncTick; }): TypingKeepaliveLoop;","entrypoint":"channel-message","exportName":"createTypingKeepaliveLoop","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"5b0e9276eabf37eac35db01adadd9694fdec1972f9b778ced4d704a868844f67","declaration":"export function defineChannelMessageAdapter(adapter: TAdapter): ChannelMessageAdapter>;","entrypoint":"channel-message","exportName":"defineChannelMessageAdapter","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} @@ -1063,7 +1063,7 @@ {"closureHash":"844a3251dcba84a9735c855d7b6c930570cc486f3a1c5fc49b541572d52bb7d7","declaration":"export function normalizeAgentPlanSteps(value: unknown): AgentPlanStep[] | undefined;","entrypoint":"channel-message","exportName":"normalizeAgentPlanSteps","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"b19d38e15e2054e826fd132198c606165fc369fb5a96f4e6bbbf7b89bee35ac2","declaration":"export function normalizeChannelProgressDraftLineIdentity(line: string | ChannelProgressDraftLine | undefined): string;","entrypoint":"channel-message","exportName":"normalizeChannelProgressDraftLineIdentity","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"ba2389600eeea10867e3891e411bd84e8fd07dcd410249c29ca92ba59ef27bad","declaration":"export function processPidFromOwnerId(ownerId: string): number;","entrypoint":"channel-message","exportName":"processPidFromOwnerId","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"12fbc7eeb2ee5046f417e91bed56d59a8fb1b8b995675f1d40a1b0c13ed815bb","declaration":"export function projectOutboundPayloadPlanForDelivery(plan: readonly OutboundPayloadPlan[]): ReplyPayload[];","entrypoint":"channel-message","exportName":"projectOutboundPayloadPlanForDelivery","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"70bfbeeee4a0a2290cbf9620933c2bf7d00fbcaf3c20958c2064f5e2ce5a0bb8","declaration":"export function projectOutboundPayloadPlanForDelivery(plan: readonly OutboundPayloadPlan[]): ReplyPayload[];","entrypoint":"channel-message","exportName":"projectOutboundPayloadPlanForDelivery","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"bc16377d8f9c3467da5115ff2d6b3ef0423980794a0f5af287b1f1e8ee9533ef","declaration":"export function recordOutboundMessageIdentity(identity: OutboundMessageIdentity): void;","entrypoint":"channel-message","exportName":"recordOutboundMessageIdentity","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"3090faaaca1e2c970a0eadbb7792c531a053746df6df83a082d8564a8313b401","declaration":"export function resolveAgentOutboundIdentity(cfg: OpenClawConfig, agentId: string): OutboundIdentity | undefined;","entrypoint":"channel-message","exportName":"resolveAgentOutboundIdentity","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"ba763bf7ff1dee852fb9b58f5995f9df744028d47ca29f687b215ba316c66723","declaration":"export function resolveChannelDraftStreamingChunking(cfg: OpenClawConfig | undefined, channelId: ChannelId, accountId: string | null | undefined, opts: { fallbackLimit: number; }): ChannelDraftStreamingChunking;","entrypoint":"channel-message","exportName":"resolveChannelDraftStreamingChunking","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} @@ -1089,7 +1089,7 @@ {"closureHash":"741007941f15f430026cdbd56e555a52a150924e6190e629c054d461bb7187cd","declaration":"export function runPassiveAccountLifecycle(params: PassiveAccountLifecycleParams): Promise;","entrypoint":"channel-message","exportName":"runPassiveAccountLifecycle","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"82e2b43396b910ef19bddcd3abc6bbb81ed0df646537dee1292c20f1d55a7e49","declaration":"export function sanitizeForPlainText(text: string, options?: { style?: \"markdown\"; }): string;","entrypoint":"channel-message","exportName":"sanitizeForPlainText","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"356ec7b9ff2eaca48d91bf082d443fbbc130d98d4692683ba2520a54b1064f0c","declaration":"export function selectLongerFinalText(params: { finalText: string; candidateTexts: readonly (string | undefined)[]; }): string | undefined;","entrypoint":"channel-message","exportName":"selectLongerFinalText","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"92aaa8fa766b4e8964281c1308665e87fa1972e27d2b71982df11d609f8bb9de","declaration":"export function sendDurableMessageBatch(params: DurableMessageSendContextParams): Promise;","entrypoint":"channel-message","exportName":"sendDurableMessageBatch","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"c94562e8ce7fb6a31ca11164d13e5a0c012c53ee9f23fd53c88f87a2c746a2a4","declaration":"export function sendDurableMessageBatch(params: DurableMessageSendContextParams): Promise;","entrypoint":"channel-message","exportName":"sendDurableMessageBatch","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"5ce1f7e89ec92d671bf5c485a97438d007f9e4c482ecee6d259f159c12e67994","declaration":"export function takeMessageIdAfterStop(params: StopAndClearMessageIdParams): Promise;","entrypoint":"channel-message","exportName":"takeMessageIdAfterStop","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"1c22493ec773f5ab49e858da5f555c05d5b381752d28311f0bcdb336080777ce","declaration":"export function verifyChannelMessageAdapterCapabilityProofs(params: { adapterName: string; adapter: Pick; proofs: DurableFinalCapabilityProofMap; }): Promise;","entrypoint":"channel-message","exportName":"verifyChannelMessageAdapterCapabilityProofs","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"30a6c2c3d8d4c265d56cbd34e482ee977571c7f74aabfd7124b976f161e7fd5c","declaration":"export function verifyChannelMessageLiveCapabilityAdapterProofs(params: { adapterName: string; adapter: Pick; proofs: ChannelMessageLiveCapabilityProofMap; }): Promise;","entrypoint":"channel-message","exportName":"verifyChannelMessageLiveCapabilityAdapterProofs","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} @@ -1097,13 +1097,13 @@ {"closureHash":"94c985b543d41619c1451d892659176c20cefedcbec31ca664b6b455047726ea","declaration":"export function verifyChannelMessageReceiveAckPolicyAdapterProofs(params: { adapterName: string; adapter: Pick; proofs: ChannelMessageReceiveAckPolicyProofMap; }): Promise;","entrypoint":"channel-message","exportName":"verifyChannelMessageReceiveAckPolicyAdapterProofs","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"b796c691d3924ee3a5ac8b33d889dbaf93c1fc9f643e63b7c7da7cf56116fff3","declaration":"export function verifyDurableFinalCapabilityProofs(params: { adapterName: string; capabilities?: DurableFinalDeliveryRequirementMap; proofs: DurableFinalCapabilityProofMap; }): Promise;","entrypoint":"channel-message","exportName":"verifyDurableFinalCapabilityProofs","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"af8e81abdafe41b89921aac6736d212928aa6680ddafd6a11faee588dada12ba","declaration":"export function waitUntilAbort(signal?: AbortSignal, onAbort?: () => void | Promise): Promise;","entrypoint":"channel-message","exportName":"waitUntilAbort","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} -{"closureHash":"4f8e7e4cfdeda331979162410d711d740b2b106591f6b22789b4d44c999296bd","declaration":"export function withDurableMessageSendContext(params: DurableMessageSendContextParams, run: (ctx: DurableMessageSendContext) => Promise): Promise;","entrypoint":"channel-message","exportName":"withDurableMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} +{"closureHash":"75f25c6880a7a4b04052932992f5e4a75baf1920170178e553c8a0ffa0dceaf7","declaration":"export function withDurableMessageSendContext(params: DurableMessageSendContextParams, run: (ctx: DurableMessageSendContext) => Promise): Promise;","entrypoint":"channel-message","exportName":"withDurableMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"function","recordType":"export"} {"closureHash":"2021b09986fe1e67b52bb5f9e178a6f01c8bbeed05fbeee94d77f7c97b8bc1dc","declaration":"export const CHANNEL_INGRESS_RETENTION_DEFAULTS: Readonly<{ pruneIntervalMs: number; completedTtlMs: number; completedMaxEntries: number; failedTtlMs: number; failedMaxEntries: number;}>;","entrypoint":"channel-message","exportName":"CHANNEL_INGRESS_RETENTION_DEFAULTS","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} {"closureHash":"1d2b35e1a14c51c787964793fc2497bd5c2ac40027448787a00a07d0ed367cac","declaration":"export const DEFAULT_INGRESS_ADOPTION_STALL_MS: number;","entrypoint":"channel-message","exportName":"DEFAULT_INGRESS_ADOPTION_STALL_MS","importSpecifier":"openclaw/plugin-sdk/channel-message","kind":"const","recordType":"export"} {"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":"e00127c8d36bc7219cc2f31cc4ded3deb1ce54ca5287fe7f40611242433ab6bd","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":"64792a0c33912731a154f8e8e1b3f598b3396d2e0b93ed35fb4cc67a150bf9e2","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"} @@ -1155,7 +1155,7 @@ {"closureHash":"2ee885cd4f5bd43dc0edc0bd8866bc2655e135dc229dcd08390ce24205a79e6a","declaration":"export function createChannelIngressError(name: string): ChannelIngressErrorClass;\nexport function createChannelIngressError(name: string, options: { withReason: true; }): ChannelIngressErrorClass;","entrypoint":"channel-outbound","exportName":"createChannelIngressError","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"1148ff7d1272453be5061ccbb1e4213c21701a4d034f7a09dc6539ac28c6122e","declaration":"export function createChannelIngressMonitor(options: CreateChannelIngressMonitorOptions): { admit: (raw: TRaw, admitOptions?: { receivedAt?: number; facts?: ChannelIngressMonitorFacts; }) => Promise<{ readonly kind: \"ignored\"; readonly queueResult?: undefined; } | { readonly kind: \"durable\"; readonly queueResult: { kind: \"failed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; failedAt: number; reason: string; message?: string; }; } | { kind: \"accepted\"; duplicate: false; record: ChannelIngressQueueRecord; } | { kind: \"pending\"; duplicate: true; record: ChannelIngressQueueRecord; } | { kind: \"claimed\"; duplicate: true; record: ChannelIngressQueueClaim; } | { kind: \"completed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; completedAt: number; metadata?: unknown; }; }; }>; admitBatch: (rawEvents: readonly TRaw[], admitOptions?: { receivedAt?: number; }) => Promise<({ readonly kind: \"ignored\"; readonly queueResult?: undefined; } | { readonly kind: \"durable\"; readonly queueResult: { kind: \"failed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; failedAt: number; reason: string; message?: string; }; } | { kind: \"accepted\"; duplicate: false; record: ChannelIngressQueueRecord; } | { kind: \"pending\"; duplicate: true; record: ChannelIngressQueueRecord; } | { kind: \"claimed\"; duplicate: true; record: ChannelIngressQueueClaim; } | { kind: \"completed\"; duplicate: true; record: { id: string; channelId: string; accountId: string; queueName: string; completedAt: number; metadata?: unknown; }; }; })[]>; start: () => void; ensureQueueAvailable: () => void; requestDrain: () => void; pause: () => Promise; stop: () => Promise; waitForIdle: () => Promise; waitForDeferredClaims: () => Promise; waitForPumpIdle: () => Promise; isRunning: () => boolean; isStopped: () => boolean; };","entrypoint":"channel-outbound","exportName":"createChannelIngressMonitor","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"c2da77bb4d055b4058a10dc5125a8ddbeec764cd700a47280599cfbe000bc7b2","declaration":"export function createChannelMessageAdapterFromOutbound(params: CreateChannelMessageAdapterFromOutboundParams): ChannelMessageAdapterShape;","entrypoint":"channel-outbound","exportName":"createChannelMessageAdapterFromOutbound","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"1670536bbc6ed9619b06e87e8072687d0847218badf71f08b439bfea0bfc3c5b","declaration":"export function createChannelMessageReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-outbound","exportName":"createChannelMessageReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"291fd442e26d70ed6c961c96830a802fe523feb8f2ccce02b7d2fca552f85404","declaration":"export function createChannelMessageReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-outbound","exportName":"createChannelMessageReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"2871a1ae2423e62833646aa01bc69a1d32669d06436655df4c33d98a73e22d49","declaration":"export function createChannelProgressDraftCompositor(params: { entry: StreamingCompatEntry | null | undefined; mode: ChannelProgressDraftMode; active: boolean; seed: string; update: (text: string, options?: ChannelProgressDraftUpdateOptions) => Promise | boolean | void; deleteCurrent?: () => Promise | void; tryNativeUpdate?: (text: string) => Promise | boolean; updateOnLineChange?: boolean; rendersRollingLinesNatively?: boolean; formatLine?: (line: string) => string; isEmptyLine?: (line: ChannelProgressDraftCompositorLine | undefined) => boolean; shouldStartNow?: (line: ChannelProgressDraftCompositorLine | undefined) => boolean; reasoningLinePrefix?: string; commentaryLinePrefix?: string; reasoningGate?: boolean; commentaryItalics?: boolean; now?: () => number; setTimeoutFn?: typeof setTimeout; clearTimeoutFn?: typeof clearTimeout; buildProgressEventLine?: ChannelProgressDraftEventLineBuilder; }): { pushPlanProgress(steps?: AgentPlanStep[], options?: { explanation?: string; }): Promise; pushPreambleHeadline(text?: string, options?: { itemId?: string; }): Promise; pushNarrationProgress(text?: string): Promise; pushReasoningProgress(text?: string, options?: { snapshot?: boolean; }): Promise; pushCommentaryProgress(text?: string, options?: { itemId?: string; }): Promise; pushToolEvent: (payload: { name?: string | undefined; args?: Record | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; } & { detailMode?: \"explain\" | \"raw\"; }) => Promise; pushItemEvent: (payload: Omit<{ title?: string | undefined; meta?: string | undefined; status?: string | undefined; name?: string | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; summary?: string | undefined; progressText?: string | undefined; itemKind?: string | undefined; commandBearing?: boolean | undefined; }, \"itemKind\"> & { kind?: string; }) => Promise; pushApprovalEvent: (payload: { message?: string | undefined; title?: string | undefined; command?: string | undefined; reason?: string | undefined; phase?: string | undefined; }) => Promise; pushCommandOutputEvent: (payload: { title?: string | undefined; status?: string | undefined; name?: string | undefined; phase?: string | undefined; toolCallId?: string | undefined; itemId?: string | undefined; exitCode?: number | null | undefined; }) => Promise; pushPatchEvent: (payload: { title?: string | undefined; name?: string | undefined; phase?: string | undefined; deleted?: string[] | undefined; toolCallId?: string | undefined; itemId?: string | undefined; summary?: string | undefined; modified?: string[] | undefined; added?: string[] | undefined; }) => Promise; previewToolProgressEnabled: boolean; commentaryProgressEnabled: boolean; suppressDefaultToolProgressMessages: boolean; hasStarted: boolean; isVisible: boolean; hasStatusHeadline: boolean; hasPlanProgress: boolean; getSnapshot: () => ChannelProgressDraftCompositorSnapshot; markFinalReplyStarted(): void; markFinalReplyDelivered(): void; beginNewTurn(options?: { force?: boolean; }): boolean; reset(): void; resetReasoningProgress(): void; mergeReasoningProgress: (text?: string, options?: { snapshot?: boolean; }) => string; suppress(): void; cancel(): void; start(): Promise; noteActivity(options?: { startImmediately?: boolean; }): Promise; pushToolProgress: (line?: ChannelProgressDraftCompositorLine, options?: { toolName?: string; startImmediately?: boolean; }) => Promise; };","entrypoint":"channel-outbound","exportName":"createChannelProgressDraftCompositor","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"44c199920938c7a282e44d36eea187f1f8ce1d09bfb845180e1844124f497a3c","declaration":"export function createChannelProgressDraftGate(params: { onStart: () => void | Promise; initialDelayMs?: number; onStartError?: (error: unknown) => void; setTimeoutFn?: typeof setTimeout; clearTimeoutFn?: typeof clearTimeout; }): { readonly hasStarted: boolean; readonly workEvents: number; noteWork(): Promise; startNow(): Promise; cancel(): void; reset(): void; };","entrypoint":"channel-outbound","exportName":"createChannelProgressDraftGate","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"2204efb262a5e8af61346bce23492dd759c15037ce3b8500148c5cc8dce1c421","declaration":"export function createChannelProgressReceiptTracker(params?: { now?: () => number; }): { noteReasoning(): void; closeReasoning: () => void; noteToolCall(toolName?: string): void; noteCommentary(itemId?: string, text?: string): void; reset: () => void; buildSummaryLine(): string; };","entrypoint":"channel-outbound","exportName":"createChannelProgressReceiptTracker","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} @@ -1166,12 +1166,12 @@ {"closureHash":"acd64a0d6ce6dbd9db22f9e4a4497cef2110a9e962f240c6f5e90cef31505459","declaration":"export function createFinalizableDraftStreamControlsForState(params: { throttleMs: number; state: FinalizableDraftStreamState; sendOrEditStreamMessage: (value: T) => Promise; emptyValue?: T; isEmpty?: (value: T) => boolean; }): { loop: DraftStreamLoop & { takePending: () => T; }; update: (value: T) => void; stop: () => Promise; seal: () => Promise; discardPending: () => Promise; stopForClear: () => Promise; };","entrypoint":"channel-outbound","exportName":"createFinalizableDraftStreamControlsForState","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"f2bb1868ec1cf7d97e6b8eb0a9a8a37122ec53c9cd4e2bbfc8448c1555f3d382","declaration":"export function createMessageReceiptFromOutboundResults(params: { results: readonly MessageReceiptInputResult[]; kind?: MessageReceiptPartKind; threadId?: string; replyToId?: string; sentAt?: number; }): MessageReceipt;","entrypoint":"channel-outbound","exportName":"createMessageReceiptFromOutboundResults","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"3c150fb027a4e4a1685b572d26aa1f70b3838641bd7629434c4265bfda549d0a","declaration":"export function createMessageReceiveContext(params: { id: string; channel: string; accountId?: string; message: TMessage; ackPolicy?: MessageAckPolicy; receivedAt?: number; signal?: AbortSignal; onAck?: () => Promise | void; onNack?: (error: unknown) => Promise | void; }): MessageReceiveContext;","entrypoint":"channel-outbound","exportName":"createMessageReceiveContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"29dc350d8400b0a559c16bba62e4cbb6bac848e9afcc6220086498134fc3d49e","declaration":"export function createOutboundPayloadPlan(payloads: readonly ReplyPayload[], context?: OutboundPayloadPlanContext): OutboundPayloadPlan[];","entrypoint":"channel-outbound","exportName":"createOutboundPayloadPlan","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"93906d2c7105382007072ea3e79787732a62828361034e59306d3cd0f5b05a25","declaration":"export function createOutboundPayloadPlan(payloads: readonly ReplyPayload[], context?: OutboundPayloadPlanContext): OutboundPayloadPlan[];","entrypoint":"channel-outbound","exportName":"createOutboundPayloadPlan","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"7abc004852a9162c3f4241d6c80b9962c9732dd03d2d38a56e4080a4e92758a1","declaration":"export function createPreviewMessageReceipt(params: { id: unknown; threadId?: string; replyToId?: string; sentAt?: number; raw?: unknown; }): MessageReceipt;","entrypoint":"channel-outbound","exportName":"createPreviewMessageReceipt","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"00ea8c297cf2cb1d8f27d4177e14c2a8f95417806077b3e6206dd939106a4f42","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-outbound","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"f6f643d3ac733041c53ea9448c56ca76fef259032c480ba6f4bf3ad7c48c8108","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-outbound","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"449a8d46d726b3de6fdf7aabf60939d37565ef5701ef58dd91b817040712ab87","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-outbound","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"acb4b6a4562c6a6ac30594fcd9431a9aabb031135fff7faa41a74067139ab572","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-outbound","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"74fc19137203a84902b6a7cdaa10db8db714e6aed701e61d398d9edc1bbf2592","declaration":"export function createReplyToFanout(params: { replyToId?: string | null; replyToMode?: ReplyToMode; replyToIdSource?: ReplyToResolution[\"source\"]; }): () => string | undefined;","entrypoint":"channel-outbound","exportName":"createReplyToFanout","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"d934828dfca3782d302de428edb678320bafaaf43732a885df3a78c9775e49c6","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"channel-outbound","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"7e7949327c77ae964e33167e8f064680883ce46b75a4606a9f8e154cc0cec7a9","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"channel-outbound","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"1c08a759db76abcefee8ee1bab6313a396d321f42a105176b5705bef8ffa94ad","declaration":"export function createTypingCallbacks(params: CreateTypingCallbacksParams): TypingCallbacks;","entrypoint":"channel-outbound","exportName":"createTypingCallbacks","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"ba427dfdeef714736de2a030fcaef5c23a3b0e6351f7c5ebd786f19ff350e1bc","declaration":"export function createTypingKeepaliveLoop(params: { intervalMs: number; onTick: AsyncTick; }): TypingKeepaliveLoop;","entrypoint":"channel-outbound","exportName":"createTypingKeepaliveLoop","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"5b0e9276eabf37eac35db01adadd9694fdec1972f9b778ced4d704a868844f67","declaration":"export function defineChannelMessageAdapter(adapter: TAdapter): ChannelMessageAdapter>;","entrypoint":"channel-outbound","exportName":"defineChannelMessageAdapter","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} @@ -1193,7 +1193,7 @@ {"closureHash":"844a3251dcba84a9735c855d7b6c930570cc486f3a1c5fc49b541572d52bb7d7","declaration":"export function normalizeAgentPlanSteps(value: unknown): AgentPlanStep[] | undefined;","entrypoint":"channel-outbound","exportName":"normalizeAgentPlanSteps","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"b19d38e15e2054e826fd132198c606165fc369fb5a96f4e6bbbf7b89bee35ac2","declaration":"export function normalizeChannelProgressDraftLineIdentity(line: string | ChannelProgressDraftLine | undefined): string;","entrypoint":"channel-outbound","exportName":"normalizeChannelProgressDraftLineIdentity","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"ba2389600eeea10867e3891e411bd84e8fd07dcd410249c29ca92ba59ef27bad","declaration":"export function processPidFromOwnerId(ownerId: string): number;","entrypoint":"channel-outbound","exportName":"processPidFromOwnerId","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"12fbc7eeb2ee5046f417e91bed56d59a8fb1b8b995675f1d40a1b0c13ed815bb","declaration":"export function projectOutboundPayloadPlanForDelivery(plan: readonly OutboundPayloadPlan[]): ReplyPayload[];","entrypoint":"channel-outbound","exportName":"projectOutboundPayloadPlanForDelivery","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"70bfbeeee4a0a2290cbf9620933c2bf7d00fbcaf3c20958c2064f5e2ce5a0bb8","declaration":"export function projectOutboundPayloadPlanForDelivery(plan: readonly OutboundPayloadPlan[]): ReplyPayload[];","entrypoint":"channel-outbound","exportName":"projectOutboundPayloadPlanForDelivery","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"bc16377d8f9c3467da5115ff2d6b3ef0423980794a0f5af287b1f1e8ee9533ef","declaration":"export function recordOutboundMessageIdentity(identity: OutboundMessageIdentity): void;","entrypoint":"channel-outbound","exportName":"recordOutboundMessageIdentity","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"3090faaaca1e2c970a0eadbb7792c531a053746df6df83a082d8564a8313b401","declaration":"export function resolveAgentOutboundIdentity(cfg: OpenClawConfig, agentId: string): OutboundIdentity | undefined;","entrypoint":"channel-outbound","exportName":"resolveAgentOutboundIdentity","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"ba763bf7ff1dee852fb9b58f5995f9df744028d47ca29f687b215ba316c66723","declaration":"export function resolveChannelDraftStreamingChunking(cfg: OpenClawConfig | undefined, channelId: ChannelId, accountId: string | null | undefined, opts: { fallbackLimit: number; }): ChannelDraftStreamingChunking;","entrypoint":"channel-outbound","exportName":"resolveChannelDraftStreamingChunking","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} @@ -1218,7 +1218,7 @@ {"closureHash":"741007941f15f430026cdbd56e555a52a150924e6190e629c054d461bb7187cd","declaration":"export function runPassiveAccountLifecycle(params: PassiveAccountLifecycleParams): Promise;","entrypoint":"channel-outbound","exportName":"runPassiveAccountLifecycle","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"82e2b43396b910ef19bddcd3abc6bbb81ed0df646537dee1292c20f1d55a7e49","declaration":"export function sanitizeForPlainText(text: string, options?: { style?: \"markdown\"; }): string;","entrypoint":"channel-outbound","exportName":"sanitizeForPlainText","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"356ec7b9ff2eaca48d91bf082d443fbbc130d98d4692683ba2520a54b1064f0c","declaration":"export function selectLongerFinalText(params: { finalText: string; candidateTexts: readonly (string | undefined)[]; }): string | undefined;","entrypoint":"channel-outbound","exportName":"selectLongerFinalText","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"92aaa8fa766b4e8964281c1308665e87fa1972e27d2b71982df11d609f8bb9de","declaration":"export function sendDurableMessageBatch(params: DurableMessageSendContextParams): Promise;","entrypoint":"channel-outbound","exportName":"sendDurableMessageBatch","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"c94562e8ce7fb6a31ca11164d13e5a0c012c53ee9f23fd53c88f87a2c746a2a4","declaration":"export function sendDurableMessageBatch(params: DurableMessageSendContextParams): Promise;","entrypoint":"channel-outbound","exportName":"sendDurableMessageBatch","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"5ce1f7e89ec92d671bf5c485a97438d007f9e4c482ecee6d259f159c12e67994","declaration":"export function takeMessageIdAfterStop(params: StopAndClearMessageIdParams): Promise;","entrypoint":"channel-outbound","exportName":"takeMessageIdAfterStop","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"1c22493ec773f5ab49e858da5f555c05d5b381752d28311f0bcdb336080777ce","declaration":"export function verifyChannelMessageAdapterCapabilityProofs(params: { adapterName: string; adapter: Pick; proofs: DurableFinalCapabilityProofMap; }): Promise;","entrypoint":"channel-outbound","exportName":"verifyChannelMessageAdapterCapabilityProofs","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"30a6c2c3d8d4c265d56cbd34e482ee977571c7f74aabfd7124b976f161e7fd5c","declaration":"export function verifyChannelMessageLiveCapabilityAdapterProofs(params: { adapterName: string; adapter: Pick; proofs: ChannelMessageLiveCapabilityProofMap; }): Promise;","entrypoint":"channel-outbound","exportName":"verifyChannelMessageLiveCapabilityAdapterProofs","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} @@ -1226,13 +1226,13 @@ {"closureHash":"94c985b543d41619c1451d892659176c20cefedcbec31ca664b6b455047726ea","declaration":"export function verifyChannelMessageReceiveAckPolicyAdapterProofs(params: { adapterName: string; adapter: Pick; proofs: ChannelMessageReceiveAckPolicyProofMap; }): Promise;","entrypoint":"channel-outbound","exportName":"verifyChannelMessageReceiveAckPolicyAdapterProofs","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"b796c691d3924ee3a5ac8b33d889dbaf93c1fc9f643e63b7c7da7cf56116fff3","declaration":"export function verifyDurableFinalCapabilityProofs(params: { adapterName: string; capabilities?: DurableFinalDeliveryRequirementMap; proofs: DurableFinalCapabilityProofMap; }): Promise;","entrypoint":"channel-outbound","exportName":"verifyDurableFinalCapabilityProofs","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"af8e81abdafe41b89921aac6736d212928aa6680ddafd6a11faee588dada12ba","declaration":"export function waitUntilAbort(signal?: AbortSignal, onAbort?: () => void | Promise): Promise;","entrypoint":"channel-outbound","exportName":"waitUntilAbort","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} -{"closureHash":"4f8e7e4cfdeda331979162410d711d740b2b106591f6b22789b4d44c999296bd","declaration":"export function withDurableMessageSendContext(params: DurableMessageSendContextParams, run: (ctx: DurableMessageSendContext) => Promise): Promise;","entrypoint":"channel-outbound","exportName":"withDurableMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} +{"closureHash":"75f25c6880a7a4b04052932992f5e4a75baf1920170178e553c8a0ffa0dceaf7","declaration":"export function withDurableMessageSendContext(params: DurableMessageSendContextParams, run: (ctx: DurableMessageSendContext) => Promise): Promise;","entrypoint":"channel-outbound","exportName":"withDurableMessageSendContext","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"function","recordType":"export"} {"closureHash":"2021b09986fe1e67b52bb5f9e178a6f01c8bbeed05fbeee94d77f7c97b8bc1dc","declaration":"export const CHANNEL_INGRESS_RETENTION_DEFAULTS: Readonly<{ pruneIntervalMs: number; completedTtlMs: number; completedMaxEntries: number; failedTtlMs: number; failedMaxEntries: number;}>;","entrypoint":"channel-outbound","exportName":"CHANNEL_INGRESS_RETENTION_DEFAULTS","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} {"closureHash":"1d2b35e1a14c51c787964793fc2497bd5c2ac40027448787a00a07d0ed367cac","declaration":"export const DEFAULT_INGRESS_ADOPTION_STALL_MS: number;","entrypoint":"channel-outbound","exportName":"DEFAULT_INGRESS_ADOPTION_STALL_MS","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"const","recordType":"export"} {"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":"e00127c8d36bc7219cc2f31cc4ded3deb1ce54ca5287fe7f40611242433ab6bd","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":"64792a0c33912731a154f8e8e1b3f598b3396d2e0b93ed35fb4cc67a150bf9e2","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"} @@ -1276,13 +1276,13 @@ {"closureHash":"424d0b4b21b078d07a49a7bc52c3b63250be032a3e17f47c0cc824178b828ded","declaration":"export type TextChunkMode = TextChunkMode;","entrypoint":"channel-outbound","exportName":"TextChunkMode","importSpecifier":"openclaw/plugin-sdk/channel-outbound","kind":"type","recordType":"export"} {"category":"channel","entrypoint":"channel-pairing","importSpecifier":"openclaw/plugin-sdk/channel-pairing","recordType":"module"} {"closureHash":"3d2325df85dcb397e7df5c9f380c5d6c517976527acbe7d94d59df8777810d1f","declaration":"export function createChannelPairingChallengeIssuer(params: { channel: ChannelId; accountId?: string; upsertPairingRequest: Parameters[0][\"upsertPairingRequest\"]; }): (challenge: Omit[0], \"channel\" | \"accountId\" | \"upsertPairingRequest\">) => Promise<{ created: boolean; code?: string; }>;","entrypoint":"channel-pairing","exportName":"createChannelPairingChallengeIssuer","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} -{"closureHash":"c966fd9925d4722d4d5ccd665caf210c33af2ec1a2243b85362d8e99eef89191","declaration":"export function createChannelPairingController(params: { core: PluginRuntime; channel: ChannelId; accountId: string; }): ChannelPairingController;","entrypoint":"channel-pairing","exportName":"createChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} +{"closureHash":"3445b7e876a52e005ac43b3864407134c832f481c7883123f77f06121197a229","declaration":"export function createChannelPairingController(params: { core: PluginRuntime; channel: ChannelId; accountId: string; }): ChannelPairingController;","entrypoint":"channel-pairing","exportName":"createChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} {"closureHash":"39648d8f2d5ec14a204569c6266100fef1e455dd53dd6b05ae3034dc98986875","declaration":"export function createLoggedPairingApprovalNotifier(format: string | ((params: PairingNotifyParams) => string), log?: (message: string) => void): NonNullable;","entrypoint":"channel-pairing","exportName":"createLoggedPairingApprovalNotifier","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} {"closureHash":"d5198bb50f3f1c60b384feb93ae07621ceeca6f7d7f7c729ec96dabe984eca10","declaration":"export function createPairingPrefixStripper(prefixRe: RegExp, map?: (entry: string) => string): NonNullable;","entrypoint":"channel-pairing","exportName":"createPairingPrefixStripper","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} {"closureHash":"b914a433d104666e368d9e2c85d328e0015168b8ad3ade34bc993d3cc7141513","declaration":"export function createTextPairingAdapter(params: { idLabel: string; message: string; normalizeAllowEntry?: ChannelPairingAdapter[\"normalizeAllowEntry\"]; notify: (params: PairingNotifyParams & { message: string; }) => Promise | void; }): ChannelPairingAdapter;","entrypoint":"channel-pairing","exportName":"createTextPairingAdapter","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} {"closureHash":"ec2b230fc869584bf4114bc30b34546f3e3e9369d7b6f49d9ff3bc8b19dd1989","declaration":"export function readChannelAllowFromStore(channel: PairingChannel, env?: NodeJS.ProcessEnv, accountId?: string): Promise;","entrypoint":"channel-pairing","exportName":"readChannelAllowFromStore","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} {"closureHash":"efe4915252d6eb26af5b1c52dadf22e05b4a13f1668a10cc508c0aa4bae11e39","declaration":"export function readChannelAllowFromStoreSync(channel: PairingChannel, env?: NodeJS.ProcessEnv, accountId?: string): string[];","entrypoint":"channel-pairing","exportName":"readChannelAllowFromStoreSync","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export"} -{"closureHash":"1e1365affaa5aea2a2befb5e4a9a9123da674766812e711346c3d93b34181a20","declaration":"export type ChannelPairingController = ChannelPairingController;","entrypoint":"channel-pairing","exportName":"ChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"type","recordType":"export"} +{"closureHash":"45a75829d749deafc60692dcff0404d0cbc717cecac807b87e607a5dcc8ff611","declaration":"export type ChannelPairingController = ChannelPairingController;","entrypoint":"channel-pairing","exportName":"ChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"type","recordType":"export"} {"category":null,"entrypoint":"channel-plugin-common","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","recordType":"module"} {"closureHash":"19a3d4c1fdad2b565e7428da26e0dafa76f08498bcf06ac3df098486ff4afc2c","declaration":"export function applyAccountNameToChannelSection(params: { cfg: OpenClawConfig; channelKey: string; accountId: string; name?: string; alwaysUseAccounts?: boolean; }): OpenClawConfig;","entrypoint":"channel-plugin-common","exportName":"applyAccountNameToChannelSection","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"function","recordType":"export"} {"closureHash":"e97ff96104ab3b7f8462f20d39d2596908a59cb03a634c6c2fb0d7ff80e5bb54","declaration":"export function buildChannelConfigSchema(schema: ZodTypeAny, options?: BuildChannelConfigSchemaOptions): ChannelConfigSchema;","entrypoint":"channel-plugin-common","exportName":"buildChannelConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"function","recordType":"export"} @@ -1297,9 +1297,9 @@ {"closureHash":"b40933a11984425d14a7a479bda0d2cd14cbfa9371164774f39bebbf12861df7","declaration":"export const DEFAULT_ACCOUNT_ID: \"default\";","entrypoint":"channel-plugin-common","exportName":"DEFAULT_ACCOUNT_ID","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"const","recordType":"export"} {"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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","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"} +{"closureHash":"d02e5c7a995847180696d2a05d8ea092b364ef32b36753e4091fc97ffdaf44ab","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"channel-plugin-common","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} +{"closureHash":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"channel-plugin-common","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/channel-plugin-common","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","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"} {"closureHash":"628863a501a389d1fee7ab465a4e9da1751189011e9086a54ab22bfc1f970c8a","declaration":"export function buildChannelGroupsScopeTree(cfg: OpenClawConfig, channel: ChannelId, accountId?: string | null): ScopeTree;","entrypoint":"channel-policy","exportName":"buildChannelGroupsScopeTree","importSpecifier":"openclaw/plugin-sdk/channel-policy","kind":"function","recordType":"export"} @@ -1359,16 +1359,16 @@ {"closureHash":"65423417d7f3e51cb00d21a96c5426a4494abeceb7bc07707a6b7b8131192f27","declaration":"export type ScopePath = ScopePath;","entrypoint":"channel-policy","exportName":"ScopePath","importSpecifier":"openclaw/plugin-sdk/channel-policy","kind":"type","recordType":"export"} {"closureHash":"eb70a2d51551dbaeb3585e0efc18b37e1dcfbaa1f6f4e8564e0e9ca9968e7559","declaration":"export type ScopeTree = ScopeTree;","entrypoint":"channel-policy","exportName":"ScopeTree","importSpecifier":"openclaw/plugin-sdk/channel-policy","kind":"type","recordType":"export"} {"category":"channel","entrypoint":"channel-reply-pipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","recordType":"module"} -{"closureHash":"1670536bbc6ed9619b06e87e8072687d0847218badf71f08b439bfea0bfc3c5b","declaration":"export function createChannelReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"createChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} -{"closureHash":"00ea8c297cf2cb1d8f27d4177e14c2a8f95417806077b3e6206dd939106a4f42","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-reply-pipeline","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} -{"closureHash":"f6f643d3ac733041c53ea9448c56ca76fef259032c480ba6f4bf3ad7c48c8108","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-reply-pipeline","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} +{"closureHash":"291fd442e26d70ed6c961c96830a802fe523feb8f2ccce02b7d2fca552f85404","declaration":"export function createChannelReplyPipeline(params: CreateChannelReplyPipelineParams): ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"createChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} +{"closureHash":"449a8d46d726b3de6fdf7aabf60939d37565ef5701ef58dd91b817040712ab87","declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixContextBundle;","entrypoint":"channel-reply-pipeline","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} +{"closureHash":"acb4b6a4562c6a6ac30594fcd9431a9aabb031135fff7faa41a74067139ab572","declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string; accountId?: string; }): ReplyPrefixOptions;","entrypoint":"channel-reply-pipeline","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} {"closureHash":"1c08a759db76abcefee8ee1bab6313a396d321f42a105176b5705bef8ffa94ad","declaration":"export function createTypingCallbacks(params: CreateTypingCallbacksParams): TypingCallbacks;","entrypoint":"channel-reply-pipeline","exportName":"createTypingCallbacks","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} {"closureHash":"19053f3926d4ac878570b38581176d868c1db0562405f63c2b4c8ebe05d8c16b","declaration":"export function resolveChannelSourceReplyDeliveryMode(params: { cfg: OpenClawConfig; ctx: SourceReplyDeliveryModeContext; requested?: SourceReplyDeliveryMode; messageToolAvailable?: boolean; }): SourceReplyDeliveryMode;","entrypoint":"channel-reply-pipeline","exportName":"resolveChannelSourceReplyDeliveryMode","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export"} -{"closureHash":"9d5c686bf5c3dc6b5acdc37564ed384142d2c8770dda544c22ef30577f02b79c","declaration":"export type ChannelReplyPipeline = ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"ChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} +{"closureHash":"bb9d0a771dbedc609a0c920deca5b00693fe0ca597f7c8d86c374593c2148dff","declaration":"export type ChannelReplyPipeline = ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"ChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} {"closureHash":"81452f2eddc8652fc02b84e6e7c8e52e24bdef551a33c500efd052214906ac9e","declaration":"export type CreateTypingCallbacksParams = CreateTypingCallbacksParams;","entrypoint":"channel-reply-pipeline","exportName":"CreateTypingCallbacksParams","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} -{"closureHash":"0ea971a67b51158be5163e919f0ef1a1af2d6b37c348f4141c4b8683b8cb71b3","declaration":"export type ReplyPrefixContext = ResponsePrefixContext;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} -{"closureHash":"b7fa7d2f145d00ad4d2cd303f18aa2c3bdf75184518c4cc459839443ad61aa8b","declaration":"export type ReplyPrefixContextBundle = ReplyPrefixContextBundle;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixContextBundle","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} -{"closureHash":"ea87b3cc8768bc70135a914925937eb1fc92af92d268993f58bc595e461dbdf6","declaration":"export type ReplyPrefixOptions = ReplyPrefixOptions;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} +{"closureHash":"0997988dd99de0a68e4f47da5491f896a740354621b429002624efb9d5d29f1a","declaration":"export type ReplyPrefixContext = ResponsePrefixContext;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} +{"closureHash":"56e0cebf7c02df15105ae90d2bed5ef2368af97dca757890bfd800e9c56a9118","declaration":"export type ReplyPrefixContextBundle = ReplyPrefixContextBundle;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixContextBundle","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} +{"closureHash":"9a381a291ce695000be68149a6268cbfdadd13bff77872c5daa430e2de1dde46","declaration":"export type ReplyPrefixOptions = ReplyPrefixOptions;","entrypoint":"channel-reply-pipeline","exportName":"ReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} {"closureHash":"abf24938da5bcaf723794c1b4cdd2d0fcb6697df4cd49898bcccec19cdff77b5","declaration":"export type SourceReplyDeliveryMode = SourceReplyDeliveryMode;","entrypoint":"channel-reply-pipeline","exportName":"SourceReplyDeliveryMode","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} {"closureHash":"32be4db788d5dd3933981b01175e6146942936f81fd1933534e9cba67fe2ec0a","declaration":"export type TypingCallbacks = TypingCallbacks;","entrypoint":"channel-reply-pipeline","exportName":"TypingCallbacks","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export"} {"category":null,"entrypoint":"channel-runtime-context","importSpecifier":"openclaw/plugin-sdk/channel-runtime-context","recordType":"module"} @@ -1430,10 +1430,10 @@ {"closureHash":"4f8cf2d6d3458028b61361b36950e0f7a2cfe8de006c24f38085919571bd2b59","declaration":"export function attachChannelToResult(channel: string, result: T): T & { channel: string; };","entrypoint":"channel-send-result","exportName":"attachChannelToResult","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} {"closureHash":"c309739f0cb4f5fa3bd423ef035a242e2a00a1ab1219f36e34dd62bce0284eaf","declaration":"export function attachChannelToResults(channel: string, results: readonly T[]): (T & { channel: string; })[];","entrypoint":"channel-send-result","exportName":"attachChannelToResults","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} {"closureHash":"5181b5e0735fe7de720ad762c24f849d2159435d16ef3d409cbf7695abd59f74","declaration":"export function buildChannelSendResult(channel: string, result: ChannelSendRawResult): { channel: string; ok: boolean; messageId: string; error: Error | undefined; };","entrypoint":"channel-send-result","exportName":"buildChannelSendResult","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} -{"closureHash":"51342f43ae88b5b06c85c791bb15eb2afdb4c81e0c019dc04fb074ee1b39ffea","declaration":"export function createAttachedChannelResultAdapter(params: { channel: string; sendText?: (ctx: SendTextParams) => MaybePromise>; sendMedia?: (ctx: SendMediaParams) => MaybePromise>; sendPoll?: (ctx: SendPollParams) => MaybePromise>; }): Pick;","entrypoint":"channel-send-result","exportName":"createAttachedChannelResultAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} +{"closureHash":"b3749deb6b186505c3228f5971cb154f8aeb418b35fca7f3344cf5fb6f81cb77","declaration":"export function createAttachedChannelResultAdapter(params: { channel: string; sendText?: (ctx: SendTextParams) => MaybePromise>; sendMedia?: (ctx: SendMediaParams) => MaybePromise>; sendPoll?: (ctx: SendPollParams) => MaybePromise>; }): Pick;","entrypoint":"channel-send-result","exportName":"createAttachedChannelResultAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} {"closureHash":"61b6bb942f5ffe35577d462c4e13e4067ec77cbb27e5315900ede28b8042c9c1","declaration":"export function createEmptyChannelResult(channel: string, result?: Partial> & { messageId?: string; }): OutboundDeliveryResult;","entrypoint":"channel-send-result","exportName":"createEmptyChannelResult","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} -{"closureHash":"e93464d2100b861c24f58552ecca3ea75b47314c7613c937223e6e983192f50d","declaration":"export function createRawChannelSendResultAdapter(params: { channel: string; sendText?: (ctx: SendTextParams) => MaybePromise; sendMedia?: (ctx: SendMediaParams) => MaybePromise; }): Pick;","entrypoint":"channel-send-result","exportName":"createRawChannelSendResultAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} -{"closureHash":"ec916ca974bd0242329b6532fb8467a63d038f1182ae9b2af3aa3b979b5fa589","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"channel-send-result","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"type","recordType":"export"} +{"closureHash":"144b958f6fc210cc4c6514260c500805bd399530866b33538908658817d5edaa","declaration":"export function createRawChannelSendResultAdapter(params: { channel: string; sendText?: (ctx: SendTextParams) => MaybePromise; sendMedia?: (ctx: SendMediaParams) => MaybePromise; }): Pick;","entrypoint":"channel-send-result","exportName":"createRawChannelSendResultAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"function","recordType":"export"} +{"closureHash":"9002ead9bb685657b14a74835c7de0952a9122dcf77c02405e3f0d79cc5d4821","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"channel-send-result","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"type","recordType":"export"} {"closureHash":"a4172fe12204fcce4866cba910235a44fc29b98fb1149e71d66bf4751d280105","declaration":"export type ChannelSendRawResult = ChannelSendRawResult;","entrypoint":"channel-send-result","exportName":"ChannelSendRawResult","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"type","recordType":"export"} {"closureHash":"3980c6640186a0aad7207701113e1709260850cdeb2452a8c8ad16c7d342d0a1","declaration":"export type OutboundDeliveryResult = OutboundDeliveryResult;","entrypoint":"channel-send-result","exportName":"OutboundDeliveryResult","importSpecifier":"openclaw/plugin-sdk/channel-send-result","kind":"type","recordType":"export"} {"category":"channel","entrypoint":"channel-setup","importSpecifier":"openclaw/plugin-sdk/channel-setup","recordType":"module"} @@ -1538,7 +1538,7 @@ {"closureHash":"19568e841ed169451a1ecd8886f4bd185ba27c6b95f0c62acc409f80958da9df","declaration":"export function expandAllowFromWithAccessGroups(params: { cfg?: OpenClawConfig; allowFrom: Array | null | undefined; channel: ChannelId; accountId: string; senderId: string; senderAllowEntry?: string; isSenderAllowed?: (senderId: string, allowFrom: string[]) => boolean; resolveMembership?: AccessGroupMembershipResolver; }): Promise;","entrypoint":"command-auth","exportName":"expandAllowFromWithAccessGroups","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"daec3d53b091eb09bde7a59049cbea81fea0319138b45e7a020d12c147f7cce4","declaration":"export function findCommandByNativeName(name: string, provider?: string, options?: NativeCommandProviderLookupOptions): ChatCommandDefinition | undefined;","entrypoint":"command-auth","exportName":"findCommandByNativeName","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"b1bd9f5a756a6cf076b085b05ad124660c7bd4fc77ce5a6ef9da44df761ccd49","declaration":"export function formatCommandArgMenuTitle(params: { command: ChatCommandDefinition; menu: NonNullable>; }): string;","entrypoint":"command-auth","exportName":"formatCommandArgMenuTitle","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} -{"closureHash":"0c4cae1b295d58b5de6a784befffe7b903512c86a3b30562cc8a0d44416c757e","declaration":"export function formatModelsAvailableHeader(params: { provider: string; total: number; cfg: OpenClawConfig; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): string;","entrypoint":"command-auth","exportName":"formatModelsAvailableHeader","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} +{"closureHash":"e29752f849039ce42363e066b56be824811b0ddf386c62e35705eceb17bd5402","declaration":"export function formatModelsAvailableHeader(params: { provider: string; total: number; cfg: OpenClawConfig; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): string;","entrypoint":"command-auth","exportName":"formatModelsAvailableHeader","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"6d1863504322ea37ac826898d8ee0c84a05b83a7d9df284e406a6f6bd0c1baff","declaration":"export function getCommandDetection(_cfg?: OpenClawConfig): CommandDetection;","entrypoint":"command-auth","exportName":"getCommandDetection","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"db6583607237e4081814e2c5d4f8fb6f216ad3bbfe623bf16fc1a9c09c15f64b","declaration":"export function getPluginCommandSpecs(provider?: string, options?: PluginCommandSpecOptions): Array<{ name: string; description: string; descriptionLocalizations?: Record; acceptsArgs: boolean; }>;","entrypoint":"command-auth","exportName":"getPluginCommandSpecs","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"4889102cae0eecb695e73572f86f1e4a4b556862d9ce63706bcbb2f65a513afd","declaration":"export function hasControlCommand(text?: string, cfg?: OpenClawConfig, options?: CommandNormalizeOptions): boolean;","entrypoint":"command-auth","exportName":"hasControlCommand","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} @@ -1553,8 +1553,8 @@ {"closureHash":"b5c9d51c577df8f0893bfed0b57669a957f138ba355a4a0969c245048199e7a4","declaration":"export function listNativeCommandSpecsForConfig(cfg: OpenClawConfig, params?: { skillCommands?: SkillCommandSpec[]; provider?: string; }): NativeCommandSpec[];","entrypoint":"command-auth","exportName":"listNativeCommandSpecsForConfig","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"40049804ccc8e67ec940e1c4b22f706940f976045f5c197a625841d8caf73a58","declaration":"export function listProviderPluginCommandSpecs(provider?: string): Array<{ name: string; description: string; descriptionLocalizations?: Record; acceptsArgs: boolean; }>;","entrypoint":"command-auth","exportName":"listProviderPluginCommandSpecs","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"62c23d73cd3b49c6dcaaaff52422dfda26435e24357e23108b872e0f2fa1e8c5","declaration":"export function listReservedChatSlashCommandNames(extraNames?: string[]): Set;","entrypoint":"command-auth","exportName":"listReservedChatSlashCommandNames","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} -{"closureHash":"7acf1b16b45c4b6b2775af59000108fec01a1ce9bb11c79858775a9250d86b89","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} -{"closureHash":"eb923880a12bfe51467c5d60b97ce1eaf3e1f72d662046347e7e4372ea8dca8f","declaration":"export function listSkillCommandsForWorkspace(params: { workspaceDir: string; cfg: OpenClawConfig; agentId?: string; skillFilter?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth","exportName":"listSkillCommandsForWorkspace","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} +{"closureHash":"f25d0adb9cc96e5d35ffe80451405f856d31fe2afb813a0d9891194dc890682c","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} +{"closureHash":"59f6c592147bf5424b1986104fd871c0ffbb813e6903cf8c34035fda2f01c9b9","declaration":"export function listSkillCommandsForWorkspace(params: { workspaceDir: string; cfg: OpenClawConfig; agentId?: string; skillFilter?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth","exportName":"listSkillCommandsForWorkspace","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"8013378c2d772906b2b5201af9e79a99127d8652371efa72367073d07b1f9cba","declaration":"export function maybeResolveTextAlias(raw: string, cfg?: OpenClawConfig): string | null;","entrypoint":"command-auth","exportName":"maybeResolveTextAlias","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"aa94c4505992204c51920783ce36b6beaba4eab93082ec85f796f1cfe1814ae9","declaration":"export function normalizeCommandBody(raw: string, options?: CommandNormalizeOptions): string;","entrypoint":"command-auth","exportName":"normalizeCommandBody","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"11cbf3ce130ab9fc9dd59c502b2b11e6d1e657472294602ff983cd3d23bef9f6","declaration":"export function parseAccessGroupAllowFromEntry(entry: string): string | null;","entrypoint":"command-auth","exportName":"parseAccessGroupAllowFromEntry","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} @@ -1569,12 +1569,12 @@ {"closureHash":"652ecb5c79c74c3cc74f9247783dd50c1916c6dd80b6df700b8c11f3fbb2b2ed","declaration":"export function resolveDirectDmAuthorizationOutcome(params: { isGroup: boolean; dmPolicy: string; senderAllowedForCommands: boolean; }): \"disabled\" | \"unauthorized\" | \"allowed\";","entrypoint":"command-auth","exportName":"resolveDirectDmAuthorizationOutcome","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"811a7d5430a26675cef46889e076645d00bbe34fd0e51da184ad2bcfcb2d0602","declaration":"export function resolveDualTextControlCommandGate(params: { useAccessGroups: boolean; primaryConfigured: boolean; primaryAllowed: boolean; secondaryConfigured: boolean; secondaryAllowed: boolean; hasControlCommand: boolean; modeWhenAccessGroupsOff?: CommandGatingModeWhenAccessGroupsOff; }): { commandAuthorized: boolean; shouldBlock: boolean; };","entrypoint":"command-auth","exportName":"resolveDualTextControlCommandGate","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"d3d3c6ec842ac5bf7b074adbf9f9e27da8d9669bbbbf8a747b33e1eb066c5ad0","declaration":"export function resolveInboundDirectDmAccessWithRuntime(params: { cfg: OpenClawConfig; channel: ChannelId; accountId: string; dmPolicy?: string | null; allowFrom?: Array | null; senderId: string; rawBody: string; isSenderAllowed: (senderId: string, allowFrom: string[]) => boolean; resolveAccessGroupMembership?: AccessGroupMembershipResolver; runtime: DirectDmCommandAuthorizationRuntime; modeWhenAccessGroupsOff?: \"allow\" | \"deny\" | \"configured\"; readStoreAllowFrom?: (provider: ChannelId, accountId: string) => Promise; }): Promise;","entrypoint":"command-auth","exportName":"resolveInboundDirectDmAccessWithRuntime","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} -{"closureHash":"485ffea9154be1df4e7c7dd7963f049abb566da42248a3b9333e2f274d76bcb7","declaration":"export function resolveModelsCommandReply(params: { cfg: OpenClawConfig; commandBodyNormalized: string; surface?: string; currentModel?: string; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): Promise;","entrypoint":"command-auth","exportName":"resolveModelsCommandReply","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} +{"closureHash":"ad26ef446e17f89032798d7dd837387db85370e4c4ddaf732335392ad40c403b","declaration":"export function resolveModelsCommandReply(params: { cfg: OpenClawConfig; commandBodyNormalized: string; surface?: string; currentModel?: string; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): Promise;","entrypoint":"command-auth","exportName":"resolveModelsCommandReply","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"7f3acef52bfe2f4e5802696e43d9143db70c850d8cea7888f2ef7a9a4614c75c","declaration":"export function resolveNativeCommandSessionTargets(params: ResolveNativeCommandSessionTargetsParams): { sessionKey: string; commandTargetSessionKey: string; };","entrypoint":"command-auth","exportName":"resolveNativeCommandSessionTargets","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"1229a23d667688285afc22034222ca88d3fa667048333e5d8df3de83ff15c1b1","declaration":"export function resolveSenderCommandAuthorization(params: ResolveSenderCommandAuthorizationParams): Promise<{ shouldComputeAuth: boolean; effectiveAllowFrom: string[]; effectiveGroupAllowFrom: string[]; senderAllowedForCommands: boolean; commandAuthorized: boolean | undefined; }>;","entrypoint":"command-auth","exportName":"resolveSenderCommandAuthorization","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"6de17129158089169f8931041db8954a4100488d82f5b8778918a45c69ea520d","declaration":"export function resolveSenderCommandAuthorizationWithRuntime(params: ResolveSenderCommandAuthorizationWithRuntimeParams): ReturnType;","entrypoint":"command-auth","exportName":"resolveSenderCommandAuthorizationWithRuntime","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"b4182d612f1a8e6f63d8c15d9c328175a601d8b49b58581080aa1c64a5036558","declaration":"export function resolveSkillCommandInvocation(params: { commandBodyNormalized: string; skillCommands: SkillCommandSpec[]; }): { command: SkillCommandSpec; args?: string; } | null;","entrypoint":"command-auth","exportName":"resolveSkillCommandInvocation","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} -{"closureHash":"a249515a79dfbc0d535ed892e6fbf5d79b9ff60b02e1292b3efaea87a3410fe8","declaration":"export function resolveStoredModelOverride(params: { loadSessionEntry?: (sessionKey: string) => SessionEntry | undefined; sessionEntry?: SessionEntry; sessionStore?: Record; sessionKey?: string; parentSessionKey?: string; defaultProvider: string; }): StoredModelOverride | null;","entrypoint":"command-auth","exportName":"resolveStoredModelOverride","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} +{"closureHash":"b71cc1831ced5fefc87703812e484749b7c73cf1972d10438ce50aa89c1f3f56","declaration":"export function resolveStoredModelOverride(params: { loadSessionEntry?: (sessionKey: string) => SessionEntry | undefined; sessionEntry?: SessionEntry; sessionStore?: Record; sessionKey?: string; parentSessionKey?: string; defaultProvider: string; }): StoredModelOverride | null;","entrypoint":"command-auth","exportName":"resolveStoredModelOverride","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"0bc4710120c8c7fdab189d39b22c0ffc9dd1c50c163a20680e0ab494c9a03148","declaration":"export function resolveTextCommand(raw: string, cfg?: OpenClawConfig): { command: ChatCommandDefinition; args?: string; } | null;","entrypoint":"command-auth","exportName":"resolveTextCommand","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"f460c6ed65b583dc17c2b83856f533bb0910e25a841897bf4a46c5ed20cf8341","declaration":"export function serializeCommandArgs(command: ChatCommandDefinition, args?: CommandArgs): string | undefined;","entrypoint":"command-auth","exportName":"serializeCommandArgs","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} {"closureHash":"53b352998371b1b59514bffb951ac06793179d43268825740caa7051b37826de","declaration":"export function shouldComputeCommandAuthorized(text?: string, cfg?: OpenClawConfig, options?: CommandNormalizeOptions): boolean;","entrypoint":"command-auth","exportName":"shouldComputeCommandAuthorized","importSpecifier":"openclaw/plugin-sdk/command-auth","kind":"function","recordType":"export"} @@ -1621,7 +1621,7 @@ {"closureHash":"9b1fc164bf48cba95d55f17ff614aaca4f435db5024935b2e75f9f3f10f23d02","declaration":"export function listNativeCommandSpecs(params?: { skillCommands?: SkillCommandSpec[]; provider?: string; }): NativeCommandSpec[];","entrypoint":"command-auth-native","exportName":"listNativeCommandSpecs","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"b5c9d51c577df8f0893bfed0b57669a957f138ba355a4a0969c245048199e7a4","declaration":"export function listNativeCommandSpecsForConfig(cfg: OpenClawConfig, params?: { skillCommands?: SkillCommandSpec[]; provider?: string; }): NativeCommandSpec[];","entrypoint":"command-auth-native","exportName":"listNativeCommandSpecsForConfig","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"40049804ccc8e67ec940e1c4b22f706940f976045f5c197a625841d8caf73a58","declaration":"export function listProviderPluginCommandSpecs(provider?: string): Array<{ name: string; description: string; descriptionLocalizations?: Record; acceptsArgs: boolean; }>;","entrypoint":"command-auth-native","exportName":"listProviderPluginCommandSpecs","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} -{"closureHash":"7acf1b16b45c4b6b2775af59000108fec01a1ce9bb11c79858775a9250d86b89","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth-native","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} +{"closureHash":"f25d0adb9cc96e5d35ffe80451405f856d31fe2afb813a0d9891194dc890682c","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"command-auth-native","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"8013378c2d772906b2b5201af9e79a99127d8652371efa72367073d07b1f9cba","declaration":"export function maybeResolveTextAlias(raw: string, cfg?: OpenClawConfig): string | null;","entrypoint":"command-auth-native","exportName":"maybeResolveTextAlias","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"aa94c4505992204c51920783ce36b6beaba4eab93082ec85f796f1cfe1814ae9","declaration":"export function normalizeCommandBody(raw: string, options?: CommandNormalizeOptions): string;","entrypoint":"command-auth-native","exportName":"normalizeCommandBody","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"20d62127e9adb7711cb4d0bb59ca614d14aaa462e293caae67d33299e0c4c3fb","declaration":"export function parseCommandArgs(command: ChatCommandDefinition, raw?: string): CommandArgs | undefined;","entrypoint":"command-auth-native","exportName":"parseCommandArgs","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} @@ -1630,10 +1630,10 @@ {"closureHash":"b425c8e41c123425191545ae43451c67ad36ffc4db9e555bd22c03cf021ff8f5","declaration":"export function resolveCommandAuthorization(params: { ctx: MsgContext; cfg: OpenClawConfig; commandAuthorized: boolean; }): CommandAuthorization;","entrypoint":"command-auth-native","exportName":"resolveCommandAuthorization","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"d625f5db241bea5e8ba9d8f18d730f46cbfeec81219d19d738922e55524b1a43","declaration":"export function resolveCommandAuthorizedFromAuthorizers(params: { useAccessGroups: boolean; authorizers: CommandAuthorizer[]; modeWhenAccessGroupsOff?: CommandGatingModeWhenAccessGroupsOff; }): boolean;","entrypoint":"command-auth-native","exportName":"resolveCommandAuthorizedFromAuthorizers","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"9ae87c86a39b968b131d2056cc0ba53198ed1fca8be98394ddca9570ebe4add8","declaration":"export function resolveControlCommandGate(params: { useAccessGroups: boolean; authorizers: CommandAuthorizer[]; allowTextCommands: boolean; hasControlCommand: boolean; modeWhenAccessGroupsOff?: CommandGatingModeWhenAccessGroupsOff; }): { commandAuthorized: boolean; shouldBlock: boolean; };","entrypoint":"command-auth-native","exportName":"resolveControlCommandGate","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} -{"closureHash":"6b63c05556fe571da2babf741f1507b75217229203255ca971fe51a9cbb9d229","declaration":"export function resolveEffectiveAgentRuntime(params: { cfg: OpenClawConfig; provider: string; modelId: string; agentId?: string; sessionKey?: string; sessionEntry?: Pick; }): string;","entrypoint":"command-auth-native","exportName":"resolveEffectiveAgentRuntime","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} -{"closureHash":"8ceaae939e7465aafb52d5df9a2890bcb70c17c5f3f1077cc8f70631d4443602","declaration":"export function resolveFastModeState(params: { cfg: OpenClawConfig | undefined; provider: string; model: string; agentId?: string; sessionEntry?: Pick | undefined; }): FastModeState;","entrypoint":"command-auth-native","exportName":"resolveFastModeState","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} +{"closureHash":"6a814087d7d1f87d1b3ddfac6cc213a92aae004e0e7d75933f7f0c300239ffcb","declaration":"export function resolveEffectiveAgentRuntime(params: { cfg: OpenClawConfig; provider: string; modelId: string; agentId?: string; sessionKey?: string; sessionEntry?: Pick; }): string;","entrypoint":"command-auth-native","exportName":"resolveEffectiveAgentRuntime","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} +{"closureHash":"2025fbfe692f15431fc8d4a466f8d8ec4970f0b180cd53c464f5e1bb46e9e381","declaration":"export function resolveFastModeState(params: { cfg: OpenClawConfig | undefined; provider: string; model: string; agentId?: string; sessionEntry?: Pick | undefined; }): FastModeState;","entrypoint":"command-auth-native","exportName":"resolveFastModeState","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"7f3acef52bfe2f4e5802696e43d9143db70c850d8cea7888f2ef7a9a4614c75c","declaration":"export function resolveNativeCommandSessionTargets(params: ResolveNativeCommandSessionTargetsParams): { sessionKey: string; commandTargetSessionKey: string; };","entrypoint":"command-auth-native","exportName":"resolveNativeCommandSessionTargets","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} -{"closureHash":"a249515a79dfbc0d535ed892e6fbf5d79b9ff60b02e1292b3efaea87a3410fe8","declaration":"export function resolveStoredModelOverride(params: { loadSessionEntry?: (sessionKey: string) => SessionEntry | undefined; sessionEntry?: SessionEntry; sessionStore?: Record; sessionKey?: string; parentSessionKey?: string; defaultProvider: string; }): StoredModelOverride | null;","entrypoint":"command-auth-native","exportName":"resolveStoredModelOverride","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} +{"closureHash":"b71cc1831ced5fefc87703812e484749b7c73cf1972d10438ce50aa89c1f3f56","declaration":"export function resolveStoredModelOverride(params: { loadSessionEntry?: (sessionKey: string) => SessionEntry | undefined; sessionEntry?: SessionEntry; sessionStore?: Record; sessionKey?: string; parentSessionKey?: string; defaultProvider: string; }): StoredModelOverride | null;","entrypoint":"command-auth-native","exportName":"resolveStoredModelOverride","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"f460c6ed65b583dc17c2b83856f533bb0910e25a841897bf4a46c5ed20cf8341","declaration":"export function serializeCommandArgs(command: ChatCommandDefinition, args?: CommandArgs): string | undefined;","entrypoint":"command-auth-native","exportName":"serializeCommandArgs","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"53b352998371b1b59514bffb951ac06793179d43268825740caa7051b37826de","declaration":"export function shouldComputeCommandAuthorized(text?: string, cfg?: OpenClawConfig, options?: CommandNormalizeOptions): boolean;","entrypoint":"command-auth-native","exportName":"shouldComputeCommandAuthorized","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"function","recordType":"export"} {"closureHash":"80420cc959afbdb66fa3acd90bdf71e7a512feecec11b9ab68411ed351cd5a07","declaration":"export type ChatCommandDefinition = ChatCommandDefinition;","entrypoint":"command-auth-native","exportName":"ChatCommandDefinition","importSpecifier":"openclaw/plugin-sdk/command-auth-native","kind":"type","recordType":"export"} @@ -1720,7 +1720,7 @@ {"closureHash":"5de548c1897871e89cf3cd211ecca69c4b1137834670b237eef8694fa142dcfc","declaration":"export function updateConfig(mutator: (cfg: OpenClawConfig, context: UpdateConfigContext) => OpenClawConfig): Promise;","entrypoint":"config-mutation","exportName":"updateConfig","importSpecifier":"openclaw/plugin-sdk/config-mutation","kind":"function","recordType":"export"} {"closureHash":"9a1a880ffb5d6dcee6bce4faf80234855ca3bff11a0941e2ac7447a8e6879f90","declaration":"export type ConfigWriteAfterWrite = ConfigWriteAfterWrite;","entrypoint":"config-mutation","exportName":"ConfigWriteAfterWrite","importSpecifier":"openclaw/plugin-sdk/config-mutation","kind":"type","recordType":"export"} {"category":null,"entrypoint":"config-runtime","importSpecifier":"openclaw/plugin-sdk/config-runtime","recordType":"module"} -{"closureHash":"b75bdf1d3b0b17c4066e5f441a85504df8d2af2d7f93db3fcbe45ffacc3a4378","declaration":"export function applyModelOverrideToSessionEntry(params: { entry: SessionEntry; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; preserveAuthProfileOverride?: boolean; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; }): { updated: boolean; };","entrypoint":"config-runtime","exportName":"applyModelOverrideToSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"5ab32281213bb9eb1f573bcc0ae7f6a87a4caa552a6a5d9acd35df5daf2af8f9","declaration":"export function applyModelOverrideToSessionEntry(params: { entry: SessionEntry; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; preserveAuthProfileOverride?: boolean; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; }): { updated: boolean; };","entrypoint":"config-runtime","exportName":"applyModelOverrideToSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"3aa124483f95e247627c87fdda6e183c94b8c8ddc99845f1b21114641cbb6ced","declaration":"export function canonicalizeMainSessionAlias(params: { cfg?: { session?: { scope?: SessionScope; mainKey?: string; }; }; agentId: string; sessionKey: string; }): string;","entrypoint":"config-runtime","exportName":"canonicalizeMainSessionAlias","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"c68b5adbc63e46a74c882bb9f4b980309ec66dac3f8de3ed85500d36c1d7c050","declaration":"export function clearConfigCache(): void;","entrypoint":"config-runtime","exportName":"clearConfigCache","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"a7b2fa8d82db15648b1d5bdb6b69a54cd7186c466cc201576f7d23b58c4c62c9","declaration":"export function clearRuntimeConfigSnapshot(): void;","entrypoint":"config-runtime","exportName":"clearRuntimeConfigSnapshot","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} @@ -1732,18 +1732,18 @@ {"closureHash":"f0a90f85133b965fbd027ddc2fc3fcd16eae0081db23f4bd5d6f2b87e5338b49","declaration":"export function getRuntimeConfig(options?: { skipPluginValidation?: boolean; pin?: boolean; skipShellEnvFallback?: boolean; }): OpenClawConfig;","entrypoint":"config-runtime","exportName":"getRuntimeConfig","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"e5acee613906d146a315c273916c417814702aab67e932795f6f2677cb8d18eb","declaration":"export function getRuntimeConfigSnapshot(): OpenClawConfig | null;","entrypoint":"config-runtime","exportName":"getRuntimeConfigSnapshot","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"8ed19962bb6d51747d3961c705ad141bb6674d276b047475612895dc5586c0a5","declaration":"export function getRuntimeConfigSourceSnapshot(): OpenClawConfig | null;","entrypoint":"config-runtime","exportName":"getRuntimeConfigSourceSnapshot","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"1a39c6fba87a24a650f04192804744ca0769bebcd0607e0119d26c6bbd8c4de1","declaration":"export function getSessionEntry(params: SessionStoreReadParams): SessionEntry | undefined;","entrypoint":"config-runtime","exportName":"getSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"b1403aec3c479ae19ad863a0ebe2574047267c8669ea8f22174feb9a1f64fa19","declaration":"export function getSessionEntry(params: SessionStoreReadParams): SessionEntry | undefined;","entrypoint":"config-runtime","exportName":"getSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"d2b9783779ea5bad00a7e84723465709319fd61666e9f1c082d0cb1f0fa00102","declaration":"export function isDangerousNameMatchingEnabled(config: DangerousNameMatchingConfig | null | undefined): boolean;","entrypoint":"config-runtime","exportName":"isDangerousNameMatchingEnabled","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"bb4506ebcfe344230c066c5a69887e425be7a1de6cb3f9a7bac786d18719f54a","declaration":"export function isNativeCommandsExplicitlyDisabled(params: { providerSetting?: NativeCommandsSetting; globalSetting?: NativeCommandsSetting; }): boolean;","entrypoint":"config-runtime","exportName":"isNativeCommandsExplicitlyDisabled","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"77dba039f8ece6208f946291065db6be676301f2ce0a60b0e6a103dffabb1ca5","declaration":"export function listSessionEntries(params?: SessionStoreListParams & { readOnly?: boolean; }): SessionStoreEntrySummary[];","entrypoint":"config-runtime","exportName":"listSessionEntries","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"87d6b05e543dd88c8805be24c767b8cdb56821d4be59b68f64373fe4ceff88f3","declaration":"export function listSessionEntries(params?: SessionStoreListParams & { readOnly?: boolean; }): SessionStoreEntrySummary[];","entrypoint":"config-runtime","exportName":"listSessionEntries","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"234cc5010a66ce3a6736d57f6397ceb3ccaac4af784e303b219b3f0b4778ad6b","declaration":"export function loadConfig(options?: { skipPluginValidation?: boolean; pin?: boolean; skipShellEnvFallback?: boolean; }): OpenClawConfig;","entrypoint":"config-runtime","exportName":"loadConfig","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"39aad68ed68a0ad43c9aec2075f2ce1e5c6d82ee0491b7102677b82f55aa3994","declaration":"export function loadCronStore(storePath: string): Promise;","entrypoint":"config-runtime","exportName":"loadCronStore","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"8b44c8cb93edf90cf91374c55126163b72272f8d173d9467e26694931b414c26","declaration":"export function logConfigUpdated(runtime: RuntimeEnv, opts?: LogConfigUpdatedOptions): void;","entrypoint":"config-runtime","exportName":"logConfigUpdated","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"cd952af33a706cbf6fce8d31bf562e1d932cebb3cd0604fbcca875dc670c00b5","declaration":"export function mutateConfigFile(params: { base?: ConfigMutationBase; baseHash?: string; afterWrite?: ConfigWriteOptions[\"afterWrite\"]; writeOptions?: ConfigWriteOptions; io?: ConfigMutationIO; mutate: (draft: OpenClawConfig, context: ConfigMutationContext) => Promise | T | void; }): Promise>;","entrypoint":"config-runtime","exportName":"mutateConfigFile","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"db1ae24bf480eda3c9ac0a4386611163390d36910587a85b5823bf32624ac17d","declaration":"export function patchSessionEntry(params: PatchSessionEntryParams): Promise;","entrypoint":"config-runtime","exportName":"patchSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"c09496bb38a44ba5cdd168ffdbd1ac2e1ce0554636b6120e60b2fb46302e8eb9","declaration":"export function patchSessionEntry(params: PatchSessionEntryParams): Promise;","entrypoint":"config-runtime","exportName":"patchSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"f599149d7b2484f63e1363085cf4f20e669b50e1e95ff1287f3f29df2de8f05c","declaration":"export function readConfigFileSnapshotForWrite(options?: { skipPluginValidation?: boolean; }): Promise;","entrypoint":"config-runtime","exportName":"readConfigFileSnapshotForWrite","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"e539adb8aaa544d4874dca14a0d0e49b3e4a671a2b14bac0519814c5d6c4489d","declaration":"export function readSessionUpdatedAt(params: SessionStoreReadParams): number | undefined;","entrypoint":"config-runtime","exportName":"readSessionUpdatedAt","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"8860cc7cca487ef645afd28fe6586c9f37ac2993812bf43650e3c46bbc333cd7","declaration":"export function recordSessionMetaFromInbound(params: RecordInboundSessionMetaParams): Promise;","entrypoint":"config-runtime","exportName":"recordSessionMetaFromInbound","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"622d883ad0d76e9deeeef3d5dcdeb308978817ba06e4bf5bc7d14c94e842879f","declaration":"export function recordSessionMetaFromInbound(params: RecordInboundSessionMetaParams): Promise;","entrypoint":"config-runtime","exportName":"recordSessionMetaFromInbound","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"fe56c9dcf70501829941b57c0db7bff69e07032a977dad9e0a5c836b6e61b9fa","declaration":"export function replaceConfigFile(params: { nextConfig: OpenClawConfig; baseHash?: string; snapshot?: ConfigFileSnapshot; afterWrite?: ConfigWriteOptions[\"afterWrite\"]; writeOptions?: ConfigWriteOptions; io?: ConfigMutationIO; }): Promise;","entrypoint":"config-runtime","exportName":"replaceConfigFile","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"605ebf4cd3d4d4028a5355b3b3520b99543cf4572b64afcf346b228c1f5cfab3","declaration":"export function requireRuntimeConfig(config: OpenClawConfig, context: string): OpenClawConfig;","entrypoint":"config-runtime","exportName":"requireRuntimeConfig","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"a4a07423aa8f00011e9662691b71bfea469626b14879c6098bce5ef70ea97a5a","declaration":"export function resolveActiveTalkProviderConfig(talk: TalkConfig | undefined): ResolvedTalkConfig | undefined;","entrypoint":"config-runtime","exportName":"resolveActiveTalkProviderConfig","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} @@ -1778,9 +1778,9 @@ {"closureHash":"1fbde8a88213a6806cb3d2fe0447f3c8a674a0c5e6315de5dc4230177573d639","declaration":"export function saveCronStore(storePath: string, store: CronStoreFile, opts?: SaveCronStoreOptions): Promise;","entrypoint":"config-runtime","exportName":"saveCronStore","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"21c997f58863c4eb65c8e9e7e85aa74c9ebd7caaae5508a48ee3dcf62043afc9","declaration":"export function setRuntimeConfigSnapshot(config: OpenClawConfig, sourceConfig?: OpenClawConfig): void;","entrypoint":"config-runtime","exportName":"setRuntimeConfigSnapshot","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"5de548c1897871e89cf3cd211ecca69c4b1137834670b237eef8694fa142dcfc","declaration":"export function updateConfig(mutator: (cfg: OpenClawConfig, context: UpdateConfigContext) => OpenClawConfig): Promise;","entrypoint":"config-runtime","exportName":"updateConfig","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"30ae6b59a2684ae6bed7b53bb526130eda6e55b67470402355fb1eda45739f27","declaration":"export function updateLastRoute(params: UpdateSessionLastRouteParams): Promise;","entrypoint":"config-runtime","exportName":"updateLastRoute","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"0c1f07ca5c09c965e5ba5ff95f564cbcb8c6b7c3e1c54e7406f7357e41de01d1","declaration":"export function updateSessionStoreEntry(params: UpdateSessionStoreEntryParams): Promise;","entrypoint":"config-runtime","exportName":"updateSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} -{"closureHash":"6e3aa7c888be8a44773fe1a46d52e641544573b4d873ef6d509cb0983f535fba","declaration":"export function upsertSessionEntry(params: UpsertSessionEntryParams): Promise;","entrypoint":"config-runtime","exportName":"upsertSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"0bcf1309b491640342630d6426478f57fd97d9bf94bdffed7b5ffabc35e58a4a","declaration":"export function updateLastRoute(params: UpdateSessionLastRouteParams): Promise;","entrypoint":"config-runtime","exportName":"updateLastRoute","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"82051d86723a74a0d1f0a29747d0eaf99bcbe7886780415438712ed304acd106","declaration":"export function updateSessionStoreEntry(params: UpdateSessionStoreEntryParams): Promise;","entrypoint":"config-runtime","exportName":"updateSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} +{"closureHash":"db75996be6cc627fe941e8d22e8cd8cf459e4137bf786b5254aff7bc7c62d4ec","declaration":"export function upsertSessionEntry(params: UpsertSessionEntryParams): Promise;","entrypoint":"config-runtime","exportName":"upsertSessionEntry","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"ebd5c05c8e63bae51150f3b831f4c01792625cd3ca49096fa830ca6442f07287","declaration":"export function warnMissingProviderGroupPolicyFallbackOnce(params: { providerMissingFallbackApplied: boolean; providerKey: string; accountId?: string; blockedLabel?: string; log: (message: string) => void; }): boolean;","entrypoint":"config-runtime","exportName":"warnMissingProviderGroupPolicyFallbackOnce","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"68d04c8763c7bb1dd3d5ea315d92705566cfa213b3846cfc6b2b0767dc3ca622","declaration":"export function writeConfigFile(cfg: OpenClawConfig, options?: ConfigWriteOptions): Promise;","entrypoint":"config-runtime","exportName":"writeConfigFile","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"function","recordType":"export"} {"closureHash":"47c7a11095835696862fe7b72fccf28736af6308347543c26b5b2f538d76860b","declaration":"export const GROUP_POLICY_BLOCKED_LABEL: { readonly group: \"group messages\"; readonly guild: \"guild messages\"; readonly room: \"room messages\"; readonly channel: \"channel messages\"; readonly space: \"space messages\";};","entrypoint":"config-runtime","exportName":"GROUP_POLICY_BLOCKED_LABEL","importSpecifier":"openclaw/plugin-sdk/config-runtime","kind":"const","recordType":"export"} @@ -1893,12 +1893,12 @@ {"closureHash":"544219cddcce81cf5c8239f6ea9908fbeb809dba370b34e4928be95ee639057c","declaration":"export function channelTargetsSchema(options?: { description?: string; }): Type.TArray;","entrypoint":"core","exportName":"channelTargetsSchema","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"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":"core","exportName":"clearAccountEntryFields","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} {"closureHash":"0438c0afd280cc2df90e7ffe221ce3133e6f742e9dc725ff34bbdeb90eeab2c8","declaration":"export function createActionGate>(actions: T | undefined): ActionGate;","entrypoint":"core","exportName":"createActionGate","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} -{"closureHash":"7cb685f546170296fb2b626076b3790f5132973b95c540786ba4d3f4636391ae","declaration":"export function createChannelPluginBase(params: CreateChannelPluginBaseOptions): CreatedChannelPluginBase;","entrypoint":"core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/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":"core","exportName":"createChatChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} +{"closureHash":"6b5a8c0109e995afef4937ed79eb02a34971b459ab407e0d407e9e352662fc6a","declaration":"export function createChannelPluginBase(params: CreateChannelPluginBaseOptions): CreatedChannelPluginBase;","entrypoint":"core","exportName":"createChannelPluginBase","importSpecifier":"openclaw/plugin-sdk/core","kind":"function","recordType":"export"} +{"closureHash":"9e93bcdfc6299e65ef2a3d267047a9e8c856f0b2f8e9b79d570fb2a4cd238c74","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":"8f524c7449eac2abe9ad13db2dfe98a31b24dcfe8c861d147bb48b684759e4f8","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":"7aeb838b8cca4b269332d981138c48fac04f71db26beb4552131a8981bded02b","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":"ad9a5a09235e9a426da9b310cd466830ad103dda2e5ce4891ef4131fdf50deda","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":"fd766c74118002291fa28dcd19a9677cdf9f615fe09994862f95b989dd36479a","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":"ba0ca4adfbc76bcafbbe9487387636983a2c78cf10d056c44c6a9fd9d5191914","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"core","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"d759a25775cb15d3f1804e39e98518f83b67b29ba3ab2fd84d4bf16106d9fdb9","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"} @@ -1960,10 +1960,10 @@ {"closureHash":"0a4bc843eaab5feec0a0085b0bc501a0e0b3f4b87b0e05b40c5ea1ce874fad02","declaration":"export type ChannelMessageActionName = \"search\" | \"broadcast\" | \"read\" | \"edit\" | \"delete\" | \"timeout\" | \"send\" | \"poll\" | \"poll-vote\" | \"react\" | \"reactions\" | \"unsend\" | \"reply\" | \"sendWithEffect\" | \"renameGroup\" | \"setGroupIcon\" | \"addParticipant\" | \"removeParticipant\" | \"leaveGroup\" | \"sendAttachment\" | \"pin\" | \"unpin\" | \"list-pins\" | \"permissions\" | \"thread-create\" | \"thread-list\" | \"thread-reply\" | \"sticker\" | \"sticker-search\" | \"member-info\" | \"role-info\" | \"emoji-list\" | \"emoji-upload\" | \"sticker-upload\" | \"role-add\" | \"role-remove\" | \"channel-info\" | \"channel-list\" | \"channel-create\" | \"channel-edit\" | \"channel-delete\" | \"channel-move\" | \"category-create\" | \"category-edit\" | \"category-delete\" | \"topic-create\" | \"topic-edit\" | \"voice-status\" | \"event-list\" | \"event-create\" | \"kick\" | \"ban\" | \"set-profile\" | \"set-presence\" | \"download-file\" | \"upload-file\";","entrypoint":"core","exportName":"ChannelMessageActionName","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"0f386a9d02c91d7ede3a7f74896b4848de11caed107e9f2e4d7eb915248c4383","declaration":"export type ChannelMessagingAdapter = ChannelMessagingAdapter;","entrypoint":"core","exportName":"ChannelMessagingAdapter","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"2d11b6a98b1db3ecc77f52e02f2c09f8e9c155412c2e2669f29350d00428154b","declaration":"export type ChannelMeta = ChannelMeta;","entrypoint":"core","exportName":"ChannelMeta","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"ec916ca974bd0242329b6532fb8467a63d038f1182ae9b2af3aa3b979b5fa589","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"core","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"9002ead9bb685657b14a74835c7de0952a9122dcf77c02405e3f0d79cc5d4821","declaration":"export type ChannelOutboundAdapter = ChannelOutboundAdapter;","entrypoint":"core","exportName":"ChannelOutboundAdapter","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"7b39a17fc562efc5af466006bcdedc6182567effce66c775b565317fb59b0295","declaration":"export type ChannelOutboundSessionRoute = ChannelOutboundSessionRoute;","entrypoint":"core","exportName":"ChannelOutboundSessionRoute","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"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":"core","exportName":"ChannelOutboundSessionRouteParams","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"37b373e93fe7f86fdbce119947c9e49b17e71ce50fe47e118c4d078c5cea20ec","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"core","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"d02e5c7a995847180696d2a05d8ea092b364ef32b36753e4091fc97ffdaf44ab","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"core","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"c7f4189c00fda265d2124e4603f9a2936229c7bf5dcc246e5d6f831179d18182","declaration":"export type ChannelSetupInput = ChannelSetupInput;","entrypoint":"core","exportName":"ChannelSetupInput","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"5fd0fa51b352b25b111be12e2fbc79648bb5e9cf5f55cbe7131c8c60e54787b2","declaration":"export type ChatType = ChatType;","entrypoint":"core","exportName":"ChatType","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"e4880dcde69275f17e135c15682e5195e4817e0b0ed06763703145086fc2e721","declaration":"export type ContextEngineSessionTarget = ContextEngineSessionTarget;","entrypoint":"core","exportName":"ContextEngineSessionTarget","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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","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":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"core","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"647007b989ba3d08c520ec68873f65f22f231b0274daf10f5d219074fd2fcba6","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":"6f784a7e4e308207c5cb6c31f8cef940c2d37117f1e0517151275790e3183a0a","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"core","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"ccae64ce42b52f34fc0f2adffe6202985c2c8464e3e2df19f43ae1eb0005e808","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"} @@ -1995,12 +1995,12 @@ {"closureHash":"028cd39dd470117f37aff9d199e99c7eadaa99a2af56810c3033e488587e56e2","declaration":"export type PluginAgentEventSubscriptionRegistration = PluginAgentEventSubscriptionRegistration;","entrypoint":"core","exportName":"PluginAgentEventSubscriptionRegistration","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"3d9f3c666f1a8f37cd4fd2bf621d793b6626ce36edc96bd3922498a8f4ebfc19","declaration":"export type PluginAgentTurnPrepareEvent = PluginAgentTurnPrepareEvent;","entrypoint":"core","exportName":"PluginAgentTurnPrepareEvent","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"dd9b818f8b19ced207493eea1b75da8a38b24a5dc4c9ac46288f9329ba06f0f3","declaration":"export type PluginAgentTurnPrepareResult = PluginAgentTurnPrepareResult;","entrypoint":"core","exportName":"PluginAgentTurnPrepareResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"86553d1dbbbe0b04d6a233ab33dee847c2cf5f9809032d41c5bff6bec06b78da","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"d9d24565b06f891a687f49672129beac9d38ccb817526ed1a6579efcb5825eb0","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"core","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"a50f802cdb46fb073ccba3d7b5c2a3c66c2b5aeccca3368222f9a520e66055ca","declaration":"export type PluginCommandResult = PluginCommandResult;","entrypoint":"core","exportName":"PluginCommandResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"b9a7fd2bdde1d99b58227e6ff01853420fee36357c2fa5e2d9ef5fbcef11ac65","declaration":"export type PluginControlUiDescriptor = PluginControlUiDescriptor;","entrypoint":"core","exportName":"PluginControlUiDescriptor","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"83237187559904a1350b07bfcaa20eb473e397884361e9543ccdaeddd6c2c12e","declaration":"export type PluginHeartbeatPromptContributionEvent = PluginHeartbeatPromptContributionEvent;","entrypoint":"core","exportName":"PluginHeartbeatPromptContributionEvent","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"34a5e1c2e9aa7908826a1b066f7b8556c277a1c8360d7f08ddb3f360f65752b5","declaration":"export type PluginHeartbeatPromptContributionResult = PluginHeartbeatPromptContributionResult;","entrypoint":"core","exportName":"PluginHeartbeatPromptContributionResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"919371e99b1060f63e326213daf09ccdb13783c6f338572061604fd00830630b","declaration":"export type PluginHookReplyDispatchContext = PluginHookReplyDispatchContext;","entrypoint":"core","exportName":"PluginHookReplyDispatchContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"85bc9758bf9a3edc60e2cea82c1d7198a19792d6aa4e7fb58fe9d99b93a8ea2e","declaration":"export type PluginHookReplyDispatchContext = PluginHookReplyDispatchContext;","entrypoint":"core","exportName":"PluginHookReplyDispatchContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"2f25d0e730ddaa24928b0499123759eefbcbe2762acb2732fd8524c1132adc47","declaration":"export type PluginHookReplyDispatchEvent = PluginHookReplyDispatchEvent;","entrypoint":"core","exportName":"PluginHookReplyDispatchEvent","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"95e984db261a1253a06a4a4ca1b7c46aec0c5db0f0f02342c28c6234a316d0cf","declaration":"export type PluginHookReplyDispatchResult = PluginHookReplyDispatchResult;","entrypoint":"core","exportName":"PluginHookReplyDispatchResult","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"f2ecb76f6e2927301caf2d2033095172a2dbb2ec490d9c84d04f34d1fbe9214e","declaration":"export type PluginHookReplyPayload = PluginHookReplyPayload;","entrypoint":"core","exportName":"PluginHookReplyPayload","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} @@ -2014,7 +2014,7 @@ {"closureHash":"f361587d79916f3d1cb73b4d296e1f37f86d799a641ce4a590ee784413d0b7ef","declaration":"export type PluginNextTurnInjectionRecord = PluginNextTurnInjectionRecord;","entrypoint":"core","exportName":"PluginNextTurnInjectionRecord","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"e4f6093e70826c8c7c02433082b9ac1b91755640096339111331fc45a494ca88","declaration":"export type PluginRunContextGetParams = PluginRunContextGetParams;","entrypoint":"core","exportName":"PluginRunContextGetParams","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"f9d14d70abca2a8771c0763736871361e4c223a8e4cbe3ae5c7a17751630b68e","declaration":"export type PluginRunContextPatch = PluginRunContextPatch;","entrypoint":"core","exportName":"PluginRunContextPatch","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} -{"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"core","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"core","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"4a005fd56ceaa1de7ff2c6b45f08a48f48d7ff30e21d0e88d783d86a49e274f4","declaration":"export type PluginRuntimeLifecycleRegistration = PluginRuntimeLifecycleRegistration;","entrypoint":"core","exportName":"PluginRuntimeLifecycleRegistration","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"c599fdbfd9439bdcbbbf621dca995d2d6f87c7aba9606dc1970e1205dfea6357","declaration":"export type PluginSessionActionContext = PluginSessionActionContext;","entrypoint":"core","exportName":"PluginSessionActionContext","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} {"closureHash":"85a706fb9b56d5c5f41756729736cd4581b98d5cb0ab9a693b8261e4d936e499","declaration":"export type PluginSessionActionRegistration = PluginSessionActionRegistration;","entrypoint":"core","exportName":"PluginSessionActionRegistration","importSpecifier":"openclaw/plugin-sdk/core","kind":"type","recordType":"export"} @@ -2201,13 +2201,13 @@ {"closureHash":"4d4a0ece3ccb6d5020047cb2478574e012716748c8849e78b740dfd3bdc588f4","declaration":"export function unbindThreadBindingsBySessionKey(params: { targetSessionKey: string; accountId?: string; targetKind?: ThreadBindingTargetKind; reason?: string; sendFarewell?: boolean; farewellText?: string; }): ThreadBindingRecord[];","entrypoint":"discord","exportName":"unbindThreadBindingsBySessionKey","importSpecifier":"openclaw/plugin-sdk/discord","kind":"function","recordType":"export"} {"closureHash":"b40933a11984425d14a7a479bda0d2cd14cbfa9371164774f39bebbf12861df7","declaration":"export const DEFAULT_ACCOUNT_ID: \"default\";","entrypoint":"discord","exportName":"DEFAULT_ACCOUNT_ID","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} {"closureHash":"cd6b0d3f962c8cb40d405e92bb06bb8e9285b386200897f550d21036022262c1","declaration":"export const PAIRING_APPROVED_MESSAGE: \"✅ OpenClaw access approved. Send a message to start chatting.\";","entrypoint":"discord","exportName":"PAIRING_APPROVED_MESSAGE","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} -{"closureHash":"2cdfa7fb511940a44cc91dae75ad5e1638a813f9bc2f61106fb7a78e9640d403","declaration":"export const buildDiscordComponentMessage: BuildDiscordComponentMessage;","entrypoint":"discord","exportName":"buildDiscordComponentMessage","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} +{"closureHash":"44be9de374d30dbc914a69593a7b60de3d40a8bc1c97ee5cdafb1d137ccb67ce","declaration":"export const buildDiscordComponentMessage: BuildDiscordComponentMessage;","entrypoint":"discord","exportName":"buildDiscordComponentMessage","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} {"closureHash":"7ca7125928ab0b6f04d47bfba94b9a50e3dfcc56717a413d24e4794ef91a091e","declaration":"export const discordOnboardingAdapter: {};","entrypoint":"discord","exportName":"discordOnboardingAdapter","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} {"closureHash":"d619ec239abd45d5be76c3c58acc82f7a25f8f66352d2afc6453e13c4c7a82e7","declaration":"export const editDiscordComponentMessage: EditDiscordComponentMessage;","entrypoint":"discord","exportName":"editDiscordComponentMessage","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} {"closureHash":"d619ec239abd45d5be76c3c58acc82f7a25f8f66352d2afc6453e13c4c7a82e7","declaration":"export const registerBuiltDiscordComponentMessage: RegisterBuiltDiscordComponentMessage;","entrypoint":"discord","exportName":"registerBuiltDiscordComponentMessage","importSpecifier":"openclaw/plugin-sdk/discord","kind":"const","recordType":"export"} {"closureHash":"75b9b07bac5eabd3e05c7d3e33b28c53db35410e6ba9b2f8bb5406a3849e2c11","declaration":"export type ChannelMessageActionAdapter = ChannelMessageActionAdapter;","entrypoint":"discord","exportName":"ChannelMessageActionAdapter","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"0a4bc843eaab5feec0a0085b0bc501a0e0b3f4b87b0e05b40c5ea1ce874fad02","declaration":"export type ChannelMessageActionName = \"search\" | \"broadcast\" | \"read\" | \"edit\" | \"delete\" | \"timeout\" | \"send\" | \"poll\" | \"poll-vote\" | \"react\" | \"reactions\" | \"unsend\" | \"reply\" | \"sendWithEffect\" | \"renameGroup\" | \"setGroupIcon\" | \"addParticipant\" | \"removeParticipant\" | \"leaveGroup\" | \"sendAttachment\" | \"pin\" | \"unpin\" | \"list-pins\" | \"permissions\" | \"thread-create\" | \"thread-list\" | \"thread-reply\" | \"sticker\" | \"sticker-search\" | \"member-info\" | \"role-info\" | \"emoji-list\" | \"emoji-upload\" | \"sticker-upload\" | \"role-add\" | \"role-remove\" | \"channel-info\" | \"channel-list\" | \"channel-create\" | \"channel-edit\" | \"channel-delete\" | \"channel-move\" | \"category-create\" | \"category-edit\" | \"category-delete\" | \"topic-create\" | \"topic-edit\" | \"voice-status\" | \"event-list\" | \"event-create\" | \"kick\" | \"ban\" | \"set-profile\" | \"set-presence\" | \"download-file\" | \"upload-file\";","entrypoint":"discord","exportName":"ChannelMessageActionName","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} -{"closureHash":"37b373e93fe7f86fdbce119947c9e49b17e71ce50fe47e118c4d078c5cea20ec","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"discord","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} +{"closureHash":"d02e5c7a995847180696d2a05d8ea092b364ef32b36753e4091fc97ffdaf44ab","declaration":"export type ChannelPlugin = ChannelPlugin;","entrypoint":"discord","exportName":"ChannelPlugin","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"68c829c145de778dc26f5f89ba81aa0087171cf6b8f2bb79530247c14af4ba0e","declaration":"export type DiscordAccountConfig = { accounts?: Record; defaultAccount?: string;} & Omit, \"groupAllowFrom\"> & ChannelBotInteractionConfig & { reactionNotifications?: undefined; reactionLevel?: undefined; ackReaction?: string | undefined;} & Record & { commands?: ProviderCommandsConfig; token?: SecretInput; applicationId?: string; activities?: { clientSecret?: string; applicationId?: string; }; proxy?: string; mentionAliases?: DiscordMentionAliasesConfig; suppressEmbeds?: boolean; maxLinesPerMessage?: number; actions?: DiscordActionConfig; thread?: DiscordThreadConfig; dm?: DiscordDmConfig; guilds?: Record; execApprovals?: DiscordExecApprovalConfig; agentComponents?: DiscordAgentComponentsConfig; slashCommand?: DiscordSlashCommandConfig; threadBindings?: DiscordThreadBindingsConfig; subagentProgress?: boolean; intents?: DiscordIntentsConfig; voice?: DiscordVoiceConfig; pluralkit?: DiscordPluralKitConfig; ackReactionScope?: \"group-mentions\" | \"group-all\" | \"direct\" | \"all\" | \"off\" | \"none\"; activity?: string; status?: \"online\" | \"dnd\" | \"idle\" | \"invisible\"; autoPresence?: DiscordAutoPresenceConfig; activityType?: 0 | 1 | 2 | 3 | 4 | 5; activityUrl?: string; inboundWorker?: { runTimeoutMs?: number; };};","entrypoint":"discord","exportName":"DiscordAccountConfig","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"ae9fb82eaf8d09709d4f8c26f7419827741faa40a3fae83864863cdae7e86250","declaration":"export type DiscordComponentBuildResult = DiscordComponentBuildResult;","entrypoint":"discord","exportName":"DiscordComponentBuildResult","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} {"closureHash":"5c5d9351a7f45d03bd5b0f2b116db5484bc5073b02f717b353420369a8f48556","declaration":"export type DiscordComponentMessageSpec = DiscordComponentMessageSpec;","entrypoint":"discord","exportName":"DiscordComponentMessageSpec","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} @@ -2215,8 +2215,8 @@ {"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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","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":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"discord","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","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"} {"closureHash":"eaabd6155d6f25cbba09ef3c8f2b306f2202affdca4b47e5d67311ff4073fb0d","declaration":"export type ThreadBindingTargetKind = ThreadBindingTargetKind;","entrypoint":"discord","exportName":"ThreadBindingTargetKind","importSpecifier":"openclaw/plugin-sdk/discord","kind":"type","recordType":"export"} @@ -2289,7 +2289,7 @@ {"closureHash":"a8874cc3b2cb522f6ca38ba5e353ec290aad0495c56087396ecaeb1cee9981b6","declaration":"export type NodeMatchCandidate = NodeMatchCandidate;","entrypoint":"gateway-runtime","exportName":"NodeMatchCandidate","importSpecifier":"openclaw/plugin-sdk/gateway-runtime","kind":"type","recordType":"export"} {"closureHash":"909e9434e956f1dfde4cc24f68879e7c3a1aac8aea4ff2d887b37824fdef1994","declaration":"export type NodeSession = NodeSession;","entrypoint":"gateway-runtime","exportName":"NodeSession","importSpecifier":"openclaw/plugin-sdk/gateway-runtime","kind":"type","recordType":"export"} {"closureHash":"6cfef265e2aebd53c1e7ce29cb204228ac175b07f9d2f22b861e98cac0eaee4a","declaration":"export type NormalizedPluginNodeCapabilityUrl = NormalizedPluginNodeCapabilityUrl;","entrypoint":"gateway-runtime","exportName":"NormalizedPluginNodeCapabilityUrl","importSpecifier":"openclaw/plugin-sdk/gateway-runtime","kind":"type","recordType":"export"} -{"closureHash":"f7a314876945ed3fefd288085a0be9c6736acde250fc57651b87ac4488a57f08","declaration":"export class GatewayClient {\n #client: BaseGatewayClient;\n constructor(opts: GatewayClientOptions);\n start(): void;\n stop(): void;\n stopAndWait(opts?: {\n timeoutMs?: number;\n }): Promise;\n request>(method: string, params?: unknown, opts?: GatewayClientRequestOptions): Promise;\n getConnectionMetadata(): GatewayClientConnectionMetadata;\n updateNodeManifest(manifest: {\n caps: string[];\n commands: string[];\n }): void;\n}","entrypoint":"gateway-runtime","exportName":"GatewayClient","importSpecifier":"openclaw/plugin-sdk/gateway-runtime","kind":"class","recordType":"export"} +{"closureHash":"a8ddb69632bf607e66ad3c640b2e676060c1dd1f6be25a70acd31b8a4b1e9fff","declaration":"export class GatewayClient {\n #client: BaseGatewayClient;\n constructor(opts: GatewayClientOptions);\n start(): void;\n stop(): void;\n stopAndWait(opts?: {\n timeoutMs?: number;\n }): Promise;\n request>(method: string, params?: unknown, opts?: GatewayClientRequestOptions): Promise;\n getConnectionMetadata(): GatewayClientConnectionMetadata;\n updateNodeManifest(manifest: {\n caps: string[];\n commands: string[];\n }): void;\n}","entrypoint":"gateway-runtime","exportName":"GatewayClient","importSpecifier":"openclaw/plugin-sdk/gateway-runtime","kind":"class","recordType":"export"} {"category":null,"entrypoint":"group-access","importSpecifier":"openclaw/plugin-sdk/group-access","recordType":"module"} {"closureHash":"b6b34cd3844debbe7cda17ad7703e4fcffe4489789ae1763df8f8ab027150203","declaration":"export function evaluateGroupRouteAccessForPolicy(params: { groupPolicy: GroupPolicy; routeAllowlistConfigured: boolean; routeMatched: boolean; routeEnabled?: boolean; }): GroupRouteAccessDecision;","entrypoint":"group-access","exportName":"evaluateGroupRouteAccessForPolicy","importSpecifier":"openclaw/plugin-sdk/group-access","kind":"function","recordType":"export"} {"closureHash":"bf1a463ce98bf23d639d6e80112ffca836df6d63049bae6fef2a11a2ef1bb74c","declaration":"export function evaluateMatchedGroupAccessForPolicy(params: { groupPolicy: GroupPolicy; allowlistConfigured: boolean; allowlistMatched: boolean; requireMatchInput?: boolean; hasMatchInput?: boolean; }): MatchedGroupAccessDecision;","entrypoint":"group-access","exportName":"evaluateMatchedGroupAccessForPolicy","importSpecifier":"openclaw/plugin-sdk/group-access","kind":"function","recordType":"export"} @@ -2334,7 +2334,7 @@ {"closureHash":"4e9774b442212bd9346cf95095a42ece3c0e1df29f25e1a81e857981503b4a82","declaration":"export function deriveInboundMessageHookContext(ctx: FinalizedMsgContext, overrides?: { content?: string; messageId?: string; }): CanonicalInboundMessageHookContext;","entrypoint":"hook-runtime","exportName":"deriveInboundMessageHookContext","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} {"closureHash":"9bb995aaaf485864e8c02dc5cc71fe5bff42e4d202c20554efc2f3d2d5c2576d","declaration":"export function fireAndForgetBoundedHook(task: () => Promise, label: string, logger?: (message: string) => void, options?: FireAndForgetBoundedHookOptions): void;","entrypoint":"hook-runtime","exportName":"fireAndForgetBoundedHook","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} {"closureHash":"46f0ed9dbb3fb5cd6d3898f8dd762508eb93dac3255841d96ae9b25d2ed84c96","declaration":"export function fireAndForgetHook(task: Promise, label: string, logger?: (message: string) => void): void;","entrypoint":"hook-runtime","exportName":"fireAndForgetHook","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} -{"closureHash":"111c671b6f4c7fbc3a6fed7581e7be7e61f69c0da1a2fe9935618fb60d5d58f2","declaration":"export function initializeGlobalHookRunner(registry: GlobalHookRunnerRegistry): void;","entrypoint":"hook-runtime","exportName":"initializeGlobalHookRunner","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} +{"closureHash":"819ef2075c836ea71b03cb8cf6247c4d3064e208f9086d0a9d7ed612f4a6844c","declaration":"export function initializeGlobalHookRunner(registry: GlobalHookRunnerRegistry): void;","entrypoint":"hook-runtime","exportName":"initializeGlobalHookRunner","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} {"closureHash":"05bb072b6ae34d0271798d98d9083ec8290d4123c349862722097a7e87866d07","declaration":"export function registerInternalHook(eventKey: string, handler: InternalHookHandler): void;","entrypoint":"hook-runtime","exportName":"registerInternalHook","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} {"closureHash":"f573a2f2542169912da9757a6aac432d067434e759cf40035079ea1d107b7e38","declaration":"export function resetGlobalHookRunner(): void;","entrypoint":"hook-runtime","exportName":"resetGlobalHookRunner","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} {"closureHash":"e26c70aedd4d93db7a26367de5a935f8335b657b6333f34797a5349f04589b20","declaration":"export function toInternalMessageReceivedContext(canonical: CanonicalInboundMessageHookContext): MessageReceivedHookContext;","entrypoint":"hook-runtime","exportName":"toInternalMessageReceivedContext","importSpecifier":"openclaw/plugin-sdk/hook-runtime","kind":"function","recordType":"export"} @@ -2350,24 +2350,24 @@ {"category":null,"entrypoint":"inbound-event-delivery","importSpecifier":"openclaw/plugin-sdk/inbound-event-delivery","recordType":"module"} {"closureHash":"bd8acef57a602ffc7a70848afb14bad6e37c892ded35b20ba0d3452336088830","declaration":"export function createInboundEventDeliveryCorrelation(params: { targetsMatch: (expected: string, actual: string) => boolean; }): { begin(sessionKey: string | undefined, event: ActiveInboundEvent, options?: { inboundEventKind?: string; }): () => void; notify(notification: InboundEventDeliveryNotification): void; };","entrypoint":"inbound-event-delivery","exportName":"createInboundEventDeliveryCorrelation","importSpecifier":"openclaw/plugin-sdk/inbound-event-delivery","kind":"function","recordType":"export"} {"category":null,"entrypoint":"inbound-reply-dispatch","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","recordType":"module"} -{"closureHash":"e088ddef111b171ef5d034d9de6062cc551d6775412ddc8cfa7b72ca8f31c62d","declaration":"export function dispatchChannelInboundReply(params: AssembledInboundReply): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"dispatchChannelInboundReply","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} -{"closureHash":"42faf8201585d82c339d991a2d1969f1723956fb1c8561f586ba831e376bf8e7","declaration":"export function dispatchInboundReplyWithBase(params: BuildInboundReplyDispatchBaseParams & Pick): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"dispatchInboundReplyWithBase","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} +{"closureHash":"552aa82911f9aba585fee69fc351990ad892bd0ba4dd20e69ce6d3c286efc6d4","declaration":"export function dispatchChannelInboundReply(params: AssembledInboundReply): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"dispatchChannelInboundReply","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} +{"closureHash":"fe29945860715ed39486664c775c5519d07b0f536a9fad396761ed4f6dc83dfb","declaration":"export function dispatchInboundReplyWithBase(params: BuildInboundReplyDispatchBaseParams & Pick): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"dispatchInboundReplyWithBase","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"8a142089acc4d9428ed552977f90f17b2283c109cd1c66b91b51b3653d455eea","declaration":"export function hasFinalInboundReplyDispatch(result: ChannelTurnDispatchResultLike, signals?: Pick): boolean;","entrypoint":"inbound-reply-dispatch","exportName":"hasFinalInboundReplyDispatch","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"bb4c861ed6a9b1d70200aea7f6356a65a71491b098f8f3e8866241e5481f9aec","declaration":"export function hasVisibleInboundReplyDispatch(result: ChannelTurnDispatchResultLike, signals?: ChannelTurnVisibleDeliverySignals): boolean;","entrypoint":"inbound-reply-dispatch","exportName":"hasVisibleInboundReplyDispatch","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"65f5f2725c1124096e437bcf5894983eee1023f7033be886f1a506044b77c58e","declaration":"export function recordChannelBotPairLoopAndCheckSuppression(params: ChannelBotLoopProtectionFacts): PairLoopGuardResult;","entrypoint":"inbound-reply-dispatch","exportName":"recordChannelBotPairLoopAndCheckSuppression","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"33b4280a69de6a4a87acf915c6d694b9ee41fc4f0262a1bb9836c46d53fe337c","declaration":"export function recordDroppedChannelInboundHistory(params: { input: NormalizedTurnInput; preflight: PreflightFacts; admission?: ChannelTurnAdmission; }): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"recordDroppedChannelInboundHistory","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"closureHash":"33b4280a69de6a4a87acf915c6d694b9ee41fc4f0262a1bb9836c46d53fe337c","declaration":"export function recordDroppedChannelTurnHistory(params: { input: NormalizedTurnInput; preflight: PreflightFacts; admission?: ChannelTurnAdmission; }): Promise;","entrypoint":"inbound-reply-dispatch","exportName":"recordDroppedChannelTurnHistory","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"function","recordType":"export"} {"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":"871d3ff30c14af1a605fdb47c50923a910a7886f7cc886ba1cd9c2eff1ea8334","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":"e00127c8d36bc7219cc2f31cc4ded3deb1ce54ca5287fe7f40611242433ab6bd","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":"64792a0c33912731a154f8e8e1b3f598b3396d2e0b93ed35fb4cc67a150bf9e2","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":"10d47ee68a65fa2df62012bf98988026560dd0bc30d2be56783ed4132864a149","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"} -{"closureHash":"809fd66291f793b3d61ddd275ed153cb2050b1d7a31767ef577489a20ee582d0","declaration":"export type ChannelInboundEventRunnerParams = ChannelInboundEventRunnerParams;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelInboundEventRunnerParams","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} +{"closureHash":"c579a83076937cade03409079c9173c85509753ed80e559f126d5939147c4261","declaration":"export type ChannelInboundEventRunnerParams = ChannelInboundEventRunnerParams;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelInboundEventRunnerParams","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"f0da845bbdf49b30f6718a4b7ff012a0536deb98f65418583555dc90825797ca","declaration":"export type ChannelTurnDroppedHistoryOptions = ChannelTurnDroppedHistoryOptions;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelTurnDroppedHistoryOptions","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"b145a01f8a24a98b66e723274b24f5a87c3b7034ac7d5c551a92b0cfdb041d51","declaration":"export type ChannelTurnRecordOptions = ChannelTurnRecordOptions;","entrypoint":"inbound-reply-dispatch","exportName":"ChannelTurnRecordOptions","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} -{"closureHash":"4c1290dcec6d7fac7aec703ccec8b6b790ebbd4fa12c3c3c1d07f55b86075b5e","declaration":"export type DurableInboundReplyDeliveryParams = DurableInboundReplyDeliveryParams;","entrypoint":"inbound-reply-dispatch","exportName":"DurableInboundReplyDeliveryParams","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} +{"closureHash":"6c4c3a1ddaae4323de2bfcf123e74a4f31ec79c79cd4bb3a0819fe6410f91874","declaration":"export type DurableInboundReplyDeliveryParams = DurableInboundReplyDeliveryParams;","entrypoint":"inbound-reply-dispatch","exportName":"DurableInboundReplyDeliveryParams","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"d7207dc28a2f179c2f25b5dc44bb674f7468449fd11ef2d19656a42c88abce52","declaration":"export type InboundReplyDispatchResult = InboundReplyDispatchResult;","entrypoint":"inbound-reply-dispatch","exportName":"InboundReplyDispatchResult","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"b145a01f8a24a98b66e723274b24f5a87c3b7034ac7d5c551a92b0cfdb041d51","declaration":"export type InboundReplyRecordOptions = ChannelTurnRecordOptions;","entrypoint":"inbound-reply-dispatch","exportName":"InboundReplyRecordOptions","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} {"closureHash":"5da63546645ac09fa2e077085f44bfc7c256efc72676e47828e57d6aedd13dd7","declaration":"export type PreparedInboundReply = PreparedInboundReply;","entrypoint":"inbound-reply-dispatch","exportName":"PreparedInboundReply","importSpecifier":"openclaw/plugin-sdk/inbound-reply-dispatch","kind":"type","recordType":"export"} @@ -2422,11 +2422,11 @@ {"closureHash":"6f367f332309fd7947ed7a802a570f6bfd3cdd65390349d5d4e3b346a12437ce","declaration":"export function createPinnedDispatcher(pinned: PinnedHostname, policy?: PinnedDispatcherPolicy, ssrfPolicy?: SsrFPolicy, timeoutMs?: number): Dispatcher;","entrypoint":"infra-runtime","exportName":"createPinnedDispatcher","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"0f4914857641d379d197fb6cf08adbdf6afe32e4601c929fb5ee26ebe6b3a475","declaration":"export function createPinnedLookup(params: { hostname: string; addresses: string[]; fallback?: typeof dnsLookupCb; }): typeof dnsLookupCb;","entrypoint":"infra-runtime","exportName":"createPinnedLookup","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"5c8af1c15cb5b76b9315c71eed511ce43fcf6eb6973f24d36c63e61761bb9d57","declaration":"export function createRateLimitRetryRunner(params: { retry?: RetryConfig; configRetry?: RetryConfig; verbose?: boolean; defaults: Required; logLabel: string; shouldRetry: (err: unknown) => boolean; retryAfterMs?: (err: unknown) => number | undefined; }): RetryRunner;","entrypoint":"infra-runtime","exportName":"createRateLimitRetryRunner","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} -{"closureHash":"d934828dfca3782d302de428edb678320bafaaf43732a885df3a78c9775e49c6","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"infra-runtime","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} +{"closureHash":"7e7949327c77ae964e33167e8f064680883ce46b75a4606a9f8e154cc0cec7a9","declaration":"export function createRuntimeOutboundDelegates(params: { getRuntime: () => MaybePromise; renderPresentation?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"renderPresentation\"] | null | undefined; unavailableMessage?: string; }; sendPayload?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPayload\"] | null | undefined; unavailableMessage?: string; }; sendText?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendText\"] | null | undefined; unavailableMessage?: string; }; sendMedia?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendMedia\"] | null | undefined; unavailableMessage?: string; }; sendPoll?: { resolve: (runtime: Runtime) => ChannelOutboundAdapter[\"sendPoll\"] | null | undefined; unavailableMessage?: string; }; }): Pick;","entrypoint":"infra-runtime","exportName":"createRuntimeOutboundDelegates","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"d1560d54f83a756aa3400e5f3f961129e5bd1700f92a6e7e8857527c52ef6059","declaration":"export function deliverApprovalRequestViaChannelNativePlan(params: { cfg: OpenClawConfig; accountId?: string | null; approvalKind: ChannelApprovalKind; request: TRequest; adapter?: ChannelApprovalNativeAdapter | null; prepareTarget: (params: { plannedTarget: ChannelApprovalNativePlannedTarget; request: TRequest; }) => PreparedChannelNativeApprovalTarget | null | Promise | null>; deliverTarget: (params: { plannedTarget: ChannelApprovalNativePlannedTarget; preparedTarget: TPreparedTarget; request: TRequest; }) => TPendingEntry | null | Promise; onDeliveryError?: (params: { error: unknown; plannedTarget: ChannelApprovalNativePlannedTarget; request: TRequest; }) => void; onDuplicateSkipped?: (params: { plannedTarget: ChannelApprovalNativePlannedTarget; preparedTarget: PreparedChannelNativeApprovalTarget; request: TRequest; }) => void; onDelivered?: (params: { plannedTarget: ChannelApprovalNativePlannedTarget; preparedTarget: PreparedChannelNativeApprovalTarget; request: TRequest; entry: TPendingEntry; }) => void; }): Promise>;","entrypoint":"infra-runtime","exportName":"deliverApprovalRequestViaChannelNativePlan","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"9570907a3b539e63f6526f8ea2b900bf4ad98273ccfa1ad9a650691c5d7d9796","declaration":"export function detectErrorKind(err: unknown): ErrorKind | undefined;","entrypoint":"infra-runtime","exportName":"detectErrorKind","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"37ffac88002a43ba51bd0115f9b4827e5961465ea1ce518fba1bd0286782a547","declaration":"export function drainFileLockStateForTest(): Promise;","entrypoint":"infra-runtime","exportName":"drainFileLockStateForTest","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} -{"closureHash":"f532f4e65e15f6f73e6a4dde642d9e9c0d930f2b98c10d73ebd325cfd50e79e8","declaration":"export function drainPendingDeliveries(opts: DrainPendingDeliveriesOptions): Promise;","entrypoint":"infra-runtime","exportName":"drainPendingDeliveries","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} +{"closureHash":"94c6227153b0da4c23e7b538d9d0a7f38b38c5e197abc7cd8ca4b0e162b0b4b9","declaration":"export function drainPendingDeliveries(opts: DrainPendingDeliveriesOptions): Promise;","entrypoint":"infra-runtime","exportName":"drainPendingDeliveries","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"467468a9c734bada639fa022ad29644359b56023cd24829226de9861a33489cc","declaration":"export function drainSystemEventEntries(sessionKey: string): SystemEvent[];","entrypoint":"infra-runtime","exportName":"drainSystemEventEntries","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"c2c7ea12b2230c72c22175b2a6b9c0ade4f06e3e05c1881b96decbd6c9f549b1","declaration":"export function drainSystemEvents(sessionKey: string): string[];","entrypoint":"infra-runtime","exportName":"drainSystemEvents","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} {"closureHash":"298015c846de36a95069a582e3c892b9e6a8cc89527cc52b8399022d292f405b","declaration":"export function emitDiagnosticEvent(event: DiagnosticEventInput): void;","entrypoint":"infra-runtime","exportName":"emitDiagnosticEvent","importSpecifier":"openclaw/plugin-sdk/infra-runtime","kind":"function","recordType":"export"} @@ -3077,7 +3077,7 @@ {"closureHash":"4f2ddba78acc784ef2ed0354a27e1d806e49ba10d5975bcd6cc4d964ddcd0dac","declaration":"export function buildImageResizeSideGrid(maxSide: number, sideStart: number): number[];","entrypoint":"media-runtime","exportName":"buildImageResizeSideGrid","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} {"closureHash":"5304cd3dcc74520d6ead6e43bbe8f56f656683ed0e8ef8e37ee429ae54392a96","declaration":"export function buildOutboundMediaLoadOptions(params?: OutboundMediaLoadParams): OutboundMediaLoadOptions;","entrypoint":"media-runtime","exportName":"buildOutboundMediaLoadOptions","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} {"closureHash":"d8f59bd819c0328bc303a1e32eaa3456ffbd8653118aec7eb800010e9441a7c8","declaration":"export function canonicalizeBase64(base64: string): string | undefined;","entrypoint":"media-runtime","exportName":"canonicalizeBase64","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} -{"closureHash":"1eff6533bfa79e8fe999af73140c7deb15155a199295116b4be3eb07af42a7c2","declaration":"export function createDirectTextMediaOutbound, TResult extends DirectSendResult>(params: { channel: string; resolveSender: (deps: OutboundSendDeps | undefined) => DirectSendFn; resolveMaxBytes: (params: { cfg: OpenClawConfig; accountId?: string | null; }) => number | undefined; buildTextOptions: (params: DirectSendOptions) => TOpts; buildMediaOptions: (params: DirectSendOptions) => TOpts; }): ChannelOutboundAdapter;","entrypoint":"media-runtime","exportName":"createDirectTextMediaOutbound","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} +{"closureHash":"9ccc44e7148260da13d433afaf4942f20b9955a381294e548774d535273dadf4","declaration":"export function createDirectTextMediaOutbound, TResult extends DirectSendResult>(params: { channel: string; resolveSender: (deps: OutboundSendDeps | undefined) => DirectSendFn; resolveMaxBytes: (params: { cfg: OpenClawConfig; accountId?: string | null; }) => number | undefined; buildTextOptions: (params: DirectSendOptions) => TOpts; buildMediaOptions: (params: DirectSendOptions) => TOpts; }): ChannelOutboundAdapter;","entrypoint":"media-runtime","exportName":"createDirectTextMediaOutbound","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} {"closureHash":"e9315e5dabbebcb7a8dfe63762db43d61629cb77eabbb6bf7661b460b537a725","declaration":"export function createScopedChannelMediaMaxBytesResolver(channel: string): (params: { cfg: OpenClawConfig; accountId?: string | null; }) => number | undefined;","entrypoint":"media-runtime","exportName":"createScopedChannelMediaMaxBytesResolver","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} {"closureHash":"33c8364fd65fe8d46a295345fbbf21faedea7226891e4bfe0b15126ee03d76a9","declaration":"export function detectMime(opts: { buffer?: Buffer; headerMime?: string | null; additionalMimeHints?: readonly (string | null | undefined)[]; filePath?: string; }): Promise;","entrypoint":"media-runtime","exportName":"detectMime","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} {"closureHash":"3114b65f13781a49b264fec4e1b9297d42aa203fdbd07fc84cf230bc6a35e179","declaration":"export function encodePngRgba(buffer: Buffer, width: number, height: number): Buffer;","entrypoint":"media-runtime","exportName":"encodePngRgba","importSpecifier":"openclaw/plugin-sdk/media-runtime","kind":"function","recordType":"export"} @@ -3192,34 +3192,34 @@ {"closureHash":"0a8eee30ac3d7beb17a67ed364602e375580d8fe64711e4a88bb77eabb1354f0","declaration":"export function addMeetingSetupCheck(status: MeetingSetupStatus, check: MeetingSetupCheck): MeetingSetupStatus;","entrypoint":"meeting-runtime","exportName":"addMeetingSetupCheck","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"a4294716c3bb64b8732f33b331506a14e4f2fba59f382699961c9db8677e6774","declaration":"export function asMeetingBrowserTabs(result: unknown): MeetingBrowserCandidateTab[];","entrypoint":"meeting-runtime","exportName":"asMeetingBrowserTabs","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"b39bf4bdb91f0aeabac8cbd0ee8dc21afceae20faf463c6a2657258f2aa07976","declaration":"export function buildMeetingSoxAudioCommands(params: MeetingSoxAudioCommandParams): { inputCommand: string[]; outputCommand: string[]; };","entrypoint":"meeting-runtime","exportName":"buildMeetingSoxAudioCommands","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"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":"66f0964725c2b9640e8ab8cfb803a421a9e58a2238ea4fbf7ffa97d0c4d33df0","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":"5148f6adceecb8eeda162561a1893bddb99bb9fff4bb65b480fa7aad4580d6e5","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":"c7e8cad42fa48c1be4ae1b1f7f87339c849cacf81a53ad53df76e188f4dd4629","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":"eaf5cff3027412d66a1e6488a71c1fb21ae1efb16d5c7415afed7370a1641dbf","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":"6afe0a95e9ee7fb68b75e29cb4e8134b9e53adb2113356b950d3ce8b512da325","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":"2ce663d0c867849f055335c2e964429a31516c653e0628173149d4f991067808","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":"ae27b78b0f45a723baac51795d87d5a2004b92e6f37f8ef3989feb2d8dc10834","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":"abfbbc6b5eca3947bed22ea782cf5ad582b6a364f554d8851c92c2d3cbc3c6f7","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":"364dbe49fce073de6aff2b666e2e80b9d188f04458f179f0569506702b2e5075","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":"c011a22f03d8781e96a3c286096008e5192216196e5d6fd1121063a1958f009d","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":"c571be67deff656fc2e53aecb61d02bd58b468d4b548860b37b61eafa18f8d6b","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"} {"closureHash":"566d131fb9ec888fb5441ac6e7ae1623e8f5d12a2870d3fc94db607d57f70205","declaration":"export function readMeetingTranscriptWithBrowser(params: { adapter: BrowserAdapter; callBrowser: MeetingBrowserRequestCaller; finalize: boolean; meetingUrl: string; meetingSessionId: string; tab: MeetingBrowserTab; timeoutMs: number; }): Promise;","entrypoint":"meeting-runtime","exportName":"readMeetingTranscriptWithBrowser","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} {"closureHash":"0b42493cc0197096c4847c2d6e149c5581580abdda448d07eb1c6d77a775bc4a","declaration":"export function recoverMeetingBrowserTab(params: { adapter: BrowserAdapter; allowSessionAdoption?: boolean; autoJoin?: boolean; callBrowser: MeetingBrowserRequestCaller; captureCaptions?: boolean; config: MeetingBrowserControllerConfig; locationLabel: string; meetingSessionId?: string; mode: Mode; requestedMeetingUrl: string | undefined; readOnly?: boolean; timeoutMs?: number; trackedMeetingUrl: string | undefined; trackedTargetId: string | undefined; }): Promise<{ found: boolean; targetId?: string; tab?: MeetingBrowserCandidateTab; browser?: Health; message: string; }>;","entrypoint":"meeting-runtime","exportName":"recoverMeetingBrowserTab","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"14a4b81c2fd546280de7aa0bac56da7b87ae938153bc1d582b8e2c88afdef6ab","declaration":"export function resolveLocalMeetingBrowserRequest(runtime: PluginRuntime): Promise;","entrypoint":"meeting-runtime","exportName":"resolveLocalMeetingBrowserRequest","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"closureHash":"acfb7e0ad3f2ddeaa03a908252e66ba09866f1763c0314771d60129698204a79","declaration":"export function resolveMeetingBrowserNode(params: { runtime: PluginRuntime; adapter: NodeAdapter; requestedNode?: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"resolveMeetingBrowserNode","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} -{"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":"dd5fb0b5816311a03a3ae754c03331e11afae96acc63338bbde9111a919d2060","declaration":"export function resolveLocalMeetingBrowserRequest(runtime: PluginRuntime): Promise;","entrypoint":"meeting-runtime","exportName":"resolveLocalMeetingBrowserRequest","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"019720abfc1f5af9638270dbeb6d42b6e2c089b6250fff6a936c2a1758acf1a5","declaration":"export function resolveMeetingBrowserNode(params: { runtime: PluginRuntime; adapter: NodeAdapter; requestedNode?: string; }): Promise;","entrypoint":"meeting-runtime","exportName":"resolveMeetingBrowserNode","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"function","recordType":"export"} +{"closureHash":"120055d3915ab89e6960d454ba75088f5d000e2abe1715901b791f86ab0f2ba5","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":"a2e5889b88cbcb5a063a81b123facc75b932fe1d38b62042d21a45b354b0a48a","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":"bba5f9b7093ef662ec7a464280c5fa3468847b6eb39b43cdb95011e7dadef2cc","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":"c64d9bc7f2e478a5affc01a910f49882aef707b077d8ebc0da889985cfaf9595","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":"20dff0ae02d5d945273bedcb54a853efed1f43cf1f03754a52e0eb3e584c7b88","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":"6e628916c0430337ee7725fc55520a2d35d02a50bd50a848a35d7ff50bfb98ff","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":"8d3f6abdbf39603c6f28a69b9bb8f0b214d978dc10dd83ca3f6a692f565a7cb0","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":"4dafd9024220722e822bf4e24b4311e0dfb0a8585a813256e51188b5328b40f3","declaration":"export interface MeetingPlatformAdapter extends MeetingPlatformAdapterContract {\n}","entrypoint":"meeting-runtime","exportName":"MeetingPlatformAdapter","importSpecifier":"openclaw/plugin-sdk/meeting-runtime","kind":"interface","recordType":"export"} +{"closureHash":"376e9dae283ed91fb2a5e5769c33f09bed27db7a0d42afe7d305bb1f6d58167e","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":"2e981750bb930e7a5afb64829def74599e4ad186e75be64c7b8418bb4cf868d9","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":"2bf79ddb49656aafb6210e91b35334500af758fbe90bc6da026a8660fd3ed5b4","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"} @@ -3314,22 +3314,22 @@ {"closureHash":"a4eb3c7aa83aa054abd219f478431b96b95a7766829478d85b503128a669a7d4","declaration":"export type MessagingTargetKind = MessagingTargetKind;","entrypoint":"messaging-targets","exportName":"MessagingTargetKind","importSpecifier":"openclaw/plugin-sdk/messaging-targets","kind":"type","recordType":"export"} {"closureHash":"59ec8e354eaae23380fcb8023479eb725959b581abc4d81cfdbe8f8f0a0bbb2a","declaration":"export type MessagingTargetParseOptions = MessagingTargetParseOptions;","entrypoint":"messaging-targets","exportName":"MessagingTargetParseOptions","importSpecifier":"openclaw/plugin-sdk/messaging-targets","kind":"type","recordType":"export"} {"category":null,"entrypoint":"model-session-runtime","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","recordType":"module"} -{"closureHash":"b75bdf1d3b0b17c4066e5f441a85504df8d2af2d7f93db3fcbe45ffacc3a4378","declaration":"export function applyModelOverrideToSessionEntry(params: { entry: SessionEntry; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; preserveAuthProfileOverride?: boolean; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; }): { updated: boolean; };","entrypoint":"model-session-runtime","exportName":"applyModelOverrideToSessionEntry","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} -{"closureHash":"006cd6a6f9d964aba5c86d0435ed0b24d8e372a9ca0bf20dcaf9025cf047c3ae","declaration":"export function applyModelOverrideWithAuthProfileCompatibility(params: { cfg: OpenClawConfig; agentDir: string; entry: SessionEntry; currentProvider: string; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; metadataSnapshot?: Pick; }): { updated: boolean; };","entrypoint":"model-session-runtime","exportName":"applyModelOverrideWithAuthProfileCompatibility","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} -{"closureHash":"e6650aff38f7d8629fe210cf2b076e415d808d3884bda4652871726908f0fd2e","declaration":"export function applySessionModelSelection(params: ApplySessionModelSelectionParams): Promise;","entrypoint":"model-session-runtime","exportName":"applySessionModelSelection","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} -{"closureHash":"73fad472924a8fc991986887ff6ac591b10bba8a967540d40e340c0b27f51b46","declaration":"export function isModelSelectionLocked(entry: SessionEntry | undefined): boolean;","entrypoint":"model-session-runtime","exportName":"isModelSelectionLocked","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} +{"closureHash":"5ab32281213bb9eb1f573bcc0ae7f6a87a4caa552a6a5d9acd35df5daf2af8f9","declaration":"export function applyModelOverrideToSessionEntry(params: { entry: SessionEntry; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; preserveAuthProfileOverride?: boolean; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; }): { updated: boolean; };","entrypoint":"model-session-runtime","exportName":"applyModelOverrideToSessionEntry","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} +{"closureHash":"8cc0f9d6d300629474c45259de6b2ce556bd61782c13b4231483f1dea6338ce7","declaration":"export function applyModelOverrideWithAuthProfileCompatibility(params: { cfg: OpenClawConfig; agentDir: string; entry: SessionEntry; currentProvider: string; selection: ModelOverrideSelection; profileOverride?: string; profileOverrideSource?: \"auto\" | \"user\"; selectionSource?: \"auto\" | \"user\"; markLiveSwitchPending?: boolean; metadataSnapshot?: Pick; }): { updated: boolean; };","entrypoint":"model-session-runtime","exportName":"applyModelOverrideWithAuthProfileCompatibility","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} +{"closureHash":"0fa17ac0b5c881143bca59bc30863c921ab16acad11dc16cf14d79952dd70c86","declaration":"export function applySessionModelSelection(params: ApplySessionModelSelectionParams): Promise;","entrypoint":"model-session-runtime","exportName":"applySessionModelSelection","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} +{"closureHash":"f4385a6d0770313b69c87b4beec48b9f34de02cd178838647e6c3856485577a7","declaration":"export function isModelSelectionLocked(entry: SessionEntry | undefined): boolean;","entrypoint":"model-session-runtime","exportName":"isModelSelectionLocked","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} {"closureHash":"54ba34f76655889ed6ca88c64bdaf5fa4dbb6eaafe873460ae905d05873ecb01","declaration":"export function resolveAgentMaxConcurrent(cfg?: OpenClawConfig): number;","entrypoint":"model-session-runtime","exportName":"resolveAgentMaxConcurrent","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} {"closureHash":"8973ae5795331c1cc378a7023208a6a054c1309196636d38cbda85c6c83198b7","declaration":"export function resolveChannelModelOverride(params: ChannelModelOverrideParams): ChannelModelOverride | null;","entrypoint":"model-session-runtime","exportName":"resolveChannelModelOverride","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} -{"closureHash":"2b0e695aaeab1a66c428f356f4c15fd3b2e1f3acbb8d342fdef7538cd70ff61b","declaration":"export function resolvePersistedSessionRuntimeId(entry?: SessionRuntimeCompatEntry): string | undefined;","entrypoint":"model-session-runtime","exportName":"resolvePersistedSessionRuntimeId","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} +{"closureHash":"7b6e314d2203a84583dcbeba939cb1a717557f86048b2f3bfda17884cc557f06","declaration":"export function resolvePersistedSessionRuntimeId(entry?: SessionRuntimeCompatEntry): string | undefined;","entrypoint":"model-session-runtime","exportName":"resolvePersistedSessionRuntimeId","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"function","recordType":"export"} {"closureHash":"f5ca32d7e21d4947e46c556e82c741a6b52ee95cf3cf1c055016a76bad34a68f","declaration":"export const MODEL_SELECTION_LOCKED_MESSAGE: \"Model selection is locked for this session.\";","entrypoint":"model-session-runtime","exportName":"MODEL_SELECTION_LOCKED_MESSAGE","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"const","recordType":"export"} -{"closureHash":"724e7f9e7d95c1d2910089d94504954ed738fa83bdb65869aa65a2815d98ed28","declaration":"export type ApplySessionModelSelectionParams = ApplySessionModelSelectionParams;","entrypoint":"model-session-runtime","exportName":"ApplySessionModelSelectionParams","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"type","recordType":"export"} +{"closureHash":"4f3542d574f4f3481d9c5a4fef004b7958a8ccd5ee37dcce1f29c3b3d7ac4126","declaration":"export type ApplySessionModelSelectionParams = ApplySessionModelSelectionParams;","entrypoint":"model-session-runtime","exportName":"ApplySessionModelSelectionParams","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"type","recordType":"export"} {"closureHash":"c934b9f7fa2edd07cef3b6d041734b24d90262212ba261b60b37f2ebb39ec137","declaration":"export type ApplySessionModelSelectionResult = ApplySessionModelSelectionResult;","entrypoint":"model-session-runtime","exportName":"ApplySessionModelSelectionResult","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"type","recordType":"export"} {"closureHash":"3fd1bb66f07e4bfb5a61bdc2f0e2317ea28af416fdcf1b897e593360438e3d48","declaration":"export type SessionModelSelectionRequest = SessionModelSelectionRequest;","entrypoint":"model-session-runtime","exportName":"SessionModelSelectionRequest","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"type","recordType":"export"} {"closureHash":"6812c68e68c02dc92315bde229d880be6fe02d3102d3a4651d6d95bcc18a2cef","declaration":"export class ModelSelectionLockedError extends Error {\n constructor(message);\n}","entrypoint":"model-session-runtime","exportName":"ModelSelectionLockedError","importSpecifier":"openclaw/plugin-sdk/model-session-runtime","kind":"class","recordType":"export"} {"category":null,"entrypoint":"models-provider-runtime","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","recordType":"module"} {"closureHash":"5f6a1fd4ea1fb4b7eac3209e5e9f430a0d6a458d92fffc5ac835abd8ae61c1e8","declaration":"export function buildModelsProviderData(cfg: OpenClawConfig, agentId?: string, options?: { view?: \"default\" | \"all\"; workspaceDir?: string; }): Promise;","entrypoint":"models-provider-runtime","exportName":"buildModelsProviderData","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"function","recordType":"export"} -{"closureHash":"0c4cae1b295d58b5de6a784befffe7b903512c86a3b30562cc8a0d44416c757e","declaration":"export function formatModelsAvailableHeader(params: { provider: string; total: number; cfg: OpenClawConfig; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): string;","entrypoint":"models-provider-runtime","exportName":"formatModelsAvailableHeader","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"function","recordType":"export"} -{"closureHash":"485ffea9154be1df4e7c7dd7963f049abb566da42248a3b9333e2f274d76bcb7","declaration":"export function resolveModelsCommandReply(params: { cfg: OpenClawConfig; commandBodyNormalized: string; surface?: string; currentModel?: string; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): Promise;","entrypoint":"models-provider-runtime","exportName":"resolveModelsCommandReply","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"function","recordType":"export"} +{"closureHash":"e29752f849039ce42363e066b56be824811b0ddf386c62e35705eceb17bd5402","declaration":"export function formatModelsAvailableHeader(params: { provider: string; total: number; cfg: OpenClawConfig; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): string;","entrypoint":"models-provider-runtime","exportName":"formatModelsAvailableHeader","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"function","recordType":"export"} +{"closureHash":"ad26ef446e17f89032798d7dd837387db85370e4c4ddaf732335392ad40c403b","declaration":"export function resolveModelsCommandReply(params: { cfg: OpenClawConfig; commandBodyNormalized: string; surface?: string; currentModel?: string; agentId?: string; agentDir?: string; workspaceDir?: string; sessionEntry?: ModelsCommandSessionEntry; }): Promise;","entrypoint":"models-provider-runtime","exportName":"resolveModelsCommandReply","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"function","recordType":"export"} {"closureHash":"5cdb5f371b24d24c328a27f9bda8b315be6420ba1c6229a5421b02d1d7997fa2","declaration":"export type ModelsProviderData = ModelsProviderData;","entrypoint":"models-provider-runtime","exportName":"ModelsProviderData","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"type","recordType":"export"} {"closureHash":"1c6d96a4e91f9a3468007d379346f25410e59114964787110ff3644f603fac35","declaration":"export type ModelsRuntimeChoice = ModelsRuntimeChoice;","entrypoint":"models-provider-runtime","exportName":"ModelsRuntimeChoice","importSpecifier":"openclaw/plugin-sdk/models-provider-runtime","kind":"type","recordType":"export"} {"category":null,"entrypoint":"native-command-config-runtime","importSpecifier":"openclaw/plugin-sdk/native-command-config-runtime","recordType":"module"} @@ -3385,14 +3385,14 @@ {"closureHash":"e982df4834c8e5e2b45ccc4cde433658e190dcf2a7f3b0d2c700d4ef6eb1632d","declaration":"export type PersistentDedupeOptions = PersistentDedupeOptions;","entrypoint":"persistent-dedupe","exportName":"PersistentDedupeOptions","importSpecifier":"openclaw/plugin-sdk/persistent-dedupe","kind":"type","recordType":"export"} {"closureHash":"dfc56d38508426a6a78afd761e1a1288222c4467ffda62eb27d7eac30671bc21","declaration":"export type PersistentDedupePluginStateOptions = PersistentDedupePluginStateOptions;","entrypoint":"persistent-dedupe","exportName":"PersistentDedupePluginStateOptions","importSpecifier":"openclaw/plugin-sdk/persistent-dedupe","kind":"type","recordType":"export"} {"category":"runtime","entrypoint":"plugin-command-runtime","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","recordType":"module"} -{"closureHash":"b453ed6e37bfc8d4baa583cadeb8700afb4b252b8c42e180faa58307862e5edf","declaration":"export function createPluginCommandRuntime(): PluginCommandRuntime;","entrypoint":"plugin-command-runtime","exportName":"createPluginCommandRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"function","recordType":"export"} +{"closureHash":"4a8d8b3f396313777190457525e0a155e8ee8ff0692608c97b9d3a2d7ad2ab56","declaration":"export function createPluginCommandRuntime(): PluginCommandRuntime;","entrypoint":"plugin-command-runtime","exportName":"createPluginCommandRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"function","recordType":"export"} {"closureHash":"00d993432f711b0223902a7d79b6da2e8ce785bac94b048d069ad8fcbe75db6f","declaration":"export const PLUGIN_COMMAND_DISPATCH: typeof PLUGIN_COMMAND_DISPATCH;","entrypoint":"plugin-command-runtime","exportName":"PLUGIN_COMMAND_DISPATCH","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"const","recordType":"export"} -{"closureHash":"4aff0560a7f3d17cea41ec4a992a4f9e23dcfdec8424ba089d23e82ae2578d9e","declaration":"export type PluginCommandCatalogDecision = PluginCommandCatalogDecision;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandCatalogDecision","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} -{"closureHash":"2e942bfa86b49ef772c7922bcaed1906012f923dd0479e2aa3b384dc233af7dc","declaration":"export type PluginCommandDispatch = Readonly<{ kind: \"plugin\"; execute: (context: PluginCommandDispatchContext) => Promise; [pluginCommandDispatchBrand]: true;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandDispatch","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} -{"closureHash":"99df45b5b5708498e06fa3031d086b5df4332862b9853a648d385ef0ea2b2f12","declaration":"export type PluginCommandDispatchContext = Readonly<{ 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\"];}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandDispatchContext","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} -{"closureHash":"1f954e0e6862b4c681aab3f938e6cff61b9f76f6dfe9100b4d88c947f777f26f","declaration":"export type PluginCommandNativeCandidate = Readonly<{ name: string; description: string; descriptionLocalizations?: Readonly>; acceptsArgs: boolean; requireAuth: boolean; progressMessage?: string; prepareDispatch: (rawArgs?: string) => PluginCommandCatalogDecision;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandNativeCandidate","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} +{"closureHash":"bf2b23c7135b820678675698ff83436b2cb9ee65974575eb5d80fa0f01973549","declaration":"export type PluginCommandCatalogDecision = PluginCommandCatalogDecision;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandCatalogDecision","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} +{"closureHash":"ec1b62205ef1465fac3a939cec5af0db61cc246b298284164f2b25537d503236","declaration":"export type PluginCommandDispatch = Readonly<{ kind: \"plugin\"; execute: (context: PluginCommandDispatchContext) => Promise; [pluginCommandDispatchBrand]: true;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandDispatch","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} +{"closureHash":"1e583a3ad9edb24b54ae0b988c89515953bb09f162718ef76dca2dce529e612e","declaration":"export type PluginCommandDispatchContext = Readonly<{ 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\"];}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandDispatchContext","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} +{"closureHash":"7114202fdc199ed3fb7b772e488aad4b0ae5b6142086279a5653832339de78b1","declaration":"export type PluginCommandNativeCandidate = Readonly<{ name: string; description: string; descriptionLocalizations?: Readonly>; acceptsArgs: boolean; requireAuth: boolean; progressMessage?: string; prepareDispatch: (rawArgs?: string) => PluginCommandCatalogDecision;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandNativeCandidate","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} {"closureHash":"02fc8b5c9bcf5902ce275b0e26f7c219025d431dbecc4d9a605062b03904df3b","declaration":"export type PluginCommandReplyOptions = Readonly<{ [PLUGIN_COMMAND_DISPATCH]?: Readonly<{ kind: \"plugin\" | \"non-plugin\"; }>;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandReplyOptions","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} -{"closureHash":"d98bf3a206f488c3dfdf725330d34a3293008fd00887c97f236094ecd5212dc4","declaration":"export type PluginCommandRuntime = Readonly<{ listNativeCandidates: (provider: string) => readonly PluginCommandNativeCandidate[]; retainNativeCatalog: (provider: string) => void;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} +{"closureHash":"e392a0cdd1b2504b72d99d2f342670333602919e6005400e69b9017da01439b2","declaration":"export type PluginCommandRuntime = Readonly<{ listNativeCandidates: (provider: string) => readonly PluginCommandNativeCandidate[]; retainNativeCatalog: (provider: string) => void;}>;","entrypoint":"plugin-command-runtime","exportName":"PluginCommandRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-command-runtime","kind":"type","recordType":"export"} {"category":null,"entrypoint":"plugin-config-runtime","importSpecifier":"openclaw/plugin-sdk/plugin-config-runtime","recordType":"module"} {"closureHash":"5f7bee4e3a0121f16c56af8da4317eab4a9b874f72e1936866231412b1299d3e","declaration":"export function mergeDeep(base: unknown, override: unknown, options?: DeepMergeOptions): unknown;","entrypoint":"plugin-config-runtime","exportName":"mergeDeep","importSpecifier":"openclaw/plugin-sdk/plugin-config-runtime","kind":"function","recordType":"export"} {"closureHash":"605ebf4cd3d4d4028a5355b3b3520b99543cf4572b64afcf346b228c1f5cfab3","declaration":"export function requireRuntimeConfig(config: OpenClawConfig, context: string): OpenClawConfig;","entrypoint":"plugin-config-runtime","exportName":"requireRuntimeConfig","importSpecifier":"openclaw/plugin-sdk/plugin-config-runtime","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":"7aeb838b8cca4b269332d981138c48fac04f71db26beb4552131a8981bded02b","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":"fd766c74118002291fa28dcd19a9677cdf9f615fe09994862f95b989dd36479a","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":"ba0ca4adfbc76bcafbbe9487387636983a2c78cf10d056c44c6a9fd9d5191914","declaration":"export type AgentHarness = AgentHarness;","entrypoint":"plugin-entry","exportName":"AgentHarness","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"d759a25775cb15d3f1804e39e98518f83b67b29ba3ab2fd84d4bf16106d9fdb9","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"} @@ -3415,16 +3415,16 @@ {"closureHash":"732f3c1b0e4942089773fad9da886d7b7bed41e7f1bb45d79c26deac15f6770b","declaration":"export type MigrationDetection = MigrationDetection;","entrypoint":"plugin-entry","exportName":"MigrationDetection","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"f40046e61c3037ec599a627e1088b8c78d1fe057d858e13cfaff1eab800e9f1f","declaration":"export type MigrationItem = MigrationItem;","entrypoint":"plugin-entry","exportName":"MigrationItem","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"934363b212df1e356365d44e0684401985228a2aeaf859aa13c840bae6e2190b","declaration":"export type MigrationPlan = MigrationPlan;","entrypoint":"plugin-entry","exportName":"MigrationPlan","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} -{"closureHash":"9b45e478bf75fdcbccfe2eab2f192bd32170cc94203bce2e58ce2e898045f7e1","declaration":"export type MigrationProviderContext = MigrationProviderContext;","entrypoint":"plugin-entry","exportName":"MigrationProviderContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} -{"closureHash":"2030cac4cf1b2b09873dca7f0f568eef400b186331d15bd28e18c7d387d56f1b","declaration":"export type MigrationProviderPlugin = MigrationProviderPlugin;","entrypoint":"plugin-entry","exportName":"MigrationProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"5f753d95db38cc2d1ce2d35f8603c1599eb108cbb8fab484e9f0f04d2eb7783a","declaration":"export type MigrationProviderContext = MigrationProviderContext;","entrypoint":"plugin-entry","exportName":"MigrationProviderContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"428402413735d12151b028f2c301ec73c0e7cce87e63e105397c626d287a8ba2","declaration":"export type MigrationProviderPlugin = MigrationProviderPlugin;","entrypoint":"plugin-entry","exportName":"MigrationProviderPlugin","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"cea9632d824ebf247f131958f8db4916ae60a37d4d5493e06f789d883dab6574","declaration":"export type MigrationSummary = MigrationSummary;","entrypoint":"plugin-entry","exportName":"MigrationSummary","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","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":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-entry","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"647007b989ba3d08c520ec68873f65f22f231b0274daf10f5d219074fd2fcba6","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":"6f784a7e4e308207c5cb6c31f8cef940c2d37117f1e0517151275790e3183a0a","declaration":"export type OpenClawPluginDefinition = OpenClawPluginDefinition;","entrypoint":"plugin-entry","exportName":"OpenClawPluginDefinition","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"ccae64ce42b52f34fc0f2adffe6202985c2c8464e3e2df19f43ae1eb0005e808","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"} @@ -3445,7 +3445,7 @@ {"closureHash":"028cd39dd470117f37aff9d199e99c7eadaa99a2af56810c3033e488587e56e2","declaration":"export type PluginAgentEventSubscriptionRegistration = PluginAgentEventSubscriptionRegistration;","entrypoint":"plugin-entry","exportName":"PluginAgentEventSubscriptionRegistration","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"3d9f3c666f1a8f37cd4fd2bf621d793b6626ce36edc96bd3922498a8f4ebfc19","declaration":"export type PluginAgentTurnPrepareEvent = PluginAgentTurnPrepareEvent;","entrypoint":"plugin-entry","exportName":"PluginAgentTurnPrepareEvent","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"dd9b818f8b19ced207493eea1b75da8a38b24a5dc4c9ac46288f9329ba06f0f3","declaration":"export type PluginAgentTurnPrepareResult = PluginAgentTurnPrepareResult;","entrypoint":"plugin-entry","exportName":"PluginAgentTurnPrepareResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} -{"closureHash":"86553d1dbbbe0b04d6a233ab33dee847c2cf5f9809032d41c5bff6bec06b78da","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"plugin-entry","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} +{"closureHash":"d9d24565b06f891a687f49672129beac9d38ccb817526ed1a6579efcb5825eb0","declaration":"export type PluginCommandContext = PluginCommandContext;","entrypoint":"plugin-entry","exportName":"PluginCommandContext","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"a50f802cdb46fb073ccba3d7b5c2a3c66c2b5aeccca3368222f9a520e66055ca","declaration":"export type PluginCommandResult = PluginCommandResult;","entrypoint":"plugin-entry","exportName":"PluginCommandResult","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"b9a7fd2bdde1d99b58227e6ff01853420fee36357c2fa5e2d9ef5fbcef11ac65","declaration":"export type PluginControlUiDescriptor = PluginControlUiDescriptor;","entrypoint":"plugin-entry","exportName":"PluginControlUiDescriptor","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} {"closureHash":"f06379ada10ce0eca4e66bdf978db2c0035e054a135dc044c6d831ac7797c08f","declaration":"export type PluginConversationBinding = PluginConversationBinding;","entrypoint":"plugin-entry","exportName":"PluginConversationBinding","importSpecifier":"openclaw/plugin-sdk/plugin-entry","kind":"type","recordType":"export"} @@ -3571,23 +3571,23 @@ {"closureHash":"4754c7eecdfeb9bec0f26a3238e6ad00ffcab19368487e8b5263e305b505a0f9","declaration":"export function createChannelInteractiveDispatcher, TResult extends { handled?: boolean; } | void = void | { handled?: boolean; }, TDispatchInteractiveKey extends PropertyKey = TInteractiveKey>(config: { channel: TChannel; interactiveKey: TInteractiveKey; dispatchInteractiveKey?: TDispatchInteractiveKey; }): (params: { data: string; dedupeId: string; ctx: ChannelInteractiveDispatchContext; respond: TContext[\"respond\"]; conversation?: Parameters[0][\"conversation\"]; onMatched?: () => Promise | void; afterInvoke?: (result: TResult) => Promise | void; }) => Promise>;","entrypoint":"plugin-runtime","exportName":"createChannelInteractiveDispatcher","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"0c3a6112c7f680fed5c23a712088c1190973f4bb8d95cae4c334952f332159ad","declaration":"export function createInteractiveConversationBindingHelpers(params: { registration: RegisteredInteractiveMetadata; senderId?: string; conversation: PluginBindingConversation; }): { requestConversationBinding: (binding?: PluginConversationBindingRequestParams) => Promise; detachConversationBinding: () => Promise<{ removed: boolean; }>; getCurrentConversationBinding: () => Promise; };","entrypoint":"plugin-runtime","exportName":"createInteractiveConversationBindingHelpers","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} {"closureHash":"fb50ceec196dacc19da2cb48813071d009170fcb1663d646715a7cfce9d6d956","declaration":"export function dispatchPluginInteractiveHandler(params: { channel: TRegistration[\"channel\"]; data: string; dedupeId?: string; onMatched?: () => Promise | void; invoke: (match: PluginInteractiveMatch) => Promise | TResult; afterInvoke?: (result: TResult) => Promise | void; }): Promise>;","entrypoint":"plugin-runtime","exportName":"dispatchPluginInteractiveHandler","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} -{"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":"983131a9d5c2971ecd7f2fb04f9d664d6854535d1abe2099baf2292014c30b23","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":"dfc8fc733f281bfbe0cc270964f0f657f17c2b97f21bc1b316aee6e9de8ff6ba","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":"c94431d2a354b35f8b50107e2be87305e6e9ca4a0611245e6e2f96098e9c746e","declaration":"export function getPluginRuntimeGatewayRequestScope(): PluginRuntimeGatewayRequestScope | undefined;","entrypoint":"plugin-runtime","exportName":"getPluginRuntimeGatewayRequestScope","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"function","recordType":"export"} +{"closureHash":"8240e99e361a089d6dacdaecb1d367e31bdce8be4d3b137a5b0065904bac11c6","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":"c53214cb523257e979580c6683f378f2f8e85c154e18c8e30ad84ae0eba28c28","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":"94e8ab88f5f42afc3ba7300ea0da6364722360be9083d89aade693b82c3e162f","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":"b376fa0f3d5efb8c41fccbd2265e044a7ffed909a9d27d6e4dd340fbe2dc11f4","declaration":"export type OpenClawPluginApi = OpenClawPluginApi;","entrypoint":"plugin-runtime","exportName":"OpenClawPluginApi","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} +{"closureHash":"2ddf03be75f0d46c8a7e1d7a3d3e70122001b190dcb361132cef2f1d23d8ddec","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"} {"closureHash":"93c034724a937bb1239a3b4a386a20ac75fbcf66229842cc4c702c3360409e4c","declaration":"export type PluginConversationBindingRequestResult = PluginConversationBindingRequestResult;","entrypoint":"plugin-runtime","exportName":"PluginConversationBindingRequestResult","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"closureHash":"590c148a7b82d14242a172bee5027840ddd5366025200e48704ef4ae8f4bf0ee","declaration":"export type PluginInteractiveRegistration = PluginInteractiveRegistration;","entrypoint":"plugin-runtime","exportName":"PluginInteractiveRegistration","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} -{"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"plugin-runtime","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"plugin-runtime","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"closureHash":"f16f4b33d2dd78e5d5da7b1aaeee0441ab35cd232b032e8a33219def7cf65f0f","declaration":"export type RuntimeLogger = RuntimeLogger;","entrypoint":"plugin-runtime","exportName":"RuntimeLogger","importSpecifier":"openclaw/plugin-sdk/plugin-runtime","kind":"type","recordType":"export"} {"category":null,"entrypoint":"provider-auth","importSpecifier":"openclaw/plugin-sdk/provider-auth","recordType":"module"} {"closureHash":"d5f31c750f1d545b3a51177ba4a008d6cf646165a8fc0c0c1328fa9999b8d6e2","declaration":"export function applyAuthProfileConfig(cfg: OpenClawConfig, params: { profileId: string; provider: string; mode: \"api_key\" | \"aws-sdk\" | \"oauth\" | \"token\"; email?: string; displayName?: string; preferProfileFirst?: boolean; }): OpenClawConfig;","entrypoint":"provider-auth","exportName":"applyAuthProfileConfig","importSpecifier":"openclaw/plugin-sdk/provider-auth","kind":"function","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":"05838eda6c65861b15c694a0b048958e357afc4576b11b037962d6dd10441a4f","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":"cfa08f8f8d1ac9f6c0801b850a7912bb383d0f232cc5e8c2072b6963115479d2","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":"de4f157ebaebeb21ad89b1aee2926820e6304298490b8234780f044ef8c6866d","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":"77e2900d5898546097a5b12745dce804bf7d0148ac06e7f46ec411584ae65561","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":"720c33e7d2fb1f65d8fd6c7949e9498fda0a1b4eb0ccf6a7635b2dce58d68d05","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":"228e8e3d4bd122168da916b923639accece60b5706df52fb437fff2b2a46f18f","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":"b066e2fa15256bc32e1fa098c5302922f0db5ccbca4a59c3331860e822c779fc","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":"b7e37ed1adcc928a9a65520f5c288051f01e873a99bcb559488de03869bb6cf7","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"} @@ -3710,11 +3710,11 @@ {"closureHash":"d75cb355b23e89fd45f6948ffa5df92b066be54cfd71e78f7db7a3419bfa7114","declaration":"export function finalizeInboundContext>(ctx: T, opts?: FinalizeInboundContextOptions): T & FinalizedMsgContext & CanonicalInboundText;","entrypoint":"reply-dispatch-runtime","exportName":"finalizeInboundContext","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"function","recordType":"export"} {"closureHash":"b3f4adaa19f9703051c85d1f567f8f01e7ba8ca4444c826d3cf9c60bf2f8dbec","declaration":"export function generateConversationLabel(params: ConversationLabelParams): Promise;","entrypoint":"reply-dispatch-runtime","exportName":"generateConversationLabel","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"function","recordType":"export"} {"closureHash":"00b39d28eb3338c9356418e4914c4d8a1bee35e3b160f12ad9bd434912055da1","declaration":"export function resolveChunkMode(cfg: OpenClawConfig | undefined, provider?: TextChunkProvider, accountId?: string | null): ChunkMode;","entrypoint":"reply-dispatch-runtime","exportName":"resolveChunkMode","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"function","recordType":"export"} -{"closureHash":"bdbc9917db0e39f393db3b92c8f86bf5f541a4418d219c7d7f336f30633ca479","declaration":"export const dispatchReplyWithBufferedBlockDispatcher: DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"dispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"const","recordType":"export"} -{"closureHash":"4254267e28d9275fa94ed751b5b732e400558718c8a0ad4c746cbf04ebfb47f2","declaration":"export const dispatchReplyWithDispatcher: DispatchReplyWithDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"dispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"const","recordType":"export"} +{"closureHash":"b005fe15911cb684770ebb5cf36e0d8bdb4d24b193f68b7a64ef62237ae4f331","declaration":"export const dispatchReplyWithBufferedBlockDispatcher: DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"dispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"const","recordType":"export"} +{"closureHash":"35a3b8028f5029839d56e6ea9ab29c8624e73eee97226e9f68d8ba9e2ee45335","declaration":"export const dispatchReplyWithDispatcher: DispatchReplyWithDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"dispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"const","recordType":"export"} {"closureHash":"6c907ee25b775b850dfb0961e1505f88e85159971379eb0e00d5eea51b284635","declaration":"export type CommandTurnContext = CommandTurnContext;","entrypoint":"reply-dispatch-runtime","exportName":"CommandTurnContext","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} -{"closureHash":"8bc39626b8ceb9b425258f71d21c4b444c43d300466b4ce07bd11767b58e032e","declaration":"export type DispatchReplyWithBufferedBlockDispatcher = DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"DispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} -{"closureHash":"aac7b6b4b06544484a628bfa599b41958bc1e5fe08b0b7497efba6a6a3b75ef0","declaration":"export type DispatchReplyWithDispatcher = DispatchReplyWithDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"DispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} +{"closureHash":"ec6f1b3e0add32cdc6dd932ada77822229f2289df9c0098ce287416cebd46239","declaration":"export type DispatchReplyWithBufferedBlockDispatcher = DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"DispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} +{"closureHash":"b0bc8b79870a2e908bdaeea83275165162edabdc3551e1dc2518ed9493c5f9f6","declaration":"export type DispatchReplyWithDispatcher = DispatchReplyWithDispatcher;","entrypoint":"reply-dispatch-runtime","exportName":"DispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} {"closureHash":"0d3bf245385d3b70f6d85138ad89f9bbe9c43df378b27c18c6f8168ad7caec93","declaration":"export type ReplyPayload = ReplyPayload;","entrypoint":"reply-dispatch-runtime","exportName":"ReplyPayload","importSpecifier":"openclaw/plugin-sdk/reply-dispatch-runtime","kind":"type","recordType":"export"} {"category":null,"entrypoint":"reply-history","importSpecifier":"openclaw/plugin-sdk/reply-history","recordType":"module"} {"closureHash":"e903bc1c38ce4fc1b15cec63e7355300c4ce71783fc766da7cf2dd18a9de5fc7","declaration":"export function buildHistoryContext(params: { historyText: string; currentMessage: string; lineBreak?: string; }): string;","entrypoint":"reply-history","exportName":"buildHistoryContext","importSpecifier":"openclaw/plugin-sdk/reply-history","kind":"function","recordType":"export"} @@ -3754,7 +3754,7 @@ {"closureHash":"c90d66db17a08901fd6fc291a7a6fec14c9060a9c893ff49800c3f61684825ae","declaration":"export function markReplyPayloadAsTtsSupplement(payload: T, spokenText?: string, options?: { visibleTextAlreadyDelivered?: boolean; }): T;","entrypoint":"reply-payload","exportName":"markReplyPayloadAsTtsSupplement","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"b76433199fcc1493fd37431679490ddff5bb420e2dc9d2176e6cecdc467b5dbc","declaration":"export function normalizeOutboundReplyPayload(payload: Record): OutboundReplyPayload;","entrypoint":"reply-payload","exportName":"normalizeOutboundReplyPayload","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"2159515375e4d985a4c3b4edc9468c47c758c4766f7172921c299da5722948a8","declaration":"export function resolveOutboundMediaUrls(payload: { mediaUrls?: string[]; mediaUrl?: string; }): string[];","entrypoint":"reply-payload","exportName":"resolveOutboundMediaUrls","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} -{"closureHash":"7467ff547ab7f4c59d19aa621070e890418338fcb8d9c7ddf6d1067b983d53c9","declaration":"export function resolvePayloadMediaUrls(payload: SendPayloadContext[\"payload\"]): string[];","entrypoint":"reply-payload","exportName":"resolvePayloadMediaUrls","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} +{"closureHash":"48d7444cc8dbe2c4c8534a62576f159f89d1d03ef19928def7a97d690047282c","declaration":"export function resolvePayloadMediaUrls(payload: SendPayloadContext[\"payload\"]): string[];","entrypoint":"reply-payload","exportName":"resolvePayloadMediaUrls","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"1073df685a1e9010005f4f843237b4abf7013b60032e6018f83498bedfe6ff2f","declaration":"export function resolveSendableOutboundReplyParts(payload: { text?: string; mediaUrls?: string[]; mediaUrl?: string; }, options?: { text?: string; }): SendableOutboundReplyParts;","entrypoint":"reply-payload","exportName":"resolveSendableOutboundReplyParts","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"dba4f4c9acefc2aad936ac9376adc5454752fd598df7550bbf632d066ed479ec","declaration":"export function resolveTextChunksWithFallback(text: string, chunks: readonly string[]): string[];","entrypoint":"reply-payload","exportName":"resolveTextChunksWithFallback","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"919a16b311191b73381541ef430971c173e26aa49864b98385bb597416e382dc","declaration":"export function sendMediaWithLeadingCaption(params: { mediaUrls: string[]; caption: string; send: (payload: { mediaUrl: string; caption?: string; }) => Promise; onError?: (params: { error: unknown; mediaUrl: string; caption?: string; index: number; isFirst: boolean; }) => Promise | void; }): Promise;","entrypoint":"reply-payload","exportName":"sendMediaWithLeadingCaption","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} @@ -3763,7 +3763,7 @@ {"closureHash":"e065d1201ce18074d97ec09c1bf3a323c728b17d47e1693b2db048733da34ce0","declaration":"export function sendPayloadMediaSequenceOrFallback(params: { text: string; mediaUrls: readonly string[]; send: (input: { text: string; mediaUrl: string; index: number; isFirst: boolean; }) => Promise; onResult?: (result: TResult) => Promise | void; fallbackResult: TResult; sendNoMedia?: () => Promise; }): Promise;","entrypoint":"reply-payload","exportName":"sendPayloadMediaSequenceOrFallback","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"9039ce5e0bba487d39dfa0317ccf466df80617b57b5f427538a2b045eaa7ce98","declaration":"export function sendPayloadTextChunkSequence(params: { chunks: readonly string[]; send: (input: { text: string; index: number; isFirst: boolean; }) => Promise; onResult?: (result: TResult) => Promise | void; }): Promise;","entrypoint":"reply-payload","exportName":"sendPayloadTextChunkSequence","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"66e032de018e69a56047bcc2682a2372c1c22c688d3c4bef711a83d1ffe37982","declaration":"export function sendPayloadWithChunkedTextAndMedia(params: { ctx: TContext; textChunkLimit?: number; chunker?: ((text: string, limit: number) => string[]) | null; sendText: (ctx: TContext & { text: string; }) => Promise; sendMedia: (ctx: TContext & { text: string; mediaUrl: string; }) => Promise; emptyResult: TResult; onResult?: (result: TResult) => Promise | void; }): Promise;","entrypoint":"reply-payload","exportName":"sendPayloadWithChunkedTextAndMedia","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} -{"closureHash":"3931b16c661ac4d1c15e6ff7160b410c8f896f989d943a08ab01ebca5f2ba41b","declaration":"export function sendTextMediaPayload(params: { channel: string; ctx: SendPayloadContext; adapter: SendPayloadAdapter; }): Promise;","entrypoint":"reply-payload","exportName":"sendTextMediaPayload","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} +{"closureHash":"84956ae8a5563ee25c7f9daa13e1976760fbd4604266eb9bc75785b2ac71a174","declaration":"export function sendTextMediaPayload(params: { channel: string; ctx: SendPayloadContext; adapter: SendPayloadAdapter; }): Promise;","entrypoint":"reply-payload","exportName":"sendTextMediaPayload","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"function","recordType":"export"} {"closureHash":"181cd40dac0b97cf91b875226d8e384dae2f51636d1dadd75f1ce4f2f86a6079","declaration":"export const FAST_MODE_AUTO_PROGRESS_KIND: \"fast-mode-auto\";","entrypoint":"reply-payload","exportName":"FAST_MODE_AUTO_PROGRESS_KIND","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"const","recordType":"export"} {"closureHash":"6bde9e2d58649a5aa7ca7e578035795ed7616fc63c0bd841ba0788caa2917858","declaration":"export type MediaPayload = MediaPayload;","entrypoint":"reply-payload","exportName":"MediaPayload","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"type","recordType":"export"} {"closureHash":"1bd087a11e0232ac000706a862ca19461bd408cc3be539afc86e87edb5b30edd","declaration":"export type MediaPayloadInput = MediaPayloadInput;","entrypoint":"reply-payload","exportName":"MediaPayloadInput","importSpecifier":"openclaw/plugin-sdk/reply-payload","kind":"type","recordType":"export"} @@ -3778,15 +3778,15 @@ {"closureHash":"931f964456bbe0c812c9b89c58e49fb53165100b03ad06b83e19c2dcefbf7925","declaration":"export function chunkText(text: string, limit: number): string[];","entrypoint":"reply-runtime","exportName":"chunkText","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"1a1372e0024b162bf51e36c9d85157d67b2bf185b82a704a85eb9b3b1999a1ba","declaration":"export function chunkTextWithMode(text: string, limit: number, mode: ChunkMode): string[];","entrypoint":"reply-runtime","exportName":"chunkTextWithMode","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"d2a3f9dd1ffc16941bb39360012138d3a3cbcf5e8beb08106182831b1c269054","declaration":"export function createInboundDebouncer(params: InboundDebounceCreateParams): { enqueue: (item: T) => Promise; flushKey: (key: string) => Promise; cancelKey: (key: string) => boolean; drain: () => Promise; };","entrypoint":"reply-runtime","exportName":"createInboundDebouncer","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"a29840f2fa36fb88ccf967b5b3a1e6a7d3a113310ad63daa878dd907bb1fe316","declaration":"export function createReplyDispatcher(options: ReplyDispatcherOptions): ReplyDispatcher;","entrypoint":"reply-runtime","exportName":"createReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"2e17e0e3d7d0cb9f2c28eac997b6ad209055aa9865de07590403f75bab059ffc","declaration":"export function createReplyDispatcherWithTyping(options: ReplyDispatcherWithTypingOptions): ReplyDispatcherWithTypingResult;","entrypoint":"reply-runtime","exportName":"createReplyDispatcherWithTyping","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"05df6b3f4716e573dc03c163d54553e60bfa026090f3f399af99254222a4b41f","declaration":"export function createReplyDispatcher(options: ReplyDispatcherOptions): ReplyDispatcher;","entrypoint":"reply-runtime","exportName":"createReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"f56338c8df5274524ec7bda5f9532771e4cd7479948057a055a0120abe94a873","declaration":"export function createReplyDispatcherWithTyping(options: ReplyDispatcherWithTypingOptions): ReplyDispatcherWithTypingResult;","entrypoint":"reply-runtime","exportName":"createReplyDispatcherWithTyping","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"0278a79e0d38060a68e7a421fe438d438964fd3516146c2361bdb771e22bad8c","declaration":"export function createReplyReferencePlanner(options: { replyToMode: ReplyToMode; existingId?: string; startId?: string; allowReference?: boolean; hasReplied?: boolean; }): ReplyReferencePlanner;","entrypoint":"reply-runtime","exportName":"createReplyReferencePlanner","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"246e10fe145e9c45e1bd6da2b0b6322ad5cb3841a6b5542fe552eb767ecf45a6","declaration":"export function dispatchInboundMessage(params: { ctx: MsgContext | FinalizedMsgContext; cfg: OpenClawConfig; dispatcher: ReplyDispatcher; toolsAllow?: string[]; replyOptions?: InternalDispatchReplyOptions; replyResolver?: InternalGetReplyFromConfig; onSessionMetadataChanges?: (changes: CommandSessionMetadataChange[]) => void; replyPayloadRunState?: ReplyPayloadRunState; outboundHooks?: \"enabled\" | \"disabled\"; onSettled?: () => void | Promise; }): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessage","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"7e381c648547325fa1411a95399241208425027e0146ec663b8457f24dc2a33d","declaration":"export function dispatchInboundMessageWithBufferedDispatcher(params: BufferedInboundDispatcherParams): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessageWithBufferedDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"ceaca0046c6cb3397b5aeacfa2d3108cbd206c67c693927c32208b81311b3cfb","declaration":"export function dispatchInboundMessageWithDispatcher(params: { ctx: MsgContext | FinalizedMsgContext; cfg: OpenClawConfig; dispatcherOptions: ReplyDispatcherOptions; toolsAllow?: string[]; replyOptions?: InternalDispatchReplyOptions; replyResolver?: InternalGetReplyFromConfig; }): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessageWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"c5884581813bbb992b581624312ec161c5818ffed7c277cbfeaf33e915a5e101","declaration":"export function dispatchInboundMessage(params: { ctx: MsgContext | FinalizedMsgContext; cfg: OpenClawConfig; dispatcher: ReplyDispatcher; toolsAllow?: string[]; replyOptions?: InternalDispatchReplyOptions; replyResolver?: InternalGetReplyFromConfig; onSessionMetadataChanges?: (changes: CommandSessionMetadataChange[]) => void; replyPayloadRunState?: ReplyPayloadRunState; outboundHooks?: \"enabled\" | \"disabled\"; onSettled?: () => void | Promise; }): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessage","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"7f31a6175d7a6fe7e6c0adced6151ed39ac9ace50c2fcd44bbe03251f65434eb","declaration":"export function dispatchInboundMessageWithBufferedDispatcher(params: BufferedInboundDispatcherParams): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessageWithBufferedDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"b3077ec48ddca7dfaab7bb06b1a8108d59e00066fa14f5a8a29be46dffe9d461","declaration":"export function dispatchInboundMessageWithDispatcher(params: { ctx: MsgContext | FinalizedMsgContext; cfg: OpenClawConfig; dispatcherOptions: ReplyDispatcherOptions; toolsAllow?: string[]; replyOptions?: InternalDispatchReplyOptions; replyResolver?: InternalGetReplyFromConfig; }): Promise;","entrypoint":"reply-runtime","exportName":"dispatchInboundMessageWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"d75cb355b23e89fd45f6948ffa5df92b066be54cfd71e78f7db7a3419bfa7114","declaration":"export function finalizeInboundContext>(ctx: T, opts?: FinalizeInboundContextOptions): T & FinalizedMsgContext & CanonicalInboundText;","entrypoint":"reply-runtime","exportName":"finalizeInboundContext","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"b3f4adaa19f9703051c85d1f567f8f01e7ba8ca4444c826d3cf9c60bf2f8dbec","declaration":"export function generateConversationLabel(params: ConversationLabelParams): Promise;","entrypoint":"reply-runtime","exportName":"generateConversationLabel","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"e2aa6fe2024c51101e29a70d1fbdc9b35ef7f70990b18955f4de64f4ab2d4a43","declaration":"export function getReplyFromConfig(ctx: MsgContext, opts?: GetReplyOptions, configOverride?: OpenClawConfig): Promise;","entrypoint":"reply-runtime","exportName":"getReplyFromConfig","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"00ef6d967920fab56b14e7501633197e7c735b7d6c45454777dd13d1516fdc31","declaration":"export function getReplyFromConfig(ctx: MsgContext, opts?: GetReplyOptions, configOverride?: OpenClawConfig): Promise;","entrypoint":"reply-runtime","exportName":"getReplyFromConfig","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"bb9481f2e5ccbae9b15c55081812cde0775fd240bc6c71770778d6db8d6c4a2d","declaration":"export function isAbortRequestText(text?: string, options?: CommandNormalizeOptions): boolean;","entrypoint":"reply-runtime","exportName":"isAbortRequestText","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"5db5d6c2dc280183c8c2ad484483dbd65275a6ef5488cb3c25dce017e871b6c2","declaration":"export function isBtwRequestText(text?: string, options?: CommandNormalizeOptions): boolean;","entrypoint":"reply-runtime","exportName":"isBtwRequestText","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"413880c53d03b5799fd79633b5f24dd7d5076976535b98550ddaac121b00d700","declaration":"export function isSilentReplyText(text: string | undefined, token?: string): boolean;","entrypoint":"reply-runtime","exportName":"isSilentReplyText","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} @@ -3798,27 +3798,27 @@ {"closureHash":"2efbdd6106ce44c70e3e5b00d03d5740a66865524dc6472aae3c57f6549651cf","declaration":"export function resolveHeartbeatReplyPayload(replyResult: ReplyPayload | ReplyPayload[] | undefined): ReplyPayload | undefined;","entrypoint":"reply-runtime","exportName":"resolveHeartbeatReplyPayload","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"de5421121cb891a9e8a177e3ac3bc58db3c33e65b48c3c04fb3895f0eef33d38","declaration":"export function resolveInboundDebounceMs(params: { cfg: OpenClawConfig; channel: string; overrideMs?: number; }): number;","entrypoint":"reply-runtime","exportName":"resolveInboundDebounceMs","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"80ab86bdb3bae25aeca8d2bf200cd15375058628ba120769abe30b7db22b90cb","declaration":"export function resolveTextChunkLimit(cfg: OpenClawConfig | undefined, provider?: TextChunkProvider, accountId?: string | null, opts?: { fallbackLimit?: number; }): number;","entrypoint":"reply-runtime","exportName":"resolveTextChunkLimit","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} -{"closureHash":"ef1dac8a25fdddee3b3e357b35191a20bf6367fdab18b9d48be8fb781510c9ea","declaration":"export function settleReplyDispatcher(params: { dispatcher: ReplyDispatcher; onSettled?: () => void | Promise; }): Promise;","entrypoint":"reply-runtime","exportName":"settleReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} +{"closureHash":"67f29c21cdb41d012c59a9c06249d5f611861862d91f9fb81393f8ef2cc1e2a8","declaration":"export function settleReplyDispatcher(params: { dispatcher: ReplyDispatcher; onSettled?: () => void | Promise; }): Promise;","entrypoint":"reply-runtime","exportName":"settleReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"90a6fed932dc5581f17306fefe9bc84995351f64d896f1441a74f5b29e56f395","declaration":"export function stripHeartbeatToken(raw?: string, opts?: { mode?: StripHeartbeatMode; maxAckChars?: number; }): { shouldSkip: boolean; text: string; didStrip: boolean; };","entrypoint":"reply-runtime","exportName":"stripHeartbeatToken","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"function","recordType":"export"} {"closureHash":"90900413086ad14f8312196e86edea68fb2a6cbad3faeef9be71153b578b2bc1","declaration":"export const DEFAULT_HEARTBEAT_ACK_MAX_CHARS: 300;","entrypoint":"reply-runtime","exportName":"DEFAULT_HEARTBEAT_ACK_MAX_CHARS","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} {"closureHash":"be781caf196c49db72b18eaf346d967c09cc0fe0c410496f2bfc1bf2f6f8eef7","declaration":"export const HEARTBEAT_PROMPT: \"Follow the heartbeat monitor scratch context when provided. Recurring tasks are automations; create or change their schedules with the automations tool, not heartbeat scratch. Do not infer or repeat old tasks from prior chats. If nothing needs attention, reply HEARTBEAT_OK.\";","entrypoint":"reply-runtime","exportName":"HEARTBEAT_PROMPT","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} {"closureHash":"d6230a363d069736f57476bc7371b93fe8f68f57a4edc3bdff025c7669629743","declaration":"export const HEARTBEAT_TOKEN: \"HEARTBEAT_OK\";","entrypoint":"reply-runtime","exportName":"HEARTBEAT_TOKEN","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} {"closureHash":"c8d9faa79ecc7382a0a292d949fea76b3ee2a6308b0fd7d87da84d7847ed805b","declaration":"export const SILENT_REPLY_TOKEN: \"NO_REPLY\";","entrypoint":"reply-runtime","exportName":"SILENT_REPLY_TOKEN","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} -{"closureHash":"bdbc9917db0e39f393db3b92c8f86bf5f541a4418d219c7d7f336f30633ca479","declaration":"export const dispatchReplyWithBufferedBlockDispatcher: DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-runtime","exportName":"dispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} -{"closureHash":"4254267e28d9275fa94ed751b5b732e400558718c8a0ad4c746cbf04ebfb47f2","declaration":"export const dispatchReplyWithDispatcher: DispatchReplyWithDispatcher;","entrypoint":"reply-runtime","exportName":"dispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} +{"closureHash":"b005fe15911cb684770ebb5cf36e0d8bdb4d24b193f68b7a64ef62237ae4f331","declaration":"export const dispatchReplyWithBufferedBlockDispatcher: DispatchReplyWithBufferedBlockDispatcher;","entrypoint":"reply-runtime","exportName":"dispatchReplyWithBufferedBlockDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} +{"closureHash":"35a3b8028f5029839d56e6ea9ab29c8624e73eee97226e9f68d8ba9e2ee45335","declaration":"export const dispatchReplyWithDispatcher: DispatchReplyWithDispatcher;","entrypoint":"reply-runtime","exportName":"dispatchReplyWithDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"const","recordType":"export"} {"closureHash":"637e2c34a20cf4a423372af22cd046bde2dd8aebc042835882f9cc15cdde8572","declaration":"export type BlockReplyContext = BlockReplyContext;","entrypoint":"reply-runtime","exportName":"BlockReplyContext","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"abd46ad532e63ff006c75f1e73913aaefe11578e4ba7237ca7683526cae150bd","declaration":"export type ChannelStructuredContextEntry = ChannelStructuredContextEntry;","entrypoint":"reply-runtime","exportName":"ChannelStructuredContextEntry","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"4c544030d69a87c7592778a4063380509d30ed980ea58d45eb08bb7d34803166","declaration":"export type ChunkMode = ChunkMode;","entrypoint":"reply-runtime","exportName":"ChunkMode","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"6c907ee25b775b850dfb0961e1505f88e85159971379eb0e00d5eea51b284635","declaration":"export type CommandTurnContext = CommandTurnContext;","entrypoint":"reply-runtime","exportName":"CommandTurnContext","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"64c5a26b9f26819ed1f3b6d9fc42f237a42e0c452b0465e8934fe5a647a7d7ee","declaration":"export type ConversationLabelParams = ConversationLabelParams;","entrypoint":"reply-runtime","exportName":"ConversationLabelParams","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"6a0c40c48573373ed610ee26d100a0e36d57d6783b8330ab86cb62540f90af5b","declaration":"export type FinalizedMsgContext = FinalizedMsgContext;","entrypoint":"reply-runtime","exportName":"FinalizedMsgContext","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} -{"closureHash":"85ed3fe4c667faacac8fe439abc9a22bdd39af734ca2ba3e0ebfb45e14c9e61c","declaration":"export type GetReplyOptions = GetReplyOptions;","entrypoint":"reply-runtime","exportName":"GetReplyOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} +{"closureHash":"91d692eb22e421d1766f539293e83c51322a5f52451a97d612fb6a2d41f5006c","declaration":"export type GetReplyOptions = GetReplyOptions;","entrypoint":"reply-runtime","exportName":"GetReplyOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"736871c9e9023147d056eb727db94e0a32c54feb199e433f4051f16d9055a823","declaration":"export type MsgContext = MsgContext;","entrypoint":"reply-runtime","exportName":"MsgContext","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"ad76450daee096e3e34c580699444b2282d097b933d298b75863fe3c2605d9ce","declaration":"export type ReplyDispatchBeforeDeliverOptions = ReplyDispatchBeforeDeliverOptions;","entrypoint":"reply-runtime","exportName":"ReplyDispatchBeforeDeliverOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"bdf80393f17af29918794f79f532906f2cbaf3e6f10aea84fac884be7b38e049","declaration":"export type ReplyDispatchKind = ReplyDispatchKind;","entrypoint":"reply-runtime","exportName":"ReplyDispatchKind","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} -{"closureHash":"cf5a38e362470557b2ec88b29df3080c3d671646f0ad60e50b22a257cb5d1c30","declaration":"export type ReplyDispatcher = ReplyDispatcher;","entrypoint":"reply-runtime","exportName":"ReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} -{"closureHash":"1e1eefc223747ef70e024a4cada6f2584ebbf1634ac22b43a21a6b06438bb6bb","declaration":"export type ReplyDispatcherOptions = ReplyDispatcherOptions;","entrypoint":"reply-runtime","exportName":"ReplyDispatcherOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} -{"closureHash":"be97bc5d9c757d1c2f13d13b82d4b168b8ae6218d2e16e8caecb7e65536ae95f","declaration":"export type ReplyDispatcherWithTypingOptions = ReplyDispatcherWithTypingOptions;","entrypoint":"reply-runtime","exportName":"ReplyDispatcherWithTypingOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} +{"closureHash":"ecdbcbf338c7af8ad729a4aedeb322dcfe1d01636697474dd9a9feced22872f2","declaration":"export type ReplyDispatcher = ReplyDispatcher;","entrypoint":"reply-runtime","exportName":"ReplyDispatcher","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} +{"closureHash":"84b34ccb48c6e6be190055b0cca242fc69fe942ea5be550256a23427d4ec7985","declaration":"export type ReplyDispatcherOptions = ReplyDispatcherOptions;","entrypoint":"reply-runtime","exportName":"ReplyDispatcherOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} +{"closureHash":"454e251b778de63631fe9b5945d138908c075ba11ac6f705dc769fd01d4cf495","declaration":"export type ReplyDispatcherWithTypingOptions = ReplyDispatcherWithTypingOptions;","entrypoint":"reply-runtime","exportName":"ReplyDispatcherWithTypingOptions","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"a93f05553638f64034be6dffdee77227ba28f46459ec95e6df2521e3aca55bfd","declaration":"export type ReplyFollowupAdmissionBarrierTimeoutPolicy = ReplyFollowupAdmissionBarrierTimeoutPolicy;","entrypoint":"reply-runtime","exportName":"ReplyFollowupAdmissionBarrierTimeoutPolicy","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"0d3bf245385d3b70f6d85138ad89f9bbe9c43df378b27c18c6f8168ad7caec93","declaration":"export type ReplyPayload = ReplyPayload;","entrypoint":"reply-runtime","exportName":"ReplyPayload","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} {"closureHash":"abf24938da5bcaf723794c1b4cdd2d0fcb6697df4cd49898bcccec19cdff77b5","declaration":"export type SourceReplyDeliveryMode = SourceReplyDeliveryMode;","entrypoint":"reply-runtime","exportName":"SourceReplyDeliveryMode","importSpecifier":"openclaw/plugin-sdk/reply-runtime","kind":"type","recordType":"export"} @@ -3923,7 +3923,7 @@ {"closureHash":"47c7a11095835696862fe7b72fccf28736af6308347543c26b5b2f538d76860b","declaration":"export const GROUP_POLICY_BLOCKED_LABEL: { readonly group: \"group messages\"; readonly guild: \"guild messages\"; readonly room: \"room messages\"; readonly channel: \"channel messages\"; readonly space: \"space messages\";};","entrypoint":"runtime-group-policy","exportName":"GROUP_POLICY_BLOCKED_LABEL","importSpecifier":"openclaw/plugin-sdk/runtime-group-policy","kind":"const","recordType":"export"} {"category":"runtime","entrypoint":"runtime-store","importSpecifier":"openclaw/plugin-sdk/runtime-store","recordType":"module"} {"closureHash":"e11d2c2694b927c79b6e07789be6bb56269d5ef1ec95b395a6e9c46f43883cbc","declaration":"export function createPluginRuntimeStore(errorMessage: string): { setRuntime: (next: T) => void; clearRuntime: () => void; tryGetRuntime: () => T | null; getRuntime: () => T; };\nexport function createPluginRuntimeStore(options: PluginRuntimeStoreOptions): { setRuntime: (next: T) => void; clearRuntime: () => void; tryGetRuntime: () => T | null; getRuntime: () => T; };","entrypoint":"runtime-store","exportName":"createPluginRuntimeStore","importSpecifier":"openclaw/plugin-sdk/runtime-store","kind":"function","recordType":"export"} -{"closureHash":"4180509522e17f8afdf5014bc51f5601952dfa403503e66f8f53e92b0c6ddd45","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"runtime-store","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/runtime-store","kind":"type","recordType":"export"} +{"closureHash":"b94637421f524b48f7e497e449491475a2cc35f3d6dc43bdf5274b401b9424b0","declaration":"export type PluginRuntime = PluginRuntime;","entrypoint":"runtime-store","exportName":"PluginRuntime","importSpecifier":"openclaw/plugin-sdk/runtime-store","kind":"type","recordType":"export"} {"category":null,"entrypoint":"secret-file","importSpecifier":"openclaw/plugin-sdk/secret-file","recordType":"module"} {"closureHash":null,"declaration":"export function createSecretFileAtomic(params: SecretFileWriteParams): Promise;","entrypoint":"secret-file","exportName":"createSecretFileAtomic","importSpecifier":"openclaw/plugin-sdk/secret-file","kind":"function","recordType":"export"} {"closureHash":null,"declaration":"export function readSecretFile(filePath: string, label: string, options?: SecretFileReadOptions): Promise;","entrypoint":"secret-file","exportName":"readSecretFile","importSpecifier":"openclaw/plugin-sdk/secret-file","kind":"function","recordType":"export"} @@ -4034,8 +4034,8 @@ {"closureHash":"a7a32cdc228b5a4b027448fe2e79e332d7b5c5ff50f2afdcb9684bf8eb3e1fce","declaration":"export function deleteSessionUpstreamLink(sessionKey: string, agentId: string, options?: OpenClawStateDatabaseOptions): void;","entrypoint":"session-catalog","exportName":"deleteSessionUpstreamLink","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} {"closureHash":"194cb8ed04679bd319517a0e228373ac6da06736200610a11a4d274339c92f87","declaration":"export function importSessionCatalogHistory(params: { catalogId: string; threadId: string; read: (params: { cursor?: string; limit: number; }) => Promise; sessionId: string; sessionKey: string; agentId: string; cwd?: string; config: OpenClawConfig; }): Promise;","entrypoint":"session-catalog","exportName":"importSessionCatalogHistory","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} {"closureHash":"fb9a9c6a327c81eb3ccfb3550b0d6a3c4b62d7db43f5c248d41ff2abecf0bbc2","declaration":"export function isExternalUserText(probe: SessionUpstreamProbe, text: string | undefined): boolean;","entrypoint":"session-catalog","exportName":"isExternalUserText","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} -{"closureHash":"15bc9d0efd84425cd8635834553df7844310eef660c86fe074504f9e49d3bf1a","declaration":"export function listAdoptedSessionCatalogSessions(params: { config: OpenClawConfig; pluginId: string; runtime: PluginRuntime; sessionEntries?: SessionCatalogEntrySnapshot; sourceFromEntry: (entry: SessionCatalogEntry) => SessionCatalogAdoptedSource | undefined; }): Map;","entrypoint":"session-catalog","exportName":"listAdoptedSessionCatalogSessions","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} -{"closureHash":"b283f2e44cb5887012afb52fae5860558d147c15b8110ceb6696d0c2cdc91ead","declaration":"export function listSessionCatalogEntries(params: { config: OpenClawConfig; runtime: PluginRuntime; sessionEntries?: SessionCatalogEntrySnapshot; }): SessionCatalogAgentEntry[];","entrypoint":"session-catalog","exportName":"listSessionCatalogEntries","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} +{"closureHash":"31fb6209d427f4ed44b9b1f7b65e7245c67bdcfdd65050106f0f4c54d38ad7a4","declaration":"export function listAdoptedSessionCatalogSessions(params: { config: OpenClawConfig; pluginId: string; runtime: PluginRuntime; sessionEntries?: SessionCatalogEntrySnapshot; sourceFromEntry: (entry: SessionCatalogEntry) => SessionCatalogAdoptedSource | undefined; }): Map;","entrypoint":"session-catalog","exportName":"listAdoptedSessionCatalogSessions","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} +{"closureHash":"35b393e6be657b65d68f37c1c7726777418db4faafff412a11bba91c44af488a","declaration":"export function listSessionCatalogEntries(params: { config: OpenClawConfig; runtime: PluginRuntime; sessionEntries?: SessionCatalogEntrySnapshot; }): SessionCatalogAgentEntry[];","entrypoint":"session-catalog","exportName":"listSessionCatalogEntries","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} {"closureHash":"bcb164340d2d8ff229bd4bb7c68126cfc44cfb171a76f363ef7c78c1cdf16f37","declaration":"export function normalizeUserText(text: string): string;","entrypoint":"session-catalog","exportName":"normalizeUserText","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} {"closureHash":"7fdcd1b85ee1e56ea8faf0afba025d3a9be0a34a8b7fda9f5f9ead922729ecdc","declaration":"export function sessionCatalogAdoptedSessionKey(prefix: string, source: string): string;","entrypoint":"session-catalog","exportName":"sessionCatalogAdoptedSessionKey","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} {"closureHash":"1e09ce9731a5b5932ec01307e90f9ab93ec0a100616a2a6f3b6416b768e5170b","declaration":"export function sessionCatalogAdoptedSourceKey(hostId: string, threadId: string): string;","entrypoint":"session-catalog","exportName":"sessionCatalogAdoptedSourceKey","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"function","recordType":"export"} @@ -4047,11 +4047,11 @@ {"closureHash":"e40a2088ce45658a9c6c15dfaa3ab4ba2edf99bafb0e2061c1e78c5b45b6a3db","declaration":"export type SessionCatalogContinueProviderParams = SessionCatalogContinueProviderParams;","entrypoint":"session-catalog","exportName":"SessionCatalogContinueProviderParams","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"9b0c210d5b64732af0b6e5917957268890aed158cf92c5dde32d0252de72f9ed","declaration":"export type SessionCatalogContinueProviderResult = SessionCatalogContinueProviderResult;","entrypoint":"session-catalog","exportName":"SessionCatalogContinueProviderResult","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"1b1c2b933616e206af0fa0f9d5f50435c041013b9699e19891c1117af32f2d42","declaration":"export type SessionCatalogDescriptor = { id: string; capabilities: { createSession?: { startTerminal?: boolean | undefined; model: string; } | undefined; openTerminal?: boolean | undefined; archive: boolean; continueSession: boolean; }; label: string;};","entrypoint":"session-catalog","exportName":"SessionCatalogDescriptor","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} -{"closureHash":"1c83786a73f37881bd0202129ee916e9d0204393584da802152ba83f5fc6d1ec","declaration":"export type SessionCatalogEntrySnapshot = SessionCatalogEntrySnapshot;","entrypoint":"session-catalog","exportName":"SessionCatalogEntrySnapshot","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} +{"closureHash":"4c50703512f3f7448ea7fe80c0938082c2c962a233848c2dfad992411ca99723","declaration":"export type SessionCatalogEntrySnapshot = SessionCatalogEntrySnapshot;","entrypoint":"session-catalog","exportName":"SessionCatalogEntrySnapshot","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"7761b7c4cccd9df93de1309fe9544bc17ed08fe87f1d833d621f335d52a78512","declaration":"export type SessionCatalogHost = { error?: { message: string; code: string; } | undefined; nextCursor?: string | undefined; nodeId?: string | undefined; sessions: { source?: string | undefined; name?: string | undefined; cwd?: string | undefined; sessionKey?: string | undefined; updatedAt?: number | undefined; createdActor?: { id?: string | undefined; label?: string | undefined; avatarUrl?: string | undefined; type: \"system\" | \"agent\" | \"human\"; } | undefined; createdAt?: number | undefined; modelProvider?: string | undefined; recencyAt?: number | undefined; cliVersion?: string | undefined; gitBranch?: string | undefined; customGroup?: string | undefined; pullRequest?: { state: \"open\" | \"draft\" | \"closed\" | \"merged\"; numbers: number[]; } | undefined; canOpenTerminal?: boolean | undefined; status: string; archived: boolean; threadId: string; canContinue: boolean; canArchive: boolean; }[]; kind: \"gateway\" | \"node\"; label: string; hostId: string; connected: boolean;};","entrypoint":"session-catalog","exportName":"SessionCatalogHost","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} -{"closureHash":"3ae60cafef5d794b990c680c062ecc88f1b99f5417d1ae873a385f2d5fed7986","declaration":"export type SessionCatalogListProviderParams = SessionCatalogListProviderParams;","entrypoint":"session-catalog","exportName":"SessionCatalogListProviderParams","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} +{"closureHash":"83641e5089f40055ca1f8ec0ce6e2d5879026106694e3d9ecdc806d660b06899","declaration":"export type SessionCatalogListProviderParams = SessionCatalogListProviderParams;","entrypoint":"session-catalog","exportName":"SessionCatalogListProviderParams","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"1b8060a038d38a9dfcdb65119d42049deeb0fa9410a78298cd29bfd9639d2721","declaration":"export type SessionCatalogLocator = { threadId: string; catalogId: string; hostId: string;};","entrypoint":"session-catalog","exportName":"SessionCatalogLocator","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} -{"closureHash":"9d28b49d7d151e159b76819d4449233ac1e279948c020d51366d83c28f9a93e6","declaration":"export type SessionCatalogProvider = SessionCatalogProvider;","entrypoint":"session-catalog","exportName":"SessionCatalogProvider","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} +{"closureHash":"1dc27982cf3b5451c7f9b18d9c6416bca9a6b7af08cbbf0eb79f36adbbb00624","declaration":"export type SessionCatalogProvider = SessionCatalogProvider;","entrypoint":"session-catalog","exportName":"SessionCatalogProvider","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"031fa3a50e41f0c7d5672cfbfefe6b5f3a74d7b09824d3a0cf386ab08bdc2ce6","declaration":"export type SessionCatalogPullRequestSummary = { state: \"open\" | \"draft\" | \"closed\" | \"merged\"; numbers: number[];};","entrypoint":"session-catalog","exportName":"SessionCatalogPullRequestSummary","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"2fddff39ee355ab2f5efa463b1a2ff1fdce03da36515d6b4d21988ea28bcd45f","declaration":"export type SessionCatalogReadProviderParams = SessionCatalogReadProviderParams;","entrypoint":"session-catalog","exportName":"SessionCatalogReadProviderParams","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"c5e0c59d9f38e43b780d5d9cbf38ebd4299694e0f52221eee8c72e3a29d27e42","declaration":"export type SessionCatalogSession = { source?: string | undefined; name?: string | undefined; cwd?: string | undefined; sessionKey?: string | undefined; updatedAt?: number | undefined; createdActor?: { id?: string | undefined; label?: string | undefined; avatarUrl?: string | undefined; type: \"system\" | \"agent\" | \"human\"; } | undefined; createdAt?: number | undefined; modelProvider?: string | undefined; recencyAt?: number | undefined; cliVersion?: string | undefined; gitBranch?: string | undefined; customGroup?: string | undefined; pullRequest?: { state: \"open\" | \"draft\" | \"closed\" | \"merged\"; numbers: number[]; } | undefined; canOpenTerminal?: boolean | undefined; status: string; archived: boolean; threadId: string; canContinue: boolean; canArchive: boolean;};","entrypoint":"session-catalog","exportName":"SessionCatalogSession","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} @@ -4072,7 +4072,7 @@ {"closureHash":"a44b9010925ddc9c4d7554ceafa282416eafee6e26ab8be298469dbf0cbf3437","declaration":"export type SessionsCatalogReadResult = { label?: string | undefined; nextCursor?: string | undefined; items: { id?: string | undefined; raw?: unknown; model?: string | undefined; text?: string | undefined; truncated?: boolean | undefined; timestamp?: string | undefined; type: \"other\" | \"reasoning\" | \"toolCall\" | \"toolResult\" | \"userMessage\" | \"agentMessage\"; }[]; threadId: string; hostId: string;};","entrypoint":"session-catalog","exportName":"SessionsCatalogReadResult","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"0fc7ea9dbb15b38e540731855c7be68450c9b0d36a1befb7b0e43912ac9aa4c7","declaration":"export type SessionsCatalogStartTerminalParams = { hostId?: string | undefined; initialMessage?: string | undefined; agentId: string; cwd: string; catalogId: string;};","entrypoint":"session-catalog","exportName":"SessionsCatalogStartTerminalParams","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} {"closureHash":"27cc66ba3875b700434f1afca5e4fac4a955e7a335c5333457f1dd3021081b73","declaration":"export type SessionsCatalogStartTerminalResult = { title?: string | undefined; agentId: string; cwd: string; sessionId: string; shell: string; confined: boolean;};","entrypoint":"session-catalog","exportName":"SessionsCatalogStartTerminalResult","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"type","recordType":"export"} -{"closureHash":"fbe86fba889484e9451891b209a438f879518ba6686a2fb6f697662c1e4321d6","declaration":"export interface SessionCatalogEntrySummary {\n sessionKey: string;\n entry: SessionEntry;\n}","entrypoint":"session-catalog","exportName":"SessionCatalogEntrySummary","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"interface","recordType":"export"} +{"closureHash":"d9cb9a1e3fba2cdf2319b39d2c303a9b1164e4a5147a118774364a49b4439996","declaration":"export interface SessionCatalogEntrySummary {\n sessionKey: string;\n entry: SessionEntry;\n}","entrypoint":"session-catalog","exportName":"SessionCatalogEntrySummary","importSpecifier":"openclaw/plugin-sdk/session-catalog","kind":"interface","recordType":"export"} {"category":null,"entrypoint":"session-discussion","importSpecifier":"openclaw/plugin-sdk/session-discussion","recordType":"module"} {"closureHash":"fa650758d30806f280a2d47d28a08fb07339a714c7f0ba649e502d94c164340c","declaration":"export function buildControlUiSessionPath(params: BuildControlUiSessionPathParams): string | null;","entrypoint":"session-discussion","exportName":"buildControlUiSessionPath","importSpecifier":"openclaw/plugin-sdk/session-discussion","kind":"function","recordType":"export"} {"closureHash":"84522ab5deee4e1f7004a5c548fa64587e077c6b47868f2b4b3166ebe0ca0fbd","declaration":"export function registerSessionDiscussionProvider(provider: SessionDiscussionProvider): void;","entrypoint":"session-discussion","exportName":"registerSessionDiscussionProvider","importSpecifier":"openclaw/plugin-sdk/session-discussion","kind":"function","recordType":"export"} @@ -4084,45 +4084,45 @@ {"closureHash":"b93a4d03f0f6c70c882f799abe5d7483228fc82e0b6eefdf7cd32c5f1b3b6dff","declaration":"export function cleanupSessionLifecycleArtifacts(params: SessionLifecycleArtifactsCleanupParams): Promise;","entrypoint":"session-store-runtime","exportName":"cleanupSessionLifecycleArtifacts","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"417fea5271d2790fae90ffe88d992f4603a4d87079647b10f70ecc2d692b8ae2","declaration":"export function clearSessionStoreCacheForTest(): void;","entrypoint":"session-store-runtime","exportName":"clearSessionStoreCacheForTest","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"8b1b9ff1eb07ceac9bef3a2752990f1ec9b2c8ec42111ed9aac302fa89abb632","declaration":"export function deleteSessionEntry(params: DeleteSessionEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"deleteSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"dc687147dac037731713e4d94896ce72ff87ad304a2c78c1941bedfecc69f2e9","declaration":"export function deliveryContextFromSession(entry?: Pick): DeliveryContext | undefined;","entrypoint":"session-store-runtime","exportName":"deliveryContextFromSession","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"b3494d3ddfe851c7d64c72f44757d7ef250c95fe4131eb04d26308c93ead4912","declaration":"export function deliveryContextFromSession(entry?: Pick): DeliveryContext | undefined;","entrypoint":"session-store-runtime","exportName":"deliveryContextFromSession","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"1df79dbfe9b89949743da0b4bd6faf7eada602f0ef532bbe8030946c9c0e0b6c","declaration":"export function evaluateSessionFreshness(params: { updatedAt: number; sessionStartedAt?: number; lastInteractionAt?: number; now: number; policy: SessionResetPolicy; }): SessionFreshness;","entrypoint":"session-store-runtime","exportName":"evaluateSessionFreshness","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"26b2c2a0e76e4f9d6b9f8a4c2a39d49ee46009f39b936f0d20e6179ac46414af","declaration":"export function formatSqliteSessionFileMarker(marker: SqliteSessionFileMarker): string;","entrypoint":"session-store-runtime","exportName":"formatSqliteSessionFileMarker","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"1a39c6fba87a24a650f04192804744ca0769bebcd0607e0119d26c6bbd8c4de1","declaration":"export function getSessionEntry(params: SessionStoreReadParams): SessionEntry | undefined;","entrypoint":"session-store-runtime","exportName":"getSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"b1403aec3c479ae19ad863a0ebe2574047267c8669ea8f22174feb9a1f64fa19","declaration":"export function getSessionEntry(params: SessionStoreReadParams): SessionEntry | undefined;","entrypoint":"session-store-runtime","exportName":"getSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"526bef7870d6d4b42c70db7e806e8cf4f2dae0ab3ae52e09c8b6698059ec3962","declaration":"export function isValidAgentHarnessSessionStoreEntry(sessionKey: string, entry: AgentHarnessSessionStoreEntry): boolean;","entrypoint":"session-store-runtime","exportName":"isValidAgentHarnessSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"77dba039f8ece6208f946291065db6be676301f2ce0a60b0e6a103dffabb1ca5","declaration":"export function listSessionEntries(params?: SessionStoreListParams & { readOnly?: boolean; }): SessionStoreEntrySummary[];","entrypoint":"session-store-runtime","exportName":"listSessionEntries","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"3bfce1de65fcde2b9e39321284e60a1f67840600583ffd9efe9f43c942894520","declaration":"export function loadSessionStore(storePath: string, options?: LoadSessionStoreOptions): Record;","entrypoint":"session-store-runtime","exportName":"loadSessionStore","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"87d6b05e543dd88c8805be24c767b8cdb56821d4be59b68f64373fe4ceff88f3","declaration":"export function listSessionEntries(params?: SessionStoreListParams & { readOnly?: boolean; }): SessionStoreEntrySummary[];","entrypoint":"session-store-runtime","exportName":"listSessionEntries","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"2c5a0e8561561fd8c6c7cf99b9f82d4dbf21986cdb10bdc5f2cfd2e842a50a43","declaration":"export function loadSessionStore(storePath: string, options?: LoadSessionStoreOptions): Record;","entrypoint":"session-store-runtime","exportName":"loadSessionStore","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"5e63dddfa33d5eea404ead98e39f72d51e3313058d00bbf2b54c2e2e22d66bfb","declaration":"export function loadTranscriptEventsSync(params: { agentId?: string; env?: NodeJS.ProcessEnv; sessionId: string; sessionKey?: string; storePath?: string; }): SessionStoreTranscriptEvent[];","entrypoint":"session-store-runtime","exportName":"loadTranscriptEventsSync","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"063ad2b83b2fe0f19667c81eb8a26232a92266421f01fbe35a65a8ec2aa6fa2b","declaration":"export function normalizeSessionDeliveryState(params?: { route?: ChannelRouteRef; context?: DeliveryContext; origin?: SessionOrigin; }): SessionDeliveryState;","entrypoint":"session-store-runtime","exportName":"normalizeSessionDeliveryState","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"a2c0f6cdcf43b5572c969fa5bb48468248ff6bd7c43c4c529062b4fd0c5d03a7","declaration":"export function parseSqliteSessionFileMarker(sessionFile: string | undefined): SqliteSessionFileMarker | undefined;","entrypoint":"session-store-runtime","exportName":"parseSqliteSessionFileMarker","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"db1ae24bf480eda3c9ac0a4386611163390d36910587a85b5823bf32624ac17d","declaration":"export function patchSessionEntry(params: PatchSessionEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"patchSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"c09496bb38a44ba5cdd168ffdbd1ac2e1ce0554636b6120e60b2fb46302e8eb9","declaration":"export function patchSessionEntry(params: PatchSessionEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"patchSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"6990f6323070ac81e92b45703433b8103574ffa255d26dedf988f9ed7bc1bfe4","declaration":"export function projectSessionDeliveryFields(delivery?: SessionDeliveryState): SessionDeliveryProjection;","entrypoint":"session-store-runtime","exportName":"projectSessionDeliveryFields","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"8122d1adf533aab275a2d793165de5c8aa90f6ee59c2b489b86c9775a2fc5cc4","declaration":"export function readAmbientTranscriptWatermark(params: ReadAmbientTranscriptWatermarkParams): AmbientTranscriptWatermark | undefined;","entrypoint":"session-store-runtime","exportName":"readAmbientTranscriptWatermark","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"72c82d479f20e3675cc502ab5184b47145bb1b65c7ac6714f1a3738fac843966","declaration":"export function readRecentUserAssistantTextForSession(params: ReadRecentSessionConversationTextParams): Promise;","entrypoint":"session-store-runtime","exportName":"readRecentUserAssistantTextForSession","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"e539adb8aaa544d4874dca14a0d0e49b3e4a671a2b14bac0519814c5d6c4489d","declaration":"export function readSessionUpdatedAt(params: SessionStoreReadParams): number | undefined;","entrypoint":"session-store-runtime","exportName":"readSessionUpdatedAt","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"8ff3f99fe45776fe7fed91609a35cc76c3aa92244731da8753aa17d737cc9d61","declaration":"export function readTranscriptStatsSync(params: { agentId?: string; env?: NodeJS.ProcessEnv; sessionId: string; sessionKey?: string; storePath?: string; }): { eventCount: number; maxSeq: number; sizeBytes: number; };","entrypoint":"session-store-runtime","exportName":"readTranscriptStatsSync","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"8860cc7cca487ef645afd28fe6586c9f37ac2993812bf43650e3c46bbc333cd7","declaration":"export function recordSessionMetaFromInbound(params: RecordInboundSessionMetaParams): Promise;","entrypoint":"session-store-runtime","exportName":"recordSessionMetaFromInbound","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"622d883ad0d76e9deeeef3d5dcdeb308978817ba06e4bf5bc7d14c94e842879f","declaration":"export function recordSessionMetaFromInbound(params: RecordInboundSessionMetaParams): Promise;","entrypoint":"session-store-runtime","exportName":"recordSessionMetaFromInbound","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"ceeab98f1e47e10da267860232dab4334f0cfdbe50b69a7a4b38d8b9d02efd4e","declaration":"export function resolveAmbientTranscriptWatermarkKey(scope: AmbientTranscriptWatermarkScope): string;","entrypoint":"session-store-runtime","exportName":"resolveAmbientTranscriptWatermarkKey","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"f2cd1c017d99f55b339ebc95594747cad3472431fc6fba1eca77855eef3b0052","declaration":"export function resolveChannelResetConfig(params: { sessionCfg?: SessionConfig; channel?: string | null; }): SessionResetConfig | undefined;","entrypoint":"session-store-runtime","exportName":"resolveChannelResetConfig","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"6333eab946eff0194867385a4660e8ca90a5444a3b211b9bc4dfbf11eda54939","declaration":"export function resolveGroupSessionKey(ctx: MsgContext): GroupKeyResolution | null;","entrypoint":"session-store-runtime","exportName":"resolveGroupSessionKey","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"15dc3eb7f4a4841b8e8029b4861c154805088836de3e3d39b8f0e5ae2ea7a0d0","declaration":"export function resolveSendPolicy(params: { cfg: OpenClawConfig; entry?: SessionEntry; sessionKey?: string; channel?: string; chatType?: SessionChatType; }): SessionSendPolicyDecision;","entrypoint":"session-store-runtime","exportName":"resolveSendPolicy","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"9306f6dcae5442f923deaf3f8e1d8c7b6e2ccf96c5fee7f548ebcf68598a9737","declaration":"export function resolveSendPolicy(params: { cfg: OpenClawConfig; entry?: SessionEntry; sessionKey?: string; channel?: string; chatType?: SessionChatType; }): SessionSendPolicyDecision;","entrypoint":"session-store-runtime","exportName":"resolveSendPolicy","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"16ed45ad9d0a709323e0675e5369b44c3268d510340ca6a63d3914c892c0301f","declaration":"export function resolveSessionFilePath(sessionId: string, entry?: { sessionFile?: string; }, options?: { agentId?: string; sessionsDir?: string; }): string;","entrypoint":"session-store-runtime","exportName":"resolveSessionFilePath","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"6b730d72b488b63c82c9dc6f3f778d3f4cab67d95d1702d894383858fd42ba5a","declaration":"export function resolveSessionKey(scope: SessionScope, ctx: MsgContext, mainKey?: string, agentId?: string): string;","entrypoint":"session-store-runtime","exportName":"resolveSessionKey","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"9e67d9e13c98ecf437dcdb42614a456d5103cbf9560f9dc3b1b82e1e54da5025","declaration":"export function resolveSessionResetPolicy(params: { sessionCfg?: SessionConfig; resetType: SessionResetType; resetOverride?: SessionResetConfig; }): SessionResetPolicy;","entrypoint":"session-store-runtime","exportName":"resolveSessionResetPolicy","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"bac2349d4b375374275c3e7cf296c6d7d4f7b8ea1037621ecaa1e56a6ae5e43f","declaration":"export function resolveSessionResetType(params: { sessionKey?: string | null; isGroup?: boolean; isThread?: boolean; }): SessionResetType;","entrypoint":"session-store-runtime","exportName":"resolveSessionResetType","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"92885132a78056b2c528a0e15882f86ace5b0803e270df27894268d0f6b80d06","declaration":"export function resolveSessionStoreBackupPaths(params: { agentId?: string; storePath: string; }): string[];","entrypoint":"session-store-runtime","exportName":"resolveSessionStoreBackupPaths","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"96cc798b10b00a3845ce0b68b5f8d58079e0bbcbc73d49e1fef7c14f8a1e8662","declaration":"export function resolveSessionStoreEntry(params: { store: Record; sessionKey: string; }): { normalizedKey: string; existing: SessionEntry | undefined; legacyKeys: string[]; };","entrypoint":"session-store-runtime","exportName":"resolveSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"44e200c88f1c1698a36f3e10a0e07b0d18aed476d70075cd749da014852ccfc0","declaration":"export function resolveSessionStoreEntry(params: { store: Record; sessionKey: string; }): { normalizedKey: string; existing: SessionEntry | undefined; legacyKeys: string[]; };","entrypoint":"session-store-runtime","exportName":"resolveSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"63521c0206e0dffb421ac669d505a6fb1043c80131c71b256936c93ff007cf66","declaration":"export function resolveStorePath(store?: string, options?: { agentId?: string; env?: NodeJS.ProcessEnv; }): string;","entrypoint":"session-store-runtime","exportName":"resolveStorePath","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"c466594f6e8084ea908ed3d24e920d5f78b1d355e2cbc5c3fd63ae2e93fca198","declaration":"export function resolveThreadFlag(params: { sessionKey?: string | null; messageThreadId?: string | number | null; threadLabel?: string | null; threadStarterBody?: string | null; parentSessionKey?: string | null; }): boolean;","entrypoint":"session-store-runtime","exportName":"resolveThreadFlag","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"47b9085be6644f8b7b2965e9a1ec3df49b9bfc1aa3430a19b8ea78904e4782a4","declaration":"export function resolveTranscriptSessionKeyBySessionId(params: { agentId?: string; env?: NodeJS.ProcessEnv; sessionId: string; storePath?: string; }): string | undefined;","entrypoint":"session-store-runtime","exportName":"resolveTranscriptSessionKeyBySessionId","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"e25a160d5b9f92ab67a0ea7f8df2985dd630060b1bc6b745ac7af30d60d1d46e","declaration":"export function sessionDeliveryChannel(entry?: Pick): string | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryChannel","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"735c21c1a16a9556eb5022bc8a6134e9bea8161fac926b95b8b91a1ff0e02314","declaration":"export function sessionDeliveryOrigin(entry?: Pick): SessionOrigin | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryOrigin","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"7d7ddfb05ee3462b1e9ada51c4808e5dabf25f3a28c9a3c548dc0452a2527e02","declaration":"export function sessionDeliveryRoute(entry?: Pick): ChannelRouteRef | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryRoute","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"72620d304becb27a6df0c391fb9087023b0d4de1df1f3a02285e71e56f8ef6e0","declaration":"export function sessionDeliveryChannel(entry?: Pick): string | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryChannel","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"cade67ee32e6465ef1f9fd298c6750fb3db08a46465a7c579f91426d6b658d73","declaration":"export function sessionDeliveryOrigin(entry?: Pick): SessionOrigin | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryOrigin","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"b0982a1aca1eeff517378c2b1cafc78f311bf64bf97a688f6a645d8f4c0b7e7f","declaration":"export function sessionDeliveryRoute(entry?: Pick): ChannelRouteRef | undefined;","entrypoint":"session-store-runtime","exportName":"sessionDeliveryRoute","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"6b168f3f8084779c1404122dacc8f0829005fe895d1d643a49314cb6d94cdb23","declaration":"export function sqliteSessionFileMarkerMatchesSession(sessionFile: string | undefined, sessionId: string): boolean;","entrypoint":"session-store-runtime","exportName":"sqliteSessionFileMarkerMatchesSession","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"aa83c816c22c55f74b77081601c9b62a22fb84d9ce7d00718997a1774b207996","declaration":"export function updateAmbientTranscriptWatermark(params: { storePath: string; sessionKey: string; key: string; messageId: string; timestampMs?: number; expectedSessionId?: string; }): Promise;","entrypoint":"session-store-runtime","exportName":"updateAmbientTranscriptWatermark","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"30ae6b59a2684ae6bed7b53bb526130eda6e55b67470402355fb1eda45739f27","declaration":"export function updateLastRoute(params: UpdateSessionLastRouteParams): Promise;","entrypoint":"session-store-runtime","exportName":"updateLastRoute","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"e7562ba70ee245368f1a0e0a72f61914e3461e0081d156dbda57b870ebf260d0","declaration":"export function updateSessionStore(storePath: string, mutator: (store: Record) => Promise | T, options?: UpdateSessionStoreOptions): Promise;","entrypoint":"session-store-runtime","exportName":"updateSessionStore","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"0c1f07ca5c09c965e5ba5ff95f564cbcb8c6b7c3e1c54e7406f7357e41de01d1","declaration":"export function updateSessionStoreEntry(params: UpdateSessionStoreEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"updateSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} -{"closureHash":"6e3aa7c888be8a44773fe1a46d52e641544573b4d873ef6d509cb0983f535fba","declaration":"export function upsertSessionEntry(params: UpsertSessionEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"upsertSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"ebab56c4c6f136eb921baa7e9375f37e30761af2305b68522a02e4be13b20a50","declaration":"export function updateAmbientTranscriptWatermark(params: { storePath: string; sessionKey: string; key: string; messageId: string; timestampMs?: number; expectedSessionId?: string; }): Promise;","entrypoint":"session-store-runtime","exportName":"updateAmbientTranscriptWatermark","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"0bcf1309b491640342630d6426478f57fd97d9bf94bdffed7b5ffabc35e58a4a","declaration":"export function updateLastRoute(params: UpdateSessionLastRouteParams): Promise;","entrypoint":"session-store-runtime","exportName":"updateLastRoute","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"ba52d8229b1dac2dba004be61f6dab8600059c6e19cee67b87ae7b189388edad","declaration":"export function updateSessionStore(storePath: string, mutator: (store: Record) => Promise | T, options?: UpdateSessionStoreOptions): Promise;","entrypoint":"session-store-runtime","exportName":"updateSessionStore","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"82051d86723a74a0d1f0a29747d0eaf99bcbe7886780415438712ed304acd106","declaration":"export function updateSessionStoreEntry(params: UpdateSessionStoreEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"updateSessionStoreEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} +{"closureHash":"db75996be6cc627fe941e8d22e8cd8cf459e4137bf786b5254aff7bc7c62d4ec","declaration":"export function upsertSessionEntry(params: UpsertSessionEntryParams): Promise;","entrypoint":"session-store-runtime","exportName":"upsertSessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"function","recordType":"export"} {"closureHash":"cbc80bcc50ae382799f13e32ce35ef0e8ab6806c498bda738fd28ff2a0e00a9f","declaration":"export type AmbientTranscriptWatermarkScope = AmbientTranscriptWatermarkScope;","entrypoint":"session-store-runtime","exportName":"AmbientTranscriptWatermarkScope","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} {"closureHash":"b774701ccf8fe09f76e5a65801ffc00f5ca6c3ee7a23be3220ef3c2c8be123a5","declaration":"export type LoadSessionStoreOptions = LoadSessionStoreOptions;","entrypoint":"session-store-runtime","exportName":"LoadSessionStoreOptions","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} {"closureHash":"7f155ebdbb2a8f8038b3533e7405fa3099db9ba458d0d67cc88a9cfcedae2363","declaration":"export type SessionRecentConversationText = SessionRecentConversationText;","entrypoint":"session-store-runtime","exportName":"SessionRecentConversationText","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} @@ -4130,7 +4130,7 @@ {"closureHash":"0f6e771971dcbf975ffc53a64338beb06bafa7bc3b07e22c84d73ed8a410a0c9","declaration":"export type SessionStoreTranscriptEvent = unknown;","entrypoint":"session-store-runtime","exportName":"SessionStoreTranscriptEvent","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} {"closureHash":"7671763eec3e8ed7d42c8a243203bfdb03cc3403323afb3eb42c870ed6f44792","declaration":"export type SqliteSessionFileMarker = SqliteSessionFileMarker;","entrypoint":"session-store-runtime","exportName":"SqliteSessionFileMarker","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} {"closureHash":"ba46f86e4bfbf3dcf6c90de75a815a61c8f41f8ac5816fc538e51a9079fbe906","declaration":"export type UpdateSessionStoreOptions = UpdateSessionStoreOptions;","entrypoint":"session-store-runtime","exportName":"UpdateSessionStoreOptions","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"type","recordType":"export"} -{"closureHash":"1c593bd58858f7edf508d664b8368439edd41b782ab9d039c981a9ddb4bfbfe1","declaration":"export interface SessionEntry extends SessionEntryCore {\n}","entrypoint":"session-store-runtime","exportName":"SessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"interface","recordType":"export"} +{"closureHash":"5aadeee94f06a040b38173dd0c52e8c087084c69065c2996be97a017880315e9","declaration":"export interface SessionEntry extends SessionEntryCore {\n}","entrypoint":"session-store-runtime","exportName":"SessionEntry","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"interface","recordType":"export"} {"closureHash":"64219c88f4fa374c95b82e72054a57c5eb1efab1dcb00e3e06bea5f6a0e05998","declaration":"export class SessionStoreAgentIdRequiredError extends Error {\n constructor();\n}","entrypoint":"session-store-runtime","exportName":"SessionStoreAgentIdRequiredError","importSpecifier":"openclaw/plugin-sdk/session-store-runtime","kind":"class","recordType":"export"} {"category":null,"entrypoint":"setup","importSpecifier":"openclaw/plugin-sdk/setup","recordType":"module"} {"closureHash":"df1f07c02750042d07dc32765d53724bce3f9788c0e3a0155cdee89fbb28d7af","declaration":"export function addWildcardAllowFrom(allowFrom?: ReadonlyArray | null): string[];","entrypoint":"setup","exportName":"addWildcardAllowFrom","importSpecifier":"openclaw/plugin-sdk/setup","kind":"function","recordType":"export"} @@ -4244,8 +4244,8 @@ {"closureHash":"a65ad008572c7f5848b7822cbf3db4c2506a620ee7f04463bfc8277e8a54b4cd","declaration":"export function resolveBrewExecutable(opts?: BrewResolutionOptions): string | undefined;","entrypoint":"setup-tools","exportName":"resolveBrewExecutable","importSpecifier":"openclaw/plugin-sdk/setup-tools","kind":"function","recordType":"export"} {"closureHash":"d186fb944c8a56ff523666d810691cd09367683ee44de37fa57bb5dfe2c852c1","declaration":"export let CONFIG_DIR: string;","entrypoint":"setup-tools","exportName":"CONFIG_DIR","importSpecifier":"openclaw/plugin-sdk/setup-tools","kind":"variable","recordType":"export"} {"category":null,"entrypoint":"skill-commands-runtime","importSpecifier":"openclaw/plugin-sdk/skill-commands-runtime","recordType":"module"} -{"closureHash":"7acf1b16b45c4b6b2775af59000108fec01a1ce9bb11c79858775a9250d86b89","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"skill-commands-runtime","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/skill-commands-runtime","kind":"function","recordType":"export"} -{"closureHash":"eb923880a12bfe51467c5d60b97ce1eaf3e1f72d662046347e7e4372ea8dca8f","declaration":"export function listSkillCommandsForWorkspace(params: { workspaceDir: string; cfg: OpenClawConfig; agentId?: string; skillFilter?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"skill-commands-runtime","exportName":"listSkillCommandsForWorkspace","importSpecifier":"openclaw/plugin-sdk/skill-commands-runtime","kind":"function","recordType":"export"} +{"closureHash":"f25d0adb9cc96e5d35ffe80451405f856d31fe2afb813a0d9891194dc890682c","declaration":"export function listSkillCommandsForAgents(params: { cfg: OpenClawConfig; agentIds?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"skill-commands-runtime","exportName":"listSkillCommandsForAgents","importSpecifier":"openclaw/plugin-sdk/skill-commands-runtime","kind":"function","recordType":"export"} +{"closureHash":"59f6c592147bf5424b1986104fd871c0ffbb813e6903cf8c34035fda2f01c9b9","declaration":"export function listSkillCommandsForWorkspace(params: { workspaceDir: string; cfg: OpenClawConfig; agentId?: string; skillFilter?: string[]; sessionEntry?: ExecSessionDefaults; sessionKey?: string; execOverrides?: ExecPolicyOverrides; }): SkillCommandSpec[];","entrypoint":"skill-commands-runtime","exportName":"listSkillCommandsForWorkspace","importSpecifier":"openclaw/plugin-sdk/skill-commands-runtime","kind":"function","recordType":"export"} {"category":"provider","entrypoint":"speech-settings","importSpecifier":"openclaw/plugin-sdk/speech-settings","recordType":"module"} {"closureHash":"d2b13ac6d85925a614c9ad8feedbb332390a3c3bef3e027e12f46b131d057481","declaration":"export function normalizeSpeechProviderId(providerId: string | undefined): SpeechProviderId | undefined;","entrypoint":"speech-settings","exportName":"normalizeSpeechProviderId","importSpecifier":"openclaw/plugin-sdk/speech-settings","kind":"function","recordType":"export"} {"closureHash":"9370e915cfd6d171d14a314cd5b19b02c0844b434ff67b85fb26a4c933602b0e","declaration":"export function normalizeTtsAutoMode(value: unknown): TtsAutoMode | undefined;","entrypoint":"speech-settings","exportName":"normalizeTtsAutoMode","importSpecifier":"openclaw/plugin-sdk/speech-settings","kind":"function","recordType":"export"} @@ -4639,16 +4639,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":"b8feaaea1648b9e535d5129273052708787bd0d3c612a339ed219012ba2c4074","declaration":"export function defineToolPlugin(definition: DefineToolPluginOptions): DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"defineToolPlugin","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"function","recordType":"export"} +{"closureHash":"296a332a70c3af6ed244dc40f665226c3fec4c68ee1e6f836ce62ff9504cbabc","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":"11b740891f678a7505617dcbd18193b20923fa24e52a728a1c933fbb42724f13","declaration":"export type DefineToolPluginOptions = DefineToolPluginOptions;","entrypoint":"tool-plugin","exportName":"DefineToolPluginOptions","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"3bab1b9df86726d39f4d3d3d9f94d1f8835cc93aed94bdc150d1b434a343bcea","declaration":"export type DefinedToolPluginEntry = DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"DefinedToolPluginEntry","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"be6e633d32ef90a0896fa3ad4081836195dfacd1a39e43f5970a6a3f2cfef282","declaration":"export type ToolPluginExecutionContext = ToolPluginExecutionContext;","entrypoint":"tool-plugin","exportName":"ToolPluginExecutionContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} -{"closureHash":"fdc66c9cbe084e4f4df2971ae295603caba55d3f9d011ce631823bdb3b2c3c85","declaration":"export type ToolPluginFactoryContext = ToolPluginFactoryContext;","entrypoint":"tool-plugin","exportName":"ToolPluginFactoryContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"6c3a1859eedd030e8f47fd172946ab37de66367752388c459eac4c3261e929e2","declaration":"export type DefineToolPluginOptions = DefineToolPluginOptions;","entrypoint":"tool-plugin","exportName":"DefineToolPluginOptions","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"dbb9e65a5f0c657542d4f2ee7a9ecc287476375dc2100984c162c2c9c00447db","declaration":"export type DefinedToolPluginEntry = DefinedToolPluginEntry;","entrypoint":"tool-plugin","exportName":"DefinedToolPluginEntry","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"724409d65bf50cf7dcf9c9031c780f03824af1a7e82c7b7024844c57260f5c34","declaration":"export type ToolPluginExecutionContext = ToolPluginExecutionContext;","entrypoint":"tool-plugin","exportName":"ToolPluginExecutionContext","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"53cee5e8cd018ab1ae19f13012dcaed6e1837f7bd01098e63ceae66ce61237fa","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":"44e6ab539ae410d88a966e7b32916b8da123e8135717d40b408095a9bc3c63b5","declaration":"export type ToolPluginToolDefinition = ToolPluginToolDefinition;","entrypoint":"tool-plugin","exportName":"ToolPluginToolDefinition","importSpecifier":"openclaw/plugin-sdk/tool-plugin","kind":"type","recordType":"export"} +{"closureHash":"5cb770b85f7a568f9563c0d6d746ab8f10bb551e61c5ee07b28683ec50a28d00","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"} @@ -4682,9 +4682,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":"cafe0449c4f72743ba5f1f4e008a9d70c749ceb4f46c5e336e23b47b5cad3e6e","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":"137a9d7b92bee027864e6b3ed9dab727b82cec93e88d72099ea796f3cba761cf","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":"7b4334de2c9e456f1e9d1f304fef4c75072e6a132553a08d60f57b226067462d","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":"081f16d31a0ae6a890fa372cde3100a3544fe95d584bbaef196009b56a60d275","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"} @@ -4702,7 +4702,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":"5e2e583b7fb4d4f5c130e01d3a7d156a2509a493b7bbd16109a2d138306f9c78","declaration":"export type RegisterWebhookPluginRouteOptions = RegisterWebhookPluginRouteOptions;","entrypoint":"webhook-ingress","exportName":"RegisterWebhookPluginRouteOptions","importSpecifier":"openclaw/plugin-sdk/webhook-ingress","kind":"type","recordType":"export"} +{"closureHash":"9357b6c5e08176f9f4416d77f22dfce793961da76bf7b88ea1b3a756be25d924","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/extensions/discord/src/monitor/agent-components.dispatch.ts b/extensions/discord/src/monitor/agent-components.dispatch.ts index 85d2cf8e959f..069ab3e823ea 100644 --- a/extensions/discord/src/monitor/agent-components.dispatch.ts +++ b/extensions/discord/src/monitor/agent-components.dispatch.ts @@ -323,6 +323,7 @@ export async function dispatchDiscordComponentEvent(params: { chunkMode: resolveChunkMode(ctx.cfg, "discord", accountId), mediaLocalRoots, kind: info.kind, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); if (result.visibleReplySent) { replyReference.markSent(); diff --git a/extensions/discord/src/monitor/message-handler.process.ts b/extensions/discord/src/monitor/message-handler.process.ts index a82023658716..ff55bc222e7a 100644 --- a/extensions/discord/src/monitor/message-handler.process.ts +++ b/extensions/discord/src/monitor/message-handler.process.ts @@ -271,7 +271,10 @@ async function processDiscordMessageInner( const deliverDiscordPayload = async ( payload: ReplyPayload, - info: { kind: ReplyDispatchKind }, + info: { + kind: ReplyDispatchKind; + bindPendingFinalDelivery?: (payload: T) => T; + }, options?: { allowFallbackOnlyToolWarning?: boolean; allowProgressBlock?: boolean; @@ -328,6 +331,7 @@ async function processDiscordMessageInner( threadBindings, mediaLocalRoots, kind: "block", + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); if (result.visibleReplySent) { replyReference.markSent(); @@ -484,6 +488,7 @@ async function processDiscordMessageInner( mediaLocalRoots, allowedMentions, kind: info.kind, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); return deliveryResult.visibleReplySent; }, @@ -542,6 +547,7 @@ async function processDiscordMessageInner( threadBindings, mediaLocalRoots, kind: info.kind, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); if (!result.visibleReplySent) { return result; diff --git a/extensions/discord/src/monitor/reply-delivery.ts b/extensions/discord/src/monitor/reply-delivery.ts index a768ac7e9314..052726677435 100644 --- a/extensions/discord/src/monitor/reply-delivery.ts +++ b/extensions/discord/src/monitor/reply-delivery.ts @@ -229,13 +229,16 @@ export async function deliverDiscordReply(params: { mediaLocalRoots?: readonly string[]; allowedMentions?: DiscordAllowedMentions; kind: "tool" | "block" | "final"; + bindPendingFinalDelivery?: (payload: T) => T; }) { void params.runtime; const delivery = resolveDiscordDeliveryOptions(params); const payloads = sanitizeDiscordFrontChannelReplyPayloads(params.replies, { kind: params.kind, - }).map(formatDiscordReasoningPayload); + }) + .map(formatDiscordReasoningPayload) + .map((payload) => params.bindPendingFinalDelivery?.(payload) ?? payload); if (payloads.length === 0) { return { visibleReplySent: false, diff --git a/extensions/discord/src/monitor/reply-safety.ts b/extensions/discord/src/monitor/reply-safety.ts index 54f7e8299b14..b450eb09ab2c 100644 --- a/extensions/discord/src/monitor/reply-safety.ts +++ b/extensions/discord/src/monitor/reply-safety.ts @@ -86,9 +86,7 @@ export function sanitizeDiscordFrontChannelReplyPayloads( : sanitizeDiscordFrontChannelText(payload.text) : payload.text; const nextPayload = - safeText === payload.text - ? payload - : ({ ...payload, text: safeText || undefined } as ReplyPayload); + safeText === payload.text ? payload : { ...payload, text: safeText || undefined }; const nextParts = resolveSendableOutboundReplyParts(nextPayload); if (!nextParts.hasContent && !hasNonTextReplyPayloadContent(nextPayload)) { continue; diff --git a/extensions/discord/src/outbound-adapter.ts b/extensions/discord/src/outbound-adapter.ts index 1ea08065a258..3afb9635728a 100644 --- a/extensions/discord/src/outbound-adapter.ts +++ b/extensions/discord/src/outbound-adapter.ts @@ -65,6 +65,7 @@ async function maybeSendDiscordWebhookText(params: { accountId?: string | null; identity?: OutboundIdentity; replyToId?: string | null; + onPlatformSendDispatch?: () => Promise; }): Promise<{ messageId: string; channelId: string } | null> { if (params.threadId == null) { return null; @@ -96,6 +97,7 @@ async function maybeSendDiscordWebhookText(params: { replyTo: params.replyToId ?? undefined, username: persona.username, avatarUrl: persona.avatarUrl, + onPlatformSendDispatch: params.onPlatformSendDispatch, }); return result; } @@ -130,6 +132,7 @@ async function resolveDiscordOutboundMessageSend(params: DiscordOutboundMessageC await params.onDeliveryResult?.(attachChannelToResult("discord", result)); } : undefined, + onPlatformSendDispatch: params.onPlatformSendDispatch, }, }; } @@ -173,16 +176,29 @@ export const discordOutbound: ChannelOutboundAdapter = { channel: "discord", sendText: async (ctx) => { if (!ctx.silent) { - const webhookResult = await maybeSendDiscordWebhookText({ - cfg: ctx.cfg, - text: ctx.text, - threadId: ctx.threadId, - accountId: ctx.accountId, - identity: ctx.identity, - replyToId: ctx.replyToId, - }).catch(() => null); - if (webhookResult) { - return webhookResult; + let webhookSelected = false; + try { + const webhookResult = await maybeSendDiscordWebhookText({ + cfg: ctx.cfg, + text: ctx.text, + threadId: ctx.threadId, + accountId: ctx.accountId, + identity: ctx.identity, + replyToId: ctx.replyToId, + onPlatformSendDispatch: ctx.onPlatformSendDispatch + ? async () => { + webhookSelected = true; + await ctx.onPlatformSendDispatch?.(); + } + : undefined, + }); + if (webhookResult) { + return webhookResult; + } + } catch (error) { + if (webhookSelected) { + throw error; + } } } const { send, target, options } = await resolveDiscordOutboundMessageSend(ctx); @@ -202,6 +218,7 @@ export const discordOutbound: ChannelOutboundAdapter = { mediaAccess: ctx.mediaAccess, mediaLocalRoots: ctx.mediaLocalRoots, mediaReadFile: ctx.mediaReadFile, + onPlatformSendDispatch: ctx.onPlatformSendDispatch, }); } const mediaOptions = { @@ -235,13 +252,14 @@ export const discordOutbound: ChannelOutboundAdapter = { } return await send(target, ctx.text, mediaOptions); }, - sendPoll: async ({ cfg, to, poll, accountId, threadId, silent }) => + sendPoll: async ({ cfg, to, poll, accountId, threadId, silent, onPlatformSendDispatch }) => await ( await loadDiscordSendRuntime() ).sendPollDiscord(resolveDiscordOutboundTarget({ to, threadId }), poll, { accountId: accountId ?? undefined, silent: silent ?? undefined, cfg, + onPlatformSendDispatch, }), }), afterDeliverPayload: async ({ cfg, target, payload, results }) => { diff --git a/extensions/discord/src/outbound-payload.ts b/extensions/discord/src/outbound-payload.ts index 7ce7c18a5ead..68803bd03687 100644 --- a/extensions/discord/src/outbound-payload.ts +++ b/extensions/discord/src/outbound-payload.ts @@ -57,6 +57,7 @@ function resolveDiscordDeliveryOptions( accountId: ctx.accountId ?? undefined, silent: ctx.silent ?? undefined, cfg: ctx.cfg, + onPlatformSendDispatch: ctx.onPlatformSendDispatch, }; } diff --git a/extensions/discord/src/send.components.ts b/extensions/discord/src/send.components.ts index edafeca01387..83ac25d54c7e 100644 --- a/extensions/discord/src/send.components.ts +++ b/extensions/discord/src/send.components.ts @@ -172,6 +172,7 @@ type DiscordComponentSendOpts = { allowedMentions?: DiscordAllowedMentions; /** Persist the concrete platform send before component bookkeeping can fail. */ onDeliveryResult?: (result: DiscordSendResult) => Promise | void; + onPlatformSendDispatch?: () => Promise; }; export function registerBuiltDiscordComponentMessage(params: { @@ -291,6 +292,7 @@ export async function sendDiscordComponentMessage( tableMode: opts.tableMode, chunkMode: opts.chunkMode, onDeliveryResult: opts.onDeliveryResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, ...(opts.suppressEmbeds === undefined ? {} : { suppressEmbeds: opts.suppressEmbeds }), }); } @@ -321,6 +323,7 @@ export async function sendDiscordComponentMessage( let result: { id: string; channel_id: string }; try { + await opts.onPlatformSendDispatch?.(); result = (await request( () => createChannelMessage<{ id: string; channel_id: string }>(rest, channelId, { diff --git a/extensions/discord/src/send.outbound.ts b/extensions/discord/src/send.outbound.ts index 0c2130a98e54..a415c8773d24 100644 --- a/extensions/discord/src/send.outbound.ts +++ b/extensions/discord/src/send.outbound.ts @@ -70,6 +70,8 @@ type DiscordSendOpts = { allowedMentions?: DiscordAllowedMentions; /** Persist each concrete platform send before any later chunk can fail. */ onDeliveryResult?: (result: DiscordSendResult) => Promise | void; + /** @internal Refresh durable custody immediately before Discord REST I/O. */ + onPlatformSendDispatch?: () => Promise; }; type DiscordClientRequest = ReturnType["request"]; @@ -92,6 +94,7 @@ async function sendDiscordThreadTextChunks(params: { suppressEmbeds?: boolean; allowedMentions?: DiscordAllowedMentions; onResult?: DiscordSendProgress; + onPlatformSendDispatch?: () => Promise; }): Promise { for (const chunk of params.chunks) { await sendDiscordText({ @@ -106,6 +109,7 @@ async function sendDiscordThreadTextChunks(params: { allowedMentions: params.allowedMentions, maxChars: params.maxChars, onResult: params.onResult, + onPlatformSendDispatch: params.onPlatformSendDispatch, }); } } @@ -238,6 +242,7 @@ export async function sendMessageDiscord( }); let threadRes: { id: string; message?: { id: string; channel_id: string } }; try { + await opts.onPlatformSendDispatch?.(); threadRes = (await request( () => createThread<{ id: string; message?: { id: string; channel_id: string } }>( @@ -309,6 +314,7 @@ export async function sendMessageDiscord( allowedMentions: opts.allowedMentions, maxChars: textLimit, onResult: reportThreadResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, }); await sendDiscordThreadTextChunks({ rest, @@ -322,6 +328,7 @@ export async function sendMessageDiscord( suppressEmbeds, allowedMentions: opts.allowedMentions, onResult: reportThreadResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, }); } else { await sendDiscordThreadTextChunks({ @@ -336,6 +343,7 @@ export async function sendMessageDiscord( suppressEmbeds, allowedMentions: opts.allowedMentions, onResult: reportThreadResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, }); } } catch (err) { @@ -391,6 +399,7 @@ export async function sendMessageDiscord( allowedMentions: opts.allowedMentions, maxChars: textLimit, onResult: reportResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, }); } else { result = await sendDiscordText({ @@ -408,6 +417,7 @@ export async function sendMessageDiscord( allowedMentions: opts.allowedMentions, maxChars: textLimit, onResult: reportResult, + onPlatformSendDispatch: opts.onPlatformSendDispatch, }); } } catch (err) { @@ -447,6 +457,7 @@ export async function sendStickerDiscord( enforce_nonce: true, ...(flags ? { flags } : {}), }; + await opts.onPlatformSendDispatch?.(); const res = (await request( () => createChannelMessage<{ id: string; channel_id: string }>(rest, channelId, { body }), "sticker", @@ -474,6 +485,7 @@ export async function sendPollDiscord( enforce_nonce: true, ...(flags ? { flags } : {}), }; + await opts.onPlatformSendDispatch?.(); const res = (await request( () => createChannelMessage<{ id: string; channel_id: string }>(rest, channelId, { body }), "poll", diff --git a/extensions/discord/src/send.shared.ts b/extensions/discord/src/send.shared.ts index 63679d52bc13..bae6f92b4bb8 100644 --- a/extensions/discord/src/send.shared.ts +++ b/extensions/discord/src/send.shared.ts @@ -325,6 +325,7 @@ type DiscordTextSendParams = { suppressEmbeds?: boolean; maxChars?: number; onResult?: DiscordSendProgress; + onPlatformSendDispatch?: () => Promise; }; async function sendDiscordText(params: DiscordTextSendParams) { @@ -343,6 +344,7 @@ async function sendDiscordText(params: DiscordTextSendParams) { suppressEmbeds, maxChars, onResult, + onPlatformSendDispatch, } = params; if (!text.trim()) { throw new Error("Message must be non-empty for Discord sends"); @@ -369,6 +371,7 @@ async function sendDiscordText(params: DiscordTextSendParams) { flags, replyTo: chunkReplyTo, }); + await onPlatformSendDispatch?.(); const result = (await request( () => createChannelMessage<{ id: string; channel_id: string }>(rest, channelId, { body }), "text", @@ -429,6 +432,7 @@ async function sendDiscordMedia(params: DiscordMediaSendParams) { suppressEmbeds, maxChars, onResult, + onPlatformSendDispatch, } = params; const media = await loadWebMedia( mediaUrl, @@ -472,6 +476,7 @@ async function sendDiscordMedia(params: DiscordMediaSendParams) { }); let res: { id: string; channel_id: string }; try { + await onPlatformSendDispatch?.(); res = (await request( () => createChannelMessage<{ id: string; channel_id: string }>(rest, channelId, { body }), "media", @@ -496,6 +501,7 @@ async function sendDiscordMedia(params: DiscordMediaSendParams) { allowedMentions, maxChars, onResult, + onPlatformSendDispatch, }); } await onResult?.(res, "media", reply?.messageId); diff --git a/extensions/discord/src/send.voice.ts b/extensions/discord/src/send.voice.ts index e28a85497054..dd5a4e6fedca 100644 --- a/extensions/discord/src/send.voice.ts +++ b/extensions/discord/src/send.voice.ts @@ -38,6 +38,7 @@ type VoiceMessageOpts = Pick< | "mediaAccess" | "mediaLocalRoots" | "mediaReadFile" + | "onPlatformSendDispatch" >; function toDiscordSendResult( @@ -122,6 +123,7 @@ export async function sendVoiceMessageDiscord( const metadata = await getVoiceMessageMetadata(oggPath); const audioBuffer = await fs.readFile(oggPath); + await opts.onPlatformSendDispatch?.(); const result = await sendDiscordVoiceMessage( rest, channelId, diff --git a/extensions/discord/src/send.webhook.ts b/extensions/discord/src/send.webhook.ts index 5e52637e8957..47da27b5ef5b 100644 --- a/extensions/discord/src/send.webhook.ts +++ b/extensions/discord/src/send.webhook.ts @@ -40,6 +40,7 @@ type DiscordWebhookSendOpts = { username?: string; avatarUrl?: string; wait?: boolean; + onPlatformSendDispatch?: () => Promise; }; function resolveWebhookExecutionUrl(params: { @@ -154,6 +155,7 @@ export async function sendWebhookMessageDiscord( try { const response = await request( async () => { + await opts.onPlatformSendDispatch?.(); const attemptResponse = await (proxyFetch ?? fetch)(url, { method: "POST", headers: { diff --git a/extensions/telegram/src/bot-message-dispatch-delivery.ts b/extensions/telegram/src/bot-message-dispatch-delivery.ts index fe2f611dab7f..f6f3766a595e 100644 --- a/extensions/telegram/src/bot-message-dispatch-delivery.ts +++ b/extensions/telegram/src/bot-message-dispatch-delivery.ts @@ -208,7 +208,10 @@ export function createTelegramDeliveryController(params: { ) { return payload; } - return { ...payload, replyToId: implicitQuoteReplyTargetId }; + return { + ...payload, + replyToId: implicitQuoteReplyTargetId, + }; }; const usesNativeTelegramQuote = (payload: ReplyPayload): boolean => params.replyQuoteText != null || @@ -223,6 +226,8 @@ export function createTelegramDeliveryController(params: { mirrorTranscript?: boolean; promptContextSequence?: TelegramPromptContextProjectionSequence; textMode?: "html"; + onPlatformSendDispatch?: () => Promise; + bindPendingFinalDelivery?: (payload: T) => T; }, ) => { if (params.isDispatchSuperseded()) { @@ -253,10 +258,13 @@ export function createTelegramDeliveryController(params: { ) : undefined, ); - const effectivePayload = withTelegramPromptContextSource( + const projectedPayload = withTelegramPromptContextSource( deliverablePayload, projectionSequence.source, ); + const effectivePayload = options?.bindPendingFinalDelivery + ? options.bindPendingFinalDelivery(projectedPayload) + : projectedPayload; const silent = options?.silent ?? (params.telegramCfg.silentErrorReplies === true && payload.isError === true); @@ -316,6 +324,7 @@ export function createTelegramDeliveryController(params: { silent, mediaLoader: params.telegramDeps.loadWebMedia, promptContextSequence: projectionSequence, + onPlatformSendDispatch: options?.onPlatformSendDispatch, ...(options?.textMode ? { textMode: options.textMode } : {}), }); if (!result.delivered) { @@ -432,6 +441,8 @@ export function createTelegramDeliveryController(params: { payload: ReplyPayload, text: string, promptContextSequence: TelegramPromptContextProjectionSequence, + onPlatformSendDispatch?: () => Promise, + bindPendingFinalDelivery?: (payload: T) => T, ): Promise => { const afterAcceptedDraft = params.draft.answerLane.stream?.hasConsumedReplyTarget?.() === true; if (payload.isError === true) { @@ -441,6 +452,8 @@ export function createTelegramDeliveryController(params: { afterAcceptedDraft, durable: true, promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, }); if (!delivered) { return { kind: "skipped" }; @@ -454,6 +467,8 @@ export function createTelegramDeliveryController(params: { afterAcceptedDraft, durable: true, promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, }); if (barLine) { await params.progress.applyCollapseSummary(barLine, postCosmeticSummaryBar); @@ -472,6 +487,8 @@ export function createTelegramDeliveryController(params: { answerPayload: ReplyPayload, text: string, buttons?: TelegramInlineButtons, + onPlatformSendDispatch?: () => Promise, + bindPendingFinalDelivery?: (payload: T) => T, ): Promise => { const transcriptFinal = await resolveCurrentTurnTranscriptFinal(); const finalText = await resolveTranscriptBackedChannelFinalText({ @@ -491,6 +508,8 @@ export function createTelegramDeliveryController(params: { answerPayload, finalText, promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, ); } else { if (isFollowUp) { @@ -506,6 +525,8 @@ export function createTelegramDeliveryController(params: { buttons, allowStream: !usesNativeTelegramQuote(answerPayload), promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, }); if (!isFollowUp && result.kind !== "skipped") { params.progress.markFinalDelivered(); diff --git a/extensions/telegram/src/bot-message-dispatch-reply.ts b/extensions/telegram/src/bot-message-dispatch-reply.ts index 9cce343fd1c3..932a45577f92 100644 --- a/extensions/telegram/src/bot-message-dispatch-reply.ts +++ b/extensions/telegram/src/bot-message-dispatch-reply.ts @@ -9,8 +9,8 @@ import { isFastModeAutoProgressPayload, isReplyPayloadNonTerminalToolErrorWarning, resolveSendableOutboundReplyParts, + type ReplyPayload, } from "openclaw/plugin-sdk/reply-payload"; -import type { ReplyPayload } from "openclaw/plugin-sdk/reply-payload"; import type { RuntimeEnv } from "openclaw/plugin-sdk/runtime-env"; import { danger } from "openclaw/plugin-sdk/runtime-env"; import type { TelegramBotDeps } from "./bot-deps.js"; @@ -105,6 +105,8 @@ export function createTelegramReplyDelivery(params: { | { promise: Promise<{ visibleReplySent: boolean }>; visibleReplySent: boolean; + onPlatformSendDispatch?: () => Promise; + bindPendingFinalDelivery?: (payload: T) => T; resolve: (result: { visibleReplySent: boolean }) => void; reject: (error: unknown) => void; } @@ -144,6 +146,8 @@ export function createTelegramReplyDelivery(params: { buffered.payload, buffered.text, resolvePayloadTelegramInlineButtons(buffered.payload), + settlement?.onPlatformSendDispatch, + settlement?.bindPendingFinalDelivery, ); if (settlement) { settlement.resolve({ @@ -271,6 +275,8 @@ export function createTelegramReplyDelivery(params: { bufferedFinalSettlement = { promise: finalization, visibleReplySent: blockDelivered, + onPlatformSendDispatch: info.onPlatformSendDispatch, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, resolve: resolveFinalization, reject: rejectFinalization, }; @@ -381,6 +387,8 @@ export function createTelegramReplyDelivery(params: { effectivePayload, segment.update.text, telegramButtons, + info.onPlatformSendDispatch, + info.bindPendingFinalDelivery, ) : await params.delivery.deliverLaneText({ laneName: segment.lane, @@ -389,6 +397,8 @@ export function createTelegramReplyDelivery(params: { infoKind: info.kind, buttons: telegramButtons, allowStream: !isDurableProgressCommentary, + onPlatformSendDispatch: info.onPlatformSendDispatch, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); if ( segment.lane === "answer" && @@ -440,6 +450,8 @@ export function createTelegramReplyDelivery(params: { : effectivePayload; delivered = await params.delivery.sendPayload(payloadWithoutReasoning, { durable: info.kind === "final", + onPlatformSendDispatch: info.onPlatformSendDispatch, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); } if (info.kind === "final" && delivered) { @@ -463,6 +475,8 @@ export function createTelegramReplyDelivery(params: { } const delivered = await params.delivery.sendPayload(effectivePayload, { durable: info.kind === "final", + onPlatformSendDispatch: info.onPlatformSendDispatch, + bindPendingFinalDelivery: info.bindPendingFinalDelivery, }); if (info.kind === "final" && delivered) { params.progress.markFinalDelivered(); diff --git a/extensions/telegram/src/bot-native-commands.ts b/extensions/telegram/src/bot-native-commands.ts index 706d3fbbc0eb..c326f6086b05 100644 --- a/extensions/telegram/src/bot-native-commands.ts +++ b/extensions/telegram/src/bot-native-commands.ts @@ -1777,7 +1777,7 @@ export const registerTelegramNativeCommands = ({ }, }, delivery: { - deliverWithProviderMessageSending: async (payload) => { + deliverWithProviderMessageSending: async (payload, info) => { if ( shouldSuppressLocalTelegramExecApprovalPrompt({ cfg: runtimeCfg, @@ -1802,6 +1802,7 @@ export const registerTelegramNativeCommands = ({ ], ...deliveryBaseOptions, silent: runtimeTelegramCfg.silentErrorReplies === true && payload.isError === true, + onPlatformSendDispatch: info.onPlatformSendDispatch, }); if (result.delivered) { deliveryState.delivered = true; diff --git a/extensions/telegram/src/bot.create-telegram-bot.test-support.ts b/extensions/telegram/src/bot.create-telegram-bot.test-support.ts index 5b683ae9e086..3e4ae74c29aa 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.test-support.ts +++ b/extensions/telegram/src/bot.create-telegram-bot.test-support.ts @@ -71,16 +71,21 @@ export function createTelegramNativeCommandTestDeps( ): { dispatchChannelInboundTurn: DispatchChannelInboundTurn } { return { dispatchChannelInboundTurn: async (plan) => { + const delivery = plan.delivery; const dispatchResult = await dispatchReply({ ctx: plan.ctxPayload, cfg: plan.cfg, dispatcherOptions: { ...plan.dispatcherOptions, deliver: - "deliverWithProviderMessageSending" in plan.delivery - ? plan.delivery.deliverWithProviderMessageSending - : plan.delivery.deliver, - onError: plan.delivery.onError, + "deliverWithProviderMessageSending" in delivery + ? (payload, info) => + delivery.deliverWithProviderMessageSending(payload, { + ...info, + onPlatformSendDispatch: info.onPlatformSendDispatch ?? (async () => undefined), + }) + : delivery.deliver, + onError: delivery.onError, }, replyOptions: plan.replyOptions, }); diff --git a/extensions/telegram/src/bot.test-helpers.ts b/extensions/telegram/src/bot.test-helpers.ts index d36c7beeb6c9..803e530d1518 100644 --- a/extensions/telegram/src/bot.test-helpers.ts +++ b/extensions/telegram/src/bot.test-helpers.ts @@ -38,7 +38,11 @@ export async function runTelegramChannelInboundEventWithHarness( cfg: plan.cfg, dispatcherOptions: { ...plan.dispatcherOptions, - deliver: plan.delivery.deliverWithProviderMessageSending, + deliver: (payload, info) => + plan.delivery.deliverWithProviderMessageSending(payload, { + ...info, + onPlatformSendDispatch: info.onPlatformSendDispatch ?? (async () => undefined), + }), onError: plan.delivery.onError, }, toolsAllow: plan.toolsAllow, diff --git a/extensions/telegram/src/bot/delivery.replies.ts b/extensions/telegram/src/bot/delivery.replies.ts index 15c88e51363c..133f8c79791c 100644 --- a/extensions/telegram/src/bot/delivery.replies.ts +++ b/extensions/telegram/src/bot/delivery.replies.ts @@ -254,6 +254,7 @@ async function deliverTextReply(params: { progress: DeliveryProgress; recordMessageId: (messageId: number) => void; quoteOnlyOnFirstChunk?: boolean; + onPlatformSendDispatch?: () => Promise; }): Promise { let firstDeliveredMessageId: number | undefined; const chunks = filterEmptyTelegramTextChunks(params.chunkText(params.text)); @@ -278,6 +279,7 @@ async function deliverTextReply(params: { markDelivered, sendChunk: async ({ chunk, isFirstChunk, replyToMessageId, replyMarkup, replyQuoteText }) => { const includeQuoteMetadata = params.quoteOnlyOnFirstChunk !== true || isFirstChunk; + await params.onPlatformSendDispatch?.(); const messageId = await sendTelegramText( params.bot, params.chatId, @@ -351,6 +353,7 @@ async function deliverMediaReply(params: { progress: DeliveryProgress; recordMessageId: (messageId: number) => void; textMode?: "html"; + onPlatformSendDispatch?: () => Promise; }): Promise<{ firstDeliveredMessageId?: number; visibleFallbackText?: string }> { let firstDeliveredMessageId: number | undefined; let visibleFallbackText: string | undefined; @@ -372,6 +375,7 @@ async function deliverMediaReply(params: { plainCaption?: string; shouldLog?: (err: unknown) => boolean; }) => { + await params.onPlatformSendDispatch?.(); const delivery = await sendTelegramCaptionedMediaWithFallback({ operation: options.sender.operation, requestParams: options.requestParams, @@ -517,6 +521,7 @@ async function deliverMediaReply(params: { progress: createVoiceFallbackProgress(), recordMessageId: params.recordMessageId, quoteOnlyOnFirstChunk: true, + onPlatformSendDispatch: params.onPlatformSendDispatch, }); await params.onVoiceRecording?.(); @@ -612,6 +617,7 @@ async function deliverMediaReply(params: { replyToMode: params.replyToMode, progress: params.progress, recordMessageId: params.recordMessageId, + onPlatformSendDispatch: params.onPlatformSendDispatch, }); if (followUpMessageId === undefined) { visibleFallbackText = firstDeliveredCaption ?? ""; @@ -783,6 +789,8 @@ export async function deliverReplies(params: { promptContextSequence?: TelegramPromptContextProjectionSequence; /** Text is already prepared Telegram HTML and must not be parsed as Markdown again. */ textMode?: "html"; + /** @internal Claim delivery custody immediately before Telegram Bot API I/O. */ + onPlatformSendDispatch?: () => Promise; }): Promise<{ delivered: boolean; }> { @@ -930,6 +938,7 @@ export async function deliverReplies(params: { ); let firstDeliveredMessageId: number | undefined; if (reactionEmoji && typeof replyToId === "number") { + await params.onPlatformSendDispatch?.(); const reactionResult = await reactMessageTelegram(params.chatId, replyToId, reactionEmoji, { cfg: params.cfg ?? { channels: { telegram: { botToken: params.token } } }, token: params.token, @@ -966,6 +975,7 @@ export async function deliverReplies(params: { replyToMode: params.replyToMode, progress, recordMessageId, + onPlatformSendDispatch: params.onPlatformSendDispatch, }); } else if (mediaList.length > 0) { const mediaDelivery = await deliverMediaReply({ @@ -993,6 +1003,7 @@ export async function deliverReplies(params: { replyToMode: params.replyToMode, progress, recordMessageId, + onPlatformSendDispatch: params.onPlatformSendDispatch, ...(params.textMode ? { textMode: params.textMode } : {}), }); firstDeliveredMessageId = mediaDelivery.firstDeliveredMessageId; diff --git a/extensions/telegram/src/draft-stream.ts b/extensions/telegram/src/draft-stream.ts index c1acef630328..339b029f04c5 100644 --- a/extensions/telegram/src/draft-stream.ts +++ b/extensions/telegram/src/draft-stream.ts @@ -61,7 +61,7 @@ const MAX_PREVIEW_FLOOD_SUSPEND_MS = 60_000; const MIN_PREVIEW_DWELL_MS = 4_000; export type TelegramDraftStream = { - update: (text: string) => void; + update: (text: string, options?: { onPlatformSendDispatch?: () => Promise }) => void; updateLazy: (resolveText: () => string | undefined) => void; updatePreview: (preview: TelegramDraftPreview) => void; flush: () => Promise; @@ -323,6 +323,7 @@ export function createTelegramDraftStream(params: { let lastDeliveredText = ""; let lastRequestedText = ""; let lastRequestedPreview: TelegramDraftPreview | undefined; + let pendingPlatformSendDispatch: (() => Promise) | undefined; let generation = 0; let finalPagePlan: { pages: PlannedTelegramDraftPage[]; nextPageIndex: number } | undefined; // Generations whose in-flight FIRST send was superseded by a reposition @@ -450,6 +451,10 @@ export function createTelegramDraftStream(params: { page: PlannedTelegramDraftPage, sendGeneration: number, ): Promise => { + if (pendingPlatformSendDispatch) { + await pendingPlatformSendDispatch(); + pendingPlatformSendDispatch = undefined; + } const targetMessageId = streamMessageId; if (typeof targetMessageId === "number") { streamVisibleSinceMs ??= Date.now(); @@ -771,12 +776,17 @@ export function createTelegramDraftStream(params: { throwTerminalDeliveryError(); }; - const requestDraftUpdate = (text: string, preview?: TelegramDraftPreview) => { + const requestDraftUpdate = ( + text: string, + preview?: TelegramDraftPreview, + onPlatformSendDispatch?: () => Promise, + ) => { if (streamState.stopped || streamState.final) { return; } lastRequestedPreview = preview; lastRequestedText = text; + pendingPlatformSendDispatch = onPlatformSendDispatch; updateDraft(text); }; @@ -849,6 +859,7 @@ export function createTelegramDraftStream(params: { streamState.final = true; observeCurrentProviderMessage(); await drainProviderMessageObservations(); + pendingPlatformSendDispatch = undefined; }; const remainingFinalContent = (): TelegramDraftMessageSnapshot | undefined => { @@ -1049,7 +1060,7 @@ export function createTelegramDraftStream(params: { params.log?.(`telegram stream preview ready (maxChars=${maxChars}, throttleMs=${throttleMs})`); return { - update: requestDraftUpdate, + update: (text, options) => requestDraftUpdate(text, undefined, options?.onPlatformSendDispatch), updateLazy: requestLazyDraftUpdate, updatePreview, flush, diff --git a/extensions/telegram/src/lane-delivery-text-deliverer.ts b/extensions/telegram/src/lane-delivery-text-deliverer.ts index dae02206edfa..217c8a00dfe4 100644 --- a/extensions/telegram/src/lane-delivery-text-deliverer.ts +++ b/extensions/telegram/src/lane-delivery-text-deliverer.ts @@ -11,8 +11,8 @@ import { buildTtsSupplementMediaPayload, getReplyPayloadTtsSupplement, resolveSendableOutboundReplyParts, + type ReplyPayload, } from "openclaw/plugin-sdk/reply-payload"; -import type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime"; import type { TelegramInlineButtons } from "./button-types.js"; import type { TelegramDraftStream } from "./draft-stream.js"; import type { TelegramPromptContextProjectionSequence } from "./prompt-context-projection.js"; @@ -55,6 +55,8 @@ type CreateLaneTextDelivererParams = { durable?: boolean; promptContextSequence?: TelegramPromptContextProjectionSequence; textMode?: "html"; + onPlatformSendDispatch?: () => Promise; + bindPendingFinalDelivery?: (payload: T) => T; }, ) => Promise; flushDraftLane: (lane: DraftLaneState) => Promise; @@ -86,6 +88,8 @@ type DeliverLaneTextParams = { durable?: boolean; allowStream?: boolean; promptContextSequence?: TelegramPromptContextProjectionSequence; + onPlatformSendDispatch?: () => Promise; + bindPendingFinalDelivery?: (payload: T) => T; }; function result( @@ -276,6 +280,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { promptContextSequence: TelegramPromptContextProjectionSequence, followedByDurablePayload = false, allowErrorPayload = false, + onPlatformSendDispatch?: () => Promise, ): Promise => { const stream = lane.stream; if (!stream || text.length === 0 || (payload.isError && !allowErrorPayload)) { @@ -301,8 +306,15 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { lane.lastPartialText = previewText; lane.hasStreamedMessage = true; lane.finalized = false; - if (stream.lastDeliveredText?.() !== previewText) { - stream.update(previewText); + const previewAlreadyVisible = stream.lastDeliveredText?.() === previewText; + if (!previewAlreadyVisible) { + if (finalizePreview && onPlatformSendDispatch) { + stream.update(previewText, { onPlatformSendDispatch }); + } else { + stream.update(previewText); + } + } else if (finalizePreview) { + await onPlatformSendDispatch?.(); } if (finalizePreview) { await params.stopDraftLane(lane); @@ -341,6 +353,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { let buttonsAttached = false; if (buttons && activeSnapshot) { try { + await onPlatformSendDispatch?.(); await params.editStreamMessage({ laneName, messageId, @@ -383,6 +396,8 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { durable: requestedDurable, allowStream = true, promptContextSequence: suppliedPromptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, }: DeliverLaneTextParams): Promise => { const lane = params.lanes[laneName]; const promptContextSequence = @@ -425,6 +440,7 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { promptContextSequence, false, streamedErrorDraftText !== undefined, + onPlatformSendDispatch, ) : undefined; if (streamed) { @@ -449,6 +465,8 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { buttons, promptContextSequence, true, + false, + onPlatformSendDispatch, ); if (finalizedPreview) { const stripButtons = @@ -465,6 +483,8 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { afterAcceptedDraft: true, durable, promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, }, ); return finalizedPreview; @@ -491,6 +511,8 @@ export function createLaneTextDeliverer(params: CreateLaneTextDelivererParams) { afterAcceptedDraft, durable, promptContextSequence, + onPlatformSendDispatch, + bindPendingFinalDelivery, ...(retainedFinalContent?.sourceTextMode === "html" ? { textMode: "html" } : {}), }, ); diff --git a/extensions/telegram/src/lane-delivery.test.ts b/extensions/telegram/src/lane-delivery.test.ts index 5bba95e139d6..5dcc2c7a2c29 100644 --- a/extensions/telegram/src/lane-delivery.test.ts +++ b/extensions/telegram/src/lane-delivery.test.ts @@ -184,6 +184,35 @@ describe("createLaneTextDeliverer", () => { expect(harness.lanes.answer.finalized).toBe(true); }); + it("claims an equal visible preview before finalization can crash", async () => { + const events: string[] = []; + const answer = createTestDraftStream({ messageId: 999 }); + answer.lastDeliveredText.mockReturnValue(HELLO_FINAL); + const harness = createHarness({ answerStream: answer }); + const finalizationCrash = new Error("injected finalization crash"); + harness.stopDraftLane.mockImplementationOnce(async () => { + events.push("finalize"); + throw finalizationCrash; + }); + const onPlatformSendDispatch = vi.fn(async () => { + events.push("custody"); + }); + + await expect( + harness.deliverLaneText({ + laneName: "answer", + text: HELLO_FINAL, + payload: { text: HELLO_FINAL }, + infoKind: "final", + onPlatformSendDispatch, + }), + ).rejects.toBe(finalizationCrash); + + expect(events).toEqual(["custody", "finalize"]); + expect(answer.update).not.toHaveBeenCalled(); + expect(onPlatformSendDispatch).toHaveBeenCalledOnce(); + }); + it("streams block and final text through the same lane", async () => { const harness = createHarness({ answerMessageId: 999 }); diff --git a/extensions/telegram/src/outbound-adapter.ts b/extensions/telegram/src/outbound-adapter.ts index 9677ed08b86b..60a65b80c38e 100644 --- a/extensions/telegram/src/outbound-adapter.ts +++ b/extensions/telegram/src/outbound-adapter.ts @@ -77,6 +77,7 @@ async function resolveTelegramSendContext(params: { onDeliveryResult?: Parameters< NonNullable >[0]["onDeliveryResult"]; + onPlatformSendDispatch?: () => Promise; resolveSend: ResolveTelegramSendFn; }): Promise<{ send: TelegramSendFn; @@ -93,6 +94,7 @@ async function resolveTelegramSendContext(params: { silent?: boolean; gatewayClientScopes?: readonly string[]; onDeliveryResult?: TelegramSendOpts["onDeliveryResult"]; + onPlatformSendDispatch?: TelegramSendOpts["onPlatformSendDispatch"]; }; }> { const send = await params.resolveSend(params.deps); @@ -113,6 +115,7 @@ async function resolveTelegramSendContext(params: { await params.onDeliveryResult?.(attachChannelToResult("telegram", result)); } : undefined, + onPlatformSendDispatch: params.onPlatformSendDispatch, ...(params.formatting?.parseMode === "HTML" ? { textMode: "html" as const } : {}), tableMode: params.formatting?.tableMode, }, @@ -383,6 +386,7 @@ export async function sendTelegramPayloadMessages(params: { if (typeof replyToMessageId !== "number") { throw new Error("Telegram reaction requires a reply target"); } + await params.baseOpts.onPlatformSendDispatch?.(); const reactionResult = await params.react(params.to, replyToMessageId, reactionEmoji, { cfg: params.baseOpts.cfg, accountId: params.baseOpts.accountId, @@ -597,6 +601,7 @@ export function createTelegramOutboundAdapter( silent, isAnonymous, gatewayClientScopes, + onPlatformSendDispatch, }) => { const outboundTo = normalizeTelegramOutboundTarget(to); const { sendPollTelegram } = await loadSendModule(); @@ -607,6 +612,7 @@ export function createTelegramOutboundAdapter( silent: silent ?? undefined, isAnonymous: isAnonymous ?? undefined, gatewayClientScopes, + onPlatformSendDispatch, }); }, }; diff --git a/extensions/telegram/src/send-location.ts b/extensions/telegram/src/send-location.ts index 1e823188328d..0a9bb29177e1 100644 --- a/extensions/telegram/src/send-location.ts +++ b/extensions/telegram/src/send-location.ts @@ -72,8 +72,9 @@ async function sendLocationTelegramWithContext( const delivery = await withTelegramNativeQuoteFallback({ label, requestParams: commonParams, - request: (effectiveParams, retryLabel) => - prepared.request( + request: async (effectiveParams, retryLabel) => { + await opts.onPlatformSendDispatch?.(); + return await prepared.request( () => hasName ? api.sendVenue( @@ -91,7 +92,8 @@ async function sendLocationTelegramWithContext( : {}), } as TelegramSendLocationParams), retryLabel, - ), + ); + }, }); const result = delivery.result; const acceptedParams = toAcceptedThreadScopedParams(delivery.acceptedParams); diff --git a/extensions/telegram/src/send-message-text.ts b/extensions/telegram/src/send-message-text.ts index cfbb443a5f53..ccaaaf816bf0 100644 --- a/extensions/telegram/src/send-message-text.ts +++ b/extensions/telegram/src/send-message-text.ts @@ -149,14 +149,16 @@ export function createTelegramTextSender(config: { withTelegramNativeQuoteFallback({ label, requestParams, - request: (effectiveParams, retryLabel) => - requestWithChatNotFound( + request: async (effectiveParams, retryLabel) => { + await opts.onPlatformSendDispatch?.(); + return await requestWithChatNotFound( () => Object.keys(effectiveParams).length > 0 ? api.sendMessage(chatId, messageText, effectiveParams) : api.sendMessage(chatId, messageText), retryLabel, - ), + ); + }, }); const requestPlain = (label: string) => requestSendMessage(label, chunk.plainText, plainParams ?? {}); diff --git a/extensions/telegram/src/send-message-types.ts b/extensions/telegram/src/send-message-types.ts index 862cb75a1c49..86cf74a4a270 100644 --- a/extensions/telegram/src/send-message-types.ts +++ b/extensions/telegram/src/send-message-types.ts @@ -49,6 +49,8 @@ export type TelegramSendOpts = { forceDocument?: boolean; /** Persist each concrete platform send before any later chunk can fail. */ onDeliveryResult?: (result: TelegramSendResult) => Promise | void; + /** @internal Refresh durable custody immediately before Telegram Bot API I/O. */ + onPlatformSendDispatch?: () => Promise; }; export type TelegramApiCallOpts = Pick< @@ -76,5 +78,10 @@ export type TelegramSendResult = { export type TelegramLocationSendOpts = TelegramThreadedSendOpts & Pick< TelegramSendOpts, - "buttons" | "quoteText" | "promptContextProjectionPlan" | "silent" | "onDeliveryResult" + | "buttons" + | "quoteText" + | "promptContextProjectionPlan" + | "silent" + | "onDeliveryResult" + | "onPlatformSendDispatch" >; diff --git a/extensions/telegram/src/send-message.ts b/extensions/telegram/src/send-message.ts index 4ce4a79caa4d..c856ec656de0 100644 --- a/extensions/telegram/src/send-message.ts +++ b/extensions/telegram/src/send-message.ts @@ -288,12 +288,14 @@ async function sendMessageTelegramWithContext( withTelegramNativeQuoteFallback({ label, requestParams, - request: (effectiveParams, effectiveLabel) => - requestWithChatNotFound( + request: async (effectiveParams, effectiveLabel) => { + await opts.onPlatformSendDispatch?.(); + return await requestWithChatNotFound( () => sender(effectiveParams), effectiveLabel, shouldLog ? { shouldLog } : undefined, - ), + ); + }, }), }); }; diff --git a/extensions/telegram/src/send-special.ts b/extensions/telegram/src/send-special.ts index 2495efd313e9..9e1924222e43 100644 --- a/extensions/telegram/src/send-special.ts +++ b/extensions/telegram/src/send-special.ts @@ -102,7 +102,7 @@ async function sendStickerTelegramWithContext( } type TelegramPollOpts = TelegramThreadedSendOpts & - Pick & { + Pick & { /** Whether votes are anonymous. Defaults to true (Telegram default). */ isAnonymous?: boolean; }; @@ -163,6 +163,7 @@ async function sendPollTelegramWithContext( ...(opts.silent === true ? { disable_notification: true } : {}), }; + await opts.onPlatformSendDispatch?.(); const result = await prepared.request( () => api.sendPoll(prepared.chatId, normalizedPoll.question, normalizedPoll.options, pollParams), diff --git a/src/agents/agent-command.compaction-rotation.test.ts b/src/agents/agent-command.compaction-rotation.test.ts index 3cb3b17908a4..dec5274b83ec 100644 --- a/src/agents/agent-command.compaction-rotation.test.ts +++ b/src/agents/agent-command.compaction-rotation.test.ts @@ -828,7 +828,7 @@ describe("agentCommand compaction transcript rotation", () => { }, ); - it("skips post-turn compaction before delivering sendable finals that pending text cannot replay", async () => { + it("compacts after persisting transport ownership for finals that text cannot replay", async () => { const sessionId = "unrecoverable-media-before-compaction"; const sessionKey = `agent:main:explicit:${sessionId}`; const payloads = [{ mediaUrl: "/tmp/reply.ogg", audioAsVoice: true }]; @@ -845,7 +845,7 @@ describe("agentCommand compaction transcript rotation", () => { deliver: true, }); - expect(state.runCliTurnCompactionLifecycleMock).not.toHaveBeenCalled(); + expect(state.runCliTurnCompactionLifecycleMock).toHaveBeenCalledOnce(); expect(state.deliverAgentCommandResultMock).toHaveBeenCalledOnce(); expect(state.deliverAgentCommandResultMock).toHaveBeenCalledWith( expect.objectContaining({ payloads }), diff --git a/src/agents/command/post-run.ts b/src/agents/command/post-run.ts index 8be0cb41186b..130d23575e21 100644 --- a/src/agents/command/post-run.ts +++ b/src/agents/command/post-run.ts @@ -1,5 +1,6 @@ import { getReplyPayloadMetadata } from "../../auto-reply/reply-payload.js"; import type { CliDeps } from "../../cli/deps.types.js"; +import { buildRestartRecoveryClaimCleanupPatch } from "../../config/sessions/restart-recovery-state.js"; import type { RestartRecoveryTerminalDeliveryEvidenceResult } from "../../config/sessions/restart-recovery-types.js"; import type { SessionEntry } from "../../config/sessions/types.js"; import { assertAgentRunLifecycleGenerationCurrent } from "../../infra/agent-events.js"; @@ -70,6 +71,7 @@ export async function finalizeEmbeddedAgentCommand(params: { cwd, agentDir, outboundSession, + runId, agentCfg, } = params.prepared; const { @@ -374,7 +376,8 @@ export async function finalizeEmbeddedAgentCommand(params: { !params.suppressVisibleSessionEffects && !sessionReboundDuringRun ) { - const entry = sessionStore[sessionKey] ?? sessionEntry; + const entry = + (await resolveFreshSessionEntryForDelivery?.()) ?? sessionStore[sessionKey] ?? sessionEntry; if (!entry) { throw new Error("Cannot clear pending delivery without a session entry"); } @@ -383,15 +386,55 @@ export async function finalizeEmbeddedAgentCommand(params: { params.opts.deliver === true && !pendingFinalDeliveryMarker.hasSendableFinalPayload && entry.pendingFinalDelivery?.kind === "transport-only"; - if (deliveryResult?.deliverySucceeded === true || clearStaleTransportOnly) { + const clearOwnedPendingFinal = + deliveryResult?.deliverySucceeded === true && + pendingFinalDeliveryMarker.pendingFinalDeliveryIntentId !== undefined; + // Preserve the exact local claim through sibling session writes so a delivered + // source is tombstoned before admission release can erase its ownership fields. + const recoveryClaimEntry = + entry.restartRecoveryDeliveryRunId === runId + ? entry + : sessionEntry?.restartRecoveryDeliveryRunId === runId + ? sessionEntry + : params.sessionEntry?.restartRecoveryDeliveryRunId === runId + ? params.sessionEntry + : undefined; + if (clearOwnedPendingFinal || clearStaleTransportOnly || recoveryClaimEntry) { + const now = Date.now(); sessionEntry = await persistAgentSession({ sessionStore, sessionKey, storePath, initialEntry: entry, - entry: clearPendingFinalDelivery(entry, Date.now()), + entry: { + ...(clearOwnedPendingFinal || clearStaleTransportOnly + ? clearPendingFinalDelivery(entry, now) + : { ...entry, updatedAt: now }), + ...(recoveryClaimEntry + ? buildRestartRecoveryClaimCleanupPatch({ + entry: { + ...recoveryClaimEntry, + restartRecoveryTerminalDeliveryEvidence: + entry.restartRecoveryTerminalDeliveryEvidence, + restartRecoveryTerminalRunIds: entry.restartRecoveryTerminalRunIds, + }, + recordTerminalSource: true, + terminalDeliveryEvidence: buildRestartRecoveryTerminalDeliveryEvidence( + deliveryResult ?? result, + ), + terminalRunId: runId, + }) + : {}), + }, shouldPersist: (current) => - shouldPersistCurrentRunSessionCleanup(current, runOwnedSessionId), + shouldPersistCurrentRunSessionCleanup(current, runOwnedSessionId) && + (!recoveryClaimEntry || + current?.restartRecoveryDeliveryRunId === undefined || + current.restartRecoveryDeliveryRunId === runId) && + (!clearOwnedPendingFinal || + current?.pendingFinalDelivery?.intentId === + pendingFinalDeliveryMarker.pendingFinalDeliveryIntentId) && + (!clearStaleTransportOnly || current?.pendingFinalDelivery?.kind === "transport-only"), }); } } diff --git a/src/agents/main-session-recovery/main-session-recovery-owner-release.ts b/src/agents/main-session-recovery/main-session-recovery-owner-release.ts index 0a8a616cf252..92379ea0f72d 100644 --- a/src/agents/main-session-recovery/main-session-recovery-owner-release.ts +++ b/src/agents/main-session-recovery/main-session-recovery-owner-release.ts @@ -14,6 +14,7 @@ export function scheduleMainSessionRecoveryPendingTarget( getConfig: getRuntimeConfig, getGatewayRuntime: getGatewayRecoveryRuntime, sessionKey: target.sessionKey, + stateDir: target.stateDir, storePath: target.storePath, }), () => {}, // Startup recovery remains the fallback if this optional module cannot load. diff --git a/src/agents/main-session-recovery/main-session-recovery-store.ts b/src/agents/main-session-recovery/main-session-recovery-store.ts index f3766e44985e..d3f8904f8018 100644 --- a/src/agents/main-session-recovery/main-session-recovery-store.ts +++ b/src/agents/main-session-recovery/main-session-recovery-store.ts @@ -32,6 +32,7 @@ type MainSessionRecoveryStoreResult = { export type MainSessionRecoveryPendingTarget = MainSessionRecoveryStoreTarget & { sessionId: string; + stateDir?: string; }; function matchesReservation(entry: SessionEntry, reservation: MainSessionRecoveryReservation) { diff --git a/src/agents/main-session-recovery/main-session-restart-recovery-checkpoint.ts b/src/agents/main-session-recovery/main-session-restart-recovery-checkpoint.ts index aabdb2df058e..2672d5a8d779 100644 --- a/src/agents/main-session-recovery/main-session-restart-recovery-checkpoint.ts +++ b/src/agents/main-session-recovery/main-session-restart-recovery-checkpoint.ts @@ -298,6 +298,7 @@ export async function markSessionCompletedAfterRecoveryCheckpoint(params: { agentId: string; entry: SessionEntry; messages: readonly unknown[]; + pendingFinalDeliveryIntentId?: string; reason: "delivered-terminal" | "delivered-terminal-receipt" | "handled-silent"; storePath: string; sessionKey: string; @@ -321,6 +322,7 @@ export async function markSessionCompletedAfterRecoveryCheckpoint(params: { pendingFinalDelivery: undefined, restartRecoveryForceSafeTools: undefined, restartRecoveryRuns: undefined, + ...buildMainSessionRecoveryClearPatch(params.entry), runtimeMs: typeof params.entry.startedAt === "number" ? Math.max(0, endedAt - params.entry.startedAt) @@ -471,6 +473,8 @@ export async function markSessionCompletedAfterRecoveryCheckpoint(params: { if ( !entry || entry.sessionId !== params.entry.sessionId || + (params.pendingFinalDeliveryIntentId !== undefined && + entry.pendingFinalDelivery?.intentId !== params.pendingFinalDeliveryIntentId) || entry.status !== "running" || entry.abortedLastRun !== true || normalizeOptionalString(entry.restartRecoveryDeliveryRunId) !== expectedRecoveryRunId || diff --git a/src/agents/main-session-recovery/main-session-restart-recovery-notice.ts b/src/agents/main-session-recovery/main-session-restart-recovery-notice.ts index 3f65de35c216..49dc37abc992 100644 --- a/src/agents/main-session-recovery/main-session-restart-recovery-notice.ts +++ b/src/agents/main-session-recovery/main-session-restart-recovery-notice.ts @@ -86,6 +86,7 @@ export async function failUnresumableMainSession(params: { gatewayRuntime: GatewayRecoveryRuntime; observation: MainSessionRecoveryObservation; reason: string; + noticeText?: string; sessionKey: string; storePath: string; }): Promise<"failed" | "skipped"> { @@ -105,6 +106,7 @@ export async function failUnresumableMainSession(params: { entry: params.entry, sessionKey: params.sessionKey, storePath: params.storePath, + ...(params.noticeText ? { text: params.noticeText } : {}), })) !== "written" ) { // Keep ownership for another recovery attempt until its terminal notice is durable. @@ -126,7 +128,7 @@ export async function failUnresumableMainSession(params: { gatewayRuntime: params.gatewayRuntime, reason: params.reason, sessionKey: params.sessionKey, - text: UNRESUMABLE_SESSION_NOTICE, + text: params.noticeText ?? UNRESUMABLE_SESSION_NOTICE, }); } return "failed"; diff --git a/src/agents/main-session-recovery/main-session-restart-recovery-runtime.ts b/src/agents/main-session-recovery/main-session-restart-recovery-runtime.ts index 949b22880bfb..a11d55fa93b3 100644 --- a/src/agents/main-session-recovery/main-session-restart-recovery-runtime.ts +++ b/src/agents/main-session-recovery/main-session-restart-recovery-runtime.ts @@ -88,6 +88,7 @@ export async function recoverRestartAbortedMainSessions(params: { cfg: params.cfg, onExhaustedTarget: params.onExhaustedTarget, storePath, + stateDir: params.stateDir, resumedSessionKeys, activeSessionIds: params.activeSessionIds, activeSessionKeys: params.activeSessionKeys, @@ -116,6 +117,7 @@ export async function retryRestartAbortedMainSessionRecovery(params: { expectedRecoverySourceRunId?: string; expectedSessionId: string; sessionKey: string; + stateDir?: string; storePath: string; gatewayRuntime: GatewayRecoveryRuntime; }): Promise { @@ -147,6 +149,7 @@ async function recoverExpectedRestartRecovery(params: { sessionKey: string; shouldContinue?: () => boolean; storePath: string; + stateDir?: string; gatewayRuntime: GatewayRecoveryRuntime; }): Promise { const loadExpected = () => @@ -186,6 +189,7 @@ async function recoverExpectedRestartRecovery(params: { cfg: params.cfg, observationOnly: params.observationOnly, storePath: params.storePath, + stateDir: params.stateDir, resumedSessionKeys: new Set(), expectedClaim: params.expectedClaim, expectedTarget: params.expectedTarget, @@ -208,6 +212,7 @@ export function scheduleRestartAbortedMainSessionRecoveryAfterOwnerRelease(param maxRetries?: number; expectedSessionId: string; sessionKey: string; + stateDir?: string; storePath: string; }): void { const recover = () => @@ -220,6 +225,7 @@ export function scheduleRestartAbortedMainSessionRecoveryAfterOwnerRelease(param cfg: params.getConfig(), expectedSessionId: params.expectedSessionId, sessionKey: params.sessionKey, + stateDir: params.stateDir, storePath: params.storePath, gatewayRuntime, }); @@ -327,6 +333,7 @@ export function scheduleRestartAbortedMainSessionRecovery(params: { sessionKey: target.sessionKey, shouldContinue, storePath: target.storePath, + stateDir: params.stateDir, gatewayRuntime: params.gatewayRuntime, }), ), diff --git a/src/agents/main-session-recovery/main-session-restart-recovery-store.ts b/src/agents/main-session-recovery/main-session-restart-recovery-store.ts index 25080badf9a1..629715b27a72 100644 --- a/src/agents/main-session-recovery/main-session-restart-recovery-store.ts +++ b/src/agents/main-session-recovery/main-session-restart-recovery-store.ts @@ -14,6 +14,7 @@ import type { GatewayRecoveryRuntime } from "../../gateway/server-instance-runti import { readSessionMessagesAsync } from "../../gateway/session-transcript-readers.js"; import { resolveGatewaySessionStoreTarget } from "../../gateway/session-utils.js"; import { getAgentEventLifecycleGeneration } from "../../infra/agent-events.js"; +import { findDeliveryIntentOwner } from "../../infra/outbound/delivery-queue-storage.js"; import { resolveAgentIdFromSessionKey } from "../../routing/session-key.js"; import { resolveDefaultAgentId } from "../agent-scope-config.js"; import { @@ -53,6 +54,32 @@ import { normalizeStringSet, } from "./main-session-restart-recovery-shared.js"; +function pendingFinalRecoveryAction( + pending: NonNullable, + stateDir?: string, +): "complete" | "defer" | "fail" | "retry" { + const deliveries = pending.deliveries; + if (!deliveries?.length) { + return "fail"; + } + if (deliveries.every(({ state }) => state === "delivered" || state === "suppressed")) { + return "complete"; + } + const owners = deliveries.map(({ id }) => findDeliveryIntentOwner(id, stateDir)); + if (owners.some((owner) => owner?.status === "pending")) { + return "defer"; + } + for (const [index, delivery] of deliveries.entries()) { + const owner = owners[index]; + if (owner || delivery.state === "delivered" || delivery.state === "unknown") { + return "fail"; + } + } + return pending.kind === "replayable" && deliveries.every(({ state }) => state === "prepared") + ? "retry" + : "fail"; +} + export function loadExpectedRestartRecoveryTarget(params: { expected: ExpectedRestartRecoveryTarget; storePath: string; @@ -99,6 +126,7 @@ export async function recoverStore(params: { observationOnly?: boolean; onExhaustedTarget?: (target: ExhaustedRestartRecoveryTarget) => void; storePath: string; + stateDir?: string; resumedSessionKeys: Set; expectedClaim?: ExpectedRestartRecoveryClaim; expectedTarget?: ExpectedRestartRecoveryTarget; @@ -293,7 +321,7 @@ export async function recoverStore(params: { } } }; - const failCurrent = async (reason: string) => { + const failCurrent = async (reason: string, noticeText?: string) => { if (stopped()) { return false; } @@ -303,6 +331,7 @@ export async function recoverStore(params: { gatewayRuntime: params.gatewayRuntime, observation: recoveryView.observation, reason, + ...(noticeText ? { noticeText } : {}), sessionKey, storePath: params.storePath, }); @@ -363,6 +392,44 @@ export async function recoverStore(params: { ); }; + const pendingAction = entry.pendingFinalDelivery + ? pendingFinalRecoveryAction(entry.pendingFinalDelivery, params.stateDir) + : undefined; + if (pendingAction === "defer") { + result.failed++; + continue; + } + if (pendingAction === "complete") { + const completion = await markSessionCompletedAfterRecoveryCheckpoint({ + agentId, + entry, + messages: [], + pendingFinalDeliveryIntentId: entry.pendingFinalDelivery?.intentId, + reason: "delivered-terminal-receipt", + sessionKey, + storePath: params.storePath, + }); + if (completion.outcome === "completed") { + params.resumedSessionKeys.add(resumeDedupeKey); + result.recovered++; + } else { + result.skipped++; + } + continue; + } + if (pendingAction === "fail") { + if ( + !(await failCurrent( + "pending final delivery outcome is unknown", + "My previous response was interrupted during delivery. " + + "Please ask for any missing remainder; I won't rerun your previous request automatically.", + )) + ) { + return result; + } + continue; + } + if ( entry.pendingFinalDelivery?.kind === "replayable" && entry.restartRecoveryForceSafeTools === true diff --git a/src/agents/main-session-recovery/main-session-restart-recovery.test.ts b/src/agents/main-session-recovery/main-session-restart-recovery.test.ts index 27a9e0268d4f..368abe969c4e 100644 --- a/src/agents/main-session-recovery/main-session-restart-recovery.test.ts +++ b/src/agents/main-session-recovery/main-session-restart-recovery.test.ts @@ -26,6 +26,9 @@ import { rotateAgentEventLifecycleGeneration, } from "../../infra/agent-events.js"; import { registerAgentRunContext } from "../../infra/agent-run-registry.js"; +import { moveDeliveryQueueEntryToFailed } from "../../infra/delivery-queue-sqlite.js"; +import { OUTBOUND_DELIVERY_QUEUE_NAME } from "../../infra/outbound/delivery-queue-media-staging.js"; +import { ackDelivery, enqueueDeliveryOnce } from "../../infra/outbound/delivery-queue-storage.js"; import { initializeGlobalHookRunner, resetGlobalHookRunner, @@ -262,6 +265,8 @@ function makePendingFinalDelivery( kind: "replayable", text, createdAt: Date.now(), + intentId: "intent-prepared-default", + deliveries: [{ id: "delivery-prepared-default", state: "prepared" }], ...overrides, }; } @@ -1833,65 +1838,290 @@ describe("main-session-restart-recovery", () => { expect(store["agent:main:main"]?.abortedLastRun).toBe(true); }); - it("resumes marked sessions with a durable pending final delivery payload (Phase 2)", async () => { + it.each([ + ["missing", undefined], + ["empty", []], + ] as const)( + "fails closed when pending final delivery identities are %s", + async (_, deliveries) => { + const sessionsDir = await makeSessionsDir(); + const pendingPayload = "The final answer is 42."; + await writeMainSession({ + sessionsDir, + restartRecoveryForceSafeTools: true, + pendingFinalDelivery: { + kind: "replayable", + text: pendingPayload, + createdAt: Date.now() - 5_000, + ...(deliveries ? { deliveries: [...deliveries] } : {}), + context: { + channel: "discord", + to: "discord:dm:final", + accountId: "main", + }, + }, + restartRecoveryBeforeAgentReplyState: "handled-reply", + restartRecoveryDeliveryRunId: "discord-message-1", + restartRecoveryDeliverySourceRunId: "discord-message-1", + restartRecoverySourceIngress: "channel", + restartRecoveryDeliveryContext: { + channel: "discord", + to: "discord:dm:stale", + accountId: "old", + }, + }); + await writeTranscript(sessionsDir, "main-session", [ + { role: "user", content: "calculate the answer" }, + { role: "assistant", content: [{ type: "toolCall", id: "call-1", name: "calc" }] }, + { role: "toolResult", content: "42" }, + ]); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }, {}); + expect(runtimePluginMocks.findRestartRecoveryUnsafeReplyHook).not.toHaveBeenCalled(); + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).toHaveBeenCalledWith( + expect.objectContaining({ text: expect.stringContaining("ask for any missing remainder") }), + ); + }, + ); + + it("retries a prepared pending final only when no queue owner exists", async () => { const sessionsDir = await makeSessionsDir(); - const pendingPayload = "The final answer is 42."; await writeMainSession({ sessionsDir, - restartRecoveryForceSafeTools: true, - pendingFinalDelivery: { - kind: "replayable", - text: pendingPayload, - createdAt: Date.now() - 5_000, - context: { - channel: "discord", - to: "discord:dm:final", - accountId: "main", - }, - }, - restartRecoveryBeforeAgentReplyState: "handled-reply", - restartRecoveryDeliveryRunId: "discord-message-1", - restartRecoveryDeliverySourceRunId: "discord-message-1", - restartRecoverySourceIngress: "channel", - restartRecoveryDeliveryContext: { - channel: "discord", - to: "discord:dm:stale", - accountId: "old", - }, + pendingFinalDelivery: makePendingFinalDelivery("The prepared final answer.", { + intentId: "intent-prepared", + deliveries: [{ id: "delivery-prepared", state: "prepared" }], + }), }); await writeTranscript(sessionsDir, "main-session", [ - { role: "user", content: "calculate the answer" }, - { role: "assistant", content: [{ type: "toolCall", id: "call-1", name: "calc" }] }, - { role: "toolResult", content: "42" }, + { role: "user", content: "finish the answer" }, ]); - await expectRecovery({ recovered: 1, failed: 0, skipped: 0 }, {}); - expect(runtimePluginMocks.findRestartRecoveryUnsafeReplyHook).toHaveBeenCalledWith({ - trigger: "user", - }); - expect(callGateway).toHaveBeenCalledOnce(); - expect(gatewayParams()).toMatchObject({ - deliver: true, - bestEffortDeliver: true, - channel: "discord", - to: "discord:dm:final", - accountId: "main", - forceRestartSafeTools: true, - }); - expect(gatewayParams().message).toContain(pendingPayload); + await expectRecovery({ recovered: 1, failed: 0, skipped: 0 }); - const beforeStoreRead = Date.now(); - const store = readStore(path.join(sessionsDir, "sessions.json")); - const entry = store["agent:main:main"]; - expect(entry?.abortedLastRun).toBe(false); - expect(entry?.pendingFinalDelivery).toMatchObject({ - kind: "replayable", - text: pendingPayload, - }); - expect(entry?.restartRecoveryForceSafeTools).toBe(true); - expect(entry?.pendingFinalDelivery?.createdAt).toBeLessThanOrEqual(beforeStoreRead); + expect(callGateway).toHaveBeenCalledOnce(); + expect(gatewayParams().message).toContain("The prepared final answer."); }); + it("quietly completes a pending final whose deliveries are terminal", async () => { + const sessionsDir = await makeSessionsDir(); + const storePath = path.join(sessionsDir, "sessions.json"); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: makePendingFinalDelivery("Already delivered.", { + intentId: "intent-delivered", + deliveries: [ + { id: "delivery-delivered", state: "delivered" }, + { id: "delivery-suppressed", state: "suppressed" }, + ], + }), + }); + + await expectRecovery({ recovered: 1, failed: 0, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).not.toHaveBeenCalled(); + expect(loadSessionEntry({ sessionKey: "agent:main:main", storePath })).toMatchObject({ + status: "done", + abortedLastRun: false, + }); + expect( + loadSessionEntry({ sessionKey: "agent:main:main", storePath })?.pendingFinalDelivery, + ).toBeUndefined(); + }); + + it.each([ + [ + { id: "delivery-already-delivered", state: "delivered" as const }, + { id: "delivery-still-pending", state: "queued" as const }, + ], + [ + { id: "delivery-still-pending", state: "queued" as const }, + { id: "delivery-already-delivered", state: "delivered" as const }, + ], + ])("defers mixed deliveries while any exact queue owner is pending", async (...deliveries) => { + try { + await enqueueDeliveryOnce( + { + channel: "discord", + to: "discord:dm:123", + payloads: [{ text: "Pending sibling." }], + queuePolicy: "required", + completionRetention: "permanent", + }, + "delivery-still-pending", + tmpDir, + ); + const sessionsDir = await makeSessionsDir(); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: makePendingFinalDelivery("Partially delivered answer.", { + context: discordDeliveryContext, + intentId: "intent-mixed-pending", + deliveries, + }), + }); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).not.toHaveBeenCalled(); + } finally { + closeOpenClawStateDatabaseForTest(); + } + }); + + it("completes terminal deliveries despite a residual pending queue row", async () => { + try { + await enqueueDeliveryOnce( + { + channel: "discord", + to: "discord:dm:123", + payloads: [{ text: "Already delivered." }], + queuePolicy: "required", + completionRetention: "permanent", + }, + "delivery-terminal-with-row", + tmpDir, + ); + const sessionsDir = await makeSessionsDir(); + const storePath = path.join(sessionsDir, "sessions.json"); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: makePendingFinalDelivery("Already delivered.", { + intentId: "intent-terminal-with-row", + deliveries: [{ id: "delivery-terminal-with-row", state: "delivered" }], + }), + }); + + await expectRecovery({ recovered: 1, failed: 0, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).not.toHaveBeenCalled(); + expect(loadSessionEntry({ sessionKey: "agent:main:main", storePath })?.status).toBe("done"); + } finally { + closeOpenClawStateDatabaseForTest(); + } + }); + + it("fails closed for an unqueued media-only final", async () => { + const sessionsDir = await makeSessionsDir(); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: { + kind: "transport-only", + createdAt: Date.now(), + intentId: "intent-media-only", + deliveries: [{ id: "delivery-media-only", state: "prepared" }], + context: discordDeliveryContext, + }, + }); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).toHaveBeenCalledWith( + expect.objectContaining({ text: expect.stringContaining("ask for any missing remainder") }), + ); + }); + + it("fails visibly instead of replaying part of an unqueued text and media final", async () => { + const sessionsDir = await makeSessionsDir(); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: { + kind: "transport-only", + createdAt: Date.now(), + context: discordDeliveryContext, + intentId: "intent-text-media", + deliveries: [ + { id: "delivery-text", state: "prepared" }, + { id: "delivery-media", state: "prepared" }, + ], + }, + }); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).toHaveBeenCalledOnce(); + }); + + it.each(["delivered", "unknown"] as const)( + "fails closed when a %s delivery is mixed with prepared work", + async (state) => { + const sessionsDir = await makeSessionsDir(); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: makePendingFinalDelivery("Do not regenerate this aggregate.", { + context: discordDeliveryContext, + intentId: `intent-mixed-${state}`, + deliveries: [ + { id: `delivery-${state}`, state }, + { id: "delivery-still-prepared", state: "prepared" }, + ], + }), + }); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + expect(sendRecoveryNotice).toHaveBeenCalledOnce(); + expect(sendRecoveryNotice).toHaveBeenCalledWith( + expect.objectContaining({ + text: expect.stringContaining("ask for any missing remainder"), + }), + ); + expect(sendRecoveryNotice.mock.calls[0]?.[0].text).not.toContain("send that last request"); + }, + ); + + it.each(["pending", "failed", "completed"] as const)( + "does not regenerate a prepared pending final while its exact queue owner is %s", + async (ownerStatus) => { + const deliveryId = `delivery-owner-${ownerStatus}`; + try { + await enqueueDeliveryOnce( + { + channel: "discord", + to: "discord:dm:123", + payloads: [{ text: "Queue owns this final." }], + queuePolicy: "required", + completionRetention: "permanent", + }, + deliveryId, + tmpDir, + ); + if (ownerStatus === "failed") { + moveDeliveryQueueEntryToFailed(OUTBOUND_DELIVERY_QUEUE_NAME, deliveryId, tmpDir); + } else if (ownerStatus === "completed") { + await ackDelivery(deliveryId, tmpDir); + } + const sessionsDir = await makeSessionsDir(); + await writeMainSession({ + sessionsDir, + pendingFinalDelivery: makePendingFinalDelivery("Queue owns this final.", { + context: discordDeliveryContext, + intentId: `intent-owner-${ownerStatus}`, + deliveries: [{ id: deliveryId, state: "prepared" }], + }), + }); + + await expectRecovery({ recovered: 0, failed: 1, skipped: 0 }); + + expect(callGateway).not.toHaveBeenCalled(); + if (ownerStatus === "pending") { + expect(sendRecoveryNotice).not.toHaveBeenCalled(); + } else { + expect(sendRecoveryNotice).toHaveBeenCalledOnce(); + } + } finally { + closeOpenClawStateDatabaseForTest(); + } + }, + ); + it("keeps a hook-owned pending final behind the unsafe-hook gate after claim cleanup", async () => { const sessionsDir = await makeSessionsDir(); const storePath = path.join(sessionsDir, "sessions.json"); @@ -1964,11 +2194,9 @@ describe("main-session-restart-recovery", () => { ].join("\n"); await writeMainSession({ sessionsDir, - pendingFinalDelivery: { - kind: "replayable", - text: pendingPayload, + pendingFinalDelivery: makePendingFinalDelivery(pendingPayload, { createdAt: Date.now() - 5_000, - }, + }), }); await writeTranscript(sessionsDir, "main-session", [ { role: "user", content: "calculate the answer" }, diff --git a/src/agents/pending-final-delivery-marker.test.ts b/src/agents/pending-final-delivery-marker.test.ts new file mode 100644 index 000000000000..7027d9fee159 --- /dev/null +++ b/src/agents/pending-final-delivery-marker.test.ts @@ -0,0 +1,46 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import { getReplyPayloadMetadata } from "../auto-reply/reply-payload.js"; +import type { SessionEntry } from "../config/sessions/types.js"; +import { persistPendingFinalDeliveryMarker } from "./pending-final-delivery-marker.js"; + +const state = vi.hoisted(() => ({ persistAgentSession: vi.fn() })); + +vi.mock("./command/attempt-execution.shared.js", () => ({ + persistAgentSession: (...args: unknown[]) => state.persistAgentSession(...args), +})); + +describe("persistPendingFinalDeliveryMarker", () => { + beforeEach(() => { + state.persistAgentSession + .mockReset() + .mockImplementation(async (params: { entry: SessionEntry }) => params.entry); + }); + + it("owns a multi-payload command delivery as one durable batch", async () => { + const entry: SessionEntry = { sessionId: "session-1", updatedAt: 1 }; + const payloads = [{ text: "first" }, { text: "second" }]; + + const result = await persistPendingFinalDeliveryMarker({ + deliver: true, + sessionStore: { main: entry }, + sessionKey: "main", + sessionEntry: entry, + storePath: "/tmp/sessions.json", + suppressVisibleSessionEffects: false, + sessionReboundDuringRun: false, + payloads, + deliveryContext: { channel: "discord", to: "channel:c1" }, + runOwnedSessionId: "session-1", + }); + + expect(result.sessionEntry?.pendingFinalDelivery?.deliveries).toEqual([ + { id: expect.any(String), state: "prepared" }, + ]); + const deliveryId = result.sessionEntry?.pendingFinalDelivery?.deliveries?.[0]?.id; + expect( + payloads.map( + (payload) => getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion?.deliveryId, + ), + ).toEqual([deliveryId, deliveryId]); + }); +}); diff --git a/src/agents/pending-final-delivery-marker.ts b/src/agents/pending-final-delivery-marker.ts index ccca9655f174..95f1cf1dc3f0 100644 --- a/src/agents/pending-final-delivery-marker.ts +++ b/src/agents/pending-final-delivery-marker.ts @@ -1,5 +1,6 @@ /** Persists restart-recoverable final delivery markers for agent runs. */ -import type { ReplyPayload } from "../auto-reply/reply-payload.js"; +import { randomUUID } from "node:crypto"; +import { setReplyPayloadMetadata, type ReplyPayload } from "../auto-reply/reply-payload.js"; import { buildRecoverablePendingFinalDeliveryText, normalizePendingFinalDeliveryPayloads, @@ -26,15 +27,20 @@ type PersistPendingFinalDeliveryMarkerParams = { type PendingFinalDeliveryMarkerResult = { sessionEntry?: SessionEntry; pendingFinalDeliveryMarkerPersisted: boolean; + pendingFinalDeliveryIntentId?: string; hasSendableFinalPayload: boolean; }; export async function persistPendingFinalDeliveryMarker( params: PersistPendingFinalDeliveryMarkerParams, ): Promise { - const recoveryPayloads = normalizePendingFinalRecoveryPayloads(params.payloads); - const hasSendableFinalPayload = normalizePendingFinalDeliveryPayloads(params.payloads).length > 0; - const recoverableText = buildRecoverablePendingFinalDeliveryText(recoveryPayloads); + const sendablePayloads = params.payloads.filter( + (payload) => normalizePendingFinalDeliveryPayloads([payload]).length > 0, + ); + const hasSendableFinalPayload = sendablePayloads.length > 0; + const recoverableText = buildRecoverablePendingFinalDeliveryText( + normalizePendingFinalRecoveryPayloads(params.payloads), + ); if ( !params.deliver || @@ -42,10 +48,10 @@ export async function persistPendingFinalDeliveryMarker( !params.sessionKey || params.suppressVisibleSessionEffects || params.sessionReboundDuringRun || - params.payloads.length === 0 || isSubagentSessionKey(params.sessionKey) || - !recoverableText || !hasSendableFinalPayload || + // A run without a resolvable delivery route (e.g. rejected best-effort + // target) must not leave a custody marker restart recovery could act on. !params.deliveryContext ) { return { @@ -65,6 +71,8 @@ export async function persistPendingFinalDeliveryMarker( } const now = Date.now(); + const intentId = randomUUID(); + const deliveryId = randomUUID(); const persisted = await persistAgentSession({ sessionStore: params.sessionStore, sessionKey: params.sessionKey, @@ -73,8 +81,11 @@ export async function persistPendingFinalDeliveryMarker( entry: { ...entry, pendingFinalDelivery: { - kind: "replayable", - text: recoverableText, + ...(recoverableText + ? { kind: "replayable" as const, text: recoverableText } + : { kind: "transport-only" as const }), + intentId, + deliveries: [{ id: deliveryId, state: "prepared" as const }], createdAt: now, context: params.deliveryContext, }, @@ -83,13 +94,29 @@ export async function persistPendingFinalDeliveryMarker( shouldPersist: (current) => current?.sessionId === params.runOwnedSessionId && current.abortedLastRun !== true, }); - const markerPersisted = - persisted?.pendingFinalDelivery?.kind === "replayable" && - persisted.pendingFinalDelivery.text === recoverableText; + const markerPersisted = persisted?.pendingFinalDelivery?.intentId === intentId; + + if (markerPersisted) { + for (const payload of sendablePayloads) { + setReplyPayloadMetadata(payload, { + pendingFinalDeliveryCompletion: { + deliveryId, + intentId, + ...(entry.restartRecoveryDeliveryRunId + ? { recoveryRunId: entry.restartRecoveryDeliveryRunId } + : {}), + sessionId: params.runOwnedSessionId, + sessionKey: params.sessionKey, + storePath: params.storePath, + }, + }); + } + } return { sessionEntry: persisted, pendingFinalDeliveryMarkerPersisted: markerPersisted, + ...(markerPersisted ? { pendingFinalDeliveryIntentId: intentId } : {}), hasSendableFinalPayload, }; } diff --git a/src/auto-reply/reply-payload.ts b/src/auto-reply/reply-payload.ts index 07a91cbf158a..de0e313712ae 100644 --- a/src/auto-reply/reply-payload.ts +++ b/src/auto-reply/reply-payload.ts @@ -245,10 +245,15 @@ export type ReplyPayloadMetadata = { }; /** Opaque owner for one final-delivery transcript capture on a shared dispatcher. */ finalDeliveryCapture?: object; - /** Durable pending-final intent represented by this runtime payload. */ - pendingFinalDeliveryIntentId?: string; - /** Restart-safe text this payload contributes to its pending-final intent. */ - pendingFinalDeliveryRetryText?: string; + /** Exact persisted delivery owner; WeakMap-only and never serialized. */ + pendingFinalDeliveryCompletion?: { + deliveryId: string; + intentId: string; + recoveryRunId?: string; + sessionId: string; + sessionKey: string; + storePath: string; + }; /** replyToId existed before reply threading could inject an implicit target. */ replyToIdExplicit?: boolean; /** Canonical reply policy used by both message-tool dedupe and final delivery routing. */ diff --git a/src/auto-reply/reply/agent-runner-core.ts b/src/auto-reply/reply/agent-runner-core.ts index 558e5f1f7968..789fb297cc51 100644 --- a/src/auto-reply/reply/agent-runner-core.ts +++ b/src/auto-reply/reply/agent-runner-core.ts @@ -19,7 +19,6 @@ import { normalizeDeliveryContext, } from "../../utils/delivery-context.shared.js"; import { resolveFallbackTransition } from "../fallback-state.js"; -import { stripHeartbeatToken } from "../heartbeat.js"; import { isReplyPayloadStatusNotice, markReplyPayloadForSourceSuppressionDelivery, @@ -37,10 +36,7 @@ import type { BlockReplyPipeline } from "./block-reply-pipeline.js"; import { resolveEffectiveReplyRoute } from "./effective-reply-route.js"; import type { InternalGetReplyOptions } from "./get-reply.types.js"; import { normalizeReplyPayload } from "./normalize-reply.js"; -import { - buildPendingFinalDeliveryText, - sanitizePendingFinalDeliveryText, -} from "./pending-final-delivery.js"; +import { sanitizePendingFinalDeliveryText } from "./pending-final-delivery.js"; import { type FollowupRun, type QueueSettings, scheduleFollowupDrain } from "./queue.js"; import { normalizeReplyPayloadDirectives } from "./reply-delivery.js"; import { type ReplyOperation, runAfterReplyOperationClear } from "./reply-run-registry.js"; @@ -77,18 +73,6 @@ export function markBeforeAgentRunBlockedPayloads(payloads: ReplyPayload[]): Rep ); } -export function resolvePendingFinalDeliveryRetryText(params: { - isHeartbeat: boolean; - payload: ReplyPayload; -}): string { - const pendingText = buildPendingFinalDeliveryText([params.payload]); - if (!params.isHeartbeat) { - return pendingText; - } - const stripped = stripHeartbeatToken(pendingText, { mode: "message" }); - return stripped.shouldSkip ? "" : stripped.text || pendingText; -} - export function buildSilentFallbackFailurePayload(params: { fallbackTransition: ReturnType; fallbackFailureKnown: boolean; diff --git a/src/auto-reply/reply/agent-runner-execute.ts b/src/auto-reply/reply/agent-runner-execute.ts index cfbdf00e1c7f..edb9b63eec9a 100644 --- a/src/auto-reply/reply/agent-runner-execute.ts +++ b/src/auto-reply/reply/agent-runner-execute.ts @@ -319,15 +319,25 @@ export async function executePreparedReplyAgentRun( }); if (!sourceReplyPolicy.suppressDelivery) { const pendingFinalDeliveryIntentId = crypto.randomUUID(); + const pendingFinalDeliveryDeliveryId = crypto.randomUUID(); setReplyPayloadMetadata(hookReply, { - pendingFinalDeliveryIntentId, - pendingFinalDeliveryRetryText: hookFinalDeliveryText, + pendingFinalDeliveryCompletion: { + deliveryId: pendingFinalDeliveryDeliveryId, + intentId: pendingFinalDeliveryIntentId, + ...(activeSessionEntry?.restartRecoveryDeliveryRunId + ? { recoveryRunId: activeSessionEntry.restartRecoveryDeliveryRunId } + : {}), + sessionId: replyOperation.sessionId, + sessionKey, + storePath, + }, }); hookCheckpoint = { state: hookFinalDeliveryText ? "handled-reply" : "handled-unrecoverable", pendingFinalDelivery: { text: hookFinalDeliveryText ?? "", intentId: pendingFinalDeliveryIntentId, + deliveries: [{ id: pendingFinalDeliveryDeliveryId, state: "prepared" }], context: resolveReplyRunDeliveryContext({ cfg, sessionCtx, diff --git a/src/auto-reply/reply/agent-runner-result-complete.ts b/src/auto-reply/reply/agent-runner-result-complete.ts index 2b6ee70a4e07..fc3d7f376c15 100644 --- a/src/auto-reply/reply/agent-runner-result-complete.ts +++ b/src/auto-reply/reply/agent-runner-result-complete.ts @@ -14,7 +14,6 @@ import type { ReplyPayload } from "../types.js"; import { buildInlinePluginStatusPayload, markBeforeAgentRunBlockedPayloads, - resolvePendingFinalDeliveryRetryText, resolveReplyRunDeliveryContext, resolveSourceReplyPolicy, } from "./agent-runner-core.js"; @@ -35,7 +34,11 @@ import { mergeExecutionTrace, } from "./agent-runner-trace.js"; import { appendUsageLine } from "./agent-runner-usage-line.js"; -import { buildPendingFinalDeliveryText } from "./pending-final-delivery.js"; +import { + buildRecoverablePendingFinalDeliveryText, + normalizePendingFinalDeliveryPayloads, + normalizePendingFinalRecoveryPayloads, +} from "./pending-final-delivery.js"; import { readPostCompactionContext } from "./post-compaction-context.js"; import { warnPrivateMessageToolFinal } from "./private-message-tool-final.js"; import { enqueueFollowupRun, refreshQueuedFollowupSession } from "./queue.js"; @@ -310,10 +313,9 @@ export async function completeReplyAgentRun(input: { runtimePolicySessionKey, opts, }); - const finalDeliveryText = buildPendingFinalDeliveryText(finalPayloads); // #85714: warn only for unusually substantive private final text. In // message_tool_only, no tool call can be intentional silence, and - // finalDeliveryText also includes verbose/status/usage metadata. + // final payloads also include verbose/status/usage metadata. const assistantFinalText = normalizeAssistantFinalDeliveryText( typeof runResult.meta?.finalAssistantVisibleText === "string" ? runResult.meta.finalAssistantVisibleText @@ -357,7 +359,12 @@ export async function completeReplyAgentRun(input: { finalPayloads = [...finalPayloads, buildStrandedReplyDeliveryFailurePayload()]; } } - const pendingText = sourceReplyPolicy.suppressDelivery ? "" : finalDeliveryText; + const recoverablePendingFinalText = buildRecoverablePendingFinalDeliveryText( + normalizePendingFinalRecoveryPayloads(finalPayloads), + ); + const pendingText = sourceReplyPolicy.suppressDelivery + ? "" + : (recoverablePendingFinalText ?? ""); const heartbeatAckMaxChars = DEFAULT_HEARTBEAT_ACK_MAX_CHARS; const resolvedPendingText = isHeartbeat ? (() => { @@ -368,17 +375,30 @@ export async function completeReplyAgentRun(input: { return stripped.shouldSkip ? "" : stripped.text || pendingText; })() : pendingText; - if (resolvedPendingText) { + const sendableFinalPayloads = sourceReplyPolicy.suppressDelivery + ? [] + : finalPayloads.filter( + (payload) => normalizePendingFinalDeliveryPayloads([payload]).length > 0, + ); + if (sendableFinalPayloads.length > 0) { const pendingFinalDeliveryIntentId = crypto.randomUUID(); - for (const payload of finalPayloads) { + const expectedSessionId = activeSessionEntry?.sessionId ?? followupRun.run.sessionId; + const pendingFinalDeliveries = sendableFinalPayloads.map((payload) => { + const deliveryId = crypto.randomUUID(); setReplyPayloadMetadata(payload, { - pendingFinalDeliveryIntentId, - pendingFinalDeliveryRetryText: resolvePendingFinalDeliveryRetryText({ - isHeartbeat, - payload, - }), + pendingFinalDeliveryCompletion: { + deliveryId, + intentId: pendingFinalDeliveryIntentId, + ...(activeSessionEntry?.restartRecoveryDeliveryRunId + ? { recoveryRunId: activeSessionEntry.restartRecoveryDeliveryRunId } + : {}), + sessionId: expectedSessionId, + sessionKey, + storePath, + }, }); - } + return { id: deliveryId, state: "prepared" as const }; + }); const pendingFinalDeliveryContext = resolveReplyRunDeliveryContext({ cfg, sessionCtx, @@ -387,7 +407,6 @@ export async function completeReplyAgentRun(input: { runtimePolicySessionKey, opts, }); - const expectedSessionId = activeSessionEntry?.sessionId ?? followupRun.run.sessionId; // A reset can rebind the key while the model runs; its replacement must // never inherit the old run's final or advertise an uncommitted intent. const persistedPendingFinalDelivery = await updateSessionEntry( @@ -396,9 +415,11 @@ export async function completeReplyAgentRun(input: { entry.sessionId === expectedSessionId ? { pendingFinalDelivery: { - kind: "replayable" as const, - text: resolvedPendingText, + ...(resolvedPendingText + ? { kind: "replayable" as const, text: resolvedPendingText } + : { kind: "transport-only" as const }), intentId: pendingFinalDeliveryIntentId, + deliveries: pendingFinalDeliveries, context: pendingFinalDeliveryContext, createdAt: Date.now(), }, diff --git a/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts b/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts index 75984d60893c..cc351369e5e1 100644 --- a/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts +++ b/src/auto-reply/reply/agent-runner.runreplyagent.e2e.test.ts @@ -1588,16 +1588,84 @@ describe("runReplyAgent pending final delivery capture", () => { kind: "replayable", text: "visible final", intentId: expect.any(String), + deliveries: [{ id: expect.any(String), state: "prepared" }], }); const visiblePayload = (Array.isArray(result) ? result : [result]).find( (payload) => payload?.text === "visible final", ); expect(getReplyPayloadMetadata(visiblePayload ?? {})).toMatchObject({ - pendingFinalDeliveryIntentId: stored.pendingFinalDelivery?.intentId, - pendingFinalDeliveryRetryText: "visible final", + pendingFinalDeliveryCompletion: { + deliveryId: stored.pendingFinalDelivery?.deliveries?.[0]?.id, + intentId: stored.pendingFinalDelivery?.intentId, + sessionId: "session", + sessionKey: "main", + storePath, + }, }); }); + it("owns a media-only final with its complete replay directive", async () => { + const { sessionEntry, sessionStore, storePath } = await makeSessionFixture(); + state.runEmbeddedAgentMock.mockResolvedValueOnce({ + payloads: [{ mediaUrl: "https://example.test/final.png" }], + meta: {}, + }); + const { run } = createMinimalRun({ + sessionEntry, + sessionStore, + sessionKey: "main", + storePath, + }); + + const result = await run(); + const stored = await readStoredMainSession(storePath); + expect(stored.pendingFinalDelivery).toMatchObject({ + kind: "replayable", + text: "MEDIA:https://example.test/final.png", + intentId: expect.any(String), + deliveries: [{ id: expect.any(String), state: "prepared" }], + }); + const payload = Array.isArray(result) ? result[0] : result; + expect(getReplyPayloadMetadata(payload ?? {})).toMatchObject({ + pendingFinalDeliveryCompletion: { + deliveryId: stored.pendingFinalDelivery?.deliveries?.[0]?.id, + intentId: stored.pendingFinalDelivery?.intentId, + }, + }); + }); + + it("owns mixed text and media finals without replaying a partial aggregate", async () => { + const { sessionEntry, sessionStore, storePath } = await makeSessionFixture(); + state.runEmbeddedAgentMock.mockResolvedValueOnce({ + payloads: [{ text: "visible text" }, { mediaUrl: "https://example.test/final.png" }], + meta: {}, + }); + const { run } = createMinimalRun({ + sessionEntry, + sessionStore, + sessionKey: "main", + storePath, + }); + + const result = await run(); + const payloads = Array.isArray(result) ? result : [result]; + const stored = await readStoredMainSession(storePath); + expect(stored.pendingFinalDelivery).toMatchObject({ + kind: "transport-only", + deliveries: [ + { id: expect.any(String), state: "prepared" }, + { id: expect.any(String), state: "prepared" }, + ], + }); + expect(stored.pendingFinalDelivery).not.toHaveProperty("text"); + expect( + payloads.map( + (payload) => + getReplyPayloadMetadata(payload ?? {})?.pendingFinalDeliveryCompletion?.deliveryId, + ), + ).toEqual(stored.pendingFinalDelivery?.deliveries?.map(({ id }) => id)); + }); + it("persists canonical SQLite pending final delivery after its intent commits", async () => { const sessionKey = "agent:main:main"; const { sessionEntry, sessionStore, storePath } = await makeSessionFixture({}, sessionKey); @@ -1620,13 +1688,19 @@ describe("runReplyAgent pending final delivery capture", () => { kind: "replayable", intentId: expect.any(String), text: "visible canonical final", + deliveries: [{ id: expect.any(String), state: "prepared" }], }, sessionId: "session", }); const visiblePayload = Array.isArray(result) ? result[0] : result; expect(getReplyPayloadMetadata(visiblePayload ?? {})).toMatchObject({ - pendingFinalDeliveryIntentId: stored?.pendingFinalDelivery?.intentId, - pendingFinalDeliveryRetryText: "visible canonical final", + pendingFinalDeliveryCompletion: { + deliveryId: stored?.pendingFinalDelivery?.deliveries?.[0]?.id, + intentId: stored?.pendingFinalDelivery?.intentId, + sessionId: "session", + sessionKey, + storePath, + }, }); expect(state.runEmbeddedAgentMock).toHaveBeenCalledOnce(); }); @@ -2857,11 +2931,17 @@ describe("runReplyAgent pending final delivery capture", () => { expect(stored.pendingFinalDelivery).toMatchObject({ kind: "replayable", text: longRemainder, + deliveries: [{ id: expect.any(String), state: "prepared" }], }); const payload = Array.isArray(result) ? result[0] : result; expect(getReplyPayloadMetadata(payload ?? {})).toMatchObject({ - pendingFinalDeliveryIntentId: stored.pendingFinalDelivery?.intentId, - pendingFinalDeliveryRetryText: longRemainder, + pendingFinalDeliveryCompletion: { + deliveryId: stored.pendingFinalDelivery?.deliveries?.[0]?.id, + intentId: stored.pendingFinalDelivery?.intentId, + sessionId: "session", + sessionKey: "main", + storePath, + }, }); }); }); diff --git a/src/auto-reply/reply/before-deliver.test.ts b/src/auto-reply/reply/before-deliver.test.ts index 4adf96ce1935..4fb4dd2b1dc2 100644 --- a/src/auto-reply/reply/before-deliver.test.ts +++ b/src/auto-reply/reply/before-deliver.test.ts @@ -1,5 +1,12 @@ // Tests before-deliver hook ordering and payload mutation behavior. -import { describe, expect, it } from "vitest"; +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { describe, expect, it, vi } from "vitest"; +import { createDeferred } from "../../../test/helpers/promise.js"; +import { createDirectPendingFinalCustody } from "../../channels/turn/direct-delivery-custody.js"; +import { loadSessionEntry, replaceSessionEntry } from "../../config/sessions/session-accessor.js"; +import type { InternalSessionEntry } from "../../config/sessions/types.js"; import { getReplyPayloadMetadata, setReplyPayloadMetadata } from "../reply-payload.js"; import type { ReplyPayload } from "../types.js"; import { @@ -9,6 +16,40 @@ import { createReplyDispatcher, } from "./reply-dispatcher.js"; +async function makePendingFinalFixture() { + const tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-dispatcher-pending-final-")); + const storePath = path.join(tmpDir, "sessions.json"); + const sessionKey = "agent:main:telegram:direct:123"; + await replaceSessionEntry( + { sessionKey, storePath }, + { + sessionId: "session-1", + status: "running", + updatedAt: Date.now(), + pendingFinalDelivery: { + kind: "replayable", + text: "final answer", + createdAt: Date.now(), + intentId: "intent-1", + deliveries: [{ id: "delivery-1", state: "prepared" }], + }, + }, + ); + const payload = setReplyPayloadMetadata( + { text: "final answer" }, + { + pendingFinalDeliveryCompletion: { + deliveryId: "delivery-1", + intentId: "intent-1", + sessionId: "session-1", + sessionKey, + storePath, + }, + }, + ); + return { payload, sessionKey, storePath, tmpDir }; +} + describe("beforeDeliver in reply dispatcher", () => { it("delivers the attached fallback when the primary payload is cancelled", async () => { const delivered: string[] = []; @@ -301,4 +342,201 @@ describe("beforeDeliver in reply dispatcher", () => { expect(delivered).toEqual(["plain reply"]); }); + + it("records direct-delivery custody before waiting for the channel provider", async () => { + const fixture = await makePendingFinalFixture(); + const enteredProvider = createDeferred(); + const releaseProvider = createDeferred(); + try { + const dispatcher = createReplyDispatcher({ + deliver: async () => { + enteredProvider.resolve(); + await releaseProvider.promise; + }, + }); + + dispatcher.sendFinalReply(fixture.payload); + dispatcher.markComplete(); + await enteredProvider.promise; + + expect( + ( + loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry + )?.pendingFinalDelivery?.deliveries, + ).toEqual([{ id: "delivery-1", state: "queued" }]); + + releaseProvider.resolve(); + await dispatcher.waitForIdle(); + expect( + ( + loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry + )?.pendingFinalDelivery?.deliveries, + ).toEqual([{ id: "delivery-1", state: "delivered" }]); + } finally { + releaseProvider.resolve(); + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); + + it.each([ + { + label: "proven pre-send failure", + error: () => + Object.assign(new Error("connect failed"), { code: "ECONNREFUSED", syscall: "connect" }), + expected: "prepared", + }, + { + label: "ambiguous provider failure", + error: () => new Error("send outcome unknown"), + expected: "unknown", + }, + ] as const)("records $label before reporting the error", async ({ error, expected }) => { + const fixture = await makePendingFinalFixture(); + try { + const dispatcher = createReplyDispatcher({ + deliver: async () => { + throw error(); + }, + }); + + dispatcher.sendFinalReply(fixture.payload); + dispatcher.markComplete(); + await dispatcher.waitForIdle(); + + expect( + ( + loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry + )?.pendingFinalDelivery?.deliveries, + ).toEqual([{ id: "delivery-1", state: expected }]); + } finally { + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); + + it("restores prepared custody when a pre-I/O admitted send proves no-send", async () => { + const fixture = await makePendingFinalFixture(); + try { + const dispatcher = createReplyDispatcher({ + deliver: async (payload) => { + // Mirror the channel-turn direct path: custody escalates queued→unknown + // immediately before wire I/O, then the provider proves no send happened. + const custody = createDirectPendingFinalCustody(payload); + await custody?.onPlatformSendDispatch(); + throw Object.assign(new Error("connect failed"), { + code: "ECONNREFUSED", + syscall: "connect", + }); + }, + }); + + dispatcher.sendFinalReply(fixture.payload); + dispatcher.markComplete(); + await dispatcher.waitForIdle(); + + expect( + ( + loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry + )?.pendingFinalDelivery?.deliveries, + ).toEqual([{ id: "delivery-1", state: "prepared" }]); + } finally { + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); + + it("suppresses a second direct call after the exact delivery is terminal", async () => { + const fixture = await makePendingFinalFixture(); + const deliver = vi.fn(async () => {}); + try { + const first = createReplyDispatcher({ deliver }); + first.sendFinalReply(fixture.payload); + first.markComplete(); + await first.waitForIdle(); + + const second = createReplyDispatcher({ deliver }); + second.sendFinalReply(fixture.payload); + second.markComplete(); + await second.waitForIdle(); + + expect(deliver).toHaveBeenCalledOnce(); + expect(second.getCancelledCounts?.().final).toBe(1); + } finally { + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); + + it("suppresses a direct call whose persisted owner was replaced", async () => { + const fixture = await makePendingFinalFixture(); + const current = loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry; + await replaceSessionEntry( + { sessionKey: fixture.sessionKey, storePath: fixture.storePath }, + { + ...current, + pendingFinalDelivery: { + ...current.pendingFinalDelivery!, + intentId: "replacement-intent", + }, + }, + ); + const deliver = vi.fn(async () => {}); + try { + const dispatcher = createReplyDispatcher({ deliver }); + dispatcher.sendFinalReply(fixture.payload); + dispatcher.markComplete(); + await dispatcher.waitForIdle(); + + expect(deliver).not.toHaveBeenCalled(); + expect(dispatcher.getCancelledCounts?.().final).toBe(1); + } finally { + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); + + it("records policy suppression before awaiting cancellation observers", async () => { + const fixture = await makePendingFinalFixture(); + const observerStarted = createDeferred(); + const releaseObserver = createDeferred(); + try { + const dispatcher = createReplyDispatcher({ + beforeDeliver: () => null, + deliver: async () => {}, + onBeforeDeliverCancelled: async () => { + observerStarted.resolve(); + await releaseObserver.promise; + }, + }); + dispatcher.sendFinalReply(fixture.payload); + dispatcher.markComplete(); + await observerStarted.promise; + + expect( + ( + loadSessionEntry({ + sessionKey: fixture.sessionKey, + storePath: fixture.storePath, + }) as InternalSessionEntry + )?.pendingFinalDelivery?.deliveries, + ).toEqual([{ id: "delivery-1", state: "suppressed" }]); + + releaseObserver.resolve(); + await dispatcher.waitForIdle(); + } finally { + releaseObserver.resolve(); + await fs.rm(fixture.tmpDir, { recursive: true, force: true }); + } + }); }); diff --git a/src/auto-reply/reply/dispatch-from-config.finalize.ts b/src/auto-reply/reply/dispatch-from-config.finalize.ts index 5581f8ecfc69..dcfcb897de86 100644 --- a/src/auto-reply/reply/dispatch-from-config.finalize.ts +++ b/src/auto-reply/reply/dispatch-from-config.finalize.ts @@ -21,8 +21,7 @@ import { } from "./dispatch-from-config.payloads.js"; import { clearPendingFinalDeliveryAfterSuccess, - capturePendingFinalDeliveryIdentity, - reconcilePendingFinalDeliveryAfterSettlement, + suppressPendingFinalDelivery, } from "./dispatch-from-config.pending-final.js"; import type { ReplyDispatchDeliveryOutcome } from "./reply-dispatcher.js"; @@ -48,26 +47,15 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) sendPolicyDenied, sessionAgentId, sessionKey, - sessionStoreEntry, suppressDelivery, throwIfDispatchOperationAborted, turnLedger, waitForPendingDirectBlockReplyDelivery, } = state; const replies = replyResult ? (Array.isArray(replyResult) ? replyResult : [replyResult]) : []; - const pendingFinalDelivery = { - storePath: sessionStoreEntry.storePath, - sessionKey: sessionStoreEntry.sessionKey ?? sessionKey, - }; - const replyPendingIntentIds = new Set( - replies - .map((reply) => getReplyPayloadMetadata(reply)?.pendingFinalDeliveryIntentId) - .filter((intentId): intentId is string => Boolean(intentId)), - ); - const pendingFinalDeliveryIdentity = capturePendingFinalDeliveryIdentity({ - ...pendingFinalDelivery, - intentId: replyPendingIntentIds.size === 1 ? [...replyPendingIntentIds][0] : undefined, - }); + const pendingFinalDeliveryIdentity = replies + .map((reply) => getReplyPayloadMetadata(reply)?.pendingFinalDeliveryCompletion) + .find((completion) => completion !== undefined); // Final delivery is outside the progress wrappers. Wait until every source-ordered callback // has at least started so a delayed tool/reasoning transition cannot appear after the final. if (state.preserveProgressCallbackStartOrder) { @@ -84,10 +72,7 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) let routedFinalCount = 0; let attemptedFinalDelivery = false; let finalDeliveryFailed = false; - const finalDeliveries: Array<{ - outcome: Promise; - payload: ReplyPayload; - }> = []; + const finalDeliveries: Promise[] = []; let allQueuedFinalsObserved = true; const sentFinalPayloadDedupeKeys = new Set(); let deferredTtsTextPending = state.progressState.accumulatedBlockTtsText; @@ -96,9 +81,11 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) // Durable reasoning is a channel-owned lane; generic channels keep the // historical suppression unless they explicitly opt in. if (reply.isReasoning === true && !state.reasoningPayloadsEnabled) { + await suppressPendingFinalDelivery(reply); continue; } if (reply.isCommentary === true && !state.commentaryPayloadsEnabled) { + await suppressPendingFinalDelivery(reply); continue; } if (suppressDelivery && !shouldDeliverDespiteSourceReplySuppression(reply, state)) { @@ -116,10 +103,12 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) ].join(" "), ); } + await suppressPendingFinalDelivery(reply); continue; } const finalPayloadDedupeKey = createFinalDispatchPayloadDedupeKey(reply); if (sentFinalPayloadDedupeKeys.has(finalPayloadDedupeKey)) { + await suppressPendingFinalDelivery(reply); continue; } sentFinalPayloadDedupeKeys.add(finalPayloadDedupeKey); @@ -141,6 +130,7 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) } if (finalReply.dedupedAgainstBlock) { // The delivering block already settled into the turn ledger. + await suppressPendingFinalDelivery(reply); continue; } attemptedFinalDelivery = true; @@ -148,7 +138,7 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) routedFinalCount += finalReply.routedFinalCount; if (finalReply.queuedFinal) { if (finalReply.dispatcherOutcome) { - finalDeliveries.push({ outcome: finalReply.dispatcherOutcome, payload: reply }); + finalDeliveries.push(finalReply.dispatcherOutcome); } else { allQueuedFinalsObserved = false; } @@ -162,19 +152,9 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) if (queuedFinal && allQueuedFinalsObserved) { // Delivery observers run from the queue itself, so direct low-level callers // reconcile too; the settle task only makes lifecycle owners await it. - const reconcilePendingFinal = Promise.all( - finalDeliveries.map(async (delivery) => ({ - outcome: await delivery.outcome, - payload: delivery.payload, - })), - ) - .then(async (deliveries) => { - await reconcilePendingFinalDeliveryAfterSettlement({ - ...pendingFinalDelivery, - deliveries, - identity: pendingFinalDeliveryIdentity, - replies, - }); + const reconcilePendingFinal = Promise.all(finalDeliveries) + .then(async () => { + await clearPendingFinalDeliveryAfterSuccess(pendingFinalDeliveryIdentity); }) .catch((error: unknown) => { logVerbose( @@ -185,10 +165,7 @@ export async function finalizeDispatchAndAudit(state: ExecuteDispatchReadyState) } else { // Routed delivery has a transport result already. Custom dispatchers that // do not expose the core observer retain the legacy queue-admission behavior. - await clearPendingFinalDeliveryAfterSuccess({ - ...pendingFinalDelivery, - identity: pendingFinalDeliveryIdentity, - }); + await clearPendingFinalDeliveryAfterSuccess(pendingFinalDeliveryIdentity); } // Register successful queued cleanup before honoring a late abort. The // outer settle owner still runs it from finally (#89115). diff --git a/src/auto-reply/reply/dispatch-from-config.pending-final.test.ts b/src/auto-reply/reply/dispatch-from-config.pending-final.test.ts index ed7e84b938bb..9bf76bc7aef9 100644 --- a/src/auto-reply/reply/dispatch-from-config.pending-final.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.pending-final.test.ts @@ -4,11 +4,14 @@ import path from "node:path"; import { afterEach, beforeEach, describe, expect, it } from "vitest"; import { loadSessionEntry, replaceSessionEntry } from "../../config/sessions/session-accessor.js"; import type { InternalSessionEntry as SessionEntry } from "../../config/sessions/types.js"; -import type { ReplyPayload } from "../reply-payload.js"; import { - capturePendingFinalDeliveryIdentity, + getReplyPayloadMetadata, + setReplyPayloadMetadata, + type ReplyPayload, +} from "../reply-payload.js"; +import { clearPendingFinalDeliveryAfterSuccess, - reconcilePendingFinalDeliveryAfterSettlement, + suppressPendingFinalDelivery, } from "./dispatch-from-config.pending-final.js"; import { retireTerminalRestartRecoverySourceClaim } from "./restart-recovery-claim.js"; @@ -28,6 +31,7 @@ describe("pending final delivery restart proof", () => { async function writePendingFinal( beforeAgentReplyState: "continue" | "handled-reply", + state: "prepared" | "delivered" = "delivered", ): Promise { const entry: SessionEntry = { sessionId: "session", @@ -40,6 +44,7 @@ describe("pending final delivery restart proof", () => { text: "hook reply", createdAt: 1, intentId: "intent-1", + deliveries: [{ id: "delivery-1", state }], }, restartRecoveryBeforeAgentReplyState: beforeAgentReplyState, restartRecoveryForceSafeTools: beforeAgentReplyState === "handled-reply" ? true : undefined, @@ -48,17 +53,28 @@ describe("pending final delivery restart proof", () => { await replaceSessionEntry({ storePath, sessionKey }, entry); } + function pendingFinalPayload(deliveryId = "delivery-1"): ReplyPayload { + const payload: ReplyPayload = { text: "hook reply" }; + setReplyPayloadMetadata(payload, { + pendingFinalDeliveryCompletion: { + deliveryId, + intentId: "intent-1", + sessionId: "session", + sessionKey, + storePath, + }, + }); + return payload; + } + it.each(["continue", "handled-reply"] as const)( "clears %s provenance only after the exact pending intent succeeds", async (beforeAgentReplyState) => { await writePendingFinal(beforeAgentReplyState); - const identity = capturePendingFinalDeliveryIdentity({ - intentId: "intent-1", - sessionKey, - storePath, - }); + const identity = + getReplyPayloadMetadata(pendingFinalPayload())?.pendingFinalDeliveryCompletion; - await clearPendingFinalDeliveryAfterSuccess({ identity, sessionKey, storePath }); + await clearPendingFinalDeliveryAfterSuccess(identity); const entry = loadSessionEntry({ sessionKey, storePath }) as SessionEntry | undefined; expect(entry?.pendingFinalDelivery).toBeUndefined(); @@ -87,18 +103,25 @@ describe("pending final delivery restart proof", () => { kind: "transport-only", createdAt: Date.now(), intentId: "intent-media", + deliveries: [{ id: "delivery-media", state: "delivered" }], }, restartRecoveryBeforeAgentReplyState: "handled-unrecoverable", restartRecoverySourceIngress: "channel", }; await replaceSessionEntry({ storePath, sessionKey }, entry); - const identity = capturePendingFinalDeliveryIdentity({ - intentId: "intent-media", - sessionKey, - storePath, + const payload: ReplyPayload = { mediaUrl: "https://example.test/image.png" }; + setReplyPayloadMetadata(payload, { + pendingFinalDeliveryCompletion: { + deliveryId: "delivery-media", + intentId: "intent-media", + sessionId: "session", + sessionKey, + storePath, + }, }); + const identity = getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion; - await clearPendingFinalDeliveryAfterSuccess({ identity, sessionKey, storePath }); + await clearPendingFinalDeliveryAfterSuccess(identity); expect(loadSessionEntry({ sessionKey, storePath })).toMatchObject({ status: "done", @@ -109,32 +132,40 @@ describe("pending final delivery restart proof", () => { ).toBeUndefined(); }); - it("keeps normal-turn provenance when transport fails before delivery", async () => { - await writePendingFinal("continue"); - const identity = capturePendingFinalDeliveryIdentity({ - intentId: "intent-1", - sessionKey, - storePath, - }); - const payload: ReplyPayload = { text: "hook reply" }; - - await reconcilePendingFinalDeliveryAfterSettlement({ - deliveries: [{ outcome: "failed-before-deliver", payload }], - identity, - replies: [payload], - sessionKey, - storePath, - }); - - expect(loadSessionEntry({ sessionKey, storePath })).toMatchObject({ - pendingFinalDelivery: { - kind: "replayable", - text: "hook reply", - intentId: "intent-1", + it("clears a skipped turn only after every sendable final is suppressed", async () => { + await writePendingFinal("continue", "prepared"); + await replaceSessionEntry( + { storePath, sessionKey }, + { + ...(loadSessionEntry({ sessionKey, storePath }) as SessionEntry), + pendingFinalDelivery: { + kind: "replayable", + text: "hook reply", + createdAt: 1, + intentId: "intent-1", + deliveries: [ + { id: "delivery-1", state: "prepared" }, + { id: "delivery-2", state: "prepared" }, + ], + }, }, - restartRecoveryBeforeAgentReplyState: "continue", - restartRecoverySourceIngress: "channel", - }); + ); + + await suppressPendingFinalDelivery(pendingFinalPayload("delivery-1")); + + expect( + (loadSessionEntry({ sessionKey, storePath }) as SessionEntry).pendingFinalDelivery + ?.deliveries, + ).toEqual([ + { id: "delivery-1", state: "suppressed" }, + { id: "delivery-2", state: "prepared" }, + ]); + + await suppressPendingFinalDelivery(pendingFinalPayload("delivery-2")); + + expect( + (loadSessionEntry({ sessionKey, storePath }) as SessionEntry).pendingFinalDelivery, + ).toBeUndefined(); }); it("does not retire a source while its terminal provider outcome is unknown", async () => { diff --git a/src/auto-reply/reply/dispatch-from-config.pending-final.ts b/src/auto-reply/reply/dispatch-from-config.pending-final.ts index f0098431f190..c0515e056ea1 100644 --- a/src/auto-reply/reply/dispatch-from-config.pending-final.ts +++ b/src/auto-reply/reply/dispatch-from-config.pending-final.ts @@ -1,245 +1,73 @@ import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce"; +import { buildRestartRecoveryClaimCleanupPatch } from "../../config/sessions/restart-recovery-state.js"; +import { updateSessionEntry } from "../../config/sessions/session-accessor.js"; +import { settlePendingFinalDelivery } from "../../infra/outbound/delivery-completion.js"; import { - loadSessionEntryReadOnly, - updateSessionEntry, -} from "../../config/sessions/session-accessor.js"; -import type { InternalSessionEntry as SessionEntry } from "../../config/sessions/types.js"; -import type { ReplyPayload } from "../reply-payload.js"; -import { getReplyPayloadMetadata } from "../reply-payload.js"; -import { - buildPendingFinalDeliveryText, - sanitizePendingFinalDeliveryText, -} from "./pending-final-delivery.js"; -import type { ReplyDispatchDeliveryOutcome } from "./reply-dispatcher.js"; + getReplyPayloadMetadata, + type ReplyPayload, + type ReplyPayloadMetadata, +} from "../reply-payload.js"; -type SettledFinalDelivery = { - outcome: ReplyDispatchDeliveryOutcome; - payload: ReplyPayload; -}; +type PendingFinalDeliveryIdentity = NonNullable< + ReplyPayloadMetadata["pendingFinalDeliveryCompletion"] +>; -type PendingFinalDeliveryIdentity = { - createdAt?: number; - intentId?: string; - present: boolean; - text?: string; -}; - -function buildPendingFinalDeliveryCleanupPatch(entry: SessionEntry): Partial { - // An active receipt/claim may outlive outer reply settlement. Only claimless pending finals - // borrow hook provenance until their exact transport intent settles. - const clearsRestartRecoveryProof = - normalizeOptionalString(entry.restartRecoveryDeliveryRunId) === undefined; - const completesHookHandledTurn = - clearsRestartRecoveryProof && - (entry.restartRecoveryBeforeAgentReplyState === "handled-reply" || - entry.restartRecoveryBeforeAgentReplyState === "handled-unrecoverable"); - const endedAt = completesHookHandledTurn ? Date.now() : undefined; - return { - pendingFinalDelivery: undefined, - ...(clearsRestartRecoveryProof - ? { - restartRecoveryBeforeAgentReplyState: undefined, - restartRecoverySourceIngress: undefined, - restartRecoveryForceSafeTools: undefined, - } - : {}), - ...(endedAt !== undefined - ? { - abortedLastRun: false, - endedAt, - lifecycleRunId: undefined, - runtimeMs: - typeof entry.startedAt === "number" - ? Math.max(0, endedAt - entry.startedAt) - : undefined, - status: "done" as const, - } - : {}), - }; +export async function suppressPendingFinalDelivery(payload: ReplyPayload): Promise { + const completion = getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion; + if (completion) { + await settlePendingFinalDelivery({ kind: "pending-final", ...completion }, "suppressed", [ + "prepared", + ]); + await clearPendingFinalDeliveryAfterSuccess(completion); + } } -function matchesPendingFinalDeliveryIdentity( - entry: SessionEntry, - expected: PendingFinalDeliveryIdentity, -): boolean { - const pending = entry.pendingFinalDelivery; - const currentPresent = pending !== undefined; - if (currentPresent !== expected.present) { - return false; - } - if (expected.intentId) { - return pending?.intentId === expected.intentId; - } - return ( - pending?.createdAt === expected.createdAt && - (pending?.kind === "replayable" ? pending.text : undefined) === expected.text - ); -} - -export async function clearPendingFinalDeliveryAfterSuccess(params: { - identity?: PendingFinalDeliveryIdentity; - storePath?: string; - sessionKey?: string; -}): Promise { - const identity = params.identity; - if (!params.storePath || !params.sessionKey || !identity?.present) { +export async function clearPendingFinalDeliveryAfterSuccess( + identity?: PendingFinalDeliveryIdentity, +): Promise { + if (!identity) { return; } await updateSessionEntry( - { storePath: params.storePath, sessionKey: params.sessionKey }, - async (entry) => { - if (!matchesPendingFinalDeliveryIdentity(entry, identity)) { - return null; - } - if (!entry.pendingFinalDelivery) { - return null; - } - return { - ...buildPendingFinalDeliveryCleanupPatch(entry), - updatedAt: Date.now(), - }; - }, - { skipMaintenance: true, takeCacheOwnership: true }, - ); -} - -export function capturePendingFinalDeliveryIdentity(params: { - intentId?: string; - storePath?: string; - sessionKey?: string; -}): PendingFinalDeliveryIdentity | undefined { - if (!params.storePath || !params.sessionKey) { - return undefined; - } - try { - const entry = loadSessionEntryReadOnly({ - storePath: params.storePath, - sessionKey: params.sessionKey, - hydrateSkillPromptRefs: false, - readConsistency: "latest", - }); - const pending = entry?.pendingFinalDelivery; - if (params.intentId && pending?.intentId !== params.intentId) { - return { present: false }; - } - return { - present: pending !== undefined, - intentId: params.intentId ?? pending?.intentId, - createdAt: pending?.createdAt, - text: pending?.kind === "replayable" ? pending.text : undefined, - }; - } catch { - return params.intentId ? { present: true, intentId: params.intentId } : undefined; - } -} - -function buildPendingFinalDeliveryRetryText(payloads: ReplyPayload[]): string { - return sanitizePendingFinalDeliveryText( - payloads - .map( - (payload) => - getReplyPayloadMetadata(payload)?.pendingFinalDeliveryRetryText ?? - buildPendingFinalDeliveryText([payload]), - ) - .filter(Boolean) - .join("\n\n"), - ); -} - -function resolvePendingFinalDeliveryPayloads(params: { - intentId?: string; - pendingText: string; - replies: ReplyPayload[]; -}): ReplyPayload[] | undefined { - const intentReplies = params.intentId - ? params.replies.filter((reply) => { - const metadata = getReplyPayloadMetadata(reply); - return ( - metadata?.pendingFinalDeliveryIntentId === params.intentId && - metadata?.pendingFinalDeliveryRetryText !== undefined - ); - }) - : []; - const intentContributors = intentReplies.filter( - (reply) => getReplyPayloadMetadata(reply)?.pendingFinalDeliveryRetryText, - ); - const intentText = buildPendingFinalDeliveryRetryText(intentContributors); - if ( - intentReplies.length > 0 && - intentText.replace(/\s+/g, " ").trim() === params.pendingText.replace(/\s+/g, " ").trim() - ) { - return intentContributors; - } - const contributingReplies = params.replies.filter( - (reply) => buildPendingFinalDeliveryText([reply]) !== "", - ); - if (buildPendingFinalDeliveryText(contributingReplies) === params.pendingText) { - return contributingReplies; - } - const exactMatches = contributingReplies.filter( - (reply) => buildPendingFinalDeliveryText([reply]) === params.pendingText, - ); - return exactMatches.length === 1 ? exactMatches : undefined; -} - -export async function reconcilePendingFinalDeliveryAfterSettlement(params: { - deliveries: SettledFinalDelivery[]; - identity?: PendingFinalDeliveryIdentity; - replies: ReplyPayload[]; - storePath?: string; - sessionKey?: string; -}): Promise { - const identity = params.identity; - if (!params.storePath || !params.sessionKey || !identity?.present) { - return; - } - await updateSessionEntry( - { storePath: params.storePath, sessionKey: params.sessionKey }, - async (entry) => { - if (!matchesPendingFinalDeliveryIdentity(entry, identity)) { - return null; - } - const pending = entry.pendingFinalDelivery; - if (!pending) { - return null; - } - const pendingPayloads = - pending.kind === "replayable" - ? resolvePendingFinalDeliveryPayloads({ - intentId: identity.intentId, - pendingText: pending.text, - replies: params.replies, - }) - : undefined; - const pendingPayloadSet = pendingPayloads ? new Set(pendingPayloads) : undefined; - const relevantDeliveries = pendingPayloadSet - ? params.deliveries.filter((delivery) => pendingPayloadSet.has(delivery.payload)) - : params.deliveries; - const ownsEveryPendingPayload = - !pendingPayloadSet || relevantDeliveries.length === pendingPayloadSet.size; - const failedBeforeDeliver = relevantDeliveries.filter( - (delivery) => delivery.outcome === "failed-before-deliver", - ); - + { storePath: identity.storePath, sessionKey: identity.sessionKey }, + (entry) => { + const recoveryRunId = normalizeOptionalString(entry.restartRecoveryDeliveryRunId); + const deliveries = entry.pendingFinalDelivery?.deliveries; if ( - relevantDeliveries.length > 0 && - failedBeforeDeliver.length === relevantDeliveries.length + entry.sessionId !== identity.sessionId || + entry.pendingFinalDelivery?.intentId !== identity.intentId || + !deliveries?.length || + !deliveries.every(({ state }) => state === "delivered" || state === "suppressed") || + (recoveryRunId !== undefined && recoveryRunId !== identity.recoveryRunId) ) { return null; } - if (pendingPayloadSet && ownsEveryPendingPayload && failedBeforeDeliver.length > 0) { - const retryText = buildPendingFinalDeliveryRetryText( - failedBeforeDeliver.map((delivery) => delivery.payload), - ); - if (retryText && pending.kind === "replayable") { - return { - pendingFinalDelivery: { ...pending, text: retryText }, - updatedAt: Date.now(), - }; - } - } + const completesHookTurn = + recoveryRunId === undefined && + (entry.restartRecoveryBeforeAgentReplyState === "handled-reply" || + entry.restartRecoveryBeforeAgentReplyState === "handled-unrecoverable"); + const endedAt = completesHookTurn ? Date.now() : undefined; return { - ...buildPendingFinalDeliveryCleanupPatch(entry), + ...(recoveryRunId + ? buildRestartRecoveryClaimCleanupPatch({ entry, recordTerminalSource: true }) + : { + restartRecoveryBeforeAgentReplyState: undefined, + restartRecoverySourceIngress: undefined, + restartRecoveryForceSafeTools: undefined, + }), + pendingFinalDelivery: undefined, + ...(endedAt === undefined + ? {} + : { + abortedLastRun: false, + endedAt, + lifecycleRunId: undefined, + runtimeMs: + typeof entry.startedAt === "number" + ? Math.max(0, endedAt - entry.startedAt) + : undefined, + status: "done" as const, + }), updatedAt: Date.now(), }; }, diff --git a/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts b/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts index c589f0f9721b..462d7cd57026 100644 --- a/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts +++ b/src/auto-reply/reply/dispatch-from-config.reply-dispatch.test.ts @@ -2,6 +2,10 @@ import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; import { createDeferred } from "../../../test/helpers/promise.js"; import { clearAgentHarnesses } from "../../agents/harness/registry.js"; +import { + OutboundDeliveryError, + PlatformMessageNotDispatchedError, +} from "../../infra/outbound/deliver-types.js"; import type { PluginHookReplyDispatchResult } from "../../plugins/hooks.test-fixtures.js"; import { getPluginRuntimeGatewayRequestScope } from "../../plugins/runtime/gateway-request-scope.js"; import { createInternalHookEventPayload } from "../../test-utils/internal-hook-event-payload.js"; @@ -55,9 +59,42 @@ function firstReplyDispatchCall() { function pendingFinalDelivery( text: string, - overrides: { createdAt?: number; context?: Record; intentId?: string } = {}, + overrides: { + createdAt?: number; + context?: Record; + deliveries?: Array<{ + id: string; + state: "prepared" | "queued" | "delivered" | "suppressed" | "unknown"; + }>; + intentId?: string; + } = {}, ) { - return { kind: "replayable" as const, text, createdAt: 1, ...overrides }; + return { + kind: "replayable" as const, + text, + createdAt: 1, + intentId: "intent-1", + deliveries: [{ id: "delivery-1", state: "prepared" as const }], + ...overrides, + }; +} + +function pendingFinalReply( + text: string, + overrides: { deliveryId?: string; intentId?: string } = {}, +): ReplyPayload { + return setReplyPayloadMetadata( + { text }, + { + pendingFinalDeliveryCompletion: { + deliveryId: overrides.deliveryId ?? "delivery-1", + intentId: overrides.intentId ?? "intent-1", + sessionId: "session-1", + sessionKey: "agent:test:session", + storePath: "/tmp/mock-sessions.json", + }, + }, + ); } describe("dispatchReplyFromConfig reply_dispatch hook", () => { @@ -217,6 +254,93 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { }); }); + it("clears pending final delivery after final dispatch succeeds", async () => { + hookMocks.runner.hasHooks.mockReturnValue(false); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pendingFinalDelivery("durable reply", { + context: { source: "heartbeat" }, + }), + }; + sessionStoreMocks.loadSessionStore.mockClear(); + mocks.routeReply.mockResolvedValue({ ok: true, delivered: true, messageId: "mock" }); + + const deliver = vi.fn().mockResolvedValue(undefined); + const dispatcher = createReplyDispatcher({ deliver }); + const result = await dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyResolver: async () => pendingFinalReply("durable reply"), + }); + await dispatcher.waitForIdle(); + await vi.waitFor(() => { + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toBeUndefined(); + }); + + expect(result.queuedFinal).toBe(true); + expect(sessionStoreMocks.loadSessionStoreEntry).toHaveBeenCalledWith({ + agentId: "test", + storePath: "/tmp/mock-sessions.json", + sessionKey: "agent:test:session", + readConsistency: "latest", + clone: false, + }); + expect(sessionStoreMocks.loadSessionStore).not.toHaveBeenCalled(); + expect(deliver).toHaveBeenCalledOnce(); + expect(sessionStoreMocks.updateSessionEntry).toHaveBeenCalledTimes(3); + }); + + it("clears pending final delivery when abort fires after a successful final send (#89115)", async () => { + // Regression for #89115: an abort that lands after the final reply has + // shipped (here, during sendFinalReply) must still clear the pending-final + // bookkeeping — otherwise pendingFinalDelivery stays true and the get-reply + // redelivery short-circuit silently blocks every later inbound. + hookMocks.runner.hasHooks.mockReturnValue(false); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pendingFinalDelivery("durable reply", { + context: { source: "heartbeat" }, + intentId: "intent-89115", + }), + }; + sessionStoreMocks.resolveSessionStoreEntry.mockReturnValue({ + existing: sessionStoreMocks.currentEntry, + }); + const abortController = new AbortController(); + const deliver = vi.fn().mockResolvedValue(undefined); + const dispatcher = createReplyDispatcher({ deliver }); + const sendFinalReply = dispatcher.sendFinalReply.bind(dispatcher); + vi.spyOn(dispatcher, "sendFinalReply").mockImplementation((payload) => { + const queued = sendFinalReply(payload); + abortController.abort(); + return queued; + }); + + const result = await withReplyDispatcher({ + dispatcher, + run: () => + dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyOptions: { abortSignal: abortController.signal }, + replyResolver: async () => + pendingFinalReply("durable reply", { intentId: "intent-89115" }), + }), + }); + + // Abort landed after delivery: the run is still surfaced as aborted + // (queuedFinal:false), but the pending-final state is fully cleared. + expect(dispatcher.sendFinalReply).toHaveBeenCalledOnce(); + expect(deliver).toHaveBeenCalledOnce(); + expect(result.queuedFinal).toBe(false); + expect(sessionStoreMocks.updateSessionEntry).toHaveBeenCalledTimes(3); + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toBeUndefined(); + }); + it("preserves pending final delivery when final dispatch fails", async () => { hookMocks.runner.hasHooks.mockReturnValue(false); sessionStoreMocks.currentEntry = { @@ -248,6 +372,7 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { try { hookMocks.runner.hasHooks.mockReturnValue(false); sessionStoreMocks.currentEntry = { + sessionId: "session-1", sessionKey: "agent:test:session", pendingFinalDelivery: pendingFinalDelivery("durable reply", { context: { channel: "whatsapp", to: "+1000" }, @@ -273,7 +398,7 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { ctx: createHookCtx(), cfg: emptyConfig, dispatcher, - replyResolver: async () => ({ text: "durable reply" }), + replyResolver: async () => pendingFinalReply("durable reply"), }), }); await hookStarted.promise; @@ -299,11 +424,66 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { } }); + it("clears pending final delivery when a later queued final succeeds", async () => { + vi.useFakeTimers(); + try { + hookMocks.runner.hasHooks.mockReturnValue(false); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pendingFinalDelivery("durable reply"), + }; + sessionStoreMocks.resolveSessionStoreEntry.mockReturnValue({ + existing: sessionStoreMocks.currentEntry, + }); + const hookStarted = createDeferred(); + const deliver = vi.fn().mockResolvedValue(undefined); + let hookCalls = 0; + const dispatcher = createReplyDispatcher({ + deliver, + beforeDeliver: (payload) => { + hookCalls += 1; + if (hookCalls === 1) { + hookStarted.resolve(); + return new Promise(() => {}); + } + return payload; + }, + }); + + const resultPromise = withReplyDispatcher({ + dispatcher, + run: () => + dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyResolver: async () => [{ text: "first" }, pendingFinalReply("durable reply")], + }), + }); + await hookStarted.promise; + await vi.advanceTimersByTimeAsync(15_000); + await resultPromise; + + expect(deliver).toHaveBeenCalledOnce(); + expect(deliver).toHaveBeenCalledWith( + expect.objectContaining({ text: "durable reply" }), + expect.objectContaining({ kind: "final" }), + ); + expect(dispatcher.getFailedCounts?.()).toEqual({ tool: 0, block: 0, final: 1 }); + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toBeUndefined(); + expect(vi.getTimerCount()).toBe(0); + } finally { + vi.useRealTimers(); + } + }); + it("preserves the durable final when an earlier auxiliary final succeeds", async () => { vi.useFakeTimers(); try { hookMocks.runner.hasHooks.mockReturnValue(false); sessionStoreMocks.currentEntry = { + sessionId: "session-1", sessionKey: "agent:test:session", pendingFinalDelivery: pendingFinalDelivery("durable reply"), }; @@ -332,7 +512,7 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { ctx: createHookCtx(), cfg: emptyConfig, dispatcher, - replyResolver: async () => [{ text: "auxiliary" }, { text: "durable reply" }], + replyResolver: async () => [{ text: "auxiliary" }, pendingFinalReply("durable reply")], }), }); await hookStarted.promise; @@ -353,11 +533,74 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { } }); + it("records each pending-final delivery without rewriting aggregate text", async () => { + vi.useFakeTimers(); + try { + hookMocks.runner.hasHooks.mockReturnValue(false); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pendingFinalDelivery("auxiliary\n\ndurable reply", { + deliveries: [ + { id: "delivery-auxiliary", state: "prepared" }, + { id: "delivery-durable", state: "prepared" }, + ], + }), + }; + sessionStoreMocks.resolveSessionStoreEntry.mockReturnValue({ + existing: sessionStoreMocks.currentEntry, + }); + const hookStarted = createDeferred(); + let hookCalls = 0; + const dispatcher = createReplyDispatcher({ + deliver: vi.fn().mockResolvedValue(undefined), + beforeDeliver: (payload) => { + hookCalls += 1; + if (hookCalls === 2) { + hookStarted.resolve(); + return new Promise(() => {}); + } + return payload; + }, + }); + + const resultPromise = withReplyDispatcher({ + dispatcher, + run: () => + dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyResolver: async () => [ + pendingFinalReply("auxiliary", { deliveryId: "delivery-auxiliary" }), + pendingFinalReply("durable reply", { deliveryId: "delivery-durable" }), + ], + }), + }); + await hookStarted.promise; + await vi.advanceTimersByTimeAsync(15_000); + await resultPromise; + + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toEqual( + pendingFinalDelivery("auxiliary\n\ndurable reply", { + deliveries: [ + { id: "delivery-auxiliary", state: "delivered" }, + { id: "delivery-durable", state: "prepared" }, + ], + }), + ); + expect(vi.getTimerCount()).toBe(0); + } finally { + vi.useRealTimers(); + } + }); + it("does not let an older settlement rewrite a newer pending-final intent", async () => { vi.useFakeTimers(); try { hookMocks.runner.hasHooks.mockReturnValue(false); sessionStoreMocks.currentEntry = { + sessionId: "session-1", sessionKey: "agent:test:session", pendingFinalDelivery: pendingFinalDelivery("older reply", { intentId: "older-intent" }), }; @@ -381,10 +624,7 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { cfg: emptyConfig, dispatcher, replyResolver: async () => - setReplyPayloadMetadata( - { text: "older reply" }, - { pendingFinalDeliveryIntentId: "older-intent" }, - ), + pendingFinalReply("older reply", { intentId: "older-intent" }), }), }); await hookStarted.promise; @@ -407,6 +647,107 @@ describe("dispatchReplyFromConfig reply_dispatch hook", () => { } }); + const createNoSendFailure = (retryable = true) => + new PlatformMessageNotDispatchedError("offline", { cause: new Error("offline"), retryable }); + const wrapDeliveryFailure = (cause: unknown) => + new OutboundDeliveryError("delivery failed", { cause }); + const refused = Object.assign(new Error(), { + code: "ECONNREFUSED", + syscall: "connect", + }); + const createPartialDelivery = () => + Object.assign(new Error("partial delivery", { cause: createNoSendFailure() }), { + code: "CHANNEL_PARTIAL_DELIVERY", + deliveryResult: { visibleReplySent: true }, + }); + + it.each([ + ["direct retryable provider proof", createNoSendFailure(), true], + ["wrapped retryable provider proof", wrapDeliveryFailure(createNoSendFailure()), true], + ["wrapped pre-connect ECONNREFUSED proof", wrapDeliveryFailure(refused), true], + ["permanent provider rejection", createNoSendFailure(false), false], + [ + "partial outbound delivery", + Object.assign(wrapDeliveryFailure(createNoSendFailure()), { sentBeforeError: true }), + false, + ], + ["nested partial envelope", new Error("partial", { cause: createPartialDelivery() }), false], + ["aggregate partial envelope", new AggregateError([createPartialDelivery()]), false], + ["observer-attached delivery evidence", createNoSendFailure(), true], + ["ambiguous transport failure", new Error("transport failed"), false], + ] as const)("reconciles pending final delivery after %s", async (name, error, preserve) => { + hookMocks.runner.hasHooks.mockReturnValue(false); + const pending = pendingFinalDelivery("recoverable final reply"); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pending, + }; + sessionStoreMocks.resolveSessionStoreEntry.mockReturnValue({ + existing: sessionStoreMocks.currentEntry, + }); + const dispatcher = createReplyDispatcher({ + deliver: async () => { + throw error; + }, + onError: () => { + if (name.startsWith("observer")) { + Object.assign(error, { visibleReplySent: true }); + } + }, + }); + await withReplyDispatcher({ + dispatcher, + run: () => + dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyResolver: async () => pendingFinalReply("recoverable final reply"), + }), + }); + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toMatchObject({ + ...pending, + deliveries: [{ id: "delivery-1", state: preserve ? "prepared" : "unknown" }], + }); + }); + + it("clears pending final delivery after intentional pre-delivery cancellation", async () => { + hookMocks.runner.hasHooks.mockReturnValue(false); + sessionStoreMocks.currentEntry = { + sessionId: "session-1", + sessionKey: "agent:test:session", + pendingFinalDelivery: pendingFinalDelivery("policy-suppressed reply"), + }; + sessionStoreMocks.resolveSessionStoreEntry.mockReturnValue({ + existing: sessionStoreMocks.currentEntry, + }); + const deliver = vi.fn().mockResolvedValue(undefined); + const dispatcher = createReplyDispatcher({ + deliver, + beforeDeliver: () => null, + }); + + const result = await dispatchReplyFromConfig({ + ctx: createHookCtx(), + cfg: emptyConfig, + dispatcher, + replyResolver: async () => pendingFinalReply("policy-suppressed reply"), + }); + await dispatcher.waitForIdle(); + await vi.waitFor(() => { + expect(sessionStoreMocks.currentEntry?.pendingFinalDelivery).toBeUndefined(); + }); + + expect(result.queuedFinal).toBe(true); + expect(deliver).not.toHaveBeenCalled(); + // createHookCtx's "private" chat type is undirected, so the cancelled final + // does not trigger a fallback attempt. + expect(dispatcher.getCancelledCounts?.()).toEqual({ tool: 0, block: 0, final: 1 }); + expect(dispatcher.getFailedCounts?.()).toEqual({ tool: 0, block: 0, final: 0 }); + expect(sessionStoreMocks.updateSessionEntry).toHaveBeenCalledTimes(2); + }); + it("delivers a generated final reply before queued follow-up admission", async () => { hookMocks.runner.hasHooks.mockReturnValue(false); const dispatcher = createDispatcher(); diff --git a/src/auto-reply/reply/pending-final-delivery.test.ts b/src/auto-reply/reply/pending-final-delivery.test.ts index cc0498a5fd50..9001712d4f45 100644 --- a/src/auto-reply/reply/pending-final-delivery.test.ts +++ b/src/auto-reply/reply/pending-final-delivery.test.ts @@ -4,10 +4,10 @@ import { INTERNAL_RUNTIME_CONTEXT_BEGIN, INTERNAL_RUNTIME_CONTEXT_END, } from "../../agents/internal-runtime-context.js"; +import { setReplyPayloadMetadata } from "../reply-payload.js"; import { markInboundContextLabel } from "./inbound-context-marker.js"; import { buildRecoverablePendingFinalDeliveryText, - buildPendingFinalDeliveryText, normalizePendingFinalDeliveryPayloads, normalizePendingFinalRecoveryPayloads, sanitizePendingFinalDeliveryText, @@ -95,12 +95,12 @@ describe("normalizePendingFinalRecoveryPayloads", () => { const rawPayloads = [{ text: "Rendered chart\nMEDIA:/tmp/chart.png" }]; const recoveryPayloads = normalizePendingFinalRecoveryPayloads(rawPayloads); - expect(buildPendingFinalDeliveryText(recoveryPayloads)).toBe( + expect(recoveryPayloads.map((payload) => payload.text)).toEqual([ "Rendered chart\nMEDIA:/tmp/chart.png", - ); + ]); const deliveryPayloads = normalizePendingFinalDeliveryPayloads(rawPayloads); - expect(buildPendingFinalDeliveryText(deliveryPayloads)).toBe("Rendered chart"); + expect(deliveryPayloads.map((payload) => payload.text)).toEqual(["Rendered chart"]); }); it("keeps media-only directives as durable recovery text", () => { @@ -108,7 +108,7 @@ describe("normalizePendingFinalRecoveryPayloads", () => { { text: "MEDIA:/tmp/chart.png" }, ]); - expect(buildPendingFinalDeliveryText(recoveryPayloads)).toBe("MEDIA:/tmp/chart.png"); + expect(recoveryPayloads.map((payload) => payload.text)).toEqual(["MEDIA:/tmp/chart.png"]); expect(normalizePendingFinalDeliveryPayloads(recoveryPayloads)).toHaveLength(1); }); @@ -139,6 +139,18 @@ describe("normalizePendingFinalRecoveryPayloads", () => { ).toBeUndefined(); }); + it("separates implicit delivery threading from explicit reply semantics", () => { + expect( + buildRecoverablePendingFinalDeliveryText([ + { text: "Visible final", replyToId: "source-message" }, + ]), + ).toBe("Visible final"); + + const explicitReply = { text: "Visible final", replyToId: "source-message" }; + setReplyPayloadMetadata(explicitReply, { replyToIdExplicit: true }); + expect(buildRecoverablePendingFinalDeliveryText([explicitReply])).toBeUndefined(); + }); + it("refuses multi-payload media finals because text recovery loses payload boundaries", () => { expect( buildRecoverablePendingFinalDeliveryText([ diff --git a/src/auto-reply/reply/pending-final-delivery.ts b/src/auto-reply/reply/pending-final-delivery.ts index 9fecd19c5ddf..bf190689ce97 100644 --- a/src/auto-reply/reply/pending-final-delivery.ts +++ b/src/auto-reply/reply/pending-final-delivery.ts @@ -1,5 +1,7 @@ import type { SessionEntry } from "../../config/sessions/types.js"; +import type { DurableDeliveryCompletion } from "../../infra/outbound/delivery-completion.js"; import { normalizeReplyPayloadsForDelivery } from "../../infra/outbound/payloads.js"; +import { getReplyPayloadMetadata, type ReplyPayload } from "../reply-payload.js"; import { isSilentReplyPayloadText, isSilentReplyText, @@ -8,7 +10,6 @@ import { stripLeadingSilentToken, stripSilentToken, } from "../tokens.js"; -import type { ReplyPayload } from "../types.js"; import { stripInternalMetadataForDisplay } from "./display-text-sanitize.js"; import { normalizeReplyPayload } from "./normalize-reply.js"; @@ -38,12 +39,16 @@ export function buildRecoverablePendingFinalDeliveryText( if (payload.isReasoning === true) { continue; } - const deliveryPayloads = normalizeReplyPayloadsForDelivery([payload]); + const recoveryPayload = + payload.replyToId && getReplyPayloadMetadata(payload)?.replyToIdExplicit !== true + ? { ...payload, replyToId: undefined } + : payload; + const deliveryPayloads = normalizeReplyPayloadsForDelivery([recoveryPayload]); if (deliveryPayloads.length === 0) { continue; } if ( - hasUnsupportedDurableRecoveryShape(payload) || + hasUnsupportedDurableRecoveryShape(recoveryPayload) || deliveryPayloads.some(hasUnrecoverableNormalizedDeliveryShape) ) { return undefined; @@ -78,7 +83,7 @@ export function buildRecoverablePendingFinalDeliveryText( } /** Build the restart-recovery text represented by one or more final payloads. */ -export function buildPendingFinalDeliveryText(payloads: ReplyPayload[]): string { +function buildPendingFinalDeliveryText(payloads: ReplyPayload[]): string { const text = payloads .filter((payload) => payload.isReasoning !== true) .map((payload) => payload.text) @@ -93,6 +98,15 @@ export const PENDING_FINAL_DELIVERY_CLEAR_PATCH = { pendingFinalDelivery: undefined, } as const satisfies Partial; +export function resolvePendingFinalDeliveryCompletion( + payloads: readonly ReplyPayload[] | undefined, +): Extract | undefined { + const completion = payloads + ?.map((payload) => getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion) + .find(Boolean); + return completion ? { kind: "pending-final", ...completion } : undefined; +} + function collectDurableMediaDirectives(payload: ReplyPayload): string[] { if (payload.sensitiveMedia === true) { return []; @@ -122,8 +136,8 @@ function hasUnsupportedDurableRecoveryShape(payload: ReplyPayload): boolean { payload.channelData !== undefined || payload.location !== undefined || payload.replyToId !== undefined || - payload.replyToTag !== undefined || - payload.replyToCurrent !== undefined || + payload.replyToTag === true || + payload.replyToCurrent === true || payload.audioAsVoice === true || payload.videoAsNote === true || payload.spokenText !== undefined || diff --git a/src/auto-reply/reply/reply-dispatcher.ts b/src/auto-reply/reply/reply-dispatcher.ts index de016fe3f9dc..95a76fecfd52 100644 --- a/src/auto-reply/reply/reply-dispatcher.ts +++ b/src/auto-reply/reply/reply-dispatcher.ts @@ -8,6 +8,7 @@ import { isProvenDeliveryNotSentError, } from "../../infra/delivery-recovery.shared.js"; import { collectErrorGraphCandidates } from "../../infra/errors.js"; +import { settlePendingFinalDelivery } from "../../infra/outbound/delivery-completion.js"; import { generateSecureInt } from "../../infra/secure-random.js"; import { createSubsystemLogger } from "../../logging/subsystem.js"; import type { SilentReplyConversationType } from "../../shared/silent-reply-policy.js"; @@ -442,6 +443,7 @@ export function createReplyDispatcher(options: ReplyDispatcherOptions): ReplyDis ): Promise => { let deliverPayload: ReplyPayload | null = payload; let deliveryStarted = false; + const custody = getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion; try { if (beforeDeliver) { try { @@ -451,21 +453,60 @@ export function createReplyDispatcher(options: ReplyDispatcherOptions): ReplyDis throw error; } if (!deliverPayload) { + // Record the intentional non-delivery before observers run so a + // restart during observer work cannot replay a suppressed final. + if (custody) { + await settlePendingFinalDelivery({ kind: "pending-final", ...custody }, "suppressed", [ + "prepared", + ]); + } await notifyBeforeDeliverCancelled(payload, info); return "cancelled"; } deliverPayload = copyReplyPayloadMetadata(payload, deliverPayload); } + if (custody) { + // Claim direct-send custody before provider I/O; a non-prepared marker + // means another owner already delivered, suppressed, or superseded this + // final, so repeating the send would duplicate it. + const claim = await settlePendingFinalDelivery( + { kind: "pending-final", ...custody }, + "queued", + ["prepared"], + ); + if (claim.state !== "queued") { + await notifyBeforeDeliverCancelled(payload, info); + return "cancelled"; + } + } deliveryStarted = true; await options.deliver(deliverPayload, info); + if (custody) { + await settlePendingFinalDelivery({ kind: "pending-final", ...custody }, "delivered", [ + "queued", + ]); + } return "delivered"; } catch (error) { + const outcome = + deliveryStarted && !isRetryableNoSendFailure(error) + ? "failed-deliver" + : "failed-before-deliver"; + if (custody && deliveryStarted) { + // Proven no-send keeps the marker replayable for restart recovery — + // including after direct custody escalated queued→unknown pre-I/O, + // since the error proves the send never crossed the wire. Anything + // else after platform I/O started fails closed as "unknown". + await settlePendingFinalDelivery( + { kind: "pending-final", ...custody }, + outcome === "failed-deliver" ? "unknown" : "prepared", + outcome === "failed-deliver" ? ["queued"] : ["queued", "unknown"], + ); + } try { await options.onError?.(error, info); } catch {} - return deliveryStarted && !isRetryableNoSendFailure(error) - ? "failed-deliver" - : "failed-before-deliver"; + return outcome; } }; diff --git a/src/auto-reply/reply/reply-dispatcher.types.ts b/src/auto-reply/reply/reply-dispatcher.types.ts index 6251ae47abe1..74fa47c0b9c6 100644 --- a/src/auto-reply/reply/reply-dispatcher.types.ts +++ b/src/auto-reply/reply/reply-dispatcher.types.ts @@ -13,6 +13,10 @@ export type ReplyFollowupAdmissionBarrierTimeoutPolicy = { export type ReplyDispatchRuntimeInfo = { kind: ReplyDispatchKind; assistantMessageIndex?: number; + /** @internal Claim direct-send custody immediately before recipient-visible platform I/O. */ + onPlatformSendDispatch?: () => Promise; + /** @internal Bind this delivery's host-owned completion to a transformed payload. */ + bindPendingFinalDelivery?: (payload: T) => T; }; export type ReplyDispatchBeforeDeliver = ( diff --git a/src/auto-reply/reply/restart-recovery-claim.ts b/src/auto-reply/reply/restart-recovery-claim.ts index 65644f71bd67..5d22270df147 100644 --- a/src/auto-reply/reply/restart-recovery-claim.ts +++ b/src/auto-reply/reply/restart-recovery-claim.ts @@ -29,6 +29,7 @@ type ReplyRestartRecoveryClaimController = { state: Exclude; pendingFinalDelivery?: { context?: DeliveryContext; + deliveries: NonNullable["deliveries"]; intentId: string; text: string; }; @@ -376,6 +377,7 @@ export function createReplyRestartRecoveryClaimController(params: { ...(pendingFinalDelivery.intentId ? { intentId: pendingFinalDelivery.intentId } : {}), + deliveries: pendingFinalDelivery.deliveries, ...(pendingFinalDelivery.context ? { context: pendingFinalDelivery.context } : {}), diff --git a/src/channels/message/send.ts b/src/channels/message/send.ts index f23241cadce3..efb8a57a71ec 100644 --- a/src/channels/message/send.ts +++ b/src/channels/message/send.ts @@ -4,6 +4,7 @@ * Sends rendered reply payloads, records live preview state, and classifies delivery outcomes. */ import type { ReplyPayload } from "../../auto-reply/reply-payload.js"; +import { resolvePendingFinalDeliveryCompletion } from "../../auto-reply/reply/pending-final-delivery.js"; import { formatErrorMessage } from "../../infra/errors.js"; import type { OutboundDeliveryResult } from "../../infra/outbound/deliver-types.js"; import { @@ -395,14 +396,27 @@ export async function withDurableMessageSendContext( export async function sendDurableMessageBatch( params: DurableMessageSendContextParams, ): Promise { - return await withDurableMessageSendContext(params, async (ctx) => { - const rendered = await ctx.render(); - const result = await ctx.send(rendered); - if (result.status === "sent" || result.status === "suppressed") { - await ctx.commit(result.receipt); - } else { - await ctx.fail(result.error); - } - return result; - }); + const pendingFinalCompletion = params.deliveryCompletion + ? undefined + : resolvePendingFinalDeliveryCompletion(params.payloads); + const pendingFinalDelivery = pendingFinalCompletion + ? { + deliveryCompletion: pendingFinalCompletion, + deliveryIntentId: pendingFinalCompletion.deliveryId, + durability: "required" as const, + } + : {}; + return await withDurableMessageSendContext( + { ...params, ...pendingFinalDelivery }, + async (ctx) => { + const rendered = await ctx.render(); + const result = await ctx.send(rendered); + if (result.status === "sent" || result.status === "suppressed") { + await ctx.commit(result.receipt); + } else { + await ctx.fail(result.error); + } + return result; + }, + ); } diff --git a/src/channels/plugins/types.core.ts b/src/channels/plugins/types.core.ts index 69573de00ab3..a97490ae17a8 100644 --- a/src/channels/plugins/types.core.ts +++ b/src/channels/plugins/types.core.ts @@ -832,6 +832,8 @@ export type ChannelPollContext = { silent?: boolean; isAnonymous?: boolean; gatewayClientScopes?: readonly string[]; + /** @internal Refresh durable timing before recipient-visible platform I/O. */ + onPlatformSendDispatch?: () => Promise; }; /** Minimal base for all channel probe results. Channel-specific probes extend this. */ diff --git a/src/channels/turn/direct-delivery-custody.ts b/src/channels/turn/direct-delivery-custody.ts new file mode 100644 index 000000000000..47e1d9cec217 --- /dev/null +++ b/src/channels/turn/direct-delivery-custody.ts @@ -0,0 +1,60 @@ +import { + getReplyPayloadMetadata, + setReplyPayloadMetadata, + type ReplyPayload, +} from "../../auto-reply/reply-payload.js"; +import { PlatformMessageNotDispatchedError } from "../../infra/outbound/deliver-types.js"; +import { settlePendingFinalDelivery } from "../../infra/outbound/delivery-completion.js"; +import type { ChannelDeliveryInfo } from "./types.js"; + +type DirectPendingFinalCustody = Pick & { + onPlatformSendDispatch: () => Promise; +}; + +export const NO_PENDING_FINAL_CUSTODY: DirectPendingFinalCustody = { + onPlatformSendDispatch: () => Promise.resolve(), +}; + +export function resolvePendingFinalCompletion(payload: ReplyPayload) { + const identity = getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion; + return identity ? { kind: "pending-final" as const, ...identity } : undefined; +} + +export function createDirectPendingFinalCustody( + payload: ReplyPayload, +): DirectPendingFinalCustody | undefined { + const completion = resolvePendingFinalCompletion(payload); + if (!completion) { + return undefined; + } + const { kind: _kind, ...identity } = completion; + let admission: Promise | undefined; + return { + bindPendingFinalDelivery: (nextPayload) => + setReplyPayloadMetadata(nextPayload, { + pendingFinalDeliveryCompletion: identity, + }), + onPlatformSendDispatch: () => { + admission ??= settlePendingFinalDelivery(completion, "unknown", ["prepared", "queued"]).then( + (result) => { + if (result.state !== "unknown") { + throw new PlatformMessageNotDispatchedError( + "Pending final delivery ownership changed before platform dispatch", + { cause: new Error(`pending final delivery is ${result.state}`) }, + ); + } + }, + ); + return admission; + }, + }; +} + +export function toCoreManagedDeliveryInfo(info: ChannelDeliveryInfo) { + return { + kind: info.kind, + ...(info.assistantMessageIndex === undefined + ? {} + : { assistantMessageIndex: info.assistantMessageIndex }), + }; +} diff --git a/src/channels/turn/durable-delivery.ts b/src/channels/turn/durable-delivery.ts index d7689522ba61..04d6e6303811 100644 --- a/src/channels/turn/durable-delivery.ts +++ b/src/channels/turn/durable-delivery.ts @@ -204,7 +204,6 @@ export async function deliverInboundReplyWithMessageSendContext( requesterSenderUsername: params.ctxPayload.SenderUsername, requesterSenderE164: params.ctxPayload.SenderE164, }); - const send = await sendDurableMessageBatch({ cfg: params.cfg, channel, @@ -220,7 +219,9 @@ export async function deliverInboundReplyWithMessageSendContext( mediaAccess: params.mediaAccess, silent: params.silent, durability, - ...(durability === "required" ? { requireUnknownSendReconciliation: true } : {}), + ...(requiredCapabilities.reconcileUnknownSend === true + ? { requireUnknownSendReconciliation: true } + : {}), session, gatewayClientScopes: params.ctxPayload.GatewayClientScopes ?? [], }); diff --git a/src/channels/turn/lifecycle.ts b/src/channels/turn/lifecycle.ts index b7f04a5c6889..6043d3c46758 100644 --- a/src/channels/turn/lifecycle.ts +++ b/src/channels/turn/lifecycle.ts @@ -1,5 +1,6 @@ import { dispatchInboundMessageWithRoutedChannelDispatcher } from "../../auto-reply/dispatch.js"; -import type { ReplyPayload } from "../../auto-reply/reply-payload.js"; +import { copyReplyPayloadMetadata, type ReplyPayload } from "../../auto-reply/reply-payload.js"; +import { suppressPendingFinalDelivery } from "../../auto-reply/reply/dispatch-from-config.pending-final.js"; import type { DispatchFromConfigResult } from "../../auto-reply/reply/dispatch-from-config.types.js"; import type { ReplyDispatchKind } from "../../auto-reply/reply/reply-dispatcher.types.js"; import { runWithSessionInitConflictRetry } from "../../auto-reply/reply/session-init-conflict-retry.js"; @@ -12,6 +13,7 @@ import { formatErrorMessage, toErrorObject } from "../../infra/errors.js"; import { applyMessageSendingHook } from "../../infra/outbound/deliver-hooks.js"; import { normalizeEmptyPayloadForDelivery } from "../../infra/outbound/deliver-payload.js"; import { isPlatformMessageNotDispatchedError } from "../../infra/outbound/deliver-types.js"; +import { settlePendingFinalDelivery } from "../../infra/outbound/delivery-completion.js"; import { createMessageSentEmitter } from "../../infra/outbound/message-sent-hook.js"; import { summarizeOutboundPayloadForTransport } from "../../infra/outbound/payloads.js"; import { getGlobalHookRunner } from "../../plugins/hook-runner-global.js"; @@ -19,6 +21,12 @@ import { resolveMessageReceiptPrimaryId } from "../message/receipt.js"; import { createChannelReplyPipeline } from "../message/reply-pipeline.js"; import { recordInboundSession } from "../session.js"; import { isChannelPartialDeliveryError } from "./delivery-result.js"; +import { + createDirectPendingFinalCustody, + NO_PENDING_FINAL_CUSTODY, + resolvePendingFinalCompletion, + toCoreManagedDeliveryInfo, +} from "./direct-delivery-custody.js"; import { deliverInboundReplyWithMessageSendContext, isDurableInboundReplyDeliveryHandled, @@ -266,6 +274,13 @@ async function settleChannelDeliveryAttempt(params: { messageId: resolveChannelDeliveryMessageId(finalized), }); } + const completion = resolvePendingFinalCompletion(attempt.payload); + if (completion) { + await settlePendingFinalDelivery( + completion, + isExplicitlyNonVisibleChannelDelivery(finalized) ? "suppressed" : "delivered", + ); + } await runChannelDeliveryObserver({ onDelivered: params.onDelivered, payload: attempt.payload, @@ -332,7 +347,7 @@ async function applyRoutedDirectMessageSending(params: { }), }; } - return { payload }; + return { payload: copyReplyPayloadMetadata(params.payload, payload) }; } function reconcileNonVisibleChannelDeliveries( @@ -465,6 +480,7 @@ async function dispatchChannelTurnWithDeliveryOwner( | "cancelled_by_reply_payload_sending_hook" | "empty_after_reply_payload_sending_hook", ) => { + await suppressPendingFinalDelivery(payload); await runChannelDeliveryObserver({ onDelivered: delivery.onDelivered, payload, @@ -477,13 +493,18 @@ async function dispatchChannelTurnWithDeliveryOwner( dispatcherOptions: { ...replyPipeline.dispatcherOptions, deliver: async (payload: ReplyPayload, info: ChannelDeliveryInfo) => { - const preparedPayload = delivery.preparePayload + const preparedPayloadResult = delivery.preparePayload ? await delivery.preparePayload(payload, info) : payload; + const preparedPayload = + preparedPayloadResult === null + ? null + : copyReplyPayloadMetadata(payload, preparedPayloadResult); if (preparedPayload === null) { const suppression = createSuppressedChannelDeliveryResult({ reason: "no_visible_payload", }); + await suppressPendingFinalDelivery(payload); await runChannelDeliveryObserver({ onDelivered: delivery.onDelivered, payload, @@ -525,15 +546,22 @@ async function dispatchChannelTurnWithDeliveryOwner( } let effectivePayload = preparedPayload; let result: ChannelDeliveryResult | void = undefined; + let directInfo: ChannelDeliveryInfo = info; try { if ( ownership === "routed-delivery" && "deliverWithProviderMessageSending" in delivery && delivery.deliverWithProviderMessageSending ) { + const providerInfo = { + ...info, + ...(createDirectPendingFinalCustody(effectivePayload) ?? + NO_PENDING_FINAL_CUSTODY), + }; + directInfo = providerInfo; result = await delivery.deliverWithProviderMessageSending( effectivePayload, - info, + providerInfo, ); } else { if ( @@ -555,13 +583,22 @@ async function dispatchChannelTurnWithDeliveryOwner( "channel delivery adapter is missing a direct deliverer", ); } - result = await delivery.deliver(effectivePayload, info); + const custody = createDirectPendingFinalCustody(effectivePayload); + await custody?.onPlatformSendDispatch(); + result = await delivery.deliver( + effectivePayload, + toCoreManagedDeliveryInfo(info), + ); } } } catch (error: unknown) { if (delivery.observeMessageSent) { await settleChannelDeliveryAttempt({ - attempt: { payload: effectivePayload, info, error }, + attempt: { + payload: effectivePayload, + info: directInfo, + error, + }, onDelivered: delivery.onDelivered, emitMessageSent: getMessageSentEmitter()?.emitMessageSent, }); @@ -572,22 +609,24 @@ async function dispatchChannelTurnWithDeliveryOwner( // Finalization can reject while the buffered dispatcher is still unwinding. // Observe it now; settlement still awaits the original promise and its error. void result.finalization.catch(() => undefined); - pendingDeliveryAttempts.push({ payload: effectivePayload, info, result }); - } else if (delivery.observeMessageSent) { - const finalized = await settleChannelDeliveryAttempt({ - attempt: { payload: effectivePayload, info, result }, - onDelivered: delivery.onDelivered, - emitMessageSent: getMessageSentEmitter()?.emitMessageSent, - }); - recordSettledDelivery(info, finalized); - } else { - await runChannelDeliveryObserver({ - onDelivered: delivery.onDelivered, + pendingDeliveryAttempts.push({ payload: effectivePayload, - info, + info: directInfo, result, }); - recordSettledDelivery(info, result ?? undefined); + } else { + const finalized = await settleChannelDeliveryAttempt({ + attempt: { + payload: effectivePayload, + info: directInfo, + result, + }, + onDelivered: delivery.onDelivered, + emitMessageSent: delivery.observeMessageSent + ? getMessageSentEmitter()?.emitMessageSent + : undefined, + }); + recordSettledDelivery(info, finalized); } return result; }, diff --git a/src/channels/turn/run-channel-turn.delivery.test.ts b/src/channels/turn/run-channel-turn.delivery.test.ts index 7c5b383643b2..a75005b453d3 100644 --- a/src/channels/turn/run-channel-turn.delivery.test.ts +++ b/src/channels/turn/run-channel-turn.delivery.test.ts @@ -1,6 +1,10 @@ // Channel turn delivery tests cover orchestration, dispatch, and completion behavior. import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; -import type { ReplyPayload } from "../../auto-reply/reply-payload.js"; +import { + getReplyPayloadMetadata, + setReplyPayloadMetadata, + type ReplyPayload, +} from "../../auto-reply/reply-payload.js"; import type { DispatchReplyWithBufferedBlockDispatcher } from "../../auto-reply/reply/provider-dispatcher.types.js"; import type { FinalizedMsgContext } from "../../auto-reply/templating.js"; import type { OpenClawConfig } from "../../config/types.openclaw.js"; @@ -10,7 +14,7 @@ import { outboundMessageIdentities } from "../message/outbound-echo-state.js"; import type { RecordInboundSession } from "../session.types.js"; import { hasVisibleChannelTurnDispatch } from "./dispatch-result.js"; import { dispatchAssembledChannelTurn, dispatchRoutedChannelTurn } from "./lifecycle.js"; -import type { ChannelTurnResult } from "./types.js"; +import type { ChannelDeliveryInfo, ChannelTurnResult } from "./types.js"; const deliverOutboundPayloads = vi.hoisted(() => vi.fn()); const resolveOutboundDurableFinalDeliverySupport = vi.hoisted(() => vi.fn()); @@ -24,6 +28,9 @@ const createMessageSentEmitter = vi.hoisted(() => vi.fn(() => ({ emitMessageSent, hasMessageSentHooks: true })), ); const readRecentUserAssistantTextForSession = vi.hoisted(() => vi.fn()); +const settlePendingFinalDelivery = vi.hoisted(() => + vi.fn(async (_completion: unknown, state: string) => ({ state })), +); vi.mock("../../auto-reply/reply/provider-dispatcher.js", async (importOriginal) => { const actual = @@ -77,6 +84,12 @@ vi.mock("../../config/sessions/transcript.js", () => ({ readRecentUserAssistantTextForSession, })); +vi.mock("../../infra/outbound/delivery-completion.js", async (importOriginal) => { + const actual = + await importOriginal(); + return { ...actual, settlePendingFinalDelivery }; +}); + const cfg = {} as OpenClawConfig; function createCtx(overrides: Partial = {}): FinalizedMsgContext { @@ -286,6 +299,77 @@ describe("channel turn delivery", () => { expect(result.dispatchResult.counts.final).toBe(1); }); + it("preserves pending final custody through preparation and message hook rewrites", async () => { + const order: string[] = []; + const completion = { + deliveryId: "delivery-1", + intentId: "intent-1", + sessionId: "session-1", + sessionKey: "agent:main:telegram:peer", + storePath: "/tmp/sessions.json", + }; + const sourcePayload = setReplyPayloadMetadata( + { text: "reply" }, + { pendingFinalDeliveryCompletion: completion }, + ); + dispatchReplyWithRoutedChannelDispatcherCore.mockImplementationOnce(async (params) => { + await params.dispatcherOptions.deliver(sourcePayload, { kind: "final" }); + return { queuedFinal: true, counts: { tool: 0, block: 0, final: 1 } }; + }); + getGlobalHookRunner.mockReturnValue({ + hasHooks: (name: string) => name === "message_sending", + runMessageSending: vi.fn(async ({ content }: { content: string }) => ({ + content: `${content} + hook`, + })), + }); + let releaseDelivery: (() => void) | undefined; + const deliveryPending = new Promise((resolve) => { + releaseDelivery = resolve; + }); + settlePendingFinalDelivery.mockImplementationOnce(async (_completion, state: string) => { + order.push(`settle:${state}`); + return { state }; + }); + const deliver = vi.fn(async (payload: ReplyPayload, info: ChannelDeliveryInfo) => { + expect(getReplyPayloadMetadata(payload)?.pendingFinalDeliveryCompletion).toEqual(completion); + expect("onPlatformSendDispatch" in info).toBe(false); + order.push("signal:accepted"); + await deliveryPending; + return { messageIds: ["direct-1"], visibleReplySent: true }; + }); + + const dispatch = dispatchRoutedChannelTurn({ + cfg, + channel: "telegram", + accountId: "acct", + route: { agentId: "main", sessionKey: completion.sessionKey }, + ctxPayload: createCtx({ Surface: "telegram", OriginatingTo: "chat-1" }), + delivery: { + preparePayload: (payload) => ({ ...payload, text: `${payload.text} + prepared` }), + deliver, + }, + }); + + await vi.waitFor(() => expect(deliver).toHaveBeenCalledOnce()); + expect(order).toEqual(["settle:unknown", "signal:accepted"]); + releaseDelivery?.(); + await dispatch; + + expect(deliver).toHaveBeenCalledOnce(); + expect(deliver.mock.calls[0]?.[0]).toMatchObject({ text: "reply + prepared + hook" }); + expect(settlePendingFinalDelivery).toHaveBeenNthCalledWith( + 1, + { kind: "pending-final", ...completion }, + "unknown", + ["prepared", "queued"], + ); + expect(settlePendingFinalDelivery).toHaveBeenNthCalledWith( + 2, + { kind: "pending-final", ...completion }, + "delivered", + ); + }); + it("does not let message hooks resurrect payloads suppressed during preparation", async () => { const runMessageSending = vi.fn(async () => ({ content: "resurrected" })); getGlobalHookRunner.mockReturnValue({ @@ -454,7 +538,10 @@ describe("channel turn delivery", () => { expect(deliverWithProviderMessageSending).toHaveBeenCalledWith( { text: "reply" }, - { kind: "final" }, + expect.objectContaining({ + kind: "final", + onPlatformSendDispatch: expect.any(Function), + }), ); expect(runMessageSending).not.toHaveBeenCalled(); }); diff --git a/src/channels/turn/types.ts b/src/channels/turn/types.ts index 2ebf46e51fad..5517db0ba218 100644 --- a/src/channels/turn/types.ts +++ b/src/channels/turn/types.ts @@ -9,7 +9,7 @@ import type { GetReplyFromConfig } from "../../auto-reply/reply/get-reply.types. import type { HistoryEntry, HistoryMediaEntry } from "../../auto-reply/reply/history.types.js"; import type { DispatchReplyWithBufferedBlockDispatcher } from "../../auto-reply/reply/provider-dispatcher.types.js"; import type { ReplyDispatcherWithTypingOptions } from "../../auto-reply/reply/reply-dispatcher.js"; -import type { ReplyDispatchKind } from "../../auto-reply/reply/reply-dispatcher.types.js"; +import type { ReplyDispatchRuntimeInfo } from "../../auto-reply/reply/reply-dispatcher.types.js"; import type { FinalizedMsgContext, InboundSourceModality, @@ -156,8 +156,15 @@ export type PreflightFacts = { }; /** Delivery metadata for one reply payload dispatch. */ -export type ChannelDeliveryInfo = { - kind: ReplyDispatchKind; +export type ChannelDeliveryInfo = ReplyDispatchRuntimeInfo; + +type ChannelCoreManagedDeliveryInfo = Omit< + ChannelDeliveryInfo, + "bindPendingFinalDelivery" | "onPlatformSendDispatch" +>; + +type ChannelProviderOwnedDeliveryInfo = ChannelDeliveryInfo & { + onPlatformSendDispatch: () => Promise; }; /** Durable delivery queue intent recorded when a reply is deferred. */ @@ -220,7 +227,7 @@ type ChannelDeliveryAdapterBase = { export type ChannelCoreManagedTurnDeliveryAdapter = ChannelDeliveryAdapterBase & { deliver: ( payload: ReplyPayload, - info: ChannelDeliveryInfo, + info: ChannelCoreManagedDeliveryInfo, ) => Promise; durable?: | false @@ -245,7 +252,7 @@ export type ChannelProviderOwnedMessageSendingDeliveryAdapter = ChannelDeliveryA */ deliverWithProviderMessageSending: ( payload: ReplyPayload, - info: ChannelDeliveryInfo, + info: ChannelProviderOwnedDeliveryInfo, ) => Promise; deliver?: never; durable?: never; diff --git a/src/commands/agent.test.ts b/src/commands/agent.test.ts index e118effa1d02..c5e2117decee 100644 --- a/src/commands/agent.test.ts +++ b/src/commands/agent.test.ts @@ -85,6 +85,7 @@ vi.mock("../agents/command/session-store.runtime.js", async () => { const accessor = await import("../config/sessions/session-accessor.js"); return { loadSessionEntry: accessor.loadSessionEntry, + loadSessionEntryReadOnly: accessor.loadSessionEntryReadOnly, updateSessionStoreAfterAgentRun: vi.fn(async () => undefined), }; }); diff --git a/src/config/sessions/sessions.test.ts b/src/config/sessions/sessions.test.ts index 9ea149313c3c..e3f42c0ee494 100644 --- a/src/config/sessions/sessions.test.ts +++ b/src/config/sessions/sessions.test.ts @@ -81,6 +81,35 @@ it("normalizes boolean-only pending delivery as transport-only", () => { }); }); +it("normalizes exact pending-final delivery owners", () => { + expect( + normalizePersistedSessionEntryShape({ + sessionId: "session-1", + updatedAt: 42, + pendingFinalDelivery: { + kind: "replayable", + text: "durable reply", + createdAt: 41, + intentId: "intent-1", + deliveries: [ + { id: "delivery-prepared", state: "prepared" }, + { id: "delivery-delivered", state: "delivered" }, + { id: "", state: "queued" }, + { id: "delivery-invalid", state: "invalid" }, + ], + }, + }), + ).toMatchObject({ + pendingFinalDelivery: { + intentId: "intent-1", + deliveries: [ + { id: "delivery-prepared", state: "prepared" }, + { id: "delivery-delivered", state: "delivered" }, + ], + }, + }); +}); + it("normalizes and preserves the durable assistant transcript repair backlog", () => { expect( normalizePersistedSessionEntryShape({ diff --git a/src/config/sessions/store-entry-shape.ts b/src/config/sessions/store-entry-shape.ts index b9afed443013..5e00712e9842 100644 --- a/src/config/sessions/store-entry-shape.ts +++ b/src/config/sessions/store-entry-shape.ts @@ -144,10 +144,30 @@ function normalizePendingFinalDelivery( return undefined; } const intentId = normalizeOptionalString(value.intentId); + const deliveries: NonNullable["deliveries"] = Array.isArray( + value.deliveries, + ) + ? value.deliveries.flatMap((delivery) => { + if (!isRecord(delivery)) { + return []; + } + const id = normalizeOptionalString(delivery.id); + const state = delivery.state; + return id && + (state === "prepared" || + state === "queued" || + state === "delivered" || + state === "suppressed" || + state === "unknown") + ? [{ id, state }] + : []; + }) + : undefined; const base = { createdAt, ...(isRecord(value.context) ? { context: value.context } : {}), ...(intentId ? { intentId } : {}), + ...(deliveries ? { deliveries } : {}), }; if (value.kind === "transport-only") { return { kind: "transport-only", ...base }; diff --git a/src/config/sessions/types.ts b/src/config/sessions/types.ts index 53f19b19f712..a9f499f29023 100644 --- a/src/config/sessions/types.ts +++ b/src/config/sessions/types.ts @@ -66,6 +66,10 @@ type PendingFinalDeliveryState = { createdAt: number; context?: DeliveryContext; intentId?: string; + deliveries?: Array<{ + id: string; + state: "prepared" | "queued" | "delivered" | "suppressed" | "unknown"; + }>; } & ({ kind: "replayable"; text: string } | { kind: "transport-only" }); /** diff --git a/src/infra/outbound/deliver-queue-execute.ts b/src/infra/outbound/deliver-queue-execute.ts index aac2cb263b60..e5b6befeb825 100644 --- a/src/infra/outbound/deliver-queue-execute.ts +++ b/src/infra/outbound/deliver-queue-execute.ts @@ -303,9 +303,13 @@ export async function deliverOutboundPayloadsWithQueueCleanup( if (!queueId) { if (params.deliveryCompletion) { if (results.length > 0) { - completeDurableDelivery(params.deliveryCompletion, results.at(-1)!); + await completeDurableDelivery( + params.deliveryCompletion, + results.at(-1)!, + platformQueueStateDir, + ); } else { - suppressDurableDelivery(params.deliveryCompletion); + await suppressDurableDelivery(params.deliveryCompletion, platformQueueStateDir); } } if (!params.deferCommitHooks) { @@ -363,9 +367,13 @@ export async function deliverOutboundPayloadsWithQueueCleanup( } else { if (params.deliveryCompletion) { if (results.length > 0) { - completeDurableDelivery(params.deliveryCompletion, results.at(-1)!); + await completeDurableDelivery( + params.deliveryCompletion, + results.at(-1)!, + platformQueueStateDir, + ); } else { - suppressDurableDelivery(params.deliveryCompletion); + await suppressDurableDelivery(params.deliveryCompletion, platformQueueStateDir); } } const postSendState = @@ -562,7 +570,11 @@ export async function deliverOutboundPayloadsWithQueueCleanup( terminalRejectionHandled = true; } else { if (params.deliveryCompletion) { - rejectDurableDelivery(params.deliveryCompletion, permanentRejection.message); + await rejectDurableDelivery( + params.deliveryCompletion, + permanentRejection.message, + platformQueueStateDir, + ); ownerRejected = true; } await (producerClaimId diff --git a/src/infra/outbound/deliver-queue.ts b/src/infra/outbound/deliver-queue.ts index 7e27099aeec4..e9534a976dcb 100644 --- a/src/infra/outbound/deliver-queue.ts +++ b/src/infra/outbound/deliver-queue.ts @@ -14,7 +14,9 @@ import { stageAndEnqueueOutboundDelivery, } from "./deliver-queue-admission.js"; import { deliverOutboundPayloadsWithQueueCleanup } from "./deliver-queue-execute.js"; +import { createQueuedDeliveryOwner } from "./deliver-queue-state.js"; import type { OutboundDeliveryResult } from "./deliver-types.js"; +import { markDurableDeliveryQueued } from "./delivery-completion.js"; import { startDeliveryProducerLease } from "./delivery-queue-lease.js"; import { StableDeliveryPreparationLostError, @@ -272,6 +274,20 @@ async function runOutboundDeliveryWithQueue( if (queued?.created && stablePreparationOwner) { stablePreparationOwner.markPublished(); } + if (queueId && params.deliveryCompletion) { + const completion = await markDurableDeliveryQueued( + params.deliveryCompletion, + queueId, + queued?.created ? "prepared" : undefined, + ); + if (completion.state !== "queued") { + await createQueuedDeliveryOwner({ + queueId, + expectedPlatformSendAttemptId: queued?.producerClaimId, + }).ack({ suppressCompletionReceipt: true }); + return []; + } + } if (queueId) { params.onDeliveryIntent?.({ id: queueId, diff --git a/src/infra/outbound/deliver.test.ts b/src/infra/outbound/deliver.test.ts index c6e1aa25243d..f476087e9498 100644 --- a/src/infra/outbound/deliver.test.ts +++ b/src/infra/outbound/deliver.test.ts @@ -96,6 +96,7 @@ const queueMocks = vi.hoisted(() => ({ })); const completionMocks = vi.hoisted(() => ({ completeDurableDelivery: vi.fn(), + markDurableDeliveryQueued: vi.fn(async () => ({ state: "queued" as const })), rejectDurableDelivery: vi.fn(), suppressDurableDelivery: vi.fn(), })); @@ -207,6 +208,7 @@ vi.mock("./delivery-queue.js", () => ({ })); vi.mock("./delivery-completion.js", () => ({ completeDurableDelivery: completionMocks.completeDurableDelivery, + markDurableDeliveryQueued: completionMocks.markDurableDeliveryQueued, rejectDurableDelivery: completionMocks.rejectDurableDelivery, suppressDurableDelivery: completionMocks.suppressDurableDelivery, })); @@ -521,6 +523,7 @@ describe("deliverOutboundPayloads", () => { }, ); completionMocks.completeDurableDelivery.mockClear(); + completionMocks.markDurableDeliveryQueued.mockClear(); completionMocks.rejectDurableDelivery.mockClear(); completionMocks.suppressDurableDelivery.mockClear(); queueMocks.ackDelivery.mockClear(); @@ -932,6 +935,26 @@ describe("deliverOutboundPayloads", () => { expect(results[0]?.messageId).toBe("message-adapter-1"); }); + it("does not claim platform custody when message adapter preflight fails", async () => { + const messageSendText = vi.fn(); + setMatrixMessageAdapter({ + id: "matrix", + durableFinal: { capabilities: { text: true } }, + send: { + lifecycle: { + beforeSendAttempt: () => { + throw new Error("preflight rejected"); + }, + }, + text: messageSendText, + }, + }); + + await expect(deliverMatrix({ queuePolicy: "required" })).rejects.toThrow("preflight rejected"); + expect(queueMocks.markDeliveryPlatformSendDispatched).not.toHaveBeenCalled(); + expect(messageSendText).not.toHaveBeenCalled(); + }); + it("does not cross platform I/O when a stable queue intent already exists", async () => { hookMocks.runner.hasHooks.mockImplementation((name?: string) => name === "message_sending"); queueMocks.findDeliveryIntentOwner.mockReturnValue({ @@ -1063,6 +1086,7 @@ describe("deliverOutboundPayloads", () => { expect(completionMocks.completeDurableDelivery).toHaveBeenCalledWith( expect.objectContaining({ operationId: "operation-chunked" }), expect.objectContaining({ messageId: "chunk-2" }), + undefined, ); }); @@ -2169,6 +2193,7 @@ describe("deliverOutboundPayloads", () => { expect(completionMocks.rejectDurableDelivery).toHaveBeenCalledWith( expect.objectContaining({ operationId: "operation-rejected" }), "atomic message limit", + undefined, ); expect(queueMocks.failDeliveryBeforePlatformSend).not.toHaveBeenCalled(); expect(queueMocks.failDelivery).not.toHaveBeenCalled(); @@ -2206,6 +2231,7 @@ describe("deliverOutboundPayloads", () => { expect(completionMocks.rejectDurableDelivery).toHaveBeenCalledWith( expect.objectContaining({ operationId: "operation-empty-rejection" }), "Platform rejected the message before dispatch", + undefined, ); }); diff --git a/src/infra/outbound/delivery-completion.integration.test.ts b/src/infra/outbound/delivery-completion.integration.test.ts new file mode 100644 index 000000000000..dd4325ca9a4f --- /dev/null +++ b/src/infra/outbound/delivery-completion.integration.test.ts @@ -0,0 +1,91 @@ +import path from "node:path"; +import { afterEach, beforeAll, beforeEach, describe, expect, it, vi } from "vitest"; +import type { OpenClawConfig } from "../../config/config.js"; +import { loadSessionEntry, replaceSessionEntry } from "../../config/sessions/session-accessor.js"; +import { createEmptyPluginRegistry } from "../../plugins/registry.js"; +import { resetPluginRuntimeStateForTest, setActivePluginRegistry } from "../../plugins/runtime.js"; +import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/channel-plugins.js"; +import { matrixOutboundForQueueTest } from "./deliver.queue-integration.test-support.js"; +import { loadPendingDeliveries } from "./delivery-queue-storage.js"; +import { installDeliveryQueueTmpDirHooks } from "./delivery-queue.test-helpers.js"; + +let deliverOutboundPayloads: typeof import("./deliver.js").deliverOutboundPayloads; + +describe("pending-final durable delivery completion", () => { + const fixtures = installDeliveryQueueTmpDirHooks(); + let tmpDir: string; + + beforeAll(async () => { + ({ deliverOutboundPayloads } = await import("./deliver.js")); + }); + + beforeEach(() => { + tmpDir = fixtures.tmpDir(); + setActivePluginRegistry( + createTestRegistry([ + { + pluginId: "matrix", + source: "test", + plugin: createOutboundTestPlugin({ id: "matrix", outbound: matrixOutboundForQueueTest }), + }, + ]), + ); + }); + + afterEach(() => { + resetPluginRuntimeStateForTest(); + setActivePluginRegistry(createEmptyPluginRegistry()); + }); + + it("suppresses a second stable caller after the exact pending final was delivered", async () => { + process.env.OPENCLAW_STATE_DIR = tmpDir; + const sessionKey = "agent:main:matrix:direct:123"; + const storePath = path.join(tmpDir, "sessions.json"); + const deliveryId = "pending-final-delivery-1"; + const completion = { + kind: "pending-final" as const, + deliveryId, + intentId: "pending-final-intent-1", + sessionId: "session-1", + sessionKey, + storePath, + }; + await replaceSessionEntry( + { sessionKey, storePath }, + { + sessionId: "session-1", + status: "running", + updatedAt: Date.now(), + pendingFinalDelivery: { + kind: "replayable", + text: "deliver once", + createdAt: Date.now(), + intentId: completion.intentId, + deliveries: [{ id: deliveryId, state: "prepared" }], + }, + }, + ); + const sendMatrix = vi.fn().mockResolvedValue({ messageId: "matrix-message-1" }); + const params = { + cfg: {} as OpenClawConfig, + channel: "matrix" as const, + to: "!room:example", + payloads: [{ text: "deliver once" }], + deps: { matrix: sendMatrix }, + queuePolicy: "required" as const, + deliveryIntentId: deliveryId, + deliveryCompletion: completion, + }; + + await expect(deliverOutboundPayloads(params)).resolves.toMatchObject([ + { messageId: "matrix-message-1" }, + ]); + expect(loadSessionEntry({ sessionKey, storePath })?.pendingFinalDelivery?.deliveries).toEqual([ + { id: deliveryId, state: "delivered" }, + ]); + + await expect(deliverOutboundPayloads(params)).resolves.toEqual([]); + expect(sendMatrix).toHaveBeenCalledOnce(); + expect(await loadPendingDeliveries(tmpDir)).toEqual([]); + }); +}); diff --git a/src/infra/outbound/delivery-completion.test.ts b/src/infra/outbound/delivery-completion.test.ts new file mode 100644 index 000000000000..dd19329a4245 --- /dev/null +++ b/src/infra/outbound/delivery-completion.test.ts @@ -0,0 +1,130 @@ +import fs from "node:fs/promises"; +import os from "node:os"; +import path from "node:path"; +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest"; +import { commitMainSessionRecovery } from "../../agents/main-session-recovery/main-session-recovery-store.js"; +import { loadSessionEntry, replaceSessionEntry } from "../../config/sessions/session-accessor.js"; +import type { InternalSessionEntry } from "../../config/sessions/types.js"; +import { settlePendingFinalDelivery } from "./delivery-completion.js"; + +const recoveryMocks = vi.hoisted(() => ({ + scheduleMainSessionRecoveryPendingTarget: vi.fn(), +})); + +vi.mock( + "../../agents/main-session-recovery/main-session-recovery-owner-release.js", + () => recoveryMocks, +); + +describe("pending-final delivery completion", () => { + let tmpDir: string; + let storePath: string; + const sessionKey = "agent:main:main"; + const completion = { + kind: "pending-final" as const, + deliveryId: "delivery-1", + intentId: "intent-1", + sessionId: "session-1", + sessionKey, + storePath: "", + }; + + beforeEach(async () => { + vi.clearAllMocks(); + tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "openclaw-delivery-completion-")); + storePath = path.join(tmpDir, "sessions.json"); + completion.storePath = storePath; + const entry: InternalSessionEntry = { + sessionId: completion.sessionId, + status: "running", + abortedLastRun: true, + updatedAt: Date.now(), + mainRestartRecovery: { + cycleId: "cycle-1", + revision: 1, + chargedAttempts: 1, + }, + pendingFinalDelivery: { + kind: "replayable", + text: "durable final", + createdAt: Date.now(), + intentId: completion.intentId, + deliveries: [{ id: completion.deliveryId, state: "prepared" }], + }, + }; + await replaceSessionEntry({ sessionKey, storePath }, entry); + }); + + afterEach(async () => { + await fs.rm(tmpDir, { recursive: true, force: true }); + }); + + it("invalidates an earlier recovery decision and wakes the exact session", async () => { + const observation = { sessionId: completion.sessionId, cycleId: "cycle-1", revision: 1 }; + + await expect(settlePendingFinalDelivery(completion, "delivered")).resolves.toEqual({ + state: "delivered", + }); + + expect(loadSessionEntry({ sessionKey, storePath })).toMatchObject({ + mainRestartRecovery: { revision: 2 }, + pendingFinalDelivery: { + deliveries: [{ id: completion.deliveryId, state: "delivered" }], + }, + }); + expect(recoveryMocks.scheduleMainSessionRecoveryPendingTarget).toHaveBeenCalledWith({ + sessionId: completion.sessionId, + sessionKey, + storePath, + }); + await expect( + commitMainSessionRecovery({ + command: { kind: "fail_recovery", now: Date.now(), observation }, + requireWriteSuccess: true, + target: { sessionKey, storePath }, + }), + ).resolves.toMatchObject({ transition: { kind: "rejected", reason: "stale_revision" } }); + }); + + it("records queue custody without waking recovery", async () => { + await expect(settlePendingFinalDelivery(completion, "queued")).resolves.toEqual({ + state: "queued", + }); + + expect(loadSessionEntry({ sessionKey, storePath })).toMatchObject({ + mainRestartRecovery: { revision: 2 }, + pendingFinalDelivery: { + deliveries: [{ id: completion.deliveryId, state: "queued" }], + }, + }); + expect(recoveryMocks.scheduleMainSessionRecoveryPendingTarget).not.toHaveBeenCalled(); + }); + + it("carries the custom queue root when a terminal sibling wakes recovery", async () => { + const entry = loadSessionEntry({ sessionKey, storePath })!; + await replaceSessionEntry( + { sessionKey, storePath }, + { + ...entry, + pendingFinalDelivery: { + ...entry.pendingFinalDelivery!, + deliveries: [ + { id: completion.deliveryId, state: "prepared" }, + { id: "delivery-2", state: "queued" }, + ], + }, + }, + ); + + await expect( + settlePendingFinalDelivery(completion, "delivered", undefined, tmpDir), + ).resolves.toEqual({ state: "delivered" }); + + expect(recoveryMocks.scheduleMainSessionRecoveryPendingTarget).toHaveBeenCalledWith({ + sessionId: completion.sessionId, + sessionKey, + stateDir: tmpDir, + storePath, + }); + }); +}); diff --git a/src/infra/outbound/delivery-completion.ts b/src/infra/outbound/delivery-completion.ts index ead5d780a2e3..9c0216e2f577 100644 --- a/src/infra/outbound/delivery-completion.ts +++ b/src/infra/outbound/delivery-completion.ts @@ -7,74 +7,213 @@ import { markConversationDeliveryUnknown, type ConversationDeliveryRecord, } from "../../config/sessions/conversation-delivery-store.js"; +import { updateSessionEntry } from "../../config/sessions/session-accessor.js"; +import type { InternalSessionEntry } from "../../config/sessions/types.js"; import type { OutboundDeliveryResult } from "./deliver-types.js"; /** Serializable owner callback for a durable queue entry. */ -export type DurableDeliveryCompletion = { - kind: "conversation"; - agentId: string; - operationId: string; - storePath?: string; +export type DurableDeliveryCompletion = + | { + kind: "conversation"; + agentId: string; + operationId: string; + storePath?: string; + } + | { + kind: "pending-final"; + deliveryId: string; + intentId: string; + sessionId: string; + sessionKey: string; + storePath: string; + }; + +type DurableDeliveryCompletionResult = { + state: "prepared" | "queued" | "delivered" | "suppressed" | "rejected" | "unknown" | "stale"; + platformMessageId?: string; + rejectionError?: string; }; -function scopeForCompletion(completion: DurableDeliveryCompletion) { +function scopeForCompletion( + completion: Extract, +) { return { agentId: completion.agentId, ...(completion.storePath ? { storePath: completion.storePath } : {}), }; } +function conversationResult(record: ConversationDeliveryRecord): DurableDeliveryCompletionResult { + const delivered = record.status === "sent" || record.status === "replied"; + return { + state: delivered + ? "delivered" + : record.status === "suppressed" || + record.status === "rejected" || + record.status === "unknown" + ? record.status + : "queued", + ...(delivered && (record.platformMessageId || record.preparedMessageId) + ? { platformMessageId: record.platformMessageId ?? record.preparedMessageId } + : {}), + ...(record.status === "rejected" && record.rejectionError + ? { rejectionError: record.rejectionError } + : {}), + }; +} + +export async function settlePendingFinalDelivery( + completion: Extract, + state: Exclude, + expectedStates?: readonly ("prepared" | "queued" | "unknown")[], + stateDir?: string, +): Promise { + let settled: DurableDeliveryCompletionResult["state"] = "stale"; + let wakeRecovery = false; + await updateSessionEntry( + { sessionKey: completion.sessionKey, storePath: completion.storePath }, + (entry) => { + const internalEntry: InternalSessionEntry = entry; + if ( + internalEntry.sessionId !== completion.sessionId || + internalEntry.pendingFinalDelivery?.intentId !== completion.intentId + ) { + return null; + } + const deliveries = internalEntry.pendingFinalDelivery.deliveries; + const index = deliveries?.findIndex(({ id }) => id === completion.deliveryId) ?? -1; + if (!deliveries || index < 0) { + return null; + } + const current = deliveries[index]!.state; + if (expectedStates && !expectedStates.some((expected) => expected === current)) { + return null; + } + const terminal = + current === "delivered" || + current === "suppressed" || + (current === "unknown" && state === "unknown"); + settled = terminal ? current : state; + if (settled === current) { + return null; + } + wakeRecovery = + settled !== "queued" && + internalEntry.status === "running" && + internalEntry.abortedLastRun === true; + return { + ...(internalEntry.mainRestartRecovery + ? { + mainRestartRecovery: { + ...internalEntry.mainRestartRecovery, + revision: internalEntry.mainRestartRecovery.revision + 1, + }, + } + : {}), + pendingFinalDelivery: { + ...internalEntry.pendingFinalDelivery, + deliveries: deliveries.with(index, { id: completion.deliveryId, state: settled }), + }, + updatedAt: Date.now(), + }; + }, + { skipMaintenance: true, takeCacheOwnership: true }, + ); + if (wakeRecovery) { + const { scheduleMainSessionRecoveryPendingTarget } = + await import("../../agents/main-session-recovery/main-session-recovery-owner-release.js"); + scheduleMainSessionRecoveryPendingTarget({ + sessionId: completion.sessionId, + sessionKey: completion.sessionKey, + ...(stateDir !== undefined ? { stateDir } : {}), + storePath: completion.storePath, + }); + } + return { state: settled }; +} + function readPlatformMessageId(result: OutboundDeliveryResult): string | undefined { const receiptId = result.receipt ? resolveMessageReceiptPrimaryId(result.receipt) : undefined; return receiptId ?? (result.messageId.trim() || undefined); } /** Records queue ownership before either the live sender or recovery crosses platform I/O. */ -export function markDurableDeliveryQueued( +export async function markDurableDeliveryQueued( completion: DurableDeliveryCompletion, queueId: string, -): ConversationDeliveryRecord { - return markConversationDeliveryQueued( - scopeForCompletion(completion), - completion.operationId, - queueId, - ); + expectedPendingFinalState?: "prepared", +): Promise { + return completion.kind === "pending-final" + ? // The reply dispatcher may have claimed direct custody ("queued") before the + // durable enqueue; both states still belong to this send attempt. + await settlePendingFinalDelivery( + completion, + "queued", + expectedPendingFinalState ? ["prepared", "queued"] : undefined, + ) + : conversationResult( + markConversationDeliveryQueued( + scopeForCompletion(completion), + completion.operationId, + queueId, + ), + ); } /** Finalizes owner state from identified platform evidence before queue acknowledgement. */ -export function completeDurableDelivery( +export async function completeDurableDelivery( completion: DurableDeliveryCompletion, result: OutboundDeliveryResult, -): ConversationDeliveryRecord { - return markConversationDeliverySent( - scopeForCompletion(completion), - completion.operationId, - readPlatformMessageId(result), - ); + stateDir?: string, +): Promise { + return completion.kind === "pending-final" + ? await settlePendingFinalDelivery(completion, "delivered", undefined, stateDir) + : conversationResult( + markConversationDeliverySent( + scopeForCompletion(completion), + completion.operationId, + readPlatformMessageId(result), + ), + ); } /** Finalizes a policy-suppressed send before its durable intent is acknowledged. */ -export function suppressDurableDelivery( +export async function suppressDurableDelivery( completion: DurableDeliveryCompletion, -): ConversationDeliveryRecord { - return markConversationDeliverySuppressed(scopeForCompletion(completion), completion.operationId); + stateDir?: string, +): Promise { + return completion.kind === "pending-final" + ? await settlePendingFinalDelivery(completion, "suppressed", undefined, stateDir) + : conversationResult( + markConversationDeliverySuppressed(scopeForCompletion(completion), completion.operationId), + ); } /** Finalizes a permanent provider rejection that provably preceded platform I/O. */ -export function rejectDurableDelivery( +export async function rejectDurableDelivery( completion: DurableDeliveryCompletion, error: string, -): ConversationDeliveryRecord { - return markConversationDeliveryRejected( - scopeForCompletion(completion), - completion.operationId, - error, - ); + stateDir?: string, +): Promise { + return completion.kind === "pending-final" + ? await settlePendingFinalDelivery(completion, "unknown", undefined, stateDir) + : conversationResult( + markConversationDeliveryRejected( + scopeForCompletion(completion), + completion.operationId, + error, + ), + ); } /** Makes a dead-lettered durable send terminal without allowing a blind replay. */ -export function failDurableDelivery( +export async function failDurableDelivery( completion: DurableDeliveryCompletion, -): ConversationDeliveryRecord { - return markConversationDeliveryUnknown(scopeForCompletion(completion), completion.operationId); + stateDir?: string, +): Promise { + return completion.kind === "pending-final" + ? await settlePendingFinalDelivery(completion, "unknown", undefined, stateDir) + : conversationResult( + markConversationDeliveryUnknown(scopeForCompletion(completion), completion.operationId), + ); } diff --git a/src/infra/outbound/delivery-queue-migration.test.ts b/src/infra/outbound/delivery-queue-migration.test.ts index 89de54979d00..062771d2317f 100644 --- a/src/infra/outbound/delivery-queue-migration.test.ts +++ b/src/infra/outbound/delivery-queue-migration.test.ts @@ -329,6 +329,7 @@ describe("outbound prepared queue migration", () => { expect(hookMocks.runMessageSending).not.toHaveBeenCalled(); expect(completionMocks.failDurableDelivery).toHaveBeenCalledWith( interrupted.deliveryCompletion, + tmpDir(), ); expect(getDeliveryQueueEntryStatus(OUTBOUND_LEGACY_PREPARATION_QUEUE_NAME, id, tmpDir())).toBe( "failed", diff --git a/src/infra/outbound/delivery-queue-migration.ts b/src/infra/outbound/delivery-queue-migration.ts index 971552efccc9..f32cab96289d 100644 --- a/src/infra/outbound/delivery-queue-migration.ts +++ b/src/infra/outbound/delivery-queue-migration.ts @@ -320,7 +320,7 @@ async function failInterruptedLegacyPreparation(params: { } if (params.entry.deliveryCompletion) { try { - failDurableDelivery(params.entry.deliveryCompletion); + await failDurableDelivery(params.entry.deliveryCompletion, params.stateDir); } catch (error) { params.log.warn( `Legacy delivery ${params.entry.id} interrupted preparation owner could not be marked unknown: ${String(error)}`, diff --git a/src/infra/outbound/delivery-queue-recovery.ts b/src/infra/outbound/delivery-queue-recovery.ts index afc49733ea6c..b723c8303c83 100644 --- a/src/infra/outbound/delivery-queue-recovery.ts +++ b/src/infra/outbound/delivery-queue-recovery.ts @@ -355,7 +355,7 @@ async function applyRecoveryDeliveryAdmission(params: { if (admission.status === "allowed") { return "allowed"; } - markDurableDeliveryFailedBestEffort(params.entry, params.log); + await markDurableDeliveryFailedBestEffort(params.entry, params.log, params.stateDir); const result = await failPendingDelivery( { id: params.entry.id, @@ -547,7 +547,7 @@ async function moveEntryToFailedWithLogging( log: RecoveryLogger, stateDir?: string, ): Promise { - markDurableDeliveryFailedBestEffort(entry, log); + await markDurableDeliveryFailedBestEffort(entry, log, stateDir); try { const attemptId = recoveryPlatformAttemptId(entry); await moveEntryToFailedAndCleanup({ entry, cfg, log, stateDir, attemptId }); @@ -599,12 +599,16 @@ async function recordRecoveredFailure( }).fail(record, error); } -function markDurableDeliveryFailedBestEffort(entry: QueuedDelivery, log: RecoveryLogger): void { +async function markDurableDeliveryFailedBestEffort( + entry: QueuedDelivery, + log: RecoveryLogger, + stateDir?: string, +): Promise { if (!entry.deliveryCompletion) { return; } try { - failDurableDelivery(entry.deliveryCompletion); + await failDurableDelivery(entry.deliveryCompletion, stateDir); } catch (error) { // Queue ownership is authoritative for replay safety. Missing owner state // must not leave a dead-lettered delivery permanently replayable. @@ -626,9 +630,9 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { if (!completion) { return "continue"; } - let operation: ReturnType; + let operation: Awaited>; try { - operation = markDurableDeliveryQueued(completion, opts.entry.id); + operation = await markDurableDeliveryQueued(completion, opts.entry.id); } catch (error) { const errMsg = `delivery owner state unavailable: ${formatErrorMessage(error)}`; await recordRecoveredFailure(failDelivery, opts.entry, errMsg, opts.stateDir).catch( @@ -638,7 +642,7 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { opts.log.warn(`Delivery entry ${opts.entry.id} ${errMsg}`); return "failed"; } - if (operation.status === "sent" || operation.status === "replied") { + if (operation.state === "delivered") { try { await ackRecoveredDelivery(opts.entry, opts.stateDir); } catch (error) { @@ -647,7 +651,7 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { opts.log.warn(`Delivery entry ${opts.entry.id} ${errMsg}`); return "failed"; } - const messageId = operation.platformMessageId ?? operation.preparedMessageId; + const messageId = operation.platformMessageId; if (messageId) { const result: OutboundDeliveryResult = { channel: opts.entry.channel, messageId }; emitRecoveredTerminalSuccess(opts.entry, result); @@ -663,7 +667,7 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { opts.onRecovered?.(opts.entry); return "recovered"; } - if (operation.status === "suppressed") { + if (operation.state === "suppressed" || operation.state === "stale") { try { await (typeof opts.entry.completionRetention === "object" ? ackRecoveredDelivery(opts.entry, opts.stateDir, { suppressCompletionReceipt: true }) @@ -677,7 +681,7 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { opts.onRecovered?.(opts.entry); return "recovered"; } - if (operation.status === "rejected") { + if (operation.state === "rejected") { try { await (typeof opts.entry.completionRetention === "object" ? ackRecoveredDelivery(opts.entry, opts.stateDir, { suppressCompletionReceipt: true }) @@ -696,17 +700,13 @@ async function resolveCompletedOwnerBeforeRecovery(opts: { failureStage: "platform_send", }), ); - emitRecoveredTerminalFailure( - opts.entry, - operation.rejectionError ?? "delivery permanently rejected before platform dispatch", - ); - opts.onFailed?.( - opts.entry, - operation.rejectionError ?? "delivery permanently rejected before platform dispatch", - ); + const error = + operation.rejectionError ?? "delivery permanently rejected before platform dispatch"; + emitRecoveredTerminalFailure(opts.entry, error); + opts.onFailed?.(opts.entry, error); return "failed"; } - if (operation.status === "unknown") { + if (operation.state === "unknown") { const moved = await moveEntryToFailedWithLogging(opts.entry, opts.cfg, opts.log, opts.stateDir); return moved ? "moved-to-failed" : "failed"; } @@ -773,7 +773,7 @@ async function drainQueuedEntry(opts: { try { const result = buildReconciledSentResult(entry, reconciliation); if (entry.deliveryCompletion) { - completeDurableDelivery(entry.deliveryCompletion, result); + await completeDurableDelivery(entry.deliveryCompletion, result, opts.stateDir); } await ackRecoveredDelivery(entry, opts.stateDir, undefined, entry.platformSendAttemptId); emitRecoveredTerminalSuccess(entry, result); @@ -850,7 +850,7 @@ async function drainQueuedEntry(opts: { return "failed"; } try { - markDurableDeliveryFailedBestEffort(entry, opts.log); + await markDurableDeliveryFailedBestEffort(entry, opts.log, opts.stateDir); const attemptId = recoveryPlatformAttemptId(entry); await moveEntryToFailedAndCleanup({ entry, @@ -927,7 +927,7 @@ async function drainQueuedEntry(opts: { : await reserveDeliveryAttempt(entry.id, maxRetries, opts.stateDir); if (reservation.status === "exhausted") { const errMsg = `delivery retry budget exhausted (${reservation.attemptCount}/${maxRetries})`; - markDurableDeliveryFailedBestEffort(entry, opts.log); + await markDurableDeliveryFailedBestEffort(entry, opts.log, opts.stateDir); try { await moveEntryToFailedAndCleanup({ entry, @@ -993,11 +993,6 @@ async function drainQueuedEntry(opts: { } if (results.length > 0) { deliveredResults = [...results]; - if (entry.deliveryCompletion) { - completeDurableDelivery(entry.deliveryCompletion, results.at(-1)!); - } - } else if (entry.deliveryCompletion) { - suppressDurableDelivery(entry.deliveryCompletion); } const failedOutcomes = payloadOutcomes.filter((outcome) => outcome.status === "failed"); const failedOutcome = failedOutcomes[0]; @@ -1035,6 +1030,13 @@ async function drainQueuedEntry(opts: { } return "failed"; } + if (entry.deliveryCompletion) { + if (results.length > 0) { + await completeDurableDelivery(entry.deliveryCompletion, results.at(-1)!, opts.stateDir); + } else { + await suppressDurableDelivery(entry.deliveryCompletion, opts.stateDir); + } + } postSendState ??= results.length > 0 ? await persistRecoveredPostSendState({ @@ -1155,9 +1157,13 @@ async function drainQueuedEntry(opts: { if (permanentPlatformRejection || isPermanentDeliveryError(errMsg)) { try { if (permanentPlatformRejection && entry.deliveryCompletion) { - rejectDurableDelivery(entry.deliveryCompletion, permanentPlatformRejection.message); + await rejectDurableDelivery( + entry.deliveryCompletion, + permanentPlatformRejection.message, + opts.stateDir, + ); } else { - markDurableDeliveryFailedBestEffort(entry, opts.log); + await markDurableDeliveryFailedBestEffort(entry, opts.log, opts.stateDir); } await moveEntryToFailedAndCleanup({ entry, @@ -1256,7 +1262,7 @@ export async function drainPendingDeliveries(opts: { !needsUnknownSendReconciliation(currentEntry) ) { try { - markDurableDeliveryFailedBestEffort(currentEntry, opts.log); + await markDurableDeliveryFailedBestEffort(currentEntry, opts.log, opts.stateDir); const attemptId = recoveryPlatformAttemptId(currentEntry); await moveEntryToFailedAndCleanup({ entry: currentEntry,