321 lines
10 KiB
TypeScript
321 lines
10 KiB
TypeScript
import type {
|
|
JumpHopActionRequest,
|
|
JumpHopSessionSnapshotResponse,
|
|
JumpHopWorkspaceCreateRequest,
|
|
} from '../../../packages/shared/src/contracts/jumpHop';
|
|
import type {
|
|
CreateMatch3DSessionRequest,
|
|
Match3DAgentSessionSnapshot,
|
|
} from '../../../packages/shared/src/contracts/match3dAgent';
|
|
import type { Match3DWorkSummary } from '../../../packages/shared/src/contracts/match3dWorks';
|
|
import type { PuzzleAgentActionRequest } from '../../../packages/shared/src/contracts/puzzleAgentActions';
|
|
import type {
|
|
PuzzleDraftLevel,
|
|
PuzzleResultDraft,
|
|
} from '../../../packages/shared/src/contracts/puzzleAgentDraft';
|
|
import type {
|
|
CreatePuzzleAgentSessionRequest,
|
|
PuzzleAgentSessionSnapshot,
|
|
} from '../../../packages/shared/src/contracts/puzzleAgentSession';
|
|
import type { PuzzleWorkSummary } from '../../../packages/shared/src/contracts/puzzleWorkSummary';
|
|
import type {
|
|
WoodenFishActionRequest,
|
|
WoodenFishSessionSnapshotResponse,
|
|
WoodenFishWorkspaceCreateRequest,
|
|
} from '../../../packages/shared/src/contracts/woodenFish';
|
|
|
|
export type PuzzleWorkUpdatePayload = {
|
|
workTitle?: string;
|
|
workDescription?: string;
|
|
levelName: string;
|
|
summary: string;
|
|
themeTags: string[];
|
|
coverImageSrc?: string | null;
|
|
coverAssetId?: string | null;
|
|
levels: PuzzleDraftLevel[];
|
|
};
|
|
|
|
export function buildPuzzleFormPayloadFromWork(
|
|
item: PuzzleWorkSummary,
|
|
): CreatePuzzleAgentSessionRequest {
|
|
const pictureDescription =
|
|
item.workDescription?.trim() ||
|
|
item.summary?.trim() ||
|
|
item.levels?.[0]?.pictureDescription?.trim() ||
|
|
item.levelName?.trim() ||
|
|
item.workTitle?.trim() ||
|
|
'';
|
|
|
|
return {
|
|
seedText: pictureDescription,
|
|
workTitle: item.workTitle?.trim() || item.levelName?.trim() || undefined,
|
|
workDescription: item.workDescription?.trim() || item.summary?.trim(),
|
|
pictureDescription,
|
|
referenceImageSrc: null,
|
|
referenceImageSrcs: [],
|
|
referenceImageAssetObjectId: null,
|
|
referenceImageAssetObjectIds: [],
|
|
imageModel: null,
|
|
aiRedraw: true,
|
|
};
|
|
}
|
|
|
|
export function buildPuzzleWorkUpdatePayloadFromDraft(
|
|
draft: PuzzleResultDraft,
|
|
): PuzzleWorkUpdatePayload {
|
|
return {
|
|
workTitle: draft.workTitle,
|
|
workDescription: draft.workDescription,
|
|
levelName: draft.levelName,
|
|
summary: draft.summary,
|
|
themeTags: draft.themeTags,
|
|
coverImageSrc: draft.coverImageSrc,
|
|
coverAssetId: draft.coverAssetId,
|
|
levels: draft.levels ?? [],
|
|
};
|
|
}
|
|
|
|
export function buildJumpHopDraftActionPayload(
|
|
actionType: 'compile-draft' | 'regenerate-tiles',
|
|
input: {
|
|
payload?: JumpHopWorkspaceCreateRequest | null;
|
|
draft?: JumpHopSessionSnapshotResponse['draft'] | null;
|
|
},
|
|
): JumpHopActionRequest {
|
|
const { payload, draft } = input;
|
|
return {
|
|
actionType,
|
|
workTitle: payload?.workTitle ?? draft?.workTitle,
|
|
workDescription: payload?.workDescription ?? draft?.workDescription,
|
|
themeTags: payload?.themeTags ?? draft?.themeTags,
|
|
difficulty: payload?.difficulty ?? draft?.difficulty,
|
|
stylePreset: payload?.stylePreset ?? draft?.stylePreset,
|
|
characterPrompt: payload?.characterPrompt ?? draft?.characterPrompt,
|
|
tilePrompt: payload?.tilePrompt ?? draft?.tilePrompt,
|
|
endMoodPrompt: payload?.endMoodPrompt ?? draft?.endMoodPrompt,
|
|
};
|
|
}
|
|
|
|
export function buildWoodenFishDraftActionPayload(
|
|
actionType: 'compile-draft' | 'regenerate-hit-object',
|
|
input: {
|
|
payload?: WoodenFishWorkspaceCreateRequest | null;
|
|
draft?: WoodenFishSessionSnapshotResponse['draft'] | null;
|
|
},
|
|
): WoodenFishActionRequest {
|
|
const { payload, draft } = input;
|
|
return {
|
|
actionType,
|
|
workTitle: payload?.workTitle ?? draft?.workTitle,
|
|
workDescription: payload?.workDescription ?? draft?.workDescription,
|
|
themeTags: payload?.themeTags ?? draft?.themeTags,
|
|
hitObjectPrompt: payload?.hitObjectPrompt ?? draft?.hitObjectPrompt,
|
|
hitObjectReferenceImageSrc:
|
|
payload?.hitObjectReferenceImageSrc ??
|
|
draft?.hitObjectReferenceImageSrc,
|
|
hitSoundAsset: payload?.hitSoundAsset ?? draft?.hitSoundAsset,
|
|
floatingWords: payload?.floatingWords ?? draft?.floatingWords,
|
|
};
|
|
}
|
|
|
|
function parseOptionalFiniteNumber(value: string | number | null | undefined) {
|
|
if (typeof value === 'number') {
|
|
return Number.isFinite(value) ? value : undefined;
|
|
}
|
|
|
|
const normalizedValue = value?.trim();
|
|
if (!normalizedValue) {
|
|
return undefined;
|
|
}
|
|
|
|
const parsedValue = Number(normalizedValue);
|
|
return Number.isFinite(parsedValue) ? parsedValue : undefined;
|
|
}
|
|
|
|
export function buildMatch3DFormPayloadFromSession(
|
|
session: Match3DAgentSessionSnapshot,
|
|
): CreateMatch3DSessionRequest {
|
|
const themeText =
|
|
session.config?.themeText?.trim() ||
|
|
session.draft?.themeText?.trim() ||
|
|
session.anchorPack.theme.value.trim() ||
|
|
'';
|
|
|
|
return {
|
|
seedText: themeText,
|
|
themeText,
|
|
referenceImageSrc:
|
|
session.config?.referenceImageSrc ??
|
|
session.draft?.referenceImageSrc ??
|
|
null,
|
|
clearCount:
|
|
session.config?.clearCount ??
|
|
session.draft?.clearCount ??
|
|
parseOptionalFiniteNumber(session.anchorPack.clearCount.value) ??
|
|
undefined,
|
|
difficulty:
|
|
session.config?.difficulty ??
|
|
session.draft?.difficulty ??
|
|
parseOptionalFiniteNumber(session.anchorPack.difficulty.value) ??
|
|
undefined,
|
|
assetStyleId: session.config?.assetStyleId ?? null,
|
|
assetStyleLabel: session.config?.assetStyleLabel ?? null,
|
|
assetStylePrompt: session.config?.assetStylePrompt ?? null,
|
|
generateClickSound: session.config?.generateClickSound,
|
|
};
|
|
}
|
|
|
|
export function buildMatch3DFormPayloadFromWork(
|
|
item: Match3DWorkSummary,
|
|
): CreateMatch3DSessionRequest {
|
|
const themeText = item.themeText?.trim() || item.gameName?.trim() || '';
|
|
return {
|
|
seedText: themeText,
|
|
themeText,
|
|
referenceImageSrc: item.referenceImageSrc ?? null,
|
|
clearCount: item.clearCount,
|
|
difficulty: item.difficulty,
|
|
};
|
|
}
|
|
|
|
export function buildPuzzleCompileActionFromFormPayload(
|
|
payload: CreatePuzzleAgentSessionRequest | null,
|
|
): PuzzleAgentActionRequest {
|
|
const pictureDescription =
|
|
payload?.pictureDescription?.trim() || payload?.seedText?.trim();
|
|
const workTitle = payload?.workTitle?.trim();
|
|
const workDescription = payload?.workDescription?.trim() || pictureDescription;
|
|
|
|
return {
|
|
action: 'compile_puzzle_draft',
|
|
promptText: pictureDescription,
|
|
...(workTitle ? { workTitle } : {}),
|
|
...(workDescription ? { workDescription } : {}),
|
|
...(pictureDescription ? { pictureDescription } : {}),
|
|
referenceImageSrc: payload?.referenceImageSrc || null,
|
|
referenceImageSrcs: payload?.referenceImageSrcs ?? [],
|
|
referenceImageAssetObjectId: payload?.referenceImageAssetObjectId ?? null,
|
|
referenceImageAssetObjectIds: payload?.referenceImageAssetObjectIds ?? [],
|
|
imageModel: payload?.imageModel ?? null,
|
|
aiRedraw: payload?.aiRedraw ?? true,
|
|
candidateCount: 1,
|
|
};
|
|
}
|
|
|
|
export function buildPuzzleFormPayloadFromSession(
|
|
session: PuzzleAgentSessionSnapshot,
|
|
): CreatePuzzleAgentSessionRequest {
|
|
const formDraft = session.draft?.formDraft;
|
|
const pictureDescription =
|
|
formDraft?.pictureDescription?.trim() ||
|
|
session.draft?.levels?.[0]?.pictureDescription?.trim() ||
|
|
session.anchorPack.visualSubject.value.trim() ||
|
|
session.seedText?.trim() ||
|
|
'';
|
|
const workTitle =
|
|
formDraft?.workTitle?.trim() || session.draft?.workTitle?.trim();
|
|
const workDescription =
|
|
formDraft?.workDescription?.trim() ||
|
|
session.draft?.workDescription?.trim() ||
|
|
session.draft?.summary?.trim() ||
|
|
pictureDescription;
|
|
|
|
return {
|
|
seedText: pictureDescription,
|
|
...(workTitle ? { workTitle } : {}),
|
|
...(workDescription ? { workDescription } : {}),
|
|
pictureDescription,
|
|
referenceImageSrc: null,
|
|
referenceImageSrcs: [],
|
|
referenceImageAssetObjectId: null,
|
|
referenceImageAssetObjectIds: [],
|
|
imageModel: null,
|
|
aiRedraw: true,
|
|
};
|
|
}
|
|
|
|
export function isPuzzleFormOnlyDraft(
|
|
session: PuzzleAgentSessionSnapshot | null,
|
|
) {
|
|
return Boolean(
|
|
session?.stage === 'collecting_anchors' && session.draft?.formDraft,
|
|
);
|
|
}
|
|
|
|
export function isEmptyPuzzleFormOnlyDraft(
|
|
session: PuzzleAgentSessionSnapshot | null,
|
|
) {
|
|
if (!isPuzzleFormOnlyDraft(session)) {
|
|
return false;
|
|
}
|
|
|
|
const formDraft = session?.draft?.formDraft;
|
|
return !(
|
|
session?.seedText?.trim() ||
|
|
formDraft?.workTitle?.trim() ||
|
|
formDraft?.workDescription?.trim() ||
|
|
formDraft?.pictureDescription?.trim()
|
|
);
|
|
}
|
|
|
|
export function buildPendingPuzzleDraftMetadata(
|
|
payload: CreatePuzzleAgentSessionRequest | null | undefined,
|
|
) {
|
|
const title = payload?.workTitle?.trim();
|
|
const summary =
|
|
payload?.workDescription?.trim() ||
|
|
payload?.pictureDescription?.trim() ||
|
|
payload?.seedText?.trim();
|
|
return {
|
|
...(title ? { title } : {}),
|
|
...(summary ? { summary } : {}),
|
|
};
|
|
}
|
|
|
|
export function buildPendingMatch3DDraftMetadata(
|
|
payload: CreateMatch3DSessionRequest | null | undefined,
|
|
) {
|
|
const themeText = payload?.themeText?.trim() || payload?.seedText?.trim();
|
|
return {
|
|
...(themeText ? { title: themeText, summary: themeText } : {}),
|
|
};
|
|
}
|
|
|
|
export function buildPuzzleFormPayloadFromAction(
|
|
payload: PuzzleAgentActionRequest,
|
|
): CreatePuzzleAgentSessionRequest | null {
|
|
if (
|
|
payload.action !== 'compile_puzzle_draft' &&
|
|
payload.action !== 'save_puzzle_form_draft'
|
|
) {
|
|
return null;
|
|
}
|
|
|
|
const workTitle = payload.workTitle?.trim() ?? '';
|
|
const workDescription = payload.workDescription?.trim() ?? '';
|
|
const pictureDescription =
|
|
payload.pictureDescription?.trim() || payload.promptText?.trim() || '';
|
|
|
|
return {
|
|
seedText: pictureDescription,
|
|
...(workTitle ? { workTitle } : {}),
|
|
...(workDescription ? { workDescription } : {}),
|
|
pictureDescription,
|
|
referenceImageSrc:
|
|
payload.action === 'compile_puzzle_draft'
|
|
? (payload.referenceImageSrc ?? null)
|
|
: (payload.referenceImageSrc ?? null),
|
|
referenceImageSrcs: payload.referenceImageSrcs ?? [],
|
|
referenceImageAssetObjectId: payload.referenceImageAssetObjectId ?? null,
|
|
referenceImageAssetObjectIds: payload.referenceImageAssetObjectIds ?? [],
|
|
imageModel:
|
|
payload.action === 'compile_puzzle_draft'
|
|
? (payload.imageModel ?? null)
|
|
: (payload.imageModel ?? null),
|
|
aiRedraw:
|
|
payload.action === 'compile_puzzle_draft'
|
|
? (payload.aiRedraw ?? true)
|
|
: (payload.aiRedraw ?? true),
|
|
};
|
|
}
|