import type { MockAgentTurnResponse, WebProject, WebProjectPatch, WebProjectPreviewBuild, WebProjectResponse, WebProjectSnapshot, WebProjectSnapshotResponse, } from '../../../packages/shared/src/contracts/webProject'; import { requestJson, type ApiRequestOptions } from '../apiClient'; const WEB_PROJECT_CREATION_API_BASE = '/api/creation/web-project/projects'; const WEB_PROJECT_RUNTIME_API_BASE = '/api/runtime/web-project'; const WEB_PROJECT_REQUEST_OPTIONS = { clearAuthOnUnauthorized: false, notifyAuthStateChange: false, } satisfies ApiRequestOptions; type WebProjectPreviewBuildResponse = { build: WebProjectPreviewBuild; }; function jsonRequest(method: 'POST' | 'PATCH', body: Record) { return { method, headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body), }; } function projectUrl(projectId: string) { return `${WEB_PROJECT_CREATION_API_BASE}/${encodeURIComponent(projectId)}`; } export async function createWebProject(input: { title?: string } = {}) { const response = await requestJson( WEB_PROJECT_CREATION_API_BASE, jsonRequest('POST', { title: input.title }), '创建 Web 工程失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.project; } export async function loadWebProject(projectId: string) { const response = await requestJson( projectUrl(projectId), { method: 'GET' }, '读取 Web 工程失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.project; } export async function loadActiveWebProjectSnapshot(projectId: string) { const response = await requestJson( `${projectUrl(projectId)}/snapshot`, { method: 'GET' }, '读取 Web 工程快照失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.snapshot; } export async function saveWebProjectFiles( projectId: string, input: { patch: WebProjectPatch; baseSnapshotId: string; summary?: string; }, ) { const response = await requestJson( `${projectUrl(projectId)}/files`, jsonRequest('PATCH', { patch: input.patch, baseSnapshotId: input.baseSnapshotId, summary: input.summary, }), '保存 Web 工程文件失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.snapshot; } export async function submitMockAgentTurn( projectId: string, input: { prompt: string; baseSnapshotId: string; }, ) { return requestJson( `${projectUrl(projectId)}/mock-agent-turns`, jsonRequest('POST', { prompt: input.prompt, baseSnapshotId: input.baseSnapshotId, }), '提交 Mock Agent 指令失败', WEB_PROJECT_REQUEST_OPTIONS, ); } export async function createWebProjectPreviewBuild( projectId: string, input: { snapshotId?: string } = {}, ) { const response = await requestJson( `${WEB_PROJECT_RUNTIME_API_BASE}/projects/${encodeURIComponent(projectId)}/preview-builds`, jsonRequest('POST', { snapshotId: input.snapshotId }), '创建 Web 工程预览构建失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.build; } export async function loadWebProjectPreviewBuild(jobId: string) { const response = await requestJson( `${WEB_PROJECT_RUNTIME_API_BASE}/preview-builds/${encodeURIComponent(jobId)}`, { method: 'GET' }, '读取 Web 工程预览构建失败', WEB_PROJECT_REQUEST_OPTIONS, ); return response.build; } export type WebProjectClientSnapshotBundle = { project: WebProject; snapshot: WebProjectSnapshot; }; export async function createWebProjectWithSnapshot( input: { title?: string } = {}, ): Promise { const project = await createWebProject(input); const snapshot = await loadActiveWebProjectSnapshot(project.projectId); return { project, snapshot }; }