# Todo 22 Text Event Protocol Plan
**Status:** done
## Goal
Remove ChatAgent dependence on provider `tool_calls`, parse event names from streamed text, and fix Agent config buttons that could stop responding after stale script/HTML mismatches.
## Why
The target architecture keeps ChatAgent focused on fast user-facing replies. EventAgent extends external capability after ChatAgent names the needed events. Provider tool-call payloads force ChatAgent to know tool-call mechanics and can delay or complicate streaming.
## Scope
- Parse a small text protocol from `delta.content`: visible text streams to the UI, while names inside `...` become internal `ToolCallEvent` values.
- Stop passing `tools` to ChatAgent and stop adding assistant `tool_calls` or `tool` role replies to ChatAgent history.
- Insert a generated system message listing enabled event names and descriptions for each ChatAgent round that can still request events.
- Keep EventAgent tool results visible to the UI and pass only one aggregate `EventAgent results` user message back to ChatAgent.
- Version the static JS URL and guard click binding so missing/old buttons do not abort initialization.
## Verification
- Parser test proves text events are extracted from streamed content and hidden from displayed message deltas.
- Runtime tests prove ChatAgent receives no tools, no `tool_calls`, no `tool` history, and does receive the event catalog system message plus aggregate EventAgent summary.
- Static tests prove the app script is versioned and Agent config buttons use guarded click binding.
- `uv run pytest` passed: 50 tests, 1 existing Starlette deprecation warning.
- Local browser check confirmed one ChatAgent button, one EventAgent button, versioned `app.js`, and both dialogs open on click.
## Result
- Added streamed text event parsing around ``.
- Replaced ChatAgent tool schemas with a generated event catalog system message.
- Preserved EventAgent execution and UI tool-result visibility while simplifying ChatAgent history.
- Fixed the practical button failure mode caused by stale or mismatched static JS.