import type { OpenClawConfig } from "../config/types.openclaw.js" ;
import { normalizeAgentId, parseAgentSessionKey } from "../routing/session-key.js" ;
import { normalizeOptionalString } from "../shared/string-coerce.js" ;
import { resolveAgentWorkspaceDir } from "./agent-scope.js" ;
export type SpawnedRunMetadata = {
spawnedBy?: string | null ;
groupId?: string | null ;
groupChannel?: string | null ;
groupSpace?: string | null ;
workspaceDir?: string | null ;
};
export type SpawnedToolContext = {
agentGroupId?: string | null ;
agentGroupChannel?: string | null ;
agentGroupSpace?: string | null ;
agentMemberRoleIds?: string[];
workspaceDir?: string;
};
export type NormalizedSpawnedRunMetadata = {
spawnedBy?: string;
groupId?: string;
groupChannel?: string;
groupSpace?: string;
workspaceDir?: string;
};
export function normalizeSpawnedRunMetadata(
value?: SpawnedRunMetadata | null ,
): NormalizedSpawnedRunMetadata {
return {
spawnedBy: normalizeOptionalString(value?.spawnedBy),
groupId: normalizeOptionalString(value?.groupId),
groupChannel: normalizeOptionalString(value?.groupChannel),
groupSpace: normalizeOptionalString(value?.groupSpace),
workspaceDir: normalizeOptionalString(value?.workspaceDir),
};
}
export function mapToolContextToSpawnedRunMetadata(
value?: SpawnedToolContext | null ,
): Pick<NormalizedSpawnedRunMetadata, "groupId" | "groupChannel" | "groupSpace" | "workspaceDir" > {
return {
groupId: normalizeOptionalString(value?.agentGroupId),
groupChannel: normalizeOptionalString(value?.agentGroupChannel),
groupSpace: normalizeOptionalString(value?.agentGroupSpace),
workspaceDir: normalizeOptionalString(value?.workspaceDir),
};
}
export function resolveSpawnedWorkspaceInheritance(params: {
config: OpenClawConfig;
targetAgentId?: string;
requesterSessionKey?: string;
explicitWorkspaceDir?: string | null ;
}): string | undefined {
const explicit = normalizeOptionalString(params.explicitWorkspaceDir);
if (explicit) {
return explicit;
}
// For cross-agent spawns, use the target agent's workspace instead of the requester's.
const agentId =
params.targetAgentId ??
(params.requesterSessionKey
? parseAgentSessionKey(params.requesterSessionKey)?.agentId
: undefined);
return agentId ? resolveAgentWorkspaceDir(params.config, normalizeAgentId(agentId)) : undefined;
}
export function resolveIngressWorkspaceOverrideForSpawnedRun(
metadata?: Pick<SpawnedRunMetadata, "spawnedBy" | "workspaceDir" > | null ,
): string | undefined {
const normalized = normalizeSpawnedRunMetadata(metadata);
return normalized.spawnedBy ? normalized.workspaceDir : undefined;
}
Messung V0.5 in Prozent C=99 H=100 G=99
¤ Dauer der Verarbeitung: 0.12 Sekunden
(vorverarbeitet am 2026-06-09)
¤
*© Formatika GbR, Deutschland