






















@@ -1,12 +1,17 @@
11import { resolveAgentRuntimeMetadata } from "../agents/agent-runtime-metadata.js";
22import { DEFAULT_CONTEXT_TOKENS } from "../agents/defaults.js";
3+import { selectAgentHarness } from "../agents/harness/selection.js";
34import { getRuntimeConfig } from "../config/config.js";
45import { loadSessionStore, resolveSessionTotalTokens } from "../config/sessions.js";
6+import type { SessionEntry } from "../config/sessions/types.js";
7+import type { OpenClawConfig } from "../config/types.openclaw.js";
58import { info } from "../globals.js";
69import { parseAgentSessionKey } from "../routing/session-key.js";
710import { type RuntimeEnv, writeRuntimeJson } from "../runtime.js";
811import { isCronSessionKey } from "../sessions/session-key-utils.js";
912import { createLazyImportLoader } from "../shared/lazy-promise.js";
13+import { normalizeOptionalLowercaseString } from "../shared/string-coerce.js";
14+import { resolveAgentRuntimeLabel } from "../status/agent-runtime-label.js";
1015import { isRich, theme } from "../terminal/theme.js";
1116import { resolveSessionStoreTargetsOrExit } from "./session-store-targets.js";
1217import {
@@ -30,10 +35,12 @@ type SessionRow = SessionDisplayRow & {
3035agentId: string;
3136kind: "cron" | "direct" | "group" | "global" | "unknown";
3237agentRuntime: ReturnType<typeof resolveAgentRuntimeMetadata>;
38+runtimeLabel: string;
3339};
34403541const AGENT_PAD = 10;
3642const KIND_PAD = 6;
43+const RUNTIME_PAD = 18;
3744const TOKENS_PAD = 20;
3845const DEFAULT_SESSIONS_LIMIT = 100;
3946const TOP_N_SELECTION_LIMIT = 200;
@@ -162,6 +169,64 @@ const formatKindCell = (kind: SessionRow["kind"], rich: boolean) => {
162169return theme.muted(label);
163170};
164171172+function resolveSessionRuntimeLabel(params: {
173+cfg: OpenClawConfig;
174+entry: SessionEntry;
175+agentRuntime: ReturnType<typeof resolveAgentRuntimeMetadata>;
176+modelProvider: string;
177+model: string;
178+agentId: string;
179+sessionKey: string;
180+}): string {
181+const explicitRuntime =
182+normalizeOptionalLowercaseString(params.entry.agentRuntimeOverride) ??
183+normalizeOptionalLowercaseString(params.entry.agentHarnessId) ??
184+(params.agentRuntime.source === "implicit"
185+ ? undefined
186+ : normalizeOptionalLowercaseString(params.agentRuntime.id));
187+if (explicitRuntime && explicitRuntime !== "auto" && explicitRuntime !== "default") {
188+return resolveAgentRuntimeLabel({
189+config: params.cfg,
190+sessionEntry: params.entry,
191+resolvedHarness: explicitRuntime,
192+fallbackProvider: params.modelProvider,
193+});
194+}
195+196+let resolvedHarness: string | undefined;
197+try {
198+const selected = selectAgentHarness({
199+provider: params.modelProvider,
200+modelId: params.model,
201+config: params.cfg,
202+agentId: params.agentId,
203+sessionKey: params.sessionKey,
204+agentHarnessId: params.entry.agentHarnessId,
205+});
206+const id = normalizeOptionalLowercaseString(selected.id);
207+resolvedHarness = id && id !== "pi" ? id : undefined;
208+} catch {
209+resolvedHarness = undefined;
210+}
211+return resolveAgentRuntimeLabel({
212+config: params.cfg,
213+sessionEntry: params.entry,
214+ resolvedHarness,
215+fallbackProvider: params.modelProvider,
216+});
217+}
218+219+function formatRuntimeCell(runtimeLabel: string, rich: boolean): string {
220+const label = runtimeLabel.padEnd(RUNTIME_PAD);
221+return rich ? theme.info(label) : label;
222+}
223+224+function toJsonSessionRow(row: SessionRow): Omit<SessionRow, "runtimeLabel"> {
225+const { runtimeLabel, ...jsonRow } = row;
226+void runtimeLabel;
227+return jsonRow;
228+}
229+165230export async function sessionsCommand(
166231opts: {
167232json?: boolean;
@@ -225,10 +290,21 @@ export async function sessionsCommand(
225290.map(([key, entry]) => {
226291const row = toSessionDisplayRow(key, entry);
227292const agentId = parseAgentSessionKey(row.key)?.agentId ?? target.agentId;
293+const modelRef = resolveSessionDisplayModelRef(cfg, row);
294+const agentRuntime = resolveAgentRuntimeMetadata(cfg, agentId);
228295return Object.assign({}, row, {
229296 agentId,
230-agentRuntime: resolveAgentRuntimeMetadata(cfg, agentId),
297+ agentRuntime,
231298kind: classifySessionKey(row.key, store[row.key]),
299+runtimeLabel: resolveSessionRuntimeLabel({
300+ cfg,
301+ entry,
302+ agentRuntime,
303+modelProvider: modelRef.provider,
304+model: modelRef.model,
305+ agentId,
306+sessionKey: row.key,
307+}),
232308});
233309});
234310});
@@ -254,7 +330,8 @@ export async function sessionsCommand(
254330 hasMore,
255331activeMinutes: activeMinutes ?? null,
256332sessions: await Promise.all(
257-rows.map(async (r) => {
333+rows.map(async (row) => {
334+const r = toJsonSessionRow(row);
258335const modelRef = resolveSessionDisplayModelRef(cfg, r);
259336return {
260337 ...r,
@@ -306,6 +383,7 @@ export async function sessionsCommand(
306383"Key".padEnd(SESSION_KEY_PAD),
307384"Age".padEnd(SESSION_AGE_PAD),
308385"Model".padEnd(SESSION_MODEL_PAD),
386+"Runtime".padEnd(RUNTIME_PAD),
309387"Tokens (ctx %)".padEnd(TOKENS_PAD),
310388"Flags",
311389].join(" ");
@@ -329,6 +407,7 @@ export async function sessionsCommand(
329407formatSessionKeyCell(row.key, rich),
330408formatSessionAgeCell(row.updatedAt, rich),
331409formatSessionModelCell(model, rich),
410+formatRuntimeCell(row.runtimeLabel, rich),
332411formatTokensCell(total, contextTokens ?? null, rich),
333412formatSessionFlagsCell(row, rich),
334413].join(" ");
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。