This commit is contained in:
2026-04-27 22:50:18 +08:00
parent ded6f6ee2a
commit b6c6640548
77 changed files with 5240 additions and 833 deletions

View File

@@ -202,31 +202,42 @@ test('buildRpgCreationPreviewFromResultPreview normalizes server preview envelop
expect(profile?.settingText).toBe('被海雾吞没的旧航路群岛');
});
test('buildRpgCreationPreviewFromSession prefers agent draft profile', () => {
test('buildRpgCreationPreviewFromSession prefers server result preview', () => {
const profile = buildRpgCreationPreviewFromSession(sessionWithPreview);
expect(profile?.name).toBe('只作为 fallback 的本地草稿名');
expect(profile?.summary).toBe('fallback');
expect(profile?.id).toBe('draft-profile-1');
expect(profile?.playableNpcs[0]?.id).toBe('draft-playable-1');
expect(profile?.name).toBe('服务端结果预览');
expect(profile?.summary).toBe('结果页应该优先消费 session.resultPreview。');
expect(profile?.id).toBe('preview-profile-1');
expect(profile?.playableNpcs).toEqual([]);
});
test('buildRpgCreationPreviewFromSession does not require resultPreview', () => {
test('buildRpgCreationPreviewFromSession falls back to draft legacy result profile', () => {
const profile = buildRpgCreationPreviewFromSession({
...sessionWithPreview,
resultPreview: null,
draftProfile: {
...sessionWithPreview.draftProfile,
legacyResultProfile: {
...sessionWithPreview.resultPreview!.preview,
id: 'legacy-result-profile-1',
name: '草稿内嵌结果页',
summary: 'resultPreview 缺失时继续使用 draft 内嵌的结果页快照。',
},
},
});
expect(profile?.name).toBe('草稿内嵌结果页');
expect(profile?.summary).toBe(
'resultPreview 缺失时继续使用 draft 内嵌的结果页快照。',
);
expect(profile?.id).toBe('legacy-result-profile-1');
});
test('buildRpgCreationPreviewFromSession does not treat draftProfile as runtime profile', () => {
const profile = buildRpgCreationPreviewFromSession({
...sessionWithPreview,
resultPreview: null,
});
expect(profile?.name).toBe('只作为 fallback 的本地草稿名');
expect(profile?.playableNpcs[0]?.imageSrc).toBe(
'/generated-characters/draft-playable-1/portrait.png',
);
expect(profile?.attributeSchema.slots.map((slot) => slot.name)).toEqual([
'稿骨',
'稿步',
'稿识',
'稿魄',
'稿契',
'稿澜',
]);
expect(profile).toBeNull();
});

View File

@@ -2,6 +2,19 @@ import type { CustomWorldAgentSessionSnapshot } from '../../../packages/shared/s
import { normalizeCustomWorldProfileRecord } from '../../data/customWorldLibrary';
import type { CustomWorldProfile } from '../../types';
function buildCustomWorldProfileFromDraftLegacyResult(
draftProfile: CustomWorldAgentSessionSnapshot['draftProfile'],
): CustomWorldProfile | null {
if (!draftProfile || typeof draftProfile !== 'object') {
return null;
}
return normalizeCustomWorldProfileRecord(
(draftProfile as { legacyResultProfile?: unknown }).legacyResultProfile ??
null,
);
}
export function buildCustomWorldProfileFromResultPreview(
resultPreview:
| CustomWorldAgentSessionSnapshot['resultPreview']
@@ -15,14 +28,14 @@ export function buildCustomWorldProfileFromAgentSession(
session: CustomWorldAgentSessionSnapshot | null | undefined,
): CustomWorldProfile | null {
return (
normalizeCustomWorldProfileRecord(session?.draftProfile ?? null) ??
buildCustomWorldProfileFromResultPreview(session?.resultPreview)
buildCustomWorldProfileFromResultPreview(session?.resultPreview) ??
buildCustomWorldProfileFromDraftLegacyResult(session?.draftProfile ?? null)
);
}
/**
* 这是工作包 A 提供的新命名兼容层。
* 主入口保持命名稳定,优先消费 Agent 草稿真相源,缺失时才回退到 resultPreview
* 主入口保持命名稳定,只消费结果页运行态快照,避免作品测试读到旧草稿骨架
*/
export const rpgCreationPreviewAdapter = {
buildPreviewFromSession: buildCustomWorldProfileFromAgentSession,
@@ -30,6 +43,6 @@ export const rpgCreationPreviewAdapter = {
};
export {
buildCustomWorldProfileFromAgentSession as buildRpgCreationPreviewFromSession,
buildCustomWorldProfileFromResultPreview as buildRpgCreationPreviewFromResultPreview,
buildCustomWorldProfileFromAgentSession as buildRpgCreationPreviewFromSession,
};