feat: complete TASK-WP2-05 generation submission

This commit is contained in:
suyx
2026-08-03 00:26:34 +08:00
parent 4551d73e76
commit c8643c080d
22 changed files with 2372 additions and 22 deletions
+7 -7
View File
@@ -15,14 +15,14 @@ export type ProjectRatio = typeof projectRatios[number];
export type GenerationStatus = "queued" | "running" | "succeeded" | "failed" | "rejected";
export type ProjectViewStatus = "active" | "failed_empty" | "trashed";
export type ProjectManagedResourceKind = "derived" | "export" | "generated" | "reference";
const ratioPixels: Record<ProjectRatio, { height: number; width: number }> = {
export const ratioPixels: Record<ProjectRatio, { height: number; width: number }> = {
"3:4": { height: 1440, width: 1080 },
"1:1": { height: 1080, width: 1080 },
"4:3": { height: 1080, width: 1440 },
"9:16": { height: 1920, width: 1080 },
};
const projectLimit = 20;
const historyLimit = 10;
export const projectLimit = 20;
export const historyLimit = 10;
const trashRetentionMilliseconds = 720 * 60 * 60 * 1_000;
const generationErrorCategories = new Set([
"upstream_timeout", "upstream_failed", "safety_rejected", "model_disabled",
@@ -76,7 +76,7 @@ function isProjectRatio(value: string): value is ProjectRatio {
return projectRatios.includes(value as ProjectRatio);
}
function normalizePrompt(value: string) {
export function normalizePrompt(value: string) {
const normalized = value.trim().replace(/\s+/gu, " ");
if (!normalized || normalized.length > 4_000) throw new ProjectError("generation_state_invalid");
return normalized;
@@ -100,7 +100,7 @@ function localDate(timestamp: number) {
.join("-");
}
function defaultProjectName(prompt: string, timestamp: number) {
export function defaultProjectName(prompt: string, timestamp: number) {
const summary = takeGraphemes(normalizePrompt(prompt), 24) || "未命名创作";
return `${summary} ${localDate(timestamp)}`;
}
@@ -115,7 +115,7 @@ function iso(timestamp: number) {
return new Date(timestamp).toISOString();
}
function defaultCanvasState(ratio: ProjectRatio, pixels: { height: number; width: number }, assetId: string | null): CanvasState {
export function defaultCanvasState(ratio: ProjectRatio, pixels: { height: number; width: number }, assetId: string | null): CanvasState {
return {
background: {
adjustments: {
@@ -138,7 +138,7 @@ function defaultCanvasState(ratio: ProjectRatio, pixels: { height: number; width
};
}
function stableJson(value: unknown): string {
export function stableJson(value: unknown): string {
if (Array.isArray(value)) return `[${value.map(stableJson).join(",")}]`;
if (value && typeof value === "object") {
return `{${Object.entries(value).sort(([left], [right]) => left < right ? -1 : left > right ? 1 : 0)