merge: integrate marketplace and design v2 client

This commit is contained in:
2026-08-30 22:45:44 +08:00
43 changed files with 5662 additions and 14134 deletions

View File

@@ -12,11 +12,9 @@ import {
designAssetDownloadPath,
type DesignAsset,
type DesignAssetSaveResult,
type DesignConversation,
type DesignCommandInput,
type DesignCommandResult,
type DesignDeleteWorkspaceResult,
type DesignGenerationParameters,
type DesignGenerationQuote,
type DesignGenerationTask,
type DesignWorkspace,
type DesignWorkspaceBootstrap,
} from '../../shared/image-workspace';
@@ -49,12 +47,8 @@ function createClientId(prefix: string): string {
return `${prefix}-${id}`;
}
export function createImageWorkspaceTurnId(): string {
return createClientId('turn');
}
export function createImageWorkspaceConversationId(): string {
return createClientId('conversation');
export function createImageWorkspaceOperationId(): string {
return createClientId('design-operation');
}
function getErrorStatus(error: unknown): number {
@@ -105,10 +99,7 @@ export function createImageWorkspaceProject(
): Promise<DesignWorkspace> {
return requestData(`${IMAGE_WORKSPACE_API_PATH}/workspaces`, {
method: 'POST',
body: JSON.stringify({
clientWorkspaceId,
title: title.trim(),
}),
body: JSON.stringify({ clientWorkspaceId, title: title.trim() }),
});
}
@@ -118,10 +109,7 @@ export function renameImageWorkspaceProject(
): Promise<DesignWorkspace> {
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}`,
{
method: 'PATCH',
body: JSON.stringify({ title: title.trim() }),
},
{ method: 'PATCH', body: JSON.stringify({ title: title.trim() }) },
);
}
@@ -140,115 +128,26 @@ export function fetchImageWorkspaceProject(workspaceId: string): Promise<DesignW
);
}
export function createImageWorkspaceConversation(
workspaceId: string,
title = '新会话',
clientConversationId = createImageWorkspaceConversationId(),
): Promise<DesignConversation> {
export function submitImageWorkspaceCommand(
command: DesignCommandInput,
): Promise<DesignCommandResult> {
const { workspaceId, ...body } = command;
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/conversations`,
{
method: 'POST',
body: JSON.stringify({
clientConversationId,
title: title.trim(),
}),
},
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/commands`,
{ method: 'POST', body: JSON.stringify(body) },
);
}
export function fetchImageWorkspaceConversation(
export async function openImageWorkspaceEvents(
workspaceId: string,
conversationId: string,
before?: string,
): Promise<DesignConversation> {
const query = before ? `?before=${encodeURIComponent(before)}` : '';
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/conversations/${encodeURIComponent(conversationId)}${query}`,
);
}
export function sendImageWorkspaceMessage(
workspaceId: string,
conversationId: string,
expectedTurnRevision: number,
message: string,
clientTurnId = createImageWorkspaceTurnId(),
attachmentAssetIds: string[] = [],
): Promise<DesignConversation> {
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/conversations/${encodeURIComponent(conversationId)}/messages`,
{
method: 'POST',
body: JSON.stringify({
clientTurnId,
expectedTurnRevision,
message: message.trim(),
attachmentAssetIds,
}),
},
);
}
export function confirmImageWorkspaceGeneration(
workspaceId: string,
conversationId: string,
expectedTurnRevision: number,
quoteId: string,
clientTurnId = createImageWorkspaceTurnId(),
finalPrompt?: string,
generationParameters?: DesignGenerationParameters,
): Promise<DesignConversation> {
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/conversations/${encodeURIComponent(conversationId)}/quotes/${encodeURIComponent(quoteId)}/confirm`,
{
method: 'POST',
body: JSON.stringify({
clientTurnId,
expectedTurnRevision,
...(finalPrompt === undefined ? {} : { finalPrompt }),
...(generationParameters === undefined ? {} : { generationParameters }),
}),
},
);
}
export function updateImageWorkspaceGenerationQuote(
workspaceId: string,
quoteId: string,
finalPrompt: string,
generationParameters: DesignGenerationParameters,
): Promise<DesignGenerationQuote> {
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/generation-quotes/${encodeURIComponent(quoteId)}`,
{
method: 'PATCH',
body: JSON.stringify({
finalPrompt,
model: generationParameters.model,
resolution: generationParameters.resolution,
aspectRatio: generationParameters.aspectRatio,
durationSeconds: generationParameters.durationSeconds,
}),
},
);
}
export function fetchImageWorkspaceTasks(
workspaceId: string,
): Promise<DesignGenerationTask[]> {
return requestData(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/tasks`,
);
}
export async function openImageWorkspaceTaskEvents(
workspaceId: string,
conversationId: string,
sessionId: string,
afterEventId?: string,
): Promise<EventSource> {
await ensureHostApiToken();
const query = new URLSearchParams({ sessionId });
if (afterEventId) query.set('afterEventId', afterEventId);
return createHostEventSource(
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/conversations/${encodeURIComponent(conversationId)}/events`,
`${IMAGE_WORKSPACE_API_PATH}/workspaces/${encodeURIComponent(workspaceId)}/events?${query}`,
);
}
@@ -289,11 +188,7 @@ export function saveImageWorkspaceAsset(asset: DesignAsset): Promise<DesignAsset
);
}
const DESIGN_IMAGE_UPLOAD_MIME_TYPES = new Set([
'image/jpeg',
'image/png',
'image/webp',
]);
const DESIGN_IMAGE_UPLOAD_MIME_TYPES = new Set(['image/jpeg', 'image/png', 'image/webp']);
const MAX_DESIGN_IMAGE_UPLOAD_BYTES = 10 * 1024 * 1024;
async function fileToBase64(file: File): Promise<string> {