File size: 1,692 Bytes
35f99ee | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | /** Normalizes accepted child-session spawn results from loose tool payloads. */
import { asOptionalRecord } from "@openclaw/normalization-core/record-coerce";
import { normalizeOptionalString } from "@openclaw/normalization-core/string-coerce";
// Helpers for recognizing accepted session-spawn tool results.
export type AcceptedSessionSpawn = {
runId: string;
childSessionKey: string;
/** True only when this child owns a terminal completion for its requester. */
expectsCompletionMessage?: boolean;
};
/** Normalize a tool result that accepted a child session spawn. */
export function normalizeAcceptedSessionSpawnResult(result: unknown): AcceptedSessionSpawn | null {
const details = asOptionalRecord(asOptionalRecord(result)?.details);
if (!details || details.status !== "accepted") {
return null;
}
const runId = normalizeOptionalString(details.runId);
const childSessionKey = normalizeOptionalString(details.childSessionKey);
if (!runId || !childSessionKey) {
return null;
}
return {
runId,
childSessionKey,
expectsCompletionMessage: details.expectsCompletionMessage === true,
};
}
/** Return true when a collection contains at least one accepted child spawn. */
export function hasAcceptedSessionSpawn(
acceptedSessionSpawns?: readonly AcceptedSessionSpawn[],
): boolean {
return Boolean(acceptedSessionSpawns?.length);
}
/** Return true when an accepted child owns the requester's terminal completion. */
export function hasCompletionMessageSessionSpawn(
acceptedSessionSpawns?: readonly AcceptedSessionSpawn[],
): boolean {
return acceptedSessionSpawns?.some((spawn) => spawn.expectsCompletionMessage === true) === true;
}
|