From 2766c27b2aa602bd563a788bfd09680206edc59b Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Fri, 3 Apr 2026 11:16:17 +0100 Subject: [PATCH] refactor(plugin-sdk): genericize web channel runtime seams --- docs/.generated/plugin-sdk-api-baseline.json | 148 ++++-------------- docs/.generated/plugin-sdk-api-baseline.jsonl | 34 ++-- extensions/discord/src/monitor.test.ts | 2 +- .../discord/src/monitor/agent-components.ts | 2 +- extensions/discord/src/monitor/listeners.ts | 2 +- .../src/monitor/message-handler.preflight.ts | 7 +- .../discord/src/monitor/monitor.test.ts | 6 +- extensions/discord/src/send.components.ts | 2 +- extensions/discord/src/send.outbound.ts | 2 +- .../imessage/src/monitor/monitor-provider.ts | 2 +- extensions/line/src/bot-message-context.ts | 4 +- extensions/line/src/send.test.ts | 2 +- extensions/line/src/send.ts | 2 +- .../src/monitor.tool-result.test-harness.ts | 8 +- extensions/signal/src/monitor.ts | 2 +- .../signal/src/monitor/event-handler.ts | 2 +- .../slack/src/monitor/events/channels.test.ts | 6 +- .../slack/src/monitor/events/channels.ts | 2 +- .../events/interactions.block-actions.ts | 2 +- .../src/monitor/events/interactions.modal.ts | 2 +- .../src/monitor/events/interactions.test.ts | 2 +- .../slack/src/monitor/events/members.test.ts | 6 +- .../slack/src/monitor/events/members.ts | 2 +- .../slack/src/monitor/events/messages.test.ts | 6 +- .../slack/src/monitor/events/messages.ts | 2 +- .../slack/src/monitor/events/pins.test.ts | 6 +- extensions/slack/src/monitor/events/pins.ts | 2 +- .../src/monitor/events/reactions.test.ts | 6 +- .../slack/src/monitor/events/reactions.ts | 2 +- .../src/monitor/message-handler/prepare.ts | 2 +- extensions/speech-core/src/tts.ts | 2 +- extensions/telegram/src/bot-deps.ts | 2 +- .../src/bot-message-context.runtime.ts | 2 +- .../bot.create-telegram-bot.test-harness.ts | 4 +- extensions/telegram/src/send.ts | 2 +- .../src/auto-reply/heartbeat-runner.test.ts | 6 +- .../src/auto-reply/heartbeat-runner.ts | 10 +- extensions/whatsapp/src/auto-reply/monitor.ts | 2 +- extensions/whatsapp/src/group-intro.ts | 15 ++ .../whatsapp/src/heartbeat-recipients.test.ts | 34 ++-- .../whatsapp/src/heartbeat-recipients.ts | 100 ++++++++++++ extensions/whatsapp/src/inbound/monitor.ts | 2 +- .../whatsapp/src/inbound/send-api.test.ts | 4 +- extensions/whatsapp/src/inbound/send-api.ts | 2 +- extensions/whatsapp/src/normalize-target.ts | 29 ++++ extensions/whatsapp/src/normalize.ts | 2 - extensions/whatsapp/src/outbound-base.ts | 119 ++++++++++++++ extensions/whatsapp/src/runtime-api.ts | 20 +-- src/auto-reply/reply.test-harness.ts | 2 +- src/channel-web.ts | 4 +- src/channels/channels-misc.test.ts | 4 +- src/cli/deps.test.ts | 6 +- src/cli/send-runtime/whatsapp.ts | 4 +- src/commands/health.snapshot.test.ts | 2 +- src/commands/status.test.ts | 2 +- src/gateway/test-helpers.mocks.ts | 4 +- src/infra/outbound/targets.shared-test.ts | 22 ++- src/infra/outbound/targets.test.ts | 21 ++- src/library.test.ts | 2 +- src/library.ts | 6 +- src/plugin-sdk/channel-contract.ts | 2 + src/plugin-sdk/channel-pairing.ts | 1 + src/plugin-sdk/channel-runtime.ts | 8 - src/plugin-sdk/channel-targets.ts | 2 + src/plugin-sdk/whatsapp-action-runtime.ts | 1 - src/plugin-sdk/whatsapp-login-qr.ts | 4 - .../contracts/plugin-sdk-subpaths.test.ts | 16 ++ ...ary.ts => runtime-web-channel-boundary.ts} | 7 +- .../runtime/runtime-whatsapp-login-tool.ts | 1 - test/helpers/plugins/directory.ts | 2 +- 70 files changed, 490 insertions(+), 265 deletions(-) create mode 100644 extensions/whatsapp/src/group-intro.ts create mode 100644 extensions/whatsapp/src/heartbeat-recipients.ts create mode 100644 extensions/whatsapp/src/outbound-base.ts delete mode 100644 src/plugin-sdk/whatsapp-action-runtime.ts delete mode 100644 src/plugin-sdk/whatsapp-login-qr.ts rename src/plugins/runtime/{runtime-whatsapp-boundary.ts => runtime-web-channel-boundary.ts} (97%) delete mode 100644 src/plugins/runtime/runtime-whatsapp-login-tool.ts diff --git a/docs/.generated/plugin-sdk-api-baseline.json b/docs/.generated/plugin-sdk-api-baseline.json index e5d84fa751f..bd1ed77c562 100644 --- a/docs/.generated/plugin-sdk-api-baseline.json +++ b/docs/.generated/plugin-sdk-api-baseline.json @@ -1258,7 +1258,7 @@ "exportName": "DiscordConfigSchema", "kind": "const", "source": { - "line": 704, + "line": 710, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1285,7 +1285,7 @@ "exportName": "GoogleChatConfigSchema", "kind": "const", "source": { - "line": 843, + "line": 849, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1303,7 +1303,7 @@ "exportName": "IMessageConfigSchema", "kind": "const", "source": { - "line": 1357, + "line": 1363, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1321,7 +1321,7 @@ "exportName": "MSTeamsConfigSchema", "kind": "const", "source": { - "line": 1541, + "line": 1547, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1348,7 +1348,7 @@ "exportName": "SignalConfigSchema", "kind": "const", "source": { - "line": 1113, + "line": 1119, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1357,16 +1357,16 @@ "exportName": "SlackConfigSchema", "kind": "const", "source": { - "line": 978, + "line": 984, "path": "src/config/zod-schema.providers-core.ts" } }, { - "declaration": "export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; accounts: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;", + "declaration": "export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; dangerouslyAllowPrivateNetwork: z.ZodOptional; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; accounts: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; dangerouslyAllowPrivateNetwork: z.ZodOptional; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;", "exportName": "TelegramConfigSchema", "kind": "const", "source": { - "line": 336, + "line": 342, "path": "src/config/zod-schema.providers-core.ts" } }, @@ -1462,6 +1462,15 @@ "path": "src/channels/plugins/types.adapters.ts" } }, + { + "declaration": "export type ChannelDirectoryAdapter = ChannelDirectoryAdapter;", + "exportName": "ChannelDirectoryAdapter", + "kind": "type", + "source": { + "line": 454, + "path": "src/channels/plugins/types.adapters.ts" + } + }, { "declaration": "export type ChannelGroupContext = ChannelGroupContext;", "exportName": "ChannelGroupContext", @@ -1568,7 +1577,7 @@ "exportName": "createChannelPairingChallengeIssuer", "kind": "function", "source": { - "line": 21, + "line": 22, "path": "src/plugin-sdk/channel-pairing.ts" } }, @@ -1577,7 +1586,7 @@ "exportName": "createChannelPairingController", "kind": "function", "source": { - "line": 39, + "line": 40, "path": "src/plugin-sdk/channel-pairing.ts" } }, @@ -1608,12 +1617,21 @@ "path": "src/channels/plugins/pairing-adapters.ts" } }, + { + "declaration": "export function readChannelAllowFromStoreSync(channel: ChannelId, env?: ProcessEnv, accountId?: string | undefined): string[];", + "exportName": "readChannelAllowFromStoreSync", + "kind": "function", + "source": { + "line": 601, + "path": "src/pairing/pairing-store.ts" + } + }, { "declaration": "export type ChannelPairingController = ChannelPairingController;", "exportName": "ChannelPairingController", "kind": "type", "source": { - "line": 14, + "line": 15, "path": "src/plugin-sdk/channel-pairing.ts" } } @@ -1738,15 +1756,6 @@ "path": "src/channels/typing.ts" } }, - { - "declaration": "export function createWhatsAppOutboundBase({ chunker, sendMessageWhatsApp, sendPollWhatsApp, shouldLogVerbose, resolveTarget, normalizeText, skipEmptyText, }: CreateWhatsAppOutboundBaseParams): Pick;", - "exportName": "createWhatsAppOutboundBase", - "kind": "function", - "source": { - "line": 58, - "path": "src/channels/plugins/whatsapp-shared.ts" - } - }, { "declaration": "export function emitHeartbeatEvent(evt: Omit): void;", "exportName": "emitHeartbeatEvent", @@ -1774,24 +1783,6 @@ "path": "src/infra/heartbeat-events.ts" } }, - { - "declaration": "export function isWhatsAppGroupJid(value: string): boolean;", - "exportName": "isWhatsAppGroupJid", - "kind": "function", - "source": { - "line": 18, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, - { - "declaration": "export function isWhatsAppUserTarget(value: string): boolean;", - "exportName": "isWhatsAppUserTarget", - "kind": "function", - "source": { - "line": 31, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, { "declaration": "export function keepHttpServerTaskAlive(params: { server: CloseAwareServer; abortSignal?: AbortSignal | undefined; onAbort?: (() => void | Promise) | undefined; }): Promise;", "exportName": "keepHttpServerTaskAlive", @@ -1801,24 +1792,6 @@ "path": "src/plugin-sdk/channel-lifecycle.core.ts" } }, - { - "declaration": "export function looksLikeSignalTargetId(raw: string, normalized?: string | undefined): boolean;", - "exportName": "looksLikeSignalTargetId", - "kind": "function", - "source": { - "line": 38, - "path": "src/channels/plugins/normalize/signal.ts" - } - }, - { - "declaration": "export function looksLikeWhatsAppTargetId(raw: string): boolean;", - "exportName": "looksLikeWhatsAppTargetId", - "kind": "function", - "source": { - "line": 88, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, { "declaration": "export function normalizeChannelId(raw?: string | null | undefined): ChannelId | null;", "exportName": "normalizeChannelId", @@ -1855,42 +1828,6 @@ "path": "src/polls.ts" } }, - { - "declaration": "export function normalizeSignalMessagingTarget(raw: string): string | undefined;", - "exportName": "normalizeSignalMessagingTarget", - "kind": "function", - "source": { - "line": 1, - "path": "src/channels/plugins/normalize/signal.ts" - } - }, - { - "declaration": "export function normalizeWhatsAppAllowFromEntries(allowFrom: (string | number)[]): string[];", - "exportName": "normalizeWhatsAppAllowFromEntries", - "kind": "function", - "source": { - "line": 80, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, - { - "declaration": "export function normalizeWhatsAppMessagingTarget(raw: string): string | undefined;", - "exportName": "normalizeWhatsAppMessagingTarget", - "kind": "function", - "source": { - "line": 72, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, - { - "declaration": "export function normalizeWhatsAppTarget(value: string): string | null;", - "exportName": "normalizeWhatsAppTarget", - "kind": "function", - "source": { - "line": 48, - "path": "src/channels/plugins/normalize/whatsapp.ts" - } - }, { "declaration": "export function onHeartbeatEvent(listener: (evt: HeartbeatEventPayload) => void): () => void;", "exportName": "onHeartbeatEvent", @@ -1963,33 +1900,6 @@ "path": "src/polls.ts" } }, - { - "declaration": "export function resolveWhatsAppGroupIntroHint(): string;", - "exportName": "resolveWhatsAppGroupIntroHint", - "kind": "function", - "source": { - "line": 11, - "path": "src/channels/plugins/whatsapp-shared.ts" - } - }, - { - "declaration": "export function resolveWhatsAppHeartbeatRecipients(cfg: OpenClawConfig, opts?: HeartbeatRecipientsOpts): HeartbeatRecipientsResult;", - "exportName": "resolveWhatsAppHeartbeatRecipients", - "kind": "function", - "source": { - "line": 48, - "path": "src/channels/plugins/whatsapp-heartbeat.ts" - } - }, - { - "declaration": "export function resolveWhatsAppMentionStripRegexes(ctx: { To?: string | null | undefined; }): RegExp[];", - "exportName": "resolveWhatsAppMentionStripRegexes", - "kind": "function", - "source": { - "line": 15, - "path": "src/channels/plugins/whatsapp-shared.ts" - } - }, { "declaration": "export function waitForTransportReady(params: WaitForTransportReadyParams): Promise;", "exportName": "waitForTransportReady", diff --git a/docs/.generated/plugin-sdk-api-baseline.jsonl b/docs/.generated/plugin-sdk-api-baseline.jsonl index f7508034602..4c820e3a296 100644 --- a/docs/.generated/plugin-sdk-api-baseline.jsonl +++ b/docs/.generated/plugin-sdk-api-baseline.jsonl @@ -137,19 +137,19 @@ {"declaration":"export const AllowFromListSchema: z.ZodOptional>>;","entrypoint":"channel-config-schema","exportName":"AllowFromListSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":19,"sourcePath":"src/channels/plugins/config-schema.ts"} {"declaration":"export const BlockStreamingCoalesceSchema: z.ZodObject<{ minChars: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"BlockStreamingCoalesceSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":341,"sourcePath":"src/config/zod-schema.core.ts"} {"declaration":"export const ContextVisibilityModeSchema: z.ZodEnum<{ allowlist: \"allowlist\"; all: \"all\"; allowlist_quote: \"allowlist_quote\"; }>;","entrypoint":"channel-config-schema","exportName":"ContextVisibilityModeSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":339,"sourcePath":"src/config/zod-schema.core.ts"} -{"declaration":"export const DiscordConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; proxy: z.ZodOptional; allowBots: z.ZodOptional]>>; dangerouslyAllowNameMatching: z.ZodOptional; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; streamMode: z.ZodOptional>; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; maxLinesPerMessage: z.ZodOptional; mediaMaxMb: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; stickers: z.ZodOptional; emojiUploads: z.ZodOptional; stickerUploads: z.ZodOptional; polls: z.ZodOptional; permissions: z.ZodOptional; messages: z.ZodOptional; threads: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; memberInfo: z.ZodOptional; roleInfo: z.ZodOptional; roles: z.ZodOptional; channelInfo: z.ZodOptional; voiceStatus: z.ZodOptional; events: z.ZodOptional; moderation: z.ZodOptional; channels: z.ZodOptional; presence: z.ZodOptional; }, z.core.$strict>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; }, z.core.$strict>>; guilds: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; reactionNotifications: z.ZodOptional>; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; channels: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; systemPrompt: z.ZodOptional; includeThreadStarter: z.ZodOptional; autoThread: z.ZodOptional; autoThreadName: z.ZodOptional>; autoArchiveDuration: z.ZodOptional, z.ZodLiteral<60>, z.ZodLiteral<1440>, z.ZodLiteral<4320>, z.ZodLiteral<10080>]>>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; cleanupAfterResolve: z.ZodOptional; target: z.ZodOptional>; }, z.core.$strict>>; agentComponents: z.ZodOptional; }, z.core.$strict>>; ui: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; slashCommand: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; intents: z.ZodOptional; guildMembers: z.ZodOptional; }, z.core.$strict>>; voice: z.ZodOptional; autoJoin: z.ZodOptional>>; daveEncryption: z.ZodOptional; decryptionFailureTolerance: z.ZodOptional; tts: z.ZodOptional>; enabled: z.ZodOptional; mode: z.ZodOptional>; provider: z.ZodOptional; summaryModel: z.ZodOptional; modelOverrides: z.ZodOptional; allowText: z.ZodOptional; allowProvider: z.ZodOptional; allowVoice: z.ZodOptional; allowModelId: z.ZodOptional; allowVoiceSettings: z.ZodOptional; allowNormalization: z.ZodOptional; allowSeed: z.ZodOptional; }, z.core.$strict>>; providers: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$catchall, z.ZodRecord]>>>>>; prefsPath: z.ZodOptional; maxTextLength: z.ZodOptional; timeoutMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; pluralkit: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; ackReactionScope: z.ZodOptional>; activity: z.ZodOptional; status: z.ZodOptional>; autoPresence: z.ZodOptional; intervalMs: z.ZodOptional; minUpdateIntervalMs: z.ZodOptional; healthyText: z.ZodOptional; degradedText: z.ZodOptional; exhaustedText: z.ZodOptional; }, z.core.$strict>>; activityType: z.ZodOptional, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>>; activityUrl: z.ZodOptional; inboundWorker: z.ZodOptional; }, z.core.$strict>>; eventQueue: z.ZodOptional; maxQueueSize: z.ZodOptional; maxConcurrency: z.ZodOptional; }, z.core.$strict>>; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; proxy: z.ZodOptional; allowBots: z.ZodOptional]>>; dangerouslyAllowNameMatching: z.ZodOptional; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; streamMode: z.ZodOptional>; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; maxLinesPerMessage: z.ZodOptional; mediaMaxMb: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; stickers: z.ZodOptional; emojiUploads: z.ZodOptional; stickerUploads: z.ZodOptional; polls: z.ZodOptional; permissions: z.ZodOptional; messages: z.ZodOptional; threads: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; memberInfo: z.ZodOptional; roleInfo: z.ZodOptional; roles: z.ZodOptional; channelInfo: z.ZodOptional; voiceStatus: z.ZodOptional; events: z.ZodOptional; moderation: z.ZodOptional; channels: z.ZodOptional; presence: z.ZodOptional; }, z.core.$strict>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; }, z.core.$strict>>; guilds: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; reactionNotifications: z.ZodOptional>; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; channels: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; systemPrompt: z.ZodOptional; includeThreadStarter: z.ZodOptional; autoThread: z.ZodOptional; autoThreadName: z.ZodOptional>; autoArchiveDuration: z.ZodOptional, z.ZodLiteral<60>, z.ZodLiteral<1440>, z.ZodLiteral<4320>, z.ZodLiteral<10080>]>>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; cleanupAfterResolve: z.ZodOptional; target: z.ZodOptional>; }, z.core.$strict>>; agentComponents: z.ZodOptional; }, z.core.$strict>>; ui: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; slashCommand: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; intents: z.ZodOptional; guildMembers: z.ZodOptional; }, z.core.$strict>>; voice: z.ZodOptional; autoJoin: z.ZodOptional>>; daveEncryption: z.ZodOptional; decryptionFailureTolerance: z.ZodOptional; tts: z.ZodOptional>; enabled: z.ZodOptional; mode: z.ZodOptional>; provider: z.ZodOptional; summaryModel: z.ZodOptional; modelOverrides: z.ZodOptional; allowText: z.ZodOptional; allowProvider: z.ZodOptional; allowVoice: z.ZodOptional; allowModelId: z.ZodOptional; allowVoiceSettings: z.ZodOptional; allowNormalization: z.ZodOptional; allowSeed: z.ZodOptional; }, z.core.$strict>>; providers: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$catchall, z.ZodRecord]>>>>>; prefsPath: z.ZodOptional; maxTextLength: z.ZodOptional; timeoutMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; pluralkit: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; ackReactionScope: z.ZodOptional>; activity: z.ZodOptional; status: z.ZodOptional>; autoPresence: z.ZodOptional; intervalMs: z.ZodOptional; minUpdateIntervalMs: z.ZodOptional; healthyText: z.ZodOptional; degradedText: z.ZodOptional; exhaustedText: z.ZodOptional; }, z.core.$strict>>; activityType: z.ZodOptional, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>>; activityUrl: z.ZodOptional; inboundWorker: z.ZodOptional; }, z.core.$strict>>; eventQueue: z.ZodOptional; maxQueueSize: z.ZodOptional; maxConcurrency: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"DiscordConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":704,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const DiscordConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; proxy: z.ZodOptional; allowBots: z.ZodOptional]>>; dangerouslyAllowNameMatching: z.ZodOptional; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; streamMode: z.ZodOptional>; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; maxLinesPerMessage: z.ZodOptional; mediaMaxMb: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; stickers: z.ZodOptional; emojiUploads: z.ZodOptional; stickerUploads: z.ZodOptional; polls: z.ZodOptional; permissions: z.ZodOptional; messages: z.ZodOptional; threads: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; memberInfo: z.ZodOptional; roleInfo: z.ZodOptional; roles: z.ZodOptional; channelInfo: z.ZodOptional; voiceStatus: z.ZodOptional; events: z.ZodOptional; moderation: z.ZodOptional; channels: z.ZodOptional; presence: z.ZodOptional; }, z.core.$strict>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; }, z.core.$strict>>; guilds: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; reactionNotifications: z.ZodOptional>; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; channels: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; systemPrompt: z.ZodOptional; includeThreadStarter: z.ZodOptional; autoThread: z.ZodOptional; autoThreadName: z.ZodOptional>; autoArchiveDuration: z.ZodOptional, z.ZodLiteral<60>, z.ZodLiteral<1440>, z.ZodLiteral<4320>, z.ZodLiteral<10080>]>>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; cleanupAfterResolve: z.ZodOptional; target: z.ZodOptional>; }, z.core.$strict>>; agentComponents: z.ZodOptional; }, z.core.$strict>>; ui: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; slashCommand: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; intents: z.ZodOptional; guildMembers: z.ZodOptional; }, z.core.$strict>>; voice: z.ZodOptional; autoJoin: z.ZodOptional>>; daveEncryption: z.ZodOptional; decryptionFailureTolerance: z.ZodOptional; tts: z.ZodOptional>; enabled: z.ZodOptional; mode: z.ZodOptional>; provider: z.ZodOptional; summaryModel: z.ZodOptional; modelOverrides: z.ZodOptional; allowText: z.ZodOptional; allowProvider: z.ZodOptional; allowVoice: z.ZodOptional; allowModelId: z.ZodOptional; allowVoiceSettings: z.ZodOptional; allowNormalization: z.ZodOptional; allowSeed: z.ZodOptional; }, z.core.$strict>>; providers: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$catchall, z.ZodRecord]>>>>>; prefsPath: z.ZodOptional; maxTextLength: z.ZodOptional; timeoutMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; pluralkit: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; ackReactionScope: z.ZodOptional>; activity: z.ZodOptional; status: z.ZodOptional>; autoPresence: z.ZodOptional; intervalMs: z.ZodOptional; minUpdateIntervalMs: z.ZodOptional; healthyText: z.ZodOptional; degradedText: z.ZodOptional; exhaustedText: z.ZodOptional; }, z.core.$strict>>; activityType: z.ZodOptional, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>>; activityUrl: z.ZodOptional; inboundWorker: z.ZodOptional; }, z.core.$strict>>; eventQueue: z.ZodOptional; maxQueueSize: z.ZodOptional; maxConcurrency: z.ZodOptional; }, z.core.$strict>>; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; proxy: z.ZodOptional; allowBots: z.ZodOptional]>>; dangerouslyAllowNameMatching: z.ZodOptional; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; streamMode: z.ZodOptional>; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; maxLinesPerMessage: z.ZodOptional; mediaMaxMb: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; stickers: z.ZodOptional; emojiUploads: z.ZodOptional; stickerUploads: z.ZodOptional; polls: z.ZodOptional; permissions: z.ZodOptional; messages: z.ZodOptional; threads: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; memberInfo: z.ZodOptional; roleInfo: z.ZodOptional; roles: z.ZodOptional; channelInfo: z.ZodOptional; voiceStatus: z.ZodOptional; events: z.ZodOptional; moderation: z.ZodOptional; channels: z.ZodOptional; presence: z.ZodOptional; }, z.core.$strict>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; }, z.core.$strict>>; guilds: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; reactionNotifications: z.ZodOptional>; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; channels: z.ZodOptional; requireMention: z.ZodOptional; ignoreOtherMentions: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; users: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; roles: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; systemPrompt: z.ZodOptional; includeThreadStarter: z.ZodOptional; autoThread: z.ZodOptional; autoThreadName: z.ZodOptional>; autoArchiveDuration: z.ZodOptional, z.ZodLiteral<60>, z.ZodLiteral<1440>, z.ZodLiteral<4320>, z.ZodLiteral<10080>]>>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional, z.ZodTransform>, z.ZodString>>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; cleanupAfterResolve: z.ZodOptional; target: z.ZodOptional>; }, z.core.$strict>>; agentComponents: z.ZodOptional; }, z.core.$strict>>; ui: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>; slashCommand: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; intents: z.ZodOptional; guildMembers: z.ZodOptional; }, z.core.$strict>>; voice: z.ZodOptional; autoJoin: z.ZodOptional>>; daveEncryption: z.ZodOptional; decryptionFailureTolerance: z.ZodOptional; tts: z.ZodOptional>; enabled: z.ZodOptional; mode: z.ZodOptional>; provider: z.ZodOptional; summaryModel: z.ZodOptional; modelOverrides: z.ZodOptional; allowText: z.ZodOptional; allowProvider: z.ZodOptional; allowVoice: z.ZodOptional; allowModelId: z.ZodOptional; allowVoiceSettings: z.ZodOptional; allowNormalization: z.ZodOptional; allowSeed: z.ZodOptional; }, z.core.$strict>>; providers: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$catchall, z.ZodRecord]>>>>>; prefsPath: z.ZodOptional; maxTextLength: z.ZodOptional; timeoutMs: z.ZodOptional; }, z.core.$strict>>>; }, z.core.$strict>>; pluralkit: z.ZodOptional; token: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; ackReactionScope: z.ZodOptional>; activity: z.ZodOptional; status: z.ZodOptional>; autoPresence: z.ZodOptional; intervalMs: z.ZodOptional; minUpdateIntervalMs: z.ZodOptional; healthyText: z.ZodOptional; degradedText: z.ZodOptional; exhaustedText: z.ZodOptional; }, z.core.$strict>>; activityType: z.ZodOptional, z.ZodLiteral<1>, z.ZodLiteral<2>, z.ZodLiteral<3>, z.ZodLiteral<4>, z.ZodLiteral<5>]>>; activityUrl: z.ZodOptional; inboundWorker: z.ZodOptional; }, z.core.$strict>>; eventQueue: z.ZodOptional; maxQueueSize: z.ZodOptional; maxConcurrency: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"DiscordConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":710,"sourcePath":"src/config/zod-schema.providers-core.ts"} {"declaration":"export const DmConfigSchema: z.ZodObject<{ historyLimit: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"DmConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":294,"sourcePath":"src/config/zod-schema.core.ts"} {"declaration":"export const DmPolicySchema: z.ZodEnum<{ disabled: \"disabled\"; pairing: \"pairing\"; allowlist: \"allowlist\"; open: \"open\"; }>;","entrypoint":"channel-config-schema","exportName":"DmPolicySchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":338,"sourcePath":"src/config/zod-schema.core.ts"} -{"declaration":"export const GoogleChatConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; enabled: z.ZodOptional; configWrites: z.ZodOptional; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodDefault>>; groupAllowFrom: z.ZodOptional>>; groups: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; users: z.ZodOptional>>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; defaultTo: z.ZodOptional; serviceAccount: z.ZodOptional, z.ZodDiscriminatedUnion<[z.ZodObject<{ source: z.ZodLiteral<\"env\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; serviceAccountRef: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">>; serviceAccountFile: z.ZodOptional; audienceType: z.ZodOptional>; audience: z.ZodOptional; appPrincipal: z.ZodOptional; webhookPath: z.ZodOptional; webhookUrl: z.ZodOptional; botUser: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodDefault>>; mediaMaxMb: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; actions: z.ZodOptional; }, z.core.$strict>>; dm: z.ZodOptional; policy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; typingIndicator: z.ZodOptional>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; enabled: z.ZodOptional; configWrites: z.ZodOptional; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodDefault>>; groupAllowFrom: z.ZodOptional>>; groups: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; users: z.ZodOptional>>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; defaultTo: z.ZodOptional; serviceAccount: z.ZodOptional, z.ZodDiscriminatedUnion<[z.ZodObject<{ source: z.ZodLiteral<\"env\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; serviceAccountRef: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">>; serviceAccountFile: z.ZodOptional; audienceType: z.ZodOptional>; audience: z.ZodOptional; appPrincipal: z.ZodOptional; webhookPath: z.ZodOptional; webhookUrl: z.ZodOptional; botUser: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodDefault>>; mediaMaxMb: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; actions: z.ZodOptional; }, z.core.$strict>>; dm: z.ZodOptional; policy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; typingIndicator: z.ZodOptional>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"GoogleChatConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":843,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const GoogleChatConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; enabled: z.ZodOptional; configWrites: z.ZodOptional; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodDefault>>; groupAllowFrom: z.ZodOptional>>; groups: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; users: z.ZodOptional>>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; defaultTo: z.ZodOptional; serviceAccount: z.ZodOptional, z.ZodDiscriminatedUnion<[z.ZodObject<{ source: z.ZodLiteral<\"env\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; serviceAccountRef: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">>; serviceAccountFile: z.ZodOptional; audienceType: z.ZodOptional>; audience: z.ZodOptional; appPrincipal: z.ZodOptional; webhookPath: z.ZodOptional; webhookUrl: z.ZodOptional; botUser: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodDefault>>; mediaMaxMb: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; actions: z.ZodOptional; }, z.core.$strict>>; dm: z.ZodOptional; policy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; typingIndicator: z.ZodOptional>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; enabled: z.ZodOptional; configWrites: z.ZodOptional; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodDefault>>; groupAllowFrom: z.ZodOptional>>; groups: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; users: z.ZodOptional>>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; defaultTo: z.ZodOptional; serviceAccount: z.ZodOptional, z.ZodDiscriminatedUnion<[z.ZodObject<{ source: z.ZodLiteral<\"env\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; serviceAccountRef: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">>; serviceAccountFile: z.ZodOptional; audienceType: z.ZodOptional>; audience: z.ZodOptional; appPrincipal: z.ZodOptional; webhookPath: z.ZodOptional; webhookUrl: z.ZodOptional; botUser: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodDefault>>; mediaMaxMb: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; actions: z.ZodOptional; }, z.core.$strict>>; dm: z.ZodOptional; policy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; typingIndicator: z.ZodOptional>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"GoogleChatConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":849,"sourcePath":"src/config/zod-schema.providers-core.ts"} {"declaration":"export const GroupPolicySchema: z.ZodEnum<{ disabled: \"disabled\"; allowlist: \"allowlist\"; open: \"open\"; }>;","entrypoint":"channel-config-schema","exportName":"GroupPolicySchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":336,"sourcePath":"src/config/zod-schema.core.ts"} -{"declaration":"export const IMessageConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; cliPath: z.ZodOptional; dbPath: z.ZodOptional; remoteHost: z.ZodOptional; service: z.ZodOptional, z.ZodLiteral<\"sms\">, z.ZodLiteral<\"auto\">]>>; region: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; includeAttachments: z.ZodOptional; attachmentRoots: z.ZodOptional>; remoteAttachmentRoots: z.ZodOptional>; mediaMaxMb: z.ZodOptional; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; cliPath: z.ZodOptional; dbPath: z.ZodOptional; remoteHost: z.ZodOptional; service: z.ZodOptional, z.ZodLiteral<\"sms\">, z.ZodLiteral<\"auto\">]>>; region: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; includeAttachments: z.ZodOptional; attachmentRoots: z.ZodOptional>; remoteAttachmentRoots: z.ZodOptional>; mediaMaxMb: z.ZodOptional; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"IMessageConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1357,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const IMessageConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; cliPath: z.ZodOptional; dbPath: z.ZodOptional; remoteHost: z.ZodOptional; service: z.ZodOptional, z.ZodLiteral<\"sms\">, z.ZodLiteral<\"auto\">]>>; region: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; includeAttachments: z.ZodOptional; attachmentRoots: z.ZodOptional>; remoteAttachmentRoots: z.ZodOptional>; mediaMaxMb: z.ZodOptional; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; cliPath: z.ZodOptional; dbPath: z.ZodOptional; remoteHost: z.ZodOptional; service: z.ZodOptional, z.ZodLiteral<\"sms\">, z.ZodLiteral<\"auto\">]>>; region: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; includeAttachments: z.ZodOptional; attachmentRoots: z.ZodOptional>; remoteAttachmentRoots: z.ZodOptional>; mediaMaxMb: z.ZodOptional; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"IMessageConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1363,"sourcePath":"src/config/zod-schema.providers-core.ts"} {"declaration":"export const MarkdownConfigSchema: z.ZodOptional>; }, z.core.$strict>>;","entrypoint":"channel-config-schema","exportName":"MarkdownConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":374,"sourcePath":"src/config/zod-schema.core.ts"} -{"declaration":"export const MSTeamsConfigSchema: z.ZodObject<{ enabled: z.ZodOptional; capabilities: z.ZodOptional>; dangerouslyAllowNameMatching: z.ZodOptional; markdown: z.ZodOptional>; }, z.core.$strict>>; configWrites: z.ZodOptional; appId: z.ZodOptional; appPassword: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tenantId: z.ZodOptional; webhook: z.ZodOptional; path: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaAllowHosts: z.ZodOptional>; mediaAuthAllowHosts: z.ZodOptional>; requireMention: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; teams: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; channels: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; mediaMaxMb: z.ZodOptional; sharePointSiteId: z.ZodOptional; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; welcomeCard: z.ZodOptional; promptStarters: z.ZodOptional>; groupWelcomeCard: z.ZodOptional; feedbackEnabled: z.ZodOptional; feedbackReflection: z.ZodOptional; feedbackReflectionCooldownMs: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"MSTeamsConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1541,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const MSTeamsConfigSchema: z.ZodObject<{ enabled: z.ZodOptional; capabilities: z.ZodOptional>; dangerouslyAllowNameMatching: z.ZodOptional; markdown: z.ZodOptional>; }, z.core.$strict>>; configWrites: z.ZodOptional; appId: z.ZodOptional; appPassword: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tenantId: z.ZodOptional; webhook: z.ZodOptional; path: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaAllowHosts: z.ZodOptional>; mediaAuthAllowHosts: z.ZodOptional>; requireMention: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; teams: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; channels: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; replyStyle: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; mediaMaxMb: z.ZodOptional; sharePointSiteId: z.ZodOptional; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; welcomeCard: z.ZodOptional; promptStarters: z.ZodOptional>; groupWelcomeCard: z.ZodOptional; feedbackEnabled: z.ZodOptional; feedbackReflection: z.ZodOptional; feedbackReflectionCooldownMs: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"MSTeamsConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1547,"sourcePath":"src/config/zod-schema.providers-core.ts"} {"declaration":"export const ReplyRuntimeConfigSchemaShape: { historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; contextVisibility: z.ZodOptional>; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; mediaMaxMb: z.ZodOptional; };","entrypoint":"channel-config-schema","exportName":"ReplyRuntimeConfigSchemaShape","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":349,"sourcePath":"src/config/zod-schema.core.ts"} {"declaration":"export const requireOpenAllowFrom: (params: { policy?: string; allowFrom?: Array; ctx: z.RefinementCtx; path: Array; message: string; }) => void;","entrypoint":"channel-config-schema","exportName":"requireOpenAllowFrom","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":489,"sourcePath":"src/config/zod-schema.core.ts"} -{"declaration":"export const SignalConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; account: z.ZodOptional; accountUuid: z.ZodOptional; httpUrl: z.ZodOptional; httpHost: z.ZodOptional; httpPort: z.ZodOptional; cliPath: z.ZodOptional; autoStart: z.ZodOptional; startupTimeoutMs: z.ZodOptional; receiveMode: z.ZodOptional, z.ZodLiteral<\"manual\">]>>; ignoreAttachments: z.ZodOptional; ignoreStories: z.ZodOptional; sendReadReceipts: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; groups: z.ZodOptional; ingest: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; actions: z.ZodOptional; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; account: z.ZodOptional; accountUuid: z.ZodOptional; httpUrl: z.ZodOptional; httpHost: z.ZodOptional; httpPort: z.ZodOptional; cliPath: z.ZodOptional; autoStart: z.ZodOptional; startupTimeoutMs: z.ZodOptional; receiveMode: z.ZodOptional, z.ZodLiteral<\"manual\">]>>; ignoreAttachments: z.ZodOptional; ignoreStories: z.ZodOptional; sendReadReceipts: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; groups: z.ZodOptional; ingest: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; actions: z.ZodOptional; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"SignalConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1113,"sourcePath":"src/config/zod-schema.providers-core.ts"} -{"declaration":"export const SlackConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ interactiveReplies: z.ZodOptional; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; appToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userTokenReadOnly: z.ZodDefault>; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; nativeStreaming: z.ZodOptional; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; replyToModeByChatType: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; group: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; channel: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; thread: z.ZodOptional>; inheritParent: z.ZodOptional; initialHistoryLimit: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; messages: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; permissions: z.ZodOptional; memberInfo: z.ZodOptional; channelInfo: z.ZodOptional; emojiList: z.ZodOptional; }, z.core.$strict>>; slashCommand: z.ZodOptional; name: z.ZodOptional; sessionPrefix: z.ZodOptional; ephemeral: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; channels: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; allowBots: z.ZodOptional; users: z.ZodOptional>>; skills: z.ZodOptional>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; typingReaction: z.ZodOptional; mode: z.ZodDefault>>; signingSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodDefault>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; accounts: z.ZodOptional; mode: z.ZodOptional>; signingSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ interactiveReplies: z.ZodOptional; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; appToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userTokenReadOnly: z.ZodDefault>; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodOptional>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; nativeStreaming: z.ZodOptional; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; replyToModeByChatType: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; group: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; channel: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; thread: z.ZodOptional>; inheritParent: z.ZodOptional; initialHistoryLimit: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; messages: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; permissions: z.ZodOptional; memberInfo: z.ZodOptional; channelInfo: z.ZodOptional; emojiList: z.ZodOptional; }, z.core.$strict>>; slashCommand: z.ZodOptional; name: z.ZodOptional; sessionPrefix: z.ZodOptional; ephemeral: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; channels: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; allowBots: z.ZodOptional; users: z.ZodOptional>>; skills: z.ZodOptional>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; typingReaction: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"SlackConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":978,"sourcePath":"src/config/zod-schema.providers-core.ts"} -{"declaration":"export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; accounts: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"TelegramConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":336,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const SignalConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; account: z.ZodOptional; accountUuid: z.ZodOptional; httpUrl: z.ZodOptional; httpHost: z.ZodOptional; httpPort: z.ZodOptional; cliPath: z.ZodOptional; autoStart: z.ZodOptional; startupTimeoutMs: z.ZodOptional; receiveMode: z.ZodOptional, z.ZodLiteral<\"manual\">]>>; ignoreAttachments: z.ZodOptional; ignoreStories: z.ZodOptional; sendReadReceipts: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; groups: z.ZodOptional; ingest: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; actions: z.ZodOptional; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; accounts: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; configWrites: z.ZodOptional; account: z.ZodOptional; accountUuid: z.ZodOptional; httpUrl: z.ZodOptional; httpHost: z.ZodOptional; httpPort: z.ZodOptional; cliPath: z.ZodOptional; autoStart: z.ZodOptional; startupTimeoutMs: z.ZodOptional; receiveMode: z.ZodOptional, z.ZodLiteral<\"manual\">]>>; ignoreAttachments: z.ZodOptional; ignoreStories: z.ZodOptional; sendReadReceipts: z.ZodOptional; dmPolicy: z.ZodDefault>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; groups: z.ZodOptional; ingest: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; actions: z.ZodOptional; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"SignalConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":1119,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const SlackConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ interactiveReplies: z.ZodOptional; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; appToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userTokenReadOnly: z.ZodDefault>; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; nativeStreaming: z.ZodOptional; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; replyToModeByChatType: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; group: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; channel: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; thread: z.ZodOptional>; inheritParent: z.ZodOptional; initialHistoryLimit: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; messages: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; permissions: z.ZodOptional; memberInfo: z.ZodOptional; channelInfo: z.ZodOptional; emojiList: z.ZodOptional; }, z.core.$strict>>; slashCommand: z.ZodOptional; name: z.ZodOptional; sessionPrefix: z.ZodOptional; ephemeral: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; channels: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; allowBots: z.ZodOptional; users: z.ZodOptional>>; skills: z.ZodOptional>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; typingReaction: z.ZodOptional; mode: z.ZodDefault>>; signingSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodDefault>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; accounts: z.ZodOptional; mode: z.ZodOptional>; signingSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ interactiveReplies: z.ZodOptional; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; configWrites: z.ZodOptional; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; appToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; userTokenReadOnly: z.ZodDefault>; allowBots: z.ZodOptional; dangerouslyAllowNameMatching: z.ZodOptional; requireMention: z.ZodOptional; groupPolicy: z.ZodOptional>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streaming: z.ZodOptional]>>; nativeStreaming: z.ZodOptional; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; reactionNotifications: z.ZodOptional>; reactionAllowlist: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; replyToModeByChatType: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; group: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; channel: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; thread: z.ZodOptional>; inheritParent: z.ZodOptional; initialHistoryLimit: z.ZodOptional; }, z.core.$strict>>; actions: z.ZodOptional; messages: z.ZodOptional; pins: z.ZodOptional; search: z.ZodOptional; permissions: z.ZodOptional; memberInfo: z.ZodOptional; channelInfo: z.ZodOptional; emojiList: z.ZodOptional; }, z.core.$strict>>; slashCommand: z.ZodOptional; name: z.ZodOptional; sessionPrefix: z.ZodOptional; ephemeral: z.ZodOptional; }, z.core.$strict>>; dmPolicy: z.ZodOptional>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional; dm: z.ZodOptional; policy: z.ZodOptional>; allowFrom: z.ZodOptional>>; groupEnabled: z.ZodOptional; groupChannels: z.ZodOptional>>; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; }, z.core.$strict>>; channels: z.ZodOptional; allow: z.ZodOptional; requireMention: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; allowBots: z.ZodOptional; users: z.ZodOptional>>; skills: z.ZodOptional>; systemPrompt: z.ZodOptional; }, z.core.$strict>>>>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; typingReaction: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"SlackConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":984,"sourcePath":"src/config/zod-schema.providers-core.ts"} +{"declaration":"export const TelegramConfigSchema: z.ZodObject<{ name: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; dangerouslyAllowPrivateNetwork: z.ZodOptional; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; accounts: z.ZodOptional; capabilities: z.ZodOptional, z.ZodObject<{ inlineButtons: z.ZodOptional>; }, z.core.$strict>]>>; execApprovals: z.ZodOptional; approvers: z.ZodOptional>>; agentFilter: z.ZodOptional>; sessionFilter: z.ZodOptional>; target: z.ZodOptional>; }, z.core.$strict>>; markdown: z.ZodOptional>; }, z.core.$strict>>; enabled: z.ZodOptional; commands: z.ZodOptional]>>; nativeSkills: z.ZodOptional]>>; }, z.core.$strict>>; customCommands: z.ZodOptional>>; configWrites: z.ZodOptional; dmPolicy: z.ZodDefault>>; botToken: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; tokenFile: z.ZodOptional; replyToMode: z.ZodOptional, z.ZodLiteral<\"first\">, z.ZodLiteral<\"all\">]>>; groups: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; allowFrom: z.ZodOptional>>; defaultTo: z.ZodOptional>; groupAllowFrom: z.ZodOptional>>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; direct: z.ZodOptional>; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; topics: z.ZodOptional; ingest: z.ZodOptional; disableAudioPreflight: z.ZodOptional; groupPolicy: z.ZodOptional>; skills: z.ZodOptional>; enabled: z.ZodOptional; allowFrom: z.ZodOptional>>; systemPrompt: z.ZodOptional; agentId: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; }, z.core.$strict>>>>; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; requireTopic: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; streaming: z.ZodOptional]>>; blockStreaming: z.ZodOptional; draftChunk: z.ZodOptional; maxChars: z.ZodOptional; breakPreference: z.ZodOptional, z.ZodLiteral<\"newline\">, z.ZodLiteral<\"sentence\">]>>; }, z.core.$strict>>; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; streamMode: z.ZodOptional>; mediaMaxMb: z.ZodOptional; timeoutSeconds: z.ZodOptional; retry: z.ZodOptional; minDelayMs: z.ZodOptional; maxDelayMs: z.ZodOptional; jitter: z.ZodOptional; }, z.core.$strict>>; network: z.ZodOptional; dnsResultOrder: z.ZodOptional>; dangerouslyAllowPrivateNetwork: z.ZodOptional; }, z.core.$strict>>; proxy: z.ZodOptional; webhookUrl: z.ZodOptional; webhookSecret: z.ZodOptional; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"file\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>, z.ZodObject<{ source: z.ZodLiteral<\"exec\">; provider: z.ZodString; id: z.ZodString; }, z.core.$strict>], \"source\">]>>; webhookPath: z.ZodOptional; webhookHost: z.ZodOptional; webhookPort: z.ZodOptional; webhookCertPath: z.ZodOptional; actions: z.ZodOptional; sendMessage: z.ZodOptional; poll: z.ZodOptional; deleteMessage: z.ZodOptional; editMessage: z.ZodOptional; sticker: z.ZodOptional; createForumTopic: z.ZodOptional; editForumTopic: z.ZodOptional; }, z.core.$strict>>; threadBindings: z.ZodOptional; idleHours: z.ZodOptional; maxAgeHours: z.ZodOptional; spawnSubagentSessions: z.ZodOptional; spawnAcpSessions: z.ZodOptional; }, z.core.$strict>>; reactionNotifications: z.ZodOptional>; reactionLevel: z.ZodOptional>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; linkPreview: z.ZodOptional; silentErrorReplies: z.ZodOptional; responsePrefix: z.ZodOptional; ackReaction: z.ZodOptional; errorPolicy: z.ZodOptional>; errorCooldownMs: z.ZodOptional; apiRoot: z.ZodOptional; autoTopicLabel: z.ZodOptional; prompt: z.ZodOptional; }, z.core.$strict>]>>; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"TelegramConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":342,"sourcePath":"src/config/zod-schema.providers-core.ts"} {"declaration":"export const ToolPolicySchema: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>;","entrypoint":"channel-config-schema","exportName":"ToolPolicySchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":253,"sourcePath":"src/config/zod-schema.agent-runtime.ts"} {"declaration":"export const WhatsAppConfigSchema: z.ZodObject<{ enabled: z.ZodOptional; capabilities: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; configWrites: z.ZodOptional; sendReadReceipts: z.ZodOptional; messagePrefix: z.ZodOptional; responsePrefix: z.ZodOptional; dmPolicy: z.ZodDefault>>; selfChatMode: z.ZodOptional; allowFrom: z.ZodOptional>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; ackReaction: z.ZodOptional; direct: z.ZodDefault>; group: z.ZodDefault>>; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; debounceMs: z.ZodDefault>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; accounts: z.ZodOptional>; markdown: z.ZodOptional>; }, z.core.$strict>>; configWrites: z.ZodOptional; sendReadReceipts: z.ZodOptional; messagePrefix: z.ZodOptional; responsePrefix: z.ZodOptional; dmPolicy: z.ZodDefault>>; selfChatMode: z.ZodOptional; allowFrom: z.ZodOptional>; defaultTo: z.ZodOptional; groupAllowFrom: z.ZodOptional>; groupPolicy: z.ZodDefault>>; contextVisibility: z.ZodOptional>; historyLimit: z.ZodOptional; dmHistoryLimit: z.ZodOptional; dms: z.ZodOptional; }, z.core.$strict>>>>; textChunkLimit: z.ZodOptional; chunkMode: z.ZodOptional>; blockStreaming: z.ZodOptional; blockStreamingCoalesce: z.ZodOptional; maxChars: z.ZodOptional; idleMs: z.ZodOptional; }, z.core.$strict>>; groups: z.ZodOptional; tools: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>; toolsBySender: z.ZodOptional>; alsoAllow: z.ZodOptional>; deny: z.ZodOptional>; }, z.core.$strict>>>>; }, z.core.$strict>>>>; ackReaction: z.ZodOptional; direct: z.ZodDefault>; group: z.ZodDefault>>; }, z.core.$strict>>; reactionLevel: z.ZodOptional>; debounceMs: z.ZodDefault>; heartbeat: z.ZodOptional; showAlerts: z.ZodOptional; useIndicator: z.ZodOptional; }, z.core.$strict>>; healthMonitor: z.ZodOptional; }, z.core.$strict>>; name: z.ZodOptional; enabled: z.ZodOptional; authDir: z.ZodOptional; mediaMaxMb: z.ZodOptional; }, z.core.$strict>>>>; defaultAccount: z.ZodOptional; mediaMaxMb: z.ZodDefault>; actions: z.ZodOptional; sendMessage: z.ZodOptional; polls: z.ZodOptional; }, z.core.$strict>>; }, z.core.$strict>;","entrypoint":"channel-config-schema","exportName":"WhatsAppConfigSchema","importSpecifier":"openclaw/plugin-sdk/channel-config-schema","kind":"const","recordType":"export","sourceLine":122,"sourcePath":"src/config/zod-schema.providers-whatsapp.ts"} {"category":"channel","entrypoint":"channel-contract","importSpecifier":"openclaw/plugin-sdk/channel-contract","recordType":"module","sourceLine":1,"sourcePath":"src/plugin-sdk/channel-contract.ts"} @@ -160,6 +160,7 @@ {"declaration":"export type ChannelApprovalAdapter = ChannelApprovalAdapter;","entrypoint":"channel-contract","exportName":"ChannelApprovalAdapter","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":597,"sourcePath":"src/channels/plugins/types.adapters.ts"} {"declaration":"export type ChannelApprovalCapability = ChannelApprovalCapability;","entrypoint":"channel-contract","exportName":"ChannelApprovalCapability","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":592,"sourcePath":"src/channels/plugins/types.adapters.ts"} {"declaration":"export type ChannelCommandConversationContext = ChannelCommandConversationContext;","entrypoint":"channel-contract","exportName":"ChannelCommandConversationContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":668,"sourcePath":"src/channels/plugins/types.adapters.ts"} +{"declaration":"export type ChannelDirectoryAdapter = ChannelDirectoryAdapter;","entrypoint":"channel-contract","exportName":"ChannelDirectoryAdapter","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":454,"sourcePath":"src/channels/plugins/types.adapters.ts"} {"declaration":"export type ChannelGroupContext = ChannelGroupContext;","entrypoint":"channel-contract","exportName":"ChannelGroupContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":219,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type ChannelMessageActionAdapter = ChannelMessageActionAdapter;","entrypoint":"channel-contract","exportName":"ChannelMessageActionAdapter","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":556,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type ChannelMessageActionContext = ChannelMessageActionContext;","entrypoint":"channel-contract","exportName":"ChannelMessageActionContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":520,"sourcePath":"src/channels/plugins/types.core.ts"} @@ -171,12 +172,13 @@ {"declaration":"export type ChannelThreadingContext = ChannelThreadingContext;","entrypoint":"channel-contract","exportName":"ChannelThreadingContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":368,"sourcePath":"src/channels/plugins/types.core.ts"} {"declaration":"export type ChannelThreadingToolContext = ChannelThreadingToolContext;","entrypoint":"channel-contract","exportName":"ChannelThreadingToolContext","importSpecifier":"openclaw/plugin-sdk/channel-contract","kind":"type","recordType":"export","sourceLine":382,"sourcePath":"src/channels/plugins/types.core.ts"} {"category":"channel","entrypoint":"channel-pairing","importSpecifier":"openclaw/plugin-sdk/channel-pairing","recordType":"module","sourceLine":1,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} -{"declaration":"export function createChannelPairingChallengeIssuer(params: { channel: ChannelId; upsertPairingRequest: (params: { id: string; meta?: PairingMeta | undefined; }) => Promise<{ code: string; created: boolean; }>; }): (challenge: Omit<...>) => Promise<...>;","entrypoint":"channel-pairing","exportName":"createChannelPairingChallengeIssuer","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":21,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} -{"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","sourceLine":39,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} +{"declaration":"export function createChannelPairingChallengeIssuer(params: { channel: ChannelId; upsertPairingRequest: (params: { id: string; meta?: PairingMeta | undefined; }) => Promise<{ code: string; created: boolean; }>; }): (challenge: Omit<...>) => Promise<...>;","entrypoint":"channel-pairing","exportName":"createChannelPairingChallengeIssuer","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":22,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} +{"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","sourceLine":40,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} {"declaration":"export function createLoggedPairingApprovalNotifier(format: string | ((params: { cfg: OpenClawConfig; id: string; accountId?: string | undefined; runtime?: RuntimeEnv | undefined; }) => string), log?: (message: string) => void): (params: { ...; }) => Promise<...>;","entrypoint":"channel-pairing","exportName":"createLoggedPairingApprovalNotifier","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":12,"sourcePath":"src/channels/plugins/pairing-adapters.ts"} {"declaration":"export function createPairingPrefixStripper(prefixRe: RegExp, map?: (entry: string) => string): (entry: string) => string;","entrypoint":"channel-pairing","exportName":"createPairingPrefixStripper","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":5,"sourcePath":"src/channels/plugins/pairing-adapters.ts"} {"declaration":"export function createTextPairingAdapter(params: { idLabel: string; message: string; normalizeAllowEntry?: ((entry: string) => string) | undefined; notify: (params: { cfg: OpenClawConfig; id: string; accountId?: string | undefined; runtime?: RuntimeEnv | undefined; } & { ...; }) => void | Promise<...>; }): ChannelPairingAdapter;","entrypoint":"channel-pairing","exportName":"createTextPairingAdapter","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":21,"sourcePath":"src/channels/plugins/pairing-adapters.ts"} -{"declaration":"export type ChannelPairingController = ChannelPairingController;","entrypoint":"channel-pairing","exportName":"ChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"type","recordType":"export","sourceLine":14,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} +{"declaration":"export function readChannelAllowFromStoreSync(channel: ChannelId, env?: ProcessEnv, accountId?: string | undefined): string[];","entrypoint":"channel-pairing","exportName":"readChannelAllowFromStoreSync","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"function","recordType":"export","sourceLine":601,"sourcePath":"src/pairing/pairing-store.ts"} +{"declaration":"export type ChannelPairingController = ChannelPairingController;","entrypoint":"channel-pairing","exportName":"ChannelPairingController","importSpecifier":"openclaw/plugin-sdk/channel-pairing","kind":"type","recordType":"export","sourceLine":15,"sourcePath":"src/plugin-sdk/channel-pairing.ts"} {"category":"channel","entrypoint":"channel-reply-pipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","recordType":"module","sourceLine":1,"sourcePath":"src/plugin-sdk/channel-reply-pipeline.ts"} {"declaration":"export function createChannelReplyPipeline(params: { cfg: OpenClawConfig; agentId: string; channel?: string | undefined; accountId?: string | undefined; typing?: CreateTypingCallbacksParams | undefined; typingCallbacks?: TypingCallbacks | undefined; }): ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"createChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"function","recordType":"export","sourceLine":20,"sourcePath":"src/plugin-sdk/channel-reply-pipeline.ts"} {"declaration":"export type ChannelReplyPipeline = ChannelReplyPipeline;","entrypoint":"channel-reply-pipeline","exportName":"ChannelReplyPipeline","importSpecifier":"openclaw/plugin-sdk/channel-reply-pipeline","kind":"type","recordType":"export","sourceLine":16,"sourcePath":"src/plugin-sdk/channel-reply-pipeline.ts"} @@ -190,23 +192,14 @@ {"declaration":"export function createReplyPrefixContext(params: { cfg: OpenClawConfig; agentId: string; channel?: string | undefined; accountId?: string | undefined; }): ReplyPrefixContextBundle;","entrypoint":"channel-runtime","exportName":"createReplyPrefixContext","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":28,"sourcePath":"src/channels/reply-prefix.ts"} {"declaration":"export function createReplyPrefixOptions(params: { cfg: OpenClawConfig; agentId: string; channel?: string | undefined; accountId?: string | undefined; }): ReplyPrefixOptions;","entrypoint":"channel-runtime","exportName":"createReplyPrefixOptions","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":64,"sourcePath":"src/channels/reply-prefix.ts"} {"declaration":"export function createTypingCallbacks(params: CreateTypingCallbacksParams): TypingCallbacks;","entrypoint":"channel-runtime","exportName":"createTypingCallbacks","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":23,"sourcePath":"src/channels/typing.ts"} -{"declaration":"export function createWhatsAppOutboundBase({ chunker, sendMessageWhatsApp, sendPollWhatsApp, shouldLogVerbose, resolveTarget, normalizeText, skipEmptyText, }: CreateWhatsAppOutboundBaseParams): Pick;","entrypoint":"channel-runtime","exportName":"createWhatsAppOutboundBase","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":58,"sourcePath":"src/channels/plugins/whatsapp-shared.ts"} {"declaration":"export function emitHeartbeatEvent(evt: Omit): void;","entrypoint":"channel-runtime","exportName":"emitHeartbeatEvent","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":51,"sourcePath":"src/infra/heartbeat-events.ts"} {"declaration":"export function enqueueSystemEvent(text: string, options: SystemEventOptions): boolean;","entrypoint":"channel-runtime","exportName":"enqueueSystemEvent","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":93,"sourcePath":"src/infra/system-events.ts"} {"declaration":"export function getLastHeartbeatEvent(): HeartbeatEventPayload | null;","entrypoint":"channel-runtime","exportName":"getLastHeartbeatEvent","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":61,"sourcePath":"src/infra/heartbeat-events.ts"} -{"declaration":"export function isWhatsAppGroupJid(value: string): boolean;","entrypoint":"channel-runtime","exportName":"isWhatsAppGroupJid","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":18,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} -{"declaration":"export function isWhatsAppUserTarget(value: string): boolean;","entrypoint":"channel-runtime","exportName":"isWhatsAppUserTarget","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":31,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} {"declaration":"export function keepHttpServerTaskAlive(params: { server: CloseAwareServer; abortSignal?: AbortSignal | undefined; onAbort?: (() => void | Promise) | undefined; }): Promise;","entrypoint":"channel-runtime","exportName":"keepHttpServerTaskAlive","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":71,"sourcePath":"src/plugin-sdk/channel-lifecycle.core.ts"} -{"declaration":"export function looksLikeSignalTargetId(raw: string, normalized?: string | undefined): boolean;","entrypoint":"channel-runtime","exportName":"looksLikeSignalTargetId","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":38,"sourcePath":"src/channels/plugins/normalize/signal.ts"} -{"declaration":"export function looksLikeWhatsAppTargetId(raw: string): boolean;","entrypoint":"channel-runtime","exportName":"looksLikeWhatsAppTargetId","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":88,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} {"declaration":"export function normalizeChannelId(raw?: string | null | undefined): ChannelId | null;","entrypoint":"channel-runtime","exportName":"normalizeChannelId","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":89,"sourcePath":"src/channels/plugins/registry.ts"} {"declaration":"export function normalizeChatType(raw?: string | undefined): ChatType | undefined;","entrypoint":"channel-runtime","exportName":"normalizeChatType","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":3,"sourcePath":"src/channels/chat-type.ts"} {"declaration":"export function normalizePollDurationHours(value: number | undefined, options: { defaultHours: number; maxHours: number; }): number;","entrypoint":"channel-runtime","exportName":"normalizePollDurationHours","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":93,"sourcePath":"src/polls.ts"} {"declaration":"export function normalizePollInput(input: PollInput, options?: NormalizePollOptions): NormalizedPollInput;","entrypoint":"channel-runtime","exportName":"normalizePollInput","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":36,"sourcePath":"src/polls.ts"} -{"declaration":"export function normalizeSignalMessagingTarget(raw: string): string | undefined;","entrypoint":"channel-runtime","exportName":"normalizeSignalMessagingTarget","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":1,"sourcePath":"src/channels/plugins/normalize/signal.ts"} -{"declaration":"export function normalizeWhatsAppAllowFromEntries(allowFrom: (string | number)[]): string[];","entrypoint":"channel-runtime","exportName":"normalizeWhatsAppAllowFromEntries","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":80,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} -{"declaration":"export function normalizeWhatsAppMessagingTarget(raw: string): string | undefined;","entrypoint":"channel-runtime","exportName":"normalizeWhatsAppMessagingTarget","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":72,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} -{"declaration":"export function normalizeWhatsAppTarget(value: string): string | null;","entrypoint":"channel-runtime","exportName":"normalizeWhatsAppTarget","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":48,"sourcePath":"src/channels/plugins/normalize/whatsapp.ts"} {"declaration":"export function onHeartbeatEvent(listener: (evt: HeartbeatEventPayload) => void): () => void;","entrypoint":"channel-runtime","exportName":"onHeartbeatEvent","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":57,"sourcePath":"src/infra/heartbeat-events.ts"} {"declaration":"export function recordChannelActivity(params: { channel: ChannelId; accountId?: string | null | undefined; direction: ChannelDirection; at?: number | undefined; }): void;","entrypoint":"channel-runtime","exportName":"recordChannelActivity","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":26,"sourcePath":"src/infra/channel-activity.ts"} {"declaration":"export function reduceInteractiveReply(interactive: InteractiveReply | undefined, initialState: TState, reduce: (state: TState, block: InteractiveReplyBlock, index: number) => TState): TState;","entrypoint":"channel-runtime","exportName":"reduceInteractiveReply","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":3,"sourcePath":"src/channels/plugins/outbound/interactive.ts"} @@ -215,9 +208,6 @@ {"declaration":"export function resolveHeartbeatVisibility(params: { cfg: OpenClawConfig; channel: GatewayMessageChannel; accountId?: string | undefined; }): ResolvedHeartbeatVisibility;","entrypoint":"channel-runtime","exportName":"resolveHeartbeatVisibility","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":22,"sourcePath":"src/infra/heartbeat-visibility.ts"} {"declaration":"export function resolveIndicatorType(status: \"sent\" | \"ok-empty\" | \"ok-token\" | \"skipped\" | \"failed\"): HeartbeatIndicatorType | undefined;","entrypoint":"channel-runtime","exportName":"resolveIndicatorType","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":23,"sourcePath":"src/infra/heartbeat-events.ts"} {"declaration":"export function resolvePollMaxSelections(optionCount: number, allowMultiselect: boolean | undefined): number;","entrypoint":"channel-runtime","exportName":"resolvePollMaxSelections","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":29,"sourcePath":"src/polls.ts"} -{"declaration":"export function resolveWhatsAppGroupIntroHint(): string;","entrypoint":"channel-runtime","exportName":"resolveWhatsAppGroupIntroHint","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":11,"sourcePath":"src/channels/plugins/whatsapp-shared.ts"} -{"declaration":"export function resolveWhatsAppHeartbeatRecipients(cfg: OpenClawConfig, opts?: HeartbeatRecipientsOpts): HeartbeatRecipientsResult;","entrypoint":"channel-runtime","exportName":"resolveWhatsAppHeartbeatRecipients","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":48,"sourcePath":"src/channels/plugins/whatsapp-heartbeat.ts"} -{"declaration":"export function resolveWhatsAppMentionStripRegexes(ctx: { To?: string | null | undefined; }): RegExp[];","entrypoint":"channel-runtime","exportName":"resolveWhatsAppMentionStripRegexes","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":15,"sourcePath":"src/channels/plugins/whatsapp-shared.ts"} {"declaration":"export function waitForTransportReady(params: WaitForTransportReadyParams): Promise;","entrypoint":"channel-runtime","exportName":"waitForTransportReady","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":21,"sourcePath":"src/infra/transport-ready.ts"} {"declaration":"export function waitUntilAbort(signal?: AbortSignal | undefined, onAbort?: (() => void | Promise) | undefined): Promise;","entrypoint":"channel-runtime","exportName":"waitUntilAbort","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"function","recordType":"export","sourceLine":30,"sourcePath":"src/plugin-sdk/channel-lifecycle.core.ts"} {"declaration":"export const CHANNEL_MESSAGE_ACTION_NAMES: readonly [\"send\", \"broadcast\", \"poll\", \"poll-vote\", \"react\", \"reactions\", \"read\", \"edit\", \"unsend\", \"reply\", \"sendWithEffect\", \"renameGroup\", \"setGroupIcon\", \"addParticipant\", \"removeParticipant\", \"leaveGroup\", \"sendAttachment\", \"delete\", \"pin\", \"unpin\", \"list-pins\", \"permissions\", \"thread-create\", \"thread-list\", \"thread-reply\", \"search\", \"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\", \"timeout\", \"kick\", \"ban\", \"set-profile\", \"set-presence\", \"set-profile\", \"download-file\", \"upload-file\"];","entrypoint":"channel-runtime","exportName":"CHANNEL_MESSAGE_ACTION_NAMES","importSpecifier":"openclaw/plugin-sdk/channel-runtime","kind":"const","recordType":"export","sourceLine":1,"sourcePath":"src/channels/plugins/message-action-names.ts"} diff --git a/extensions/discord/src/monitor.test.ts b/extensions/discord/src/monitor.test.ts index ab0c53d0f77..4e3843f7de4 100644 --- a/extensions/discord/src/monitor.test.ts +++ b/extensions/discord/src/monitor.test.ts @@ -906,7 +906,7 @@ const { enqueueSystemEventSpy, resolveAgentRouteMock } = vi.hoisted(() => ({ })), })); -const channelRuntimeModule = await import("openclaw/plugin-sdk/channel-runtime"); +const channelRuntimeModule = await import("openclaw/plugin-sdk/infra-runtime"); vi.spyOn(channelRuntimeModule, "enqueueSystemEvent").mockImplementation(enqueueSystemEventSpy); const routingModule = await import("openclaw/plugin-sdk/routing"); diff --git a/extensions/discord/src/monitor/agent-components.ts b/extensions/discord/src/monitor/agent-components.ts index d6e68b3d8dc..1411b35928a 100644 --- a/extensions/discord/src/monitor/agent-components.ts +++ b/extensions/discord/src/monitor/agent-components.ts @@ -23,10 +23,10 @@ import { formatInboundEnvelope, resolveEnvelopeFormatOptions, } from "openclaw/plugin-sdk/channel-inbound"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import type { DiscordAccountConfig } from "openclaw/plugin-sdk/config-runtime"; import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/dangerous-name-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/markdown-table-runtime"; import { getAgentScopedMediaLocalRoots } from "openclaw/plugin-sdk/media-runtime"; import { type PluginInteractiveDiscordHandlerContext } from "openclaw/plugin-sdk/plugin-runtime"; diff --git a/extensions/discord/src/monitor/listeners.ts b/extensions/discord/src/monitor/listeners.ts index dbad78a686d..71034741cce 100644 --- a/extensions/discord/src/monitor/listeners.ts +++ b/extensions/discord/src/monitor/listeners.ts @@ -8,8 +8,8 @@ import { ThreadUpdateListener, type User, } from "@buape/carbon"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; import { createSubsystemLogger, diff --git a/extensions/discord/src/monitor/message-handler.preflight.ts b/extensions/discord/src/monitor/message-handler.preflight.ts index c71842e0162..bdf2bf8c6a5 100644 --- a/extensions/discord/src/monitor/message-handler.preflight.ts +++ b/extensions/discord/src/monitor/message-handler.preflight.ts @@ -7,13 +7,13 @@ import { matchesMentionWithExplicit, resolveMentionGatingWithBypass, } from "openclaw/plugin-sdk/channel-inbound"; -import { enqueueSystemEvent, recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth-native"; import { hasControlCommand } from "openclaw/plugin-sdk/command-detection"; import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-surface"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { isDangerousNameMatchingEnabled } from "openclaw/plugin-sdk/config-runtime"; import type { SessionBindingRecord } from "openclaw/plugin-sdk/conversation-runtime"; +import { enqueueSystemEvent, recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { recordPendingHistoryEntryIfEnabled, type HistoryEntry, @@ -289,8 +289,9 @@ export async function preflightDiscordMessage( const pluralkitConfig = params.discordConfig?.pluralkit; const webhookId = resolveDiscordWebhookId(message); const shouldCheckPluralKit = Boolean(pluralkitConfig?.enabled) && !webhookId; - let pluralkitInfo: Awaited> = - null; + let pluralkitInfo: Awaited< + ReturnType + > = null; if (shouldCheckPluralKit) { try { const { fetchPluralKitMessageInfo } = await loadPluralKitRuntime(); diff --git a/extensions/discord/src/monitor/monitor.test.ts b/extensions/discord/src/monitor/monitor.test.ts index de4ae906ae5..b5805f3b472 100644 --- a/extensions/discord/src/monitor/monitor.test.ts +++ b/extensions/discord/src/monitor/monitor.test.ts @@ -65,7 +65,7 @@ const dispatchPluginInteractiveHandlerMock = vi.hoisted(() => vi.fn()); let lastDispatchCtx: Record | undefined; async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { @@ -74,8 +74,8 @@ async function createChannelRuntimeMock( }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); vi.mock("openclaw/plugin-sdk/reply-runtime", async (importOriginal) => { const actual = await importOriginal(); diff --git a/extensions/discord/src/send.components.ts b/extensions/discord/src/send.components.ts index 319f59d8f36..a9f23ec9a44 100644 --- a/extensions/discord/src/send.components.ts +++ b/extensions/discord/src/send.components.ts @@ -5,8 +5,8 @@ import { type RequestClient, } from "@buape/carbon"; import { ChannelType, Routes } from "discord-api-types/v10"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { resolveDiscordAccount } from "./accounts.js"; import { registerDiscordComponentEntries } from "./components-registry.js"; import { diff --git a/extensions/discord/src/send.outbound.ts b/extensions/discord/src/send.outbound.ts index 626ee6b11fb..44520e112dc 100644 --- a/extensions/discord/src/send.outbound.ts +++ b/extensions/discord/src/send.outbound.ts @@ -3,9 +3,9 @@ import fs from "node:fs/promises"; import path from "node:path"; import { serializePayload, type MessagePayloadObject, type RequestClient } from "@buape/carbon"; import { ChannelType, Routes } from "discord-api-types/v10"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/config-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { maxBytesForKind } from "openclaw/plugin-sdk/media-runtime"; import { extensionForMime } from "openclaw/plugin-sdk/media-runtime"; import { unlinkIfExists } from "openclaw/plugin-sdk/media-runtime"; diff --git a/extensions/imessage/src/monitor/monitor-provider.ts b/extensions/imessage/src/monitor/monitor-provider.ts index 770a662b00d..62bf8550698 100644 --- a/extensions/imessage/src/monitor/monitor-provider.ts +++ b/extensions/imessage/src/monitor/monitor-provider.ts @@ -6,7 +6,6 @@ import { } from "openclaw/plugin-sdk/channel-inbound"; import { createChannelPairingChallengeIssuer } from "openclaw/plugin-sdk/channel-pairing"; import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline"; -import { waitForTransportReady } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { resolveOpenProviderRuntimeGroupPolicy, @@ -20,6 +19,7 @@ import { } from "openclaw/plugin-sdk/conversation-runtime"; import { recordInboundSession } from "openclaw/plugin-sdk/conversation-runtime"; import { normalizeScpRemoteHost } from "openclaw/plugin-sdk/host-runtime"; +import { waitForTransportReady } from "openclaw/plugin-sdk/infra-runtime"; import { isInboundPathAllowed, resolveIMessageAttachmentRoots, diff --git a/extensions/line/src/bot-message-context.ts b/extensions/line/src/bot-message-context.ts index 69b5f82c577..af0b1499965 100644 --- a/extensions/line/src/bot-message-context.ts +++ b/extensions/line/src/bot-message-context.ts @@ -5,7 +5,6 @@ import { resolveInboundSessionEnvelopeContext, toLocationContext, } from "openclaw/plugin-sdk/channel-inbound"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import { ensureConfiguredBindingRouteReady, @@ -14,8 +13,9 @@ import { resolvePinnedMainDmOwnerFromAllowlist, resolveConfiguredBindingRoute, } from "openclaw/plugin-sdk/conversation-runtime"; -import type { HistoryEntry } from "openclaw/plugin-sdk/reply-history"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { finalizeInboundContext } from "openclaw/plugin-sdk/reply-dispatch-runtime"; +import type { HistoryEntry } from "openclaw/plugin-sdk/reply-history"; import { deriveLastRoutePolicy, resolveAgentIdFromSessionKey, diff --git a/extensions/line/src/send.test.ts b/extensions/line/src/send.test.ts index 0a629777a27..26e003f95aa 100644 --- a/extensions/line/src/send.test.ts +++ b/extensions/line/src/send.test.ts @@ -59,7 +59,7 @@ vi.mock("./channel-access-token.js", () => ({ resolveLineChannelAccessToken: resolveLineChannelAccessTokenMock, })); -vi.mock("openclaw/plugin-sdk/channel-runtime", () => ({ +vi.mock("openclaw/plugin-sdk/infra-runtime", () => ({ recordChannelActivity: recordChannelActivityMock, })); diff --git a/extensions/line/src/send.ts b/extensions/line/src/send.ts index 1ab76e32f51..c30b7662cf5 100644 --- a/extensions/line/src/send.ts +++ b/extensions/line/src/send.ts @@ -1,6 +1,6 @@ import { messagingApi } from "@line/bot-sdk"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig, type OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { logVerbose } from "openclaw/plugin-sdk/runtime-env"; import { resolveLineAccount } from "./accounts.js"; import { resolveLineChannelAccessToken } from "./channel-access-token.js"; diff --git a/extensions/signal/src/monitor.tool-result.test-harness.ts b/extensions/signal/src/monitor.tool-result.test-harness.ts index 31a15987b2e..d2330bd69b7 100644 --- a/extensions/signal/src/monitor.tool-result.test-harness.ts +++ b/extensions/signal/src/monitor.tool-result.test-harness.ts @@ -179,9 +179,9 @@ vi.mock("./daemon.js", async () => { }; }); -vi.mock("openclaw/plugin-sdk/channel-runtime", async () => { - const actual = await vi.importActual( - "openclaw/plugin-sdk/channel-runtime", +vi.mock("openclaw/plugin-sdk/infra-runtime", async () => { + const actual = await vi.importActual( + "openclaw/plugin-sdk/infra-runtime", ); return { ...actual, @@ -197,7 +197,7 @@ export function installSignalToolResultTestHooks() { beforeEach(async () => { const [{ resetInboundDedupe }, { resetSystemEventsForTest }] = await Promise.all([ import("openclaw/plugin-sdk/reply-runtime"), - import("openclaw/plugin-sdk/channel-runtime"), + import("openclaw/plugin-sdk/infra-runtime"), ]); resetInboundDedupe(); config = { diff --git a/extensions/signal/src/monitor.ts b/extensions/signal/src/monitor.ts index a815b0374ae..826499497d2 100644 --- a/extensions/signal/src/monitor.ts +++ b/extensions/signal/src/monitor.ts @@ -1,4 +1,3 @@ -import { waitForTransportReady } from "openclaw/plugin-sdk/channel-runtime"; import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; import type { SignalReactionNotificationMode } from "openclaw/plugin-sdk/config-runtime"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; @@ -7,6 +6,7 @@ import { resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce, } from "openclaw/plugin-sdk/config-runtime"; +import { waitForTransportReady } from "openclaw/plugin-sdk/infra-runtime"; import { saveMediaBuffer } from "openclaw/plugin-sdk/media-runtime"; import { DEFAULT_GROUP_HISTORY_LIMIT, type HistoryEntry } from "openclaw/plugin-sdk/reply-history"; import { diff --git a/extensions/signal/src/monitor/event-handler.ts b/extensions/signal/src/monitor/event-handler.ts index 13c125411e8..612c4896fd3 100644 --- a/extensions/signal/src/monitor/event-handler.ts +++ b/extensions/signal/src/monitor/event-handler.ts @@ -14,7 +14,6 @@ import { resolveMentionGatingWithBypass, } from "openclaw/plugin-sdk/channel-inbound"; import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth"; import { hasControlCommand } from "openclaw/plugin-sdk/command-auth"; import { @@ -29,6 +28,7 @@ import { toInternalMessageReceivedContext, triggerInternalHook, } from "openclaw/plugin-sdk/hook-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { kindFromMime } from "openclaw/plugin-sdk/media-runtime"; import { buildPendingHistoryContextFromMap, diff --git a/extensions/slack/src/monitor/events/channels.test.ts b/extensions/slack/src/monitor/events/channels.test.ts index 2f3ddfeea22..ef3e1a41a6f 100644 --- a/extensions/slack/src/monitor/events/channels.test.ts +++ b/extensions/slack/src/monitor/events/channels.test.ts @@ -5,7 +5,7 @@ let registerSlackChannelEvents: typeof import("./channels.js").registerSlackChan let createSlackSystemEventTestHarness: typeof import("./system-event-test-harness.js").createSlackSystemEventTestHarness; async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { @@ -14,8 +14,8 @@ async function createChannelRuntimeMock( }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); type SlackChannelHandler = (args: { event: Record; diff --git a/extensions/slack/src/monitor/events/channels.ts b/extensions/slack/src/monitor/events/channels.ts index 9c0b4c1862d..e4ceb166ada 100644 --- a/extensions/slack/src/monitor/events/channels.ts +++ b/extensions/slack/src/monitor/events/channels.ts @@ -1,7 +1,7 @@ import type { SlackEventMiddlewareArgs } from "@slack/bolt"; import { resolveChannelConfigWrites } from "openclaw/plugin-sdk/channel-config-writes"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig, writeConfigFile } from "openclaw/plugin-sdk/config-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { danger, warn } from "openclaw/plugin-sdk/runtime-env"; import { migrateSlackChannelConfig } from "../../channel-migration.js"; import { resolveSlackChannelLabel } from "../channel-config.js"; diff --git a/extensions/slack/src/monitor/events/interactions.block-actions.ts b/extensions/slack/src/monitor/events/interactions.block-actions.ts index e84371bc9c2..bf069043b8e 100644 --- a/extensions/slack/src/monitor/events/interactions.block-actions.ts +++ b/extensions/slack/src/monitor/events/interactions.block-actions.ts @@ -1,11 +1,11 @@ import type { SlackActionMiddlewareArgs } from "@slack/bolt"; import type { Block, KnownBlock } from "@slack/web-api"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { buildPluginBindingResolvedText, parsePluginBindingApprovalCustomId, resolvePluginConversationBindingApproval, } from "openclaw/plugin-sdk/conversation-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { dispatchPluginInteractiveHandler } from "openclaw/plugin-sdk/plugin-runtime"; import { SLACK_REPLY_BUTTON_ACTION_ID, SLACK_REPLY_SELECT_ACTION_ID } from "../../blocks-render.js"; import { authorizeSlackSystemEventSender } from "../auth.js"; diff --git a/extensions/slack/src/monitor/events/interactions.modal.ts b/extensions/slack/src/monitor/events/interactions.modal.ts index 20c4166d7d8..14f7a0af0cd 100644 --- a/extensions/slack/src/monitor/events/interactions.modal.ts +++ b/extensions/slack/src/monitor/events/interactions.modal.ts @@ -1,4 +1,4 @@ -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { parseSlackModalPrivateMetadata } from "../../modal-metadata.js"; import { authorizeSlackSystemEventSender } from "../auth.js"; import type { SlackMonitorContext } from "../context.js"; diff --git a/extensions/slack/src/monitor/events/interactions.test.ts b/extensions/slack/src/monitor/events/interactions.test.ts index 5cb4f43ce2a..1b3a2b4074d 100644 --- a/extensions/slack/src/monitor/events/interactions.test.ts +++ b/extensions/slack/src/monitor/events/interactions.test.ts @@ -166,7 +166,7 @@ function createContext(overrides?: { describe("registerSlackInteractionEvents", () => { beforeAll(async () => { - const channelRuntime = await import("openclaw/plugin-sdk/channel-runtime"); + const channelRuntime = await import("openclaw/plugin-sdk/infra-runtime"); const pluginRuntime = await import("openclaw/plugin-sdk/plugin-runtime"); const conversationBinding = await import("../../../../../src/plugins/conversation-binding.js"); enqueueSystemEventSpy = vi diff --git a/extensions/slack/src/monitor/events/members.test.ts b/extensions/slack/src/monitor/events/members.test.ts index 4dd59d7b4da..d054158fc9a 100644 --- a/extensions/slack/src/monitor/events/members.test.ts +++ b/extensions/slack/src/monitor/events/members.test.ts @@ -8,14 +8,14 @@ let initSlackHarness: typeof import("./system-event-test-harness.js").createSlac type MemberOverrides = import("./system-event-test-harness.js").SlackSystemEventTestOverrides; async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { ...actual, enqueueSystemEvent: memberMocks.enqueue }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); type MemberHandler = (args: { event: Record; body: unknown }) => Promise; diff --git a/extensions/slack/src/monitor/events/members.ts b/extensions/slack/src/monitor/events/members.ts index b5969803a49..26d02f11613 100644 --- a/extensions/slack/src/monitor/events/members.ts +++ b/extensions/slack/src/monitor/events/members.ts @@ -1,5 +1,5 @@ import type { SlackEventMiddlewareArgs } from "@slack/bolt"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { danger } from "openclaw/plugin-sdk/runtime-env"; import type { SlackMonitorContext } from "../context.js"; import type { SlackMemberChannelEvent } from "../types.js"; diff --git a/extensions/slack/src/monitor/events/messages.test.ts b/extensions/slack/src/monitor/events/messages.test.ts index 733bc891169..949fd1db5d8 100644 --- a/extensions/slack/src/monitor/events/messages.test.ts +++ b/extensions/slack/src/monitor/events/messages.test.ts @@ -8,7 +8,7 @@ const messageQueueMock = vi.fn(); const messageAllowMock = vi.fn(); async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { @@ -17,8 +17,8 @@ async function createChannelRuntimeMock( }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); vi.mock("openclaw/plugin-sdk/conversation-runtime", async (importOriginal) => { const actual = await importOriginal(); diff --git a/extensions/slack/src/monitor/events/messages.ts b/extensions/slack/src/monitor/events/messages.ts index eb7313a1af6..309308caa57 100644 --- a/extensions/slack/src/monitor/events/messages.ts +++ b/extensions/slack/src/monitor/events/messages.ts @@ -1,5 +1,5 @@ import type { SlackEventMiddlewareArgs } from "@slack/bolt"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { danger } from "openclaw/plugin-sdk/runtime-env"; import type { SlackAppMentionEvent, SlackMessageEvent } from "../../types.js"; import { normalizeSlackChannelType } from "../channel-type.js"; diff --git a/extensions/slack/src/monitor/events/pins.test.ts b/extensions/slack/src/monitor/events/pins.test.ts index 63c0907bfee..8a5b6ca884c 100644 --- a/extensions/slack/src/monitor/events/pins.test.ts +++ b/extensions/slack/src/monitor/events/pins.test.ts @@ -6,14 +6,14 @@ let buildPinHarness: typeof import("./system-event-test-harness.js").createSlack type PinOverrides = import("./system-event-test-harness.js").SlackSystemEventTestOverrides; async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { ...actual, enqueueSystemEvent: pinEnqueueMock }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); type PinHandler = (args: { event: Record; body: unknown }) => Promise; diff --git a/extensions/slack/src/monitor/events/pins.ts b/extensions/slack/src/monitor/events/pins.ts index bcb5a2e447a..ba95f515810 100644 --- a/extensions/slack/src/monitor/events/pins.ts +++ b/extensions/slack/src/monitor/events/pins.ts @@ -1,5 +1,5 @@ import type { SlackEventMiddlewareArgs } from "@slack/bolt"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { danger } from "openclaw/plugin-sdk/runtime-env"; import type { SlackMonitorContext } from "../context.js"; import type { SlackPinEvent } from "../types.js"; diff --git a/extensions/slack/src/monitor/events/reactions.test.ts b/extensions/slack/src/monitor/events/reactions.test.ts index 585950de324..c4f6bdde025 100644 --- a/extensions/slack/src/monitor/events/reactions.test.ts +++ b/extensions/slack/src/monitor/events/reactions.test.ts @@ -7,7 +7,7 @@ type SlackSystemEventTestOverrides = import("./system-event-test-harness.js").SlackSystemEventTestOverrides; async function createChannelRuntimeMock( - importOriginal: () => Promise, + importOriginal: () => Promise, ) { const actual = await importOriginal(); return { @@ -16,8 +16,8 @@ async function createChannelRuntimeMock( }; } -vi.mock("openclaw/plugin-sdk/channel-runtime", createChannelRuntimeMock); -vi.mock("openclaw/plugin-sdk/channel-runtime.js", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime", createChannelRuntimeMock); +vi.mock("openclaw/plugin-sdk/infra-runtime.js", createChannelRuntimeMock); type ReactionHandler = (args: { event: Record; body: unknown }) => Promise; diff --git a/extensions/slack/src/monitor/events/reactions.ts b/extensions/slack/src/monitor/events/reactions.ts index b21089577e6..f439168dfde 100644 --- a/extensions/slack/src/monitor/events/reactions.ts +++ b/extensions/slack/src/monitor/events/reactions.ts @@ -1,5 +1,5 @@ import type { SlackEventMiddlewareArgs } from "@slack/bolt"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { danger } from "openclaw/plugin-sdk/runtime-env"; import type { SlackMonitorContext } from "../context.js"; import type { SlackReactionEvent } from "../types.js"; diff --git a/extensions/slack/src/monitor/message-handler/prepare.ts b/extensions/slack/src/monitor/message-handler/prepare.ts index 2d329c446e0..620ea57b1c6 100644 --- a/extensions/slack/src/monitor/message-handler/prepare.ts +++ b/extensions/slack/src/monitor/message-handler/prepare.ts @@ -11,7 +11,6 @@ import { resolveEnvelopeFormatOptions, resolveMentionGatingWithBypass, } from "openclaw/plugin-sdk/channel-inbound"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { resolveControlCommandGate } from "openclaw/plugin-sdk/command-auth"; import { hasControlCommand } from "openclaw/plugin-sdk/command-auth"; import { shouldHandleTextCommands } from "openclaw/plugin-sdk/command-auth"; @@ -24,6 +23,7 @@ import { recordInboundSession, resolveConversationLabel, } from "openclaw/plugin-sdk/conversation-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { buildPendingHistoryContextFromMap, recordPendingHistoryEntryIfEnabled, diff --git a/extensions/speech-core/src/tts.ts b/extensions/speech-core/src/tts.ts index 047c2823754..83f8723ed84 100644 --- a/extensions/speech-core/src/tts.ts +++ b/extensions/speech-core/src/tts.ts @@ -9,7 +9,7 @@ import { unlinkSync, } from "node:fs"; import path from "node:path"; -import { normalizeChannelId, type ChannelId } from "openclaw/plugin-sdk/channel-runtime"; +import { normalizeChannelId, type ChannelId } from "openclaw/plugin-sdk/channel-targets"; import type { OpenClawConfig, TtsAutoMode, diff --git a/extensions/telegram/src/bot-deps.ts b/extensions/telegram/src/bot-deps.ts index b40cf2ebace..111522c4e93 100644 --- a/extensions/telegram/src/bot-deps.ts +++ b/extensions/telegram/src/bot-deps.ts @@ -1,9 +1,9 @@ import { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig, resolveStorePath } from "openclaw/plugin-sdk/config-runtime"; import { loadSessionStore } from "openclaw/plugin-sdk/config-runtime"; import { readChannelAllowFromStore } from "openclaw/plugin-sdk/conversation-runtime"; import { upsertChannelPairingRequest } from "openclaw/plugin-sdk/conversation-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { buildModelsProviderData } from "openclaw/plugin-sdk/models-provider-runtime"; import { dispatchReplyWithBufferedBlockDispatcher } from "openclaw/plugin-sdk/reply-dispatch-runtime"; import { listSkillCommandsForAgents } from "openclaw/plugin-sdk/skill-commands-runtime"; diff --git a/extensions/telegram/src/bot-message-context.runtime.ts b/extensions/telegram/src/bot-message-context.runtime.ts index 836ace5b6f5..264b37b308f 100644 --- a/extensions/telegram/src/bot-message-context.runtime.ts +++ b/extensions/telegram/src/bot-message-context.runtime.ts @@ -1,4 +1,4 @@ export { createStatusReactionController } from "openclaw/plugin-sdk/channel-feedback"; -export { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; +export { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; export { loadConfig } from "openclaw/plugin-sdk/config-runtime"; export { ensureConfiguredBindingRouteReady } from "openclaw/plugin-sdk/conversation-runtime"; diff --git a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts index ad6400912eb..375fdb3ad7b 100644 --- a/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts +++ b/extensions/telegram/src/bot.create-telegram-bot.test-harness.ts @@ -296,8 +296,8 @@ const execApprovalHoisted = vi.hoisted(() => ({ })); export const resolveExecApprovalSpy = execApprovalHoisted.resolveExecApprovalSpy; -vi.doMock("openclaw/plugin-sdk/channel-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.doMock("openclaw/plugin-sdk/infra-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, enqueueSystemEvent: systemEventsHoisted.enqueueSystemEventSpy, diff --git a/extensions/telegram/src/send.ts b/extensions/telegram/src/send.ts index ffc2f3059ae..6ac0fad363f 100644 --- a/extensions/telegram/src/send.ts +++ b/extensions/telegram/src/send.ts @@ -6,11 +6,11 @@ import type { } from "@grammyjs/types"; import { type ApiClientOptions, Bot, HttpError } from "grammy"; import * as grammy from "grammy"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { resolveMarkdownTableMode } from "openclaw/plugin-sdk/config-runtime"; import { isDiagnosticFlagEnabled } from "openclaw/plugin-sdk/diagnostic-runtime"; import { formatUncaughtError } from "openclaw/plugin-sdk/error-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import type { MediaKind } from "openclaw/plugin-sdk/media-runtime"; import { buildOutboundMediaLoadOptions } from "openclaw/plugin-sdk/media-runtime"; import { getImageMetadata } from "openclaw/plugin-sdk/media-runtime"; diff --git a/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts b/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts index e75abfabb39..499625e483e 100644 --- a/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts +++ b/extensions/whatsapp/src/auto-reply/heartbeat-runner.test.ts @@ -37,7 +37,7 @@ vi.mock("openclaw/plugin-sdk/reply-runtime", async (importOriginal) => { }; }); -vi.mock("../../../../src/channels/plugins/whatsapp-heartbeat.js", () => ({ +vi.mock("../heartbeat-recipients.js", () => ({ resolveWhatsAppHeartbeatRecipients: () => [], })); @@ -49,8 +49,8 @@ vi.mock("openclaw/plugin-sdk/routing", async (importOriginal) => { }; }); -vi.mock("openclaw/plugin-sdk/channel-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/infra-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, resolveHeartbeatVisibility: () => state.visibility, diff --git a/extensions/whatsapp/src/auto-reply/heartbeat-runner.ts b/extensions/whatsapp/src/auto-reply/heartbeat-runner.ts index a8592c9c1bd..3a99ff5dc14 100644 --- a/extensions/whatsapp/src/auto-reply/heartbeat-runner.ts +++ b/extensions/whatsapp/src/auto-reply/heartbeat-runner.ts @@ -1,9 +1,4 @@ import { appendCronStyleCurrentTimeLine } from "openclaw/plugin-sdk/agent-runtime"; -import { - emitHeartbeatEvent, - resolveHeartbeatVisibility, - resolveIndicatorType, -} from "openclaw/plugin-sdk/channel-runtime"; import { canonicalizeMainSessionAlias, loadConfig } from "openclaw/plugin-sdk/config-runtime"; import { loadSessionStore, @@ -11,6 +6,11 @@ import { resolveStorePath, updateSessionStore, } from "openclaw/plugin-sdk/config-runtime"; +import { + emitHeartbeatEvent, + resolveHeartbeatVisibility, + resolveIndicatorType, +} from "openclaw/plugin-sdk/infra-runtime"; import { hasOutboundReplyContent, resolveSendableOutboundReplyParts, diff --git a/extensions/whatsapp/src/auto-reply/monitor.ts b/extensions/whatsapp/src/auto-reply/monitor.ts index 0c7daf48ec3..c9232e2a237 100644 --- a/extensions/whatsapp/src/auto-reply/monitor.ts +++ b/extensions/whatsapp/src/auto-reply/monitor.ts @@ -1,9 +1,9 @@ import { resolveInboundDebounceMs } from "openclaw/plugin-sdk/channel-inbound"; -import { enqueueSystemEvent } from "openclaw/plugin-sdk/channel-runtime"; import { formatCliCommand } from "openclaw/plugin-sdk/cli-runtime"; import { waitForever } from "openclaw/plugin-sdk/cli-runtime"; import { hasControlCommand } from "openclaw/plugin-sdk/command-detection"; import { loadConfig } from "openclaw/plugin-sdk/config-runtime"; +import { enqueueSystemEvent } from "openclaw/plugin-sdk/infra-runtime"; import { DEFAULT_GROUP_HISTORY_LIMIT } from "openclaw/plugin-sdk/reply-history"; import { getReplyFromConfig } from "openclaw/plugin-sdk/reply-runtime"; import { resolveAgentRoute } from "openclaw/plugin-sdk/routing"; diff --git a/extensions/whatsapp/src/group-intro.ts b/extensions/whatsapp/src/group-intro.ts new file mode 100644 index 00000000000..ad382320180 --- /dev/null +++ b/extensions/whatsapp/src/group-intro.ts @@ -0,0 +1,15 @@ +export const WHATSAPP_GROUP_INTRO_HINT = + "WhatsApp IDs: SenderId is the participant JID (group participant id)."; + +export function resolveWhatsAppGroupIntroHint(): string { + return WHATSAPP_GROUP_INTRO_HINT; +} + +export function resolveWhatsAppMentionStripRegexes(ctx: { To?: string | null }): RegExp[] { + const selfE164 = (ctx.To ?? "").replace(/^whatsapp:/i, ""); + if (!selfE164) { + return []; + } + const escaped = selfE164.replace(/[.*+?^${}()|[\]\\]/g, "\\$&"); + return [new RegExp(escaped, "g"), new RegExp(`@${escaped}`, "g")]; +} diff --git a/extensions/whatsapp/src/heartbeat-recipients.test.ts b/extensions/whatsapp/src/heartbeat-recipients.test.ts index a203286dfba..7f7c07320ac 100644 --- a/extensions/whatsapp/src/heartbeat-recipients.test.ts +++ b/extensions/whatsapp/src/heartbeat-recipients.test.ts @@ -43,15 +43,31 @@ describe("resolveWhatsAppHeartbeatRecipients", () => { vi.resetModules(); loadSessionStoreMock.mockReset(); readChannelAllowFromStoreSyncMock.mockReset(); - vi.doMock("../../../src/config/sessions/store-summary.js", () => ({ - loadSessionStoreSummary: loadSessionStoreMock, - })); - vi.doMock("../../../src/config/sessions/paths.js", () => ({ - resolveStorePath: vi.fn(() => "/tmp/test-sessions.json"), - })); - vi.doMock("../../../src/pairing/pairing-store.js", () => ({ - readChannelAllowFromStoreSync: readChannelAllowFromStoreSyncMock, - })); + vi.doMock("openclaw/plugin-sdk/config-runtime", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + loadSessionStore: loadSessionStoreMock, + resolveStorePath: vi.fn(() => "/tmp/test-sessions.json"), + }; + }); + vi.doMock("openclaw/plugin-sdk/channel-pairing", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + readChannelAllowFromStoreSync: readChannelAllowFromStoreSyncMock, + }; + }); + vi.doMock("openclaw/plugin-sdk/channel-targets", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + normalizeChannelId: (value?: string | null) => { + const trimmed = value?.trim().toLowerCase(); + return trimmed ? (trimmed as "whatsapp") : null; + }, + }; + }); ({ resolveWhatsAppHeartbeatRecipients } = await import("./runtime-api.js")); setAllowFromStore([]); }); diff --git a/extensions/whatsapp/src/heartbeat-recipients.ts b/extensions/whatsapp/src/heartbeat-recipients.ts new file mode 100644 index 00000000000..fb295037c24 --- /dev/null +++ b/extensions/whatsapp/src/heartbeat-recipients.ts @@ -0,0 +1,100 @@ +import { DEFAULT_ACCOUNT_ID } from "openclaw/plugin-sdk/account-id"; +import { normalizeE164 } from "openclaw/plugin-sdk/account-resolution"; +import { readChannelAllowFromStoreSync } from "openclaw/plugin-sdk/channel-pairing"; +import { normalizeChannelId } from "openclaw/plugin-sdk/channel-targets"; +import { + loadSessionStore, + resolveStorePath, + type OpenClawConfig, +} from "openclaw/plugin-sdk/config-runtime"; + +type HeartbeatRecipientsResult = { recipients: string[]; source: string }; +type HeartbeatRecipientsOpts = { to?: string; all?: boolean }; + +function getSessionRecipients(cfg: OpenClawConfig) { + const sessionCfg = cfg.session; + const scope = sessionCfg?.scope ?? "per-sender"; + if (scope === "global") { + return []; + } + const storePath = resolveStorePath(cfg.session?.store); + const store = loadSessionStore(storePath); + const isGroupKey = (key: string) => + key.includes(":group:") || key.includes(":channel:") || key.includes("@g.us"); + const isCronKey = (key: string) => key.startsWith("cron:"); + + const recipients = Object.entries(store) + .filter(([key]) => key !== "global" && key !== "unknown") + .filter(([key]) => !isGroupKey(key) && !isCronKey(key)) + .map(([_, entry]) => ({ + to: + normalizeChannelId(entry?.lastChannel) === "whatsapp" && entry?.lastTo + ? normalizeE164(entry.lastTo) + : "", + updatedAt: entry?.updatedAt ?? 0, + })) + .filter(({ to }) => to.length > 1) + .toSorted((a, b) => b.updatedAt - a.updatedAt); + + const seen = new Set(); + return recipients.filter((recipient) => { + if (seen.has(recipient.to)) { + return false; + } + seen.add(recipient.to); + return true; + }); +} + +export function resolveWhatsAppHeartbeatRecipients( + cfg: OpenClawConfig, + opts: HeartbeatRecipientsOpts = {}, +): HeartbeatRecipientsResult { + if (opts.to) { + return { recipients: [normalizeE164(opts.to)], source: "flag" }; + } + + const sessionRecipients = getSessionRecipients(cfg); + const configuredAllowFrom = + Array.isArray(cfg.channels?.whatsapp?.allowFrom) && cfg.channels.whatsapp.allowFrom.length > 0 + ? cfg.channels.whatsapp.allowFrom.filter((value) => value !== "*").map(normalizeE164) + : []; + const storeAllowFrom = readChannelAllowFromStoreSync( + "whatsapp", + process.env, + DEFAULT_ACCOUNT_ID, + ).map(normalizeE164); + + const unique = (list: string[]) => [...new Set(list.filter(Boolean))]; + const allowFrom = unique([...configuredAllowFrom, ...storeAllowFrom]); + + if (opts.all) { + return { + recipients: unique([...sessionRecipients.map((entry) => entry.to), ...allowFrom]), + source: "all", + }; + } + + if (allowFrom.length > 0) { + const allowSet = new Set(allowFrom); + const authorizedSessionRecipients = sessionRecipients + .map((entry) => entry.to) + .filter((recipient) => allowSet.has(recipient)); + if (authorizedSessionRecipients.length === 1) { + return { recipients: [authorizedSessionRecipients[0]], source: "session-single" }; + } + if (authorizedSessionRecipients.length > 1) { + return { recipients: authorizedSessionRecipients, source: "session-ambiguous" }; + } + return { recipients: allowFrom, source: "allowFrom" }; + } + + if (sessionRecipients.length === 1) { + return { recipients: [sessionRecipients[0].to], source: "session-single" }; + } + if (sessionRecipients.length > 1) { + return { recipients: sessionRecipients.map((entry) => entry.to), source: "session-ambiguous" }; + } + + return { recipients: allowFrom, source: "allowFrom" }; +} diff --git a/extensions/whatsapp/src/inbound/monitor.ts b/extensions/whatsapp/src/inbound/monitor.ts index 05c4155b3fa..8e92decf3e3 100644 --- a/extensions/whatsapp/src/inbound/monitor.ts +++ b/extensions/whatsapp/src/inbound/monitor.ts @@ -1,7 +1,7 @@ import type { AnyMessageContent, proto, WAMessage } from "@whiskeysockets/baileys"; import { DisconnectReason, isJidGroup } from "@whiskeysockets/baileys"; import { createInboundDebouncer, formatLocationText } from "openclaw/plugin-sdk/channel-inbound"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { saveMediaBuffer } from "openclaw/plugin-sdk/media-runtime"; import { logVerbose, shouldLogVerbose } from "openclaw/plugin-sdk/runtime-env"; import { createSubsystemLogger } from "openclaw/plugin-sdk/runtime-env"; diff --git a/extensions/whatsapp/src/inbound/send-api.test.ts b/extensions/whatsapp/src/inbound/send-api.test.ts index 92ca1009d5c..756ea8e9a66 100644 --- a/extensions/whatsapp/src/inbound/send-api.test.ts +++ b/extensions/whatsapp/src/inbound/send-api.test.ts @@ -3,8 +3,8 @@ import { beforeEach, describe, expect, it, vi } from "vitest"; const recordChannelActivity = vi.hoisted(() => vi.fn()); let createWebSendApi: typeof import("./send-api.js").createWebSendApi; -vi.mock("openclaw/plugin-sdk/channel-runtime", async (importOriginal) => { - const actual = await importOriginal(); +vi.mock("openclaw/plugin-sdk/infra-runtime", async (importOriginal) => { + const actual = await importOriginal(); return { ...actual, recordChannelActivity: (...args: unknown[]) => recordChannelActivity(...args), diff --git a/extensions/whatsapp/src/inbound/send-api.ts b/extensions/whatsapp/src/inbound/send-api.ts index 3c5d91c8069..8941e56ba7d 100644 --- a/extensions/whatsapp/src/inbound/send-api.ts +++ b/extensions/whatsapp/src/inbound/send-api.ts @@ -1,5 +1,5 @@ import type { AnyMessageContent, WAPresence } from "@whiskeysockets/baileys"; -import { recordChannelActivity } from "openclaw/plugin-sdk/channel-runtime"; +import { recordChannelActivity } from "openclaw/plugin-sdk/infra-runtime"; import { toWhatsappJid } from "openclaw/plugin-sdk/text-runtime"; import type { ActiveWebSendOptions } from "../active-listener.js"; diff --git a/extensions/whatsapp/src/normalize-target.ts b/extensions/whatsapp/src/normalize-target.ts index 8f1899b86af..2bc2a77b8b7 100644 --- a/extensions/whatsapp/src/normalize-target.ts +++ b/extensions/whatsapp/src/normalize-target.ts @@ -67,3 +67,32 @@ export function normalizeWhatsAppTarget(value: string): string | null { const normalized = normalizeE164(candidate); return normalized.length > 1 ? normalized : null; } + +export function normalizeWhatsAppMessagingTarget(raw: string): string | undefined { + const trimmed = raw.trim(); + if (!trimmed) { + return undefined; + } + return normalizeWhatsAppTarget(trimmed) ?? undefined; +} + +export function normalizeWhatsAppAllowFromEntries(allowFrom: Array): string[] { + return allowFrom + .map((entry) => String(entry).trim()) + .filter((entry): entry is string => Boolean(entry)) + .map((entry) => (entry === "*" ? entry : normalizeWhatsAppTarget(entry))) + .filter((entry): entry is string => Boolean(entry)); +} + +export function looksLikeWhatsAppTargetId(raw: string): boolean { + const trimmed = raw.trim(); + if (!trimmed) { + return false; + } + return ( + /^whatsapp:/i.test(trimmed) || + isWhatsAppGroupJid(trimmed) || + isWhatsAppUserTarget(trimmed) || + normalizeWhatsAppTarget(trimmed) !== null + ); +} diff --git a/extensions/whatsapp/src/normalize.ts b/extensions/whatsapp/src/normalize.ts index 54b8cfb6c09..e85a61fdd40 100644 --- a/extensions/whatsapp/src/normalize.ts +++ b/extensions/whatsapp/src/normalize.ts @@ -2,8 +2,6 @@ export { looksLikeWhatsAppTargetId, normalizeWhatsAppAllowFromEntries, normalizeWhatsAppMessagingTarget, -} from "./runtime-api.js"; -export { isWhatsAppGroupJid, isWhatsAppUserTarget, normalizeWhatsAppTarget, diff --git a/extensions/whatsapp/src/outbound-base.ts b/extensions/whatsapp/src/outbound-base.ts new file mode 100644 index 00000000000..6e5fad9bdaa --- /dev/null +++ b/extensions/whatsapp/src/outbound-base.ts @@ -0,0 +1,119 @@ +import { + createAttachedChannelResultAdapter, + type ChannelOutboundAdapter, +} from "openclaw/plugin-sdk/channel-send-result"; +import type { OpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; +import { resolveOutboundSendDep } from "openclaw/plugin-sdk/infra-runtime"; + +type WhatsAppChunker = NonNullable; +type WhatsAppSendTextOptions = { + verbose: boolean; + cfg?: OpenClawConfig; + mediaUrl?: string; + mediaAccess?: { + localRoots?: readonly string[]; + readFile?: (filePath: string) => Promise; + }; + mediaLocalRoots?: readonly string[]; + mediaReadFile?: (filePath: string) => Promise; + gifPlayback?: boolean; + accountId?: string; +}; +type WhatsAppSendMessage = ( + to: string, + body: string, + options: WhatsAppSendTextOptions, +) => Promise<{ messageId: string; toJid: string }>; +type WhatsAppSendPoll = ( + to: string, + poll: Parameters>[0]["poll"], + options: { verbose: boolean; accountId?: string; cfg?: OpenClawConfig }, +) => Promise<{ messageId: string; toJid: string }>; + +type CreateWhatsAppOutboundBaseParams = { + chunker: WhatsAppChunker; + sendMessageWhatsApp: WhatsAppSendMessage; + sendPollWhatsApp: WhatsAppSendPoll; + shouldLogVerbose: () => boolean; + resolveTarget: ChannelOutboundAdapter["resolveTarget"]; + normalizeText?: (text: string | undefined) => string; + skipEmptyText?: boolean; +}; + +export function createWhatsAppOutboundBase({ + chunker, + sendMessageWhatsApp, + sendPollWhatsApp, + shouldLogVerbose, + resolveTarget, + normalizeText = (text) => text ?? "", + skipEmptyText = false, +}: CreateWhatsAppOutboundBaseParams): Pick< + ChannelOutboundAdapter, + | "deliveryMode" + | "chunker" + | "chunkerMode" + | "textChunkLimit" + | "pollMaxOptions" + | "resolveTarget" + | "sendText" + | "sendMedia" + | "sendPoll" +> { + return { + deliveryMode: "gateway", + chunker, + chunkerMode: "text", + textChunkLimit: 4000, + pollMaxOptions: 12, + resolveTarget, + ...createAttachedChannelResultAdapter({ + channel: "whatsapp", + sendText: async ({ cfg, to, text, accountId, deps, gifPlayback }) => { + const normalizedText = normalizeText(text); + if (skipEmptyText && !normalizedText) { + return { messageId: "" }; + } + const send = + resolveOutboundSendDep(deps, "whatsapp") ?? sendMessageWhatsApp; + return await send(to, normalizedText, { + verbose: false, + cfg, + accountId: accountId ?? undefined, + gifPlayback, + }); + }, + sendMedia: async ({ + cfg, + to, + text, + mediaUrl, + mediaAccess, + mediaLocalRoots, + mediaReadFile, + accountId, + deps, + gifPlayback, + }) => { + const send = + resolveOutboundSendDep(deps, "whatsapp") ?? sendMessageWhatsApp; + return await send(to, normalizeText(text), { + verbose: false, + cfg, + mediaUrl, + mediaAccess, + mediaLocalRoots, + mediaReadFile, + accountId: accountId ?? undefined, + gifPlayback, + }); + }, + sendPoll: async ({ cfg, to, poll, accountId }) => + await sendPollWhatsApp(to, poll, { + verbose: shouldLogVerbose(), + accountId: accountId ?? undefined, + cfg, + }), + }), + }; +} diff --git a/extensions/whatsapp/src/runtime-api.ts b/extensions/whatsapp/src/runtime-api.ts index f241ad7ca2c..86e9c117f72 100644 --- a/extensions/whatsapp/src/runtime-api.ts +++ b/extensions/whatsapp/src/runtime-api.ts @@ -19,24 +19,24 @@ export { normalizeE164 } from "openclaw/plugin-sdk/account-resolution"; export type { DmPolicy, GroupPolicy } from "openclaw/plugin-sdk/config-runtime"; import type { OpenClawConfig as RuntimeOpenClawConfig } from "openclaw/plugin-sdk/config-runtime"; -export { - type ChannelMessageActionName, - createWhatsAppOutboundBase, - looksLikeWhatsAppTargetId, - normalizeWhatsAppAllowFromEntries, - normalizeWhatsAppMessagingTarget, - resolveWhatsAppGroupIntroHint, - resolveWhatsAppHeartbeatRecipients, - resolveWhatsAppMentionStripRegexes, -} from "openclaw/plugin-sdk/channel-runtime"; +export { type ChannelMessageActionName } from "openclaw/plugin-sdk/channel-contract"; import { loadWebMedia } from "openclaw/plugin-sdk/web-media"; export { resolveWhatsAppGroupRequireMention, resolveWhatsAppGroupToolPolicy, } from "./group-policy.js"; +export { + resolveWhatsAppGroupIntroHint, + resolveWhatsAppMentionStripRegexes, +} from "./group-intro.js"; +export { resolveWhatsAppHeartbeatRecipients } from "./heartbeat-recipients.js"; +export { createWhatsAppOutboundBase } from "./outbound-base.js"; export { isWhatsAppGroupJid, isWhatsAppUserTarget, + looksLikeWhatsAppTargetId, + normalizeWhatsAppAllowFromEntries, + normalizeWhatsAppMessagingTarget, normalizeWhatsAppTarget, } from "./normalize-target.js"; export { resolveWhatsAppOutboundTarget } from "./resolve-outbound-target.js"; diff --git a/src/auto-reply/reply.test-harness.ts b/src/auto-reply/reply.test-harness.ts index 09aa01ab7d2..fa0fd5ce801 100644 --- a/src/auto-reply/reply.test-harness.ts +++ b/src/auto-reply/reply.test-harness.ts @@ -141,7 +141,7 @@ export function installReplyRuntimeMocks(mocks: ReplyRuntimeMocks) { listSkillCommandsForWorkspace: () => [], })); - vi.mock("../plugins/runtime/runtime-whatsapp-boundary.js", () => ({ + vi.mock("../plugins/runtime/runtime-web-channel-boundary.js", () => ({ webAuthExists: mocks.webAuthExists, getWebAuthAgeMs: mocks.getWebAuthAgeMs, readWebSelfId: mocks.readWebSelfId, diff --git a/src/channel-web.ts b/src/channel-web.ts index 749398ab9fe..0690f779f9d 100644 --- a/src/channel-web.ts +++ b/src/channel-web.ts @@ -1,6 +1,6 @@ // Barrel exports for the web channel pieces. Splitting the original 900+ line // module keeps responsibilities small and testable. -import { resolveWaWebAuthDir } from "./plugins/runtime/runtime-whatsapp-boundary.js"; +import { resolveWaWebAuthDir } from "./plugins/runtime/runtime-web-channel-boundary.js"; export { HEARTBEAT_PROMPT } from "./auto-reply/heartbeat.js"; export { HEARTBEAT_TOKEN } from "./auto-reply/tokens.js"; @@ -23,7 +23,7 @@ export { sendReactionWhatsApp, waitForWaConnection, webAuthExists, -} from "./plugins/runtime/runtime-whatsapp-boundary.js"; +} from "./plugins/runtime/runtime-web-channel-boundary.js"; // Keep the historic constant surface available, but resolve it through the // plugin boundary only when a caller actually coerces the value to string. diff --git a/src/channels/channels-misc.test.ts b/src/channels/channels-misc.test.ts index 4d58b67d11c..076ca85fa85 100644 --- a/src/channels/channels-misc.test.ts +++ b/src/channels/channels-misc.test.ts @@ -29,14 +29,14 @@ describe("normalizeChatType", () => { describe("WA_WEB_AUTH_DIR", () => { afterEach(() => { - vi.doUnmock("../plugins/runtime/runtime-whatsapp-boundary.js"); + vi.doUnmock("../plugins/runtime/runtime-web-channel-boundary.js"); }); it("resolves lazily and caches across the legacy and channels/web entrypoints", async () => { const resolveWaWebAuthDir = vi.fn(() => "/tmp/openclaw-whatsapp-auth"); vi.resetModules(); - vi.doMock("../plugins/runtime/runtime-whatsapp-boundary.js", () => ({ + vi.doMock("../plugins/runtime/runtime-web-channel-boundary.js", () => ({ createWaSocket: vi.fn(), extractMediaPlaceholder: vi.fn(), extractText: vi.fn(), diff --git a/src/cli/deps.test.ts b/src/cli/deps.test.ts index ea11c13e5f1..dd071657fe6 100644 --- a/src/cli/deps.test.ts +++ b/src/cli/deps.test.ts @@ -21,9 +21,11 @@ const sendFns = vi.hoisted(() => ({ const whatsappBoundaryLoads = vi.hoisted(() => vi.fn()); -vi.mock("../plugins/runtime/runtime-whatsapp-boundary.js", async (importOriginal) => { +vi.mock("../plugins/runtime/runtime-web-channel-boundary.js", async (importOriginal) => { whatsappBoundaryLoads(); - return await importOriginal(); + return await importOriginal< + typeof import("../plugins/runtime/runtime-web-channel-boundary.js") + >(); }); vi.mock("./send-runtime/whatsapp.js", () => { diff --git a/src/cli/send-runtime/whatsapp.ts b/src/cli/send-runtime/whatsapp.ts index 1a7d4996773..5dc56b9669f 100644 --- a/src/cli/send-runtime/whatsapp.ts +++ b/src/cli/send-runtime/whatsapp.ts @@ -1,7 +1,7 @@ -import { sendMessageWhatsApp as sendMessageWhatsAppImpl } from "../../plugins/runtime/runtime-whatsapp-boundary.js"; +import { sendMessageWhatsApp as sendMessageWhatsAppImpl } from "../../plugins/runtime/runtime-web-channel-boundary.js"; type RuntimeSend = { - sendMessage: typeof import("../../plugins/runtime/runtime-whatsapp-boundary.js").sendMessageWhatsApp; + sendMessage: typeof import("../../plugins/runtime/runtime-web-channel-boundary.js").sendMessageWhatsApp; }; export const runtimeSend = { diff --git a/src/commands/health.snapshot.test.ts b/src/commands/health.snapshot.test.ts index 5b128a92e2e..edc47ed13ef 100644 --- a/src/commands/health.snapshot.test.ts +++ b/src/commands/health.snapshot.test.ts @@ -41,7 +41,7 @@ async function loadFreshHealthModulesForTest() { recordSessionMetaFromInbound: vi.fn().mockResolvedValue(undefined), updateLastRoute: vi.fn().mockResolvedValue(undefined), })); - vi.doMock("../plugins/runtime/runtime-whatsapp-boundary.js", () => ({ + vi.doMock("../plugins/runtime/runtime-web-channel-boundary.js", () => ({ webAuthExists: vi.fn(async () => true), getWebAuthAgeMs: vi.fn(() => 1234), readWebSelfId: vi.fn(() => ({ e164: null, jid: null })), diff --git a/src/commands/status.test.ts b/src/commands/status.test.ts index bf4bcd087c3..600c3d9be65 100644 --- a/src/commands/status.test.ts +++ b/src/commands/status.test.ts @@ -383,7 +383,7 @@ vi.mock("../channels/plugins/index.js", () => ({ }, ] as unknown, })); -vi.mock("../plugins/runtime/runtime-whatsapp-boundary.js", () => ({ +vi.mock("../plugins/runtime/runtime-web-channel-boundary.js", () => ({ webAuthExists: mocks.webAuthExists, getWebAuthAgeMs: mocks.getWebAuthAgeMs, readWebSelfId: mocks.readWebSelfId, diff --git a/src/gateway/test-helpers.mocks.ts b/src/gateway/test-helpers.mocks.ts index 68eb525507a..8495357a9ed 100644 --- a/src/gateway/test-helpers.mocks.ts +++ b/src/gateway/test-helpers.mocks.ts @@ -821,11 +821,11 @@ vi.mock("../plugins/loader.js", async () => { loadOpenClawPlugins: () => pluginRegistryState.registry, }; }); -vi.mock("../plugins/runtime/runtime-whatsapp-boundary.js", () => ({ +vi.mock("../plugins/runtime/runtime-web-channel-boundary.js", () => ({ sendMessageWhatsApp: (...args: unknown[]) => (hoisted.sendWhatsAppMock as (...args: unknown[]) => unknown)(...args), })); -vi.mock("/src/plugins/runtime/runtime-whatsapp-boundary.js", () => ({ +vi.mock("/src/plugins/runtime/runtime-web-channel-boundary.js", () => ({ sendMessageWhatsApp: (...args: unknown[]) => (hoisted.sendWhatsAppMock as (...args: unknown[]) => unknown)(...args), })); diff --git a/src/infra/outbound/targets.shared-test.ts b/src/infra/outbound/targets.shared-test.ts index 079afde2fc3..d3b9ffae3b7 100644 --- a/src/infra/outbound/targets.shared-test.ts +++ b/src/infra/outbound/targets.shared-test.ts @@ -1,14 +1,34 @@ import { afterEach, beforeEach, describe, expect, it } from "vitest"; -import { telegramOutbound, whatsappOutbound } from "../../../test/channel-outbounds.js"; import { isWhatsAppGroupJid, normalizeWhatsAppTarget, } from "../../channels/plugins/normalize/whatsapp.js"; +import type { ChannelOutboundAdapter } from "../../channels/plugins/types.js"; import type { OpenClawConfig } from "../../config/config.js"; import { setActivePluginRegistry } from "../../plugins/runtime.js"; import { createOutboundTestPlugin, createTestRegistry } from "../../test-utils/channel-plugins.js"; import { resolveOutboundTarget } from "./targets.js"; +const createOutboundStub = (channel: "telegram" | "whatsapp"): ChannelOutboundAdapter => ({ + deliveryMode: channel === "whatsapp" ? "gateway" : "direct", + resolveTarget: + channel === "whatsapp" + ? ({ to }) => { + const normalized = to ? normalizeWhatsAppTarget(to) : null; + return normalized + ? { ok: true, to: normalized } + : { ok: false, error: new Error("WhatsApp target required") }; + } + : ({ to }) => + typeof to === "string" && to.trim() + ? { ok: true, to: to.trim() } + : { ok: false, error: new Error("Telegram target required") }, + sendText: async () => ({ channel, messageId: `${channel}-msg` }), +}); + +const telegramOutbound = createOutboundStub("telegram"); +const whatsappOutbound = createOutboundStub("whatsapp"); + function parseTelegramTargetForTest(raw: string): { chatId: string; messageThreadId?: number; diff --git a/src/infra/outbound/targets.test.ts b/src/infra/outbound/targets.test.ts index 615cd692971..7975a459366 100644 --- a/src/infra/outbound/targets.test.ts +++ b/src/infra/outbound/targets.test.ts @@ -1,5 +1,4 @@ import { beforeEach, describe, expect, it } from "vitest"; -import { telegramOutbound, whatsappOutbound } from "../../../test/channel-outbounds.js"; import { isWhatsAppGroupJid, normalizeWhatsAppTarget, @@ -21,6 +20,26 @@ import { } from "./targets.shared-test.js"; import { telegramMessagingForTest } from "./targets.test-helpers.js"; +const createOutboundStub = (channel: "telegram" | "whatsapp"): ChannelOutboundAdapter => ({ + deliveryMode: channel === "whatsapp" ? "gateway" : "direct", + resolveTarget: + channel === "whatsapp" + ? ({ to }) => { + const normalized = to ? normalizeWhatsAppTarget(to) : null; + return normalized + ? { ok: true, to: normalized } + : { ok: false, error: new Error("WhatsApp target required") }; + } + : ({ to }) => + typeof to === "string" && to.trim() + ? { ok: true, to: to.trim() } + : { ok: false, error: new Error("Telegram target required") }, + sendText: async () => ({ channel, messageId: `${channel}-msg` }), +}); + +const telegramOutbound = createOutboundStub("telegram"); +const whatsappOutbound = createOutboundStub("whatsapp"); + runResolveOutboundTargetCoreTests(); const whatsappMessaging = { diff --git a/src/library.test.ts b/src/library.test.ts index 0f21bca3864..68699febe9a 100644 --- a/src/library.test.ts +++ b/src/library.test.ts @@ -10,7 +10,7 @@ const lazyRuntimeSpecifiers = [ "./cli/prompt.js", "./infra/binaries.js", "./process/exec.js", - "./plugins/runtime/runtime-whatsapp-boundary.js", + "./plugins/runtime/runtime-web-channel-boundary.js", ] as const; function readLibraryModuleImports() { diff --git a/src/library.ts b/src/library.ts index 69a93bd11e8..b5aaf43353f 100644 --- a/src/library.ts +++ b/src/library.ts @@ -14,7 +14,7 @@ import { handlePortError, PortInUseError, } from "./infra/ports.js"; -import type { monitorWebChannel as monitorWebChannelRuntime } from "./plugins/runtime/runtime-whatsapp-boundary.js"; +import type { monitorWebChannel as monitorWebChannelRuntime } from "./plugins/runtime/runtime-web-channel-boundary.js"; import type { runCommandWithTimeout as runCommandWithTimeoutRuntime, runExec as runExecRuntime, @@ -33,7 +33,7 @@ let promptRuntimePromise: Promise | null = nul let binariesRuntimePromise: Promise | null = null; let execRuntimePromise: Promise | null = null; let whatsappRuntimePromise: Promise< - typeof import("./plugins/runtime/runtime-whatsapp-boundary.js") + typeof import("./plugins/runtime/runtime-web-channel-boundary.js") > | null = null; function loadReplyRuntime() { @@ -57,7 +57,7 @@ function loadExecRuntime() { } function loadWhatsAppRuntime() { - whatsappRuntimePromise ??= import("./plugins/runtime/runtime-whatsapp-boundary.js"); + whatsappRuntimePromise ??= import("./plugins/runtime/runtime-web-channel-boundary.js"); return whatsappRuntimePromise; } diff --git a/src/plugin-sdk/channel-contract.ts b/src/plugin-sdk/channel-contract.ts index 8e668d2cb6f..8753aa4331c 100644 --- a/src/plugin-sdk/channel-contract.ts +++ b/src/plugin-sdk/channel-contract.ts @@ -18,3 +18,5 @@ export type { ChannelThreadingContext, ChannelThreadingToolContext, } from "../channels/plugins/types.js"; + +export type { ChannelDirectoryAdapter } from "../channels/plugins/types.adapters.js"; diff --git a/src/plugin-sdk/channel-pairing.ts b/src/plugin-sdk/channel-pairing.ts index cd5e108dee7..301eaddc863 100644 --- a/src/plugin-sdk/channel-pairing.ts +++ b/src/plugin-sdk/channel-pairing.ts @@ -4,6 +4,7 @@ export { createPairingPrefixStripper, createTextPairingAdapter, } from "../channels/plugins/pairing-adapters.js"; +export { readChannelAllowFromStoreSync } from "../pairing/pairing-store.js"; import { issuePairingChallenge } from "../pairing/pairing-challenge.js"; import type { PluginRuntime } from "../plugins/runtime/types.js"; import { createScopedPairingAccess } from "./pairing-access.js"; diff --git a/src/plugin-sdk/channel-runtime.ts b/src/plugin-sdk/channel-runtime.ts index e8975d0b48a..d18afbb57c1 100644 --- a/src/plugin-sdk/channel-runtime.ts +++ b/src/plugin-sdk/channel-runtime.ts @@ -6,15 +6,7 @@ export * from "../channels/reply-prefix.js"; export * from "../channels/typing.js"; export type * from "../channels/plugins/types.js"; export { normalizeChannelId } from "../channels/plugins/registry.js"; -export * from "../channels/plugins/normalize/signal.js"; -export * from "../channels/plugins/normalize/whatsapp.js"; export * from "../channels/plugins/outbound/interactive.js"; -export * from "../channels/plugins/whatsapp-heartbeat.js"; -export { - createWhatsAppOutboundBase, - resolveWhatsAppGroupIntroHint, - resolveWhatsAppMentionStripRegexes, -} from "../channels/plugins/whatsapp-shared.js"; export * from "../polls.js"; export { enqueueSystemEvent, resetSystemEventsForTest } from "../infra/system-events.js"; export { recordChannelActivity } from "../infra/channel-activity.js"; diff --git a/src/plugin-sdk/channel-targets.ts b/src/plugin-sdk/channel-targets.ts index cbdef5d20a8..e36a925ff7a 100644 --- a/src/plugin-sdk/channel-targets.ts +++ b/src/plugin-sdk/channel-targets.ts @@ -37,6 +37,8 @@ export { type ParsedChatTarget, type ServicePrefix, } from "../channels/plugins/chat-target-prefixes.js"; +export type { ChannelId } from "../channels/plugins/types.js"; +export { normalizeChannelId } from "../channels/plugins/registry.js"; export { buildUnresolvedTargetResults, resolveTargetsWithOptionalToken, diff --git a/src/plugin-sdk/whatsapp-action-runtime.ts b/src/plugin-sdk/whatsapp-action-runtime.ts deleted file mode 100644 index 6bef2336fe7..00000000000 --- a/src/plugin-sdk/whatsapp-action-runtime.ts +++ /dev/null @@ -1 +0,0 @@ -export { handleWhatsAppAction } from "../plugins/runtime/runtime-whatsapp-boundary.js"; diff --git a/src/plugin-sdk/whatsapp-login-qr.ts b/src/plugin-sdk/whatsapp-login-qr.ts deleted file mode 100644 index 2981d66991f..00000000000 --- a/src/plugin-sdk/whatsapp-login-qr.ts +++ /dev/null @@ -1,4 +0,0 @@ -export { - startWebLoginWithQr, - waitForWebLogin, -} from "../plugins/runtime/runtime-whatsapp-boundary.js"; diff --git a/src/plugins/contracts/plugin-sdk-subpaths.test.ts b/src/plugins/contracts/plugin-sdk-subpaths.test.ts index 1c2fb648a0d..f677f31d540 100644 --- a/src/plugins/contracts/plugin-sdk-subpaths.test.ts +++ b/src/plugins/contracts/plugin-sdk-subpaths.test.ts @@ -151,6 +151,19 @@ describe("plugin-sdk subpath exports", () => { } }); + it("keeps removed bundled-channel prefixes out of the public sdk list", () => { + const bannedPrefixes = ["discord", "signal", "slack", "telegram", "whatsapp"]; + const banned = pluginSdkSubpaths.filter((subpath) => + bannedPrefixes.some( + (prefix) => + subpath === prefix || + subpath.startsWith(`${prefix}-`) || + subpath.startsWith(`${prefix}.`), + ), + ); + expect(banned).toEqual([]); + }); + it("keeps helper subpaths aligned", () => { expectSourceMentions("core", [ "emptyPluginConfigSchema", @@ -468,8 +481,10 @@ describe("plugin-sdk subpath exports", () => { "applyChannelMatchMeta", "buildChannelKeyCandidates", "buildMessagingTarget", + "ChannelId", "createAllowedChatSenderMatcher", "ensureTargetId", + "normalizeChannelId", "parseChatAllowTargetPrefixes", "parseMentionPrefixOrAtUserTarget", "parseChatTargetPrefixesOrThrow", @@ -775,6 +790,7 @@ describe("plugin-sdk subpath exports", () => { "createChannelPairingChallengeIssuer", "createLoggedPairingApprovalNotifier", "createPairingPrefixStripper", + "readChannelAllowFromStoreSync", "createTextPairingAdapter", ]); expect("createScopedPairingAccess" in channelPairingSdk).toBe(false); diff --git a/src/plugins/runtime/runtime-whatsapp-boundary.ts b/src/plugins/runtime/runtime-web-channel-boundary.ts similarity index 97% rename from src/plugins/runtime/runtime-whatsapp-boundary.ts rename to src/plugins/runtime/runtime-web-channel-boundary.ts index 99b7bcb63a8..2436256e203 100644 --- a/src/plugins/runtime/runtime-whatsapp-boundary.ts +++ b/src/plugins/runtime/runtime-web-channel-boundary.ts @@ -1,7 +1,6 @@ import { createJiti } from "jiti"; type WhatsAppHeavyRuntimeModule = typeof import("@openclaw/whatsapp/runtime-api.js"); type WhatsAppLightRuntimeModule = typeof import("@openclaw/whatsapp/light-runtime-api.js"); -import { resolveWhatsAppHeartbeatRecipients } from "../../channels/plugins/whatsapp-heartbeat.js"; import { getDefaultLocalRoots as getDefaultLocalRootsImpl, loadWebMedia as loadWebMediaImpl, @@ -281,7 +280,7 @@ export function getDefaultLocalRoots( } export function resolveHeartbeatRecipients( - ...args: Parameters -): ReturnType { - return resolveWhatsAppHeartbeatRecipients(...args); + ...args: Parameters +): ReturnType { + return loadCurrentHeavyModuleSync().resolveHeartbeatRecipients(...args); } diff --git a/src/plugins/runtime/runtime-whatsapp-login-tool.ts b/src/plugins/runtime/runtime-whatsapp-login-tool.ts deleted file mode 100644 index 577bf3aeb27..00000000000 --- a/src/plugins/runtime/runtime-whatsapp-login-tool.ts +++ /dev/null @@ -1 +0,0 @@ -export { createRuntimeWhatsAppLoginTool } from "./runtime-whatsapp-boundary.js"; diff --git a/test/helpers/plugins/directory.ts b/test/helpers/plugins/directory.ts index 31f46be63ad..be97fa8d842 100644 --- a/test/helpers/plugins/directory.ts +++ b/test/helpers/plugins/directory.ts @@ -1,4 +1,4 @@ -import type { ChannelDirectoryAdapter } from "openclaw/plugin-sdk/channel-runtime"; +import type { ChannelDirectoryAdapter } from "openclaw/plugin-sdk/channel-contract"; type DirectorySurface = { listPeers: NonNullable;