Fix AI response storage and add message source tracking

Key changes:
- Fixed sessionId detection in HumanAgent_Chat tool (use sessionToUse instead of params.sessionId)
- Added source field to ChatMessage interface for tracking web vs vscode origin
- Updated web interface to show message source in headers
- Removed incorrect storage of human responses as assistant messages
- AI responses need proper capture mechanism (not human answers stored as AI responses)

Issue: Still need to eliminate redundant /chat endpoint causing potential duplicates
This commit is contained in:
B Harper
2025-10-24 13:16:37 +11:00
parent b5d0190474
commit bab4f4138a
4 changed files with 1115 additions and 2001 deletions
+1092 -1981
View File
File diff suppressed because it is too large Load Diff
+3
View File
@@ -14,3 +14,6 @@
2025-10-24T00:44:34.053Z - RESPONSE ENDPOINT CALLED - RequestID: 5-1761266631221
2025-10-24T00:45:57.000Z - RESPONSE ENDPOINT CALLED - RequestID: 6-1761266677885
2025-10-24T00:53:39.981Z - RESPONSE ENDPOINT CALLED - RequestID: 7-1761266763696
2025-10-24T02:07:33.092Z - RESPONSE ENDPOINT CALLED - RequestID: 3-1761271635573
2025-10-24T02:11:21.217Z - RESPONSE ENDPOINT CALLED - RequestID: 4-1761271658716
2025-10-24T02:11:58.017Z - RESPONSE ENDPOINT CALLED - RequestID: 5-1761271885279
+19 -20
View File
@@ -676,7 +676,8 @@ export class McpServer extends EventEmitter {
content: message,
sender: sender as 'user' | 'agent',
timestamp: new Date(),
type: 'text'
type: 'text',
source: sender === 'user' ? 'vscode' : undefined
};
this.chatManager.addMessage(sessionId, chatMessage);
@@ -721,7 +722,8 @@ export class McpServer extends EventEmitter {
content: response,
sender: 'user',
timestamp: new Date(),
type: 'text'
type: 'text',
source: 'web'
};
this.debugLogger.log('HTTP', `Storing and broadcasting user message to ${this.sseConnections.size} SSE connections`);
@@ -1195,14 +1197,21 @@ export class McpServer extends EventEmitter {
}
}
function addMessageToUI(sessionId, role, content) {
function addMessageToUI(sessionId, role, content, source) {
const messagesContainer = document.getElementById(\`messages-\${sessionId}\`);
if (!messagesContainer) return;
const messageDiv = document.createElement('div');
messageDiv.className = \`message \${role}\`;
// Create header with source info
let header = role === 'user' ? 'You' : 'Assistant';
if (role === 'user' && source) {
header += \` (\${source === 'web' ? 'Web' : 'VS Code'})\`;
}
messageDiv.innerHTML = \`
<div class="message-header">\${role === 'user' ? 'You' : 'Assistant'}\${new Date().toLocaleTimeString()}</div>
<div class="message-header">\${header}\${new Date().toLocaleTimeString()}</div>
<div class="message-content">\${escapeHtml(content)}</div>
\`;
@@ -1232,7 +1241,7 @@ export class McpServer extends EventEmitter {
// Add each message
for (const msg of data.messages) {
addMessageToUI(sessionId, msg.sender, msg.content);
addMessageToUI(sessionId, msg.sender, msg.content, msg.source);
}
}
}
@@ -1262,7 +1271,7 @@ export class McpServer extends EventEmitter {
// Add each message from chat manager
for (const msg of data.messages) {
addMessageToUI(sessionId, msg.sender, msg.content);
addMessageToUI(sessionId, msg.sender, msg.content, msg.source);
}
console.log(\`Loaded \${data.messages.length} messages for session \${sessionId}\`);
@@ -1293,7 +1302,7 @@ export class McpServer extends EventEmitter {
// Handle different types of updates
if (data.type === 'chat_message' && data.sessionId && data.message) {
addMessageToUI(data.sessionId, data.message.sender, data.message.content);
addMessageToUI(data.sessionId, data.message.sender, data.message.content, data.message.source);
} else if (data.type === 'message' && data.sessionId) {
addMessageToUI(data.sessionId, data.role || 'assistant', data.content);
} else if (data.type === 'human-agent-request' && data.data) {
@@ -1480,19 +1489,9 @@ export class McpServer extends EventEmitter {
const responseTime = Date.now() - startTime;
this.debugLogger.log('TOOL', `Request ${requestId} completed with response:`, response);
// Store the assistant response message for synchronization
if (params.sessionId) {
const assistantMessage: ChatMessage = {
id: (Date.now() + 1).toString(), // Slightly different timestamp
content: response,
sender: 'agent',
timestamp: new Date(),
type: 'text'
};
this.chatManager.addMessage(params.sessionId, assistantMessage);
this.debugLogger.log('CHAT', `Stored assistant message in ChatManager for session ${params.sessionId}: ${assistantMessage.content.substring(0, 50)}...`);
this.broadcastMessageToClients(params.sessionId, assistantMessage);
}
// Don't store human response as assistant message
// The 'response' here is the human's answer to AI's question
// The AI will generate its own response separately after receiving this
const result: HumanAgentChatToolResult = {
content: [{
+1
View File
@@ -17,6 +17,7 @@ export interface ChatMessage {
content: string;
timestamp: Date;
type: 'text' | 'system';
source?: 'web' | 'vscode'; // Track message source for user messages
}
export interface McpServerConfig {