Skip to content

Split ChatWidget state into focused modules#21866

Open
etraut-openai wants to merge 2 commits intomainfrom
etraut/chatwidget-state-decomposition
Open

Split ChatWidget state into focused modules#21866
etraut-openai wants to merge 2 commits intomainfrom
etraut/chatwidget-state-decomposition

Conversation

@etraut-openai
Copy link
Copy Markdown
Collaborator

@etraut-openai etraut-openai commented May 9, 2026

Summary

ChatWidget has been carrying several independent domains in one large state bag: transcript bookkeeping, turn lifecycle, queued input, status surfaces, connectors, review mode, and protocol dispatch. That makes otherwise-local changes hard to reason about because unrelated fields and side effects live beside each other in chatwidget.rs.

This is the first cleanup PR in a larger decomposition effort. It does not try to make chatwidget.rs small in one sweep; instead, it establishes focused state boundaries that later handler, popup, rendering, and effect-synchronization extractions can build on.

This PR keeps ChatWidget as the composition layer while moving focused state into smaller codex-tui modules. The widget still owns effects that touch the bottom pane, app events, command submission, redraw scheduling, and terminal-title updates.

Changes

  • Add focused state modules under codex-rs/tui/src/chatwidget/ for input queues, turn lifecycle, transcript bookkeeping, status state, connectors, review mode, and app-server protocol dispatch.
  • Update ChatWidget to hold grouped state structs and route input/lifecycle/status operations through those focused helpers.
  • Move app-server notification dispatch into chatwidget/protocol.rs while leaving feature handlers and side effects on ChatWidget.
  • Replace the large manual ChatWidget test literal with the normal constructor plus narrow test overrides, so future state moves do not require every field to be restated in test setup.
  • Update existing tests to access the new grouped state or narrower helpers without changing snapshot behavior.

Longer-term direction

Follow-up PRs can continue shrinking chatwidget.rs by moving behavior, not just state, into focused modules:

  • Extract input/submission flow, turn/stream handling, and tool-cell lifecycles into domain modules that call the new state reducers.
  • Move popup/settings builders and rendering helpers out of the main widget file so ChatWidget stays focused on composition.
  • Reduce direct BottomPane mutation by applying domain-specific sync outputs at clearer boundaries.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant