import type { BlockStreamingCoalesceConfig, ContextVisibilityMode, DmPolicy, GroupPolicy, MarkdownConfig } from "./types.base.js"; import type { ChannelHealthMonitorConfig, ChannelHeartbeatVisibilityConfig } from "./types.channel-health.js"; import type { DmConfig } from "./types.messages.js"; import type { GroupToolPolicyBySenderConfig, GroupToolPolicyConfig } from "./types.tools.js"; export type IMessageActionConfig = { reactions?: boolean; edit?: boolean; unsend?: boolean; reply?: boolean; sendWithEffect?: boolean; renameGroup?: boolean; setGroupIcon?: boolean; addParticipant?: boolean; removeParticipant?: boolean; leaveGroup?: boolean; sendAttachment?: boolean; }; export type IMessageReactionNotificationMode = "off" | "own" | "all"; export type IMessageAccountConfig = { /** Optional display name for this account (used in CLI/UI lists). */ name?: string; /** Optional provider capability tags used for agent/runtime guidance. */ capabilities?: string[]; /** Markdown formatting overrides (tables). */ markdown?: MarkdownConfig; /** Allow channel-initiated config writes (default: true). */ configWrites?: boolean; /** If false, do not start this iMessage account. Default: true. */ enabled?: boolean; /** imsg CLI binary path (default: imsg). */ cliPath?: string; /** Optional Messages db path override. */ dbPath?: string; /** Remote SSH host token for SCP attachment fetches (`host` or `user@host`). */ remoteHost?: string; /** Enable or disable private API message actions. */ actions?: IMessageActionConfig; /** Optional default send service (imessage|sms|auto). */ service?: "imessage" | "sms" | "auto"; /** Optional default region (used when sending SMS). */ region?: string; /** Direct message access policy (default: pairing). */ dmPolicy?: DmPolicy; /** Optional allowlist for inbound handles or chat_id targets. */ allowFrom?: Array; /** Default delivery target for CLI --deliver when no explicit --reply-to is provided. */ defaultTo?: string; /** Optional allowlist for group senders or chat_id targets. */ groupAllowFrom?: Array; /** * Controls how group messages are handled: * - "open": groups bypass allowFrom; mention-gating applies * - "disabled": block all group messages entirely * - "allowlist": only allow group messages from senders in groupAllowFrom/allowFrom */ groupPolicy?: GroupPolicy; /** Supplemental context visibility policy (all|allowlist|allowlist_quote). */ contextVisibility?: ContextVisibilityMode; /** Max group messages to keep as history context (0 disables). */ historyLimit?: number; /** Max DM turns to keep as history context. */ dmHistoryLimit?: number; /** Per-DM config overrides keyed by user ID. */ dms?: Record; /** Include attachments + reactions in watch payloads. */ includeAttachments?: boolean; /** Allowed local iMessage attachment roots (supports single-segment `*` wildcards). */ attachmentRoots?: string[]; /** Allowed remote iMessage attachment roots for SCP fetches (supports `*`). */ remoteAttachmentRoots?: string[]; /** Max outbound media size in MB. */ mediaMaxMb?: number; /** Timeout for probe/RPC operations in milliseconds (default: 10000). */ probeTimeoutMs?: number; /** Outbound text chunk size (chars). Default: 4000. */ textChunkLimit?: number; /** Chunking mode: "length" (default) splits by size; "newline" splits on every newline. */ chunkMode?: "length" | "newline"; blockStreaming?: boolean; /** Merge streamed block replies before sending. */ blockStreamingCoalesce?: BlockStreamingCoalesceConfig; /** When private API is available, mark inbound chats read before dispatch (default: true). */ sendReadReceipts?: boolean; /** * Controls inbound tapback notifications: * - "off": ignore tapbacks * - "own" (default): notify only when users react to bot-authored messages * - "all": notify for all inbound tapbacks from authorized senders */ reactionNotifications?: IMessageReactionNotificationMode; /** * Merge consecutive same-sender DM rows from `chat.db` into a single agent * turn, so Apple's split-send (` ` arriving as two separate * rows ~0.8-2.0 s apart) lands as one merged message. DM-only — group chats * keep instant per-message dispatch. Widens the default inbound debounce * window to 2500 ms when enabled without an explicit * `messages.inbound.byChannel.imessage`. Default: `false`. */ coalesceSameSenderDms?: boolean; groups?: Record; /** * Catchup: replay inbound messages that arrived in `chat.db` while the * gateway was offline (crash, restart, mac sleep). Disabled by default. * See https://github.com/klaw/klaw/issues/78649. */ catchup?: { /** Master switch. Default `false`. */ enabled?: boolean; /** * Maximum age of replayable messages in minutes. Messages older than * `now - maxAgeMinutes` are skipped even when the cursor is older. * Defense against runaway replay (the inverse of #62761). Default * `120` (2 h). Clamp `[1, 720]`. */ maxAgeMinutes?: number; /** * Maximum messages to replay per catchup pass. Default `50`. Clamp * `[1, 500]`. */ perRunLimit?: number; /** * On first run when no cursor exists, look back this many minutes. * Default `30`. */ firstRunLookbackMinutes?: number; /** * Per-message retry ceiling. After this many consecutive failed * dispatch attempts against the same message guid, catchup logs a * `warn` and force-advances the cursor past the wedged message. * Default `10`. Clamp `[1, 1000]`. */ maxFailureRetries?: number; }; /** Heartbeat visibility settings for this channel. */ heartbeat?: ChannelHeartbeatVisibilityConfig; /** Channel health monitor overrides for this channel/account. */ healthMonitor?: ChannelHealthMonitorConfig; /** Outbound response prefix override for this channel/account. */ responsePrefix?: string; }; export type IMessageConfig = { /** Optional per-account iMessage configuration (multi-account). */ accounts?: Record; /** Optional default account id when multiple accounts are configured. */ defaultAccount?: string; } & IMessageAccountConfig;