export const getApiBase = () => process.env.NEXT_PUBLIC_API_BASE ?? '/api' export const getToken = () => { if (typeof window === 'undefined') return null return window.localStorage.getItem('magent_token') } export const setToken = (token: string) => { if (typeof window === 'undefined') return window.localStorage.setItem('magent_token', token) } export const clearToken = () => { if (typeof window === 'undefined') return window.localStorage.removeItem('magent_token') } export const authFetch = (input: RequestInfo | URL, init?: RequestInit) => { const token = getToken() const headers = new Headers(init?.headers || {}) if (token) { headers.set('Authorization', `Bearer ${token}`) } return fetch(input, { ...init, headers }) } export const getEventStreamToken = async () => { const baseUrl = getApiBase() const response = await authFetch(`${baseUrl}/auth/stream-token`) if (!response.ok) { const text = await response.text() throw new Error(text || `Stream token request failed: ${response.status}`) } const data = await response.json() const token = typeof data?.stream_token === 'string' ? data.stream_token : '' if (!token) { throw new Error('Stream token not returned') } return token }