























@@ -12,18 +12,21 @@ function createContext(
1212overrides?: {
1313onAgentEvent?: (event: unknown) => void;
1414onBeforeLifecycleTerminal?: () => void | Promise<void>;
15+onBlockReply?: ((payload: unknown) => void) | undefined;
1516onBlockReplyFlush?: () => void | Promise<void>;
1617},
1718): EmbeddedPiSubscribeContext {
18-const onBlockReply = vi.fn();
19+const hasOnBlockReplyOverride = Boolean(overrides && "onBlockReply" in overrides);
20+const onBlockReply = hasOnBlockReplyOverride ? overrides?.onBlockReply : vi.fn();
21+const emitBlockReply = vi.fn();
1922return {
2023params: {
2124runId: "run-1",
2225config: {},
2326sessionKey: "agent:main:main",
2427onAgentEvent: overrides?.onAgentEvent,
2528onBeforeLifecycleTerminal: overrides?.onBeforeLifecycleTerminal,
26- onBlockReply,
29+...(onBlockReply ? { onBlockReply } : {}),
2730onBlockReplyFlush: overrides?.onBlockReplyFlush,
2831},
2932state: {
@@ -43,7 +46,7 @@ function createContext(
4346warn: vi.fn(),
4447},
4548flushBlockReplyBuffer: vi.fn(),
46-emitBlockReply: onBlockReply,
49+ emitBlockReply,
4750resolveCompactionRetry: vi.fn(),
4851maybeResolveCompactionWait: vi.fn(),
4952} as unknown as EmbeddedPiSubscribeContext;
@@ -321,6 +324,18 @@ describe("handleAgentEnd", () => {
321324expect(ctx.state.pendingToolAudioAsVoice).toBe(false);
322325});
323326327+it("preserves orphaned tool media when no block reply callback is configured", async () => {
328+const ctx = createContext(undefined, { onBlockReply: undefined });
329+ctx.state.pendingToolMediaUrls = ["/tmp/reply.opus"];
330+ctx.state.pendingToolAudioAsVoice = true;
331+332+await handleAgentEnd(ctx);
333+334+expect(ctx.emitBlockReply).not.toHaveBeenCalled();
335+expect(ctx.state.pendingToolMediaUrls).toEqual(["/tmp/reply.opus"]);
336+expect(ctx.state.pendingToolAudioAsVoice).toBe(true);
337+});
338+324339it("emits orphaned tool media before the lifecycle end event", async () => {
325340const onAgentEvent = vi.fn();
326341const ctx = createContext(undefined, { onAgentEvent });
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。