| 87 | * @returns Chat state values, setters, refs |
| 88 | */ |
| 89 | export function useChatState(): UseChatStateReturn { |
| 90 | // Main store selector - uses useShallow to prevent unnecessary re-renders |
| 91 | const { |
| 92 | inputValue, |
| 93 | cursorPosition, |
| 94 | lastEditDueToNav, |
| 95 | setInputValue, |
| 96 | inputFocused, |
| 97 | setInputFocused, |
| 98 | slashSelectedIndex, |
| 99 | setSlashSelectedIndex, |
| 100 | agentSelectedIndex, |
| 101 | setAgentSelectedIndex, |
| 102 | streamingAgents: rawStreamingAgents, |
| 103 | focusedAgentId, |
| 104 | setFocusedAgentId, |
| 105 | messages, |
| 106 | setMessages, |
| 107 | activeSubagents, |
| 108 | isChainInProgress, |
| 109 | agentMode, |
| 110 | setAgentMode, |
| 111 | toggleAgentMode, |
| 112 | isRetrying, |
| 113 | } = useChatStore( |
| 114 | useShallow((store) => ({ |
| 115 | inputValue: store.inputValue, |
| 116 | cursorPosition: store.cursorPosition, |
| 117 | lastEditDueToNav: store.lastEditDueToNav, |
| 118 | setInputValue: store.setInputValue, |
| 119 | inputFocused: store.inputFocused, |
| 120 | setInputFocused: store.setInputFocused, |
| 121 | slashSelectedIndex: store.slashSelectedIndex, |
| 122 | setSlashSelectedIndex: store.setSlashSelectedIndex, |
| 123 | agentSelectedIndex: store.agentSelectedIndex, |
| 124 | setAgentSelectedIndex: store.setAgentSelectedIndex, |
| 125 | streamingAgents: store.streamingAgents, |
| 126 | focusedAgentId: store.focusedAgentId, |
| 127 | setFocusedAgentId: store.setFocusedAgentId, |
| 128 | messages: store.messages, |
| 129 | setMessages: store.setMessages, |
| 130 | activeSubagents: store.activeSubagents, |
| 131 | isChainInProgress: store.isChainInProgress, |
| 132 | agentMode: store.agentMode, |
| 133 | setAgentMode: store.setAgentMode, |
| 134 | toggleAgentMode: store.toggleAgentMode, |
| 135 | isRetrying: store.isRetrying, |
| 136 | })), |
| 137 | ) |
| 138 | |
| 139 | // Additional selector for pending bash messages (separate for performance) |
| 140 | const pendingBashMessages = useChatStore((state) => state.pendingBashMessages) |
| 141 | |
| 142 | // Stabilize streamingAgents reference - only create new Set when content changes |
| 143 | const streamingAgentsKey = useMemo( |
| 144 | () => Array.from(rawStreamingAgents).sort().join(','), |
| 145 | [rawStreamingAgents], |
| 146 | ) |