Files
openclaw/src/agents/subagent-registry-read.ts
2026-05-09 11:26:43 +01:00

123 lines
3.6 KiB
TypeScript

import { getAgentRunContext } from "../infra/agent-events.js";
import { subagentRuns } from "./subagent-registry-memory.js";
import {
buildSubagentRunReadIndexFromRuns,
countActiveDescendantRunsFromRuns,
getSubagentRunByChildSessionKeyFromRuns,
listDescendantRunsForRequesterFromRuns,
listRunsForControllerFromRuns,
type SubagentRunReadIndex,
} from "./subagent-registry-queries.js";
import { getSubagentRunsSnapshotForRead } from "./subagent-registry-state.js";
import type { SubagentRunRecord } from "./subagent-registry.types.js";
export {
getSubagentSessionRuntimeMs,
getSubagentSessionStartedAt,
resolveSubagentSessionStatus,
} from "./subagent-session-metrics.js";
export function buildSubagentRunReadIndex(now = Date.now()): SubagentRunReadIndex {
return buildSubagentRunReadIndexFromRuns({
runs: getSubagentRunsSnapshotForRead(subagentRuns),
inMemoryRuns: subagentRuns.values(),
now,
});
}
export function listSubagentRunsForController(controllerSessionKey: string): SubagentRunRecord[] {
return listRunsForControllerFromRuns(
getSubagentRunsSnapshotForRead(subagentRuns),
controllerSessionKey,
);
}
export function countActiveDescendantRuns(rootSessionKey: string): number {
return countActiveDescendantRunsFromRuns(
getSubagentRunsSnapshotForRead(subagentRuns),
rootSessionKey,
);
}
export function listDescendantRunsForRequester(rootSessionKey: string): SubagentRunRecord[] {
return listDescendantRunsForRequesterFromRuns(
getSubagentRunsSnapshotForRead(subagentRuns),
rootSessionKey,
);
}
export function getSubagentRunByChildSessionKey(childSessionKey: string): SubagentRunRecord | null {
return getSubagentRunByChildSessionKeyFromRuns(
getSubagentRunsSnapshotForRead(subagentRuns),
childSessionKey,
);
}
export function isSubagentRunLive(
entry: Pick<SubagentRunRecord, "runId" | "endedAt"> | null | undefined,
): boolean {
if (!entry || typeof entry.endedAt === "number") {
return false;
}
return Boolean(getAgentRunContext(entry.runId));
}
export function getSessionDisplaySubagentRunByChildSessionKey(
childSessionKey: string,
): SubagentRunRecord | null {
const key = childSessionKey.trim();
if (!key) {
return null;
}
let latestInMemoryActive: SubagentRunRecord | null = null;
let latestInMemoryEnded: SubagentRunRecord | null = null;
for (const entry of subagentRuns.values()) {
if (entry.childSessionKey !== key) {
continue;
}
if (typeof entry.endedAt === "number") {
if (!latestInMemoryEnded || entry.createdAt > latestInMemoryEnded.createdAt) {
latestInMemoryEnded = entry;
}
continue;
}
if (!latestInMemoryActive || entry.createdAt > latestInMemoryActive.createdAt) {
latestInMemoryActive = entry;
}
}
if (latestInMemoryEnded || latestInMemoryActive) {
if (
latestInMemoryEnded &&
(!latestInMemoryActive || latestInMemoryEnded.createdAt > latestInMemoryActive.createdAt)
) {
return latestInMemoryEnded;
}
return latestInMemoryActive ?? latestInMemoryEnded;
}
return getSubagentRunByChildSessionKey(key);
}
export function getLatestSubagentRunByChildSessionKey(
childSessionKey: string,
): SubagentRunRecord | null {
const key = childSessionKey.trim();
if (!key) {
return null;
}
let latest: SubagentRunRecord | null = null;
for (const entry of getSubagentRunsSnapshotForRead(subagentRuns).values()) {
if (entry.childSessionKey !== key) {
continue;
}
if (!latest || entry.createdAt > latest.createdAt) {
latest = entry;
}
}
return latest;
}