import { REXPRO_API_BASE_URL, REXPRO_BASE_URL } from '$lib/constants'; import type { Banner } from '$lib/types'; export const importConfig = async (token: string, config) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/import`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ config: config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const exportConfig = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/export`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getConnectionsConfig = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/connections`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setConnectionsConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/connections`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getToolServerConnections = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/tool_servers`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setToolServerConnections = async (token: string, connections: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/tool_servers`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connections }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getTerminalServerConnections = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/terminal_servers`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setTerminalServerConnections = async (token: string, connections: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/terminal_servers`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connections }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; /** * Detect whether a terminal server URL points to an Orchestrator or a direct * Open Terminal instance. * * - GET {url}/api/v1/policies → 200 → "orchestrator" * - GET {url}/api/config → 200 → "terminal" * - Neither → null */ export const detectTerminalServerType = async ( url: string, key: string ): Promise<'orchestrator' | 'terminal' | null> => { const baseUrl = url.replace(/\/$/, ''); const headers: Record = {}; if (key) { headers['Authorization'] = `Bearer ${key}`; } // Orchestrators expose a policies API; plain terminals don't. try { const res = await fetch(`${baseUrl}/api/v1/policies`, { headers }); if (res.ok) return 'orchestrator'; } catch { // ignore } // Fall back to open-terminal config endpoint. try { const res = await fetch(`${baseUrl}/api/config`, { headers }); if (res.ok) return 'terminal'; } catch { // ignore } return null; }; /** * Create or update a policy on the orchestrator. * Proxied through the rexpro-ai backend to keep API keys server-side. */ export const putOrchestratorPolicy = async ( token: string, url: string, key: string, policyId: string, policyData: object ): Promise => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/terminal_servers/policy`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ url: url.replace(/\/$/, ''), key, policy_id: policyId, policy_data: policyData }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; /** * Verify a terminal server connection via the backend proxy. * Used for system/admin connections to avoid CORS issues and API key exposure. */ export const verifyTerminalServerConnection = async (token: string, connection: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/terminal_servers/verify`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connection }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const verifyToolServerConnection = async (token: string, connection: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/tool_servers/verify`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connection }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; type RegisterOAuthClientForm = { url: string; client_id: string; client_name?: string; client_secret?: string; oauth_server_url?: string; }; export const registerOAuthClient = async ( token: string, formData: RegisterOAuthClientForm, type: null | string = null ) => { let error = null; const searchParams = type ? `?type=${type}` : ''; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/oauth/clients/register${searchParams}`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...formData }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getOAuthClientAuthorizationUrl = (clientId: string, type: null | string = null) => { const oauthClientId = type ? `${type}:${clientId}` : clientId; return `${REXPRO_BASE_URL}/oauth/clients/${oauthClientId}/authorize`; }; export const getCodeExecutionConfig = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/code_execution`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setCodeExecutionConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/code_execution`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getModelsDefaults = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/models/defaults`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getModelsConfig = async (token: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/models`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setModelsConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/models`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setDefaultPromptSuggestions = async (token: string, promptSuggestions: string) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/suggestions`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ suggestions: promptSuggestions }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getBanners = async (token: string): Promise => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/banners`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setBanners = async (token: string, banners: Banner[]) => { let error = null; const res = await fetch(`${REXPRO_API_BASE_URL}/configs/banners`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ banners: banners }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; };