fix(discord): persist streamed final delivery

Carry the original reply anchor through stream metadata so a successful final Discord edit marks the recovered source message complete.
This commit is contained in:
Teknium 2026-07-17 03:11:30 -07:00
parent d5b9c1ee37
commit 9412f2dd84
4 changed files with 47 additions and 1 deletions

View file

@ -240,6 +240,8 @@ class GatewayStreamConsumer:
final-message delivery.
"""
meta = dict(self.metadata) if self.metadata else {}
if self._initial_reply_to_id:
meta["reply_to_message_id"] = self._initial_reply_to_id
if expect_edits:
meta["expect_edits"] = True
if final:

View file

@ -2977,6 +2977,7 @@ class DiscordAdapter(BasePlatformAdapter):
content: str,
*,
finalize: bool = False,
metadata: Optional[Dict[str, Any]] = None,
) -> SendResult:
"""Edit a previously sent Discord message.
@ -3056,7 +3057,15 @@ class DiscordAdapter(BasePlatformAdapter):
self._last_overflow_preview[_preview_key] = truncated
else:
raise
return SendResult(success=True, message_id=message_id)
result = SendResult(success=True, message_id=message_id)
if finalize:
self._record_discord_response(
reply_to=(metadata or {}).get("reply_to_message_id"),
result=result,
content=content,
final=True,
)
return result
except Exception as e: # pragma: no cover - defensive logging
logger.error("[%s] Failed to edit Discord message %s: %s", self.name, message_id, e, exc_info=True)
return SendResult(success=False, error=str(e))

View file

@ -735,6 +735,25 @@ async def test_send_uses_notify_metadata_as_final_delivery_signal(adapter):
assert adapter._discord_message_is_persistently_complete("94") is True
@pytest.mark.asyncio
async def test_final_stream_edit_marks_original_request_complete(adapter):
channel = FakeChannel(channel_id=123)
message = SimpleNamespace(edit=AsyncMock())
channel.fetch_message = AsyncMock(return_value=message)
adapter._client.get_channel = lambda _channel_id: channel
result = await adapter.edit_message(
"123",
"9009",
"complete streamed response",
finalize=True,
metadata={"reply_to_message_id": "102"},
)
assert result.success is True
assert adapter._discord_message_is_persistently_complete("102") is True
def test_disabled_recovery_does_not_create_hot_path_ledger(adapter, monkeypatch):
monkeypatch.setenv("DISCORD_MISSED_MESSAGE_BACKFILL", "false")
message = make_message(message_id=90)

View file

@ -9,6 +9,22 @@ import pytest
from gateway.stream_consumer import GatewayStreamConsumer, StreamConsumerConfig
def test_stream_send_metadata_carries_original_reply_anchor():
consumer = GatewayStreamConsumer(
adapter=MagicMock(),
chat_id="123",
initial_reply_to_id="456",
)
assert consumer._metadata_for_send(final=False) == {
"reply_to_message_id": "456",
}
assert consumer._metadata_for_send(final=True) == {
"reply_to_message_id": "456",
"notify": True,
}
# ── _clean_for_display unit tests ────────────────────────────────────────