Update creation flow refactor docs and auth test fixtures

This commit is contained in:
2026-04-21 11:19:25 +08:00
parent 13bc79306f
commit 04bff9617d
37 changed files with 488 additions and 7 deletions

View File

@@ -0,0 +1,15 @@
import type { ComponentProps } from 'react';
import { PreGameSelectionFlow } from '../PreGameSelectionFlow';
/**
* 工作包 A 先建立 RPG 创作壳层的新命名入口。
* 当前实现继续复用旧的 `PreGameSelectionFlow`,后续工作包 B 再把内部编排逐步迁到新目录。
*/
export type RpgCreationShellProps = ComponentProps<typeof PreGameSelectionFlow>;
export function RpgCreationShell(props: RpgCreationShellProps) {
return <PreGameSelectionFlow {...props} />;
}
export default RpgCreationShell;

View File

@@ -0,0 +1,4 @@
export {
RpgCreationShell,
type RpgCreationShellProps,
} from './RpgCreationShell';

View File

@@ -0,0 +1,19 @@
import type { ComponentProps } from 'react';
import CustomWorldEntityEditorModal from '../CustomWorldEntityEditorModal';
/**
* 工作包 A 只建立 RPG 创作编辑器的新目录入口。
* 真实编辑表单暂时仍由旧的综合编辑器承载,后续工作包 C 会把不同 section 拆到这个目录下。
*/
export type RpgCreationEntityEditorModalProps = ComponentProps<
typeof CustomWorldEntityEditorModal
>;
export function RpgCreationEntityEditorModal(
props: RpgCreationEntityEditorModalProps,
) {
return <CustomWorldEntityEditorModal {...props} />;
}
export default RpgCreationEntityEditorModal;

View File

@@ -0,0 +1,4 @@
export {
RpgCreationEntityEditorModal,
type RpgCreationEntityEditorModalProps,
} from './RpgCreationEntityEditorModal';

View File

@@ -0,0 +1,17 @@
import type { ComponentProps } from 'react';
import { CustomWorldResultView } from '../CustomWorldResultView';
/**
* 工作包 A 先提供 RPG 创作结果页的新命名 façade。
* 当前结果页行为仍由旧组件承载,后续工作包 C 会在此目录内继续拆分 header、action bar 和 section。
*/
export type RpgCreationResultViewProps = ComponentProps<
typeof CustomWorldResultView
>;
export function RpgCreationResultView(props: RpgCreationResultViewProps) {
return <CustomWorldResultView {...props} />;
}
export default RpgCreationResultView;

View File

@@ -0,0 +1,4 @@
export {
RpgCreationResultView,
type RpgCreationResultViewProps,
} from './RpgCreationResultView';

View File

