
























@@ -229,6 +229,8 @@ async function deliverDiscordDirectMessageCompletion(params: {
229229callGateway: typeof runtimeCallGateway;
230230sendMessage?: typeof runtimeSendMessage;
231231internalEvents?: AgentInternalEvent[];
232+isActive?: boolean;
233+queueEmbeddedAgentMessageWithOutcome?: QueueEmbeddedAgentMessageWithOutcome;
232234sourceTool?: string;
233235}) {
234236const origin = {
@@ -240,10 +242,13 @@ async function deliverDiscordDirectMessageCompletion(params: {
240242callGateway: params.callGateway,
241243getRequesterSessionActivity: () => ({
242244sessionId: "requester-session-dm",
243-isActive: false,
245+isActive: params.isActive === true,
244246}),
245247getRuntimeConfig: () => ({}) as never,
246248sendMessage: params.sendMessage ?? runtimeSendMessage,
249+ ...(params.queueEmbeddedAgentMessageWithOutcome
250+ ? { queueEmbeddedAgentMessageWithOutcome: params.queueEmbeddedAgentMessageWithOutcome }
251+ : {}),
247252});
248253249254return deliverSubagentAnnouncement({
@@ -4786,6 +4791,58 @@ describe("deliverSubagentAnnouncement completion delivery", () => {
47864791expect(sendMessage).not.toHaveBeenCalled();
47874792});
478847934794+it("retries active direct subagent completion wake without forced message-tool mode", async () => {
4795+const callGateway = createGatewayMock({
4796+result: {
4797+payloads: [{ text: "The subagent is done: child completion output" }],
4798+didSendViaMessagingTool: true,
4799+},
4800+});
4801+const queueEmbeddedAgentMessageWithOutcome = createQueueOutcomeSequenceMock([
4802+"source_reply_delivery_mode_mismatch",
4803+true,
4804+]);
4805+4806+const result = await deliverDiscordDirectMessageCompletion({
4807+ callGateway,
4808+isActive: true,
4809+ queueEmbeddedAgentMessageWithOutcome,
4810+sourceTool: "subagent_announce",
4811+internalEvents: [
4812+{
4813+type: "task_completion",
4814+source: "subagent",
4815+childSessionKey: "agent:worker:subagent:child",
4816+childSessionId: "child-session-id",
4817+announceType: "subagent task",
4818+taskLabel: "direct completion active wake",
4819+status: "ok",
4820+statusLabel: "completed successfully",
4821+result: "child completion output",
4822+replyInstruction: "Summarize the result.",
4823+},
4824+],
4825+});
4826+4827+expectRecordFields(result, {
4828+delivered: true,
4829+path: "steered",
4830+});
4831+expect(queueEmbeddedAgentMessageWithOutcome).toHaveBeenCalledTimes(2);
4832+expectRecordFields(mockCallArg(queueEmbeddedAgentMessageWithOutcome, 0, 2), {
4833+sourceReplyDeliveryMode: "message_tool_only",
4834+waitForTranscriptCommit: true,
4835+});
4836+const retryOptions = mockCallArg(queueEmbeddedAgentMessageWithOutcome, 1, 2);
4837+expectRecordFields(retryOptions, {
4838+waitForTranscriptCommit: true,
4839+});
4840+expect(
4841+(retryOptions as { sourceReplyDeliveryMode?: unknown }).sourceReplyDeliveryMode,
4842+).toBeUndefined();
4843+expect(callGateway).not.toHaveBeenCalled();
4844+});
4845+47894846it("falls back to the external requester route when completion origin is internal", async () => {
47904847const callGateway = createGatewayMock({
47914848result: {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。