Files
Genarrative/server-node/src/services/customWorldAgentActionExecutors/syncRoleAssetsExecutor.ts
2026-04-21 18:27:46 +08:00

98 lines
3.4 KiB
TypeScript

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',
});
}
};
}