From bc323746a85c5a06f9212f2bb9789501cf54047c Mon Sep 17 00:00:00 2001 From: Ian Bolton Date: Thu, 23 Oct 2025 13:29:57 -0400 Subject: [PATCH 1/2] Prevent bloated messages to webview Signed-off-by: Ian Bolton --- vscode/core/src/extension.ts | 20 ++++++++++++ vscode/core/src/extensionState.ts | 1 + .../utilities/ModifiedFiles/processMessage.ts | 6 ++-- .../src/components/ViolationIncidentsList.tsx | 4 +-- .../src/context/ExtensionStateContext.tsx | 32 ++++++++++++------- 5 files changed, 47 insertions(+), 16 deletions(-) diff --git a/vscode/core/src/extension.ts b/vscode/core/src/extension.ts index 35ffbd7c3..ac7244373 100644 --- a/vscode/core/src/extension.ts +++ b/vscode/core/src/extension.ts @@ -116,6 +116,25 @@ class VsCodeExtension { return data; }; + // Selective state mutator for chat messages only + const mutateChatMessages = ( + recipe: (draft: ExtensionData) => void, + ): Immutable => { + const data = produce(getData(), recipe); + setData(data); + + // Send only chat messages to webview instead of full state + this.state.webviewProviders.forEach((provider) => { + provider.sendMessageToWebview({ + type: "CHAT_MESSAGES_UPDATE", + chatMessages: data.chatMessages, + timestamp: new Date().toISOString(), + }); + }); + + return data; + }; + const taskManager = new DiagnosticTaskManager(getExcludedDiagnosticSources()); this.state = { @@ -132,6 +151,7 @@ class VsCodeExtension { return getData(); }, mutateData, + mutateChatMessages, modifiedFiles: new Map(), modifiedFilesEventEmitter: new EventEmitter(), lastMessageId: "0", diff --git a/vscode/core/src/extensionState.ts b/vscode/core/src/extensionState.ts index def010257..df485a817 100644 --- a/vscode/core/src/extensionState.ts +++ b/vscode/core/src/extensionState.ts @@ -25,6 +25,7 @@ export interface ExtensionState { issueModel: IssuesModel; data: Immutable; mutateData: (recipe: (draft: ExtensionData) => void) => Immutable; + mutateChatMessages: (recipe: (draft: ExtensionData) => void) => Immutable; profiles?: AnalysisProfile[]; activeProfileId?: string; kaiFsCache: InMemoryCacheWithRevisions; diff --git a/vscode/core/src/utilities/ModifiedFiles/processMessage.ts b/vscode/core/src/utilities/ModifiedFiles/processMessage.ts index 4bb59c39d..e6b0d142e 100644 --- a/vscode/core/src/utilities/ModifiedFiles/processMessage.ts +++ b/vscode/core/src/utilities/ModifiedFiles/processMessage.ts @@ -161,7 +161,7 @@ export const processMessageByType = async ( switch (msg.type) { case KaiWorkflowMessageType.ToolCall: { // Add or update tool call notification in chat - state.mutateData((draft) => { + state.mutateChatMessages((draft) => { const toolName = msg.data.name || "unnamed tool"; const toolStatus = msg.data.status; // Check if the most recent message is a tool message with the same name @@ -292,7 +292,7 @@ export const processMessageByType = async ( if (msg.id !== state.lastMessageId) { // This is a new message - create a new chat message - state.mutateData((draft) => { + state.mutateChatMessages((draft) => { draft.chatMessages.push({ kind: ChatMessageType.String, messageToken: msg.id, @@ -305,7 +305,7 @@ export const processMessageByType = async ( state.lastMessageId = msg.id; } else { // This is a continuation of the current message - append to it - state.mutateData((draft) => { + state.mutateChatMessages((draft) => { if (draft.chatMessages.length > 0) { draft.chatMessages[draft.chatMessages.length - 1].value.message += content; } else { diff --git a/webview-ui/src/components/ViolationIncidentsList.tsx b/webview-ui/src/components/ViolationIncidentsList.tsx index f4492124f..cf649e493 100644 --- a/webview-ui/src/components/ViolationIncidentsList.tsx +++ b/webview-ui/src/components/ViolationIncidentsList.tsx @@ -111,7 +111,7 @@ const ViolationIncidentsList = ({ groupId: string; }) => { const successRate = getSuccessRate(incidents); - console.log("successRate", successRate); + // Removed console.log for performance if (!successRate) { return null; @@ -202,7 +202,7 @@ const ViolationIncidentsList = ({ if (filters.hasSuccessRate) { filtered = filtered.filter((incident) => { const successRate = extractSuccessRateData(incident.successRateMetric); - console.log("Filtering incident:", incident.violationId, "successRate:", successRate); + // Removed console.log for performance return ( successRate && (successRate.accepted_solutions > 0 || successRate.rejected_solutions > 0) ); diff --git a/webview-ui/src/context/ExtensionStateContext.tsx b/webview-ui/src/context/ExtensionStateContext.tsx index e24e2d3c7..92987984f 100644 --- a/webview-ui/src/context/ExtensionStateContext.tsx +++ b/webview-ui/src/context/ExtensionStateContext.tsx @@ -67,20 +67,30 @@ export function ExtensionStateProvider({ children }: PropsWithChildren) { const [state, setState] = useState(windowState); useEffect(() => { - const handleMessage = (event: MessageEvent) => { - // Ensure incoming data has all required array properties + const handleMessage = (event: MessageEvent) => { + // Handle selective chat message updates + if ('type' in event.data && event.data.type === 'CHAT_MESSAGES_UPDATE') { + setState(prevState => ({ + ...prevState, + chatMessages: Array.isArray(event.data.chatMessages) ? event.data.chatMessages : prevState.chatMessages, + })); + return; + } + + // Handle full state updates (for non-chat changes) + const data = event.data as ExtensionData; const safeData: ExtensionData = { ...defaultState, - ...event.data, - ruleSets: Array.isArray(event.data.ruleSets) ? event.data.ruleSets : [], - enhancedIncidents: Array.isArray(event.data.enhancedIncidents) - ? event.data.enhancedIncidents + ...data, + ruleSets: Array.isArray(data.ruleSets) ? data.ruleSets : [], + enhancedIncidents: Array.isArray(data.enhancedIncidents) + ? data.enhancedIncidents : [], - chatMessages: Array.isArray(event.data.chatMessages) ? event.data.chatMessages : [], - configErrors: Array.isArray(event.data.configErrors) ? event.data.configErrors : [], - profiles: Array.isArray(event.data.profiles) ? event.data.profiles : [], - activeDecorators: event.data.activeDecorators || {}, - isWaitingForUserInteraction: event.data.isWaitingForUserInteraction || false, + chatMessages: Array.isArray(data.chatMessages) ? data.chatMessages : [], + configErrors: Array.isArray(data.configErrors) ? data.configErrors : [], + profiles: Array.isArray(data.profiles) ? data.profiles : [], + activeDecorators: data.activeDecorators || {}, + isWaitingForUserInteraction: data.isWaitingForUserInteraction || false, }; setState(safeData); }; From 4cfa4141f742de2a7cdd2e704d1488e8c20f6f24 Mon Sep 17 00:00:00 2001 From: Ian Bolton Date: Thu, 23 Oct 2025 13:39:08 -0400 Subject: [PATCH 2/2] gitignore update Signed-off-by: Ian Bolton --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index 88040538a..2741a3f4a 100644 --- a/.gitignore +++ b/.gitignore @@ -17,6 +17,8 @@ vscode/.metadata # Miscellaneous .vscode/*.aider* .vscode/settings.json +vscode/.vscode-test +vscode/org.eclipse* # Allow PNG files in vscode/resources !vscode/resources/*.png