mirror of
https://github.com/siteboon/claudecodeui.git
synced 2026-02-02 23:07:35 +00:00
- Add "+" button to create new folders directly from folder browser - Add SSE endpoint for git clone with real-time progress display - Show clone progress (receiving objects, resolving deltas) in UI - Detect SSH URLs and display "SSH Key" instead of "No authentication" - Hide token section for SSH URLs (tokens only work with HTTPS) - Fix auto-advance behavior: only auto-advance for "Existing Workspace" - Fix various misleading UI messages - Support auth token via query param for SSE endpoints
184 lines
6.3 KiB
JavaScript
184 lines
6.3 KiB
JavaScript
// Utility function for authenticated API calls
|
|
export const authenticatedFetch = (url, options = {}) => {
|
|
const isPlatform = import.meta.env.VITE_IS_PLATFORM === 'true';
|
|
const token = localStorage.getItem('auth-token');
|
|
|
|
const defaultHeaders = {};
|
|
|
|
// Only set Content-Type for non-FormData requests
|
|
if (!(options.body instanceof FormData)) {
|
|
defaultHeaders['Content-Type'] = 'application/json';
|
|
}
|
|
|
|
if (!isPlatform && token) {
|
|
defaultHeaders['Authorization'] = `Bearer ${token}`;
|
|
}
|
|
|
|
return fetch(url, {
|
|
...options,
|
|
headers: {
|
|
...defaultHeaders,
|
|
...options.headers,
|
|
},
|
|
});
|
|
};
|
|
|
|
// API endpoints
|
|
export const api = {
|
|
// Auth endpoints (no token required)
|
|
auth: {
|
|
status: () => fetch('/api/auth/status'),
|
|
login: (username, password) => fetch('/api/auth/login', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ username, password }),
|
|
}),
|
|
register: (username, password) => fetch('/api/auth/register', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({ username, password }),
|
|
}),
|
|
user: () => authenticatedFetch('/api/auth/user'),
|
|
logout: () => authenticatedFetch('/api/auth/logout', { method: 'POST' }),
|
|
},
|
|
|
|
// Protected endpoints
|
|
// config endpoint removed - no longer needed (frontend uses window.location)
|
|
projects: () => authenticatedFetch('/api/projects'),
|
|
sessions: (projectName, limit = 5, offset = 0) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/sessions?limit=${limit}&offset=${offset}`),
|
|
sessionMessages: (projectName, sessionId, limit = null, offset = 0, provider = 'claude') => {
|
|
const params = new URLSearchParams();
|
|
if (limit !== null) {
|
|
params.append('limit', limit);
|
|
params.append('offset', offset);
|
|
}
|
|
const queryString = params.toString();
|
|
|
|
// Route to the correct endpoint based on provider
|
|
let url;
|
|
if (provider === 'codex') {
|
|
url = `/api/codex/sessions/${sessionId}/messages${queryString ? `?${queryString}` : ''}`;
|
|
} else if (provider === 'cursor') {
|
|
url = `/api/cursor/sessions/${sessionId}/messages${queryString ? `?${queryString}` : ''}`;
|
|
} else {
|
|
url = `/api/projects/${projectName}/sessions/${sessionId}/messages${queryString ? `?${queryString}` : ''}`;
|
|
}
|
|
return authenticatedFetch(url);
|
|
},
|
|
renameProject: (projectName, displayName) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/rename`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ displayName }),
|
|
}),
|
|
deleteSession: (projectName, sessionId) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/sessions/${sessionId}`, {
|
|
method: 'DELETE',
|
|
}),
|
|
deleteCodexSession: (sessionId) =>
|
|
authenticatedFetch(`/api/codex/sessions/${sessionId}`, {
|
|
method: 'DELETE',
|
|
}),
|
|
deleteProject: (projectName, force = false) =>
|
|
authenticatedFetch(`/api/projects/${projectName}${force ? '?force=true' : ''}`, {
|
|
method: 'DELETE',
|
|
}),
|
|
createProject: (path) =>
|
|
authenticatedFetch('/api/projects/create', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ path }),
|
|
}),
|
|
createWorkspace: (workspaceData) =>
|
|
authenticatedFetch('/api/projects/create-workspace', {
|
|
method: 'POST',
|
|
body: JSON.stringify(workspaceData),
|
|
}),
|
|
readFile: (projectName, filePath) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/file?filePath=${encodeURIComponent(filePath)}`),
|
|
saveFile: (projectName, filePath, content) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/file`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify({ filePath, content }),
|
|
}),
|
|
getFiles: (projectName) =>
|
|
authenticatedFetch(`/api/projects/${projectName}/files`),
|
|
transcribe: (formData) =>
|
|
authenticatedFetch('/api/transcribe', {
|
|
method: 'POST',
|
|
body: formData,
|
|
headers: {}, // Let browser set Content-Type for FormData
|
|
}),
|
|
|
|
// TaskMaster endpoints
|
|
taskmaster: {
|
|
// Initialize TaskMaster in a project
|
|
init: (projectName) =>
|
|
authenticatedFetch(`/api/taskmaster/init/${projectName}`, {
|
|
method: 'POST',
|
|
}),
|
|
|
|
// Add a new task
|
|
addTask: (projectName, { prompt, title, description, priority, dependencies }) =>
|
|
authenticatedFetch(`/api/taskmaster/add-task/${projectName}`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({ prompt, title, description, priority, dependencies }),
|
|
}),
|
|
|
|
// Parse PRD to generate tasks
|
|
parsePRD: (projectName, { fileName, numTasks, append }) =>
|
|
authenticatedFetch(`/api/taskmaster/parse-prd/${projectName}`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({ fileName, numTasks, append }),
|
|
}),
|
|
|
|
// Get available PRD templates
|
|
getTemplates: () =>
|
|
authenticatedFetch('/api/taskmaster/prd-templates'),
|
|
|
|
// Apply a PRD template
|
|
applyTemplate: (projectName, { templateId, fileName, customizations }) =>
|
|
authenticatedFetch(`/api/taskmaster/apply-template/${projectName}`, {
|
|
method: 'POST',
|
|
body: JSON.stringify({ templateId, fileName, customizations }),
|
|
}),
|
|
|
|
// Update a task
|
|
updateTask: (projectName, taskId, updates) =>
|
|
authenticatedFetch(`/api/taskmaster/update-task/${projectName}/${taskId}`, {
|
|
method: 'PUT',
|
|
body: JSON.stringify(updates),
|
|
}),
|
|
},
|
|
|
|
// Browse filesystem for project suggestions
|
|
browseFilesystem: (dirPath = null) => {
|
|
const params = new URLSearchParams();
|
|
if (dirPath) params.append('path', dirPath);
|
|
|
|
return authenticatedFetch(`/api/browse-filesystem?${params}`);
|
|
},
|
|
|
|
createFolder: (folderPath) =>
|
|
authenticatedFetch('/api/create-folder', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ path: folderPath }),
|
|
}),
|
|
|
|
// User endpoints
|
|
user: {
|
|
gitConfig: () => authenticatedFetch('/api/user/git-config'),
|
|
updateGitConfig: (gitName, gitEmail) =>
|
|
authenticatedFetch('/api/user/git-config', {
|
|
method: 'POST',
|
|
body: JSON.stringify({ gitName, gitEmail }),
|
|
}),
|
|
onboardingStatus: () => authenticatedFetch('/api/user/onboarding-status'),
|
|
completeOnboarding: () =>
|
|
authenticatedFetch('/api/user/complete-onboarding', {
|
|
method: 'POST',
|
|
}),
|
|
},
|
|
|
|
// Generic GET method for any endpoint
|
|
get: (endpoint) => authenticatedFetch(`/api${endpoint}`),
|
|
}; |