@@ -1423,12 +1423,7 @@ describe('npcEncounterActions', () => {
'更换任务',
'放弃任务',
]);
expect(lastStory.dialogue?.at(-2)).toEqual(
expect.objectContaining({
speaker: 'player',
text: '能不能换一份更适合眼下局势的委托?',
}),
);
expect(lastStory.text).toContain('断桥夜巡');
});
it('forwards pending quest offer acceptance to the server runtime resolver', async () => {

View File

@@ -0,0 +1,35 @@
export {
createRpgCreationSession,
executeRpgCreationAction,
getRpgCreationCardDetail,
getRpgCreationOperation,
getRpgCreationSession,
rpgCreationAgentClient,
sendRpgCreationMessage,
streamRpgCreationMessage,
} from './rpgCreationAgentClient';
export { rpgCreationAssetClient } from './rpgCreationAssetClient';
export {
generateRpgWorldCoverImage,
generateRpgWorldLandmark,
generateRpgWorldPlayableNpc,
generateRpgWorldSceneImage,
generateRpgWorldSceneNpc,
generateRpgWorldStoryNpc,
uploadRpgWorldCoverImage,
} from './rpgCreationAssetClient';
export {
deleteRpgWorldProfile,
getRpgWorldGalleryDetail,
listRpgWorldGallery,
listRpgWorldLibrary,
publishRpgWorldProfile,
rpgCreationLibraryClient,
unpublishRpgWorldProfile,
upsertRpgWorldProfile,
} from './rpgCreationLibraryClient';
export {
buildRpgCreationPreviewFromAgentDraft,
rpgCreationPreviewAdapter,
} from './rpgCreationPreviewAdapter';
export { listRpgCreationWorks, rpgCreationWorkClient } from './rpgCreationWorkClient';

View File

@@ -0,0 +1,33 @@
import {
createCustomWorldAgentSession,
executeCustomWorldAgentAction,
getCustomWorldAgentCardDetail,
getCustomWorldAgentOperation,
getCustomWorldAgentSession,
sendCustomWorldAgentMessage,
streamCustomWorldAgentMessage,
} from '../aiService';
/**
* 工作包 A 先把 RPG 创作 Agent 请求聚合到独立 client 命名空间。
* 当前仍直接透传旧实现,后续工作包 D 再逐步把 `aiService.ts` 中的相关接口迁出。
*/
export const rpgCreationAgentClient = {
createSession: createCustomWorldAgentSession,
getSession: getCustomWorldAgentSession,
sendMessage: sendCustomWorldAgentMessage,
streamMessage: streamCustomWorldAgentMessage,
executeAction: executeCustomWorldAgentAction,
getOperation: getCustomWorldAgentOperation,
getCardDetail: getCustomWorldAgentCardDetail,
};
export {
createCustomWorldAgentSession as createRpgCreationSession,
executeCustomWorldAgentAction as executeRpgCreationAction,
getCustomWorldAgentCardDetail as getRpgCreationCardDetail,
getCustomWorldAgentOperation as getRpgCreationOperation,
getCustomWorldAgentSession as getRpgCreationSession,
sendCustomWorldAgentMessage as sendRpgCreationMessage,
streamCustomWorldAgentMessage as streamRpgCreationMessage,
};

View File

@@ -0,0 +1,35 @@
import {
generateCustomWorldLandmark,
generateCustomWorldPlayableNpc,
generateCustomWorldSceneImage,
generateCustomWorldSceneNpc,
generateCustomWorldStoryNpc,
} from '../aiService';
import {
generateCustomWorldCoverImage,
uploadCustomWorldCoverImage,
} from '../customWorldCoverAssetService';
/**
* 工作包 A 先把 RPG 创作资产相关请求收口到独立 client。
* 当前仍桥接旧接口,后续工作包 C、D 会继续细分角色资产、场景资产和封面资产职责。
*/
export const rpgCreationAssetClient = {
generateSceneImage: generateCustomWorldSceneImage,
generateSceneNpc: generateCustomWorldSceneNpc,
generatePlayableNpc: generateCustomWorldPlayableNpc,
generateStoryNpc: generateCustomWorldStoryNpc,
generateLandmark: generateCustomWorldLandmark,
generateCoverImage: generateCustomWorldCoverImage,
uploadCoverImage: uploadCustomWorldCoverImage,
};
export {
generateCustomWorldCoverImage as generateRpgWorldCoverImage,
generateCustomWorldLandmark as generateRpgWorldLandmark,
generateCustomWorldPlayableNpc as generateRpgWorldPlayableNpc,
generateCustomWorldSceneImage as generateRpgWorldSceneImage,
generateCustomWorldSceneNpc as generateRpgWorldSceneNpc,
generateCustomWorldStoryNpc as generateRpgWorldStoryNpc,
uploadCustomWorldCoverImage as uploadRpgWorldCoverImage,
};

View File

@@ -0,0 +1,33 @@
import {
deleteCustomWorldProfile,
getCustomWorldGalleryDetail,
listCustomWorldGallery,
listCustomWorldLibrary,
publishCustomWorldProfile,
unpublishCustomWorldProfile,
upsertCustomWorldProfile,
} from '../storageService';
/**
* 工作包 A 先建立 RPG 世界作品库和广场相关请求的统一入口。
* 当前实现仍透传旧 `storageService.ts`,后续工作包 D 会把作品链路彻底迁入这里。
*/
export const rpgCreationLibraryClient = {
listLibrary: listCustomWorldLibrary,
upsertProfile: upsertCustomWorldProfile,
deleteProfile: deleteCustomWorldProfile,
publishProfile: publishCustomWorldProfile,
unpublishProfile: unpublishCustomWorldProfile,
listGallery: listCustomWorldGallery,
getGalleryDetail: getCustomWorldGalleryDetail,
};
export {
deleteCustomWorldProfile as deleteRpgWorldProfile,
getCustomWorldGalleryDetail as getRpgWorldGalleryDetail,
listCustomWorldGallery as listRpgWorldGallery,
listCustomWorldLibrary as listRpgWorldLibrary,
publishCustomWorldProfile as publishRpgWorldProfile,
unpublishCustomWorldProfile as unpublishRpgWorldProfile,
upsertCustomWorldProfile as upsertRpgWorldProfile,
};

View File

@@ -0,0 +1,13 @@
import { buildCustomWorldProfileFromAgentDraft } from '../customWorldAgentDraftResult';
/**
* 这是工作包 A 提供的新命名兼容层。
* 当前仍复用旧的前端草稿编译逻辑,后续 Phase 3 会继续把结果预览编译后移到服务端。
*/
export const rpgCreationPreviewAdapter = {
buildPreviewFromAgentDraft: buildCustomWorldProfileFromAgentDraft,
};
export {
buildCustomWorldProfileFromAgentDraft as buildRpgCreationPreviewFromAgentDraft,
};

View File

@@ -0,0 +1,11 @@
import { listCustomWorldWorks } from '../storageService';
/**
* 工作包 A 先建立 RPG 创作作品流的独立 client。
* 当前作品列表仍复用旧存储服务,后续工作包 D 再切出真正的专属请求实现。
*/
export const rpgCreationWorkClient = {
listWorks: listCustomWorldWorks,
};
export { listCustomWorldWorks as listRpgCreationWorks };