@symerian/symi 3.0.16 → 3.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/docs/.i18n/zh-CN.tm.jsonl +0 -20
- package/docs/automation/cron-jobs.md +0 -2
- package/docs/automation/hooks.md +0 -2
- package/docs/automation/poll.md +0 -8
- package/docs/automation/webhook.md +0 -2
- package/docs/capabilities.md +0 -2
- package/docs/channels/broadcast-groups.md +0 -1
- package/docs/channels/channel-routing.md +4 -10
- package/docs/channels/group-messages.md +0 -2
- package/docs/channels/groups.md +0 -10
- package/docs/channels/index.md +0 -1
- package/docs/channels/matrix.md +0 -2
- package/docs/channels/msteams.md +0 -2
- package/docs/channels/pairing.md +0 -3
- package/docs/channels/signal.md +0 -2
- package/docs/channels/troubleshooting.md +0 -7
- package/docs/cli/channels.md +0 -6
- package/docs/cli/configure.md +0 -1
- package/docs/cli/directory.md +0 -1
- package/docs/cli/index.md +0 -7
- package/docs/cli/message.md +1 -47
- package/docs/cli/status.md +0 -1
- package/docs/concepts/architecture.md +0 -1
- package/docs/concepts/features.md +0 -2
- package/docs/concepts/markdown-formatting.md +6 -8
- package/docs/concepts/memory.md +0 -4
- package/docs/concepts/messages.md +0 -1
- package/docs/concepts/models.md +0 -1
- package/docs/concepts/multi-agent.md +4 -19
- package/docs/concepts/queue.md +0 -3
- package/docs/concepts/retry.md +0 -5
- package/docs/concepts/session-tool.md +0 -2
- package/docs/concepts/session.md +2 -9
- package/docs/concepts/streaming.md +0 -2
- package/docs/concepts/system-prompt.md +0 -1
- package/docs/concepts/timezone.md +0 -1
- package/docs/date-time.md +0 -1
- package/docs/docs.json +2 -11
- package/docs/experiments/plans/cron-add-hardening.md +0 -1
- package/docs/experiments/plans/session-binding-channel-agnostic.md +2 -23
- package/docs/experiments/plans/thread-bound-subagents.md +7 -64
- package/docs/gateway/configuration-examples.md +0 -10
- package/docs/gateway/configuration-reference.md +22 -47
- package/docs/gateway/configuration.md +0 -3
- package/docs/gateway/heartbeat.md +0 -2
- package/docs/gateway/security/index.md +1 -6
- package/docs/gateway/troubleshooting.md +0 -1
- package/docs/help/faq.md +0 -13
- package/docs/help/troubleshooting.md +0 -1
- package/docs/index.md +0 -6
- package/docs/install/ansible.md +2 -3
- package/docs/install/docker.md +1 -7
- package/docs/install/fly.md +0 -14
- package/docs/install/northflank.mdx +7 -11
- package/docs/install/railway.mdx +6 -10
- package/docs/install/render.mdx +1 -2
- package/docs/ja-JP/index.md +0 -3
- package/docs/pi.md +3 -5
- package/docs/platforms/digitalocean.md +0 -1
- package/docs/platforms/mac/voicewake.md +0 -1
- package/docs/providers/index.md +0 -2
- package/docs/refactor/outbound-session-mirroring.md +0 -2
- package/docs/reference/AGENTS.default.md +0 -1
- package/docs/reference/RELEASING.md +0 -1
- package/docs/reference/session-management-compaction.md +0 -1
- package/docs/reference/templates/AGENTS.md +0 -7
- package/docs/reference/wizard.md +0 -4
- package/docs/security/CONTRIBUTING-THREAT-MODEL.md +0 -1
- package/docs/security/README.md +0 -1
- package/docs/security/THREAT-MODEL-ATLAS.md +7 -10
- package/docs/start/docs-directory.md +0 -1
- package/docs/start/hubs.md +0 -1
- package/docs/start/lore.md +0 -3
- package/docs/start/setup.md +0 -2
- package/docs/start/showcase.md +0 -2
- package/docs/start/symi.md +0 -4
- package/docs/start/wizard-cli-reference.md +0 -4
- package/docs/start/wizard.md +3 -4
- package/docs/tools/agent-send.md +0 -1
- package/docs/tools/elevated.md +0 -2
- package/docs/tools/exec-approvals.md +0 -1
- package/docs/tools/index.md +0 -7
- package/docs/tools/multi-agent-sandbox-tools.md +1 -2
- package/docs/tools/reactions.md +0 -1
- package/docs/tools/slash-commands.md +0 -14
- package/docs/tools/symihub.md +0 -1
- package/docs/tts.md +0 -1
- package/docs/web/control-ui.md +0 -1
- package/docs/zh-CN/automation/cron-jobs.md +0 -2
- package/docs/zh-CN/automation/poll.md +0 -8
- package/docs/zh-CN/automation/webhook.md +0 -2
- package/docs/zh-CN/channels/broadcast-groups.md +0 -1
- package/docs/zh-CN/channels/channel-routing.md +4 -9
- package/docs/zh-CN/channels/group-messages.md +0 -2
- package/docs/zh-CN/channels/groups.md +0 -10
- package/docs/zh-CN/channels/imessage.md +0 -2
- package/docs/zh-CN/channels/index.md +0 -1
- package/docs/zh-CN/channels/msteams.md +0 -2
- package/docs/zh-CN/channels/pairing.md +0 -3
- package/docs/zh-CN/channels/signal.md +0 -2
- package/docs/zh-CN/channels/slack.md +0 -2
- package/docs/zh-CN/channels/telegram.md +0 -3
- package/docs/zh-CN/channels/troubleshooting.md +0 -2
- package/docs/zh-CN/cli/channels.md +0 -6
- package/docs/zh-CN/cli/configure.md +0 -1
- package/docs/zh-CN/cli/directory.md +0 -1
- package/docs/zh-CN/cli/index.md +0 -7
- package/docs/zh-CN/cli/message.md +1 -42
- package/docs/zh-CN/cli/status.md +0 -1
- package/docs/zh-CN/concepts/architecture.md +0 -1
- package/docs/zh-CN/concepts/features.md +0 -2
- package/docs/zh-CN/concepts/markdown-formatting.md +6 -8
- package/docs/zh-CN/concepts/messages.md +0 -1
- package/docs/zh-CN/concepts/multi-agent.md +4 -5
- package/docs/zh-CN/concepts/queue.md +0 -3
- package/docs/zh-CN/concepts/retry.md +0 -5
- package/docs/zh-CN/concepts/session-tool.md +0 -2
- package/docs/zh-CN/concepts/session.md +3 -11
- package/docs/zh-CN/concepts/streaming.md +0 -2
- package/docs/zh-CN/concepts/system-prompt.md +0 -2
- package/docs/zh-CN/concepts/timezone.md +0 -2
- package/docs/zh-CN/date-time.md +0 -1
- package/docs/zh-CN/experiments/plans/cron-add-hardening.md +0 -1
- package/docs/zh-CN/gateway/configuration-examples.md +0 -7
- package/docs/zh-CN/gateway/configuration.md +2 -50
- package/docs/zh-CN/gateway/heartbeat.md +0 -2
- package/docs/zh-CN/gateway/security/index.md +1 -6
- package/docs/zh-CN/gateway/troubleshooting.md +1 -14
- package/docs/zh-CN/help/faq.md +0 -15
- package/docs/zh-CN/index.md +0 -3
- package/docs/zh-CN/install/ansible.md +2 -3
- package/docs/zh-CN/install/docker.md +1 -7
- package/docs/zh-CN/install/fly.md +0 -14
- package/docs/zh-CN/install/northflank.mdx +7 -11
- package/docs/zh-CN/install/railway.mdx +6 -10
- package/docs/zh-CN/install/render.mdx +1 -2
- package/docs/zh-CN/pi.md +3 -5
- package/docs/zh-CN/platforms/digitalocean.md +0 -1
- package/docs/zh-CN/platforms/mac/voicewake.md +0 -1
- package/docs/zh-CN/providers/index.md +0 -2
- package/docs/zh-CN/refactor/outbound-session-mirroring.md +0 -2
- package/docs/zh-CN/reference/AGENTS.default.md +0 -1
- package/docs/zh-CN/reference/RELEASING.md +0 -1
- package/docs/zh-CN/reference/session-management-compaction.md +0 -1
- package/docs/zh-CN/reference/templates/AGENTS.md +0 -5
- package/docs/zh-CN/start/docs-directory.md +0 -1
- package/docs/zh-CN/start/getting-started.md +0 -5
- package/docs/zh-CN/start/hubs.md +0 -1
- package/docs/zh-CN/start/lore.md +0 -3
- package/docs/zh-CN/start/setup.md +0 -2
- package/docs/zh-CN/start/showcase.md +0 -2
- package/docs/zh-CN/start/symi.md +0 -4
- package/docs/zh-CN/start/wizard.md +0 -5
- package/docs/zh-CN/tools/agent-send.md +0 -1
- package/docs/zh-CN/tools/elevated.md +0 -2
- package/docs/zh-CN/tools/exec-approvals.md +0 -1
- package/docs/zh-CN/tools/index.md +0 -7
- package/docs/zh-CN/tools/multi-agent-sandbox-tools.md +1 -2
- package/docs/zh-CN/tools/reactions.md +0 -1
- package/docs/zh-CN/tools/slash-commands.md +0 -9
- package/docs/zh-CN/tts.md +0 -2
- package/docs/zh-CN/web/control-ui.md +0 -1
- package/package.json +1 -1
- package/docs/channels/discord.md +0 -998
- package/docs/zh-CN/channels/discord.md +0 -468
|
@@ -44,7 +44,6 @@ Recent gateway logs show repeated `cron.add` failures with invalid parameters (m
|
|
|
44
44
|
|
|
45
45
|
- **Normalization:** wrapped `data`/`job` payloads are unwrapped; `schedule.kind` and `payload.kind` are inferred when safe.
|
|
46
46
|
- **Defaults:** safe defaults are applied for `wakeMode` and `sessionTarget` when missing.
|
|
47
|
-
- **Providers:** Discord/Slack/Signal/iMessage are now consistently surfaced across CLI/UI.
|
|
48
47
|
|
|
49
48
|
See [Cron jobs](/automation/cron-jobs) for the normalized shape and examples.
|
|
50
49
|
|
|
@@ -16,7 +16,6 @@ Goal:
|
|
|
16
16
|
|
|
17
17
|
- make subagent bound session routing a core capability
|
|
18
18
|
- keep channel specific behavior in adapters
|
|
19
|
-
- avoid regressions in normal Discord behavior
|
|
20
19
|
|
|
21
20
|
## Why this exists
|
|
22
21
|
|
|
@@ -24,7 +23,6 @@ Current behavior mixes:
|
|
|
24
23
|
|
|
25
24
|
- completion content policy
|
|
26
25
|
- destination routing policy
|
|
27
|
-
- Discord specific details
|
|
28
26
|
|
|
29
27
|
This caused edge cases such as:
|
|
30
28
|
|
|
@@ -114,10 +112,6 @@ For this iteration:
|
|
|
114
112
|
- only `task_completion` is routed through this new path
|
|
115
113
|
- existing paths for other event kinds remain as-is
|
|
116
114
|
|
|
117
|
-
### 3. Keep Discord as adapter
|
|
118
|
-
|
|
119
|
-
Discord remains the first adapter implementation.
|
|
120
|
-
|
|
121
115
|
Adapter responsibilities:
|
|
122
116
|
|
|
123
117
|
- create/reuse thread conversations
|
|
@@ -130,7 +124,6 @@ Adapter responsibilities:
|
|
|
130
124
|
Required in this iteration:
|
|
131
125
|
|
|
132
126
|
- refresh token usage when reusing existing thread binding manager
|
|
133
|
-
- record outbound activity for webhook based Discord sends
|
|
134
127
|
- stop implicit main channel fallback when a bound thread destination is selected for session mode completion
|
|
135
128
|
|
|
136
129
|
### 5. Preserve current runtime safety defaults
|
|
@@ -139,11 +132,8 @@ No behavior change for users with thread bound spawn disabled.
|
|
|
139
132
|
|
|
140
133
|
Defaults stay:
|
|
141
134
|
|
|
142
|
-
- `channels.discord.threadBindings.spawnSubagentSessions = false`
|
|
143
|
-
|
|
144
135
|
Result:
|
|
145
136
|
|
|
146
|
-
- normal Discord users stay on current behavior
|
|
147
137
|
- new core path affects only bound session completion routing where enabled
|
|
148
138
|
|
|
149
139
|
## Not in iteration 1
|
|
@@ -151,7 +141,6 @@ Result:
|
|
|
151
141
|
Explicitly deferred:
|
|
152
142
|
|
|
153
143
|
- ACP binding targets (`targetKind: "acp"`)
|
|
154
|
-
- new channel adapters beyond Discord
|
|
155
144
|
- global replacement of all delivery paths (`spawn_ack`, future `subagent_message`)
|
|
156
145
|
- protocol level changes
|
|
157
146
|
- store migration/versioning redesign for all binding persistence
|
|
@@ -175,14 +164,12 @@ These invariants are mandatory for iteration 1.
|
|
|
175
164
|
Compatibility target:
|
|
176
165
|
|
|
177
166
|
- no regression for users with thread bound spawning off
|
|
178
|
-
- no change to non-Discord channels in this iteration
|
|
179
167
|
|
|
180
168
|
Rollout:
|
|
181
169
|
|
|
182
170
|
1. Land interfaces and router behind current feature gates.
|
|
183
|
-
2.
|
|
184
|
-
3.
|
|
185
|
-
4. Verify with targeted tests and canary runtime logs.
|
|
171
|
+
2. Keep legacy path for non-bound flows.
|
|
172
|
+
3. Verify with targeted tests and canary runtime logs.
|
|
186
173
|
|
|
187
174
|
## Tests required in iteration 1
|
|
188
175
|
|
|
@@ -202,16 +189,8 @@ Core:
|
|
|
202
189
|
- `src/infra/outbound/bound-delivery-router.ts` (new)
|
|
203
190
|
- `src/agents/subagent-announce.ts` (completion destination resolution integration)
|
|
204
191
|
|
|
205
|
-
Discord adapter and runtime:
|
|
206
|
-
|
|
207
|
-
- `src/discord/monitor/thread-bindings.manager.ts`
|
|
208
|
-
- `src/discord/monitor/reply-delivery.ts`
|
|
209
|
-
- `src/discord/send.outbound.ts`
|
|
210
|
-
|
|
211
192
|
Tests:
|
|
212
193
|
|
|
213
|
-
- `src/discord/monitor/provider*.test.ts`
|
|
214
|
-
- `src/discord/monitor/reply-delivery.test.ts`
|
|
215
194
|
- `src/agents/subagent-announce.format.e2e.test.ts`
|
|
216
195
|
|
|
217
196
|
## Done criteria for iteration 1
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
---
|
|
2
|
-
summary: "Discord thread bound subagent sessions with plugin lifecycle hooks, routing, and config kill switches"
|
|
3
2
|
owner: "onutc"
|
|
4
3
|
status: "implemented"
|
|
5
4
|
last_updated: "2026-02-21"
|
|
@@ -10,12 +9,8 @@ title: "Thread Bound Subagents"
|
|
|
10
9
|
|
|
11
10
|
## Overview
|
|
12
11
|
|
|
13
|
-
This feature lets users interact with spawned subagents directly inside Discord threads.
|
|
14
|
-
|
|
15
12
|
Instead of only waiting for a completion summary in the parent session, users can move into a dedicated thread that routes messages to the spawned subagent session. Replies are sent in-thread with a thread bound persona.
|
|
16
13
|
|
|
17
|
-
The implementation is split between channel agnostic core lifecycle hooks and Discord specific extension behavior.
|
|
18
|
-
|
|
19
14
|
## Goals
|
|
20
15
|
|
|
21
16
|
- Allow direct thread conversation with a spawned subagent session.
|
|
@@ -27,26 +22,21 @@ The implementation is split between channel agnostic core lifecycle hooks and Di
|
|
|
27
22
|
## Out of scope
|
|
28
23
|
|
|
29
24
|
- New ACP protocol features.
|
|
30
|
-
- Non Discord thread binding implementations in this document.
|
|
31
|
-
- New bot accounts or app level Discord identity changes.
|
|
32
25
|
|
|
33
26
|
## What shipped
|
|
34
27
|
|
|
35
28
|
- `sessions_spawn` supports `thread: true` and `mode: "run" | "session"`.
|
|
36
29
|
- Spawn flow supports persistent thread bound sessions.
|
|
37
|
-
- Discord thread binding manager supports bind, unbind, TTL sweep, and persistence.
|
|
38
30
|
- Plugin hook lifecycle for subagents:
|
|
39
31
|
- `subagent_spawning`
|
|
40
32
|
- `subagent_spawned`
|
|
41
33
|
- `subagent_delivery_target`
|
|
42
34
|
- `subagent_ended`
|
|
43
|
-
- Discord extension implements thread auto bind, delivery target override, and unbind on end.
|
|
44
35
|
- Text commands for manual control:
|
|
45
36
|
- `/focus`
|
|
46
37
|
- `/unfocus`
|
|
47
38
|
- `/agents`
|
|
48
39
|
- `/session ttl`
|
|
49
|
-
- Global and Discord scoped enablement and TTL controls, including a global kill switch.
|
|
50
40
|
|
|
51
41
|
## Core concepts
|
|
52
42
|
|
|
@@ -91,12 +81,8 @@ The manager is responsible for:
|
|
|
91
81
|
|
|
92
82
|
### Core and extension boundary
|
|
93
83
|
|
|
94
|
-
Core (`src/agents/*`) does not directly depend on Discord routing internals.
|
|
95
|
-
|
|
96
84
|
Core emits lifecycle intent through plugin hooks.
|
|
97
85
|
|
|
98
|
-
Discord extension (`extensions/discord/src/subagent-hooks.ts`) implements Discord specific behavior:
|
|
99
|
-
|
|
100
86
|
- pre spawn thread bind preparation
|
|
101
87
|
- completion delivery target override to bound thread
|
|
102
88
|
- unbind on subagent end
|
|
@@ -111,7 +97,6 @@ Discord extension (`extensions/discord/src/subagent-hooks.ts`) implements Discor
|
|
|
111
97
|
- post run registration event
|
|
112
98
|
3. `subagent_delivery_target`
|
|
113
99
|
- completion routing override hook
|
|
114
|
-
- can redirect completion delivery to bound Discord thread origin
|
|
115
100
|
4. `subagent_ended`
|
|
116
101
|
- cleanup and unbind signal
|
|
117
102
|
|
|
@@ -147,8 +132,6 @@ Migration guardrails:
|
|
|
147
132
|
|
|
148
133
|
Binding state path:
|
|
149
134
|
|
|
150
|
-
- `${stateDir}/discord/thread-bindings.json`
|
|
151
|
-
|
|
152
135
|
Record shape contains:
|
|
153
136
|
|
|
154
137
|
- account, channel, thread
|
|
@@ -163,32 +146,22 @@ State is stored on `globalThis` to keep one shared registry across ESM and Jiti
|
|
|
163
146
|
|
|
164
147
|
### Effective precedence
|
|
165
148
|
|
|
166
|
-
For Discord thread binding options, account override wins, then channel, then global session default, then built in fallback.
|
|
167
|
-
|
|
168
|
-
- account: `channels.discord.accounts.<id>.threadBindings.<key>`
|
|
169
|
-
- channel: `channels.discord.threadBindings.<key>`
|
|
170
149
|
- global: `session.threadBindings.<key>`
|
|
171
150
|
|
|
172
151
|
### Keys
|
|
173
152
|
|
|
174
|
-
| Key
|
|
175
|
-
|
|
|
176
|
-
| `session.threadBindings.enabled`
|
|
177
|
-
| `session.threadBindings.ttlHours`
|
|
178
|
-
| `channels.discord.threadBindings.enabled` | channel/account | inherits global | Discord override kill switch |
|
|
179
|
-
| `channels.discord.threadBindings.ttlHours` | channel/account | inherits global | Discord TTL override |
|
|
180
|
-
| `channels.discord.threadBindings.spawnSubagentSessions` | channel/account | `false` | opt in for `thread: true` spawn auto bind |
|
|
153
|
+
| Key | Scope | Default | Notes |
|
|
154
|
+
| --------------------------------- | ------ | ------- | -------------------------- |
|
|
155
|
+
| `session.threadBindings.enabled` | global | `true` | master default kill switch |
|
|
156
|
+
| `session.threadBindings.ttlHours` | global | `24` | default auto unfocus TTL |
|
|
181
157
|
|
|
182
158
|
### Runtime effect of enable switch
|
|
183
159
|
|
|
184
|
-
When effective `enabled` is false for a Discord account:
|
|
185
|
-
|
|
186
160
|
- provider creates a noop thread binding manager for runtime wiring
|
|
187
161
|
- no real manager is registered for lookup by account id
|
|
188
162
|
- inbound bound thread routing is effectively disabled
|
|
189
163
|
- completion routing overrides do not resolve bound thread origins
|
|
190
164
|
- `/focus`, `/unfocus`, and thread binding specific operations report unavailable
|
|
191
|
-
- `thread: true` spawn path returns actionable error from Discord hook layer
|
|
192
165
|
|
|
193
166
|
## Flow and behavior
|
|
194
167
|
|
|
@@ -196,30 +169,26 @@ When effective `enabled` is false for a Discord account:
|
|
|
196
169
|
|
|
197
170
|
1. Spawn validates mode and permissions.
|
|
198
171
|
2. `subagent_spawning` hook runs.
|
|
199
|
-
3. Discord extension checks effective flags:
|
|
200
172
|
- thread bindings enabled
|
|
201
173
|
- `spawnSubagentSessions` enabled
|
|
202
|
-
|
|
203
|
-
|
|
174
|
+
3. Extension attempts auto bind and thread creation.
|
|
175
|
+
4. If bind fails:
|
|
204
176
|
- spawn returns error
|
|
205
177
|
- provisional child session is deleted
|
|
206
|
-
|
|
178
|
+
5. If bind succeeds:
|
|
207
179
|
- child run starts
|
|
208
180
|
- run is registered with spawn mode
|
|
209
181
|
|
|
210
182
|
### Manual focus and unfocus
|
|
211
183
|
|
|
212
184
|
- `/focus <target>`
|
|
213
|
-
- Discord only
|
|
214
185
|
- resolves subagent or session target
|
|
215
186
|
- binds current or created thread to target session
|
|
216
187
|
- `/unfocus`
|
|
217
|
-
- Discord thread only
|
|
218
188
|
- unbinds current thread
|
|
219
189
|
|
|
220
190
|
### Inbound routing
|
|
221
191
|
|
|
222
|
-
- Discord preflight checks current thread id against thread binding manager.
|
|
223
192
|
- If bound, effective session routing uses bound target session key.
|
|
224
193
|
- If not bound, normal routing path is used.
|
|
225
194
|
|
|
@@ -232,7 +201,6 @@ When effective `enabled` is false for a Discord account:
|
|
|
232
201
|
### Completion routing
|
|
233
202
|
|
|
234
203
|
- Core completion flow calls `subagent_delivery_target`.
|
|
235
|
-
- Discord extension returns bound thread origin when it can resolve one.
|
|
236
204
|
- Core merges hook origin with requester origin and delivers completion.
|
|
237
205
|
|
|
238
206
|
### Cleanup
|
|
@@ -260,7 +228,6 @@ Cleanup behavior includes unbind and optional farewell messaging.
|
|
|
260
228
|
|
|
261
229
|
Notes:
|
|
262
230
|
|
|
263
|
-
- `/session ttl` is currently Discord thread focused behavior.
|
|
264
231
|
- Thread intro and farewell text are generated by thread binding message helpers.
|
|
265
232
|
|
|
266
233
|
## Failure handling and safety
|
|
@@ -281,27 +248,14 @@ Notes:
|
|
|
281
248
|
- `src/agents/subagent-registry-cleanup.ts`
|
|
282
249
|
- `src/agents/subagent-registry-completion.ts`
|
|
283
250
|
|
|
284
|
-
### Discord runtime
|
|
285
|
-
|
|
286
|
-
- `src/discord/monitor/provider.ts`
|
|
287
|
-
- `src/discord/monitor/thread-bindings.manager.ts`
|
|
288
|
-
- `src/discord/monitor/thread-bindings.state.ts`
|
|
289
|
-
- `src/discord/monitor/thread-bindings.lifecycle.ts`
|
|
290
|
-
- `src/discord/monitor/thread-bindings.messages.ts`
|
|
291
|
-
- `src/discord/monitor/message-handler.preflight.ts`
|
|
292
|
-
- `src/discord/monitor/message-handler.process.ts`
|
|
293
|
-
- `src/discord/monitor/reply-delivery.ts`
|
|
294
|
-
|
|
295
251
|
### Plugin hooks and extension
|
|
296
252
|
|
|
297
253
|
- `src/plugins/types.ts`
|
|
298
254
|
- `src/plugins/hooks.ts`
|
|
299
|
-
- `extensions/discord/src/subagent-hooks.ts`
|
|
300
255
|
|
|
301
256
|
### Config and schema
|
|
302
257
|
|
|
303
258
|
- `src/config/types.base.ts`
|
|
304
|
-
- `src/config/types.discord.ts`
|
|
305
259
|
- `src/config/zod-schema.session.ts`
|
|
306
260
|
- `src/config/zod-schema.providers-core.ts`
|
|
307
261
|
- `src/config/schema.help.ts`
|
|
@@ -309,12 +263,6 @@ Notes:
|
|
|
309
263
|
|
|
310
264
|
## Test coverage highlights
|
|
311
265
|
|
|
312
|
-
- `extensions/discord/src/subagent-hooks.test.ts`
|
|
313
|
-
- `src/discord/monitor/thread-bindings.ttl.test.ts`
|
|
314
|
-
- `src/discord/monitor/thread-bindings.shared-state.test.ts`
|
|
315
|
-
- `src/discord/monitor/reply-delivery.test.ts`
|
|
316
|
-
- `src/discord/monitor/message-handler.preflight.test.ts`
|
|
317
|
-
- `src/discord/monitor/message-handler.process.test.ts`
|
|
318
266
|
- `src/auto-reply/reply/commands-subagents-focus.test.ts`
|
|
319
267
|
- `src/auto-reply/reply/commands-session-ttl.test.ts`
|
|
320
268
|
- `src/agents/subagent-registry.steer-restart.test.ts`
|
|
@@ -323,16 +271,11 @@ Notes:
|
|
|
323
271
|
## Operational summary
|
|
324
272
|
|
|
325
273
|
- Use `session.threadBindings.enabled` as the global kill switch default.
|
|
326
|
-
- Use `channels.discord.threadBindings.enabled` and account overrides for selective enablement.
|
|
327
274
|
- Keep `spawnSubagentSessions` opt in for thread auto spawn behavior.
|
|
328
275
|
- Use TTL settings for automatic unfocus policy control.
|
|
329
276
|
|
|
330
|
-
This model keeps subagent lifecycle orchestration generic while giving Discord a full thread bound interaction path.
|
|
331
|
-
|
|
332
277
|
## Related plan
|
|
333
278
|
|
|
334
279
|
For channel agnostic SessionBinding architecture and scoped iteration planning, see:
|
|
335
280
|
|
|
336
281
|
- `docs/experiments/plans/session-binding-channel-agnostic.md`
|
|
337
|
-
|
|
338
|
-
ACP remains a next step in that plan and is intentionally not implemented in this shipped Discord thread-bound flow.
|
|
@@ -121,7 +121,6 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
121
121
|
byChannel: {
|
|
122
122
|
whatsapp: "collect",
|
|
123
123
|
telegram: "collect",
|
|
124
|
-
discord: "collect",
|
|
125
124
|
slack: "collect",
|
|
126
125
|
signal: "collect",
|
|
127
126
|
imessage: "collect",
|
|
@@ -160,7 +159,6 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
160
159
|
idleMinutes: 60,
|
|
161
160
|
},
|
|
162
161
|
resetByChannel: {
|
|
163
|
-
discord: { mode: "idle", idleMinutes: 10080 },
|
|
164
162
|
},
|
|
165
163
|
resetTriggers: ["/new", "/reset"],
|
|
166
164
|
store: "~/.symi/agents/default/sessions/sessions.json",
|
|
@@ -173,7 +171,6 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
173
171
|
typingIntervalSeconds: 5,
|
|
174
172
|
sendPolicy: {
|
|
175
173
|
default: "allow",
|
|
176
|
-
rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
|
|
177
174
|
},
|
|
178
175
|
},
|
|
179
176
|
|
|
@@ -196,9 +193,7 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
196
193
|
groups: { "*": { requireMention: true } },
|
|
197
194
|
},
|
|
198
195
|
|
|
199
|
-
discord: {
|
|
200
196
|
enabled: true,
|
|
201
|
-
token: "YOUR_DISCORD_BOT_TOKEN",
|
|
202
197
|
dm: { enabled: true, allowFrom: ["steipete"] },
|
|
203
198
|
guilds: {
|
|
204
199
|
"123456789012345678": {
|
|
@@ -314,7 +309,6 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
314
309
|
allowFrom: {
|
|
315
310
|
whatsapp: ["+15555550123"],
|
|
316
311
|
telegram: ["123456789"],
|
|
317
|
-
discord: ["steipete"],
|
|
318
312
|
slack: ["U123"],
|
|
319
313
|
signal: ["+15555550123"],
|
|
320
314
|
imessage: ["user@example.com"],
|
|
@@ -451,7 +445,6 @@ Save to `~/.symi/symi.json` and you can DM the bot from that number.
|
|
|
451
445
|
botToken: "YOUR_TOKEN",
|
|
452
446
|
allowFrom: ["123456789"],
|
|
453
447
|
},
|
|
454
|
-
discord: {
|
|
455
448
|
enabled: true,
|
|
456
449
|
token: "YOUR_TOKEN",
|
|
457
450
|
dm: { allowFrom: ["yourname"] },
|
|
@@ -476,10 +469,7 @@ If more than one person can DM your bot (multiple entries in `allowFrom`, pairin
|
|
|
476
469
|
allowFrom: ["+15555550123", "+15555550124"],
|
|
477
470
|
},
|
|
478
471
|
|
|
479
|
-
// Example: Discord multi-user inbox
|
|
480
|
-
discord: {
|
|
481
472
|
enabled: true,
|
|
482
|
-
token: "YOUR_DISCORD_BOT_TOKEN",
|
|
483
473
|
dm: { enabled: true, allowFrom: ["alice", "bob"] },
|
|
484
474
|
},
|
|
485
475
|
},
|
|
@@ -35,7 +35,6 @@ All channels support DM policies and group policies:
|
|
|
35
35
|
<Note>
|
|
36
36
|
`channels.defaults.groupPolicy` sets the default when a provider's `groupPolicy` is unset.
|
|
37
37
|
Pairing codes expire after 1 hour. Pending DM pairing requests are capped at **3 per channel**.
|
|
38
|
-
Slack/Discord have a special fallback: if their provider section is missing entirely, runtime group policy can resolve to `open` (with a startup warning).
|
|
39
38
|
</Note>
|
|
40
39
|
|
|
41
40
|
### Channel model overrides
|
|
@@ -46,7 +45,6 @@ Use `channels.modelByChannel` to pin specific channel IDs to a model. Values acc
|
|
|
46
45
|
{
|
|
47
46
|
channels: {
|
|
48
47
|
modelByChannel: {
|
|
49
|
-
discord: {
|
|
50
48
|
"123456789012345678": "anthropic/claude-opus-4-6",
|
|
51
49
|
},
|
|
52
50
|
slack: {
|
|
@@ -176,12 +174,9 @@ WhatsApp runs through the gateway's web channel (Baileys Web). It starts automat
|
|
|
176
174
|
- Telegram stream previews use `sendMessage` + `editMessageText` (works in direct and group chats).
|
|
177
175
|
- Retry policy: see [Retry policy](/concepts/retry).
|
|
178
176
|
|
|
179
|
-
### Discord
|
|
180
|
-
|
|
181
177
|
```json5
|
|
182
178
|
{
|
|
183
179
|
channels: {
|
|
184
|
-
discord: {
|
|
185
180
|
enabled: true,
|
|
186
181
|
token: "your-bot-token",
|
|
187
182
|
mediaMaxMb: 8,
|
|
@@ -258,13 +253,10 @@ WhatsApp runs through the gateway's web channel (Baileys Web). It starts automat
|
|
|
258
253
|
}
|
|
259
254
|
```
|
|
260
255
|
|
|
261
|
-
- Token: `channels.discord.token`, with `DISCORD_BOT_TOKEN` as fallback for the default account.
|
|
262
256
|
- Use `user:<id>` (DM) or `channel:<id>` (guild channel) for delivery targets; bare numeric IDs are rejected.
|
|
263
257
|
- Guild slugs are lowercase with spaces replaced by `-`; channel keys use the slugged name (no `#`). Prefer guild IDs.
|
|
264
258
|
- Bot-authored messages are ignored by default. `allowBots: true` enables them (own messages still filtered).
|
|
265
259
|
- `maxLinesPerMessage` (default 17) splits tall messages even when under 2000 chars.
|
|
266
|
-
- `channels.discord.ui.components.accentColor` sets the accent color for Discord components v2 containers.
|
|
267
|
-
- `channels.discord.voice` enables Discord voice channel conversations and optional auto-join + TTS overrides.
|
|
268
260
|
|
|
269
261
|
**Reaction notification modes:** `off` (none), `own` (bot's messages, default), `all` (all messages), `allowlist` (from `guilds.<id>.users` on all messages).
|
|
270
262
|
|
|
@@ -481,8 +473,6 @@ Run multiple accounts per channel (each with its own `accountId`):
|
|
|
481
473
|
|
|
482
474
|
### Group chat mention gating
|
|
483
475
|
|
|
484
|
-
Group messages default to **require mention** (metadata mention or regex patterns). Applies to WhatsApp, Telegram, Discord, Google Chat, and iMessage group chats.
|
|
485
|
-
|
|
486
476
|
**Mention types:**
|
|
487
477
|
|
|
488
478
|
- **Metadata mentions**: Native platform @-mentions. Ignored in WhatsApp self-chat mode.
|
|
@@ -519,8 +509,6 @@ Group messages default to **require mention** (metadata mention or regex pattern
|
|
|
519
509
|
|
|
520
510
|
Resolution: per-DM override → provider default → no limit (all retained).
|
|
521
511
|
|
|
522
|
-
Supported: `telegram`, `whatsapp`, `discord`, `slack`, `signal`, `imessage`, `msteams`.
|
|
523
|
-
|
|
524
512
|
#### Self-chat mode
|
|
525
513
|
|
|
526
514
|
Include your own number in `allowFrom` to enable self-chat mode (ignores native @-mentions, only responds to text patterns):
|
|
@@ -558,7 +546,6 @@ Include your own number in `allowFrom` to enable self-chat mode (ignores native
|
|
|
558
546
|
restart: false, // allow /restart + gateway restart tool
|
|
559
547
|
allowFrom: {
|
|
560
548
|
"*": ["user1"],
|
|
561
|
-
discord: ["user:123"],
|
|
562
549
|
},
|
|
563
550
|
useAccessGroups: true,
|
|
564
551
|
},
|
|
@@ -568,8 +555,6 @@ Include your own number in `allowFrom` to enable self-chat mode (ignores native
|
|
|
568
555
|
<Accordion title="Command details">
|
|
569
556
|
|
|
570
557
|
- Text commands must be **standalone** messages with leading `/`.
|
|
571
|
-
- `native: "auto"` turns on native commands for Discord/Telegram, leaves Slack off.
|
|
572
|
-
- Override per channel: `channels.discord.commands.native` (bool or `"auto"`). `false` clears previously registered commands.
|
|
573
558
|
- `channels.telegram.customCommands` adds extra Telegram bot menu entries.
|
|
574
559
|
- `bash: true` enables `! <cmd>` for host shell. Requires `tools.elevated.enabled` and sender in `tools.elevated.allowFrom.<channel>`.
|
|
575
560
|
- `config: true` enables `/config` (reads/writes `symi.json`).
|
|
@@ -766,7 +751,6 @@ Periodic heartbeat runs.
|
|
|
766
751
|
includeReasoning: false,
|
|
767
752
|
session: "main",
|
|
768
753
|
to: "+15555550123",
|
|
769
|
-
target: "last", // last | whatsapp | telegram | discord | ... | none
|
|
770
754
|
prompt: "Read SYMIPULSE.md if it exists...",
|
|
771
755
|
ackMaxChars: 300,
|
|
772
756
|
suppressToolErrorWarnings: false,
|
|
@@ -866,7 +850,6 @@ See [Session Pruning](/concepts/session-pruning) for behavior details.
|
|
|
866
850
|
```
|
|
867
851
|
|
|
868
852
|
- Non-Telegram channels require explicit `*.blockStreaming: true` to enable block replies.
|
|
869
|
-
- Channel overrides: `channels.<channel>.blockStreamingCoalesce` (and per-account variants). Signal/Slack/Discord/Google Chat default `minChars: 1500`.
|
|
870
853
|
- `humanDelay`: randomized pause between block replies. `natural` = 800–2500ms. Per-agent override: `agents.list[].humanDelay`.
|
|
871
854
|
|
|
872
855
|
See [Streaming](/concepts/streaming) for behavior + chunking details.
|
|
@@ -964,7 +947,6 @@ Optional **Docker sandboxing** for the embedded agent. See [Sandboxing](/gateway
|
|
|
964
947
|
"sessions_spawn",
|
|
965
948
|
"session_status",
|
|
966
949
|
],
|
|
967
|
-
deny: ["browser", "canvas", "nodes", "cron", "discord", "gateway"],
|
|
968
950
|
},
|
|
969
951
|
},
|
|
970
952
|
},
|
|
@@ -1159,7 +1141,6 @@ Within each tier, the first matching `bindings` entry wins.
|
|
|
1159
1141
|
"whatsapp",
|
|
1160
1142
|
"telegram",
|
|
1161
1143
|
"slack",
|
|
1162
|
-
"discord",
|
|
1163
1144
|
"gateway",
|
|
1164
1145
|
],
|
|
1165
1146
|
deny: [
|
|
@@ -1196,9 +1177,7 @@ See [Multi-Agent Sandbox & Tools](/tools/multi-agent-sandbox-tools) for preceden
|
|
|
1196
1177
|
session: {
|
|
1197
1178
|
scope: "per-sender",
|
|
1198
1179
|
dmScope: "main", // main | per-peer | per-channel-peer | per-account-channel-peer
|
|
1199
|
-
identityLinks: {
|
|
1200
|
-
alice: ["telegram:123456789", "discord:987654321012345678"],
|
|
1201
|
-
},
|
|
1180
|
+
identityLinks: {},
|
|
1202
1181
|
reset: {
|
|
1203
1182
|
mode: "daily", // daily | idle
|
|
1204
1183
|
atHour: 4,
|
|
@@ -1220,7 +1199,6 @@ See [Multi-Agent Sandbox & Tools](/tools/multi-agent-sandbox-tools) for preceden
|
|
|
1220
1199
|
mainKey: "main", // legacy (runtime always uses "main")
|
|
1221
1200
|
agentToAgent: { maxPingPongTurns: 5 },
|
|
1222
1201
|
sendPolicy: {
|
|
1223
|
-
rules: [{ action: "deny", match: { channel: "discord", chatType: "group" } }],
|
|
1224
1202
|
default: "allow",
|
|
1225
1203
|
},
|
|
1226
1204
|
},
|
|
@@ -1299,7 +1277,6 @@ Variables are case-insensitive. `{think}` is an alias for `{thinkingLevel}`.
|
|
|
1299
1277
|
- Per-channel overrides: `channels.<channel>.ackReaction`, `channels.<channel>.accounts.<id>.ackReaction`.
|
|
1300
1278
|
- Resolution order: account → channel → `messages.ackReaction` → identity fallback.
|
|
1301
1279
|
- Scope: `group-mentions` (default), `group-all`, `direct`, `all`.
|
|
1302
|
-
- `removeAckAfterReply`: removes ack after reply (Slack/Discord/Telegram/Google Chat only).
|
|
1303
1280
|
|
|
1304
1281
|
### Inbound debounce
|
|
1305
1282
|
|
|
@@ -1443,7 +1420,6 @@ Controls elevated (host) exec access:
|
|
|
1443
1420
|
enabled: true,
|
|
1444
1421
|
allowFrom: {
|
|
1445
1422
|
whatsapp: ["+15555550123"],
|
|
1446
|
-
discord: ["steipete", "1234567890123"],
|
|
1447
1423
|
},
|
|
1448
1424
|
},
|
|
1449
1425
|
},
|
|
@@ -2436,28 +2412,27 @@ See [Cron Jobs](/automation/cron-jobs).
|
|
|
2436
2412
|
|
|
2437
2413
|
Template placeholders expanded in `tools.media.*.models[].args`:
|
|
2438
2414
|
|
|
2439
|
-
| Variable | Description
|
|
2440
|
-
| ------------------ |
|
|
2441
|
-
| `{{Body}}` | Full inbound message body
|
|
2442
|
-
| `{{RawBody}}` | Raw body (no history/sender wrappers)
|
|
2443
|
-
| `{{BodyStripped}}` | Body with group mentions stripped
|
|
2444
|
-
| `{{From}}` | Sender identifier
|
|
2445
|
-
| `{{To}}` | Destination identifier
|
|
2446
|
-
| `{{MessageSid}}` | Channel message id
|
|
2447
|
-
| `{{SessionId}}` | Current session UUID
|
|
2448
|
-
| `{{IsNewSession}}` | `"true"` when new session created
|
|
2449
|
-
| `{{MediaUrl}}` | Inbound media pseudo-URL
|
|
2450
|
-
| `{{MediaPath}}` | Local media path
|
|
2451
|
-
| `{{MediaType}}` | Media type (image/audio/document/…)
|
|
2452
|
-
| `{{Transcript}}` | Audio transcript
|
|
2453
|
-
| `{{Prompt}}` | Resolved media prompt for CLI entries
|
|
2454
|
-
| `{{MaxChars}}` | Resolved max output chars for CLI entries
|
|
2455
|
-
| `{{ChatType}}` | `"direct"` or `"group"`
|
|
2456
|
-
| `{{GroupSubject}}` | Group subject (best effort)
|
|
2457
|
-
| `{{GroupMembers}}` | Group members preview (best effort)
|
|
2458
|
-
| `{{SenderName}}` | Sender display name (best effort)
|
|
2459
|
-
| `{{SenderE164}}` | Sender phone number (best effort)
|
|
2460
|
-
| `{{Provider}}` | Provider hint (whatsapp, telegram, discord, etc.) |
|
|
2415
|
+
| Variable | Description |
|
|
2416
|
+
| ------------------ | ----------------------------------------- |
|
|
2417
|
+
| `{{Body}}` | Full inbound message body |
|
|
2418
|
+
| `{{RawBody}}` | Raw body (no history/sender wrappers) |
|
|
2419
|
+
| `{{BodyStripped}}` | Body with group mentions stripped |
|
|
2420
|
+
| `{{From}}` | Sender identifier |
|
|
2421
|
+
| `{{To}}` | Destination identifier |
|
|
2422
|
+
| `{{MessageSid}}` | Channel message id |
|
|
2423
|
+
| `{{SessionId}}` | Current session UUID |
|
|
2424
|
+
| `{{IsNewSession}}` | `"true"` when new session created |
|
|
2425
|
+
| `{{MediaUrl}}` | Inbound media pseudo-URL |
|
|
2426
|
+
| `{{MediaPath}}` | Local media path |
|
|
2427
|
+
| `{{MediaType}}` | Media type (image/audio/document/…) |
|
|
2428
|
+
| `{{Transcript}}` | Audio transcript |
|
|
2429
|
+
| `{{Prompt}}` | Resolved media prompt for CLI entries |
|
|
2430
|
+
| `{{MaxChars}}` | Resolved max output chars for CLI entries |
|
|
2431
|
+
| `{{ChatType}}` | `"direct"` or `"group"` |
|
|
2432
|
+
| `{{GroupSubject}}` | Group subject (best effort) |
|
|
2433
|
+
| `{{GroupMembers}}` | Group members preview (best effort) |
|
|
2434
|
+
| `{{SenderName}}` | Sender display name (best effort) |
|
|
2435
|
+
| `{{SenderE164}}` | Sender phone number (best effort) |
|
|
2461
2436
|
|
|
2462
2437
|
---
|
|
2463
2438
|
|
|
@@ -74,12 +74,10 @@ When validation fails:
|
|
|
74
74
|
## Common tasks
|
|
75
75
|
|
|
76
76
|
<AccordionGroup>
|
|
77
|
-
<Accordion title="Set up a channel (WhatsApp, Telegram, Discord, etc.)">
|
|
78
77
|
Each channel has its own config section under `channels.<provider>`. See the dedicated channel page for setup steps:
|
|
79
78
|
|
|
80
79
|
- [WhatsApp](/channels/whatsapp) — `channels.whatsapp`
|
|
81
80
|
- [Telegram](/channels/telegram) — `channels.telegram`
|
|
82
|
-
- [Discord](/channels/discord) — `channels.discord`
|
|
83
81
|
- [Slack](/channels/slack) — `channels.slack`
|
|
84
82
|
- [Signal](/channels/signal) — `channels.signal`
|
|
85
83
|
- [iMessage](/channels/imessage) — `channels.imessage`
|
|
@@ -234,7 +232,6 @@ When validation fails:
|
|
|
234
232
|
```
|
|
235
233
|
|
|
236
234
|
- `every`: duration string (`30m`, `2h`). Set `0m` to disable.
|
|
237
|
-
- `target`: `last` | `whatsapp` | `telegram` | `discord` | `none`
|
|
238
235
|
- See [Heartbeat](/gateway/heartbeat) for the full guide.
|
|
239
236
|
|
|
240
237
|
</Accordion>
|
|
@@ -213,7 +213,6 @@ Use `accountId` to target a specific account on multi-account channels like Tele
|
|
|
213
213
|
- Session key formats: see [Sessions](/concepts/session) and [Groups](/channels/groups).
|
|
214
214
|
- `target`:
|
|
215
215
|
- `last` (default): deliver to the last used external channel.
|
|
216
|
-
- explicit channel: `whatsapp` / `telegram` / `discord` / `googlechat` / `slack` / `msteams` / `signal` / `imessage`.
|
|
217
216
|
- `none`: run the heartbeat but **do not deliver** externally.
|
|
218
217
|
- `to`: optional recipient override (channel-specific id, e.g. E.164 for WhatsApp or a Telegram chat id). For Telegram topics/threads, use `<chatId>:topic:<messageThreadId>`.
|
|
219
218
|
- `accountId`: optional account id for multi-account channels. When `target: "last"`, the account id applies to the resolved last channel if it supports accounts; otherwise it is ignored. If the account id does not match a configured account for the resolved channel, delivery is skipped.
|
|
@@ -231,7 +230,6 @@ Use `accountId` to target a specific account on multi-account channels like Tele
|
|
|
231
230
|
|
|
232
231
|
- Heartbeats run in the agent’s main session by default (`agent:<id>:<mainKey>`),
|
|
233
232
|
or `global` when `session.scope = "global"`. Set `session` to override to a
|
|
234
|
-
specific channel session (Discord/WhatsApp/etc.).
|
|
235
233
|
- `session` only affects the run context; delivery is controlled by `target` and `to`.
|
|
236
234
|
- To deliver to a specific channel/recipient, set `target` + `to`. With
|
|
237
235
|
`target: "last"`, delivery uses the last external channel for that session.
|
|
@@ -96,7 +96,6 @@ Use this when auditing access or deciding what to back up:
|
|
|
96
96
|
|
|
97
97
|
- **WhatsApp**: `~/.symi/credentials/whatsapp/<accountId>/creds.json`
|
|
98
98
|
- **Telegram bot token**: config/env or `channels.telegram.tokenFile`
|
|
99
|
-
- **Discord bot token**: config/env (token file not yet supported)
|
|
100
99
|
- **Slack tokens**: config/env (`channels.slack.*`)
|
|
101
100
|
- **Pairing allowlists**: `~/.symi/credentials/<channel>-allowFrom.json`
|
|
102
101
|
- **Model auth profiles**: `~/.symi/agents/<agentId>/agent/auth-profiles.json`
|
|
@@ -336,13 +335,11 @@ If you run multiple accounts on the same channel, use `per-account-channel-peer`
|
|
|
336
335
|
|
|
337
336
|
Symi has two separate “who can trigger me?” layers:
|
|
338
337
|
|
|
339
|
-
-
|
|
340
|
-
- When `dmPolicy="pairing"`, approvals are written to `~/.symi/credentials/<channel>-allowFrom.json` (merged with config allowlists).
|
|
338
|
+
- When `dmPolicy="pairing"`, approvals are written to `~/.symi/credentials/<channel>-allowFrom.json` (merged with config allowlists).
|
|
341
339
|
- **Group allowlist** (channel-specific): which groups/channels/guilds the bot will accept messages from at all.
|
|
342
340
|
- Common patterns:
|
|
343
341
|
- `channels.whatsapp.groups`, `channels.telegram.groups`, `channels.imessage.groups`: per-group defaults like `requireMention`; when set, it also acts as a group allowlist (include `"*"` to keep allow-all behavior).
|
|
344
342
|
- `groupPolicy="allowlist"` + `groupAllowFrom`: restrict who can trigger the bot _inside_ a group session (WhatsApp/Telegram/Signal/iMessage/Microsoft Teams).
|
|
345
|
-
- `channels.discord.guilds` / `channels.slack.channels`: per-surface allowlists + mention defaults.
|
|
346
343
|
- Group checks run in this order: `groupPolicy`/group allowlists first, mention/reply activation second.
|
|
347
344
|
- Replying to a bot message (implicit mention) does **not** bypass sender allowlists like `groupAllowFrom`.
|
|
348
345
|
- **Security note:** treat `dmPolicy="open"` and `groupPolicy="open"` as last-resort settings. They should be barely used; prefer pairing + allowlists unless you fully trust every member of the room.
|
|
@@ -831,7 +828,6 @@ Common use cases:
|
|
|
831
828
|
"whatsapp",
|
|
832
829
|
"telegram",
|
|
833
830
|
"slack",
|
|
834
|
-
"discord",
|
|
835
831
|
],
|
|
836
832
|
deny: [
|
|
837
833
|
"read",
|
|
@@ -881,7 +877,6 @@ If your AI does something bad:
|
|
|
881
877
|
|
|
882
878
|
1. Rotate Gateway auth (`gateway.auth.token` / `SYMI_GATEWAY_PASSWORD`) and restart.
|
|
883
879
|
2. Rotate remote client secrets (`gateway.remote.token` / `.password`) on any machine that can call the Gateway.
|
|
884
|
-
3. Rotate provider/API credentials (WhatsApp creds, Slack/Discord tokens, model/API keys in `auth-profiles.json`).
|
|
885
880
|
|
|
886
881
|
### Audit
|
|
887
882
|
|