mirror of
https://github.com/simstudioai/sim.git
synced 2026-01-20 04:17:57 -05:00
Compare commits
2 Commits
fix/termin
...
fix/copilo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3ab9b91445 | ||
|
|
a36bdd8729 |
@@ -93,10 +93,14 @@ function calculateAdaptiveDelay(displayedLength: number, totalLength: number): n
|
|||||||
*/
|
*/
|
||||||
export const SmoothStreamingText = memo(
|
export const SmoothStreamingText = memo(
|
||||||
({ content, isStreaming }: SmoothStreamingTextProps) => {
|
({ content, isStreaming }: SmoothStreamingTextProps) => {
|
||||||
const [displayedContent, setDisplayedContent] = useState('')
|
// Initialize with full content when not streaming to avoid flash on page load
|
||||||
|
const [displayedContent, setDisplayedContent] = useState(() =>
|
||||||
|
isStreaming ? '' : content
|
||||||
|
)
|
||||||
const contentRef = useRef(content)
|
const contentRef = useRef(content)
|
||||||
const rafRef = useRef<number | null>(null)
|
const rafRef = useRef<number | null>(null)
|
||||||
const indexRef = useRef(0)
|
// Initialize index based on streaming state
|
||||||
|
const indexRef = useRef(isStreaming ? 0 : content.length)
|
||||||
const lastFrameTimeRef = useRef<number>(0)
|
const lastFrameTimeRef = useRef<number>(0)
|
||||||
const isAnimatingRef = useRef(false)
|
const isAnimatingRef = useRef(false)
|
||||||
|
|
||||||
|
|||||||
@@ -46,12 +46,16 @@ interface SmoothThinkingTextProps {
|
|||||||
*/
|
*/
|
||||||
const SmoothThinkingText = memo(
|
const SmoothThinkingText = memo(
|
||||||
({ content, isStreaming }: SmoothThinkingTextProps) => {
|
({ content, isStreaming }: SmoothThinkingTextProps) => {
|
||||||
const [displayedContent, setDisplayedContent] = useState('')
|
// Initialize with full content when not streaming to avoid flash on page load
|
||||||
|
const [displayedContent, setDisplayedContent] = useState(() =>
|
||||||
|
isStreaming ? '' : content
|
||||||
|
)
|
||||||
const [showGradient, setShowGradient] = useState(false)
|
const [showGradient, setShowGradient] = useState(false)
|
||||||
const contentRef = useRef(content)
|
const contentRef = useRef(content)
|
||||||
const textRef = useRef<HTMLDivElement>(null)
|
const textRef = useRef<HTMLDivElement>(null)
|
||||||
const rafRef = useRef<number | null>(null)
|
const rafRef = useRef<number | null>(null)
|
||||||
const indexRef = useRef(0)
|
// Initialize index based on streaming state
|
||||||
|
const indexRef = useRef(isStreaming ? 0 : content.length)
|
||||||
const lastFrameTimeRef = useRef<number>(0)
|
const lastFrameTimeRef = useRef<number>(0)
|
||||||
const isAnimatingRef = useRef(false)
|
const isAnimatingRef = useRef(false)
|
||||||
|
|
||||||
|
|||||||
@@ -422,7 +422,8 @@ function abortAllInProgressTools(set: any, get: () => CopilotStore) {
|
|||||||
* Loads messages from DB for UI rendering.
|
* Loads messages from DB for UI rendering.
|
||||||
* Messages are stored exactly as they render, so we just need to:
|
* Messages are stored exactly as they render, so we just need to:
|
||||||
* 1. Register client tool instances for any tool calls
|
* 1. Register client tool instances for any tool calls
|
||||||
* 2. Return the messages as-is
|
* 2. Clear any streaming flags (messages loaded from DB are never actively streaming)
|
||||||
|
* 3. Return the messages
|
||||||
*/
|
*/
|
||||||
function normalizeMessagesForUI(messages: CopilotMessage[]): CopilotMessage[] {
|
function normalizeMessagesForUI(messages: CopilotMessage[]): CopilotMessage[] {
|
||||||
try {
|
try {
|
||||||
@@ -438,23 +439,57 @@ function normalizeMessagesForUI(messages: CopilotMessage[]): CopilotMessage[] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Register client tool instances for all tool calls so they can be looked up
|
// Register client tool instances and clear streaming flags for all tool calls
|
||||||
for (const message of messages) {
|
for (const message of messages) {
|
||||||
|
// Clear from contentBlocks (current format)
|
||||||
if (message.contentBlocks) {
|
if (message.contentBlocks) {
|
||||||
for (const block of message.contentBlocks as any[]) {
|
for (const block of message.contentBlocks as any[]) {
|
||||||
if (block?.type === 'tool_call' && block.toolCall) {
|
if (block?.type === 'tool_call' && block.toolCall) {
|
||||||
registerToolCallInstances(block.toolCall)
|
registerToolCallInstances(block.toolCall)
|
||||||
|
clearStreamingFlags(block.toolCall)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Clear from toolCalls array (legacy format)
|
||||||
|
if (message.toolCalls) {
|
||||||
|
for (const toolCall of message.toolCalls) {
|
||||||
|
registerToolCallInstances(toolCall)
|
||||||
|
clearStreamingFlags(toolCall)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Return messages as-is - they're already in the correct format for rendering
|
// Return messages - they're already in the correct format for rendering
|
||||||
return messages
|
return messages
|
||||||
} catch {
|
} catch {
|
||||||
return messages
|
return messages
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recursively clears streaming flags from a tool call and its nested subagent tool calls.
|
||||||
|
* This ensures messages loaded from DB don't appear to be streaming.
|
||||||
|
*/
|
||||||
|
function clearStreamingFlags(toolCall: any): void {
|
||||||
|
if (!toolCall) return
|
||||||
|
|
||||||
|
// Always set subAgentStreaming to false - messages loaded from DB are never streaming
|
||||||
|
toolCall.subAgentStreaming = false
|
||||||
|
|
||||||
|
// Clear nested subagent tool calls
|
||||||
|
if (Array.isArray(toolCall.subAgentBlocks)) {
|
||||||
|
for (const block of toolCall.subAgentBlocks) {
|
||||||
|
if (block?.type === 'subagent_tool_call' && block.toolCall) {
|
||||||
|
clearStreamingFlags(block.toolCall)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (Array.isArray(toolCall.subAgentToolCalls)) {
|
||||||
|
for (const subTc of toolCall.subAgentToolCalls) {
|
||||||
|
clearStreamingFlags(subTc)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Recursively registers client tool instances for a tool call and its nested subagent tool calls.
|
* Recursively registers client tool instances for a tool call and its nested subagent tool calls.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user