feat: AI Worker 平台 MVP v1.0.0 - 多租户/项目管理/AI Worker/任务编排/HITL审核/成本治理

This commit is contained in:
2026-08-12 13:31:13 +08:00
parent 2b5a87c630
commit 5df2b9f4bd
+173
View File
@@ -0,0 +1,173 @@
import apiClient from './client';
import type {
AuthResponse,
LoginPayload,
RegisterPayload,
User,
Tenant,
TenantCreate,
Project,
ProjectCreate,
ProjectStats,
Task,
TaskCreate,
TaskAssignPayload,
TaskExecutePayload,
ExecutionResult,
Worker,
WorkerCreate,
WorkerTestResult,
Review,
ReviewDecisionPayload,
Artifact,
DashboardStats,
TaskStatus,
ProjectStatus,
} from '@/types';
// ============ Auth ============
export const authApi = {
login: (data: LoginPayload) =>
apiClient.post<AuthResponse>('/auth/login', data).then((r) => r.data),
register: (data: RegisterPayload) =>
apiClient.post<AuthResponse>('/auth/register', data).then((r) => r.data),
me: () =>
apiClient.get<User>('/auth/me').then((r) => r.data),
};
// ============ Tenants ============
export const tenantApi = {
list: () =>
apiClient.get<Tenant[]>('/tenants').then((r) => r.data),
get: (id: string) =>
apiClient.get<Tenant>(`/tenants/${id}`).then((r) => r.data),
create: (data: TenantCreate) =>
apiClient.post<Tenant>('/tenants', data).then((r) => r.data),
update: (id: string, data: Partial<TenantCreate>) =>
apiClient.put<Tenant>(`/tenants/${id}`, data).then((r) => r.data),
};
// ============ Users ============
export const userApi = {
list: () =>
apiClient.get<User[]>('/users').then((r) => r.data),
get: (id: string) =>
apiClient.get<User>(`/users/${id}`).then((r) => r.data),
create: (data: Partial<User> & { password: string }) =>
apiClient.post<User>('/users', data).then((r) => r.data),
update: (id: string, data: Partial<User>) =>
apiClient.put<User>(`/users/${id}`, data).then((r) => r.data),
delete: (id: string) =>
apiClient.delete(`/users/${id}`).then((r) => r.data),
};
// ============ Projects ============
export const projectApi = {
list: (status?: ProjectStatus) =>
apiClient.get<Project[]>('/projects', { params: { status } }).then((r) => r.data),
get: (id: string) =>
apiClient.get<Project>(`/projects/${id}`).then((r) => r.data),
create: (data: ProjectCreate) =>
apiClient.post<Project>('/projects', data).then((r) => r.data),
update: (id: string, data: Partial<ProjectCreate>) =>
apiClient.put<Project>(`/projects/${id}`, data).then((r) => r.data),
delete: (id: string) =>
apiClient.delete(`/projects/${id}`).then((r) => r.data),
stats: (id: string) =>
apiClient.get<ProjectStats>(`/projects/${id}/stats`).then((r) => r.data),
};
// ============ Tasks ============
export const taskApi = {
list: (params?: { project_id?: string; status?: TaskStatus; assignee_id?: string }) =>
apiClient.get<Task[]>('/tasks', { params }).then((r) => r.data),
get: (id: string) =>
apiClient.get<Task>(`/tasks/${id}`).then((r) => r.data),
create: (projectId: string, data: TaskCreate) =>
apiClient.post<Task>('/tasks', data, { params: { project_id: projectId } }).then((r) => r.data),
update: (id: string, data: Partial<TaskCreate>) =>
apiClient.put<Task>(`/tasks/${id}`, data).then((r) => r.data),
delete: (id: string) =>
apiClient.delete(`/tasks/${id}`).then((r) => r.data),
assign: (id: string, data: TaskAssignPayload) =>
apiClient.post<Task>(`/tasks/${id}/assign`, data).then((r) => r.data),
execute: (id: string, data?: TaskExecutePayload) =>
apiClient.post<ExecutionResult>(`/tasks/${id}/execute`, data || {}).then((r) => r.data),
};
// ============ Workers ============
export const workerApi = {
list: () =>
apiClient.get<Worker[]>('/workers').then((r) => r.data),
get: (id: string) =>
apiClient.get<Worker>(`/workers/${id}`).then((r) => r.data),
create: (data: WorkerCreate) =>
apiClient.post<Worker>('/workers', data).then((r) => r.data),
update: (id: string, data: Partial<WorkerCreate>) =>
apiClient.put<Worker>(`/workers/${id}`, data).then((r) => r.data),
delete: (id: string) =>
apiClient.delete(`/workers/${id}`).then((r) => r.data),
test: (id: string, testPrompt?: string) =>
apiClient.post<WorkerTestResult>(`/workers/${id}/test`, { test_prompt: testPrompt || "Hello, respond with 'OK' if you can hear me." }).then((r) => r.data),
};
// ============ Reviews ============
export const reviewApi = {
list: (params?: { status?: string; project_id?: string }) =>
apiClient.get<Review[]>('/reviews', { params }).then((r) => r.data),
get: (id: string) =>
apiClient.get<Review>(`/reviews/${id}`).then((r) => r.data),
decision: (id: string, data: ReviewDecisionPayload) =>
apiClient.post<Review>(`/reviews/${id}/decision`, data).then((r) => r.data),
};
// ============ Artifacts ============
export const artifactApi = {
list: (params?: { task_id?: string; project_id?: string }) =>
apiClient.get<Artifact[]>('/artifacts', { params }).then((r) => r.data),
get: (id: string) =>
apiClient.get<Artifact>(`/artifacts/${id}`).then((r) => r.data),
};
// ============ Dashboard ============
export const dashboardApi = {
stats: () =>
apiClient.get<DashboardStats>('/dashboard').then((r) => r.data),
};