54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
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;
|
|
}
|