Merge branch 'codex/backend-rewrite-spacetimedb' of http://82.157.175.59:3000/GenarrativeAI/Genarrative into codex/backend-rewrite-spacetimedb

This commit is contained in:
2026-04-25 13:44:56 +08:00
41 changed files with 1049 additions and 195 deletions

View File

@@ -0,0 +1,58 @@
import { expect, test } from 'vitest';
import {
CREATION_AGENT_QUICK_FILL_MESSAGE,
buildCreationAgentChatMessage,
createCreationAgentChatQuickActions,
resolveCreationAgentQuickActionMessage,
} from './creationAgentChat';
test('creation agent chat exposes the unified summary and quick fill actions', () => {
expect(createCreationAgentChatQuickActions()).toEqual([
{
key: 'summarize',
label: '总结当前设定',
},
{
key: 'quickFill',
label: '补充剩余设定',
minTurn: 2,
},
]);
});
test('creation agent chat resolves quick actions through one message contract', () => {
expect(
resolveCreationAgentQuickActionMessage('quickFill', '请总结当前设定。'),
).toEqual({
text: CREATION_AGENT_QUICK_FILL_MESSAGE,
quickFillRequested: true,
});
expect(
resolveCreationAgentQuickActionMessage('summarize', '请总结当前设定。'),
).toEqual({
text: '请总结当前设定。',
quickFillRequested: false,
});
});
test('creation agent chat builds shared message payload with genre extras', () => {
expect(
buildCreationAgentChatMessage({
clientMessageId: 'message-1',
text: '请补充剩余设定。',
quickFillRequested: true,
extraPayload: {
focusCardId: null,
selectedCardIds: [],
},
}),
).toEqual({
clientMessageId: 'message-1',
text: '请补充剩余设定。',
quickFillRequested: true,
focusCardId: null,
selectedCardIds: [],
});
});

View File

@@ -0,0 +1,63 @@
export const CREATION_AGENT_SUMMARY_ACTION_KEY = 'summarize';
export const CREATION_AGENT_QUICK_FILL_ACTION_KEY = 'quickFill';
export const CREATION_AGENT_SUMMARY_ACTION_LABEL = '总结当前设定';
export const CREATION_AGENT_QUICK_FILL_ACTION_LABEL = '补充剩余设定';
export const CREATION_AGENT_QUICK_FILL_MESSAGE = '请补充剩余设定。';
type CreationAgentChatQuickAction = {
key: string;
label: string;
minTurn?: number;
};
type CreationAgentChatMessageBase = {
clientMessageId: string;
text: string;
quickFillRequested?: boolean;
};
export function createCreationAgentChatQuickActions(): CreationAgentChatQuickAction[] {
return [
{
key: CREATION_AGENT_SUMMARY_ACTION_KEY,
label: CREATION_AGENT_SUMMARY_ACTION_LABEL,
},
{
key: CREATION_AGENT_QUICK_FILL_ACTION_KEY,
label: CREATION_AGENT_QUICK_FILL_ACTION_LABEL,
minTurn: 2,
},
];
}
export function resolveCreationAgentQuickActionMessage(
actionKey: string,
summaryMessage: string,
) {
const quickFillRequested = actionKey === CREATION_AGENT_QUICK_FILL_ACTION_KEY;
return {
text: quickFillRequested ? CREATION_AGENT_QUICK_FILL_MESSAGE : summaryMessage,
quickFillRequested,
};
}
export function buildCreationAgentChatMessage<TExtraPayload extends object = Record<string, never>>({
clientMessageId,
text,
quickFillRequested = false,
extraPayload,
}: {
clientMessageId: string;
text: string;
quickFillRequested?: boolean;
extraPayload?: TExtraPayload;
}): CreationAgentChatMessageBase & TExtraPayload {
return {
...(extraPayload ?? ({} as TExtraPayload)),
clientMessageId,
text,
quickFillRequested,
};
}

View File

@@ -1,2 +1,3 @@
export * from './creationAgentChat';
export * from './creationAgentProgress';
export * from './creationAgentSse';

View File

@@ -68,7 +68,7 @@ function buildInitialBoard(gridSize: PuzzleGridSize): PuzzleBoardSnapshot {
const pieces = Array.from({ length: gridSize * gridSize }, (_, index) => {
const correctRow = Math.floor(index / gridSize);
const correctCol = index % gridSize;
const current = shuffledPositions[index];
const current = shuffledPositions[index] ?? { row: correctRow, col: correctCol };
return {
pieceId: `piece-${index}`,
correctRow,