From 143496fdf2ccbd89577df16daa7140e38445ff01 Mon Sep 17 00:00:00 2001 From: linonetwo Date: Fri, 3 Apr 2026 15:44:54 +0800 Subject: [PATCH] fix: trigger agentStatusChanged hook and heartbeat even when framework yields no message memeloopTaskAgentWorkerHandler yields { state } without a message field (worker-side bindWorkerConversation handles message materialization). The old code gated hook dispatch and heartbeat startup inside if (lastResult?.message), so they were never triggered for memeloop agents. Extract hook + heartbeat into if (lastResult) so they run regardless of whether the framework attached a message to the terminal yield. --- src/services/agentInstance/index.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/services/agentInstance/index.ts b/src/services/agentInstance/index.ts index b287cfbf..05315dd6 100644 --- a/src/services/agentInstance/index.ts +++ b/src/services/agentInstance/index.ts @@ -997,8 +997,12 @@ export class AgentInstanceService implements IAgentInstanceService { } }); } + } - // Trigger agentStatusChanged hook with actual terminal state (completed, input-required, etc.) + if (lastResult) { + // Trigger agentStatusChanged hook with actual terminal state (completed, input-required, etc.). + // This must run even when the framework yields no message (e.g. memeloopTaskAgentWorkerHandler + // yields { state } without a message; worker-side updates handle message materialization). const terminalState = (lastResult.state ?? 'completed') as 'working' | 'completed' | 'failed' | 'canceled' | 'input-required'; await frameworkHooks.agentStatusChanged.promise({ agentFrameworkContext: frameworkContext,