5.9 KiB
CAI TUI Command Analysis: Agent, Model, and Parallel Commands
Overview
This document analyzes how CAI commands like /agent, /model, and /parallel work in the TUI context, focusing on the distinction between global state and terminal-specific state.
Architecture
Key Components
-
CommandHandler (
src/cai/tui/components/command_handler.py)- Handles CLI command execution within the TUI
- Intercepts console output and redirects to appropriate terminal widgets
- Has special handling for
/agentand/modelcommands
-
SessionManager (
src/cai/tui/core/session_manager.py)- Manages overall TUI session state
- Coordinates multiple terminal runners
- Handles parallel mode coordination
- Methods:
update_model(),switch_agent()
-
TerminalRunner (
src/cai/tui/core/terminal_runner.py)- Manages agent execution within a single terminal
- Each terminal has its own agent instance and message history
- Methods:
switch_agent(),update_model()
-
REPL Commands (
src/cai/repl/commands/)/agent- Agent selection and management/model- Model selection/parallel- Parallel agent configuration
Command Behavior Analysis
1. /agent Command
Current Implementation:
- Modifies global environment variable
CAI_AGENT_TYPE - Updates
AGENT_MANAGERglobal state - Handles parallel pattern loading into
PARALLEL_CONFIGS
TUI Context Issues:
- The command modifies global state that affects all terminals
- No per-terminal agent selection mechanism
- CommandHandler has special handling but only updates local state
Per-Terminal Requirements:
- Need to call
session_manager.switch_agent(agent_name, terminal_number) - Should not modify global
CAI_AGENT_TYPEwhen in TUI mode - Each terminal should maintain its own agent configuration
2. /model Command
Current Implementation:
- Modifies global environment variable
CAI_MODEL - Affects all future agent interactions globally
TUI Context Behavior:
- CommandHandler detects
/modelcommands - Calls
session_manager.update_model(model_name) - SessionManager updates all terminal runners with the new model
- This is actually appropriate for model changes (typically want all terminals to use same model)
Working Correctly:
- Model updates propagate to all terminals as expected
- Each terminal runner updates its agent's model recursively
3. /parallel Command
Current Implementation:
- Manages
PARALLEL_CONFIGSglobal list - Sets
CAI_PARALLELandCAI_PARALLEL_AGENTSenvironment variables - Configures agents for parallel execution
TUI Context Behavior:
- SessionManager detects parallel mode via
is_parallel_modeflag - Distributes parallel agents across terminals (Terminal 1 = P1, Terminal 2 = P2, etc.)
- Uses
PARALLEL_CONFIGSto determine agent assignments
Issues:
- Parallel mode is global, not per-terminal
- Cannot have different parallel configurations in different terminals
/agentcommand that loads parallel patterns affects all terminals
State Management
Global State (Shared Across All Terminals)
- Environment variables:
CAI_AGENT_TYPE,CAI_MODEL,CAI_PARALLEL PARALLEL_CONFIGSlistAGENT_MANAGERregistryPARALLEL_ISOLATIONhistories
Per-Terminal State
TerminalRunner.agent- Agent instanceTerminalRunner.message_history- Conversation historyTerminalRunner.config- Terminal configuration including agent_name and modelTerminalConfig.parallel_config- Parallel agent assignment
Recommended Fixes
1. Make /agent Terminal-Aware in TUI Mode
# In command_handler.py, enhance the special handling:
if cmd_name.lower() in ["/agent", "/a"] and args:
if args[0] == "select" and len(args) > 1:
agent_name = args[1]
terminal_number = self.terminal_number # Need to add this
# Don't modify global state in TUI mode
if hasattr(self, 'session_manager') and self.session_manager:
asyncio.create_task(
self.session_manager.switch_agent(agent_name, terminal_number)
)
2. Add Terminal-Specific Agent Command
Create a new command like /terminal-agent or modify /agent to accept terminal number:
/agent select <name> --terminal 2- Select agent for specific terminal/agent select <name>- In TUI, affects only current terminal
3. Enhance Parallel Mode for TUI
- Allow parallel configurations to be terminal-set specific
- Each terminal could have its own parallel group
- Terminal 1-3 could run one parallel set, Terminal 4-6 another
4. Add TUI Context Detection
Commands should detect TUI mode and behave differently:
def is_tui_mode():
return os.getenv("CAI_TUI_MODE") == "true"
# In agent command:
if not is_tui_mode():
# Current behavior - modify global state
os.environ["CAI_AGENT_TYPE"] = agent_key
else:
# TUI behavior - notify session manager
# Don't modify global state
Current Workarounds
-
For Agent Selection in Specific Terminal:
- Use the terminal's direct execution instead of commands
- Manually reinitialize terminal runners after global changes
-
For Model Changes:
- The current implementation works well for global model updates
- Use
/modelcommand normally
-
For Parallel Mode:
- Configure parallel agents before starting terminals
- Use environment variables to pre-configure
- Parallel mode affects all terminals as designed
Conclusion
The TUI command system currently relies heavily on global state inherited from the CLI design. To support true multi-terminal workflows, commands need to be enhanced with terminal-awareness and the ability to modify per-terminal state rather than global state. The /model command works well as-is since model changes are typically desired globally, but /agent and /parallel need terminal-specific implementations.