Spaces:
Paused
Paused
| 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; | |
| } | |