From a4408a917eab805c5a41dc53c35998c662d54d0b Mon Sep 17 00:00:00 2001 From: Lucas Teixeira Campos Araujo Date: Thu, 26 Feb 2026 09:36:54 -0400 Subject: [PATCH] fix: pass sessionKey to deliverOutboundPayloads for message:sent hook dispatch MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Several call sites of deliverOutboundPayloads() were not passing the sessionKey parameter, causing the internal message:sent hook to never fire (the guard `if (!sessionKeyForInternalHooks) return` in deliver.ts silently skipped the triggerInternalHook call). Fixed call sites: - commands/agent/delivery.ts (agent loop replies — main fix) - infra/heartbeat-runner.ts (heartbeat OK + alert delivery) - infra/outbound/message.ts (message tool sends) - cron/isolated-agent/delivery-dispatch.ts (cron job delivery) - gateway/server-node-events.ts (node event forwarding) The sessionKey parameter already existed in DeliverOutboundPayloadsCoreParams and was used by deliver.ts to emit the message:sent internal hook event, but was simply not being passed from most callers. --- src/commands/agent/delivery.ts | 1 + src/cron/isolated-agent/delivery-dispatch.ts | 1 + src/gateway/server-node-events.ts | 1 + src/infra/heartbeat-runner.ts | 2 ++ src/infra/outbound/message.ts | 1 + 5 files changed, 6 insertions(+) diff --git a/src/commands/agent/delivery.ts b/src/commands/agent/delivery.ts index caecb2a6283..fdb0319dfbd 100644 --- a/src/commands/agent/delivery.ts +++ b/src/commands/agent/delivery.ts @@ -230,6 +230,7 @@ export async function deliverAgentCommandResult(params: { onError: (err) => logDeliveryError(err), onPayload: logPayload, deps: createOutboundSendDeps(deps), + sessionKey: opts.sessionKey, }); } } diff --git a/src/cron/isolated-agent/delivery-dispatch.ts b/src/cron/isolated-agent/delivery-dispatch.ts index 1feae211df8..c6040a61774 100644 --- a/src/cron/isolated-agent/delivery-dispatch.ts +++ b/src/cron/isolated-agent/delivery-dispatch.ts @@ -182,6 +182,7 @@ export async function dispatchCronDelivery( bestEffort: params.deliveryBestEffort, deps: createOutboundSendDeps(params.deps), abortSignal: params.abortSignal, + sessionKey: params.agentSessionKey, }); delivered = deliveryResults.length > 0; return null; diff --git a/src/gateway/server-node-events.ts b/src/gateway/server-node-events.ts index ce1d699797f..7446d1e22cf 100644 --- a/src/gateway/server-node-events.ts +++ b/src/gateway/server-node-events.ts @@ -241,6 +241,7 @@ async function sendReceiptAck(params: { agentId, bestEffort: true, deps: createOutboundSendDeps(params.deps), + sessionKey: params.sessionKey, }); } diff --git a/src/infra/heartbeat-runner.ts b/src/infra/heartbeat-runner.ts index 73c2fafb1ae..bd43092b92a 100644 --- a/src/infra/heartbeat-runner.ts +++ b/src/infra/heartbeat-runner.ts @@ -723,6 +723,7 @@ export async function runHeartbeatOnce(opts: { payloads: [{ text: heartbeatOkText }], agentId, deps: opts.deps, + sessionKey, }); return true; }; @@ -928,6 +929,7 @@ export async function runHeartbeatOnce(opts: { ]), ], deps: opts.deps, + sessionKey, }); // Record last delivered heartbeat payload for dedupe. diff --git a/src/infra/outbound/message.ts b/src/infra/outbound/message.ts index 30451b66959..1ae2a9246ae 100644 --- a/src/infra/outbound/message.ts +++ b/src/infra/outbound/message.ts @@ -233,6 +233,7 @@ export async function sendMessage(params: MessageSendParams): Promise