import { resolveRoleAssetStatusLabel } from '../customWorldAgentRoleAssetStateService.js'; import type { CustomWorldAgentActionExecutor } from './types.js'; import type { CustomWorldAgentAssetBridgeService } from '../customWorldAgentAssetBridgeService.js'; import type { CustomWorldAgentSnapshotBuilder } from '../customWorldAgentSnapshotBuilder.js'; import type { CustomWorldAgentSessionStore } from '../customWorldAgentSessionStore.js'; import { buildActionResultMessage, buildRoleAssetSyncResultText, } from './helpers.js'; import { buildCheckpointSnapshot, createOperationUpdater, getRequiredSession, } from './executorShared.js'; export function createSyncRoleAssetsExecutor(params: { sessionStore: CustomWorldAgentSessionStore; assetBridgeService: CustomWorldAgentAssetBridgeService; snapshotBuilder: CustomWorldAgentSnapshotBuilder; }): CustomWorldAgentActionExecutor<'sync_role_assets'> { return async ({ userId, sessionId, operationId, payload }) => { const updateOperation = createOperationUpdater({ sessionStore: params.sessionStore, userId, sessionId, operationId, }); try { await updateOperation({ status: 'running', phaseLabel: '同步角色资产', phaseDetail: '正在把主图与动作结果写回当前世界草稿。', progress: 36, }); const latestSession = await getRequiredSession({ sessionStore: params.sessionStore, userId, sessionId, }); const syncResult = params.assetBridgeService.applyRoleAssetPublishResult( latestSession.draftProfile, payload, ); await updateOperation({ phaseLabel: '刷新角色卡摘要', phaseDetail: '正在同步更新角色卡状态与资产覆盖。', progress: 72, }); const nextState = params.snapshotBuilder.buildRefiningState({ previousStage: latestSession.stage, nextStage: 'visual_refining', draftProfile: syncResult.draftProfile, focusCardId: payload.roleId, }); await params.sessionStore.replaceDerivedState(userId, sessionId, nextState); await params.sessionStore.appendCheckpoint(userId, sessionId, { label: `同步角色资产 ${syncResult.updatedAssetSummary.roleName}`, snapshot: buildCheckpointSnapshot(latestSession, nextState), }); await params.sessionStore.appendMessage( userId, sessionId, buildActionResultMessage({ relatedOperationId: operationId, text: buildRoleAssetSyncResultText({ roleName: syncResult.updatedAssetSummary.roleName, assetStatusLabel: resolveRoleAssetStatusLabel( syncResult.updatedAssetSummary.status, ), }), }), ); await updateOperation({ status: 'completed', phaseLabel: '角色资产已同步', phaseDetail: `「${syncResult.updatedAssetSummary.roleName}」的资产状态已更新为${resolveRoleAssetStatusLabel(syncResult.updatedAssetSummary.status)}。`, progress: 100, error: null, }); } catch (error) { await updateOperation({ status: 'failed', phaseLabel: '角色资产同步失败', phaseDetail: '这一轮没有成功把角色资产写回草稿。', progress: 100, error: error instanceof Error ? error.message : 'sync role assets failed', }); } }; }