import type { IncomingMessage } from "node:http"; import { randomUUID } from "node:crypto"; 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-openclaw-agent-id")?.trim() || getHeader(req, "x-openclaw-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(/^openclaw[:/](?[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-openclaw-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 }); }