Merge branch 'codex/feature-1'

# Conflicts:
#	docs/【玩法创作】平台入口与玩法链路-2026-05-15.md
#	src/components/platform-entry/PlatformEntryFlowShellImpl.tsx
#	src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx
#	src/services/miniGameDraftGenerationProgress.ts
This commit is contained in:
2026-06-03 03:56:25 +08:00
51 changed files with 3075 additions and 482 deletions

View File

@@ -354,6 +354,7 @@ import type { PublishShareModalPayload } from '../common/publishShareModalModel'
import { UnifiedModal } from '../common/UnifiedModal';
import { resolveCreativeAgentTargetSelectionStage } from '../creative-agent/creativeAgentViewModel';
import {
buildCreationWorkShelfItems,
type CreationWorkShelfItem,
isPersistedBarkBattleDraftGenerating,
isPersistedPuzzleDraftGenerating,
@@ -2261,6 +2262,7 @@ function buildDraftCompletionDialogSource(
return formatPlatformTaskCompletionSource('创作草稿', sourceId);
}
/** 为恢复的小游戏草稿重建生成态,保留后端开始时间作为进度事实源。 */
function createMiniGameDraftGenerationStateForRestoredDraft(
kind: MiniGameDraftGenerationKind,
metadata?: MiniGameDraftGenerationState['metadata'],
@@ -2372,6 +2374,7 @@ function buildMatch3DFormPayloadFromWork(
};
}
/** 清理生成态完成时间,避免返回生成页后继续沿用结束态计时。 */
function rebaseMiniGameDraftGenerationStateForDisplay(
state: MiniGameDraftGenerationState,
): MiniGameDraftGenerationState {
@@ -15955,6 +15958,19 @@ export function PlatformEntryFlowShellImpl({
]);
useEffect(() => {
if (
platformBootstrap.platformTab === 'create' &&
platformBootstrap.canReadProtectedData
) {
// 中文注释:底部加号创作入口的“最近创作”依赖 RPG works 摘要;
// 失败草稿也必须随进入创作页刷新,不能只等草稿页刷新后才可见。
void platformBootstrap.refreshCustomWorldWorks().catch((error) => {
platformBootstrap.setPlatformError(
resolveRpgCreationErrorMessage(error, '读取创作作品列表失败。'),
);
});
}
if (
(platformBootstrap.platformTab === 'create' ||
selectionStage === 'platform') &&
@@ -15977,6 +15993,8 @@ export function PlatformEntryFlowShellImpl({
isVisualNovelCreationOpen,
platformBootstrap.canReadProtectedData,
platformBootstrap.platformTab,
platformBootstrap.refreshCustomWorldWorks,
platformBootstrap.setPlatformError,
refreshBabyObjectMatchShelf,
refreshBarkBattleShelf,
refreshMatch3DShelf,
@@ -16004,6 +16022,46 @@ export function PlatformEntryFlowShellImpl({
selectionStage,
]);
// 中文注释:最近创作必须由真实作品架/后端草稿摘要决定,不能混入本地生成中占位。
const backendRecentCreationShelfItems = useMemo(
() =>
buildCreationWorkShelfItems({
rpgItems: creationHubItems,
rpgLibraryEntries: platformBootstrap.savedCustomWorldEntries,
bigFishItems: isBigFishCreationVisible ? bigFishWorks : [],
match3dItems: match3dWorks,
squareHoleItems: isSquareHoleCreationVisible ? squareHoleWorks : [],
jumpHopItems: isJumpHopCreationVisible ? jumpHopWorks : [],
woodenFishItems: woodenFishWorks,
puzzleItems: puzzleWorks,
babyObjectMatchItems: isBabyObjectMatchVisible
? babyObjectMatchDrafts
: [],
barkBattleItems: barkBattleWorks,
visualNovelItems: isVisualNovelCreationOpen ? visualNovelWorks : [],
getItemState: getCreationWorkShelfState,
}),
[
barkBattleWorks,
babyObjectMatchDrafts,
bigFishWorks,
creationHubItems,
getCreationWorkShelfState,
isBabyObjectMatchVisible,
isBigFishCreationVisible,
isJumpHopCreationVisible,
isSquareHoleCreationVisible,
isVisualNovelCreationOpen,
jumpHopWorks,
match3dWorks,
platformBootstrap.savedCustomWorldEntries,
puzzleWorks,
squareHoleWorks,
visualNovelWorks,
woodenFishWorks,
],
);
const renderCreationHubContent = (
mode: 'start-only' | 'works-only',
fallbackLabel: string,
@@ -16100,6 +16158,7 @@ export function PlatformEntryFlowShellImpl({
}
entryConfig={creationEntryConfig}
creationTypes={creationEntryTypes}
recentWorkItems={backendRecentCreationShelfItems}
onCreateType={handleCreationHubCreateType}
getWorkState={getCreationWorkShelfState}
onOpenShelfItem={(item) => {