[PR #5632] [CLOSED] fix: harden chat and agent edge cases #5507

Closed
opened 2026-06-05 15:21:34 -04:00 by yindo · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/Mintplex-Labs/anything-llm/pull/5632
Author: @heihei999
Created: 5/14/2026
Status: Closed

Base: masterHead: fix/harden-chat-agent-edge-cases


📝 Commits (1)

📊 Changes

8 files changed (+1172 additions, -63 deletions)

View changed files

e2e/agent-session-pr2.spec.cjs (+249 -0)
📝 frontend/src/utils/chat/agent.js (+9 -8)
server/__tests__/endpoints/agentWebsocket.test.js (+208 -0)
server/__tests__/utils/chats/stream.test.js (+215 -0)
server/__tests__/utils/helpers/chat/responses.test.js (+375 -0)
📝 server/endpoints/agentWebsocket.js (+2 -0)
📝 server/utils/chats/stream.js (+11 -3)
📝 server/utils/helpers/chat/responses.js (+103 -52)

📄 Description

Summary

Several hardening fixes discovered during investigation of #5195:

  1. Agent WebSocket disconnect now aborts inference — When a user switches threads during an agent session, the WebSocket disconnect now calls agentHandler.aibitat.abort() to stop the agent and avoid wasting LLM API calls
  2. writeResponseChunk defensive check — Adds a check for response.writable and response.destroyed before writing, preventing ERR_STREAM_WRITE_AFTER_END errors
  3. completeText initialization — Changes let completeText to let completeText = "" to avoid undefined edge cases in error paths
  4. useIsAgentSessionActive event listener cleanup — Fixes memory leak by properly removing AGENT_SESSION_START and AGENT_SESSION_END event listeners on component unmount

Test plan

  • Unit tests: agentWebsocket.test.js (WebSocket disconnect abort)
  • Unit tests: responses.test.js (writeResponseChunk defensive check)
  • Unit tests: stream.test.js (completeText initialization)
  • E2E test: agent-session-pr2.spec.cjs (agent session lifecycle)
  • yarn lint passed

Modified files

File Change
server/endpoints/agentWebsocket.js Add aibitat.abort() on WebSocket close
server/utils/helpers/chat/responses.js Add defensive check to writeResponseChunk
server/utils/chats/stream.js Initialize completeText to empty string
frontend/src/utils/chat/agent.js Fix event listener leak in useIsAgentSessionActive

🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/Mintplex-Labs/anything-llm/pull/5632 **Author:** [@heihei999](https://github.com/heihei999) **Created:** 5/14/2026 **Status:** ❌ Closed **Base:** `master` ← **Head:** `fix/harden-chat-agent-edge-cases` --- ### 📝 Commits (1) - [`98509c0`](https://github.com/Mintplex-Labs/anything-llm/commit/98509c07cacabc27fd8752fb4316ca54e83b5bc5) fix: harden chat and agent edge cases (#5195) ### 📊 Changes **8 files changed** (+1172 additions, -63 deletions) <details> <summary>View changed files</summary> ➕ `e2e/agent-session-pr2.spec.cjs` (+249 -0) 📝 `frontend/src/utils/chat/agent.js` (+9 -8) ➕ `server/__tests__/endpoints/agentWebsocket.test.js` (+208 -0) ➕ `server/__tests__/utils/chats/stream.test.js` (+215 -0) ➕ `server/__tests__/utils/helpers/chat/responses.test.js` (+375 -0) 📝 `server/endpoints/agentWebsocket.js` (+2 -0) 📝 `server/utils/chats/stream.js` (+11 -3) 📝 `server/utils/helpers/chat/responses.js` (+103 -52) </details> ### 📄 Description ## Summary Several hardening fixes discovered during investigation of #5195: 1. **Agent WebSocket disconnect now aborts inference** — When a user switches threads during an agent session, the WebSocket disconnect now calls `agentHandler.aibitat.abort()` to stop the agent and avoid wasting LLM API calls 2. **writeResponseChunk defensive check** — Adds a check for `response.writable` and `response.destroyed` before writing, preventing `ERR_STREAM_WRITE_AFTER_END` errors 3. **completeText initialization** — Changes `let completeText` to `let completeText = ""` to avoid undefined edge cases in error paths 4. **useIsAgentSessionActive event listener cleanup** — Fixes memory leak by properly removing `AGENT_SESSION_START` and `AGENT_SESSION_END` event listeners on component unmount ## Test plan - [x] Unit tests: agentWebsocket.test.js (WebSocket disconnect abort) - [x] Unit tests: responses.test.js (writeResponseChunk defensive check) - [x] Unit tests: stream.test.js (completeText initialization) - [x] E2E test: agent-session-pr2.spec.cjs (agent session lifecycle) - [x] `yarn lint` passed ## Modified files | File | Change | |------|--------| | `server/endpoints/agentWebsocket.js` | Add `aibitat.abort()` on WebSocket close | | `server/utils/helpers/chat/responses.js` | Add defensive check to `writeResponseChunk` | | `server/utils/chats/stream.js` | Initialize `completeText` to empty string | | `frontend/src/utils/chat/agent.js` | Fix event listener leak in `useIsAgentSessionActive` | --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
yindo added the pull-request label 2026-06-05 15:21:34 -04:00
yindo closed this issue 2026-06-05 15:21:34 -04:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Mintplex-Labs/anything-llm#5507