docs: sync READMEs, examples, and channel docs to match current config#916
Conversation
There was a problem hiding this comment.
Pull request overview
This PR streamlines channel configuration by removing unused/dead per-channel config fields (webhook host/port, placeholder/typing where unsupported) and adds an explicit “typing enabled” gate in BaseChannel so typing indicators only auto-trigger when configured.
Changes:
- Removed obsolete
webhook_host/webhook_portfields for LINE/WeCom/WeComApp and removed unusedtyping/placeholderfields for channels that don’t implement the corresponding capabilities. - Added
WithTypingEnabled(...)option and gatedBaseChannel.HandleMessagetyping auto-trigger accordingly; wired the option into TypingCapable channels. - Updated defaults/examples/docs across configs and READMEs to reflect the new schema and shared Gateway webhook server.
Reviewed changes
Copilot reviewed 21 out of 21 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| pkg/config/defaults.go | Enables typing by default for selected channels; removes per-channel webhook host/port defaults |
| pkg/config/config.go | Removes dead config fields; adds/updates typing fields; marks legacy keys as deprecated |
| pkg/channels/base.go | Adds typing enable/disable option and gates StartTyping invocation |
| pkg/channels/telegram/telegram.go | Passes typing gate option from config into BaseChannel |
| pkg/channels/discord/discord.go | Passes typing gate option from config into BaseChannel |
| pkg/channels/line/line.go | Passes typing gate option from config into BaseChannel |
| pkg/channels/pico/pico.go | Passes typing gate option from config into BaseChannel |
| pkg/channels/README.md | Syncs channel-system dev docs with config/capabilities (some statements need correction) |
| pkg/channels/README.zh.md | Same as above for Chinese version (some statements need correction) |
| docs/wecom-app-configuration.md | Updates webhook callback URL guidance to shared Gateway port |
| docs/channels/wecom/wecom_bot/README.zh.md | Removes per-channel webhook host/port; notes shared Gateway server |
| docs/channels/wecom/wecom_app/README.zh.md | Removes per-channel webhook host/port; notes shared Gateway server |
| docs/channels/line/README.zh.md | Removes per-channel webhook host/port and updates Gateway guidance (has a duplicate row) |
| docs/channels/discord/README.zh.md | Updates Discord example to use group_trigger instead of mention_only |
| config/config.example.json | Updates examples (Discord group_trigger, removes per-channel webhook host/port) |
| README.md | Notes shared Gateway webhook server; updates Discord/LINE/WeCom examples accordingly (note needs Feishu correction) |
| README.zh.md | Same as above for Chinese README (note needs Feishu correction) |
| README.vi.md | Updates LINE/WeCom examples and ports to shared Gateway |
| README.pt-br.md | Updates LINE/WeCom examples and ports to shared Gateway |
| README.ja.md | Updates LINE/WeCom examples and ports to shared Gateway |
| README.fr.md | Updates LINE/WeCom examples and ports to shared Gateway |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
pkg/config/config.go
Outdated
| Token string `json:"token" env:"PICOCLAW_CHANNELS_DISCORD_TOKEN"` | ||
| AllowFrom FlexibleStringSlice `json:"allow_from" env:"PICOCLAW_CHANNELS_DISCORD_ALLOW_FROM"` | ||
| MentionOnly bool `json:"mention_only" env:"PICOCLAW_CHANNELS_DISCORD_MENTION_ONLY"` | ||
| MentionOnly bool `json:"mention_only" env:"PICOCLAW_CHANNELS_DISCORD_MENTION_ONLY"` // deprecated: use group_trigger.mention_only |
There was a problem hiding this comment.
DiscordConfig.MentionOnly is marked deprecated in comments, but because it lacks omitempty it will still be written into newly generated config files via SaveConfig (json.MarshalIndent), which conflicts with the updated examples that use group_trigger. Consider adding omitempty (and/or moving the field behind a dedicated legacy struct) so new configs don’t include deprecated keys while unmarshalling old configs still works.
| MentionOnly bool `json:"mention_only" env:"PICOCLAW_CHANNELS_DISCORD_MENTION_ONLY"` // deprecated: use group_trigger.mention_only | |
| MentionOnly bool `json:"mention_only,omitempty" env:"PICOCLAW_CHANNELS_DISCORD_MENTION_ONLY"` // deprecated: use group_trigger.mention_only |
pkg/config/config.go
Outdated
| AccessToken string `json:"access_token" env:"PICOCLAW_CHANNELS_ONEBOT_ACCESS_TOKEN"` | ||
| ReconnectInterval int `json:"reconnect_interval" env:"PICOCLAW_CHANNELS_ONEBOT_RECONNECT_INTERVAL"` | ||
| GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` | ||
| GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` // deprecated: use group_trigger.prefixes |
There was a problem hiding this comment.
OneBotConfig.GroupTriggerPrefix is now documented as deprecated, but since it lacks omitempty it will still be emitted into new configs (defaults set it to an empty slice). Consider changing the JSON tag to json:"group_trigger_prefix,omitempty" so freshly written configs don’t include this legacy field while LoadConfig.migrateChannelConfigs still supports it on read.
| GroupTriggerPrefix []string `json:"group_trigger_prefix" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` // deprecated: use group_trigger.prefixes | |
| GroupTriggerPrefix []string `json:"group_trigger_prefix,omitempty" env:"PICOCLAW_CHANNELS_ONEBOT_GROUP_TRIGGER_PREFIX"` // deprecated: use group_trigger.prefixes |
| 6. **DingTalk uses Stream mode**: DingTalk uses the SDK's Stream/WebSocket mode (not HTTP webhook), so it does not implement `WebhookHandler`. | ||
|
|
||
| 3. **WeCom has two factories**: `"wecom"` (Bot mode) and `"wecom_app"` (App mode) are registered separately. | ||
| 7. **PlaceholderConfig vs implementation**: `PlaceholderConfig` appears in 6 channel configs (Telegram, Discord, Slack, LINE, OneBot, Pico), but only channels that implement both `PlaceholderCapable` + `MessageEditor` (Telegram, Discord, Pico) can actually use placeholder message editing. The rest are reserved fields. |
There was a problem hiding this comment.
This section says PlaceholderConfig appears in 6 channel configs including Slack/LINE/OneBot, but in the current config structs those channels no longer have a placeholder field (Slack/LINE/OneBot removed it). Please update the list to match the actual config schema (and/or the channels that implement PlaceholderCapable + MessageEditor).
| 7. **PlaceholderConfig vs implementation**: `PlaceholderConfig` appears in 6 channel configs (Telegram, Discord, Slack, LINE, OneBot, Pico), but only channels that implement both `PlaceholderCapable` + `MessageEditor` (Telegram, Discord, Pico) can actually use placeholder message editing. The rest are reserved fields. | |
| 7. **PlaceholderConfig availability**: `PlaceholderConfig` is only available for channels that implement both `PlaceholderCapable` and `MessageEditor` (currently Telegram, Discord, and Pico); other channels do not expose this field in their configs. |
pkg/channels/README.md
Outdated
| Token string `yaml:"token" json:"token"` | ||
| AllowFrom []string `yaml:"allow_from" json:"allow_from"` | ||
| GroupTrigger GroupTriggerConfig `yaml:"group_trigger" json:"group_trigger"` | ||
| Placeholder PlaceholderConfig `yaml:"placeholder" json:"placeholder"` | ||
| ReasoningChannelID string `yaml:"reasoning_channel_id" json:"reasoning_channel_id"` |
There was a problem hiding this comment.
The example struct shown here includes yaml:"..." tags, but PicoClaw configuration is JSON-based (config.json) and the actual Go config structs use JSON/env tags. Keeping YAML tags in the docs can mislead readers into thinking YAML is supported; consider removing the YAML tags or adding a note that YAML isn’t used.
| 6. **DingTalk 使用 Stream 模式**:DingTalk 使用 SDK 的 Stream/WebSocket 模式(非 HTTP webhook),因此不实现 `WebhookHandler`。 | ||
|
|
||
| 3. **WeCom 有两个工厂**:`"wecom"`(Bot 模式)和 `"wecom_app"`(应用模式)分别注册。 | ||
| 7. **PlaceholderConfig 的配置与实现**:`PlaceholderConfig` 出现在 6 个 channel config 中(Telegram、Discord、Slack、LINE、OneBot、Pico),但只有实现了 `PlaceholderCapable` + `MessageEditor` 的 channel(Telegram、Discord、Pico)能真正使用占位消息编辑功能。其余 channel 的 `PlaceholderConfig` 为预留字段。 |
There was a problem hiding this comment.
This section says PlaceholderConfig appears in 6 channel configs including Slack/LINE/OneBot, but the current config structs no longer include placeholder for those channels. Please update the list to match the actual schema and implementation status.
| 7. **PlaceholderConfig 的配置与实现**:`PlaceholderConfig` 出现在 6 个 channel config 中(Telegram、Discord、Slack、LINE、OneBot、Pico),但只有实现了 `PlaceholderCapable` + `MessageEditor` 的 channel(Telegram、Discord、Pico)能真正使用占位消息编辑功能。其余 channel 的 `PlaceholderConfig` 为预留字段。 | |
| 7. **PlaceholderConfig 的配置与实现**:`PlaceholderConfig` 目前只出现在 3 个 channel config 中(Telegram、Discord、Pico),且这三个 channel 都实现了 `PlaceholderCapable` + `MessageEditor`,可以真正使用占位消息编辑功能。 |
| if c.owner != nil && c.placeholderRecorder != nil { | ||
| // Typing — independent pipeline | ||
| if tc, ok := c.owner.(TypingCapable); ok { | ||
| if stop, err := tc.StartTyping(ctx, chatID); err == nil { | ||
| c.placeholderRecorder.RecordTypingStop(c.name, chatID, stop) | ||
| // Typing — independent pipeline (gated by typingEnabled; nil = default true) | ||
| if c.typingEnabled == nil || *c.typingEnabled { | ||
| if tc, ok := c.owner.(TypingCapable); ok { | ||
| if stop, err := tc.StartTyping(ctx, chatID); err == nil { | ||
| c.placeholderRecorder.RecordTypingStop(c.name, chatID, stop) | ||
| } | ||
| } |
There was a problem hiding this comment.
The new typing gate changes HandleMessage behavior, but there are no tests covering that typing is triggered by default and suppressed when typing is explicitly disabled (WithTypingEnabled(false)). Adding a unit test around HandleMessage with a TypingCapable mock would prevent regressions in this gating logic.
| | webhook_port | int | 是 | Webhook 监听的端口 (默认为 18791) | | ||
| | webhook_path | string | 是 | Webhook 的路径 (默认为 /webhook/line) | | ||
| | allow_from | array | 否 | 用户ID白名单,空表示允许所有用户 | | ||
| | allow_from | array | 否 | 用户ID白名单,空表示允许所有用户 | |
There was a problem hiding this comment.
The config table contains a duplicated allow_from row (it appears twice). Please remove the duplicate entry to avoid confusion.
| | allow_from | array | 否 | 用户ID白名单,空表示允许所有用户 | |
pkg/channels/README.md
Outdated
| 7. **PlaceholderConfig vs implementation**: `PlaceholderConfig` appears in 6 channel configs (Telegram, Discord, Slack, LINE, OneBot, Pico), but only channels that implement both `PlaceholderCapable` + `MessageEditor` (Telegram, Discord, Pico) can actually use placeholder message editing. The rest are reserved fields. | ||
|
|
||
| 4. **Pico Protocol**: `pkg/channels/pico/` implements a custom PicoClaw native protocol channel that receives messages via webhook. No newline at end of file | ||
| 8. **ReasoningChannelID**: All 12 channel configs have a `ReasoningChannelID` field, used to route LLM reasoning/thinking output to a designated channel. `BaseChannel` exposes this via the `WithReasoningChannelID` option and `ReasoningChannelID()` method. No newline at end of file |
There was a problem hiding this comment.
This section claims all 12 channel configs have ReasoningChannelID, but PicoConfig currently does not include a reasoning_channel_id field. Please either add ReasoningChannelID to PicoConfig or adjust the documentation to reflect the actual schema.
| 8. **ReasoningChannelID**: All 12 channel configs have a `ReasoningChannelID` field, used to route LLM reasoning/thinking output to a designated channel. `BaseChannel` exposes this via the `WithReasoningChannelID` option and `ReasoningChannelID()` method. | |
| 8. **ReasoningChannelID**: A `ReasoningChannelID` field, where present in a channel config, is used to route LLM reasoning/thinking output to a designated channel. `BaseChannel` exposes this via the `WithReasoningChannelID` option and `ReasoningChannelID()` method. |
pkg/channels/README.zh.md
Outdated
| Token string `yaml:"token" json:"token"` | ||
| AllowFrom []string `yaml:"allow_from" json:"allow_from"` | ||
| GroupTrigger GroupTriggerConfig `yaml:"group_trigger" json:"group_trigger"` | ||
| Placeholder PlaceholderConfig `yaml:"placeholder" json:"placeholder"` | ||
| ReasoningChannelID string `yaml:"reasoning_channel_id" json:"reasoning_channel_id"` |
There was a problem hiding this comment.
The example config struct includes yaml:"..." tags, but PicoClaw uses JSON configuration (config.json) and the real config structs use JSON/env tags. Consider removing the YAML tags or adding an explicit note that YAML isn’t supported to avoid confusion.
README.zh.md
Outdated
|
|
||
| PicoClaw 支持多种聊天平台,使您的 Agent 能够连接到任何地方。 | ||
|
|
||
| > **注意**: 所有 Webhook 类渠道(LINE、WeCom、飞书等)均挂载在同一个 Gateway HTTP 服务器上(`gateway.host`:`gateway.port`,默认 `127.0.0.1:18790`),无需为每个渠道单独配置端口。 |
There was a problem hiding this comment.
这里把“飞书”等也归为 webhook 类渠道并说明由 Gateway HTTP 服务器提供,但当前 Feishu channel 实现是 WebSocket 模式(非 HTTP webhook handler),不依赖 Gateway 端口。建议从示例中移除“飞书”,或明确哪些渠道实际使用 Gateway(如 LINE/WeCom)。
| > **注意**: 所有 Webhook 类渠道(LINE、WeCom、飞书等)均挂载在同一个 Gateway HTTP 服务器上(`gateway.host`:`gateway.port`,默认 `127.0.0.1:18790`),无需为每个渠道单独配置端口。 | |
| > **注意**: 所有基于 **HTTP Webhook** 的渠道(如 LINE、WeCom 等)均挂载在同一个 Gateway HTTP 服务器上(`gateway.host`:`gateway.port`,默认 `127.0.0.1:18790`),无需为每个渠道单独配置端口;像飞书当前使用的是 WebSocket 模式,并不依赖该 Gateway 端口。 |
- Update config.example.json to remove dead webhook_host/webhook_port and unused typing/placeholder fields - Sync all READMEs (en/zh/ja/pt-br/fr/vi) with current channel config - Update Discord docs: mention_only → group_trigger - Update LINE, WeCom, WeComApp channel docs
5ddf1b0 to
c57a9c1
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 14 out of 14 changed files in this pull request and generated 3 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
pkg/channels/README.md
Outdated
| > m.initChannel("matrix_native", "Matrix Native") | ||
| > } else { | ||
| > m.initChannel("matrix", "Matrix") |
There was a problem hiding this comment.
The example for “multiple modes (like WhatsApp Bridge vs Native)” uses matrix_native/matrix, which is inconsistent with the WhatsApp example being discussed and can mislead readers. Consider switching the sample to whatsapp_native/whatsapp (or make it a generic placeholder like <channel>_native).
| > m.initChannel("matrix_native", "Matrix Native") | |
| > } else { | |
| > m.initChannel("matrix", "Matrix") | |
| > m.initChannel("whatsapp_native", "WhatsApp Native") | |
| > } else { | |
| > m.initChannel("whatsapp", "WhatsApp") |
pkg/channels/README.zh.md
Outdated
| > m.initChannel("matrix_native", "Matrix Native") | ||
| > } else { | ||
| > m.initChannel("matrix", "Matrix") |
There was a problem hiding this comment.
这里说“多种模式(如 WhatsApp Bridge vs Native)”,但示例却用了 matrix_native/matrix,容易让读者误以为是 Matrix 的模式切换。建议改成 whatsapp_native/whatsapp,或用 <channel>_native 这类泛化示例。
| > m.initChannel("matrix_native", "Matrix Native") | |
| > } else { | |
| > m.initChannel("matrix", "Matrix") | |
| > m.initChannel("whatsapp_native", "WhatsApp Native") | |
| > } else { | |
| > m.initChannel("whatsapp", "WhatsApp") |
nikolasdehor
left a comment
There was a problem hiding this comment.
Review: docs: sync READMEs, examples, and channel docs to match current config
Documentation sync PR. Reviewed the key changes.
Changes Summary
-
Removed dead config fields --
webhook_hostandwebhook_portremoved fromconfig.example.jsonand all README examples. This aligns with the current architecture where all channel webhooks are served by a shared gateway server on a single port. -
Discord docs update --
mention_onlyrenamed togroup_trigger. Matches current config schema. -
LINE webhook port -- Corrected from
18791to18790(shared gateway port). Docker Compose examples updated accordingly. -
WeCom/WeComApp docs -- Removed per-channel
webhook_host/webhook_portreferences, added notes about shared gateway serving. -
Channel implementation READMEs --
pkg/channels/README.mdandREADME.zh.mdsignificantly updated with current channel interface, lifecycle, and config documentation. -
Multi-language sync -- Changes applied consistently across en, zh, ja, pt-br, fr, and vi READMEs.
Notes
-
The
README.zh.mddiff is the smallest (+2/-0) -- just two new lines. The other language READMEs have more substantial changes. This asymmetry might mean zh was already more up-to-date, or some changes were missed. Worth a quick cross-check. -
Config example now has
"webhook_path": "/webhook/line"without host/port, which correctly represents the current config schema.
Looks good. Documentation maintenance like this is valuable for the project.
| 5. 设置回调 URL 为 `http://<your-server-ip>:<port>/webhook/wecom-app` | ||
| 6. 将 CorpID, Secret, AgentID 等信息填入配置文件 | ||
|
|
||
| 注意: PicoClaw 现在使用共享的 Gateway HTTP 服务器来接收所有渠道的 webhook 回调,默认监听地址为 127.0.0.1:18790。如需从公网接收回调,请把外部域名反向代理到 Gateway(默认端口 18790)。 |
xiaket
left a comment
There was a problem hiding this comment.
LGTM with some nits for you to consider.
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 14 out of 14 changed files in this pull request and generated 2 comments.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
docs/channels/line/README.zh.md
Outdated
| | channel_access_token | string | 是 | LINE Messaging API 的 Channel Access Token | | ||
| | webhook_host | string | 是 | Webhook 监听的主机地址 (通常为 0.0.0.0) | | ||
| | webhook_port | int | 是 | Webhook 监听的端口 (默认为 18791) | | ||
| | webhook_path | string | 是 | Webhook 的路径 (默认为 /webhook/line) | |
There was a problem hiding this comment.
The table marks webhook_path as required, but the LINE channel falls back to the default "/webhook/line" when the field is empty. Please mark webhook_path as optional (or explicitly say it defaults to /webhook/line when omitted) to match the implementation.
| | webhook_path | string | 是 | Webhook 的路径 (默认为 /webhook/line) | | |
| | webhook_path | string | 否 | Webhook 的路径 (默认为 /webhook/line) | |
README.vi.md
Outdated
| } | ||
| ``` | ||
|
|
||
| > **Lưu ý:** WeCom Bot incoming webhook endpoints are served by the shared Gateway HTTP server (mặc định 127.0.0.1:18790). Nếu bạn cần truy cập từ bên ngoài, đặt reverse proxy hoặc mở port Gateway phù hợp. |
There was a problem hiding this comment.
This Vietnamese README note mixes English and Vietnamese (“WeCom Bot incoming webhook endpoints are served…”). Please translate that sentence fully to Vietnamese (or keep it fully in English) so the localized README stays consistent and readable.
| > **Lưu ý:** WeCom Bot incoming webhook endpoints are served by the shared Gateway HTTP server (mặc định 127.0.0.1:18790). Nếu bạn cần truy cập từ bên ngoài, đặt reverse proxy hoặc mở port Gateway phù hợp. | |
| > **Lưu ý:** Các endpoint webhook nhận vào của WeCom Bot được phục vụ bởi máy chủ Gateway HTTP dùng chung (mặc định 127.0.0.1:18790). Nếu bạn cần truy cập từ bên ngoài, hãy cấu hình reverse proxy hoặc mở cổng Gateway tương ứng. |
- Remove Feishu from webhook channel list in README.md and README.zh.md; add clarifying note that Feishu uses WebSocket/SDK mode instead - Replace Chinese text in README.vi.md header with Vietnamese equivalent - Translate mixed-language WeCom note in README.vi.md to full Vietnamese - Mark webhook_path as optional (否) in docs/channels/line/README.zh.md - Remove incorrect yaml struct tags from new-channel example in pkg/channels/README.md and README.zh.md (config uses json tags only) - Fix multi-mode initChannel example to use whatsapp/whatsapp_native (matching the "WhatsApp Bridge vs Native" comment) instead of matrix - Correct ReasoningChannelID description: list the 12 channels that have the field and note that PicoConfig does not expose it
Changes from upstream: - fix(channel): config cleanup and regex precompile (sipeed#911, sipeed#916) - fix(github_copilot): improve error handling (sipeed#919) - fix(wecom): context leaks and data race fixes (sipeed#914, sipeed#918) - fix(tools): HTTP client caching and response body cleanup (sipeed#940) - feat(tui): Add configurable Launcher and Gateway process management (sipeed#909) - feat(migrate): Update migration system with openclaw support (sipeed#910) - fix(skills): Use registry-backed search for skills discovery (sipeed#929) - build: Add armv6 support to goreleaser (sipeed#905) - docs: Sync READMEs and channel documentation
- Remove Feishu from webhook channel list in README.md and README.zh.md; add clarifying note that Feishu uses WebSocket/SDK mode instead - Replace Chinese text in README.vi.md header with Vietnamese equivalent - Translate mixed-language WeCom note in README.vi.md to full Vietnamese - Mark webhook_path as optional (否) in docs/channels/line/README.zh.md - Remove incorrect yaml struct tags from new-channel example in pkg/channels/README.md and README.zh.md (config uses json tags only) - Fix multi-mode initChannel example to use whatsapp/whatsapp_native (matching the "WhatsApp Bridge vs Native" comment) instead of matrix - Correct ReasoningChannelID description: list the 12 channels that have the field and note that PicoConfig does not expose it
- Remove Feishu from webhook channel list in README.md and README.zh.md; add clarifying note that Feishu uses WebSocket/SDK mode instead - Replace Chinese text in README.vi.md header with Vietnamese equivalent - Translate mixed-language WeCom note in README.vi.md to full Vietnamese - Mark webhook_path as optional (否) in docs/channels/line/README.zh.md - Remove incorrect yaml struct tags from new-channel example in pkg/channels/README.md and README.zh.md (config uses json tags only) - Fix multi-mode initChannel example to use whatsapp/whatsapp_native (matching the "WhatsApp Bridge vs Native" comment) instead of matrix - Correct ReasoningChannelID description: list the 12 channels that have the field and note that PicoConfig does not expose it
…anup docs: sync READMEs, examples, and channel docs to match current config
- Remove Feishu from webhook channel list in README.md and README.zh.md; add clarifying note that Feishu uses WebSocket/SDK mode instead - Replace Chinese text in README.vi.md header with Vietnamese equivalent - Translate mixed-language WeCom note in README.vi.md to full Vietnamese - Mark webhook_path as optional (否) in docs/channels/line/README.zh.md - Remove incorrect yaml struct tags from new-channel example in pkg/channels/README.md and README.zh.md (config uses json tags only) - Fix multi-mode initChannel example to use whatsapp/whatsapp_native (matching the "WhatsApp Bridge vs Native" comment) instead of matrix - Correct ReasoningChannelID description: list the 12 channels that have the field and note that PicoConfig does not expose it
…anup docs: sync READMEs, examples, and channel docs to match current config
📝 Description