1
This commit is contained in:
@@ -0,0 +1,97 @@
|
||||
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',
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user