fix(memory): Fix event listener leaks in TUI and Slack bot
Summary
Fix memory leaks from event listeners not being properly cleaned up in TUI components and the Slack bot.
Fixes #9155
Problems
1. TUI Sync Context (sync.tsx)
The sdk.event.listen() call sets up event listeners but the returned unsubscribe function is never called.
2. Tooltip Component (tooltip.tsx)
Mouse event listeners are added to elements but never removed on component unmount.
3. Slack Bot (slack/index.ts)
- Sessions Map grows without bounds
- No cleanup of old/stale sessions
- No graceful shutdown handling
Solution
TUI Sync Context
Store and call unsubscribe function in onCleanup:
const unsubscribe = sdk.event.listen((e) => { ... })
onCleanup(unsubscribe)
Tooltip Component
Add proper cleanup in onCleanup handler.
Slack Bot
- Add
lastUsedtimestamp to sessions - Add periodic cleanup of sessions older than 1 hour
- Add
MAX_SESSIONSlimit (100) - Add graceful shutdown handlers for SIGINT/SIGTERM
Changes
-
packages/opencode/src/cli/cmd/tui/context/sync.tsx- Store and call unsubscribe -
packages/ui/src/components/tooltip.tsx- Add event listener cleanup -
packages/slack/src/index.ts- Add session management and shutdown handlers
Testing
- [x] TypeScript compilation passes (
bun turbo typecheck) - [x] Unit tests pass (725 tests, 0 failures)
Note: Manual TUI and Slack bot testing was not performed. Memory leak verification requires runtime memory profiling.
Thanks for your contribution!
This PR doesn't have a linked issue. All PRs must reference an existing issue.
Please:
- Open an issue describing the bug/feature (if one doesn't exist)
- Add
Fixes #<number>orCloses #<number>to this PR description
See CONTRIBUTING.md for details.
The following comment was made by an LLM, it may be inaccurate:
Potential Duplicate PRs Found
-
#8254 - fix(tui): clean up SDK event listeners on unmount
- https://github.com/anomalyco/opencode/pull/8254
- Why related: Directly addresses the same TUI sync context event listener cleanup issue mentioned in the current PR
-
#7032 - fix(core): add dispose functions to prevent subscription memory leaks
- https://github.com/anomalyco/opencode/pull/7032
- Why related: Addresses core subscription memory leak cleanup mechanisms that may overlap with the event listener fixes
These PRs appear to target the same memory leak issues, particularly around TUI event listener cleanup. Review their implementation status to ensure no duplicated work.