Squash merge of PR #2267 by ddaniels. When an agent group has more than one active session, A2A replies landed in the newest session via findSessionByAgentGroup's ORDER BY created_at DESC. The session that asked the question never saw the answer. Adds origin-aware return-path routing with three layers: 1. Direct return-path: if the reply has in_reply_to, look up the triggering inbound row's source_session_id and route there. 2. Peer-affinity fallback: find the most recent A2A inbound from this peer and use its source_session_id. 3. Legacy fallback: newest active session (pre-migration compat). Container-side: MCP send_message/send_file now thread the current batch's in_reply_to through to outbound rows via current-batch.ts. Also flips our A2A bug-documenting test (#2332) from asserting the broken behavior to asserting the fixed behavior. Co-Authored-By: Doug Daniels <ddaniels888@gmail.com> Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
30 lines
1.0 KiB
TypeScript
30 lines
1.0 KiB
TypeScript
/**
|
|
* Per-batch context the poll loop publishes for downstream consumers
|
|
* (MCP tools, etc.) that don't sit on the poll-loop's call stack.
|
|
*
|
|
* Today the only field is `inReplyTo` — the id of the first inbound
|
|
* message in the batch the agent is currently processing. MCP tools like
|
|
* `send_message` and `send_file` read this and stamp it onto the outbound
|
|
* row so the host's a2a return-path routing can correlate replies back to
|
|
* the originating session.
|
|
*
|
|
* This is module-level state on purpose: the agent-runner is single-process
|
|
* and processes one batch at a time. Poll-loop calls `setCurrentInReplyTo`
|
|
* before invoking the provider and `clearCurrentInReplyTo` after the batch
|
|
* completes (or errors out).
|
|
*/
|
|
let currentInReplyTo: string | null = null;
|
|
|
|
export function setCurrentInReplyTo(id: string | null): void {
|
|
currentInReplyTo = id;
|
|
}
|
|
|
|
export function clearCurrentInReplyTo(): void {
|
|
currentInReplyTo = null;
|
|
}
|
|
|
|
export function getCurrentInReplyTo(): string | null {
|
|
return currentInReplyTo;
|
|
}
|
|
|