Spaces:
Runtime error
Runtime error
| 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<string, string> = {}; | |
| 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<object | null> => { | |
| 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<Banner[]> => { | |
| 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; | |
| }; | |