fix: pin embedded harness selection per session

This commit is contained in:
Peter Steinberger
2026-04-23 16:51:42 +01:00
parent 7248a7749f
commit 1713839288
23 changed files with 518 additions and 11 deletions

View File

@@ -87,6 +87,7 @@ export type StatusArgs = {
groupActivation?: "mention" | "always";
resolvedThink?: ThinkLevel;
resolvedFast?: boolean;
resolvedHarness?: string;
resolvedVerbose?: VerboseLevel;
resolvedReasoning?: ReasoningLevel;
resolvedElevated?: ElevatedLevel;
@@ -269,6 +270,14 @@ const formatFastModeLabel = (enabled: boolean) => {
return "Fast";
};
const formatHarnessLabel = (harnessId: string | undefined) => {
const normalized = normalizeOptionalLowercaseString(harnessId);
if (!normalized || normalized === "pi" || normalized === "auto") {
return null;
}
return normalized;
};
const readUsageFromSessionLog = (
sessionId?: string,
sessionEntry?: SessionEntry,
@@ -744,6 +753,7 @@ export function buildStatusMessage(args: StatusArgs): string {
`Runner: ${runnerLabel}`,
`Think: ${thinkLevel}`,
formatFastModeLabel(fastMode),
formatHarnessLabel(args.resolvedHarness),
textVerbosity ? `Text: ${textVerbosity}` : null,
verboseLabel,
traceLabel,

View File

@@ -6,6 +6,7 @@ import {
resolveAgentModelFallbacksOverride,
} from "../agents/agent-scope.js";
import { resolveFastModeState } from "../agents/fast-mode.js";
import { selectAgentHarness } from "../agents/harness/selection.js";
import { resolveModelAuthLabel } from "../agents/model-auth-label.js";
import {
resolveInternalSessionKey,
@@ -52,6 +53,7 @@ export type BuildStatusTextParams = {
contextTokens?: number;
resolvedThinkLevel?: ThinkLevel;
resolvedFastMode?: boolean;
resolvedHarness?: string;
resolvedVerboseLevel: VerboseLevel;
resolvedReasoningLevel: ReasoningLevel;
resolvedElevatedLevel?: ElevatedLevel;
@@ -131,6 +133,30 @@ function formatSessionTaskLine(sessionKey: string): string | undefined {
return parts.length ? `📌 Tasks: ${parts.join(" · ")}` : undefined;
}
function resolveStatusHarnessId(params: {
cfg: OpenClawConfig;
provider: string;
model: string;
agentId: string;
sessionKey: string;
sessionEntry?: SessionEntry;
}): string | undefined {
try {
const selected = selectAgentHarness({
provider: params.provider,
modelId: params.model,
config: params.cfg,
agentId: params.agentId,
sessionKey: params.sessionKey,
agentHarnessId: params.sessionEntry?.agentHarnessId,
});
const id = normalizeOptionalLowercaseString(selected.id);
return id && id !== "pi" ? id : undefined;
} catch {
return undefined;
}
}
function formatAgentTaskCountsLine(agentId: string): string | undefined {
const snapshot = buildTaskStatusSnapshot(listTasksForAgentIdForStatus(agentId));
if (snapshot.totalCount === 0) {
@@ -286,6 +312,16 @@ export async function buildStatusText(params: BuildStatusTextParams): Promise<st
agentId: statusAgentId,
sessionEntry,
}).enabled;
const effectiveHarness =
params.resolvedHarness ??
resolveStatusHarnessId({
cfg,
provider,
model,
agentId: statusAgentId,
sessionKey,
sessionEntry,
});
const agentFallbacksOverride = resolveAgentModelFallbacksOverride(cfg, statusAgentId);
const { buildStatusMessage } = await loadStatusMessageRuntime();
const explicitThinkingDefault =
@@ -319,6 +355,7 @@ export async function buildStatusText(params: BuildStatusTextParams): Promise<st
resolvedThink:
resolvedThinkLevel ?? explicitThinkingDefault ?? (await resolveDefaultThinkingLevel()),
resolvedFast: effectiveFastMode,
resolvedHarness: effectiveHarness,
resolvedVerbose: resolvedVerboseLevel,
resolvedReasoning: resolvedReasoningLevel,
resolvedElevated: resolvedElevatedLevel,