This commit is contained in:
2026-04-28 19:36:39 +08:00
parent a9febe7678
commit f0471a4f8d
206 changed files with 18456 additions and 10133 deletions

View File

@@ -71,6 +71,67 @@ export function createEmptyStoryEngineMemoryState(): StoryEngineMemoryState {
};
}
export function normalizeStoryEngineMemoryState(
memory?: Partial<StoryEngineMemoryState> | null,
): StoryEngineMemoryState {
const empty = createEmptyStoryEngineMemoryState();
if (!memory) return empty;
// 后端投影或旧存档可能只带增量字段,前端消费前统一补齐数组字段。
return {
...empty,
...memory,
discoveredFactIds: Array.isArray(memory.discoveredFactIds)
? memory.discoveredFactIds
: empty.discoveredFactIds,
inferredFactIds: Array.isArray(memory.inferredFactIds)
? memory.inferredFactIds
: empty.inferredFactIds,
activeThreadIds: Array.isArray(memory.activeThreadIds)
? memory.activeThreadIds
: empty.activeThreadIds,
resolvedScarIds: Array.isArray(memory.resolvedScarIds)
? memory.resolvedScarIds
: empty.resolvedScarIds,
recentCarrierIds: Array.isArray(memory.recentCarrierIds)
? memory.recentCarrierIds
: empty.recentCarrierIds,
openedSceneChapterIds: Array.isArray(memory.openedSceneChapterIds)
? memory.openedSceneChapterIds
: empty.openedSceneChapterIds,
recentSignalIds: Array.isArray(memory.recentSignalIds)
? memory.recentSignalIds
: empty.recentSignalIds,
recentCompanionReactions: Array.isArray(memory.recentCompanionReactions)
? memory.recentCompanionReactions
: empty.recentCompanionReactions,
companionArcStates: Array.isArray(memory.companionArcStates)
? memory.companionArcStates
: empty.companionArcStates,
worldMutations: Array.isArray(memory.worldMutations)
? memory.worldMutations
: empty.worldMutations,
chronicle: Array.isArray(memory.chronicle)
? memory.chronicle
: empty.chronicle,
factionTensionStates: Array.isArray(memory.factionTensionStates)
? memory.factionTensionStates
: empty.factionTensionStates,
consequenceLedger: Array.isArray(memory.consequenceLedger)
? memory.consequenceLedger
: empty.consequenceLedger,
companionResolutions: Array.isArray(memory.companionResolutions)
? memory.companionResolutions
: empty.companionResolutions,
narrativeCodex: Array.isArray(memory.narrativeCodex)
? memory.narrativeCodex
: empty.narrativeCodex,
simulationRunResults: Array.isArray(memory.simulationRunResults)
? memory.simulationRunResults
: empty.simulationRunResults,
};
}
function buildBaseFactIds(
narrativeProfile?: ActorNarrativeProfile | null,
backstoryReveal?: CharacterBackstoryRevealConfig | null,
@@ -113,7 +174,7 @@ function resolveUnlockedChapterIds(
export function buildEncounterVisibilitySlice(
params: EncounterVisibilityParams,
) {
const memory = params.storyEngineMemory ?? createEmptyStoryEngineMemoryState();
const memory = normalizeStoryEngineMemoryState(params.storyEngineMemory);
const factIds = buildBaseFactIds(params.narrativeProfile, params.backstoryReveal);
const unlockedChapterIds = resolveUnlockedChapterIds(
params.backstoryReveal,
@@ -193,7 +254,7 @@ export function buildEncounterVisibilitySlice(
export function buildQuestVisibilitySlice(
params: QuestVisibilityParams,
) {
const memory = params.storyEngineMemory ?? createEmptyStoryEngineMemoryState();
const memory = normalizeStoryEngineMemoryState(params.storyEngineMemory);
const narrativeProfile = params.issuerNarrativeProfile;
const factIds = dedupeStrings([
narrativeProfile ? 'publicMask' : null,