diff --git a/src/games/storywriter/assets/editor.module.css b/src/games/storywriter/assets/editor.module.css index 180eb5e..04878ff 100644 --- a/src/games/storywriter/assets/editor.module.css +++ b/src/games/storywriter/assets/editor.module.css @@ -19,11 +19,20 @@ align-items: center; justify-content: center; gap: 8px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + box-sizing: border-box; + width: 100%; + min-width: 0; } .titleWorld { color: var(--text-muted); font-weight: normal; + min-width: 0; + overflow: hidden; + text-overflow: ellipsis; } .titleSep { @@ -151,6 +160,15 @@ } .title { - padding: 0 16px 16px; + padding: 0 16px 12px; + font-size: 22px; + } + + .titleSep { + font-size: 18px; + } + + .editor { + padding-top: 12px; } } diff --git a/src/games/storywriter/components/chat-sidebar.tsx b/src/games/storywriter/components/chat-sidebar.tsx index 7ee3ca5..553fe95 100644 --- a/src/games/storywriter/components/chat-sidebar.tsx +++ b/src/games/storywriter/components/chat-sidebar.tsx @@ -129,10 +129,14 @@ export const ChatPanel = () => { return () => clearTimeout(timeoutId); }, [currentStory, connection, model, input, currentStory?.chatMessages.length]); - const sendMessage = useCallback(async (newMessages: ChatMessage[]) => { + const sendMessage = useCallback(async ( + newMessages: Iterable, + excludedMessageIds: string[] = [], + ) => { if (!currentStory || !currentWorld || !connection || !model) return; for (const message of newMessages) { + if (excludedMessageIds.includes(message.id)) continue; dispatch({ type: 'ADD_CHAT_MESSAGE', worldId: currentWorld.id, @@ -154,7 +158,7 @@ export const ChatPanel = () => { }, }); - const request = Prompt.compilePrompt(appStateRef.current, newMessages); + const request = Prompt.compilePrompt(appStateRef.current, newMessages, excludedMessageIds); if (!request) { setError('Failed to compile prompt'); @@ -345,7 +349,7 @@ export const ChatPanel = () => { const handleRegenerate = useCallback(async () => { if (!currentStory || !connection || !model || isLoading) return; - + // Only regenerate if last message is assistant const lastMessage = currentStory.chatMessages.at(-1); if (!lastMessage || lastMessage.role !== 'assistant') return; @@ -363,9 +367,7 @@ export const ChatPanel = () => { messageId: lastMessage.id, }); - // Find the message history before the deleted assistant message - const messages = currentStory.chatMessages.slice(0, -1); - await sendMessage(messages); + await sendMessage([], [lastMessage.id]); } finally { setIsLoading(false); } @@ -389,16 +391,15 @@ export const ChatPanel = () => { ) : (
- {currentStory.chatMessages.map((message, index) => { + {currentStory.chatMessages.map((message) => { const isEditing = editingMessageId === message.id; const canEdit = message.role === 'user' || message.role === 'assistant'; - const canDelete = index < currentStory.chatMessages.length - 1 || message.role === 'user' || message.role === 'assistant'; return (
- + {!isLoading && canEdit && (