import { SUBAGENT_ENDED_REASON_KILLED } from "./subagent-lifecycle-events.js" ;
import type { SubagentRunRecord } from "./subagent-registry.types.js" ;
function resolveSubagentSessionStartedAtInternal(
entry: Pick<SubagentRunRecord, "sessionStartedAt" | "startedAt" | "createdAt" >,
): number | undefined {
if (typeof entry.sessionStartedAt === "number" && Number.isFinite(entry.sessionStartedAt)) {
return entry.sessionStartedAt;
}
if (typeof entry.startedAt === "number" && Number.isFinite(entry.startedAt)) {
return entry.startedAt;
}
return typeof entry.createdAt === "number" && Number.isFinite(entry.createdAt)
? entry.createdAt
: undefined;
}
export function getSubagentSessionStartedAt(
entry: Pick<SubagentRunRecord, "sessionStartedAt" | "startedAt" | "createdAt" > | null | undefined,
): number | undefined {
return entry ? resolveSubagentSessionStartedAtInternal(entry) : undefined;
}
export function getSubagentSessionRuntimeMs(
entry:
| Pick<SubagentRunRecord, "startedAt" | "endedAt" | "accumulatedRuntimeMs" >
| null
| undefined,
now = Date.now(),
): number | undefined {
if (!entry) {
return undefined;
}
const accumulatedRuntimeMs =
typeof entry.accumulatedRuntimeMs === "number" && Number.isFinite(entry.accumulatedRuntimeMs)
? Math.max(0 , entry.accumulatedRuntimeMs)
: 0 ;
if (typeof entry.startedAt !== "number" || !Number.isFinite(entry.startedAt)) {
return entry.accumulatedRuntimeMs != null ? accumulatedRuntimeMs : undefined;
}
const currentRunEndedAt =
typeof entry.endedAt === "number" && Number.isFinite(entry.endedAt) ? entry.endedAt : now;
return Math.max(0 , accumulatedRuntimeMs + Math.max(0 , currentRunEndedAt - entry.startedAt));
}
export function resolveSubagentSessionStatus(
entry: Pick<SubagentRunRecord, "endedAt" | "endedReason" | "outcome" > | null | undefined,
): "running" | "killed" | "failed" | "timeout" | "done" | undefined {
if (!entry) {
return undefined;
}
if (!entry.endedAt) {
return "running" ;
}
if (entry.endedReason === SUBAGENT_ENDED_REASON_KILLED) {
return "killed" ;
}
const status = entry.outcome?.status;
if (status === "error" ) {
return "failed" ;
}
if (status === "timeout" ) {
return "timeout" ;
}
return "done" ;
}
Messung V0.5 in Prozent C=99 H=97 G=97
¤ Dauer der Verarbeitung: 0.1 Sekunden
(vorverarbeitet am 2026-05-26)
¤
*© Formatika GbR, Deutschland