diff --git a/AGENTS.md b/AGENTS.md index ed08c1bb3..b3232360f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,6 +8,10 @@ - Docs: `docs/` (images, queue, Pi config). Built output lives in `dist/`. - Plugins/extensions: live under `extensions/*` (workspace packages). Keep plugin-only deps in the extension `package.json`; do not add them to the root `package.json` unless core uses them. - Installers served from `https://clawd.bot/*`: live in the sibling repo `../clawd.bot` (`public/install.sh`, `public/install-cli.sh`, `public/install.ps1`). +- Messaging channels: always consider **all** built-in + extension channels when refactoring shared logic (routing, allowlists, pairing, command gating, onboarding, docs). + - Core channel docs: `docs/channels/` + - Core channel code: `src/telegram`, `src/discord`, `src/slack`, `src/signal`, `src/imessage`, `src/web` (WhatsApp web), `src/channels`, `src/routing` + - Extensions (channel plugins): `extensions/*` (e.g. `extensions/msteams`, `extensions/matrix`, `extensions/zalo`, `extensions/zalouser`, `extensions/voice-call`) ## Docs Linking (Mintlify) - Docs are hosted on Mintlify (docs.clawd.bot). diff --git a/CHANGELOG.md b/CHANGELOG.md index dc7c39520..2c1e98fbc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,11 +6,12 @@ Docs: https://docs.clawd.bot ### Changes - Dependencies: update core + plugin deps (grammy, vitest, openai, Microsoft agents hosting, etc.). -- CLI: show Telegram bot username in channel status (probe/runtime). -- CLI: add agent targeting and reply routing overrides for `clawdbot agent`. (#1165) +- Onboarding: add allowlist prompts and username-to-id resolution across core and extension channels. +- Docs: clarify allowlist input types and onboarding behavior for messaging channels. ### Fixes -- Configure: hide OpenRouter auto routing model from the model picker. (#1182) — thanks @zerone0x. +- macOS: load menu session previews asynchronously so items populate while the menu is open. +- Telegram: honor pairing allowlists for native slash commands. ## 2026.1.18-4 diff --git a/docs/channels/discord.md b/docs/channels/discord.md index a16b6ed04..28ecfdfa0 100644 --- a/docs/channels/discord.md +++ b/docs/channels/discord.md @@ -287,7 +287,7 @@ ack reaction after the bot replies. - `dm.enabled`: set `false` to ignore all DMs (default `true`). - `dm.policy`: DM access control (`pairing` recommended). `"open"` requires `dm.allowFrom=["*"]`. -- `dm.allowFrom`: DM allowlist (user ids or names). Used by `dm.policy="allowlist"` and for `dm.policy="open"` validation. +- `dm.allowFrom`: DM allowlist (user ids or names). Used by `dm.policy="allowlist"` and for `dm.policy="open"` validation. The wizard accepts usernames and resolves them to ids when the bot can search members. - `dm.groupEnabled`: enable group DMs (default `false`). - `dm.groupChannels`: optional allowlist for group DM channel ids or slugs. - `groupPolicy`: controls guild channel handling (`open|disabled|allowlist`); `allowlist` requires channel allowlists. diff --git a/docs/channels/imessage.md b/docs/channels/imessage.md index 66cf51670..83b54cf5a 100644 --- a/docs/channels/imessage.md +++ b/docs/channels/imessage.md @@ -244,7 +244,7 @@ Provider options: - `channels.imessage.service`: `imessage | sms | auto`. - `channels.imessage.region`: SMS region. - `channels.imessage.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). -- `channels.imessage.allowFrom`: DM allowlist (handles or `chat_id:*`). `open` requires `"*"`. +- `channels.imessage.allowFrom`: DM allowlist (handles, emails, E.164 numbers, or `chat_id:*`). `open` requires `"*"`. iMessage has no usernames; use handles or chat targets. - `channels.imessage.groupPolicy`: `open | allowlist | disabled` (default: allowlist). - `channels.imessage.groupAllowFrom`: group sender allowlist. - `channels.imessage.historyLimit` / `channels.imessage.accounts.*.historyLimit`: max group messages to include as context (0 disables). diff --git a/docs/channels/matrix.md b/docs/channels/matrix.md index d0b632cb6..02764e2e6 100644 --- a/docs/channels/matrix.md +++ b/docs/channels/matrix.md @@ -70,7 +70,7 @@ Matrix is an open messaging protocol. Clawdbot connects as a Matrix user and lis - `clawdbot pairing list matrix` - `clawdbot pairing approve matrix ` - Public DMs: `channels.matrix.dm.policy="open"` plus `channels.matrix.dm.allowFrom=["*"]`. -- `channels.matrix.dm.allowFrom` accepts user IDs or display names (resolved at startup when directory search is available). +- `channels.matrix.dm.allowFrom` accepts user IDs or display names. The wizard resolves display names to user IDs when directory search is available. ## Rooms (groups) - Default: `channels.matrix.groupPolicy = "allowlist"` (mention-gated). Use `channels.defaults.groupPolicy` to override the default when unset. @@ -121,7 +121,7 @@ Provider options: - `channels.matrix.threadReplies`: `off | inbound | always` (default: inbound). - `channels.matrix.textChunkLimit`: outbound text chunk size (chars). - `channels.matrix.dm.policy`: `pairing | allowlist | open | disabled` (default: pairing). -- `channels.matrix.dm.allowFrom`: DM allowlist. `open` requires `"*"`. +- `channels.matrix.dm.allowFrom`: DM allowlist (user IDs or display names). `open` requires `"*"`. The wizard resolves names to IDs when possible. - `channels.matrix.groupPolicy`: `allowlist | open | disabled` (default: allowlist). - `channels.matrix.allowlistOnly`: force allowlist rules for DMs + rooms. - `channels.matrix.rooms`: per-room settings and allowlist. diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md index c8c668e84..4c9279941 100644 --- a/docs/channels/msteams.md +++ b/docs/channels/msteams.md @@ -76,7 +76,7 @@ Disable with: **DM access** - Default: `channels.msteams.dmPolicy = "pairing"`. Unknown senders are ignored until approved. -- `channels.msteams.allowFrom` accepts AAD object IDs, UPNs, or display names (resolved at startup when Graph allows). +- `channels.msteams.allowFrom` accepts AAD object IDs, UPNs, or display names. The wizard resolves names to IDs via Microsoft Graph when credentials allow. **Group access** - Default: `channels.msteams.groupPolicy = "allowlist"` (blocked unless you add `groupAllowFrom`). Use `channels.defaults.groupPolicy` to override the default when unset. @@ -413,7 +413,7 @@ Key settings (see `/gateway/configuration` for shared channel patterns): - `channels.msteams.webhook.port` (default `3978`) - `channels.msteams.webhook.path` (default `/api/messages`) - `channels.msteams.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing) -- `channels.msteams.allowFrom`: allowlist for DMs (AAD object IDs or UPNs). +- `channels.msteams.allowFrom`: allowlist for DMs (AAD object IDs, UPNs, or display names). The wizard resolves names to IDs during setup when Graph access is available. - `channels.msteams.textChunkLimit`: outbound text chunk size. - `channels.msteams.mediaAllowHosts`: allowlist for inbound attachment hosts (defaults to Microsoft/Teams domains). - `channels.msteams.requireMention`: require @mention in channels/groups (default true). diff --git a/docs/channels/signal.md b/docs/channels/signal.md index e19c6579b..5ed20e82a 100644 --- a/docs/channels/signal.md +++ b/docs/channels/signal.md @@ -120,7 +120,7 @@ Provider options: - `channels.signal.ignoreStories`: ignore stories from the daemon. - `channels.signal.sendReadReceipts`: forward read receipts. - `channels.signal.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). -- `channels.signal.allowFrom`: DM allowlist (E.164 or `uuid:`). `open` requires `"*"`. +- `channels.signal.allowFrom`: DM allowlist (E.164 or `uuid:`). `open` requires `"*"`. Signal has no usernames; use phone/UUID ids. - `channels.signal.groupPolicy`: `open | allowlist | disabled` (default: allowlist). - `channels.signal.groupAllowFrom`: group sender allowlist. - `channels.signal.historyLimit`: max group messages to include as context (0 disables). diff --git a/docs/channels/slack.md b/docs/channels/slack.md index 6607d54af..d0ac4526c 100644 --- a/docs/channels/slack.md +++ b/docs/channels/slack.md @@ -378,7 +378,7 @@ For fine-grained control, use these tags in agent responses: - Default: `channels.slack.dm.policy="pairing"` — unknown DM senders get a pairing code (expires after 1 hour). - Approve via: `clawdbot pairing approve slack `. - To allow anyone: set `channels.slack.dm.policy="open"` and `channels.slack.dm.allowFrom=["*"]`. -- `channels.slack.dm.allowFrom` accepts user IDs, @handles, or emails (resolved at startup when tokens allow). +- `channels.slack.dm.allowFrom` accepts user IDs, @handles, or emails (resolved at startup when tokens allow). The wizard accepts usernames and resolves them to ids during setup when tokens allow. ## Group policy - `channels.slack.groupPolicy` controls channel handling (`open|disabled|allowlist`). diff --git a/docs/channels/telegram.md b/docs/channels/telegram.md index 7f655b1c9..3c894303e 100644 --- a/docs/channels/telegram.md +++ b/docs/channels/telegram.md @@ -305,7 +305,7 @@ Use the global setting when all Telegram bots/accounts should behave the same. U - `clawdbot pairing list telegram` - `clawdbot pairing approve telegram ` - Pairing is the default token exchange used for Telegram DMs. Details: [Pairing](/start/pairing) -- `channels.telegram.allowFrom` accepts numeric user IDs (recommended) or `@username` entries. It is **not** the bot username; use the human sender’s ID. +- `channels.telegram.allowFrom` accepts numeric user IDs (recommended) or `@username` entries. It is **not** the bot username; use the human sender’s ID. The wizard accepts `@username` and resolves it to the numeric ID when possible. #### Finding your Telegram user ID Safer (no third-party bot): diff --git a/docs/channels/whatsapp.md b/docs/channels/whatsapp.md index 8bbabaa65..39e7d37db 100644 --- a/docs/channels/whatsapp.md +++ b/docs/channels/whatsapp.md @@ -308,7 +308,7 @@ WhatsApp can automatically send emoji reactions to incoming messages immediately ## Config quick map - `channels.whatsapp.dmPolicy` (DM policy: pairing/allowlist/open/disabled). - `channels.whatsapp.selfChatMode` (same-phone setup; bot uses your personal WhatsApp number). -- `channels.whatsapp.allowFrom` (DM allowlist). +- `channels.whatsapp.allowFrom` (DM allowlist). WhatsApp uses E.164 phone numbers (no usernames). - `channels.whatsapp.mediaMaxMb` (inbound media save cap). - `channels.whatsapp.ackReaction` (auto-reaction on message receipt: `{emoji, direct, group}`). - `channels.whatsapp.accounts..*` (per-account settings + optional `authDir`). diff --git a/docs/channels/zalo.md b/docs/channels/zalo.md index 7e31545dc..55f2d5104 100644 --- a/docs/channels/zalo.md +++ b/docs/channels/zalo.md @@ -92,7 +92,7 @@ Multi-account support: use `channels.zalo.accounts` with per-account tokens and - `clawdbot pairing list zalo` - `clawdbot pairing approve zalo ` - Pairing is the default token exchange. Details: [Pairing](/start/pairing) -- `channels.zalo.allowFrom` accepts numeric user IDs. +- `channels.zalo.allowFrom` accepts numeric user IDs (no username lookup available). ## Long-polling vs webhook - Default: long-polling (no public URL required). @@ -147,7 +147,7 @@ Provider options: - `channels.zalo.botToken`: bot token from Zalo Bot Platform. - `channels.zalo.tokenFile`: read token from file path. - `channels.zalo.dmPolicy`: `pairing | allowlist | open | disabled` (default: pairing). -- `channels.zalo.allowFrom`: DM allowlist (user IDs). `open` requires `"*"`. +- `channels.zalo.allowFrom`: DM allowlist (user IDs). `open` requires `"*"`. The wizard will ask for numeric IDs. - `channels.zalo.mediaMaxMb`: inbound/outbound media cap (MB, default 5). - `channels.zalo.webhookUrl`: enable webhook mode (HTTPS required). - `channels.zalo.webhookSecret`: webhook secret (8-256 chars). diff --git a/docs/channels/zalouser.md b/docs/channels/zalouser.md index a667a3f82..004a9d223 100644 --- a/docs/channels/zalouser.md +++ b/docs/channels/zalouser.md @@ -66,7 +66,7 @@ clawdbot directory groups list --channel zalouser --query "work" ## Access control (DMs) `channels.zalouser.dmPolicy` supports: `pairing | allowlist | open | disabled` (default: `pairing`). -`channels.zalouser.allowFrom` accepts user IDs or names (resolved at startup when available). +`channels.zalouser.allowFrom` accepts user IDs or names. The wizard resolves names to IDs via `zca friend find` when available. Approve via: - `clawdbot pairing list zalouser`