mirror of
https://github.com/moltbot/moltbot.git
synced 2026-03-07 22:44:16 +00:00
* feat(feishu): add broadcast support for multi-agent group observation When multiple agents share a Feishu group chat, only the @mentioned agent receives the message. This prevents observer agents from building session memory of group activity they weren't directly addressed in. Adds broadcast support (reusing the same cfg.broadcast schema as WhatsApp) so all configured agents receive every group message in their session transcripts. Only the @mentioned agent responds on Feishu; observer agents process silently via no-op dispatchers. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): guard sequential broadcast dispatch against single-agent failure Wrap each dispatchForAgent() call in the sequential loop with try/catch so one agent's dispatch failure doesn't abort delivery to remaining agents. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): avoid duplicate messages in broadcast observer mode and normalize agent IDs - Skip recordPendingHistoryEntryIfEnabled for broadcast groups when not mentioned, since the message is dispatched directly to all agents. Previously the message appeared twice in the agent prompt. - Normalize agent IDs with toLowerCase() before membership checks so config casing mismatches don't silently skip valid agents. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): set WasMentioned per-agent and normalize broadcast IDs - buildCtxPayloadForAgent now takes a wasMentioned parameter so active agents get WasMentioned=true and observers get false (P1 fix) - Normalize broadcastAgents to lowercase at resolution time and lowercase activeAgentId so all comparisons and session key generation use canonical IDs regardless of config casing (P2 fix) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): canonicalize broadcast agent IDs with normalizeAgentId * fix(feishu): match ReplyDispatcher sync return types for noop dispatcher The upstream ReplyDispatcher changed sendToolResult/sendBlockReply/ sendFinalReply to synchronous (returning boolean). Update the broadcast observer noop dispatcher to match. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): deduplicate broadcast agent IDs after normalization Config entries like "Main" and "main" collapse to the same canonical ID after normalizeAgentId but were dispatched multiple times. Use Set to deduplicate after normalization. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): honor requireMention=false when selecting broadcast responder When requireMention is false, the routed agent should be active (reply on Feishu) even without an explicit @mention. Previously activeAgentId was null whenever ctx.mentionedBot was false, so all agents got the noop dispatcher and no reply was sent — silently breaking groups that disabled mention gating. Hoist requireMention out of the if(isGroup) block so it's accessible in the dispatch code. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): cross-account broadcast dedup to prevent duplicate dispatches In multi-account Feishu setups, the same message event is delivered to every bot account in a group. Without cross-account dedup, each account independently dispatches broadcast agents, causing 2×N dispatches instead of N (where N = number of broadcast agents). Two changes: 1. requireMention=true + bot not mentioned: return early instead of falling through to broadcast. The mentioned bot's handler will dispatch for all agents. Non-mentioned handlers record to history. 2. Add cross-account broadcast dedup using a shared 'broadcast' namespace (tryRecordMessagePersistent). The first handler to reach the broadcast block claims the message; subsequent accounts skip. This handles the requireMention=false multi-account case. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): strip CommandAuthorized from broadcast observer contexts Broadcast observer agents inherited CommandAuthorized from the sender, causing slash commands (e.g. /reset) to silently execute on every observer session. Now only the active agent retains CommandAuthorized; observers have it stripped before dispatch. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): use actual mention state for broadcast WasMentioned The active broadcast agent's WasMentioned was set to true whenever requireMention=false, even when the bot was not actually @mentioned. Now uses ctx.mentionedBot && agentId === activeAgentId, consistent with the single-agent path which passes ctx.mentionedBot directly. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(feishu): skip history buffer for broadcast accounts and log parallel failures 1. In requireMention groups with broadcast, non-mentioned accounts no longer buffer pending history — the mentioned handler's broadcast dispatch already writes turns into all agent sessions. Buffering caused duplicate replay via buildPendingHistoryContextFromMap. 2. Parallel broadcast dispatch now inspects Promise.allSettled results and logs rejected entries, matching the sequential path's per-agent error logging. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * Changelog: note Feishu multi-agent broadcast dispatch * Changelog: restore author credit for Feishu broadcast entry --------- Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com> Co-authored-by: Tak Hoffman <781889+Takhoffman@users.noreply.github.com>
692 lines
24 KiB
TypeScript
692 lines
24 KiB
TypeScript
export { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
|
|
export { CHANNEL_MESSAGE_ACTION_NAMES } from "../channels/plugins/message-action-names.js";
|
|
export {
|
|
BLUEBUBBLES_ACTIONS,
|
|
BLUEBUBBLES_ACTION_NAMES,
|
|
BLUEBUBBLES_GROUP_ACTIONS,
|
|
} from "../channels/plugins/bluebubbles-actions.js";
|
|
export type {
|
|
ChannelAccountSnapshot,
|
|
ChannelAccountState,
|
|
ChannelAgentTool,
|
|
ChannelAgentToolFactory,
|
|
ChannelAuthAdapter,
|
|
ChannelCapabilities,
|
|
ChannelCommandAdapter,
|
|
ChannelConfigAdapter,
|
|
ChannelDirectoryAdapter,
|
|
ChannelDirectoryEntry,
|
|
ChannelDirectoryEntryKind,
|
|
ChannelElevatedAdapter,
|
|
ChannelGatewayAdapter,
|
|
ChannelGatewayContext,
|
|
ChannelGroupAdapter,
|
|
ChannelGroupContext,
|
|
ChannelHeartbeatAdapter,
|
|
ChannelHeartbeatDeps,
|
|
ChannelId,
|
|
ChannelLogSink,
|
|
ChannelLoginWithQrStartResult,
|
|
ChannelLoginWithQrWaitResult,
|
|
ChannelLogoutContext,
|
|
ChannelLogoutResult,
|
|
ChannelMentionAdapter,
|
|
ChannelMessageActionAdapter,
|
|
ChannelMessageActionContext,
|
|
ChannelMessageActionName,
|
|
ChannelMessagingAdapter,
|
|
ChannelMeta,
|
|
ChannelOutboundAdapter,
|
|
ChannelOutboundContext,
|
|
ChannelOutboundTargetMode,
|
|
ChannelPairingAdapter,
|
|
ChannelPollContext,
|
|
ChannelPollResult,
|
|
ChannelResolveKind,
|
|
ChannelResolveResult,
|
|
ChannelResolverAdapter,
|
|
ChannelSecurityAdapter,
|
|
ChannelSecurityContext,
|
|
ChannelSecurityDmPolicy,
|
|
ChannelSetupAdapter,
|
|
ChannelSetupInput,
|
|
ChannelStatusAdapter,
|
|
ChannelStatusIssue,
|
|
ChannelStreamingAdapter,
|
|
ChannelThreadingAdapter,
|
|
ChannelThreadingContext,
|
|
ChannelThreadingToolContext,
|
|
ChannelToolSend,
|
|
BaseProbeResult,
|
|
BaseTokenResolution,
|
|
} from "../channels/plugins/types.js";
|
|
export type { ChannelConfigSchema, ChannelPlugin } from "../channels/plugins/types.plugin.js";
|
|
export type {
|
|
ThreadBindingManager,
|
|
ThreadBindingRecord,
|
|
ThreadBindingTargetKind,
|
|
} from "../discord/monitor/thread-bindings.js";
|
|
export {
|
|
autoBindSpawnedDiscordSubagent,
|
|
listThreadBindingsBySessionKey,
|
|
unbindThreadBindingsBySessionKey,
|
|
} from "../discord/monitor/thread-bindings.js";
|
|
export type {
|
|
AcpRuntimeCapabilities,
|
|
AcpRuntimeControl,
|
|
AcpRuntimeDoctorReport,
|
|
AcpRuntime,
|
|
AcpRuntimeEnsureInput,
|
|
AcpRuntimeEvent,
|
|
AcpRuntimeHandle,
|
|
AcpRuntimePromptMode,
|
|
AcpSessionUpdateTag,
|
|
AcpRuntimeSessionMode,
|
|
AcpRuntimeStatus,
|
|
AcpRuntimeTurnInput,
|
|
} from "../acp/runtime/types.js";
|
|
export type { AcpRuntimeBackend } from "../acp/runtime/registry.js";
|
|
export {
|
|
getAcpRuntimeBackend,
|
|
registerAcpRuntimeBackend,
|
|
requireAcpRuntimeBackend,
|
|
unregisterAcpRuntimeBackend,
|
|
} from "../acp/runtime/registry.js";
|
|
export { ACP_ERROR_CODES, AcpRuntimeError } from "../acp/runtime/errors.js";
|
|
export type { AcpRuntimeErrorCode } from "../acp/runtime/errors.js";
|
|
export type {
|
|
AnyAgentTool,
|
|
OpenClawPluginConfigSchema,
|
|
OpenClawPluginApi,
|
|
OpenClawPluginService,
|
|
OpenClawPluginServiceContext,
|
|
PluginLogger,
|
|
ProviderAuthContext,
|
|
ProviderAuthResult,
|
|
} from "../plugins/types.js";
|
|
export type {
|
|
GatewayRequestHandler,
|
|
GatewayRequestHandlerOptions,
|
|
RespondFn,
|
|
} from "../gateway/server-methods/types.js";
|
|
export type { PluginRuntime, RuntimeLogger } from "../plugins/runtime/types.js";
|
|
export { normalizePluginHttpPath } from "../plugins/http-path.js";
|
|
export { registerPluginHttpRoute } from "../plugins/http-registry.js";
|
|
export { emptyPluginConfigSchema } from "../plugins/config-schema.js";
|
|
export type { OpenClawConfig } from "../config/config.js";
|
|
/** @deprecated Use OpenClawConfig instead */
|
|
export type { OpenClawConfig as ClawdbotConfig } from "../config/config.js";
|
|
export { isDangerousNameMatchingEnabled } from "../config/dangerous-name-matching.js";
|
|
|
|
export type { FileLockHandle, FileLockOptions } from "./file-lock.js";
|
|
export { acquireFileLock, withFileLock } from "./file-lock.js";
|
|
export type { KeyedAsyncQueueHooks } from "./keyed-async-queue.js";
|
|
export { enqueueKeyedTask, KeyedAsyncQueue } from "./keyed-async-queue.js";
|
|
export { normalizeWebhookPath, resolveWebhookPath } from "./webhook-path.js";
|
|
export {
|
|
registerWebhookTarget,
|
|
registerWebhookTargetWithPluginRoute,
|
|
rejectNonPostWebhookRequest,
|
|
resolveWebhookTargetWithAuthOrReject,
|
|
resolveWebhookTargetWithAuthOrRejectSync,
|
|
resolveSingleWebhookTarget,
|
|
resolveSingleWebhookTargetAsync,
|
|
resolveWebhookTargets,
|
|
} from "./webhook-targets.js";
|
|
export type {
|
|
RegisterWebhookPluginRouteOptions,
|
|
RegisterWebhookTargetOptions,
|
|
WebhookTargetMatchResult,
|
|
} from "./webhook-targets.js";
|
|
export {
|
|
applyBasicWebhookRequestGuards,
|
|
beginWebhookRequestPipelineOrReject,
|
|
createWebhookInFlightLimiter,
|
|
isJsonContentType,
|
|
readWebhookBodyOrReject,
|
|
readJsonWebhookBodyOrReject,
|
|
WEBHOOK_BODY_READ_DEFAULTS,
|
|
WEBHOOK_IN_FLIGHT_DEFAULTS,
|
|
} from "./webhook-request-guards.js";
|
|
export type { WebhookBodyReadProfile, WebhookInFlightLimiter } from "./webhook-request-guards.js";
|
|
export { keepHttpServerTaskAlive, waitUntilAbort } from "./channel-lifecycle.js";
|
|
export type { AgentMediaPayload } from "./agent-media-payload.js";
|
|
export { buildAgentMediaPayload } from "./agent-media-payload.js";
|
|
export {
|
|
buildBaseAccountStatusSnapshot,
|
|
buildBaseChannelStatusSummary,
|
|
buildProbeChannelStatusSummary,
|
|
buildTokenChannelStatusSummary,
|
|
collectStatusIssuesFromLastError,
|
|
createDefaultChannelRuntimeState,
|
|
} from "./status-helpers.js";
|
|
export {
|
|
promptSingleChannelSecretInput,
|
|
type SingleChannelSecretInputPromptResult,
|
|
} from "../channels/plugins/onboarding/helpers.js";
|
|
export { buildOauthProviderAuthResult } from "./provider-auth-result.js";
|
|
export { formatResolvedUnresolvedNote } from "./resolution-notes.js";
|
|
export type { ChannelDock } from "../channels/dock.js";
|
|
export { getChatChannelMeta } from "../channels/registry.js";
|
|
export { resolveAllowlistMatchByCandidates } from "../channels/allowlist-match.js";
|
|
export type {
|
|
BlockStreamingCoalesceConfig,
|
|
DmPolicy,
|
|
DmConfig,
|
|
GroupPolicy,
|
|
GroupToolPolicyConfig,
|
|
GroupToolPolicyBySenderConfig,
|
|
MarkdownConfig,
|
|
MarkdownTableMode,
|
|
GoogleChatAccountConfig,
|
|
GoogleChatConfig,
|
|
GoogleChatDmConfig,
|
|
GoogleChatGroupConfig,
|
|
GoogleChatActionConfig,
|
|
MSTeamsChannelConfig,
|
|
MSTeamsConfig,
|
|
MSTeamsReplyStyle,
|
|
MSTeamsTeamConfig,
|
|
} from "../config/types.js";
|
|
export {
|
|
GROUP_POLICY_BLOCKED_LABEL,
|
|
resetMissingProviderGroupPolicyFallbackWarningsForTesting,
|
|
resolveAllowlistProviderRuntimeGroupPolicy,
|
|
resolveDefaultGroupPolicy,
|
|
resolveOpenProviderRuntimeGroupPolicy,
|
|
resolveRuntimeGroupPolicy,
|
|
type GroupPolicyDefaultsConfig,
|
|
type RuntimeGroupPolicyResolution,
|
|
type RuntimeGroupPolicyParams,
|
|
type ResolveProviderRuntimeGroupPolicyParams,
|
|
warnMissingProviderGroupPolicyFallbackOnce,
|
|
} from "../config/runtime-group-policy.js";
|
|
export {
|
|
DiscordConfigSchema,
|
|
GoogleChatConfigSchema,
|
|
IMessageConfigSchema,
|
|
MSTeamsConfigSchema,
|
|
SignalConfigSchema,
|
|
SlackConfigSchema,
|
|
TelegramConfigSchema,
|
|
} from "../config/zod-schema.providers-core.js";
|
|
export { WhatsAppConfigSchema } from "../config/zod-schema.providers-whatsapp.js";
|
|
export {
|
|
BlockStreamingCoalesceSchema,
|
|
DmConfigSchema,
|
|
DmPolicySchema,
|
|
GroupPolicySchema,
|
|
MarkdownConfigSchema,
|
|
MarkdownTableModeSchema,
|
|
normalizeAllowFrom,
|
|
ReplyRuntimeConfigSchemaShape,
|
|
requireOpenAllowFrom,
|
|
SecretInputSchema,
|
|
TtsAutoSchema,
|
|
TtsConfigSchema,
|
|
TtsModeSchema,
|
|
TtsProviderSchema,
|
|
} from "../config/zod-schema.core.js";
|
|
export {
|
|
assertSecretInputResolved,
|
|
hasConfiguredSecretInput,
|
|
isSecretRef,
|
|
normalizeResolvedSecretInputString,
|
|
normalizeSecretInputString,
|
|
} from "../config/types.secrets.js";
|
|
export type { SecretInput, SecretRef } from "../config/types.secrets.js";
|
|
export { ToolPolicySchema } from "../config/zod-schema.agent-runtime.js";
|
|
export type { RuntimeEnv } from "../runtime.js";
|
|
export type { WizardPrompter } from "../wizard/prompts.js";
|
|
export {
|
|
DEFAULT_ACCOUNT_ID,
|
|
normalizeAccountId,
|
|
normalizeAgentId,
|
|
resolveThreadSessionKeys,
|
|
} from "../routing/session-key.js";
|
|
export {
|
|
formatAllowFromLowercase,
|
|
isAllowedParsedChatSender,
|
|
isNormalizedSenderAllowed,
|
|
} from "./allow-from.js";
|
|
export {
|
|
evaluateSenderGroupAccess,
|
|
type SenderGroupAccessDecision,
|
|
type SenderGroupAccessReason,
|
|
} from "./group-access.js";
|
|
export {
|
|
resolveDirectDmAuthorizationOutcome,
|
|
resolveSenderCommandAuthorization,
|
|
resolveSenderCommandAuthorizationWithRuntime,
|
|
} from "./command-auth.js";
|
|
export type { CommandAuthorizationRuntime } from "./command-auth.js";
|
|
export { createScopedPairingAccess } from "./pairing-access.js";
|
|
export {
|
|
createInboundEnvelopeBuilder,
|
|
resolveInboundRouteEnvelopeBuilder,
|
|
resolveInboundRouteEnvelopeBuilderWithRuntime,
|
|
} from "./inbound-envelope.js";
|
|
export {
|
|
listConfiguredAccountIds,
|
|
resolveAccountWithDefaultFallback,
|
|
} from "./account-resolution.js";
|
|
export { issuePairingChallenge } from "../pairing/pairing-challenge.js";
|
|
export { handleSlackMessageAction } from "./slack-message-actions.js";
|
|
export { extractToolSend } from "./tool-send.js";
|
|
export {
|
|
createNormalizedOutboundDeliverer,
|
|
formatTextWithAttachmentLinks,
|
|
normalizeOutboundReplyPayload,
|
|
resolveOutboundMediaUrls,
|
|
sendMediaWithLeadingCaption,
|
|
} from "./reply-payload.js";
|
|
export type { OutboundReplyPayload } from "./reply-payload.js";
|
|
export type { OutboundMediaLoadOptions } from "./outbound-media.js";
|
|
export { loadOutboundMediaFromUrl } from "./outbound-media.js";
|
|
export { resolveChannelAccountConfigBasePath } from "./config-paths.js";
|
|
export { buildMediaPayload } from "../channels/plugins/media-payload.js";
|
|
export type { MediaPayload, MediaPayloadInput } from "../channels/plugins/media-payload.js";
|
|
export { createLoggerBackedRuntime } from "./runtime.js";
|
|
export { chunkTextForOutbound } from "./text-chunking.js";
|
|
export { readBooleanParam } from "./boolean-param.js";
|
|
export { readJsonFileWithFallback, writeJsonFileAtomically } from "./json-store.js";
|
|
export { generatePkceVerifierChallenge, toFormUrlEncoded } from "./oauth-utils.js";
|
|
export { buildRandomTempFilePath, withTempDownloadPath } from "./temp-path.js";
|
|
export {
|
|
applyWindowsSpawnProgramPolicy,
|
|
materializeWindowsSpawnProgram,
|
|
resolveWindowsExecutablePath,
|
|
resolveWindowsSpawnProgramCandidate,
|
|
resolveWindowsSpawnProgram,
|
|
} from "./windows-spawn.js";
|
|
export type {
|
|
ResolveWindowsSpawnProgramCandidateParams,
|
|
ResolveWindowsSpawnProgramParams,
|
|
WindowsSpawnCandidateResolution,
|
|
WindowsSpawnInvocation,
|
|
WindowsSpawnProgramCandidate,
|
|
WindowsSpawnProgram,
|
|
WindowsSpawnResolution,
|
|
} from "./windows-spawn.js";
|
|
export { resolvePreferredOpenClawTmpDir } from "../infra/tmp-openclaw-dir.js";
|
|
export {
|
|
runPluginCommandWithTimeout,
|
|
type PluginCommandRunOptions,
|
|
type PluginCommandRunResult,
|
|
} from "./run-command.js";
|
|
export { resolveGatewayBindUrl } from "../shared/gateway-bind-url.js";
|
|
export type { GatewayBindUrlResult } from "../shared/gateway-bind-url.js";
|
|
export { resolveTailnetHostWithRunner } from "../shared/tailscale-status.js";
|
|
export type {
|
|
TailscaleStatusCommandResult,
|
|
TailscaleStatusCommandRunner,
|
|
} from "../shared/tailscale-status.js";
|
|
export type { ChatType } from "../channels/chat-type.js";
|
|
/** @deprecated Use ChatType instead */
|
|
export type { RoutePeerKind } from "../routing/resolve-route.js";
|
|
export { resolveAckReaction } from "../agents/identity.js";
|
|
export type { ReplyPayload } from "../auto-reply/types.js";
|
|
export type { ChunkMode } from "../auto-reply/chunk.js";
|
|
export { SILENT_REPLY_TOKEN, isSilentReplyText } from "../auto-reply/tokens.js";
|
|
export { formatInboundFromLabel } from "../auto-reply/envelope.js";
|
|
export {
|
|
formatTrimmedAllowFromEntries,
|
|
formatWhatsAppConfigAllowFromEntries,
|
|
resolveIMessageConfigAllowFrom,
|
|
resolveIMessageConfigDefaultTo,
|
|
resolveWhatsAppConfigAllowFrom,
|
|
resolveWhatsAppConfigDefaultTo,
|
|
} from "./channel-config-helpers.js";
|
|
export {
|
|
approveDevicePairing,
|
|
listDevicePairing,
|
|
rejectDevicePairing,
|
|
} from "../infra/device-pairing.js";
|
|
export { createDedupeCache } from "../infra/dedupe.js";
|
|
export type { DedupeCache } from "../infra/dedupe.js";
|
|
export { createPersistentDedupe } from "./persistent-dedupe.js";
|
|
export type {
|
|
PersistentDedupe,
|
|
PersistentDedupeCheckOptions,
|
|
PersistentDedupeOptions,
|
|
} from "./persistent-dedupe.js";
|
|
export { formatErrorMessage } from "../infra/errors.js";
|
|
export {
|
|
formatUtcTimestamp,
|
|
formatZonedTimestamp,
|
|
resolveTimezone,
|
|
} from "../infra/format-time/format-datetime.js";
|
|
export {
|
|
DEFAULT_WEBHOOK_BODY_TIMEOUT_MS,
|
|
DEFAULT_WEBHOOK_MAX_BODY_BYTES,
|
|
RequestBodyLimitError,
|
|
installRequestBodyLimitGuard,
|
|
isRequestBodyLimitError,
|
|
readJsonBodyWithLimit,
|
|
readRequestBodyWithLimit,
|
|
requestBodyErrorToText,
|
|
} from "../infra/http-body.js";
|
|
export {
|
|
WEBHOOK_ANOMALY_COUNTER_DEFAULTS,
|
|
WEBHOOK_ANOMALY_STATUS_CODES,
|
|
WEBHOOK_RATE_LIMIT_DEFAULTS,
|
|
createBoundedCounter,
|
|
createFixedWindowRateLimiter,
|
|
createWebhookAnomalyTracker,
|
|
} from "./webhook-memory-guards.js";
|
|
export type {
|
|
BoundedCounter,
|
|
FixedWindowRateLimiter,
|
|
WebhookAnomalyTracker,
|
|
} from "./webhook-memory-guards.js";
|
|
|
|
export { fetchWithSsrFGuard } from "../infra/net/fetch-guard.js";
|
|
export {
|
|
SsrFBlockedError,
|
|
isBlockedHostname,
|
|
isBlockedHostnameOrIp,
|
|
isPrivateIpAddress,
|
|
} from "../infra/net/ssrf.js";
|
|
export type { LookupFn, SsrFPolicy } from "../infra/net/ssrf.js";
|
|
export {
|
|
buildHostnameAllowlistPolicyFromSuffixAllowlist,
|
|
isHttpsUrlAllowedByHostnameSuffixAllowlist,
|
|
normalizeHostnameSuffixAllowlist,
|
|
} from "./ssrf-policy.js";
|
|
export { fetchWithBearerAuthScopeFallback } from "./fetch-auth.js";
|
|
export type { ScopeTokenProvider } from "./fetch-auth.js";
|
|
export { rawDataToString } from "../infra/ws.js";
|
|
export { isWSLSync, isWSL2Sync, isWSLEnv } from "../infra/wsl.js";
|
|
export { isTruthyEnvValue } from "../infra/env.js";
|
|
export { resolveToolsBySender } from "../config/group-policy.js";
|
|
export {
|
|
buildPendingHistoryContextFromMap,
|
|
clearHistoryEntries,
|
|
clearHistoryEntriesIfEnabled,
|
|
DEFAULT_GROUP_HISTORY_LIMIT,
|
|
evictOldHistoryKeys,
|
|
recordPendingHistoryEntry,
|
|
recordPendingHistoryEntryIfEnabled,
|
|
} from "../auto-reply/reply/history.js";
|
|
export type { HistoryEntry } from "../auto-reply/reply/history.js";
|
|
export { mergeAllowlist, summarizeMapping } from "../channels/allowlists/resolve-utils.js";
|
|
export {
|
|
resolveMentionGating,
|
|
resolveMentionGatingWithBypass,
|
|
} from "../channels/mention-gating.js";
|
|
export type {
|
|
AckReactionGateParams,
|
|
AckReactionScope,
|
|
WhatsAppAckReactionMode,
|
|
} from "../channels/ack-reactions.js";
|
|
export {
|
|
removeAckReactionAfterReply,
|
|
shouldAckReaction,
|
|
shouldAckReactionForWhatsApp,
|
|
} from "../channels/ack-reactions.js";
|
|
export { createTypingCallbacks } from "../channels/typing.js";
|
|
export { createReplyPrefixContext, createReplyPrefixOptions } from "../channels/reply-prefix.js";
|
|
export { logAckFailure, logInboundDrop, logTypingFailure } from "../channels/logging.js";
|
|
export { resolveChannelMediaMaxBytes } from "../channels/plugins/media-limits.js";
|
|
export type { NormalizedLocation } from "../channels/location.js";
|
|
export { formatLocationText, toLocationContext } from "../channels/location.js";
|
|
export { resolveControlCommandGate } from "../channels/command-gating.js";
|
|
export {
|
|
resolveBlueBubblesGroupRequireMention,
|
|
resolveDiscordGroupRequireMention,
|
|
resolveGoogleChatGroupRequireMention,
|
|
resolveIMessageGroupRequireMention,
|
|
resolveSlackGroupRequireMention,
|
|
resolveTelegramGroupRequireMention,
|
|
resolveWhatsAppGroupRequireMention,
|
|
resolveBlueBubblesGroupToolPolicy,
|
|
resolveDiscordGroupToolPolicy,
|
|
resolveGoogleChatGroupToolPolicy,
|
|
resolveIMessageGroupToolPolicy,
|
|
resolveSlackGroupToolPolicy,
|
|
resolveTelegramGroupToolPolicy,
|
|
resolveWhatsAppGroupToolPolicy,
|
|
} from "../channels/plugins/group-mentions.js";
|
|
export { recordInboundSession } from "../channels/session.js";
|
|
export {
|
|
buildChannelKeyCandidates,
|
|
normalizeChannelSlug,
|
|
resolveChannelEntryMatch,
|
|
resolveChannelEntryMatchWithFallback,
|
|
resolveNestedAllowlistDecision,
|
|
} from "../channels/plugins/channel-config.js";
|
|
export {
|
|
listDiscordDirectoryGroupsFromConfig,
|
|
listDiscordDirectoryPeersFromConfig,
|
|
listSlackDirectoryGroupsFromConfig,
|
|
listSlackDirectoryPeersFromConfig,
|
|
listTelegramDirectoryGroupsFromConfig,
|
|
listTelegramDirectoryPeersFromConfig,
|
|
listWhatsAppDirectoryGroupsFromConfig,
|
|
listWhatsAppDirectoryPeersFromConfig,
|
|
} from "../channels/plugins/directory-config.js";
|
|
export type { AllowlistMatch } from "../channels/plugins/allowlist-match.js";
|
|
export {
|
|
formatAllowlistMatchMeta,
|
|
resolveAllowlistMatchSimple,
|
|
} from "../channels/plugins/allowlist-match.js";
|
|
export { optionalStringEnum, stringEnum } from "../agents/schema/typebox.js";
|
|
export type { PollInput } from "../polls.js";
|
|
|
|
export { buildChannelConfigSchema } from "../channels/plugins/config-schema.js";
|
|
export {
|
|
deleteAccountFromConfigSection,
|
|
setAccountEnabledInConfigSection,
|
|
} from "../channels/plugins/config-helpers.js";
|
|
export {
|
|
applyAccountNameToChannelSection,
|
|
migrateBaseNameToDefaultAccount,
|
|
} from "../channels/plugins/setup-helpers.js";
|
|
export { formatPairingApproveHint } from "../channels/plugins/helpers.js";
|
|
export { PAIRING_APPROVED_MESSAGE } from "../channels/plugins/pairing-message.js";
|
|
|
|
export type {
|
|
ChannelOnboardingAdapter,
|
|
ChannelOnboardingDmPolicy,
|
|
} from "../channels/plugins/onboarding-types.js";
|
|
export {
|
|
addWildcardAllowFrom,
|
|
mergeAllowFromEntries,
|
|
promptAccountId,
|
|
} from "../channels/plugins/onboarding/helpers.js";
|
|
export { promptChannelAccessConfig } from "../channels/plugins/onboarding/channel-access.js";
|
|
|
|
export {
|
|
createActionGate,
|
|
jsonResult,
|
|
readNumberParam,
|
|
readReactionParams,
|
|
readStringParam,
|
|
} from "../agents/tools/common.js";
|
|
export { formatDocsLink } from "../terminal/links.js";
|
|
export {
|
|
DM_GROUP_ACCESS_REASON,
|
|
readStoreAllowFromForDmPolicy,
|
|
resolveDmAllowState,
|
|
resolveDmGroupAccessDecision,
|
|
resolveDmGroupAccessWithCommandGate,
|
|
resolveDmGroupAccessWithLists,
|
|
resolveEffectiveAllowFromLists,
|
|
} from "../security/dm-policy-shared.js";
|
|
export type { DmGroupAccessReasonCode } from "../security/dm-policy-shared.js";
|
|
export type { HookEntry } from "../hooks/types.js";
|
|
export { clamp, escapeRegExp, normalizeE164, safeParseJson, sleep } from "../utils.js";
|
|
export { stripAnsi } from "../terminal/ansi.js";
|
|
export { missingTargetError } from "../infra/outbound/target-errors.js";
|
|
export { registerLogTransport } from "../logging/logger.js";
|
|
export type { LogTransport, LogTransportRecord } from "../logging/logger.js";
|
|
export {
|
|
emitDiagnosticEvent,
|
|
isDiagnosticsEnabled,
|
|
onDiagnosticEvent,
|
|
} from "../infra/diagnostic-events.js";
|
|
export type {
|
|
DiagnosticEventPayload,
|
|
DiagnosticHeartbeatEvent,
|
|
DiagnosticLaneDequeueEvent,
|
|
DiagnosticLaneEnqueueEvent,
|
|
DiagnosticMessageProcessedEvent,
|
|
DiagnosticMessageQueuedEvent,
|
|
DiagnosticRunAttemptEvent,
|
|
DiagnosticSessionState,
|
|
DiagnosticSessionStateEvent,
|
|
DiagnosticSessionStuckEvent,
|
|
DiagnosticUsageEvent,
|
|
DiagnosticWebhookErrorEvent,
|
|
DiagnosticWebhookProcessedEvent,
|
|
DiagnosticWebhookReceivedEvent,
|
|
} from "../infra/diagnostic-events.js";
|
|
export { detectMime, extensionForMime, getFileExtension } from "../media/mime.js";
|
|
export { extractOriginalFilename } from "../media/store.js";
|
|
|
|
// Channel: Discord
|
|
export {
|
|
listDiscordAccountIds,
|
|
resolveDefaultDiscordAccountId,
|
|
resolveDiscordAccount,
|
|
type ResolvedDiscordAccount,
|
|
} from "../discord/accounts.js";
|
|
export { collectDiscordAuditChannelIds } from "../discord/audit.js";
|
|
export { discordOnboardingAdapter } from "../channels/plugins/onboarding/discord.js";
|
|
export {
|
|
looksLikeDiscordTargetId,
|
|
normalizeDiscordMessagingTarget,
|
|
normalizeDiscordOutboundTarget,
|
|
} from "../channels/plugins/normalize/discord.js";
|
|
export { collectDiscordStatusIssues } from "../channels/plugins/status-issues/discord.js";
|
|
|
|
// Channel: iMessage
|
|
export {
|
|
listIMessageAccountIds,
|
|
resolveDefaultIMessageAccountId,
|
|
resolveIMessageAccount,
|
|
type ResolvedIMessageAccount,
|
|
} from "../imessage/accounts.js";
|
|
export { imessageOnboardingAdapter } from "../channels/plugins/onboarding/imessage.js";
|
|
export {
|
|
looksLikeIMessageTargetId,
|
|
normalizeIMessageMessagingTarget,
|
|
} from "../channels/plugins/normalize/imessage.js";
|
|
export {
|
|
parseChatAllowTargetPrefixes,
|
|
parseChatTargetPrefixesOrThrow,
|
|
resolveServicePrefixedAllowTarget,
|
|
resolveServicePrefixedTarget,
|
|
} from "../imessage/target-parsing-helpers.js";
|
|
export type { ParsedChatTarget } from "../imessage/target-parsing-helpers.js";
|
|
|
|
// Channel: Slack
|
|
export {
|
|
listEnabledSlackAccounts,
|
|
listSlackAccountIds,
|
|
resolveDefaultSlackAccountId,
|
|
resolveSlackAccount,
|
|
resolveSlackReplyToMode,
|
|
type ResolvedSlackAccount,
|
|
} from "../slack/accounts.js";
|
|
export { extractSlackToolSend, listSlackMessageActions } from "../slack/message-actions.js";
|
|
export { slackOnboardingAdapter } from "../channels/plugins/onboarding/slack.js";
|
|
export {
|
|
looksLikeSlackTargetId,
|
|
normalizeSlackMessagingTarget,
|
|
} from "../channels/plugins/normalize/slack.js";
|
|
export { buildSlackThreadingToolContext } from "../slack/threading-tool-context.js";
|
|
|
|
// Channel: Telegram
|
|
export {
|
|
listTelegramAccountIds,
|
|
resolveDefaultTelegramAccountId,
|
|
resolveTelegramAccount,
|
|
type ResolvedTelegramAccount,
|
|
} from "../telegram/accounts.js";
|
|
export { telegramOnboardingAdapter } from "../channels/plugins/onboarding/telegram.js";
|
|
export {
|
|
looksLikeTelegramTargetId,
|
|
normalizeTelegramMessagingTarget,
|
|
} from "../channels/plugins/normalize/telegram.js";
|
|
export { collectTelegramStatusIssues } from "../channels/plugins/status-issues/telegram.js";
|
|
export {
|
|
parseTelegramReplyToMessageId,
|
|
parseTelegramThreadId,
|
|
} from "../telegram/outbound-params.js";
|
|
export { type TelegramProbe } from "../telegram/probe.js";
|
|
|
|
// Channel: Signal
|
|
export {
|
|
listSignalAccountIds,
|
|
resolveDefaultSignalAccountId,
|
|
resolveSignalAccount,
|
|
type ResolvedSignalAccount,
|
|
} from "../signal/accounts.js";
|
|
export { signalOnboardingAdapter } from "../channels/plugins/onboarding/signal.js";
|
|
export {
|
|
looksLikeSignalTargetId,
|
|
normalizeSignalMessagingTarget,
|
|
} from "../channels/plugins/normalize/signal.js";
|
|
|
|
// Channel: WhatsApp
|
|
export {
|
|
listWhatsAppAccountIds,
|
|
resolveDefaultWhatsAppAccountId,
|
|
resolveWhatsAppAccount,
|
|
type ResolvedWhatsAppAccount,
|
|
} from "../web/accounts.js";
|
|
export { isWhatsAppGroupJid, normalizeWhatsAppTarget } from "../whatsapp/normalize.js";
|
|
export { resolveWhatsAppOutboundTarget } from "../whatsapp/resolve-outbound-target.js";
|
|
export { whatsappOnboardingAdapter } from "../channels/plugins/onboarding/whatsapp.js";
|
|
export { resolveWhatsAppHeartbeatRecipients } from "../channels/plugins/whatsapp-heartbeat.js";
|
|
export {
|
|
looksLikeWhatsAppTargetId,
|
|
normalizeWhatsAppAllowFromEntries,
|
|
normalizeWhatsAppMessagingTarget,
|
|
} from "../channels/plugins/normalize/whatsapp.js";
|
|
export {
|
|
resolveWhatsAppGroupIntroHint,
|
|
resolveWhatsAppMentionStripPatterns,
|
|
} from "../channels/plugins/whatsapp-shared.js";
|
|
export { collectWhatsAppStatusIssues } from "../channels/plugins/status-issues/whatsapp.js";
|
|
|
|
// Channel: BlueBubbles
|
|
export { collectBlueBubblesStatusIssues } from "../channels/plugins/status-issues/bluebubbles.js";
|
|
|
|
// Channel: LINE
|
|
export {
|
|
listLineAccountIds,
|
|
normalizeAccountId as normalizeLineAccountId,
|
|
resolveDefaultLineAccountId,
|
|
resolveLineAccount,
|
|
} from "../line/accounts.js";
|
|
export { LineConfigSchema } from "../line/config-schema.js";
|
|
export type {
|
|
LineConfig,
|
|
LineAccountConfig,
|
|
ResolvedLineAccount,
|
|
LineChannelData,
|
|
} from "../line/types.js";
|
|
export {
|
|
createInfoCard,
|
|
createListCard,
|
|
createImageCard,
|
|
createActionCard,
|
|
createReceiptCard,
|
|
type CardAction,
|
|
type ListItem,
|
|
} from "../line/flex-templates.js";
|
|
export {
|
|
processLineMessage,
|
|
hasMarkdownToConvert,
|
|
stripMarkdown,
|
|
} from "../line/markdown-to-line.js";
|
|
export type { ProcessedLineMessage } from "../line/markdown-to-line.js";
|
|
|
|
// Media utilities
|
|
export { loadWebMedia, type WebMediaResult } from "../web/media.js";
|
|
|
|
// Security utilities
|
|
export { redactSensitiveText } from "../logging/redact.js";
|