From a18f7d7d35ee0ecb75ab6181332327af7027e57b Mon Sep 17 00:00:00 2001 From: Vincent Koc Date: Thu, 19 Mar 2026 10:32:05 -0700 Subject: [PATCH] docs: add orphan pages to nav, fix Twitch URL, normalize json5 fences, fix msteams config --- docs/channels/irc.md | 70 ++++++++-------- docs/channels/msteams.md | 168 ++++++++++++++++++++------------------- docs/channels/nostr.md | 88 ++++++++++---------- docs/channels/twitch.md | 2 +- 4 files changed, 166 insertions(+), 162 deletions(-) diff --git a/docs/channels/irc.md b/docs/channels/irc.md index 900c531da81..33c2e47fe29 100644 --- a/docs/channels/irc.md +++ b/docs/channels/irc.md @@ -17,18 +17,18 @@ IRC ships as an extension plugin, but it is configured in the main config under 1. Enable IRC config in `~/.openclaw/openclaw.json`. 2. Set at least: -```json +```json5 { - "channels": { - "irc": { - "enabled": true, - "host": "irc.libera.chat", - "port": 6697, - "tls": true, - "nick": "openclaw-bot", - "channels": ["#openclaw"] - } - } + channels: { + irc: { + enabled: true, + host: "irc.libera.chat", + port: 6697, + tls: true, + nick: "openclaw-bot", + channels: ["#openclaw"], + }, + }, } ``` @@ -75,7 +75,7 @@ If you see logs like: Example (allow anyone in `#tuirc-dev` to talk to the bot): -```json5 +```json55 { channels: { irc: { @@ -96,7 +96,7 @@ That means you may see logs like `drop channel … (missing-mention)` unless the To make the bot reply in an IRC channel **without needing a mention**, disable mention gating for that channel: -```json5 +```json55 { channels: { irc: { @@ -114,7 +114,7 @@ To make the bot reply in an IRC channel **without needing a mention**, disable m Or to allow **all** IRC channels (no per-channel allowlist) and still reply without mentions: -```json5 +```json55 { channels: { irc: { @@ -134,7 +134,7 @@ To reduce risk, restrict tools for that channel. ### Same tools for everyone in the channel -```json5 +```json55 { channels: { irc: { @@ -155,7 +155,7 @@ To reduce risk, restrict tools for that channel. Use `toolsBySender` to apply a stricter policy to `"*"` and a looser one to your nick: -```json5 +```json55 { channels: { irc: { @@ -190,32 +190,32 @@ For more on group access vs mention-gating (and how they interact), see: [/chann To identify with NickServ after connect: -```json +```json5 { - "channels": { - "irc": { - "nickserv": { - "enabled": true, - "service": "NickServ", - "password": "your-nickserv-password" - } - } - } + channels: { + irc: { + nickserv: { + enabled: true, + service: "NickServ", + password: "your-nickserv-password", + }, + }, + }, } ``` Optional one-time registration on connect: -```json +```json5 { - "channels": { - "irc": { - "nickserv": { - "register": true, - "registerEmail": "bot@example.com" - } - } - } + channels: { + irc: { + nickserv: { + register: true, + registerEmail: "bot@example.com", + }, + }, + }, } ``` diff --git a/docs/channels/msteams.md b/docs/channels/msteams.md index 88cba3ce6aa..49a9f04347e 100644 --- a/docs/channels/msteams.md +++ b/docs/channels/msteams.md @@ -260,15 +260,17 @@ This is often easier than hand-editing JSON manifests. 4. **Configure OpenClaw** - ```json + ```json5 { - "msteams": { - "enabled": true, - "appId": "", - "appPassword": "", - "tenantId": "", - "webhook": { "port": 3978, "path": "/api/messages" } - } + channels: { + msteams: { + enabled: true, + appId: "", + appPassword: "", + tenantId: "", + webhook: { port: 3978, path: "/api/messages" }, + }, + }, } ``` @@ -312,49 +314,49 @@ These are the **existing resourceSpecific permissions** in our Teams app manifes Minimal, valid example with the required fields. Replace IDs and URLs. -```json +```json5 { - "$schema": "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", - "manifestVersion": "1.23", - "version": "1.0.0", - "id": "00000000-0000-0000-0000-000000000000", - "name": { "short": "OpenClaw" }, - "developer": { - "name": "Your Org", - "websiteUrl": "https://example.com", - "privacyUrl": "https://example.com/privacy", - "termsOfUseUrl": "https://example.com/terms" + $schema: "https://developer.microsoft.com/en-us/json-schemas/teams/v1.23/MicrosoftTeams.schema.json", + manifestVersion: "1.23", + version: "1.0.0", + id: "00000000-0000-0000-0000-000000000000", + name: { short: "OpenClaw" }, + developer: { + name: "Your Org", + websiteUrl: "https://example.com", + privacyUrl: "https://example.com/privacy", + termsOfUseUrl: "https://example.com/terms", }, - "description": { "short": "OpenClaw in Teams", "full": "OpenClaw in Teams" }, - "icons": { "outline": "outline.png", "color": "color.png" }, - "accentColor": "#5B6DEF", - "bots": [ + description: { short: "OpenClaw in Teams", full: "OpenClaw in Teams" }, + icons: { outline: "outline.png", color: "color.png" }, + accentColor: "#5B6DEF", + bots: [ { - "botId": "11111111-1111-1111-1111-111111111111", - "scopes": ["personal", "team", "groupChat"], - "isNotificationOnly": false, - "supportsCalling": false, - "supportsVideo": false, - "supportsFiles": true - } + botId: "11111111-1111-1111-1111-111111111111", + scopes: ["personal", "team", "groupChat"], + isNotificationOnly: false, + supportsCalling: false, + supportsVideo: false, + supportsFiles: true, + }, ], - "webApplicationInfo": { - "id": "11111111-1111-1111-1111-111111111111" + webApplicationInfo: { + id: "11111111-1111-1111-1111-111111111111", + }, + authorization: { + permissions: { + resourceSpecific: [ + { name: "ChannelMessage.Read.Group", type: "Application" }, + { name: "ChannelMessage.Send.Group", type: "Application" }, + { name: "Member.Read.Group", type: "Application" }, + { name: "Owner.Read.Group", type: "Application" }, + { name: "ChannelSettings.Read.Group", type: "Application" }, + { name: "TeamMember.Read.Group", type: "Application" }, + { name: "TeamSettings.Read.Group", type: "Application" }, + { name: "ChatMessage.Read.Chat", type: "Application" }, + ], + }, }, - "authorization": { - "permissions": { - "resourceSpecific": [ - { "name": "ChannelMessage.Read.Group", "type": "Application" }, - { "name": "ChannelMessage.Send.Group", "type": "Application" }, - { "name": "Member.Read.Group", "type": "Application" }, - { "name": "Owner.Read.Group", "type": "Application" }, - { "name": "ChannelSettings.Read.Group", "type": "Application" }, - { "name": "TeamMember.Read.Group", "type": "Application" }, - { "name": "TeamSettings.Read.Group", "type": "Application" }, - { "name": "ChatMessage.Read.Chat", "type": "Application" } - ] - } - } } ``` @@ -500,20 +502,22 @@ Teams recently introduced two channel UI styles over the same underlying data mo **Solution:** Configure `replyStyle` per-channel based on how the channel is set up: -```json +```json5 { - "msteams": { - "replyStyle": "thread", - "teams": { - "19:abc...@thread.tacv2": { - "channels": { - "19:xyz...@thread.tacv2": { - "replyStyle": "top-level" - } - } - } - } - } + channels: { + msteams: { + replyStyle: "thread", + teams: { + "19:abc...@thread.tacv2": { + channels: { + "19:xyz...@thread.tacv2": { + replyStyle: "top-level", + }, + }, + }, + }, + }, + }, } ``` @@ -616,16 +620,16 @@ The `card` parameter accepts an Adaptive Card JSON object. When `card` is provid **Agent tool:** -```json +```json5 { - "action": "send", - "channel": "msteams", - "target": "user:", - "card": { - "type": "AdaptiveCard", - "version": "1.5", - "body": [{ "type": "TextBlock", "text": "Hello!" }] - } + action: "send", + channel: "msteams", + target: "user:", + card: { + type: "AdaptiveCard", + version: "1.5", + body: [{ type: "TextBlock", text: "Hello!" }], + }, } ``` @@ -669,25 +673,25 @@ openclaw message send --channel msteams --target "conversation:19:abc...@thread. **Agent tool examples:** -```json +```json5 { - "action": "send", - "channel": "msteams", - "target": "user:John Smith", - "message": "Hello!" + action: "send", + channel: "msteams", + target: "user:John Smith", + message: "Hello!", } ``` -```json +```json5 { - "action": "send", - "channel": "msteams", - "target": "conversation:19:abc...@thread.tacv2", - "card": { - "type": "AdaptiveCard", - "version": "1.5", - "body": [{ "type": "TextBlock", "text": "Hello" }] - } + action: "send", + channel: "msteams", + target: "conversation:19:abc...@thread.tacv2", + card: { + type: "AdaptiveCard", + version: "1.5", + body: [{ type: "TextBlock", text: "Hello" }], + }, } ``` diff --git a/docs/channels/nostr.md b/docs/channels/nostr.md index c8d5d69753b..d453d9f653c 100644 --- a/docs/channels/nostr.md +++ b/docs/channels/nostr.md @@ -60,13 +60,13 @@ nak key generate 2. Add to config: -```json +```json5 { - "channels": { - "nostr": { - "privateKey": "${NOSTR_PRIVATE_KEY}" - } - } + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + }, + }, } ``` @@ -96,23 +96,23 @@ Profile data is published as a NIP-01 `kind:0` event. You can manage it from the Example: -```json +```json5 { - "channels": { - "nostr": { - "privateKey": "${NOSTR_PRIVATE_KEY}", - "profile": { - "name": "openclaw", - "displayName": "OpenClaw", - "about": "Personal assistant DM bot", - "picture": "https://example.com/avatar.png", - "banner": "https://example.com/banner.png", - "website": "https://example.com", - "nip05": "openclaw@example.com", - "lud16": "openclaw@example.com" - } - } - } + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + profile: { + name: "openclaw", + displayName: "OpenClaw", + about: "Personal assistant DM bot", + picture: "https://example.com/avatar.png", + banner: "https://example.com/banner.png", + website: "https://example.com", + nip05: "openclaw@example.com", + lud16: "openclaw@example.com", + }, + }, + }, } ``` @@ -132,15 +132,15 @@ Notes: ### Allowlist example -```json +```json5 { - "channels": { - "nostr": { - "privateKey": "${NOSTR_PRIVATE_KEY}", - "dmPolicy": "allowlist", - "allowFrom": ["npub1abc...", "npub1xyz..."] - } - } + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + dmPolicy: "allowlist", + allowFrom: ["npub1abc...", "npub1xyz..."], + }, + }, } ``` @@ -155,14 +155,14 @@ Accepted formats: Defaults: `relay.damus.io` and `nos.lol`. -```json +```json5 { - "channels": { - "nostr": { - "privateKey": "${NOSTR_PRIVATE_KEY}", - "relays": ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"] - } - } + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + relays: ["wss://relay.damus.io", "wss://relay.primal.net", "wss://nostr.wine"], + }, + }, } ``` @@ -191,14 +191,14 @@ Tips: docker run -p 7777:7777 ghcr.io/hoytech/strfry ``` -```json +```json5 { - "channels": { - "nostr": { - "privateKey": "${NOSTR_PRIVATE_KEY}", - "relays": ["ws://localhost:7777"] - } - } + channels: { + nostr: { + privateKey: "${NOSTR_PRIVATE_KEY}", + relays: ["ws://localhost:7777"], + }, + }, } ``` diff --git a/docs/channels/twitch.md b/docs/channels/twitch.md index d184a2d8432..98174fdcc7b 100644 --- a/docs/channels/twitch.md +++ b/docs/channels/twitch.md @@ -123,7 +123,7 @@ Prefer `allowFrom` for a hard allowlist. Use `allowedRoles` instead if you want **Why user IDs?** Usernames can change, allowing impersonation. User IDs are permanent. -Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-%20to-user-id/) (Convert your Twitch username to ID) +Find your Twitch user ID: [https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/](https://www.streamweasels.com/tools/convert-twitch-username-to-user-id/) (Convert your Twitch username to ID) ## Token refresh (optional)