1
This commit is contained in:
@@ -0,0 +1,111 @@
|
||||
import { updateDraftCardSections } from '../customWorldAgentDraftEditService.js';
|
||||
import type { CustomWorldAgentActionExecutor } from './types.js';
|
||||
import type { CustomWorldAgentChangeSummaryService } from '../customWorldAgentChangeSummaryService.js';
|
||||
import type { CustomWorldAgentDraftCompiler } from '../customWorldAgentDraftCompiler.js';
|
||||
import type { CustomWorldAgentSnapshotBuilder } from '../customWorldAgentSnapshotBuilder.js';
|
||||
import type { CustomWorldAgentSessionStore } from '../customWorldAgentSessionStore.js';
|
||||
import { buildActionResultMessage } from './helpers.js';
|
||||
import {
|
||||
buildCheckpointSnapshot,
|
||||
createOperationUpdater,
|
||||
getRequiredSession,
|
||||
} from './executorShared.js';
|
||||
|
||||
export function createUpdateDraftCardExecutor(params: {
|
||||
sessionStore: CustomWorldAgentSessionStore;
|
||||
draftCompiler: CustomWorldAgentDraftCompiler;
|
||||
changeSummaryService: CustomWorldAgentChangeSummaryService;
|
||||
snapshotBuilder: CustomWorldAgentSnapshotBuilder;
|
||||
}): CustomWorldAgentActionExecutor<'update_draft_card'> {
|
||||
return async ({ userId, sessionId, operationId, payload }) => {
|
||||
const updateOperation = createOperationUpdater({
|
||||
sessionStore: params.sessionStore,
|
||||
userId,
|
||||
sessionId,
|
||||
operationId,
|
||||
});
|
||||
|
||||
try {
|
||||
await updateOperation({
|
||||
status: 'running',
|
||||
phaseLabel: '写回草稿设定',
|
||||
phaseDetail: '正在把这次编辑内容写回当前世界底稿。',
|
||||
progress: 34,
|
||||
});
|
||||
|
||||
const latestSession = await getRequiredSession({
|
||||
sessionStore: params.sessionStore,
|
||||
userId,
|
||||
sessionId,
|
||||
});
|
||||
const nextDraftProfile = updateDraftCardSections({
|
||||
draftProfile: (latestSession.draftProfile ?? {}) as Record<
|
||||
string,
|
||||
unknown
|
||||
>,
|
||||
cardId: payload.cardId,
|
||||
sections: payload.sections,
|
||||
});
|
||||
|
||||
await updateOperation({
|
||||
phaseLabel: '重编译草稿卡',
|
||||
phaseDetail: '正在同步更新草稿摘要和详情内容。',
|
||||
progress: 72,
|
||||
});
|
||||
|
||||
const nextState = params.snapshotBuilder.buildRefiningState({
|
||||
previousStage: latestSession.stage,
|
||||
draftProfile: nextDraftProfile,
|
||||
focusCardId: payload.cardId,
|
||||
});
|
||||
const updatedDetail = params.draftCompiler.getDraftCardDetail(
|
||||
nextDraftProfile,
|
||||
payload.cardId,
|
||||
);
|
||||
const changedSectionIds = new Set(
|
||||
payload.sections
|
||||
.map((section) => section.sectionId.trim())
|
||||
.filter(Boolean),
|
||||
);
|
||||
|
||||
await params.sessionStore.replaceDerivedState(userId, sessionId, nextState);
|
||||
await params.sessionStore.appendCheckpoint(userId, sessionId, {
|
||||
label: `编辑 ${updatedDetail?.title || '草稿卡'}`,
|
||||
snapshot: buildCheckpointSnapshot(latestSession, nextState),
|
||||
});
|
||||
await params.sessionStore.appendMessage(
|
||||
userId,
|
||||
sessionId,
|
||||
buildActionResultMessage({
|
||||
relatedOperationId: operationId,
|
||||
text: params.changeSummaryService.buildSummary({
|
||||
action: 'update_draft_card',
|
||||
cardId: payload.cardId,
|
||||
changedLabels:
|
||||
updatedDetail?.sections
|
||||
.filter((section) => changedSectionIds.has(section.id))
|
||||
.map((section) => section.label) ?? [],
|
||||
draftProfile: nextDraftProfile,
|
||||
}),
|
||||
}),
|
||||
);
|
||||
|
||||
await updateOperation({
|
||||
status: 'completed',
|
||||
phaseLabel: '草稿设定已保存',
|
||||
phaseDetail: `「${updatedDetail?.title || '当前卡片'}」的设定已经同步更新。`,
|
||||
progress: 100,
|
||||
error: null,
|
||||
});
|
||||
} catch (error) {
|
||||
await updateOperation({
|
||||
status: 'failed',
|
||||
phaseLabel: '保存失败',
|
||||
phaseDetail: '这次草稿编辑没有成功写回到底稿。',
|
||||
progress: 100,
|
||||
error:
|
||||
error instanceof Error ? error.message : 'update draft card failed',
|
||||
});
|
||||
}
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user