Agents/logging: reduce orphaned-user warning noise for background runs

This commit is contained in:
Vignesh Natarajan
2026-04-03 22:23:54 -07:00
parent e4dc03f108
commit 10d5b8813d
4 changed files with 31 additions and 3 deletions

View File

@@ -96,6 +96,12 @@ export function shouldInjectHeartbeatPrompt(params: {
return params.isDefaultAgent && shouldInjectHeartbeatPromptForTrigger(params.trigger);
}
export function shouldWarnOnOrphanedUserRepair(
trigger: EmbeddedRunAttemptParams["trigger"],
): boolean {
return trigger === "user" || trigger === "manual";
}
export function resolveAttemptFsWorkspaceOnly(params: {
config?: OpenClawConfig;
sessionAgentId: string;

View File

@@ -19,6 +19,7 @@ import {
resolveEmbeddedAgentStreamFn,
resolvePromptBuildHookResult,
resolvePromptModeForSession,
shouldWarnOnOrphanedUserRepair,
wrapStreamFnRepairMalformedToolCallArguments,
wrapStreamFnSanitizeMalformedToolCalls,
wrapStreamFnTrimToolCallNames,
@@ -224,6 +225,20 @@ describe("resolvePromptModeForSession", () => {
});
});
describe("shouldWarnOnOrphanedUserRepair", () => {
it("warns for user and manual runs", () => {
expect(shouldWarnOnOrphanedUserRepair("user")).toBe(true);
expect(shouldWarnOnOrphanedUserRepair("manual")).toBe(true);
});
it("does not warn for background triggers", () => {
expect(shouldWarnOnOrphanedUserRepair("heartbeat")).toBe(false);
expect(shouldWarnOnOrphanedUserRepair("cron")).toBe(false);
expect(shouldWarnOnOrphanedUserRepair("memory")).toBe(false);
expect(shouldWarnOnOrphanedUserRepair("overflow")).toBe(false);
});
});
describe("resolveEmbeddedAgentStreamFn", () => {
it("injects authStorage api keys into provider-owned stream functions", async () => {
const providerStreamFn = vi.fn(async (_model, _context, options) => options);

View File

@@ -143,6 +143,7 @@ import {
resolveAttemptFsWorkspaceOnly,
resolvePromptBuildHookResult,
resolvePromptModeForSession,
shouldWarnOnOrphanedUserRepair,
shouldInjectHeartbeatPrompt,
} from "./attempt.prompt-helpers.js";
import {
@@ -192,6 +193,7 @@ export {
resolveAttemptFsWorkspaceOnly,
resolvePromptBuildHookResult,
resolvePromptModeForSession,
shouldWarnOnOrphanedUserRepair,
shouldInjectHeartbeatPrompt,
} from "./attempt.prompt-helpers.js";
export {
@@ -1542,10 +1544,14 @@ export async function runEmbeddedAttempt(
}
const sessionContext = sessionManager.buildSessionContext();
activeSession.agent.replaceMessages(sessionContext.messages);
log.warn(
const orphanRepairMessage =
`Removed orphaned user message to prevent consecutive user turns. ` +
`runId=${params.runId} sessionId=${params.sessionId}`,
);
`runId=${params.runId} sessionId=${params.sessionId} trigger=${params.trigger}`;
if (shouldWarnOnOrphanedUserRepair(params.trigger)) {
log.warn(orphanRepairMessage);
} else {
log.debug(orphanRepairMessage);
}
}
const transcriptLeafId =
(sessionManager.getLeafEntry() as { id?: string } | null | undefined)?.id ?? null;