2026-01-04 07:05:04 +01:00
export type ReplyMode = "text" | "command" ;
2026-01-07 21:58:54 +00:00
export type TypingMode = "never" | "instant" | "thinking" | "message" ;
2026-01-04 07:05:04 +01:00
export type SessionScope = "per-sender" | "global" ;
export type ReplyToMode = "off" | "first" | "all" ;
2026-01-06 06:40:42 +00:00
export type GroupPolicy = "open" | "disabled" | "allowlist" ;
2026-01-06 17:51:38 +01:00
export type DmPolicy = "pairing" | "allowlist" | "open" | "disabled" ;
2026-01-04 07:05:04 +01:00
2026-01-07 17:48:19 +00:00
export type OutboundRetryConfig = {
/** Max retry attempts for outbound requests (default: 3). */
attempts? : number ;
/** Minimum retry delay in ms (default: 300-500ms depending on provider). */
minDelayMs? : number ;
/** Maximum retry delay cap in ms (default: 30000). */
maxDelayMs? : number ;
/** Jitter factor (0-1) applied to delays (default: 0.1). */
jitter? : number ;
} ;
2026-01-09 18:19:55 +00:00
export type BlockStreamingCoalesceConfig = {
minChars? : number ;
maxChars? : number ;
idleMs? : number ;
} ;
2026-01-10 18:30:06 +01:00
export type BlockStreamingChunkConfig = {
minChars? : number ;
maxChars? : number ;
breakPreference ? : "paragraph" | "newline" | "sentence" ;
} ;
2026-01-07 22:56:46 -05:00
export type HumanDelayConfig = {
/** Delay style for block replies (off|natural|custom). */
mode ? : "off" | "natural" | "custom" ;
/** Minimum delay in milliseconds (default: 800). */
minMs? : number ;
/** Maximum delay in milliseconds (default: 2500). */
maxMs? : number ;
} ;
2026-01-04 07:05:04 +01:00
export type SessionSendPolicyAction = "allow" | "deny" ;
export type SessionSendPolicyMatch = {
2026-01-13 06:16:43 +00:00
channel? : string ;
2026-01-04 07:05:04 +01:00
chatType ? : "direct" | "group" | "room" ;
keyPrefix? : string ;
} ;
export type SessionSendPolicyRule = {
action : SessionSendPolicyAction ;
match? : SessionSendPolicyMatch ;
} ;
export type SessionSendPolicyConfig = {
default ? : SessionSendPolicyAction ;
rules? : SessionSendPolicyRule [ ] ;
} ;
export type SessionConfig = {
scope? : SessionScope ;
resetTriggers? : string [ ] ;
idleMinutes? : number ;
heartbeatIdleMinutes? : number ;
store? : string ;
typingIntervalSeconds? : number ;
2026-01-07 22:18:11 +00:00
typingMode? : TypingMode ;
2026-01-04 07:05:04 +01:00
mainKey? : string ;
sendPolicy? : SessionSendPolicyConfig ;
agentToAgent ? : {
/** Max ping-pong turns between requester/target (0– 5). Default: 5. */
maxPingPongTurns? : number ;
} ;
} ;
export type LoggingConfig = {
level ? : "silent" | "fatal" | "error" | "warn" | "info" | "debug" | "trace" ;
file? : string ;
consoleLevel ? :
| "silent"
| "fatal"
| "error"
| "warn"
| "info"
| "debug"
| "trace" ;
consoleStyle ? : "pretty" | "compact" | "json" ;
2026-01-06 00:41:12 +01:00
/** Redact sensitive tokens in tool summaries. Default: "tools". */
redactSensitive ? : "off" | "tools" ;
/** Regex patterns used to redact sensitive tokens (defaults apply when unset). */
redactPatterns? : string [ ] ;
2026-01-04 07:05:04 +01:00
} ;
export type WebReconnectConfig = {
initialMs? : number ;
maxMs? : number ;
factor? : number ;
jitter? : number ;
maxAttempts? : number ; // 0 = unlimited
} ;
export type WebConfig = {
/** If false, do not start the WhatsApp web provider. Default: true. */
enabled? : boolean ;
heartbeatSeconds? : number ;
reconnect? : WebReconnectConfig ;
} ;
2026-01-11 11:45:25 +00:00
// Provider docking: allowlists keyed by provider id (and internal "webchat").
export type AgentElevatedAllowFromConfig = Partial <
Record < string , Array < string | number > >
> ;
2026-01-04 07:05:04 +01:00
2026-01-09 12:44:23 +00:00
export type IdentityConfig = {
name? : string ;
theme? : string ;
emoji? : string ;
} ;
2026-01-06 20:42:05 -05:00
export type WhatsAppActionConfig = {
reactions? : boolean ;
2026-01-07 03:24:56 -03:00
sendMessage? : boolean ;
2026-01-09 20:46:11 +01:00
polls? : boolean ;
2026-01-06 20:42:05 -05:00
} ;
2026-01-04 07:05:04 +01:00
export type WhatsAppConfig = {
2026-01-06 08:40:21 +00:00
/** Optional per-account WhatsApp configuration (multi-account). */
accounts? : Record < string , WhatsAppAccountConfig > ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-09 19:28:59 +00:00
/ * *
* Inbound message prefix ( WhatsApp only ) .
* Default : ` [{agents.list[].identity.name}] ` ( or ` [clawdbot] ` ) when allowFrom is empty , else ` "" ` .
* /
messagePrefix? : string ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
dmPolicy? : DmPolicy ;
2026-01-07 20:40:24 +01:00
/ * *
* Same - phone setup ( bot uses your personal WhatsApp number ) .
* /
selfChatMode? : boolean ;
2026-01-04 07:05:04 +01:00
/** Optional allowlist for WhatsApp direct chats (E.164). */
allowFrom? : string [ ] ;
2026-01-06 06:40:42 +00:00
/** Optional allowlist for WhatsApp group senders (E.164). */
groupAllowFrom? : string [ ] ;
2026-01-06 01:41:19 -03:00
/ * *
* Controls how group messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : groups bypass allowFrom , only mention - gating applies
2026-01-06 01:41:19 -03:00
* - "disabled" : block all group messages entirely
2026-01-06 06:40:42 +00:00
* - "allowlist" : only allow group messages from senders in groupAllowFrom / allowFrom
2026-01-06 01:41:19 -03:00
* /
2026-01-06 06:40:42 +00:00
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max group messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-04 07:05:04 +01:00
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit? : number ;
2026-01-08 17:22:35 +00:00
/** Maximum media file size in MB. Default: 50. */
mediaMaxMb? : number ;
2026-01-09 11:57:43 +13:00
/** Disable block streaming for this account. */
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-06 20:42:05 -05:00
/** Per-action tool gating (default: true for all). */
actions? : WhatsAppActionConfig ;
2026-01-04 07:05:04 +01:00
groups? : Record <
string ,
{
requireMention? : boolean ;
}
> ;
2026-01-10 00:54:49 +01:00
/** Acknowledgment reaction sent immediately upon message receipt. */
ackReaction ? : {
/** Emoji to use for acknowledgment (e.g., "👀"). Empty = disabled. */
emoji? : string ;
/** Send reactions in direct chats. Default: true. */
direct? : boolean ;
/ * *
* Send reactions in group chats :
* - "always" : react to all group messages
* - "mentions" : react only when bot is mentioned
* - "never" : never react in groups
* Default : "mentions"
* /
group ? : "always" | "mentions" | "never" ;
} ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-06 08:40:21 +00:00
export type WhatsAppAccountConfig = {
2026-01-08 01:18:37 +01:00
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-06 08:40:21 +00:00
/** If false, do not start this WhatsApp account provider. Default: true. */
enabled? : boolean ;
2026-01-09 19:28:59 +00:00
/** Inbound message prefix override for this account (WhatsApp only). */
messagePrefix? : string ;
2026-01-06 08:40:21 +00:00
/** Override auth directory (Baileys multi-file auth state). */
authDir? : string ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
dmPolicy? : DmPolicy ;
2026-01-09 22:58:11 +00:00
/** Same-phone setup for this account (bot uses your personal WhatsApp number). */
2026-01-07 20:40:24 +01:00
selfChatMode? : boolean ;
2026-01-06 08:40:21 +00:00
allowFrom? : string [ ] ;
groupAllowFrom? : string [ ] ;
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max group messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-06 08:40:21 +00:00
textChunkLimit? : number ;
2026-01-08 17:22:35 +00:00
mediaMaxMb? : number ;
2026-01-09 11:57:43 +13:00
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-06 08:40:21 +00:00
groups? : Record <
string ,
{
requireMention? : boolean ;
}
> ;
2026-01-10 00:54:49 +01:00
/** Acknowledgment reaction sent immediately upon message receipt. */
ackReaction ? : {
/** Emoji to use for acknowledgment (e.g., "👀"). Empty = disabled. */
emoji? : string ;
/** Send reactions in direct chats. Default: true. */
direct? : boolean ;
/ * *
* Send reactions in group chats :
* - "always" : react to all group messages
* - "mentions" : react only when bot is mentioned
* - "never" : never react in groups
* Default : "mentions"
* /
group ? : "always" | "mentions" | "never" ;
} ;
2026-01-06 08:40:21 +00:00
} ;
2026-01-04 07:05:04 +01:00
export type BrowserProfileConfig = {
/** CDP port for this profile. Allocated once at creation, persisted permanently. */
cdpPort? : number ;
/** CDP URL for this profile (use for remote Chrome). */
cdpUrl? : string ;
/** Profile color (hex). Auto-assigned at creation. */
color : string ;
} ;
export type BrowserConfig = {
enabled? : boolean ;
/** Base URL of the clawd browser control server. Default: http://127.0.0.1:18791 */
controlUrl? : string ;
/** Base URL of the CDP endpoint. Default: controlUrl with port + 1. */
cdpUrl? : string ;
/** Accent color for the clawd browser profile (hex). Default: #FF4500 */
color? : string ;
/** Override the browser executable path (macOS/Linux). */
executablePath? : string ;
/** Start Chrome headless (best-effort). Default: false */
headless? : boolean ;
/** Pass --no-sandbox to Chrome (Linux containers). Default: false */
noSandbox? : boolean ;
/** If true: never launch; only attach to an existing browser. Default: false */
attachOnly? : boolean ;
/** Default profile to use when profile param is omitted. Default: "clawd" */
defaultProfile? : string ;
/** Named browser profiles with explicit CDP ports or URLs. */
profiles? : Record < string , BrowserProfileConfig > ;
} ;
export type CronConfig = {
enabled? : boolean ;
store? : string ;
maxConcurrentRuns? : number ;
} ;
export type HookMappingMatch = {
path? : string ;
source? : string ;
} ;
export type HookMappingTransform = {
module : string ;
export ? : string ;
} ;
export type HookMappingConfig = {
id? : string ;
match? : HookMappingMatch ;
action ? : "wake" | "agent" ;
wakeMode ? : "now" | "next-heartbeat" ;
name? : string ;
sessionKey? : string ;
messageTemplate? : string ;
textTemplate? : string ;
deliver? : boolean ;
2026-01-13 06:16:43 +00:00
channel ? :
2026-01-04 07:05:04 +01:00
| "last"
| "whatsapp"
| "telegram"
| "discord"
2026-01-03 23:12:11 -06:00
| "slack"
2026-01-04 07:05:04 +01:00
| "signal"
2026-01-07 21:29:39 +03:00
| "imessage"
| "msteams" ;
2026-01-04 07:05:04 +01:00
to? : string ;
2026-01-08 09:33:27 +00:00
/** Override model for this hook (provider/model or alias). */
model? : string ;
2026-01-04 07:05:04 +01:00
thinking? : string ;
timeoutSeconds? : number ;
transform? : HookMappingTransform ;
} ;
export type HooksGmailTailscaleMode = "off" | "serve" | "funnel" ;
export type HooksGmailConfig = {
account? : string ;
label? : string ;
topic? : string ;
subscription? : string ;
pushToken? : string ;
hookUrl? : string ;
includeBody? : boolean ;
maxBytes? : number ;
renewEveryMinutes? : number ;
serve ? : {
bind? : string ;
port? : number ;
path? : string ;
} ;
tailscale ? : {
mode? : HooksGmailTailscaleMode ;
path? : string ;
2026-01-10 19:19:30 +01:00
/** Optional tailscale serve/funnel target (port, host:port, or full URL). */
target? : string ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-09 19:59:45 +01:00
/** Optional model override for Gmail hook processing (provider/model or alias). */
model? : string ;
/** Optional thinking level override for Gmail hook processing. */
thinking ? : "off" | "minimal" | "low" | "medium" | "high" ;
2026-01-04 07:05:04 +01:00
} ;
export type HooksConfig = {
enabled? : boolean ;
path? : string ;
token? : string ;
maxBodyBytes? : number ;
presets? : string [ ] ;
transformsDir? : string ;
mappings? : HookMappingConfig [ ] ;
gmail? : HooksGmailConfig ;
} ;
2026-01-07 04:10:13 +01:00
export type TelegramActionConfig = {
reactions? : boolean ;
2026-01-07 03:24:56 -03:00
sendMessage? : boolean ;
2026-01-07 04:10:13 +01:00
} ;
2026-01-08 01:18:37 +01:00
export type TelegramAccountConfig = {
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-12 21:49:44 +00:00
/** Override native command registration for Telegram (bool or "auto"). */
commands? : ProviderCommandsConfig ;
2026-01-06 17:51:38 +01:00
/ * *
* Controls how Telegram direct chats ( DMs ) are handled :
* - "pairing" ( default ) : unknown senders get a pairing code ; owner must approve
* - "allowlist" : only allow senders in allowFrom ( or paired allow store )
* - "open" : allow all inbound DMs ( requires allowFrom to include "*" )
* - "disabled" : ignore all inbound DMs
* /
dmPolicy? : DmPolicy ;
2026-01-08 01:18:37 +01:00
/** If false, do not start this Telegram account. Default: true. */
2026-01-04 07:05:04 +01:00
enabled? : boolean ;
botToken? : string ;
2026-01-08 01:18:37 +01:00
/** Path to file containing bot token (for secret managers like agenix). */
2026-01-04 07:05:04 +01:00
tokenFile? : string ;
/** Control reply threading when reply tags are present (off|first|all). */
replyToMode? : ReplyToMode ;
2026-01-07 11:23:04 +01:00
groups? : Record < string , TelegramGroupConfig > ;
2026-01-04 07:05:04 +01:00
allowFrom? : Array < string | number > ;
2026-01-06 06:40:42 +00:00
/** Optional allowlist for Telegram group senders (user ids or usernames). */
groupAllowFrom? : Array < string | number > ;
2026-01-06 01:41:19 -03:00
/ * *
* Controls how group messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : groups bypass allowFrom , only mention - gating applies
2026-01-06 01:41:19 -03:00
* - "disabled" : block all group messages entirely
2026-01-06 06:40:42 +00:00
* - "allowlist" : only allow group messages from senders in groupAllowFrom / allowFrom
2026-01-06 01:41:19 -03:00
* /
2026-01-06 06:40:42 +00:00
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max group messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-04 07:05:04 +01:00
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit? : number ;
2026-01-09 11:57:43 +13:00
/** Disable block streaming for this account. */
blockStreaming? : boolean ;
2026-01-10 18:30:06 +01:00
/** Chunking config for draft streaming in `streamMode: "block"`. */
draftChunk? : BlockStreamingChunkConfig ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-07 11:08:11 +01:00
/** Draft streaming mode for Telegram (off|partial|block). Default: partial. */
streamMode ? : "off" | "partial" | "block" ;
2026-01-04 07:05:04 +01:00
mediaMaxMb? : number ;
2026-01-07 17:48:19 +00:00
/** Retry policy for outbound Telegram API calls. */
retry? : OutboundRetryConfig ;
2026-01-04 07:05:04 +01:00
proxy? : string ;
webhookUrl? : string ;
webhookSecret? : string ;
webhookPath? : string ;
2026-01-07 04:10:13 +01:00
/** Per-action tool gating (default: true for all). */
actions? : TelegramActionConfig ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-08 01:18:37 +01:00
export type TelegramTopicConfig = {
requireMention? : boolean ;
/** If specified, only load these skills for this topic. Omit = all skills; empty = no skills. */
skills? : string [ ] ;
/** If false, disable the bot for this topic. */
enabled? : boolean ;
/** Optional allowlist for topic senders (ids or usernames). */
allowFrom? : Array < string | number > ;
/** Optional system prompt snippet for this topic. */
systemPrompt? : string ;
} ;
export type TelegramGroupConfig = {
requireMention? : boolean ;
/** If specified, only load these skills for this group (when no topic). Omit = all skills; empty = no skills. */
skills? : string [ ] ;
/** Per-topic configuration (key is message_thread_id as string) */
topics? : Record < string , TelegramTopicConfig > ;
/** If false, disable the bot for this group (and its topics). */
enabled? : boolean ;
/** Optional allowlist for group senders (ids or usernames). */
allowFrom? : Array < string | number > ;
/** Optional system prompt snippet for this group. */
systemPrompt? : string ;
} ;
export type TelegramConfig = {
/** Optional per-account Telegram configuration (multi-account). */
accounts? : Record < string , TelegramAccountConfig > ;
} & TelegramAccountConfig ;
2026-01-04 07:05:04 +01:00
export type DiscordDmConfig = {
/** If false, ignore all incoming Discord DMs. Default: true. */
enabled? : boolean ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
policy? : DmPolicy ;
2026-01-04 07:05:04 +01:00
/** Allowlist for DM senders (ids or names). */
allowFrom? : Array < string | number > ;
/** If true, allow group DMs (default: false). */
groupEnabled? : boolean ;
/** Optional allowlist for group DM channels (ids or slugs). */
groupChannels? : Array < string | number > ;
} ;
export type DiscordGuildChannelConfig = {
allow? : boolean ;
requireMention? : boolean ;
2026-01-07 11:23:04 +01:00
/** If specified, only load these skills for this channel. Omit = all skills; empty = no skills. */
skills? : string [ ] ;
/** If false, disable the bot for this channel. */
enabled? : boolean ;
/** Optional allowlist for channel senders (ids or names). */
users? : Array < string | number > ;
/** Optional system prompt snippet for this channel. */
systemPrompt? : string ;
2026-01-04 07:05:04 +01:00
} ;
export type DiscordReactionNotificationMode =
| "off"
| "own"
| "all"
| "allowlist" ;
export type DiscordGuildEntry = {
slug? : string ;
requireMention? : boolean ;
/** Reaction notification mode (off|own|all|allowlist). Default: own. */
reactionNotifications? : DiscordReactionNotificationMode ;
users? : Array < string | number > ;
channels? : Record < string , DiscordGuildChannelConfig > ;
} ;
export type DiscordActionConfig = {
reactions? : boolean ;
stickers? : boolean ;
polls? : boolean ;
permissions? : boolean ;
messages? : boolean ;
threads? : boolean ;
pins? : boolean ;
search? : boolean ;
memberInfo? : boolean ;
roleInfo? : boolean ;
roles? : boolean ;
channelInfo? : boolean ;
voiceStatus? : boolean ;
events? : boolean ;
moderation? : boolean ;
emojiUploads? : boolean ;
stickerUploads? : boolean ;
2026-01-09 12:05:58 -05:00
channels? : boolean ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-08 01:18:37 +01:00
export type DiscordAccountConfig = {
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-12 21:49:44 +00:00
/** Override native command registration for Discord (bool or "auto"). */
commands? : ProviderCommandsConfig ;
2026-01-08 01:18:37 +01:00
/** If false, do not start this Discord account. Default: true. */
2026-01-04 07:05:04 +01:00
enabled? : boolean ;
token? : string ;
2026-01-12 16:30:05 -05:00
/** Allow bot-authored messages to trigger replies (default: false). */
allowBots? : boolean ;
2026-01-06 06:40:42 +00:00
/ * *
* Controls how guild channel messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : guild channels bypass allowlists ; mention - gating applies
2026-01-06 06:40:42 +00:00
* - "disabled" : block all guild channel messages
* - "allowlist" : only allow channels present in discord . guilds . * . channels
* /
groupPolicy? : GroupPolicy ;
2026-01-04 07:05:04 +01:00
/** Outbound text chunk size (chars). Default: 2000. */
textChunkLimit? : number ;
2026-01-09 11:57:43 +13:00
/** Disable block streaming for this account. */
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-08 04:02:04 +01:00
/ * *
* Soft max line count per Discord message .
* Discord clients can clip / collapse very tall messages ; splitting by lines
* keeps replies readable in - channel . Default : 17.
* /
maxLinesPerMessage? : number ;
2026-01-04 07:05:04 +01:00
mediaMaxMb? : number ;
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-07 17:48:19 +00:00
/** Retry policy for outbound Discord API calls. */
retry? : OutboundRetryConfig ;
2026-01-04 07:05:04 +01:00
/** Per-action tool gating (default: true for all). */
actions? : DiscordActionConfig ;
/** Control reply threading when reply tags are present (off|first|all). */
replyToMode? : ReplyToMode ;
dm? : DiscordDmConfig ;
/** New per-guild config keyed by guild id or slug. */
guilds? : Record < string , DiscordGuildEntry > ;
} ;
2026-01-08 01:18:37 +01:00
export type DiscordConfig = {
/** Optional per-account Discord configuration (multi-account). */
accounts? : Record < string , DiscordAccountConfig > ;
} & DiscordAccountConfig ;
2026-01-03 23:12:11 -06:00
export type SlackDmConfig = {
/** If false, ignore all incoming Slack DMs. Default: true. */
enabled? : boolean ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
policy? : DmPolicy ;
2026-01-03 23:12:11 -06:00
/** Allowlist for DM senders (ids). */
allowFrom? : Array < string | number > ;
/** If true, allow group DMs (default: false). */
groupEnabled? : boolean ;
/** Optional allowlist for group DM channels (ids or slugs). */
groupChannels? : Array < string | number > ;
} ;
export type SlackChannelConfig = {
2026-01-07 11:23:04 +01:00
/** If false, disable the bot in this channel. (Alias for allow: false.) */
enabled? : boolean ;
/** Legacy channel allow toggle; prefer enabled. */
2026-01-03 23:12:11 -06:00
allow? : boolean ;
2026-01-07 11:23:04 +01:00
/** Require mentioning the bot to trigger replies. */
2026-01-03 23:12:11 -06:00
requireMention? : boolean ;
2026-01-08 08:49:16 +01:00
/** Allow bot-authored messages to trigger replies (default: false). */
allowBots? : boolean ;
2026-01-07 11:23:04 +01:00
/** Allowlist of users that can invoke the bot in this channel. */
users? : Array < string | number > ;
/** Optional skill filter for this channel. */
skills? : string [ ] ;
/** Optional system prompt for this channel. */
systemPrompt? : string ;
2026-01-03 23:12:11 -06:00
} ;
2026-01-09 23:53:28 +01:00
export type SignalReactionNotificationMode =
| "off"
| "own"
| "all"
| "allowlist" ;
2026-01-03 23:12:11 -06:00
export type SlackReactionNotificationMode = "off" | "own" | "all" | "allowlist" ;
export type SlackActionConfig = {
reactions? : boolean ;
messages? : boolean ;
pins? : boolean ;
search? : boolean ;
permissions? : boolean ;
memberInfo? : boolean ;
channelInfo? : boolean ;
emojiList? : boolean ;
} ;
export type SlackSlashCommandConfig = {
/** Enable handling for the configured slash command (default: false). */
enabled? : boolean ;
/** Slash command name (default: "clawd"). */
name? : string ;
/** Session key prefix for slash commands (default: "slack:slash"). */
sessionPrefix? : string ;
/** Reply ephemerally (default: true). */
ephemeral? : boolean ;
} ;
2026-01-08 01:18:37 +01:00
export type SlackAccountConfig = {
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-12 21:49:44 +00:00
/** Override native command registration for Slack (bool or "auto"). */
commands? : ProviderCommandsConfig ;
2026-01-08 01:18:37 +01:00
/** If false, do not start this Slack account. Default: true. */
2026-01-03 23:12:11 -06:00
enabled? : boolean ;
botToken? : string ;
appToken? : string ;
2026-01-08 08:49:16 +01:00
/** Allow bot-authored messages to trigger replies (default: false). */
allowBots? : boolean ;
2026-01-06 06:40:42 +00:00
/ * *
* Controls how channel messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : channels bypass allowlists ; mention - gating applies
2026-01-06 06:40:42 +00:00
* - "disabled" : block all channel messages
2026-01-13 06:16:43 +00:00
* - "allowlist" : only allow channels present in channels . slack . channels
2026-01-06 06:40:42 +00:00
* /
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max channel messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-03 23:12:11 -06:00
textChunkLimit? : number ;
2026-01-09 11:57:43 +13:00
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-03 23:12:11 -06:00
mediaMaxMb? : number ;
/** Reaction notification mode (off|own|all|allowlist). Default: own. */
reactionNotifications? : SlackReactionNotificationMode ;
/** Allowlist for reaction notifications when mode is allowlist. */
reactionAllowlist? : Array < string | number > ;
2026-01-08 00:50:29 +00:00
/** Control reply threading when reply tags are present (off|first|all). */
replyToMode? : ReplyToMode ;
2026-01-03 23:12:11 -06:00
actions? : SlackActionConfig ;
slashCommand? : SlackSlashCommandConfig ;
dm? : SlackDmConfig ;
channels? : Record < string , SlackChannelConfig > ;
} ;
2026-01-08 01:18:37 +01:00
export type SlackConfig = {
/** Optional per-account Slack configuration (multi-account). */
accounts? : Record < string , SlackAccountConfig > ;
} & SlackAccountConfig ;
export type SignalAccountConfig = {
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-08 01:18:37 +01:00
/** If false, do not start this Signal account. Default: true. */
2026-01-04 07:05:04 +01:00
enabled? : boolean ;
/** Optional explicit E.164 account for signal-cli. */
account? : string ;
/** Optional full base URL for signal-cli HTTP daemon. */
httpUrl? : string ;
/** HTTP host for signal-cli daemon (default 127.0.0.1). */
httpHost? : string ;
/** HTTP port for signal-cli daemon (default 8080). */
httpPort? : number ;
/** signal-cli binary path (default: signal-cli). */
cliPath? : string ;
/** Auto-start signal-cli daemon (default: true if httpUrl not set). */
autoStart? : boolean ;
receiveMode ? : "on-start" | "manual" ;
ignoreAttachments? : boolean ;
ignoreStories? : boolean ;
sendReadReceipts? : boolean ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
dmPolicy? : DmPolicy ;
2026-01-04 07:05:04 +01:00
allowFrom? : Array < string | number > ;
2026-01-06 06:40:42 +00:00
/** Optional allowlist for Signal group senders (E.164). */
groupAllowFrom? : Array < string | number > ;
/ * *
* Controls how group messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : groups bypass allowFrom , no extra gating
2026-01-06 06:40:42 +00:00
* - "disabled" : block all group messages
* - "allowlist" : only allow group messages from senders in groupAllowFrom / allowFrom
* /
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max group messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-04 07:05:04 +01:00
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit? : number ;
2026-01-09 11:57:43 +13:00
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-04 07:05:04 +01:00
mediaMaxMb? : number ;
2026-01-09 23:53:28 +01:00
/** Reaction notification mode (off|own|all|allowlist). Default: own. */
reactionNotifications? : SignalReactionNotificationMode ;
/** Allowlist for reaction notifications when mode is allowlist. */
reactionAllowlist? : Array < string | number > ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-08 01:18:37 +01:00
export type SignalConfig = {
/** Optional per-account Signal configuration (multi-account). */
accounts? : Record < string , SignalAccountConfig > ;
} & SignalAccountConfig ;
2026-01-07 21:29:39 +03:00
export type MSTeamsWebhookConfig = {
/** Port for the webhook server. Default: 3978. */
port? : number ;
/** Path for the messages endpoint. Default: /api/messages. */
path? : string ;
} ;
/** Reply style for MS Teams messages. */
export type MSTeamsReplyStyle = "thread" | "top-level" ;
/** Channel-level config for MS Teams. */
export type MSTeamsChannelConfig = {
/** Require @mention to respond. Default: true. */
requireMention? : boolean ;
/** Reply style: "thread" replies to the message, "top-level" posts a new message. */
replyStyle? : MSTeamsReplyStyle ;
} ;
/** Team-level config for MS Teams. */
export type MSTeamsTeamConfig = {
/** Default requireMention for channels in this team. */
requireMention? : boolean ;
/** Default reply style for channels in this team. */
replyStyle? : MSTeamsReplyStyle ;
/** Per-channel overrides. Key is conversation ID (e.g., "19:...@thread.tacv2"). */
channels? : Record < string , MSTeamsChannelConfig > ;
} ;
export type MSTeamsConfig = {
/** If false, do not start the MS Teams provider. Default: true. */
enabled? : boolean ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-07 21:29:39 +03:00
/** Azure Bot App ID (from Azure Bot registration). */
appId? : string ;
/** Azure Bot App Password / Client Secret. */
appPassword? : string ;
/** Azure AD Tenant ID (for single-tenant bots). */
tenantId? : string ;
/** Webhook server configuration. */
webhook? : MSTeamsWebhookConfig ;
/** Direct message access policy (default: pairing). */
dmPolicy? : DmPolicy ;
/** Allowlist for DM senders (AAD object IDs or UPNs). */
allowFrom? : Array < string > ;
2026-01-12 08:31:59 +00:00
/** Optional allowlist for group/channel senders (AAD object IDs or UPNs). */
groupAllowFrom? : Array < string > ;
/ * *
* Controls how group / channel messages are handled :
* - "open" : groups bypass allowFrom ; mention - gating applies
* - "disabled" : block all group messages
* - "allowlist" : only allow group messages from senders in groupAllowFrom / allowFrom
* /
groupPolicy? : GroupPolicy ;
2026-01-07 21:29:39 +03:00
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit? : number ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-07 21:29:39 +03:00
/ * *
* Allowed host suffixes for inbound attachment downloads .
* Use [ "*" ] to allow any host ( not recommended ) .
* /
mediaAllowHosts? : Array < string > ;
/** Default: require @mention to respond in channels/groups. */
requireMention? : boolean ;
2026-01-10 18:53:33 +01:00
/** Max group/channel messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-07 21:29:39 +03:00
/** Default reply style: "thread" replies to the message, "top-level" posts a new message. */
replyStyle? : MSTeamsReplyStyle ;
/** Per-team config. Key is team ID (from the /team/ URL path segment). */
teams? : Record < string , MSTeamsTeamConfig > ;
} ;
2026-01-13 06:16:43 +00:00
export type ChannelsConfig = {
whatsapp? : WhatsAppConfig ;
telegram? : TelegramConfig ;
discord? : DiscordConfig ;
slack? : SlackConfig ;
signal? : SignalConfig ;
imessage? : IMessageConfig ;
msteams? : MSTeamsConfig ;
} ;
2026-01-08 01:18:37 +01:00
export type IMessageAccountConfig = {
/** Optional display name for this account (used in CLI/UI lists). */
name? : string ;
2026-01-09 20:46:11 +01:00
/** Optional provider capability tags used for agent/runtime guidance. */
capabilities? : string [ ] ;
2026-01-08 01:18:37 +01:00
/** If false, do not start this iMessage account. Default: true. */
2026-01-04 07:05:04 +01:00
enabled? : boolean ;
/** imsg CLI binary path (default: imsg). */
cliPath? : string ;
/** Optional Messages db path override. */
dbPath? : string ;
/** Optional default send service (imessage|sms|auto). */
service ? : "imessage" | "sms" | "auto" ;
/** Optional default region (used when sending SMS). */
region? : string ;
2026-01-06 17:51:38 +01:00
/** Direct message access policy (default: pairing). */
dmPolicy? : DmPolicy ;
2026-01-04 07:05:04 +01:00
/** Optional allowlist for inbound handles or chat_id targets. */
allowFrom? : Array < string | number > ;
2026-01-06 06:40:42 +00:00
/** Optional allowlist for group senders or chat_id targets. */
groupAllowFrom? : Array < string | number > ;
/ * *
* Controls how group messages are handled :
2026-01-12 08:21:50 +00:00
* - "open" : groups bypass allowFrom ; mention - gating applies
2026-01-06 06:40:42 +00:00
* - "disabled" : block all group messages entirely
* - "allowlist" : only allow group messages from senders in groupAllowFrom / allowFrom
* /
groupPolicy? : GroupPolicy ;
2026-01-10 18:53:33 +01:00
/** Max group messages to keep as history context (0 disables). */
historyLimit? : number ;
2026-01-11 08:38:19 -06:00
/** Max DM turns to keep as history context. */
dmHistoryLimit? : number ;
2026-01-11 08:53:50 -06:00
/** Per-DM config overrides keyed by user ID. */
dms? : Record < string , DmConfig > ;
2026-01-04 07:05:04 +01:00
/** Include attachments + reactions in watch payloads. */
includeAttachments? : boolean ;
/** Max outbound media size in MB. */
mediaMaxMb? : number ;
/** Outbound text chunk size (chars). Default: 4000. */
textChunkLimit? : number ;
2026-01-09 11:57:43 +13:00
blockStreaming? : boolean ;
2026-01-09 18:19:55 +00:00
/** Merge streamed block replies before sending. */
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-04 07:05:04 +01:00
groups? : Record <
string ,
{
requireMention? : boolean ;
}
> ;
} ;
2026-01-08 01:18:37 +01:00
export type IMessageConfig = {
/** Optional per-account iMessage configuration (multi-account). */
accounts? : Record < string , IMessageAccountConfig > ;
} & IMessageAccountConfig ;
2026-01-04 07:05:04 +01:00
export type QueueMode =
| "steer"
| "followup"
| "collect"
| "steer-backlog"
| "steer+backlog"
| "queue"
| "interrupt" ;
export type QueueDropPolicy = "old" | "new" | "summarize" ;
2026-01-06 18:25:37 +00:00
export type QueueModeByProvider = {
2026-01-04 07:05:04 +01:00
whatsapp? : QueueMode ;
telegram? : QueueMode ;
discord? : QueueMode ;
2026-01-03 23:12:11 -06:00
slack? : QueueMode ;
2026-01-04 07:05:04 +01:00
signal? : QueueMode ;
imessage? : QueueMode ;
2026-01-07 21:29:39 +03:00
msteams? : QueueMode ;
2026-01-04 07:05:04 +01:00
webchat? : QueueMode ;
} ;
2026-01-08 01:06:09 +01:00
export type SandboxDockerSettings = {
/** Docker image to use for sandbox containers. */
image? : string ;
/** Prefix for sandbox container names. */
containerPrefix? : string ;
/** Container workdir mount path (default: /workspace). */
workdir? : string ;
/** Run container rootfs read-only. */
readOnlyRoot? : boolean ;
/** Extra tmpfs mounts for read-only containers. */
tmpfs? : string [ ] ;
/** Container network mode (bridge|none|custom). */
network? : string ;
/** Container user (uid:gid). */
user? : string ;
/** Drop Linux capabilities. */
capDrop? : string [ ] ;
/** Extra environment variables for sandbox exec. */
env? : Record < string , string > ;
/** Optional setup command run once after container creation. */
setupCommand? : string ;
/** Limit container PIDs (0 = Docker default). */
pidsLimit? : number ;
/** Limit container memory (e.g. 512m, 2g, or bytes as number). */
memory? : string | number ;
/** Limit container memory swap (same format as memory). */
memorySwap? : string | number ;
/** Limit container CPU shares (e.g. 0.5, 1, 2). */
cpus? : number ;
/ * *
* Set ulimit values by name ( e . g . nofile , nproc ) .
* Use "soft:hard" string , a number , or { soft , hard } .
* /
ulimits? : Record < string , string | number | { soft ? : number ; hard ? : number } > ;
/** Seccomp profile (path or profile name). */
seccompProfile? : string ;
/** AppArmor profile name. */
apparmorProfile? : string ;
/** DNS servers (e.g. ["1.1.1.1", "8.8.8.8"]). */
dns? : string [ ] ;
/** Extra host mappings (e.g. ["api.local:10.0.0.2"]). */
extraHosts? : string [ ] ;
2026-01-12 10:13:32 -07:00
/** Additional bind mounts (host:container:mode format, e.g. ["/host/path:/container/path:rw"]). */
binds? : string [ ] ;
2026-01-08 01:06:09 +01:00
} ;
2026-01-08 01:17:49 +01:00
export type SandboxBrowserSettings = {
enabled? : boolean ;
image? : string ;
containerPrefix? : string ;
cdpPort? : number ;
vncPort? : number ;
noVncPort? : number ;
headless? : boolean ;
enableNoVnc? : boolean ;
2026-01-11 01:24:02 +01:00
/ * *
* Allow sandboxed sessions to target the host browser control server .
* Default : false.
* /
allowHostControl? : boolean ;
2026-01-11 01:52:23 +01:00
/ * *
* Allowlist of exact control URLs for target = "custom" .
* When set , any custom controlUrl must match this list .
* /
allowedControlUrls? : string [ ] ;
/ * *
* Allowlist of hostnames for control URLs ( hostname only , no ports ) .
* When set , controlUrl hostname must match .
* /
allowedControlHosts? : string [ ] ;
/ * *
* Allowlist of ports for control URLs .
* When set , controlUrl port must match ( defaults : http = 80 , https = 443 ) .
* /
allowedControlPorts? : number [ ] ;
2026-01-10 02:06:05 +00:00
/ * *
* When true ( default ) , sandboxed browser control will try to start / reattach to
* the sandbox browser container when a tool call needs it .
* /
autoStart? : boolean ;
/** Max time to wait for CDP to become reachable after auto-start (ms). */
autoStartTimeoutMs? : number ;
2026-01-08 01:17:49 +01:00
} ;
export type SandboxPruneSettings = {
/** Prune if idle for more than N hours (0 disables). */
idleHours? : number ;
/** Prune if older than N days (0 disables). */
maxAgeDays? : number ;
} ;
2026-01-04 07:05:04 +01:00
export type GroupChatConfig = {
mentionPatterns? : string [ ] ;
historyLimit? : number ;
} ;
2026-01-11 08:53:50 -06:00
export type DmConfig = {
historyLimit? : number ;
} ;
2026-01-09 12:44:23 +00:00
export type QueueConfig = {
mode? : QueueMode ;
2026-01-13 06:16:43 +00:00
byChannel? : QueueModeByProvider ;
2026-01-09 12:44:23 +00:00
debounceMs? : number ;
cap? : number ;
drop? : QueueDropPolicy ;
} ;
2026-01-13 06:28:15 +00:00
export type ToolProfileId = "minimal" | "coding" | "messaging" | "full" ;
2026-01-09 12:44:23 +00:00
export type AgentToolsConfig = {
2026-01-13 06:28:15 +00:00
/** Base tool profile applied before allow/deny lists. */
profile? : ToolProfileId ;
2026-01-09 12:44:23 +00:00
allow? : string [ ] ;
deny? : string [ ] ;
2026-01-12 02:49:55 +00:00
/** Per-agent elevated exec gate (can only further restrict global tools.elevated). */
2026-01-09 20:42:16 +00:00
elevated ? : {
/** Enable or disable elevated mode for this agent (default: true). */
enabled? : boolean ;
/** Approved senders for /elevated (per-provider allowlists). */
allowFrom? : AgentElevatedAllowFromConfig ;
} ;
2026-01-09 12:44:23 +00:00
sandbox ? : {
tools ? : {
allow? : string [ ] ;
deny? : string [ ] ;
} ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-09 12:44:23 +00:00
} ;
2026-01-12 11:22:56 +00:00
export type MemorySearchConfig = {
/** Enable vector memory search (default: true). */
enabled? : boolean ;
/** Embedding provider mode. */
provider ? : "openai" | "local" ;
2026-01-12 15:33:35 +00:00
remote ? : {
baseUrl? : string ;
apiKey? : string ;
headers? : Record < string , string > ;
} ;
2026-01-12 11:22:56 +00:00
/** Fallback behavior when local embeddings fail. */
fallback ? : "openai" | "none" ;
/** Embedding model id (remote) or alias (local). */
model? : string ;
/** Local embedding settings (node-llama-cpp). */
local ? : {
/** GGUF model path or hf: URI. */
modelPath? : string ;
/** Optional cache directory for local models. */
modelCacheDir? : string ;
} ;
/** Index storage configuration. */
store ? : {
driver ? : "sqlite" ;
path? : string ;
} ;
/** Chunking configuration. */
chunking ? : {
tokens? : number ;
overlap? : number ;
} ;
/** Sync behavior. */
sync ? : {
onSessionStart? : boolean ;
onSearch? : boolean ;
watch? : boolean ;
watchDebounceMs? : number ;
intervalMinutes? : number ;
} ;
/** Query behavior. */
query ? : {
maxResults? : number ;
minScore? : number ;
} ;
} ;
2026-01-09 12:44:23 +00:00
export type ToolsConfig = {
2026-01-13 06:28:15 +00:00
/** Base tool profile applied before allow/deny lists. */
profile? : ToolProfileId ;
2026-01-09 12:44:23 +00:00
allow? : string [ ] ;
deny? : string [ ] ;
2026-01-11 01:51:07 +01:00
audio ? : {
transcription ? : {
/** CLI args (template-enabled). */
args? : string [ ] ;
timeoutSeconds? : number ;
} ;
} ;
2026-01-06 08:40:21 +00:00
agentToAgent ? : {
/** Enable agent-to-agent messaging tools. Default: false. */
enabled? : boolean ;
/** Allowlist of agent ids or patterns (implementation-defined). */
allow? : string [ ] ;
} ;
2026-01-12 02:49:55 +00:00
/** Elevated exec permissions for the host machine. */
2026-01-09 12:44:23 +00:00
elevated ? : {
/** Enable or disable elevated mode (default: true). */
enabled? : boolean ;
/** Approved senders for /elevated (per-provider allowlists). */
allowFrom? : AgentElevatedAllowFromConfig ;
} ;
2026-01-12 02:49:55 +00:00
/** Exec tool defaults. */
exec ? : {
/** Default time (ms) before an exec command auto-backgrounds. */
backgroundMs? : number ;
/** Default timeout (seconds) before auto-killing exec commands. */
timeoutSec? : number ;
/** How long to keep finished sessions in memory (ms). */
cleanupMs? : number ;
2026-01-12 03:42:49 +00:00
/** apply_patch subtool configuration (experimental). */
applyPatch ? : {
/** Enable apply_patch for OpenAI models (default: false). */
enabled? : boolean ;
/ * *
* Optional allowlist of model ids that can use apply_patch .
* Accepts either raw ids ( e . g . "gpt-5.2" ) or full ids ( e . g . "openai/gpt-5.2" ) .
* /
allowModels? : string [ ] ;
} ;
2026-01-12 02:49:55 +00:00
} ;
/** @deprecated Use tools.exec. */
2026-01-09 12:44:23 +00:00
bash ? : {
/** Default time (ms) before a bash command auto-backgrounds. */
backgroundMs? : number ;
/** Default timeout (seconds) before auto-killing bash commands. */
timeoutSec? : number ;
/** How long to keep finished sessions in memory (ms). */
cleanupMs? : number ;
} ;
/** Sub-agent tool policy defaults (deny wins). */
subagents ? : {
2026-01-12 18:08:16 +00:00
/** Default model selection for spawned sub-agents (string or {primary,fallbacks}). */
model? : string | { primary? : string ; fallbacks? : string [ ] } ;
2026-01-09 12:44:23 +00:00
tools ? : {
allow? : string [ ] ;
deny? : string [ ] ;
2026-01-06 08:40:21 +00:00
} ;
2026-01-09 12:44:23 +00:00
} ;
/** Sandbox tool policy defaults (deny wins). */
sandbox ? : {
tools ? : {
allow? : string [ ] ;
deny? : string [ ] ;
} ;
} ;
} ;
2026-01-09 14:59:02 +01:00
export type AgentModelConfig =
| string
| {
/** Primary model (provider/model). */
primary? : string ;
/** Per-agent model fallbacks (provider/model). */
fallbacks? : string [ ] ;
} ;
2026-01-09 12:44:23 +00:00
export type AgentConfig = {
id : string ;
default ? : boolean ;
name? : string ;
workspace? : string ;
agentDir? : string ;
2026-01-09 14:59:02 +01:00
model? : AgentModelConfig ;
2026-01-12 11:22:56 +00:00
memorySearch? : MemorySearchConfig ;
2026-01-07 22:56:46 -05:00
/** Human-like delay between block replies for this agent. */
humanDelay? : HumanDelayConfig ;
2026-01-09 12:44:23 +00:00
identity? : IdentityConfig ;
groupChat? : GroupChatConfig ;
subagents ? : {
/** Allow spawning sub-agents under other agent ids. Use "*" to allow any. */
allowAgents? : string [ ] ;
2026-01-12 18:08:16 +00:00
/** Per-agent default model for spawned sub-agents (string or {primary,fallbacks}). */
model? : string | { primary? : string ; fallbacks? : string [ ] } ;
2026-01-09 12:44:23 +00:00
} ;
sandbox ? : {
mode ? : "off" | "non-main" | "all" ;
/** Agent workspace access inside the sandbox. */
workspaceAccess ? : "none" | "ro" | "rw" ;
/ * *
* Session tools visibility for sandboxed sessions .
* - "spawned" : only allow session tools to target sessions spawned from this session ( default )
* - "all" : allow session tools to target any session
* /
sessionToolsVisibility ? : "spawned" | "all" ;
/** Container/workspace scope for sandbox isolation. */
scope ? : "session" | "agent" | "shared" ;
/** Legacy alias for scope ("session" when true, "shared" when false). */
perSession? : boolean ;
workspaceRoot? : string ;
/** Docker-specific sandbox overrides for this agent. */
docker? : SandboxDockerSettings ;
/** Optional sandboxed browser overrides for this agent. */
browser? : SandboxBrowserSettings ;
/** Auto-prune overrides for this agent. */
prune? : SandboxPruneSettings ;
} ;
tools? : AgentToolsConfig ;
} ;
export type AgentsConfig = {
defaults? : AgentDefaultsConfig ;
list? : AgentConfig [ ] ;
} ;
export type AgentBinding = {
agentId : string ;
match : {
2026-01-13 06:16:43 +00:00
channel : string ;
2026-01-09 12:44:23 +00:00
accountId? : string ;
peer ? : { kind : "dm" | "group" | "channel" ; id : string } ;
guildId? : string ;
teamId? : string ;
} ;
} ;
2026-01-09 21:14:19 +01:00
export type BroadcastStrategy = "parallel" | "sequential" ;
export type BroadcastConfig = {
/** Default processing strategy for broadcast peers. */
strategy? : BroadcastStrategy ;
/ * *
* Map peer IDs to arrays of agent IDs that should ALL process messages .
*
* Note : the index signature includes ` undefined ` so ` strategy?: ... ` remains type - safe .
* /
[ peerId : string ] : string [ ] | BroadcastStrategy | undefined ;
} ;
2026-01-09 12:44:23 +00:00
export type AudioConfig = {
2026-01-11 01:51:07 +01:00
/** @deprecated Use tools.audio.transcription instead. */
2026-01-09 12:44:23 +00:00
transcription ? : {
// Optional CLI to turn inbound audio into text; templated args, must output transcript to stdout.
command : string [ ] ;
timeoutSeconds? : number ;
2026-01-04 07:05:04 +01:00
} ;
} ;
export type MessagesConfig = {
2026-01-09 19:28:59 +00:00
/** @deprecated Use `whatsapp.messagePrefix` (WhatsApp-only inbound prefix). */
messagePrefix? : string ;
/ * *
* Prefix auto - added to all outbound replies .
* - string : explicit prefix
* - special value : ` "auto" ` derives ` [{agents.list[].identity.name}] ` for the routed agent ( when set )
* Default : none
* /
responsePrefix? : string ;
2026-01-09 12:44:23 +00:00
groupChat? : GroupChatConfig ;
queue? : QueueConfig ;
2026-01-06 03:28:35 +00:00
/** Emoji reaction used to acknowledge inbound messages (empty disables). */
ackReaction? : string ;
/** When to send ack reactions. Default: "group-mentions". */
ackReactionScope ? : "group-mentions" | "group-all" | "direct" | "all" ;
2026-01-10 00:31:12 +00:00
/** Remove ack reaction after reply is sent (default: false). */
removeAckAfterReply? : boolean ;
2026-01-04 07:05:04 +01:00
} ;
2026-01-12 21:49:44 +00:00
export type NativeCommandsSetting = boolean | "auto" ;
2026-01-06 14:17:56 -06:00
export type CommandsConfig = {
2026-01-12 21:49:44 +00:00
/** Enable native command registration when supported (default: "auto"). */
native? : NativeCommandsSetting ;
2026-01-06 14:17:56 -06:00
/** Enable text command parsing (default: true). */
text? : boolean ;
2026-01-12 15:04:57 +05:30
/** Allow bash chat command (`!`; `/bash` alias) (default: false). */
bash? : boolean ;
/** How long bash waits before backgrounding (default: 2000; 0 backgrounds immediately). */
bashForegroundMs? : number ;
2026-01-11 02:17:10 +01:00
/** Allow /config command (default: false). */
config? : boolean ;
/** Allow /debug command (default: false). */
debug? : boolean ;
2026-01-09 05:49:11 +00:00
/** Allow restart commands/tools (default: false). */
restart? : boolean ;
2026-01-06 14:17:56 -06:00
/** Enforce access-group allowlists/policies for commands (default: true). */
useAccessGroups? : boolean ;
} ;
2026-01-12 21:49:44 +00:00
export type ProviderCommandsConfig = {
/** Override native command registration for this provider (bool or "auto"). */
native? : NativeCommandsSetting ;
} ;
2026-01-11 14:13:13 -06:00
export type BridgeBindMode = "auto" | "lan" | "loopback" | "custom" ;
2026-01-04 07:05:04 +01:00
export type BridgeConfig = {
enabled? : boolean ;
port? : number ;
/ * *
* Bind address policy for the node bridge server .
2026-01-11 14:13:13 -06:00
* - auto : Tailnet IPv4 if available , else 0.0 . 0.0 ( fallback to all interfaces )
* - lan : 0.0.0.0 ( all interfaces , no fallback )
* - loopback : 127.0.0.1 ( local - only )
* - custom : User - specified IP , fallback to 0.0 . 0.0 if unavailable ( requires customBindHost on gateway )
2026-01-04 07:05:04 +01:00
* /
bind? : BridgeBindMode ;
} ;
export type WideAreaDiscoveryConfig = {
enabled? : boolean ;
} ;
export type DiscoveryConfig = {
wideArea? : WideAreaDiscoveryConfig ;
} ;
export type CanvasHostConfig = {
enabled? : boolean ;
/** Directory to serve (default: ~/clawd/canvas). */
root? : string ;
/** HTTP port to listen on (default: 18793). */
port? : number ;
2026-01-04 15:22:47 +01:00
/** Enable live-reload file watching + WS reloads (default: true). */
liveReload? : boolean ;
2026-01-04 07:05:04 +01:00
} ;
export type TalkConfig = {
/** Default ElevenLabs voice ID for Talk mode. */
voiceId? : string ;
/** Optional voice name -> ElevenLabs voice ID map. */
voiceAliases? : Record < string , string > ;
/** Default ElevenLabs model ID for Talk mode. */
modelId? : string ;
/** Default ElevenLabs output format (e.g. mp3_44100_128). */
outputFormat? : string ;
/** ElevenLabs API key (optional; falls back to ELEVENLABS_API_KEY). */
apiKey? : string ;
/** Stop speaking when user starts talking (default: true). */
interruptOnSpeech? : boolean ;
} ;
export type GatewayControlUiConfig = {
/** If false, the Gateway will not serve the Control UI (default /). */
enabled? : boolean ;
2026-01-04 14:32:47 +00:00
/** Optional base path prefix for the Control UI (e.g. "/clawdbot"). */
2026-01-04 07:05:04 +01:00
basePath? : string ;
} ;
export type GatewayAuthMode = "token" | "password" ;
export type GatewayAuthConfig = {
/** Authentication mode for Gateway connections. Defaults to token when set. */
mode? : GatewayAuthMode ;
/** Shared token for token mode (stored locally for CLI auth). */
token? : string ;
/** Shared password for password mode (consider env instead). */
password? : string ;
/** Allow Tailscale identity headers when serve mode is enabled. */
allowTailscale? : boolean ;
} ;
export type GatewayTailscaleMode = "off" | "serve" | "funnel" ;
export type GatewayTailscaleConfig = {
/** Tailscale exposure mode for the Gateway control UI. */
mode? : GatewayTailscaleMode ;
/** Reset serve/funnel configuration on shutdown. */
resetOnExit? : boolean ;
} ;
export type GatewayRemoteConfig = {
/** Remote Gateway WebSocket URL (ws:// or wss://). */
url? : string ;
/** Token for remote auth (when the gateway requires token auth). */
token? : string ;
/** Password for remote auth (when the gateway requires password auth). */
password? : string ;
2026-01-09 11:18:37 +01:00
/** SSH target for tunneling remote Gateway (user@host). */
sshTarget? : string ;
/** SSH identity file path for tunneling remote Gateway. */
sshIdentity? : string ;
2026-01-04 07:05:04 +01:00
} ;
export type GatewayReloadMode = "off" | "restart" | "hot" | "hybrid" ;
export type GatewayReloadConfig = {
/** Reload strategy for config changes (default: hybrid). */
mode? : GatewayReloadMode ;
/** Debounce window for config reloads (ms). Default: 300. */
debounceMs? : number ;
} ;
2026-01-10 22:34:25 +01:00
export type GatewayHttpChatCompletionsConfig = {
/ * *
* If false , the Gateway will not serve ` POST /v1/chat/completions ` .
2026-01-10 21:55:54 +00:00
* Default : false when absent .
2026-01-10 22:34:25 +01:00
* /
enabled? : boolean ;
} ;
export type GatewayHttpEndpointsConfig = {
chatCompletions? : GatewayHttpChatCompletionsConfig ;
} ;
export type GatewayHttpConfig = {
endpoints? : GatewayHttpEndpointsConfig ;
} ;
2026-01-04 07:05:04 +01:00
export type GatewayConfig = {
/** Single multiplexed port for Gateway WS + HTTP (default: 18789). */
port? : number ;
/ * *
* Explicit gateway mode . When set to "remote" , local gateway start is disabled .
* When set to "local" , the CLI may start the gateway locally .
* /
mode ? : "local" | "remote" ;
/ * *
* Bind address policy for the Gateway WebSocket + Control UI HTTP server .
2026-01-11 14:13:13 -06:00
* - auto : Tailnet IPv4 if available , else 0.0 . 0.0 ( fallback to all interfaces )
* - lan : 0.0.0.0 ( all interfaces , no fallback )
* - loopback : 127.0.0.1 ( local - only )
* - custom : User - specified IP , fallback to 0.0 . 0.0 if unavailable ( requires customBindHost )
2026-01-04 07:05:04 +01:00
* Default : loopback ( 127.0 . 0.1 ) .
* /
bind? : BridgeBindMode ;
2026-01-11 14:13:13 -06:00
/** Custom IP address for bind="custom" mode. Fallback: 0.0.0.0. */
customBindHost? : string ;
2026-01-04 07:05:04 +01:00
controlUi? : GatewayControlUiConfig ;
auth? : GatewayAuthConfig ;
tailscale? : GatewayTailscaleConfig ;
remote? : GatewayRemoteConfig ;
reload? : GatewayReloadConfig ;
2026-01-10 22:34:25 +01:00
http? : GatewayHttpConfig ;
2026-01-04 07:05:04 +01:00
} ;
export type SkillConfig = {
enabled? : boolean ;
apiKey? : string ;
env? : Record < string , string > ;
[ key : string ] : unknown ;
} ;
export type SkillsLoadConfig = {
/ * *
* Additional skill folders to scan ( lowest precedence ) .
* Each directory should contain skill subfolders with ` SKILL.md ` .
* /
extraDirs? : string [ ] ;
} ;
export type SkillsInstallConfig = {
preferBrew? : boolean ;
nodeManager ? : "npm" | "pnpm" | "yarn" | "bun" ;
} ;
export type SkillsConfig = {
/** Optional bundled-skill allowlist (only affects bundled skills). */
allowBundled? : string [ ] ;
load? : SkillsLoadConfig ;
install? : SkillsInstallConfig ;
entries? : Record < string , SkillConfig > ;
} ;
2026-01-11 12:11:12 +00:00
export type PluginEntryConfig = {
enabled? : boolean ;
config? : Record < string , unknown > ;
} ;
export type PluginsLoadConfig = {
/** Additional plugin/extension paths to load. */
paths? : string [ ] ;
} ;
export type PluginsConfig = {
/** Enable or disable plugin loading. */
enabled? : boolean ;
/** Optional plugin allowlist (plugin ids). */
allow? : string [ ] ;
/** Optional plugin denylist (plugin ids). */
deny? : string [ ] ;
load? : PluginsLoadConfig ;
entries? : Record < string , PluginEntryConfig > ;
} ;
2026-01-04 07:05:04 +01:00
export type ModelApi =
| "openai-completions"
| "openai-responses"
| "anthropic-messages"
2026-01-11 05:19:07 +02:00
| "google-generative-ai"
| "github-copilot" ;
2026-01-04 07:05:04 +01:00
export type ModelCompatConfig = {
supportsStore? : boolean ;
supportsDeveloperRole? : boolean ;
supportsReasoningEffort? : boolean ;
maxTokensField ? : "max_completion_tokens" | "max_tokens" ;
} ;
export type ModelDefinitionConfig = {
id : string ;
name : string ;
api? : ModelApi ;
reasoning : boolean ;
input : Array < "text" | "image" > ;
cost : {
input : number ;
output : number ;
cacheRead : number ;
cacheWrite : number ;
} ;
contextWindow : number ;
maxTokens : number ;
headers? : Record < string , string > ;
compat? : ModelCompatConfig ;
} ;
export type ModelProviderConfig = {
baseUrl : string ;
2026-01-10 10:57:09 -03:00
apiKey? : string ;
2026-01-04 07:05:04 +01:00
api? : ModelApi ;
headers? : Record < string , string > ;
authHeader? : boolean ;
models : ModelDefinitionConfig [ ] ;
} ;
export type ModelsConfig = {
mode ? : "merge" | "replace" ;
providers? : Record < string , ModelProviderConfig > ;
} ;
2026-01-06 00:56:29 +00:00
export type AuthProfileConfig = {
provider : string ;
2026-01-09 07:51:47 +01:00
/ * *
* Credential type expected in auth - profiles . json for this profile id .
* - api_key : static provider API key
* - oauth : refreshable OAuth credentials ( access + refresh + expires )
* - token : static bearer - style token ( optionally expiring ; no refresh )
* /
mode : "api_key" | "oauth" | "token" ;
2026-01-06 00:56:29 +00:00
email? : string ;
} ;
export type AuthConfig = {
profiles? : Record < string , AuthProfileConfig > ;
order? : Record < string , string [ ] > ;
2026-01-09 21:57:52 +01:00
cooldowns ? : {
/** Default billing backoff (hours). Default: 5. */
billingBackoffHours? : number ;
/** Optional per-provider billing backoff (hours). */
billingBackoffHoursByProvider? : Record < string , number > ;
/** Billing backoff cap (hours). Default: 24. */
billingMaxHours? : number ;
/ * *
* Failure window for backoff counters ( hours ) . If no failures occur within
* this window , counters reset . Default : 24.
* /
failureWindowHours? : number ;
} ;
2026-01-06 00:56:29 +00:00
} ;
export type AgentModelEntryConfig = {
alias? : string ;
2026-01-07 23:57:40 -03:00
/** Provider-specific API parameters (e.g., GLM-4.7 thinking mode). */
params? : Record < string , unknown > ;
2026-01-06 00:56:29 +00:00
} ;
export type AgentModelListConfig = {
primary? : string ;
fallbacks? : string [ ] ;
} ;
2026-01-07 12:02:46 +01:00
export type AgentContextPruningConfig = {
mode ? : "off" | "adaptive" | "aggressive" ;
keepLastAssistants? : number ;
softTrimRatio? : number ;
hardClearRatio? : number ;
minPrunableToolChars? : number ;
tools ? : {
allow? : string [ ] ;
deny? : string [ ] ;
} ;
softTrim ? : {
maxChars? : number ;
headChars? : number ;
tailChars? : number ;
} ;
hardClear ? : {
enabled? : boolean ;
placeholder? : string ;
} ;
} ;
2026-01-10 23:31:25 +00:00
export type CliBackendConfig = {
/** CLI command to execute (absolute path or on PATH). */
command : string ;
/** Base args applied to every invocation. */
args? : string [ ] ;
/** Output parsing mode (default: json). */
2026-01-11 01:35:23 +00:00
output ? : "json" | "text" | "jsonl" ;
/** Output parsing mode when resuming a CLI session. */
resumeOutput ? : "json" | "text" | "jsonl" ;
2026-01-10 23:31:25 +00:00
/** Prompt input mode (default: arg). */
input ? : "arg" | "stdin" ;
/** Max prompt length for arg mode (if exceeded, stdin is used). */
maxPromptArgChars? : number ;
/** Extra env vars injected for this CLI. */
env? : Record < string , string > ;
/** Env vars to remove before launching this CLI. */
clearEnv? : string [ ] ;
/** Flag used to pass model id (e.g. --model). */
modelArg? : string ;
/** Model aliases mapping (config model id → CLI model id). */
modelAliases? : Record < string , string > ;
/** Flag used to pass session id (e.g. --session-id). */
sessionArg? : string ;
2026-01-11 01:35:23 +00:00
/** Extra args used when resuming a session (use {sessionId} placeholder). */
sessionArgs? : string [ ] ;
/** Alternate args to use when resuming a session (use {sessionId} placeholder). */
resumeArgs? : string [ ] ;
2026-01-10 23:31:25 +00:00
/** When to pass session ids. */
sessionMode ? : "always" | "existing" | "none" ;
/** JSON fields to read session id from (in order). */
sessionIdFields? : string [ ] ;
/** Flag used to pass system prompt. */
systemPromptArg? : string ;
/** System prompt behavior (append vs replace). */
systemPromptMode ? : "append" | "replace" ;
/** When to send system prompt. */
systemPromptWhen ? : "first" | "always" | "never" ;
/** Flag used to pass image paths. */
imageArg? : string ;
/** How to pass multiple images. */
imageMode ? : "repeat" | "list" ;
/** Serialize runs for this CLI. */
serialize? : boolean ;
} ;
2026-01-09 12:44:23 +00:00
export type AgentDefaultsConfig = {
/** Primary model and fallbacks (provider/model). */
model? : AgentModelListConfig ;
/** Optional image-capable model and fallbacks (provider/model). */
imageModel? : AgentModelListConfig ;
/** Model catalog with optional aliases (full provider/model keys). */
models? : Record < string , AgentModelEntryConfig > ;
/** Agent working directory (preferred). Used as the default cwd for agent runs. */
workspace? : string ;
/** Skip bootstrap (BOOTSTRAP.md creation, etc.) for pre-configured deployments. */
skipBootstrap? : boolean ;
2026-01-13 04:24:17 +00:00
/** Max chars for injected bootstrap files before truncation (default: 20000). */
bootstrapMaxChars? : number ;
2026-01-09 12:44:23 +00:00
/** Optional IANA timezone for the user (used in system prompt; defaults to host timezone). */
userTimezone? : string ;
/** Optional display-only context window override (used for % in status UIs). */
contextTokens? : number ;
2026-01-10 23:31:25 +00:00
/** Optional CLI backends for text-only fallback (claude-cli, etc.). */
cliBackends? : Record < string , CliBackendConfig > ;
2026-01-09 12:44:23 +00:00
/** Opt-in: prune old tool results from the LLM context to reduce token usage. */
contextPruning? : AgentContextPruningConfig ;
2026-01-12 05:28:17 +00:00
/** Compaction tuning and pre-compaction memory flush behavior. */
compaction? : AgentCompactionConfig ;
2026-01-12 11:22:56 +00:00
/** Vector memory search configuration (per-agent overrides supported). */
memorySearch? : MemorySearchConfig ;
2026-01-09 12:44:23 +00:00
/** Default thinking level when no /think directive is present. */
2026-01-07 17:17:38 -08:00
thinkingDefault ? : "off" | "minimal" | "low" | "medium" | "high" | "xhigh" ;
2026-01-09 12:44:23 +00:00
/** Default verbose level when no /verbose directive is present. */
verboseDefault ? : "off" | "on" ;
/** Default elevated level when no /elevated directive is present. */
elevatedDefault ? : "off" | "on" ;
/** Default block streaming level when no override is present. */
blockStreamingDefault ? : "off" | "on" ;
/ * *
* Block streaming boundary :
* - "text_end" : end of each assistant text content block ( before tool calls )
* - "message_end" : end of the whole assistant message ( may include tool blocks )
* /
blockStreamingBreak ? : "text_end" | "message_end" ;
/** Soft block chunking for streamed replies (min/max chars, prefer paragraph/newline). */
2026-01-10 18:30:06 +01:00
blockStreamingChunk? : BlockStreamingChunkConfig ;
2026-01-09 18:19:55 +00:00
/ * *
* Block reply coalescing ( merge streamed chunks before send ) .
* idleMs : wait time before flushing when idle .
* /
blockStreamingCoalesce? : BlockStreamingCoalesceConfig ;
2026-01-07 22:56:46 -05:00
/** Human-like delay between block replies. */
humanDelay? : HumanDelayConfig ;
2026-01-09 12:44:23 +00:00
timeoutSeconds? : number ;
/** Max inbound media size in MB for agent-visible attachments (text note or future image attach). */
mediaMaxMb? : number ;
typingIntervalSeconds? : number ;
/** Typing indicator start mode (never|instant|thinking|message). */
typingMode? : TypingMode ;
/** Periodic background heartbeat runs. */
heartbeat ? : {
/** Heartbeat interval (duration string, default unit: minutes; default: 30m). */
every? : string ;
/** Heartbeat model override (provider/model). */
model? : string ;
2026-01-09 14:07:11 +01:00
/** Delivery target (last|whatsapp|telegram|discord|slack|msteams|signal|imessage|none). */
2026-01-09 12:44:23 +00:00
target ? :
| "last"
| "whatsapp"
| "telegram"
| "discord"
| "slack"
2026-01-09 14:07:11 +01:00
| "msteams"
2026-01-09 12:44:23 +00:00
| "signal"
| "imessage"
| "none" ;
/** Optional delivery override (E.164 for WhatsApp, chat id for Telegram). */
to? : string ;
/** Override the heartbeat prompt body (default: "Read HEARTBEAT.md if exists. Consider outstanding tasks. Checkup sometimes on your human during (user local) day time."). */
prompt? : string ;
/** Max chars allowed after HEARTBEAT_OK before delivery (default: 30). */
ackMaxChars? : number ;
2026-01-10 22:26:20 +00:00
/ * *
* When enabled , deliver the model ' s reasoning payload for heartbeat runs ( when available )
* as a separate message prefixed with ` Reasoning: ` ( same as ` /reasoning on ` ) .
*
* Default : false ( only the final heartbeat payload is delivered ) .
* /
includeReasoning? : boolean ;
2026-01-09 12:44:23 +00:00
} ;
/** Max concurrent agent runs across all conversations. Default: 1 (sequential). */
maxConcurrent? : number ;
/** Sub-agent defaults (spawned via sessions_spawn). */
subagents ? : {
/** Max concurrent sub-agent runs (global lane: "subagent"). Default: 1. */
maxConcurrent? : number ;
/** Auto-archive sub-agent sessions after N minutes (default: 60). */
archiveAfterMinutes? : number ;
2026-01-12 18:18:03 +00:00
/** Default model selection for spawned sub-agents (string or {primary,fallbacks}). */
model? : string | { primary? : string ; fallbacks? : string [ ] } ;
2026-01-09 12:44:23 +00:00
} ;
/** Optional sandbox settings for non-main sessions. */
sandbox ? : {
/** Enable sandboxing for sessions. */
mode ? : "off" | "non-main" | "all" ;
/ * *
* Agent workspace access inside the sandbox .
* - "none" : do not mount the agent workspace into the container ; use a sandbox workspace under workspaceRoot
* - "ro" : mount the agent workspace read - only ; disables write / edit tools
* - "rw" : mount the agent workspace read / write ; enables write / edit tools
* /
workspaceAccess ? : "none" | "ro" | "rw" ;
/ * *
* Session tools visibility for sandboxed sessions .
* - "spawned" : only allow session tools to target sessions spawned from this session ( default )
* - "all" : allow session tools to target any session
* /
sessionToolsVisibility ? : "spawned" | "all" ;
/** Container/workspace scope for sandbox isolation. */
scope ? : "session" | "agent" | "shared" ;
/** Legacy alias for scope ("session" when true, "shared" when false). */
perSession? : boolean ;
/** Root directory for sandbox workspaces. */
workspaceRoot? : string ;
/** Docker-specific sandbox settings. */
docker? : SandboxDockerSettings ;
/** Optional sandboxed browser settings. */
browser? : SandboxBrowserSettings ;
/** Auto-prune sandbox containers. */
prune? : SandboxPruneSettings ;
} ;
} ;
2026-01-10 18:34:40 -06:00
export type AgentCompactionMode = "default" | "safeguard" ;
2026-01-12 05:28:17 +00:00
export type AgentCompactionConfig = {
2026-01-10 18:34:40 -06:00
/** Compaction summarization mode. */
mode? : AgentCompactionMode ;
2026-01-12 05:28:17 +00:00
/** Minimum reserve tokens enforced for Pi compaction (0 disables the floor). */
reserveTokensFloor? : number ;
/** Pre-compaction memory flush (agentic turn). Default: enabled. */
memoryFlush? : AgentCompactionMemoryFlushConfig ;
} ;
export type AgentCompactionMemoryFlushConfig = {
/** Enable the pre-compaction memory flush (default: true). */
enabled? : boolean ;
/** Run the memory flush when context is within this many tokens of the compaction threshold. */
softThresholdTokens? : number ;
/** User prompt used for the memory flush turn (NO_REPLY is enforced if missing). */
prompt? : string ;
/** System prompt appended for the memory flush turn. */
systemPrompt? : string ;
} ;
2026-01-04 14:32:47 +00:00
export type ClawdbotConfig = {
2026-01-06 00:56:29 +00:00
auth? : AuthConfig ;
2026-01-05 00:59:25 +01:00
env ? : {
/** Opt-in: import missing secrets from a login shell environment (exec `$SHELL -l -c 'env -0'`). */
shellEnv ? : {
enabled? : boolean ;
/** Timeout for the login shell exec (ms). Default: 15000. */
timeoutMs? : number ;
} ;
2026-01-08 22:37:06 +01:00
/** Inline env vars to apply when not already present in the process env. */
vars? : Record < string , string > ;
/** Sugar: allow env vars directly under env (string values only). */
[ key : string ] :
| string
| Record < string , string >
| { enabled? : boolean ; timeoutMs? : number }
| undefined ;
2026-01-05 00:59:25 +01:00
} ;
2026-01-04 07:05:04 +01:00
wizard ? : {
lastRunAt? : string ;
lastRunVersion? : string ;
lastRunCommit? : string ;
lastRunCommand? : string ;
lastRunMode ? : "local" | "remote" ;
} ;
logging? : LoggingConfig ;
browser? : BrowserConfig ;
ui ? : {
2026-01-04 14:32:47 +00:00
/** Accent color for Clawdbot UI chrome (hex). */
2026-01-04 07:05:04 +01:00
seamColor? : string ;
} ;
skills? : SkillsConfig ;
2026-01-11 12:11:12 +00:00
plugins? : PluginsConfig ;
2026-01-04 07:05:04 +01:00
models? : ModelsConfig ;
2026-01-09 12:44:23 +00:00
agents? : AgentsConfig ;
tools? : ToolsConfig ;
bindings? : AgentBinding [ ] ;
2026-01-09 21:14:19 +01:00
broadcast? : BroadcastConfig ;
2026-01-09 12:44:23 +00:00
audio? : AudioConfig ;
2026-01-04 07:05:04 +01:00
messages? : MessagesConfig ;
2026-01-06 14:17:56 -06:00
commands? : CommandsConfig ;
2026-01-04 07:05:04 +01:00
session? : SessionConfig ;
web? : WebConfig ;
2026-01-13 06:16:43 +00:00
channels? : ChannelsConfig ;
2026-01-04 07:05:04 +01:00
cron? : CronConfig ;
hooks? : HooksConfig ;
bridge? : BridgeConfig ;
discovery? : DiscoveryConfig ;
canvasHost? : CanvasHostConfig ;
talk? : TalkConfig ;
gateway? : GatewayConfig ;
} ;
export type ConfigValidationIssue = {
path : string ;
message : string ;
} ;
export type LegacyConfigIssue = {
path : string ;
message : string ;
} ;
export type ConfigFileSnapshot = {
path : string ;
exists : boolean ;
raw : string | null ;
parsed : unknown ;
valid : boolean ;
2026-01-04 14:32:47 +00:00
config : ClawdbotConfig ;
2026-01-04 07:05:04 +01:00
issues : ConfigValidationIssue [ ] ;
legacyIssues : LegacyConfigIssue [ ] ;
} ;