Skip to content

Commit 3096837

Browse files
fix(cron): enable completion direct send for text-only announce delivery (#29151)
1 parent fe9a7c4 commit 3096837

File tree

4 files changed

+18
-1
lines changed

4 files changed

+18
-1
lines changed

src/agents/subagent-announce.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,17 @@ function buildCompletionDeliveryMessage(params: {
7070
subagentName: string;
7171
spawnMode?: SpawnSubagentMode;
7272
outcome?: SubagentRunOutcome;
73+
announceType?: SubagentAnnounceType;
7374
}): string {
7475
const findingsText = params.findings.trim();
7576
if (isAnnounceSkip(findingsText)) {
7677
return "";
7778
}
7879
const hasFindings = findingsText.length > 0 && findingsText !== "(no output)";
80+
// Cron completions are standalone messages — skip the subagent status header.
81+
if (params.announceType === "cron job") {
82+
return hasFindings ? findingsText : "";
83+
}
7984
const header = (() => {
8085
if (params.outcome?.status === "error") {
8186
return params.spawnMode === "session"
@@ -1278,6 +1283,7 @@ export async function runSubagentAnnounceFlow(params: {
12781283
subagentName,
12791284
spawnMode: params.spawnMode,
12801285
outcome,
1286+
announceType,
12811287
});
12821288
const internalSummaryMessage = [
12831289
`[System Message] [sessionId: ${announceSessionId}] A ${announceType} "${taskLabel}" just ${statusLabel}.`,

src/cron/isolated-agent.direct-delivery-forum-topics.test.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import "./isolated-agent.mocks.js";
2-
import { beforeEach, describe, expect, it } from "vitest";
2+
import { beforeEach, describe, expect, it, vi } from "vitest";
33
import { runSubagentAnnounceFlow } from "../agents/subagent-announce.js";
44
import {
55
createCliDeps,
@@ -56,6 +56,10 @@ describe("runCronIsolatedAgentTurn forum topic delivery", () => {
5656

5757
expect(res.status).toBe("ok");
5858
expect(runSubagentAnnounceFlow).toHaveBeenCalledTimes(1);
59+
const announceArgs = vi.mocked(runSubagentAnnounceFlow).mock.calls[0]?.[0] as
60+
| { expectsCompletionMessage?: boolean }
61+
| undefined;
62+
expect(announceArgs?.expectsCompletionMessage).toBe(true);
5963
expect(deps.sendMessageTelegram).not.toHaveBeenCalled();
6064
});
6165
});

src/cron/isolated-agent.skips-delivery-without-whatsapp-recipient-besteffortdeliver-true.test.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ async function expectExplicitTelegramTargetAnnounce(params: {
8989
expect(announceArgs?.requesterOrigin?.to).toBe("123");
9090
expect(announceArgs?.roundOneReply).toBe(params.expectedText);
9191
expect(announceArgs?.bestEffortDeliver).toBe(false);
92+
expect((announceArgs as { expectsCompletionMessage?: boolean })?.expectsCompletionMessage).toBe(
93+
true,
94+
);
9295
expect(deps.sendMessageTelegram).not.toHaveBeenCalled();
9396
});
9497
}

src/cron/isolated-agent/delivery-dispatch.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -309,6 +309,10 @@ export async function dispatchCronDelivery(
309309
timeoutMs: params.timeoutMs,
310310
cleanup: params.job.deleteAfterRun ? "delete" : "keep",
311311
roundOneReply: synthesizedText,
312+
// Cron output is a finished completion message: send it directly to the
313+
// target channel via the completion-direct-send path rather than injecting
314+
// a trigger message into the (likely idle) main agent session.
315+
expectsCompletionMessage: true,
312316
// Keep delivery outcome truthful for cron state: if outbound send fails,
313317
// announce flow must report false so caller can apply best-effort policy.
314318
bestEffortDeliver: false,

0 commit comments

Comments
 (0)