135 lines
4.1 KiB
TypeScript
135 lines
4.1 KiB
TypeScript
import type {
|
|
BigFishAnchorItemResponse,
|
|
BigFishSessionSnapshotResponse,
|
|
ExecuteBigFishActionRequest,
|
|
SendBigFishMessageRequest,
|
|
} from '../../../packages/shared/src/contracts/bigFish';
|
|
import {
|
|
buildCreationAgentChatMessage,
|
|
createCreationAgentChatQuickActions,
|
|
createCreationAgentClientMessageId,
|
|
resolveCreationAgentQuickActionMessage,
|
|
} from '../../services/creation-agent';
|
|
import {
|
|
type CreationAgentAnchorView,
|
|
type CreationAgentSessionView,
|
|
type CreationAgentTheme,
|
|
CreationAgentWorkspace,
|
|
} from '../creation-agent';
|
|
|
|
type BigFishAgentWorkspaceProps = {
|
|
session: BigFishSessionSnapshotResponse | null;
|
|
streamingReplyText?: string;
|
|
isStreamingReply?: boolean;
|
|
isBusy?: boolean;
|
|
error?: string | null;
|
|
onBack: () => void;
|
|
onSubmitMessage: (payload: SendBigFishMessageRequest) => void;
|
|
onExecuteAction: (payload: ExecuteBigFishActionRequest) => void;
|
|
showBackButton?: boolean;
|
|
};
|
|
|
|
const BIG_FISH_AGENT_THEME: CreationAgentTheme = {
|
|
accentTextClass: 'text-cyan-100/85',
|
|
accentBgClass: 'bg-cyan-200',
|
|
accentButtonClass: 'bg-cyan-200 shadow-cyan-950/20',
|
|
userBubbleClass: 'bg-cyan-600 text-white',
|
|
heroClass:
|
|
'border border-cyan-100/16 bg-[radial-gradient(circle_at_top_left,rgba(45,212,191,0.22),transparent_32%),linear-gradient(135deg,rgba(8,47,73,0.96),rgba(13,24,38,0.96))]',
|
|
anchorGridClass: 'grid gap-2 sm:grid-cols-4',
|
|
};
|
|
|
|
function mapBigFishAnchor(
|
|
anchor: BigFishAnchorItemResponse,
|
|
): CreationAgentAnchorView {
|
|
return {
|
|
key: anchor.key,
|
|
label: anchor.label,
|
|
value: anchor.value,
|
|
status: anchor.status,
|
|
};
|
|
}
|
|
|
|
function mapBigFishSession(
|
|
session: BigFishSessionSnapshotResponse,
|
|
): CreationAgentSessionView {
|
|
// 中文注释:生成进度与资产完成记录不属于聊天历史,旧会话里的 action_result 也不再渲染为气泡。
|
|
const chatMessages = session.messages.filter(
|
|
(message) =>
|
|
message.kind === 'chat' ||
|
|
message.kind === 'summary' ||
|
|
message.kind === 'warning',
|
|
);
|
|
|
|
return {
|
|
sessionId: session.sessionId,
|
|
// 所有玩法的 Agent 聊天页顶部模块只保留操作与进度,不展示标题和引导副文案。
|
|
title: null,
|
|
assistantSummary: null,
|
|
currentTurn: session.currentTurn,
|
|
progressPercent: session.progressPercent,
|
|
anchors: [
|
|
session.anchorPack.gameplayPromise,
|
|
session.anchorPack.ecologyVisualTheme,
|
|
session.anchorPack.growthLadder,
|
|
session.anchorPack.riskTempo,
|
|
].map(mapBigFishAnchor),
|
|
messages: chatMessages,
|
|
recommendedReplies: [],
|
|
};
|
|
}
|
|
|
|
export function BigFishAgentWorkspace({
|
|
session,
|
|
streamingReplyText = '',
|
|
isStreamingReply = false,
|
|
isBusy = false,
|
|
error = null,
|
|
onBack,
|
|
onSubmitMessage,
|
|
onExecuteAction,
|
|
showBackButton = true,
|
|
}: BigFishAgentWorkspaceProps) {
|
|
return (
|
|
<CreationAgentWorkspace
|
|
session={session ? mapBigFishSession(session) : null}
|
|
theme={BIG_FISH_AGENT_THEME}
|
|
loadingText="正在准备大鱼吃小鱼共创工作区..."
|
|
composerPlaceholder="说说这局的生态、成长或爽点..."
|
|
primaryActionLabel="生成结果页"
|
|
streamingReplyText={streamingReplyText}
|
|
isStreamingReply={isStreamingReply}
|
|
isBusy={isBusy}
|
|
error={error}
|
|
quickActions={createCreationAgentChatQuickActions()}
|
|
showBackButton={showBackButton}
|
|
onBack={onBack}
|
|
onSubmitText={(text) => {
|
|
onSubmitMessage(
|
|
buildCreationAgentChatMessage({
|
|
clientMessageId: createCreationAgentClientMessageId('big-fish'),
|
|
text,
|
|
}),
|
|
);
|
|
}}
|
|
onPrimaryAction={() => {
|
|
onExecuteAction({ action: 'big_fish_compile_draft' });
|
|
}}
|
|
onQuickAction={(action) => {
|
|
const quickActionMessage = resolveCreationAgentQuickActionMessage(
|
|
action.key,
|
|
'请总结一下当前已经成形的大鱼吃小鱼设定。',
|
|
);
|
|
onSubmitMessage(
|
|
buildCreationAgentChatMessage({
|
|
clientMessageId: createCreationAgentClientMessageId('big-fish'),
|
|
...quickActionMessage,
|
|
}),
|
|
);
|
|
}}
|
|
/>
|
|
);
|
|
}
|
|
|
|
export default BigFishAgentWorkspace;
|