


























@@ -340,6 +340,130 @@ describe("qa suite runtime agent process helpers", () => {
340340await expect(pending).resolves.toEqual({ results: [{ text: "LATE-STDOUT" }] });
341341});
342342343+it("parses pretty json qa cli output before trailing stdout logs", async () => {
344+const child = createSpawnedProcess();
345+spawnMock.mockReturnValue(child);
346+347+const pending = runQaCli(
348+{
349+repoRoot: "/repo",
350+gateway: {
351+tempRoot: "/tmp/runtime",
352+runtimeEnv: {},
353+},
354+primaryModel: "openai/gpt-5.5",
355+alternateModel: "openai/gpt-5.5-mini",
356+providerMode: "mock-openai",
357+} as never,
358+["memory", "search", "--json"],
359+{ json: true },
360+);
361+362+await waitForSpawnCount(1);
363+child.stdout.emit(
364+"data",
365+Buffer.from(
366+'[plugins] memory-core loaded plugin package metadata\n{\n "results": [\n {\n "text": "ORBIT-10"\n }\n ]\n}\n[plugins] trailing diagnostic\n',
367+),
368+);
369+child.emit("close", 0);
370+371+await expect(pending).resolves.toEqual({ results: [{ text: "ORBIT-10" }] });
372+});
373+374+it("ignores diagnostic json fragments before the qa cli payload", async () => {
375+const child = createSpawnedProcess();
376+spawnMock.mockReturnValue(child);
377+378+const pending = runQaCli(
379+{
380+repoRoot: "/repo",
381+gateway: {
382+tempRoot: "/tmp/runtime",
383+runtimeEnv: {},
384+},
385+primaryModel: "openai/gpt-5.5",
386+alternateModel: "openai/gpt-5.5-mini",
387+providerMode: "mock-openai",
388+} as never,
389+["memory", "search", "--json"],
390+{ json: true },
391+);
392+393+await waitForSpawnCount(1);
394+child.stdout.emit(
395+"data",
396+Buffer.from(
397+'[plugins] diagnostic context {"ok":true}\n{"results":[{"text":"ORBIT-10"}]}\n[plugins] trailing diagnostic\n',
398+),
399+);
400+child.emit("close", 0);
401+402+await expect(pending).resolves.toEqual({ results: [{ text: "ORBIT-10" }] });
403+});
404+405+it("ignores leading json diagnostic records before the qa cli payload", async () => {
406+const child = createSpawnedProcess();
407+spawnMock.mockReturnValue(child);
408+409+const pending = runQaCli(
410+{
411+repoRoot: "/repo",
412+gateway: {
413+tempRoot: "/tmp/runtime",
414+runtimeEnv: {},
415+},
416+primaryModel: "openai/gpt-5.5",
417+alternateModel: "openai/gpt-5.5-mini",
418+providerMode: "mock-openai",
419+} as never,
420+["memory", "search", "--json"],
421+{ json: true },
422+);
423+424+await waitForSpawnCount(1);
425+child.stdout.emit(
426+"data",
427+Buffer.from(
428+'{"event":"startup-repair"}\n{"results":[{"text":"ORBIT-10"}]}\n[plugins] trailing diagnostic\n',
429+),
430+);
431+child.emit("close", 0);
432+433+await expect(pending).resolves.toEqual({ results: [{ text: "ORBIT-10" }] });
434+});
435+436+it("ignores trailing json diagnostic records after the qa cli payload", async () => {
437+const child = createSpawnedProcess();
438+spawnMock.mockReturnValue(child);
439+440+const pending = runQaCli(
441+{
442+repoRoot: "/repo",
443+gateway: {
444+tempRoot: "/tmp/runtime",
445+runtimeEnv: {},
446+},
447+primaryModel: "openai/gpt-5.5",
448+alternateModel: "openai/gpt-5.5-mini",
449+providerMode: "mock-openai",
450+} as never,
451+["memory", "search", "--json"],
452+{ json: true },
453+);
454+455+await waitForSpawnCount(1);
456+child.stdout.emit(
457+"data",
458+Buffer.from(
459+'[plugins] memory-core loaded plugin package metadata\n{\n "results": [\n {\n "text": "ORBIT-10"\n }\n ]\n}\n{"event":"cleanup"}\n',
460+),
461+);
462+child.emit("close", 0);
463+464+await expect(pending).resolves.toEqual({ results: [{ text: "ORBIT-10" }] });
465+});
466+343467it("rejects oversized qa cli stdout instead of parsing truncated output", async () => {
344468const child = createSpawnedProcess();
345469spawnMock.mockReturnValue(child);
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。