import { randomUUID } from "node:crypto"; import type { IncomingMessage } from "node:http"; import { buildAgentMainSessionKey, normalizeAgentId } from "../routing/session-key.js"; export function getHeader(req: IncomingMessage, name: string): string | undefined { const raw = req.headers[name.toLowerCase()]; if (typeof raw === "string") return raw; if (Array.isArray(raw)) return raw[0]; return undefined; } export function getBearerToken(req: IncomingMessage): string | undefined { const raw = getHeader(req, "authorization")?.trim() ?? ""; if (!raw.toLowerCase().startsWith("bearer ")) return undefined; const token = raw.slice(7).trim(); return token || undefined; } export function resolveAgentIdFromHeader(req: IncomingMessage): string | undefined { const raw = getHeader(req, "x-clawdbot-agent-id")?.trim() || getHeader(req, "x-clawdbot-agent")?.trim() || ""; if (!raw) return undefined; return normalizeAgentId(raw); } export function resolveAgentIdFromModel(model: string | undefined): string | undefined { const raw = model?.trim(); if (!raw) return undefined; const m = raw.match(/^clawdbot[:/](?[a-z0-9][a-z0-9_-]{0,63})$/i) ?? raw.match(/^agent:(?[a-z0-9][a-z0-9_-]{0,63})$/i); const agentId = m?.groups?.agentId; if (!agentId) return undefined; return normalizeAgentId(agentId); } export function resolveAgentIdForRequest(params: { req: IncomingMessage; model: string | undefined; }): string { const fromHeader = resolveAgentIdFromHeader(params.req); if (fromHeader) return fromHeader; const fromModel = resolveAgentIdFromModel(params.model); return fromModel ?? "main"; } export function resolveSessionKey(params: { req: IncomingMessage; agentId: string; user?: string | undefined; prefix: string; }): string { const explicit = getHeader(params.req, "x-clawdbot-session-key")?.trim(); if (explicit) return explicit; const user = params.user?.trim(); const mainKey = user ? `${params.prefix}-user:${user}` : `${params.prefix}:${randomUUID()}`; return buildAgentMainSessionKey({ agentId: params.agentId, mainKey }); }