合并图标规范与图集生成优化

合入 PR 137 的图标规范生成、稳定引用与图集提示词链路
保留主分支现行音效提交、Prompt 模块与结果压缩逻辑
解决 External Worker、生成提交和客户端测试冲突
This commit is contained in:
2026-08-08 21:44:15 +08:00
76 changed files with 7690 additions and 3063 deletions
@@ -39,6 +39,7 @@ import {
} from './useImageCanvasGenerationWorkflow';
const generateEditorImageMock = vi.hoisted(() => vi.fn());
const generateEditorIconSpecMock = vi.hoisted(() => vi.fn());
const generateEditorCharacterAnimationMock = vi.hoisted(() => vi.fn());
const generateEditorIconSpritesheetMock = vi.hoisted(() => vi.fn());
const generateEditorSoundEffectMock = vi.hoisted(() => vi.fn());
@@ -78,6 +79,7 @@ vi.mock('../../services/image-editor/editorProjectClient', async () => {
generateEditorBackgroundMusic: generateEditorBackgroundMusicMock,
generateEditorCharacterAnimation: generateEditorCharacterAnimationMock,
generateEditorIconSpritesheet: generateEditorIconSpritesheetMock,
generateEditorIconSpec: generateEditorIconSpecMock,
generateEditorImage: generateEditorImageMock,
generateEditorSoundEffect: generateEditorSoundEffectMock,
loadEditorProject: loadEditorProjectMock,
@@ -609,8 +611,17 @@ function GenerationWorkflowHarness({
<button type="button" onClick={workflow.openIconGenerationDialog}>
打开图标生成
</button>
<button type="button" onClick={() => workflow.openSpecDialog('ui')}>
打开UI规范
<button type="button" onClick={() => workflow.openSpecDialog('icon')}>
打开图标规范
</button>
<button
type="button"
onClick={() => {
workflow.updateSpecFormValue('playSetting', '消除玩法');
workflow.updateSpecFormValue('artStyle', '清爽卡通');
}}
>
填写图标规范
</button>
<button type="button" onClick={workflow.openUiDesignGenerationDialog}>
打开UI设计生成
@@ -1120,6 +1131,7 @@ function GenerationWorkflowHarness({
id: 'spec-ref',
label: '参考.png',
src: 'data:image/png;base64,ref',
resourceId: 'resource-spec-ref',
},
}
: currentDialog,
@@ -2143,36 +2155,23 @@ describe('useImageCanvasGenerationWorkflow', () => {
);
});
it('submits spec generation with reference image and reference prompt semantics', async () => {
uploadEditorMediaAssetFileMock.mockResolvedValueOnce({
src: 'https://signed.example.test/generation-reference.png',
objectKey:
'generated-character-drafts/editor/generation-references/reference.png',
assetObjectId: 'asset-object-generation-reference',
legacyPublicPath:
'/generated-character-drafts/editor/generation-references/reference.png',
});
generateEditorImageMock.mockResolvedValueOnce(
it('submits icon spec generation with business fields and a stable reference', async () => {
generateEditorIconSpecMock.mockResolvedValueOnce(
createGenerated({ prompt: 'UI规范图' }),
);
render(<GenerationWorkflowHarness />);
fireEvent.click(screen.getByRole('button', { name: '打开UI规范' }));
fireEvent.click(screen.getByRole('button', { name: '打开图标规范' }));
fireEvent.click(screen.getByRole('button', { name: '填写图标规范' }));
fireEvent.click(screen.getByRole('button', { name: '添加规范参考图' }));
fireEvent.click(screen.getByRole('button', { name: '提交生成' }));
await waitFor(() => {
expect(generateEditorImageMock).toHaveBeenCalledWith(
expect(generateEditorIconSpecMock).toHaveBeenCalledWith(
expect.objectContaining({
size: '2048x1152',
kind: 'spec',
model: 'gpt-image-2',
aspectRatio: '16:9',
imageSize: '2K',
referenceImageSrcs: [
'generated-character-drafts/editor/generation-references/reference.png',
],
prompt: expect.stringContaining('参考图生成规范'),
playSetting: '消除玩法',
artStyle: '清爽卡通',
referenceId: 'resource-spec-ref',
}),
);
});