Files
stack/packages/discord/fixtures/binding.example.json
T
jason.woltjeandClaude Fable 5.1 caaef941e6 feat(discord): binding reload without a restart, and a per-user channel allowlist (#1509)
`reload` validates the binding file and sends SIGHUP to the live owner;
the running connector re-reads it and swaps guildName, channels, users
and limits in place. name, seat, guildId, botUserId, tokenFile, engine
and context are fixed for the life of the process; a change there, an
invalid file or a channel outside the guild refuses the reload and keeps
the old binding. Every attempt is one line in reloads.jsonl. The service
unit maps `systemctl --user reload` to the same signal.

A user entry may carry `channels`, an allowlist of listed channel ids;
absent means every listed channel. Outside the list the message is
dropped as channel-not-for-user; threads count as their parent.

Suite 41/41, 101 node tests. QUEUE rows 19 and 20 opened.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
2026-09-13 18:59:31 -05:00

33 lines
943 B
JSON

{
"bindingVersion": 1,
"name": "example-seat",
"seat": "sage",
"guildId": "100000000000000001",
"guildName": "Example Server",
"botUserId": "100000000000000002",
"tokenFile": "/home/example/secrets/discord-example.token",
"channels": [
{ "id": "100000000000000010", "name": "seat-admin", "mode": "open" },
{ "id": "100000000000000011", "name": "general", "mode": "mention" }
],
"users": [
{ "id": "100000000000000100", "name": "owner" },
{ "id": "100000000000000101", "name": "guest", "channels": ["100000000000000011"] }
],
"engine": { "provider": "zai", "model": "glm-5.3", "thinking": "high" },
"limits": {
"turnsPerDay": 200,
"turnTimeoutSeconds": 180,
"replyChunkChars": 1900,
"inboundMaxChars": 4000
},
"context": {
"files": [
"contracts/CONSTITUTION.md",
"contracts/STANDARDS.md",
"agents/sage/SOUL.md",
"agents/sage/DISCORD-USER.md"
]
}
}