export { DEFAULT_ACCOUNT_ID, normalizeAccountId, normalizeOptionalAccountId, } from "openclaw/plugin-sdk/account-id"; export { createActionGate, jsonResult, readNumberParam, readReactionParams, readStringArrayParam, readStringParam, } from "openclaw/plugin-sdk/channel-actions"; export { buildChannelConfigSchema } from "openclaw/plugin-sdk/channel-config-primitives"; export type { ChannelPlugin } from "openclaw/plugin-sdk/channel-core"; export type { BaseProbeResult, ChannelDirectoryEntry, ChannelGroupContext, ChannelMessageActionAdapter, ChannelMessageActionContext, ChannelMessageActionName, ChannelMessageToolDiscovery, ChannelOutboundAdapter, ChannelResolveKind, ChannelResolveResult, ChannelToolSend, } from "openclaw/plugin-sdk/channel-contract"; export { formatLocationText, logInboundDrop, toLocationContext, type NormalizedLocation, } from "openclaw/plugin-sdk/channel-inbound"; export { resolveAckReaction, logTypingFailure } from "openclaw/plugin-sdk/channel-feedback"; export type { ChannelSetupInput } from "openclaw/plugin-sdk/setup"; export type { OpenClawConfig, ContextVisibilityMode, DmPolicy, GroupPolicy, } from "openclaw/plugin-sdk/config-runtime"; export type { GroupToolPolicyConfig } from "openclaw/plugin-sdk/config-runtime"; export type { WizardPrompter } from "openclaw/plugin-sdk/matrix-runtime-shared"; export type { SecretInput } from "openclaw/plugin-sdk/secret-input"; export { GROUP_POLICY_BLOCKED_LABEL, resolveAllowlistProviderRuntimeGroupPolicy, resolveDefaultGroupPolicy, warnMissingProviderGroupPolicyFallbackOnce, } from "openclaw/plugin-sdk/config-runtime"; export { addWildcardAllowFrom, formatDocsLink, hasConfiguredSecretInput, mergeAllowFromEntries, moveSingleAccountChannelSectionToDefaultAccount, promptAccountId, promptChannelAccessConfig, splitSetupEntries, } from "openclaw/plugin-sdk/setup"; export type { RuntimeEnv } from "openclaw/plugin-sdk/runtime"; export { assertHttpUrlTargetsPrivateNetwork, closeDispatcher, createPinnedDispatcher, isPrivateOrLoopbackHost, resolvePinnedHostnameWithPolicy, ssrfPolicyFromDangerouslyAllowPrivateNetwork, ssrfPolicyFromAllowPrivateNetwork, type LookupFn, type SsrFPolicy, } from "openclaw/plugin-sdk/ssrf-runtime"; export { dispatchReplyFromConfigWithSettledDispatcher } from "openclaw/plugin-sdk/inbound-reply-dispatch"; export { ensureConfiguredAcpBindingReady, resolveConfiguredAcpBindingRecord, } from "openclaw/plugin-sdk/acp-binding-runtime"; export { buildProbeChannelStatusSummary, collectStatusIssuesFromLastError, PAIRING_APPROVED_MESSAGE, } from "openclaw/plugin-sdk/channel-status"; export { getSessionBindingService, resolveThreadBindingIdleTimeoutMsForChannel, resolveThreadBindingMaxAgeMsForChannel, } from "openclaw/plugin-sdk/conversation-runtime"; export { resolveOutboundSendDep } from "openclaw/plugin-sdk/outbound-runtime"; export { resolveAgentIdFromSessionKey } from "openclaw/plugin-sdk/routing"; export { chunkTextForOutbound } from "openclaw/plugin-sdk/text-chunking"; export { createChannelReplyPipeline } from "openclaw/plugin-sdk/channel-reply-pipeline"; export { loadOutboundMediaFromUrl } from "openclaw/plugin-sdk/outbound-media"; export { normalizePollInput, type PollInput } from "openclaw/plugin-sdk/media-runtime"; export { writeJsonFileAtomically } from "openclaw/plugin-sdk/json-store"; export { buildChannelKeyCandidates, resolveChannelEntryMatch, } from "openclaw/plugin-sdk/channel-targets"; export { evaluateGroupRouteAccessForPolicy, resolveSenderScopedGroupPolicy, } from "openclaw/plugin-sdk/channel-policy"; export { formatZonedTimestamp, type PluginRuntime, type RuntimeLogger, } from "openclaw/plugin-sdk/matrix-runtime-shared"; export type { ReplyPayload } from "openclaw/plugin-sdk/reply-runtime"; // resolveMatrixAccountStringValues already comes from plugin-sdk/matrix. // Re-exporting auth-precedence here makes Jiti try to define the same export twice. export function buildTimeoutAbortSignal(params: { timeoutMs?: number; signal?: AbortSignal }): { signal?: AbortSignal; cleanup: () => void; } { const { timeoutMs, signal } = params; if (!timeoutMs && !signal) { return { signal: undefined, cleanup: () => {} }; } if (!timeoutMs) { return { signal, cleanup: () => {} }; } const controller = new AbortController(); const timeoutId = setTimeout(controller.abort.bind(controller), timeoutMs); const onAbort = () => controller.abort(); if (signal) { if (signal.aborted) { controller.abort(); } else { signal.addEventListener("abort", onAbort, { once: true }); } } return { signal: controller.signal, cleanup: () => { clearTimeout(timeoutId); signal?.removeEventListener("abort", onAbort); }, }; }