合并编辑器场景生成与图片编辑契约
Project CI / Repository checks (pull_request) Failing after 8s
Project CI / Frontend tests (pull_request) Failing after 1m58s
Project CI / Backend tests (pull_request) Failing after 9s
Project CI / Native shell tests (pull_request) Successful in 16m24s

合并生成目标预检与图片编辑权威来源校验

保留场景生成前端分流与外部 API 契约

同步 Rust facade、后端架构文档和前端提交工作流
This commit is contained in:
2026-08-08 11:13:44 +08:00
140 changed files with 11917 additions and 2044 deletions
@@ -17,6 +17,7 @@ import {
generateEditorCharacterAnimation,
generateEditorIconSpritesheet,
generateEditorImage,
generateEditorScene,
generateEditorSoundEffect,
generateEditorVideo,
listEditorProjects,
@@ -966,6 +967,60 @@ describe('editorProjectClient', () => {
);
});
it('generates editor scenes through the structured endpoint without automatic retries', async () => {
requestJsonMock.mockResolvedValueOnce({
queueState: { jobId: 'scene-job-1', status: 'pending' },
});
await generateEditorScene({
sceneContent: '雨夜中的欧洲小镇街道',
stylePreset: 'anime',
model: 'gemini-3.1-flash-image-preview',
aspectRatio: '16:9',
imageSize: '1K',
referenceImageSrcs: ['editor-resource-reference'],
});
expect(requestJsonMock).toHaveBeenCalledWith(
'/api/editor/scenes/generations',
expect.objectContaining({
method: 'POST',
body: JSON.stringify({
sceneContent: '雨夜中的欧洲小镇街道',
stylePreset: 'anime',
model: 'gemini-3.1-flash-image-preview',
aspectRatio: '16:9',
imageSize: '1K',
referenceImageSrcs: ['editor-resource-reference'],
}),
}),
'生成游戏场景失败',
expect.objectContaining({
timeoutMs: 1_200_000,
retry: {
maxRetries: 0,
retryUnsafeMethods: false,
},
}),
);
});
it('rejects scene reference overflow without sending an HTTP request', async () => {
await expect(
generateEditorScene({
sceneContent: '雨夜中的欧洲小镇街道',
stylePreset: 'anime',
referenceImageSrcs: Array.from(
{ length: 6 },
(_, index) =>
`/generated-images/editor/scene-reference-${index + 1}.png`,
),
}),
).rejects.toThrow('场景参考图最多允许 5 张');
expect(requestJsonMock).not.toHaveBeenCalled();
});
it('rejects inline media before submitting editor generation requests', async () => {
await expect(
generateEditorImage({