import {
normalizeLowercaseStringOrEmpty,
normalizeOptionalLowercaseString,
normalizeOptionalString,
} from "./string-coerce.ts" ;
export type ParsedAgentSessionKey = {
agentId: string;
rest: string;
};
export const DEFAULT_AGENT_ID = "main" ;
export const DEFAULT_MAIN_KEY = "main" ;
const VALID_ID_RE = /^[a-z0-9 ][a-z0-9 _-]{0 ,63 }$/i;
const INVALID_CHARS_RE = /[^a-z0-9 _-]+/g;
const LEADING_DASH_RE = /^-+/;
const TRAILING_DASH_RE = /-+$/;
export function parseAgentSessionKey(
sessionKey: string | undefined | null ,
): ParsedAgentSessionKey | null {
const raw = normalizeLowercaseStringOrEmpty(sessionKey);
if (!raw) {
return null ;
}
const parts = raw.split(":" ).filter(Boolean );
if (parts.length < 3 || parts[0 ] !== "agent" ) {
return null ;
}
const agentId = normalizeOptionalString(parts[1 ]);
const rest = parts.slice(2 ).join(":" );
if (!agentId || !rest) {
return null ;
}
return { agentId, rest };
}
export function normalizeMainKey(value: string | undefined | null ): string {
return normalizeOptionalLowercaseString(value) ?? DEFAULT_MAIN_KEY;
}
export function normalizeAgentId(value: string | undefined | null ): string {
const trimmed = normalizeOptionalString(value) ?? "" ;
if (!trimmed) {
return DEFAULT_AGENT_ID;
}
if (VALID_ID_RE.test(trimmed)) {
return normalizeLowercaseStringOrEmpty(trimmed);
}
return (
normalizeLowercaseStringOrEmpty(trimmed)
.replace(INVALID_CHARS_RE, "-" )
.replace(LEADING_DASH_RE, "" )
.replace(TRAILING_DASH_RE, "" )
.slice(0 , 64 ) || DEFAULT_AGENT_ID
);
}
export function buildAgentMainSessionKey(params: {
agentId: string;
mainKey?: string | undefined;
}): string {
const agentId = normalizeAgentId(params.agentId);
const mainKey = normalizeMainKey(params.mainKey);
return `agent:${agentId}:${mainKey}`;
}
export function resolveAgentIdFromSessionKey(sessionKey: string | undefined | null ): string {
const parsed = parseAgentSessionKey(sessionKey);
return normalizeAgentId(parsed?.agentId ?? DEFAULT_AGENT_ID);
}
export function isSubagentSessionKey(sessionKey: string | undefined | null ): boolean {
const raw = normalizeOptionalString(sessionKey) ?? "" ;
if (!raw) {
return false ;
}
if (normalizeLowercaseStringOrEmpty(raw).startsWith("subagent:" )) {
return true ;
}
const parsed = parseAgentSessionKey(raw);
return normalizeLowercaseStringOrEmpty(parsed?.rest).startsWith("subagent:" );
}
Messung V0.5 in Prozent C=99 H=98 G=98
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-07)
¤
*© Formatika GbR, Deutschland