

















@@ -1,3 +1,4 @@
1+import crypto from "node:crypto";
12import { shouldLogVerbose } from "../../globals.js";
23import { emitAgentEvent } from "../../infra/agent-events.js";
34import { isTruthyEnvValue } from "../../infra/env.js";
@@ -164,6 +165,44 @@ function buildCliEnvMcpLog(childEnv: Record<string, string>): string {
164165].join(" ");
165166}
166167168+function fingerprintCliSessionId(sessionId?: string): string {
169+const trimmed = sessionId?.trim();
170+if (!trimmed) {
171+return "none";
172+}
173+return crypto.createHash("sha256").update(trimmed).digest("hex").slice(0, 12);
174+}
175+176+export function buildCliExecLogLine(params: {
177+provider: string;
178+model: string;
179+promptChars: number;
180+trigger?: string;
181+useResume: boolean;
182+cliSessionId?: string;
183+resolvedSessionId?: string;
184+reusableSessionId?: string;
185+invalidatedReason?: string;
186+hasHistoryPrompt: boolean;
187+}): string {
188+const reuseState = params.reusableSessionId
189+ ? "reusable"
190+ : params.invalidatedReason
191+ ? `invalidated:${params.invalidatedReason}`
192+ : "none";
193+return [
194+`cli exec: provider=${params.provider}`,
195+`model=${params.model}`,
196+`promptChars=${params.promptChars}`,
197+`trigger=${params.trigger ?? "unknown"}`,
198+`useResume=${params.useResume ? "true" : "false"}`,
199+`session=${params.cliSessionId ? "present" : "none"}`,
200+`resumeSession=${params.useResume ? fingerprintCliSessionId(params.resolvedSessionId) : "none"}`,
201+`reuse=${reuseState}`,
202+`historyPrompt=${params.hasHistoryPrompt ? "present" : "none"}`,
203+].join(" ");
204+}
205+167206export function buildCliEnvAuthLog(childEnv: Record<string, string>): string {
168207const hostKeys = listPresentCliAuthEnvKeys(process.env);
169208const childKeys = listPresentCliAuthEnvKeys(childEnv);
@@ -273,7 +312,18 @@ export async function executePreparedCliRun(
273312 : undefined;
274313try {
275314cliBackendLog.info(
276-`cli exec: provider=${params.provider} model=${context.normalizedModel} promptChars=${basePrompt.length}`,
315+buildCliExecLogLine({
316+provider: params.provider,
317+model: context.normalizedModel,
318+promptChars: basePrompt.length,
319+trigger: params.trigger,
320+ useResume,
321+cliSessionId: cliSessionIdToUse,
322+ resolvedSessionId,
323+reusableSessionId: context.reusableCliSession.sessionId,
324+invalidatedReason: context.reusableCliSession.invalidatedReason,
325+hasHistoryPrompt: Boolean(context.openClawHistoryPrompt),
326+}),
277327);
278328const logOutputText =
279329isTruthyEnvValue(process.env[CLI_BACKEND_LOG_OUTPUT_ENV]) ||
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。