Skip to content

Commit 38a8257

Browse files
Track AssistantState & disable input on non-idle
1 parent 5457642 commit 38a8257

File tree

3 files changed

+22
-7
lines changed

3 files changed

+22
-7
lines changed

src/components/AssistantView.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import ProfilePictureView from './ProfilePictureView';
88
import SessionController, { SessionControllerEventListener } from '../controllers/SessionController';
99
import TablePreview from '../table/TablePreview';
1010

11+
import { AssistantState } from '../models/AssistantState';
1112
import { ChatMessage } from '../models/ChatMessage';
1213
import { SessionState } from '../models/SessionState';
1314
import { TableInfo } from '../models/TableInfo';
@@ -171,7 +172,7 @@ class AssistantView extends React.Component<Props, State> implements SessionCont
171172
const { isProcessing, sessionState } = this.state;
172173
const opacity = (isProcessing || sessionState != 'ready') ? 0.5 : 1;
173174
const inlineInputStyle = { border: 'solid', borderWidth: '1px', padding: '12px', borderColor: '#0000000D',
174-
width: '100%', borderRadius: '6px', background: '#00000005', height: '36px', opacity };
175+
width: '100%', borderRadius: '6px', background: '#00000005', height: '36px' };
175176
return <div ref={this.inputContainerRef} style={styles.inputContainer}>
176177
<InlineInput ref={this.inputRef} placeholder="Type here..." style={{ ...inlineInputStyle, ...inputStyle }} onEnter={this.sendChatMessage} />
177178
<div style={{ ...styles.sendButton, ...{ width: '96px', opacity }, ...sendButtonStyle }} onClick={this.sendChatMessage}>Send</div>
@@ -198,6 +199,10 @@ class AssistantView extends React.Component<Props, State> implements SessionCont
198199
this.setState({ sessionState });
199200
}
200201

202+
onAssistantStateUpdated(assistantState: AssistantState) {
203+
this.setState({ isProcessing: (assistantState != 'idle') });
204+
}
205+
201206
onChatMessagesUpdated(chatMessages: ChatMessage[]) {
202207
this.setState({ chatMessages });
203208
setTimeout(() => {

src/controllers/SessionController.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import Server from "../networking/Server";
22

33
import UUIDUtilities from "../utilities/UUIDUtilities";
44

5+
import { AssistantState } from "../models/AssistantState";
56
import { ChatMessage } from "../models/ChatMessage";
67
import { SessionState } from "../models/SessionState";
78
import { SLWebSocket, SLWebSocketEventListener } from "../networking/WebSocket";
89
import { TablePage, isTablePage } from "../models/TableInfo";
910

1011
export interface SessionControllerEventListener {
1112
onSessionStateUpdated?: (sessionState: SessionState, error: string | null) => void;
13+
onAssistantStateUpdated?: (assistantState: AssistantState) => void;
1214
onChatMessagesUpdated?: (chatMessages: ChatMessage[]) => void;
1315
onTablePageReceived?: (page: TablePage) => void;
1416
}
@@ -17,6 +19,7 @@ class SessionController implements SLWebSocketEventListener {
1719
listeners: SessionControllerEventListener[] = [];
1820
projectID: string = "main";
1921
sessionState: SessionState = 'initializing';
22+
assistantState: AssistantState = 'idle';
2023
error: string | null = null;
2124
authToken: string | null = null;
2225
chatMessages: ChatMessage[] = [];
@@ -117,24 +120,29 @@ class SessionController implements SLWebSocketEventListener {
117120
const content = json['content'];
118121
const sender = json['sender'];
119122
if (!id || !content || !sender) { return; }
123+
if (sender == 'assistant') {
124+
this.onAssistantStateUpdated({ assistant_reply_state: 'idle' })
125+
}
120126
this.addChatMessage({ id: id, sender: sender, content: content, isEphemeral: false });
121127
}
122128

123129
onSessionStateUpdated(json: any) {
124-
const sessionState = json['session_state'];
125-
const error = json['error'];
130+
const sessionState: SessionState = json['session_state'];
131+
const error: string | null = json['error'];
126132
if (!sessionState) { return; }
127133
this.sessionState = sessionState;
128134
this.error = error;
129135
console.log(`Session state: ${sessionState}` + (error ? ` (${error})` : ''));
130136
this.listeners.forEach((listener) => listener.onSessionStateUpdated?.(sessionState, error));
131137
}
132138

133-
onAssistantStateUpdated(json: any) {
134-
const state = json['assistant_reply_state'];
135-
if (!state) { return; }
139+
const assistantState: AssistantState = json['assistant_reply_state'];
140+
if (!assistantState) { return; }
141+
this.assistantState = assistantState;
142+
this.listeners.forEach((listener) => listener.onAssistantStateUpdated?.(assistantState));
143+
// Add a matching ephemeral chat message
136144
let message: string | null = null;
137-
switch (state) {
145+
switch (assistantState) {
138146
case 'idle': break;
139147
case 'analyzing-data': message = 'Analyzing data...'; break;
140148
case 'analyzing-task': message = 'Analyzing task...'; break;

src/models/AssistantState.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
2+
export type AssistantState = 'idle' | 'analyzing-data' | 'analyzing-task' | 'generating-code' | 'executing-code' | 'generating-explanation' | 'debugging-code' | 'generating-subtasks';

0 commit comments

Comments
 (0)