






















@@ -519,6 +519,72 @@ describe("CLI attempt execution", () => {
519519expect(messages).toHaveLength(1);
520520});
521521522+it("embedded assistant gap-fill skips malformed transcript tail rows before deduping", async () => {
523+const sessionKey = "agent:main:subagent:embedded-gap-fill-malformed-tail";
524+const sessionEntry: SessionEntry = {
525+sessionId: "session-embedded-gap-fill-malformed-tail",
526+updatedAt: Date.now(),
527+};
528+const sessionStore: Record<string, SessionEntry> = { [sessionKey]: sessionEntry };
529+await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
530+531+const result = makeCliResult("already mirrored");
532+result.meta.executionTrace = {
533+winnerProvider: "anthropic",
534+winnerModel: "claude-opus-4-6",
535+fallbackUsed: false,
536+runner: "embedded",
537+};
538+539+const updatedFirst = await persistCliTurnTranscript({
540+body: "ignored for gap fill",
541+ result,
542+sessionId: sessionEntry.sessionId,
543+ sessionKey,
544+ sessionEntry,
545+ sessionStore,
546+ storePath,
547+sessionAgentId: "main",
548+sessionCwd: tmpDir,
549+config: {},
550+embeddedAssistantGapFill: true,
551+});
552+const sessionFile = updatedFirst?.sessionFile;
553+if (typeof sessionFile !== "string") {
554+throw new Error("Expected CLI transcript session file.");
555+}
556+557+await fs.appendFile(sessionFile, "{truncated-json\n", "utf-8");
558+559+await persistCliTurnTranscript({
560+body: "still ignored",
561+ result,
562+sessionId: sessionEntry.sessionId,
563+ sessionKey,
564+sessionEntry: updatedFirst,
565+ sessionStore,
566+ storePath,
567+sessionAgentId: "main",
568+sessionCwd: tmpDir,
569+config: {},
570+embeddedAssistantGapFill: true,
571+});
572+573+const validEntries = (await fs.readFile(sessionFile, "utf-8"))
574+.split(/\r?\n/)
575+.flatMap((line) => {
576+if (!line) {
577+return [];
578+}
579+try {
580+return [JSON.parse(line) as { type?: string; message?: { role?: string } }];
581+} catch {
582+return [];
583+}
584+});
585+expect(validEntries.filter((entry) => entry.type === "message")).toHaveLength(1);
586+});
587+522588it("embedded assistant gap-fill appends repeated replies after a user tail", async () => {
523589const sessionKey = "agent:main:subagent:embedded-repeated-reply";
524590const sessionEntry: SessionEntry = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。