Skip to content

Commit f235805

Browse files
brandonkachenclaude
andcommitted
refactor: consolidate store improvements and add runState management
- Consolidate enableMapSet() to single call at app initialization - Add runState to chat store for centralized state management - Simplify feedback-container with single useFeedbackStore call - Update use-send-message to save runState to store - Include runState in feedback submission logging These changes improve code organization and set foundation for future simplifications where components can access runState directly from the store instead of extracting from message metadata. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
1 parent 3fabf84 commit f235805

File tree

7 files changed

+25
-11
lines changed

7 files changed

+25
-11
lines changed

cli/src/chat.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ export const Chat = ({
128128
addSessionCredits,
129129
resetChatStore,
130130
sessionCreditsUsed,
131+
setRunState,
131132
} = useChatStore(
132133
useShallow((store) => ({
133134
inputValue: store.inputValue,
@@ -164,6 +165,7 @@ export const Chat = ({
164165
addSessionCredits: store.addSessionCredits,
165166
resetChatStore: store.reset,
166167
sessionCreditsUsed: store.sessionCreditsUsed,
168+
setRunState: store.setRunState,
167169
})),
168170
)
169171

@@ -428,6 +430,7 @@ export const Chat = ({
428430
lastMessageMode,
429431
setLastMessageMode,
430432
addSessionCredits,
433+
setRunState,
431434
isQueuePausedRef,
432435
resumeQueue,
433436
continueChat,

cli/src/components/feedback-container.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export const FeedbackContainer: React.FC<FeedbackContainerProps> = ({
4949
const messages = useChatStore((state) => state.messages)
5050
const agentMode = useChatStore((state) => state.agentMode)
5151
const sessionCreditsUsed = useChatStore((state) => state.sessionCreditsUsed)
52+
const runState = useChatStore((state) => state.runState)
5253

5354
const previousFeedbackModeRef = useRef(feedbackMode)
5455

@@ -86,6 +87,7 @@ export const FeedbackContainer: React.FC<FeedbackContainerProps> = ({
8687
category: feedbackCategory,
8788
type: feedbackMessageId ? 'message' : 'general',
8889
},
90+
...(runState && { runState }),
8991
})
9092

9193
if (feedbackMessageId) {
@@ -106,6 +108,7 @@ export const FeedbackContainer: React.FC<FeedbackContainerProps> = ({
106108
messages,
107109
agentMode,
108110
sessionCreditsUsed,
111+
runState,
109112
markMessageFeedbackSubmitted,
110113
resetFeedbackForm,
111114
closeFeedback,

cli/src/hooks/use-send-message.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,7 @@ interface UseSendMessageOptions {
210210
lastMessageMode: AgentMode | null
211211
setLastMessageMode: (mode: AgentMode | null) => void
212212
addSessionCredits: (credits: number) => void
213+
setRunState: (runState: any | null) => void
213214
isQueuePausedRef?: React.MutableRefObject<boolean>
214215
resumeQueue?: () => void
215216
continueChat: boolean
@@ -244,6 +245,7 @@ export const useSendMessage = ({
244245
lastMessageMode,
245246
setLastMessageMode,
246247
addSessionCredits,
248+
setRunState,
247249
isQueuePausedRef,
248250
resumeQueue,
249251
continueChat,
@@ -259,6 +261,7 @@ export const useSendMessage = ({
259261
const loadedState = loadMostRecentChatState()
260262
if (loadedState) {
261263
previousRunStateRef.current = loadedState.runState
264+
setRunState(loadedState.runState)
262265
setMessages(loadedState.messages)
263266

264267
// Collapse all subagents and tools by default when continuing
@@ -275,7 +278,7 @@ export const useSendMessage = ({
275278
logger.info('No previous chat state found to continue from')
276279
}
277280
}
278-
}, [continueChat, setMessages, setCollapsedAgents])
281+
}, [continueChat, setMessages, setCollapsedAgents, setRunState])
279282
const spawnAgentsMapRef = useRef<
280283
Map<string, { index: number; agentType: string }>
281284
>(new Map())
@@ -1561,7 +1564,8 @@ export const useSendMessage = ({
15611564
})
15621565

15631566
previousRunStateRef.current = runState
1564-
1567+
setRunState(runState)
1568+
15651569
// Save both runState and current messages
15661570
applyMessageUpdate((currentMessages) => {
15671571
saveChatState(runState, currentMessages)

cli/src/index.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ import { validateAgents } from '@codebuff/sdk'
99
import { render } from '@opentui/react'
1010
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
1111
import { Command } from 'commander'
12+
import { enableMapSet } from 'immer'
1213
import React from 'react'
1314

15+
// Enable Map and Set support in Immer globally (once at app initialization)
16+
enableMapSet()
17+
1418
import { App } from './app'
1519
import { initializeThemeStore } from './hooks/use-theme'
1620
import { getProjectRoot } from './project-files'

cli/src/state/chat-store.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { enableMapSet } from 'immer'
21
import { create } from 'zustand'
32
import { immer } from 'zustand/middleware/immer'
43

@@ -31,6 +30,7 @@ export type ChatStoreState = {
3130
hasReceivedPlanResponse: boolean
3231
lastMessageMode: AgentMode | null
3332
sessionCreditsUsed: number
33+
runState: any | null // Using any to avoid Immer type issues with complex RunState type
3434
}
3535

3636
type ChatStoreActions = {
@@ -64,13 +64,12 @@ type ChatStoreActions = {
6464
setHasReceivedPlanResponse: (value: boolean) => void
6565
setLastMessageMode: (mode: AgentMode | null) => void
6666
addSessionCredits: (credits: number) => void
67+
setRunState: (runState: any | null) => void
6768
reset: () => void
6869
}
6970

7071
type ChatStore = ChatStoreState & ChatStoreActions
7172

72-
enableMapSet()
73-
7473
const initialState: ChatStoreState = {
7574
messages: [],
7675
streamingAgents: new Set<string>(),
@@ -89,6 +88,7 @@ const initialState: ChatStoreState = {
8988
hasReceivedPlanResponse: false,
9089
lastMessageMode: null,
9190
sessionCreditsUsed: 0,
91+
runState: null,
9292
}
9393

9494
export const useChatStore = create<ChatStore>()(
@@ -197,6 +197,11 @@ export const useChatStore = create<ChatStore>()(
197197
state.sessionCreditsUsed += credits
198198
}),
199199

200+
setRunState: (runState) =>
201+
set((state) => {
202+
state.runState = runState
203+
}),
204+
200205
reset: () =>
201206
set((state) => {
202207
state.messages = initialState.messages.slice()
@@ -215,6 +220,7 @@ export const useChatStore = create<ChatStore>()(
215220
state.hasReceivedPlanResponse = initialState.hasReceivedPlanResponse
216221
state.lastMessageMode = initialState.lastMessageMode
217222
state.sessionCreditsUsed = initialState.sessionCreditsUsed
223+
state.runState = initialState.runState
218224
}),
219225
})),
220226
)

cli/src/state/feedback-store.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,5 @@
11
import { create } from 'zustand'
22
import { immer } from 'zustand/middleware/immer'
3-
import { enableMapSet } from 'immer'
4-
5-
enableMapSet()
63

74
interface FeedbackState {
85
feedbackMessageId: string | null

cli/src/state/login-store.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { enableMapSet } from 'immer'
21
import { create } from 'zustand'
32
import { immer } from 'zustand/middleware/immer'
43

@@ -43,8 +42,6 @@ type LoginStoreActions = {
4342

4443
type LoginStore = LoginStoreState & LoginStoreActions
4544

46-
enableMapSet()
47-
4845
const initialState: LoginStoreState = {
4946
loginUrl: null,
5047
loading: false,

0 commit comments

Comments
 (0)