
























@@ -685,6 +685,77 @@ describe("CLI attempt execution", () => {
685685expect(validEntries.filter((entry) => entry.type === "message")).toHaveLength(1);
686686});
687687688+it("embedded assistant gap-fill skips trailing openclaw.cache-ttl custom entries (regression for #83427)", async () => {
689+const sessionKey = "agent:main:subagent:embedded-gap-fill-cache-ttl";
690+const sessionEntry: SessionEntry = {
691+sessionId: "session-embedded-gap-fill-cache-ttl",
692+updatedAt: Date.now(),
693+};
694+const sessionStore: Record<string, SessionEntry> = { [sessionKey]: sessionEntry };
695+await fs.writeFile(storePath, JSON.stringify(sessionStore, null, 2), "utf-8");
696+697+const result = makeCliResult("canonical answer");
698+result.meta.executionTrace = {
699+winnerProvider: "anthropic",
700+winnerModel: "claude-haiku-4-5-20251001",
701+fallbackUsed: false,
702+runner: "embedded",
703+};
704+705+const updatedFirst = await persistCliTurnTranscript({
706+body: "ignored for gap fill",
707+ result,
708+sessionId: sessionEntry.sessionId,
709+ sessionKey,
710+ sessionEntry,
711+ sessionStore,
712+ storePath,
713+sessionAgentId: "main",
714+sessionCwd: tmpDir,
715+config: {},
716+embeddedAssistantGapFill: true,
717+});
718+const sessionFile = updatedFirst?.sessionFile;
719+if (typeof sessionFile !== "string") {
720+throw new Error("Expected CLI transcript session file.");
721+}
722+723+await fs.appendFile(
724+sessionFile,
725+`${JSON.stringify({
726+ type: "custom",
727+ customType: "openclaw.cache-ttl",
728+ timestamp: new Date().toISOString(),
729+ data: {
730+ provider: "anthropic",
731+ modelId: "claude-haiku-4-5-20251001",
732+ },
733+ })}\n`,
734+"utf-8",
735+);
736+737+await persistCliTurnTranscript({
738+body: "still ignored",
739+ result,
740+sessionId: sessionEntry.sessionId,
741+ sessionKey,
742+sessionEntry: updatedFirst,
743+ sessionStore,
744+ storePath,
745+sessionAgentId: "main",
746+sessionCwd: tmpDir,
747+config: {},
748+embeddedAssistantGapFill: true,
749+});
750+751+const messages = await readSessionMessages(sessionFile);
752+expect(messages).toHaveLength(1);
753+expectRecordFields(requireRecord(messages[0], "assistant message"), {
754+role: "assistant",
755+content: [{ type: "text", text: "canonical answer" }],
756+});
757+});
758+688759it("embedded assistant gap-fill appends repeated replies after a user tail", async () => {
689760const sessionKey = "agent:main:subagent:embedded-repeated-reply";
690761const sessionEntry: SessionEntry = {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。