@symerian/symi 3.0.16 → 3.0.18
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/{audio-preflight-CBDFctZN.js → audio-preflight-BfmZbg4Y.js} +4 -4
- package/dist/{audio-preflight-gsZSpG-6.js → audio-preflight-DcuC-liM.js} +4 -4
- package/dist/build-info.json +3 -3
- package/dist/bundled/boot-md/handler.js +8 -8
- package/dist/bundled/session-memory/handler.js +7 -7
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/{chrome-nPMY1XTJ.js → chrome-Bo7cbvFK.js} +5 -5
- package/dist/{chrome-BjVab8gM.js → chrome-DYp18Q0t.js} +5 -5
- package/dist/{deliver-D-QFqm31.js → deliver-ChSIbiMM.js} +1 -1
- package/dist/{deliver-B4-bcot9.js → deliver-DEgRQM4J.js} +1 -1
- package/dist/extensionAPI.js +7 -7
- package/dist/{image-CDwtQjmt.js → image-Bx-hvoNJ.js} +1 -1
- package/dist/{image-CcS-vzTA.js → image-CQl_mjWk.js} +1 -1
- package/dist/llm-slug-generator.js +7 -7
- package/dist/{manager-BnEdHzmO.js → manager-D_pn0urG.js} +1 -1
- package/dist/{manager-09r0qPze.js → manager-YQxK2t0C.js} +1 -1
- package/dist/{pi-embedded-CWsY69-4.js → pi-embedded-CLw_ZzEZ.js} +16 -16
- package/dist/{pi-embedded-helpers-BBMy-lqr.js → pi-embedded-helpers-B5I53aw6.js} +4 -4
- package/dist/{pi-embedded-helpers-ChEYbgVj.js → pi-embedded-helpers-sUAEIC9X.js} +4 -4
- package/dist/plugin-sdk/{accounts-BfyWsC_i.js → accounts-CWFytwbR.js} +3 -3
- package/dist/plugin-sdk/{active-listener-DcJW7xAT.js → active-listener-BkZ4jHrL.js} +2 -2
- package/dist/plugin-sdk/{agent-scope-ChbGV6of.js → agent-scope-C9gfY_Gk.js} +2 -2
- package/dist/plugin-sdk/{audio-preflight-D3GtNLqW.js → audio-preflight-HKbdzXLZ.js} +21 -21
- package/dist/plugin-sdk/{bindings-CN2Qmefj.js → bindings-BaKIqPPy.js} +2 -2
- package/dist/plugin-sdk/{channel-web-DTyqujjA.js → channel-web-D5nWiTH1.js} +18 -18
- package/dist/plugin-sdk/{chrome-BKzAKr3K.js → chrome-klTSnz-9.js} +3 -3
- package/dist/plugin-sdk/{chunk-DhDkBujV.js → chunk-BbrYSny_.js} +1 -1
- package/dist/plugin-sdk/{command-format-CVrYFyZS.js → command-format-BN6tyZt6.js} +1 -1
- package/dist/plugin-sdk/{commands-registry-17yfZkHZ.js → commands-registry-CTzKKtY6.js} +4 -4
- package/dist/plugin-sdk/{config-7wk65zKC.js → config-Crv2qEdJ.js} +9 -9
- package/dist/plugin-sdk/{consolidate-exbAW0ml.js → consolidate-DT1QH65Q.js} +2 -2
- package/dist/plugin-sdk/{deliver-TxAcw7J5.js → deliver-7rOvAlrc.js} +12 -12
- package/dist/plugin-sdk/{diagnostic-Debx4frd.js → diagnostic-0nsxhWp7.js} +1 -1
- package/dist/plugin-sdk/{fs-safe-wBYbAkJF.js → fs-safe-DfWYBeWF.js} +1 -1
- package/dist/plugin-sdk/{gemini-auth-7U2pm2Ky.js → gemini-auth-C0N0_u49.js} +1 -1
- package/dist/plugin-sdk/{image-BtDVmYA5.js → image-WOSl2apK.js} +4 -4
- package/dist/plugin-sdk/index.js +43 -43
- package/dist/plugin-sdk/{ir-CKMvRrGW.js → ir-9J84MTls.js} +4 -4
- package/dist/plugin-sdk/{local-roots-c_gaPs01.js → local-roots-OLRDbvyY.js} +3 -3
- package/dist/plugin-sdk/{login-DUym1Jy0.js → login-C7x4q0i2.js} +7 -7
- package/dist/plugin-sdk/{login-qr-B-WBdvrX.js → login-qr-Dv5_MoAW.js} +9 -9
- package/dist/plugin-sdk/{manager-B71SCzos.js → manager-C83tK17x.js} +8 -8
- package/dist/plugin-sdk/{manifest-registry-Dnic6Chh.js → manifest-registry-CJMV-PI7.js} +1 -1
- package/dist/plugin-sdk/{markdown-tables-Dur7OTlM.js → markdown-tables-DXNKz5y_.js} +1 -1
- package/dist/plugin-sdk/{message-channel-BrAhJJV_.js → message-channel-aGy1HbQQ.js} +1 -1
- package/dist/plugin-sdk/{model-selection-B9qaVQSJ.js → model-selection-C-3-tpe7.js} +4 -4
- package/dist/plugin-sdk/{outbound-DB1wDM8b.js → outbound-DquCeSy5.js} +6 -6
- package/dist/plugin-sdk/{pi-auth-json-ZO118hoy.js → pi-auth-json-D9PDCXGn.js} +1 -1
- package/dist/plugin-sdk/{pi-embedded-helpers-s_U0Un7j.js → pi-embedded-helpers-D3ygfH7l.js} +16 -16
- package/dist/plugin-sdk/{plugins-DF81oSaI.js → plugins-DOwnSg9D.js} +4 -4
- package/dist/plugin-sdk/{pw-ai-CTwP02uv.js → pw-ai-rlengLjb.js} +8 -8
- package/dist/plugin-sdk/{qmd-manager-CBaSGant.js → qmd-manager-BzxFjRFa.js} +4 -4
- package/dist/plugin-sdk/{registry-CZVURNhF.js → registry-5iFfixlB.js} +2 -2
- package/dist/plugin-sdk/{replies-hwRbkU3z.js → replies-BXOzO_H5.js} +7 -7
- package/dist/plugin-sdk/{reply-prefix-CaXmzZlx.js → reply-prefix-INAKTqCU.js} +1 -1
- package/dist/plugin-sdk/{resolve-outbound-target-fxVSOBmk.js → resolve-outbound-target-DvbxHtqp.js} +2 -2
- package/dist/plugin-sdk/{resolve-route-ClCyiOeu.js → resolve-route-URXlY3AK.js} +3 -3
- package/dist/plugin-sdk/{runner-Cq5jvwQ7.js → runner-Bv0_DWoH.js} +9 -9
- package/dist/plugin-sdk/{session-B_TkB65Y.js → session-C3r8l7ou.js} +4 -4
- package/dist/plugin-sdk/{skill-commands-0LF9HTGr.js → skill-commands-KjLUGIdZ.js} +5 -5
- package/dist/plugin-sdk/{skills-BIT_O7J0.js → skills-BrsD4L5c.js} +7 -7
- package/dist/plugin-sdk/{sqlite-Bx5Y5U5X.js → sqlite-CjW7ME1H.js} +1 -1
- package/dist/plugin-sdk/{subsystem-CXqYeDy-.js → subsystem-DcOg1xJr.js} +1 -1
- package/dist/plugin-sdk/{synthesis-DtsYAj1E.js → synthesis-CY7YAasV.js} +38 -38
- package/dist/plugin-sdk/{target-errors-B8mokOeH.js → target-errors-BVWJGWFq.js} +2 -2
- package/dist/plugin-sdk/{thinking-Ca0DhqzO.js → thinking-CtsTDPOi.js} +3 -3
- package/dist/plugin-sdk/{tokens-CvlONEqh.js → tokens-8lqOTZCB.js} +1 -1
- package/dist/plugin-sdk/{tool-images-DpBaWEHT.js → tool-images-Cl_rGIUZ.js} +2 -2
- package/dist/plugin-sdk/{tool-loop-detection-BOvUFa0f.js → tool-loop-detection-Da4WUT_P.js} +2 -2
- package/dist/plugin-sdk/{unified-runner-CnM7lyNd.js → unified-runner-nwMnsZyj.js} +60 -60
- package/dist/plugin-sdk/web-BlweOZDp.js +54 -0
- package/dist/plugin-sdk/{whatsapp-actions-CvnfsFJm.js → whatsapp-actions-DpfaGYs7.js} +21 -21
- package/dist/{pw-ai-BW8_KeDf.js → pw-ai-BqxJG-Wh.js} +1 -1
- package/dist/{pw-ai-j9IE1K0-.js → pw-ai-C-NSGye0.js} +1 -1
- package/dist/{runner-8ALr2UII.js → runner-COGFTeDw.js} +1 -1
- package/dist/{runner-C4-9kFdR.js → runner-DhCi2lT1.js} +1 -1
- package/dist/{synthesis-Cph3LhA1.js → synthesis-CXZu24Vx.js} +7 -7
- package/dist/{synthesis-Cus0A2dL.js → synthesis-DrPxcMlQ.js} +7 -7
- package/dist/{unified-runner-CX80YMTk.js → unified-runner-iByUazvW.js} +16 -16
- package/dist/{web-ChozvJ7I.js → web-EsMQBIYf.js} +7 -7
- package/dist/{web-DFlsbXmQ.js → web-PPg5y6xI.js} +7 -7
- 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/dist/plugin-sdk/web-CIPJBHAU.js +0 -54
- package/docs/channels/discord.md +0 -998
- package/docs/zh-CN/channels/discord.md +0 -468
- package/skills/1password/SKILL.md +0 -71
- package/skills/1password/references/cli-examples.md +0 -29
- package/skills/1password/references/get-started.md +0 -17
- package/skills/apple-notes/SKILL.md +0 -78
- package/skills/apple-reminders/SKILL.md +0 -119
- package/skills/bear-notes/SKILL.md +0 -108
- package/skills/blogwatcher/SKILL.md +0 -70
- package/skills/blucli/SKILL.md +0 -48
- package/skills/bluebubbles/SKILL.md +0 -132
- package/skills/camsnap/SKILL.md +0 -46
- package/skills/canvas/SKILL.md +0 -204
- package/skills/connect-email/SKILL.md +0 -142
- package/skills/document-generation/SKILL.md +0 -83
- package/skills/eightctl/SKILL.md +0 -51
- package/skills/food-order/SKILL.md +0 -49
- package/skills/gemini/SKILL.md +0 -44
- package/skills/gh-issues/SKILL.md +0 -865
- package/skills/gifgrep/SKILL.md +0 -80
- package/skills/github/SKILL.md +0 -164
- package/skills/gog/SKILL.md +0 -117
- package/skills/goplaces/SKILL.md +0 -53
- package/skills/healthcheck/SKILL.md +0 -246
- package/skills/himalaya/SKILL.md +0 -258
- package/skills/himalaya/references/configuration.md +0 -184
- package/skills/himalaya/references/message-composition.md +0 -199
- package/skills/imsg/SKILL.md +0 -122
- package/skills/long-task/SKILL.md +0 -58
- package/skills/long-task/scripts/detach-task.sh +0 -187
- package/skills/nano-banana-pro/SKILL.md +0 -59
- package/skills/nano-banana-pro/scripts/generate_image.py +0 -184
- package/skills/nano-pdf/SKILL.md +0 -39
- package/skills/notion/SKILL.md +0 -173
- package/skills/obsidian/SKILL.md +0 -82
- package/skills/openai-image-gen/SKILL.md +0 -90
- package/skills/openai-image-gen/scripts/gen.py +0 -240
- package/skills/openai-whisper/SKILL.md +0 -39
- package/skills/openai-whisper-api/SKILL.md +0 -53
- package/skills/openai-whisper-api/scripts/transcribe.sh +0 -85
- package/skills/openhue/SKILL.md +0 -113
- package/skills/oracle/SKILL.md +0 -126
- package/skills/ordercli/SKILL.md +0 -79
- package/skills/peekaboo/SKILL.md +0 -191
- package/skills/reactions-extensive/SKILL.md +0 -30
- package/skills/reactions-minimal/SKILL.md +0 -31
- package/skills/safe-edit/SKILL.md +0 -51
- package/skills/sag/SKILL.md +0 -88
- package/skills/sherpa-onnx-tts/SKILL.md +0 -104
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -178
- package/skills/songsee/SKILL.md +0 -50
- package/skills/sonoscli/SKILL.md +0 -66
- package/skills/spotify-player/SKILL.md +0 -65
- package/skills/symihub/SKILL.md +0 -78
- package/skills/things-mac/SKILL.md +0 -87
- package/skills/tmux/SKILL.md +0 -153
- package/skills/tmux/scripts/find-sessions.sh +0 -112
- package/skills/tmux/scripts/wait-for-text.sh +0 -83
- package/skills/trello/SKILL.md +0 -96
- package/skills/video-frames/SKILL.md +0 -47
- package/skills/video-frames/scripts/frame.sh +0 -81
- package/skills/voice-call/SKILL.md +0 -46
- package/skills/wacli/SKILL.md +0 -73
- package/skills/weather/SKILL.md +0 -113
- package/skills/xurl/SKILL.md +0 -462
|
@@ -90,7 +90,6 @@ Each agent gets its own workspace with `SYMICORE.md`, `AGENTS.md`, and optional
|
|
|
90
90
|
|
|
91
91
|
Create one account per agent on your preferred channels:
|
|
92
92
|
|
|
93
|
-
- Discord: one bot per agent, enable Message Content Intent, copy each token.
|
|
94
93
|
- Telegram: one bot per agent via BotFather, copy each token.
|
|
95
94
|
- WhatsApp: link each phone number per account.
|
|
96
95
|
|
|
@@ -98,8 +97,6 @@ Create one account per agent on your preferred channels:
|
|
|
98
97
|
symi channels login --channel whatsapp --account work
|
|
99
98
|
```
|
|
100
99
|
|
|
101
|
-
See channel guides: [Discord](/channels/discord), [Telegram](/channels/telegram), [WhatsApp](/channels/whatsapp).
|
|
102
|
-
|
|
103
100
|
</Step>
|
|
104
101
|
|
|
105
102
|
<Step title="Add agents, accounts, and bindings">
|
|
@@ -175,12 +172,10 @@ Bindings are **deterministic** and **most-specific wins**:
|
|
|
175
172
|
|
|
176
173
|
1. `peer` match (exact DM/group/channel id)
|
|
177
174
|
2. `parentPeer` match (thread inheritance)
|
|
178
|
-
3. `
|
|
179
|
-
4. `
|
|
180
|
-
5. `
|
|
181
|
-
6. `
|
|
182
|
-
7. channel-level match (`accountId: "*"`)
|
|
183
|
-
8. fallback to default agent (`agents.list[].default`, else first list entry, default: `main`)
|
|
175
|
+
3. `teamId` (Slack)
|
|
176
|
+
4. `accountId` match for a channel
|
|
177
|
+
5. channel-level match (`accountId: "*"`)
|
|
178
|
+
6. fallback to default agent (`agents.list[].default`, else first list entry, default: `main`)
|
|
184
179
|
|
|
185
180
|
If multiple bindings match in the same tier, the first one in config order wins.
|
|
186
181
|
If a binding sets multiple match fields (for example `peer` + `guildId`), all specified fields are required (`AND` semantics).
|
|
@@ -200,10 +195,6 @@ multiple phone numbers without mixing sessions.
|
|
|
200
195
|
|
|
201
196
|
## Platform examples
|
|
202
197
|
|
|
203
|
-
### Discord bots per agent
|
|
204
|
-
|
|
205
|
-
Each Discord bot account maps to a unique `accountId`. Bind each account to an agent and keep allowlists per bot.
|
|
206
|
-
|
|
207
198
|
```json5
|
|
208
199
|
{
|
|
209
200
|
agents: {
|
|
@@ -213,15 +204,11 @@ Each Discord bot account maps to a unique `accountId`. Bind each account to an a
|
|
|
213
204
|
],
|
|
214
205
|
},
|
|
215
206
|
bindings: [
|
|
216
|
-
{ agentId: "main", match: { channel: "discord", accountId: "default" } },
|
|
217
|
-
{ agentId: "coding", match: { channel: "discord", accountId: "coding" } },
|
|
218
207
|
],
|
|
219
208
|
channels: {
|
|
220
|
-
discord: {
|
|
221
209
|
groupPolicy: "allowlist",
|
|
222
210
|
accounts: {
|
|
223
211
|
default: {
|
|
224
|
-
token: "DISCORD_BOT_TOKEN_MAIN",
|
|
225
212
|
guilds: {
|
|
226
213
|
"123456789012345678": {
|
|
227
214
|
channels: {
|
|
@@ -231,7 +218,6 @@ Each Discord bot account maps to a unique `accountId`. Bind each account to an a
|
|
|
231
218
|
},
|
|
232
219
|
},
|
|
233
220
|
coding: {
|
|
234
|
-
token: "DISCORD_BOT_TOKEN_CODING",
|
|
235
221
|
guilds: {
|
|
236
222
|
"123456789012345678": {
|
|
237
223
|
channels: {
|
|
@@ -249,7 +235,6 @@ Each Discord bot account maps to a unique `accountId`. Bind each account to an a
|
|
|
249
235
|
Notes:
|
|
250
236
|
|
|
251
237
|
- Invite each bot to the guild and enable Message Content Intent.
|
|
252
|
-
- Tokens live in `channels.discord.accounts.<id>.token` (default account can use `DISCORD_BOT_TOKEN`).
|
|
253
238
|
|
|
254
239
|
### Telegram bots per agent
|
|
255
240
|
|
package/docs/concepts/queue.md
CHANGED
|
@@ -36,7 +36,6 @@ Inbound messages can steer the current run, wait for a followup turn, or do both
|
|
|
36
36
|
Steer-backlog means you can get a followup response after the steered run, so
|
|
37
37
|
streaming surfaces can look like duplicates. Prefer `collect`/`steer` if you want
|
|
38
38
|
one response per inbound message.
|
|
39
|
-
Send `/queue collect` as a standalone command (per-session) or set `messages.queue.byChannel.discord: "collect"`.
|
|
40
39
|
|
|
41
40
|
Defaults (when unset in config):
|
|
42
41
|
|
|
@@ -52,7 +51,6 @@ Configure globally or per channel via `messages.queue`:
|
|
|
52
51
|
debounceMs: 1000,
|
|
53
52
|
cap: 20,
|
|
54
53
|
drop: "summarize",
|
|
55
|
-
byChannel: { discord: "collect" },
|
|
56
54
|
},
|
|
57
55
|
},
|
|
58
56
|
}
|
|
@@ -77,7 +75,6 @@ Defaults: `debounceMs: 1000`, `cap: 20`, `drop: summarize`.
|
|
|
77
75
|
|
|
78
76
|
## Scope and guarantees
|
|
79
77
|
|
|
80
|
-
- Applies to auto-reply agent runs across all inbound channels that use the gateway reply pipeline (WhatsApp web, Telegram, Slack, Discord, Signal, iMessage, webchat, etc.).
|
|
81
78
|
- Default lane (`main`) is process-wide for inbound + main heartbeats; set `agents.defaults.maxConcurrent` to allow multiple sessions in parallel.
|
|
82
79
|
- Additional lanes may exist (e.g. `cron`, `subagent`) so background jobs can run in parallel without blocking inbound replies.
|
|
83
80
|
- Per-session lanes guarantee that only one agent run touches a given session at a time.
|
package/docs/concepts/retry.md
CHANGED
|
@@ -21,14 +21,10 @@ title: "Retry Policy"
|
|
|
21
21
|
- Jitter: 0.1 (10 percent)
|
|
22
22
|
- Provider defaults:
|
|
23
23
|
- Telegram min delay: 400 ms
|
|
24
|
-
- Discord min delay: 500 ms
|
|
25
24
|
|
|
26
25
|
## Behavior
|
|
27
26
|
|
|
28
|
-
### Discord
|
|
29
|
-
|
|
30
27
|
- Retries only on rate-limit errors (HTTP 429).
|
|
31
|
-
- Uses Discord `retry_after` when available, otherwise exponential backoff.
|
|
32
28
|
|
|
33
29
|
### Telegram
|
|
34
30
|
|
|
@@ -51,7 +47,6 @@ Set retry policy per provider in `~/.symi/symi.json`:
|
|
|
51
47
|
jitter: 0.1,
|
|
52
48
|
},
|
|
53
49
|
},
|
|
54
|
-
discord: {
|
|
55
50
|
retry: {
|
|
56
51
|
attempts: 3,
|
|
57
52
|
minDelayMs: 500,
|
|
@@ -47,7 +47,6 @@ Row shape (JSON):
|
|
|
47
47
|
|
|
48
48
|
- `key`: session key (string)
|
|
49
49
|
- `kind`: `main | group | cron | hook | node | other`
|
|
50
|
-
- `channel`: `whatsapp | telegram | discord | signal | imessage | webchat | internal | unknown`
|
|
51
50
|
- `displayName` (group display label if available)
|
|
52
51
|
- `updatedAt` (ms)
|
|
53
52
|
- `sessionId`
|
|
@@ -121,7 +120,6 @@ Policy-based blocking by channel/chat type (not per session id).
|
|
|
121
120
|
"sendPolicy": {
|
|
122
121
|
"rules": [
|
|
123
122
|
{
|
|
124
|
-
"match": { "channel": "discord", "chatType": "group" },
|
|
125
123
|
"action": "deny"
|
|
126
124
|
}
|
|
127
125
|
],
|
package/docs/concepts/session.md
CHANGED
|
@@ -106,7 +106,6 @@ the workspace is writable. See [Memory](/concepts/memory) and
|
|
|
106
106
|
- Daily reset: defaults to **4:00 AM local time on the gateway host**. A session is stale once its last update is earlier than the most recent daily reset time.
|
|
107
107
|
- Idle reset (optional): `idleMinutes` adds a sliding idle window. When both daily and idle resets are configured, **whichever expires first** forces a new session.
|
|
108
108
|
- Legacy idle-only: if you set `session.idleMinutes` without any `session.reset`/`resetByType` config, Symi stays in idle-only mode for backward compatibility.
|
|
109
|
-
- Per-type overrides (optional): `resetByType` lets you override the policy for `direct`, `group`, and `thread` sessions (thread = Slack/Discord threads, Telegram topics, Matrix threads when provided by the connector).
|
|
110
109
|
- Per-channel overrides (optional): `resetByChannel` overrides the reset policy for a channel (applies to all session types for that channel and takes precedence over `reset`/`resetByType`).
|
|
111
110
|
- Reset triggers: exact `/new` or `/reset` (plus any extras in `resetTriggers`) start a fresh session id and pass the remainder of the message through. `/new <model>` accepts a model alias, `provider/model`, or provider name (fuzzy match) to set the new session model. If `/new` or `/reset` is sent alone, Symi runs a short “hello” greeting turn to confirm the reset.
|
|
112
111
|
- Manual reset: delete specific keys from the store or remove the JSONL transcript; the next message recreates them.
|
|
@@ -121,10 +120,8 @@ Block delivery for specific session types without listing individual ids.
|
|
|
121
120
|
session: {
|
|
122
121
|
sendPolicy: {
|
|
123
122
|
rules: [
|
|
124
|
-
{ action: "deny", match: { channel: "discord", chatType: "group" } },
|
|
125
123
|
{ action: "deny", match: { keyPrefix: "cron:" } },
|
|
126
124
|
// Match the raw session key (including the `agent:<id>:` prefix).
|
|
127
|
-
{ action: "deny", match: { rawKeyPrefix: "agent:main:discord:" } },
|
|
128
125
|
],
|
|
129
126
|
default: "allow",
|
|
130
127
|
},
|
|
@@ -147,9 +144,7 @@ Runtime override (owner only):
|
|
|
147
144
|
session: {
|
|
148
145
|
scope: "per-sender", // keep group keys separate
|
|
149
146
|
dmScope: "main", // DM continuity (set per-channel-peer/per-account-channel-peer for shared inboxes)
|
|
150
|
-
identityLinks: {
|
|
151
|
-
alice: ["telegram:123456789", "discord:987654321012345678"],
|
|
152
|
-
},
|
|
147
|
+
identityLinks: {},
|
|
153
148
|
reset: {
|
|
154
149
|
// Defaults: mode=daily, atHour=4 (gateway host local time).
|
|
155
150
|
// If you also set idleMinutes, whichever expires first wins.
|
|
@@ -162,9 +157,7 @@ Runtime override (owner only):
|
|
|
162
157
|
direct: { mode: "idle", idleMinutes: 240 },
|
|
163
158
|
group: { mode: "idle", idleMinutes: 120 },
|
|
164
159
|
},
|
|
165
|
-
resetByChannel: {
|
|
166
|
-
discord: { mode: "idle", idleMinutes: 10080 },
|
|
167
|
-
},
|
|
160
|
+
resetByChannel: {},
|
|
168
161
|
resetTriggers: ["/new", "/reset"],
|
|
169
162
|
store: "~/.symi/agents/{agentId}/sessions/sessions.json",
|
|
170
163
|
mainKey: "main",
|
|
@@ -45,7 +45,6 @@ Legend:
|
|
|
45
45
|
- `agents.defaults.blockStreamingCoalesce`: `{ minChars?, maxChars?, idleMs? }` (merge streamed blocks before send).
|
|
46
46
|
- Channel hard cap: `*.textChunkLimit` (e.g., `channels.whatsapp.textChunkLimit`).
|
|
47
47
|
- Channel chunk mode: `*.chunkMode` (`length` default, `newline` splits on blank lines (paragraph boundaries) before length chunking).
|
|
48
|
-
- Discord soft cap: `channels.discord.maxLinesPerMessage` (default 17) splits tall replies to avoid UI clipping.
|
|
49
48
|
|
|
50
49
|
**Boundary semantics:**
|
|
51
50
|
|
|
@@ -78,7 +77,6 @@ progressive output.
|
|
|
78
77
|
- Joiner is derived from `blockStreamingChunk.breakPreference`
|
|
79
78
|
(`paragraph` → `\n\n`, `newline` → `\n`, `sentence` → space).
|
|
80
79
|
- Channel overrides are available via `*.blockStreamingCoalesce` (including per-account configs).
|
|
81
|
-
- Default coalesce `minChars` is bumped to 1500 for Signal/Slack/Discord unless overridden.
|
|
82
80
|
|
|
83
81
|
## Human-like pacing between blocks
|
|
84
82
|
|
|
@@ -123,7 +123,6 @@ This keeps the base prompt small while still enabling targeted skill usage.
|
|
|
123
123
|
|
|
124
124
|
When available, the system prompt includes a **Documentation** section that points to the
|
|
125
125
|
local Symi docs directory (either `docs/` in the repo workspace or the bundled npm
|
|
126
|
-
package docs) and also notes the public mirror, source repo, community Discord, and
|
|
127
126
|
SymiHub ([https://symihub.com](https://symihub.com)) for skills discovery. The prompt instructs the model to consult local docs first
|
|
128
127
|
for Symi behavior, commands, configuration, or architecture, and to run
|
|
129
128
|
`symi status` itself when possible (asking the user only when it lacks access).
|
|
@@ -62,7 +62,6 @@ You can override this with:
|
|
|
62
62
|
|
|
63
63
|
## Tool payloads (raw provider data + normalized fields)
|
|
64
64
|
|
|
65
|
-
Tool calls (`channels.discord.readMessages`, `channels.slack.readMessages`, etc.) return **raw provider timestamps**.
|
|
66
65
|
We also attach normalized fields for consistency:
|
|
67
66
|
|
|
68
67
|
- `timestampMs` (UTC epoch milliseconds)
|
package/docs/date-time.md
CHANGED
|
@@ -116,7 +116,6 @@ Channel tools return **provider-native timestamps** and add normalized fields fo
|
|
|
116
116
|
Raw provider fields are preserved so nothing is lost.
|
|
117
117
|
|
|
118
118
|
- Slack: epoch-like strings from the API
|
|
119
|
-
- Discord: UTC ISO timestamps
|
|
120
119
|
- Telegram/WhatsApp: provider-specific numeric/ISO timestamps
|
|
121
120
|
|
|
122
121
|
If you need local time, convert it downstream using the known timezone.
|
package/docs/docs.json
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://mintlify.com/docs.json",
|
|
3
3
|
"name": "Symi",
|
|
4
|
-
"description": "Self-hosted gateway that connects WhatsApp, Telegram, Discord, iMessage, and more to AI coding agents. Run a single Gateway process on your own machine and message your AI assistant from anywhere.",
|
|
5
4
|
"theme": "mint",
|
|
6
5
|
"icons": {
|
|
7
6
|
"library": "lucide"
|
|
@@ -123,10 +122,7 @@
|
|
|
123
122
|
"source": "/message",
|
|
124
123
|
"destination": "/cli/message"
|
|
125
124
|
},
|
|
126
|
-
{
|
|
127
|
-
"source": "/providers/discord",
|
|
128
|
-
"destination": "/channels/discord"
|
|
129
|
-
},
|
|
125
|
+
{},
|
|
130
126
|
{
|
|
131
127
|
"source": "/providers/googlechat",
|
|
132
128
|
"destination": "/channels/googlechat"
|
|
@@ -307,10 +303,7 @@
|
|
|
307
303
|
"source": "/device-models",
|
|
308
304
|
"destination": "/reference/device-models"
|
|
309
305
|
},
|
|
310
|
-
{
|
|
311
|
-
"source": "/discord",
|
|
312
|
-
"destination": "/channels/discord"
|
|
313
|
-
},
|
|
306
|
+
{},
|
|
314
307
|
{
|
|
315
308
|
"source": "/discovery",
|
|
316
309
|
"destination": "/gateway/discovery"
|
|
@@ -883,7 +876,6 @@
|
|
|
883
876
|
"pages": [
|
|
884
877
|
"channels/whatsapp",
|
|
885
878
|
"channels/telegram",
|
|
886
|
-
"channels/discord",
|
|
887
879
|
"channels/irc",
|
|
888
880
|
"channels/slack",
|
|
889
881
|
"channels/feishu",
|
|
@@ -1397,7 +1389,6 @@
|
|
|
1397
1389
|
"pages": [
|
|
1398
1390
|
"zh-CN/channels/whatsapp",
|
|
1399
1391
|
"zh-CN/channels/telegram",
|
|
1400
|
-
"zh-CN/channels/discord",
|
|
1401
1392
|
"zh-CN/channels/slack",
|
|
1402
1393
|
"zh-CN/channels/feishu",
|
|
1403
1394
|
"zh-CN/channels/googlechat",
|
|
@@ -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
|
},
|