import { buildHttpBaseUrl } from "#/utils/websocket-url"; import { getAgentServerWorkingDir } from "./agent-server-config"; import { getEffectiveLocalBackend } from "./backend-registry/active-store"; import type { Backend } from "./backend-registry/types"; export interface AgentServerClientOverrides { host?: string; apiKey?: string | null; sessionApiKey?: string | null; workingDir?: string; conversationUrl?: string | null; timeout?: number; } export interface AgentServerClientOptions { host: string; apiKey?: string; workingDir: string; timeout?: number; } export class NoBackendAvailableError extends Error { constructor() { super("No backend is configured."); this.name = "NoBackendAvailableError"; } } export const isNoBackendAvailableError = ( error: unknown, ): error is NoBackendAvailableError => error instanceof NoBackendAvailableError || (typeof error === "object" && error !== null && "name" in error && error.name === "NoBackendAvailableError"); function normalizeHost(host: string): string { return host.replace(/\/+$/, ""); } function resolveHost( overrides: AgentServerClientOverrides, backend: Backend | null, ): string { if (overrides.host) return normalizeHost(overrides.host); if (overrides.conversationUrl) return normalizeHost(buildHttpBaseUrl(overrides.conversationUrl)); return normalizeHost(backend?.host ?? ""); } export function getAgentServerClientOptions( overrides: AgentServerClientOverrides = {}, ): AgentServerClientOptions { const backend = getEffectiveLocalBackend(); if (!backend && !overrides.host && !overrides.conversationUrl) { throw new NoBackendAvailableError(); } const apiKey = overrides.sessionApiKey ?? overrides.apiKey ?? backend?.apiKey ?? undefined; return { host: resolveHost(overrides, backend), ...(apiKey ? { apiKey } : {}), workingDir: overrides.workingDir ?? getAgentServerWorkingDir(), ...(overrides.timeout !== undefined ? { timeout: overrides.timeout } : {}), }; } export function getAgentServerHttpClientOptions( overrides?: AgentServerClientOverrides, ) { const { host, apiKey, timeout } = getAgentServerClientOptions(overrides); return { baseUrl: host, ...(apiKey ? { apiKey } : {}), timeout: timeout ?? 60000, }; }