Skip to content

Commit d11d3df

Browse files
committed
one more fix
1 parent 09f06cb commit d11d3df

File tree

3 files changed

+64
-1
lines changed

3 files changed

+64
-1
lines changed

apps/sim/app/workspace/[workspaceId]/home/hooks/use-chat.ts

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ import { getNextWorkflowColor } from '@/lib/workflows/colors'
7777
import { getQueryClient } from '@/app/_shell/providers/get-query-client'
7878
import { invalidateResourceQueries } from '@/app/workspace/[workspaceId]/home/components/mothership-view/components/resource-registry'
7979
import {
80+
buildCompletedPreviewSessions,
8081
type FilePreviewSessionsState,
8182
INITIAL_FILE_PREVIEW_SESSIONS_STATE,
8283
reduceFilePreviewSessions,
@@ -766,6 +767,18 @@ export function useChat(
766767
[completePreviewSession, syncPreviewSessionRefs]
767768
)
768769

770+
const reconcileTerminalPreviewSessions = useCallback(() => {
771+
const completedAt = new Date().toISOString()
772+
const completedSessions = buildCompletedPreviewSessions(
773+
previewSessionsStateRef.current.sessions,
774+
completedAt
775+
)
776+
777+
for (const session of completedSessions) {
778+
applyCompletedPreviewSession(session)
779+
}
780+
}, [applyCompletedPreviewSession])
781+
769782
const removePreviewSessionImmediate = useCallback(
770783
(sessionId: string) => {
771784
const nextState = reduceFilePreviewSessions(previewSessionsStateRef.current, {
@@ -2305,6 +2318,7 @@ export function useChat(
23052318

23062319
const finalize = useCallback(
23072320
(options?: { error?: boolean }) => {
2321+
reconcileTerminalPreviewSessions()
23082322
sendingRef.current = false
23092323
setIsSending(false)
23102324
setIsReconnecting(false)
@@ -2333,7 +2347,7 @@ export function useChat(
23332347
})
23342348
}
23352349
},
2336-
[invalidateChatQueries]
2350+
[invalidateChatQueries, reconcileTerminalPreviewSessions]
23372351
)
23382352
finalizeRef.current = finalize
23392353

apps/sim/app/workspace/[workspaceId]/home/hooks/use-file-preview-sessions.test.tsx

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import { describe, expect, it } from 'vitest'
55
import type { FilePreviewSession } from '@/lib/copilot/request/session'
66
import {
7+
buildCompletedPreviewSessions,
78
INITIAL_FILE_PREVIEW_SESSIONS_STATE,
89
reduceFilePreviewSessions,
910
} from '@/app/workspace/[workspaceId]/home/hooks/use-file-preview-sessions'
@@ -30,6 +31,40 @@ function createSession(
3031
}
3132

3233
describe('reduceFilePreviewSessions', () => {
34+
it('builds complete sessions for terminal stream reconciliation', () => {
35+
const completedAt = '2026-04-10T00:00:10.000Z'
36+
const nextSessions = buildCompletedPreviewSessions(
37+
{
38+
'preview-1': createSession({
39+
id: 'preview-1',
40+
toolCallId: 'preview-1',
41+
status: 'pending',
42+
previewText: 'draft',
43+
}),
44+
'preview-2': createSession({
45+
id: 'preview-2',
46+
toolCallId: 'preview-2',
47+
status: 'streaming',
48+
previewText: 'partial',
49+
}),
50+
'preview-3': createSession({
51+
id: 'preview-3',
52+
toolCallId: 'preview-3',
53+
status: 'complete',
54+
previewText: 'done',
55+
completedAt: '2026-04-10T00:00:03.000Z',
56+
}),
57+
},
58+
completedAt
59+
)
60+
61+
expect(nextSessions).toHaveLength(2)
62+
expect(nextSessions.map((session) => session.id)).toEqual(['preview-1', 'preview-2'])
63+
expect(nextSessions.every((session) => session.status === 'complete')).toBe(true)
64+
expect(nextSessions.every((session) => session.updatedAt === completedAt)).toBe(true)
65+
expect(nextSessions.every((session) => session.completedAt === completedAt)).toBe(true)
66+
})
67+
3368
it('hydrates the latest active preview session', () => {
3469
const state = reduceFilePreviewSessions(INITIAL_FILE_PREVIEW_SESSIONS_STATE, {
3570
type: 'hydrate',

apps/sim/app/workspace/[workspaceId]/home/hooks/use-file-preview-sessions.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,20 @@ export function pickActiveSessionId(
4848
return latestActive?.id ?? null
4949
}
5050

51+
export function buildCompletedPreviewSessions(
52+
sessions: Record<string, FilePreviewSession>,
53+
completedAt: string
54+
): FilePreviewSession[] {
55+
return Object.values(sessions)
56+
.filter((session) => session.status !== 'complete')
57+
.map((session) => ({
58+
...session,
59+
status: 'complete' as const,
60+
updatedAt: completedAt,
61+
completedAt,
62+
}))
63+
}
64+
5165
export function reduceFilePreviewSessions(
5266
state: FilePreviewSessionsState,
5367
action: FilePreviewSessionsAction

0 commit comments

Comments
 (0)