export type ParsedAgentSessionKey = { agentId: string; rest: string; }; export function parseAgentSessionKey( sessionKey: string | undefined | null, ): ParsedAgentSessionKey | null { const raw = (sessionKey ?? "").trim(); if (!raw) { return null; } const parts = raw.split(":").filter(Boolean); if (parts.length < 3) { return null; } if (parts[0] !== "agent") { return null; } const agentId = parts[1]?.trim(); const rest = parts.slice(2).join(":"); if (!agentId || !rest) { return null; } return { agentId, rest }; } export function isSubagentSessionKey(sessionKey: string | undefined | null): boolean { const raw = (sessionKey ?? "").trim(); if (!raw) { return false; } if (raw.toLowerCase().startsWith("subagent:")) { return true; } const parsed = parseAgentSessionKey(raw); return Boolean((parsed?.rest ?? "").toLowerCase().startsWith("subagent:")); } export function isAcpSessionKey(sessionKey: string | undefined | null): boolean { const raw = (sessionKey ?? "").trim(); if (!raw) { return false; } const normalized = raw.toLowerCase(); if (normalized.startsWith("acp:")) { return true; } const parsed = parseAgentSessionKey(raw); return Boolean((parsed?.rest ?? "").toLowerCase().startsWith("acp:")); } const THREAD_SESSION_MARKERS = [":thread:", ":topic:"]; export function resolveThreadParentSessionKey( sessionKey: string | undefined | null, ): string | null { const raw = (sessionKey ?? "").trim(); if (!raw) { return null; } const normalized = raw.toLowerCase(); let idx = -1; for (const marker of THREAD_SESSION_MARKERS) { const candidate = normalized.lastIndexOf(marker); if (candidate > idx) { idx = candidate; } } if (idx <= 0) { return null; } const parent = raw.slice(0, idx).trim(); return parent ? parent : null; }