feat(discord): eyes reaction as a read receipt on every admitted message (#1509)

QUEUE row 15, MVP iteration 1 after the Sage pilot. rest.react is best
effort (2xx true, anything else false, never throws); the connector reacts
at admission before the engine runs and records the outcome in the turn
record as receipt. Drops and refusals get no reaction. Suite 28/28, 90
node tests.

Co-Authored-By: Claude Fable 5.1 <[email protected]>
This commit is contained in:
2026-09-13 14:20:30 -05:00
co-authored by Claude Fable 5.1
parent 788515dc69
commit 93d6b62457
10 changed files with 115 additions and 6 deletions
+7
View File
@@ -100,6 +100,9 @@ export function fakeRest({ outcomes = [] } = {}) {
return {
calls,
typingCalls: [],
reactions: [],
// When false, react resolves false (Discord refused the reaction).
reactOk: true,
channels: new Map(),
lookups: 0,
// When set, getChannel waits on this promise before answering (held lookup).
@@ -116,6 +119,10 @@ export function fakeRest({ outcomes = [] } = {}) {
async typing(channelId) {
this.typingCalls.push(channelId);
},
async react(channelId, messageId, emoji) {
this.reactions.push({ channelId, messageId, emoji });
return this.reactOk;
},
async getChannel(id) {
this.lookups += 1;
if (this.holdLookup) await this.holdLookup;