/ src / core / constants.py
constants.py
  1  """
  2  Centralized constants for Ag3ntum.
  3  
  4  All magic numbers, strings, and configuration values are defined here.
  5  This ensures consistency across modules and makes maintenance easier.
  6  
  7  Usage:
  8      from .constants import (
  9          AnsiColors,
 10          BoxChars,
 11          StatusIcons,
 12          TerminalControl,
 13          LOG_FORMAT_FILE,
 14          LOG_PREVIEW_LENGTH,
 15      )
 16  """
 17  from enum import StrEnum
 18  
 19  
 20  # =============================================================================
 21  # Logging Constants
 22  # =============================================================================
 23  
 24  # Log format for file-based logging
 25  LOG_FORMAT_FILE: str = "%(asctime)s [%(levelname)s] %(name)s: %(message)s"
 26  
 27  # Log format for console (basic, no colors)
 28  LOG_FORMAT_CONSOLE: str = "%(levelname)-8s %(name)s: %(message)s"
 29  
 30  # Log format for colored console (using colorlog)
 31  LOG_FORMAT_COLORED: str = (
 32      "%(log_color)s%(levelname)-8s%(reset)s %(cyan)s%(name)s%(reset)s: %(message)s"
 33  )
 34  
 35  # Rotating file handler settings
 36  LOG_MAX_BYTES: int = 10 * 1024 * 1024  # 10 MB
 37  LOG_BACKUP_COUNT: int = 5
 38  
 39  # Log file names
 40  LOG_FILE_CLI: str = "agent_cli.log"
 41  LOG_FILE_HTTP: str = "agent_http.log"
 42  LOG_FILE_BACKEND: str = "backend.log"
 43  
 44  
 45  # =============================================================================
 46  # ANSI Terminal Colors
 47  # =============================================================================
 48  
 49  class AnsiColors(StrEnum):
 50      """
 51      ANSI escape codes for terminal colors.
 52  
 53      Single source of truth for all color codes used in terminal output.
 54      Used by both output.py and tracer.py for consistent styling.
 55      """
 56      RESET = "\033[0m"
 57      BOLD = "\033[1m"
 58      DIM = "\033[2m"
 59      ITALIC = "\033[3m"
 60      UNDERLINE = "\033[4m"
 61  
 62      # Standard foreground colors
 63      BLACK = "\033[30m"
 64      RED = "\033[31m"
 65      GREEN = "\033[32m"
 66      YELLOW = "\033[33m"
 67      BLUE = "\033[34m"
 68      MAGENTA = "\033[35m"
 69      CYAN = "\033[36m"
 70      WHITE = "\033[37m"
 71  
 72      # Bright foreground colors
 73      BRIGHT_BLACK = "\033[90m"
 74      BRIGHT_RED = "\033[91m"
 75      BRIGHT_GREEN = "\033[92m"
 76      BRIGHT_YELLOW = "\033[93m"
 77      BRIGHT_BLUE = "\033[94m"
 78      BRIGHT_MAGENTA = "\033[95m"
 79      BRIGHT_CYAN = "\033[96m"
 80      BRIGHT_WHITE = "\033[97m"
 81  
 82      # Background colors
 83      BG_BLACK = "\033[40m"
 84      BG_RED = "\033[41m"
 85      BG_GREEN = "\033[42m"
 86      BG_YELLOW = "\033[43m"
 87      BG_BLUE = "\033[44m"
 88      BG_MAGENTA = "\033[45m"
 89      BG_CYAN = "\033[46m"
 90      BG_WHITE = "\033[47m"
 91  
 92      # Semantic aliases for common use cases
 93      GRAY = "\033[90m"
 94      INFO = "\033[94m"
 95      SUCCESS = "\033[92m"
 96      WARNING = "\033[93m"
 97      ERROR = "\033[91m"
 98  
 99  
100  # =============================================================================
101  # Terminal Control Sequences
102  # =============================================================================
103  
104  class TerminalControl:
105      """ANSI escape sequences for terminal cursor and line control."""
106      CLEAR_LINE: str = "\033[2K"
107      CURSOR_UP: str = "\033[1A"
108      CURSOR_DOWN: str = "\033[1B"
109      CURSOR_START: str = "\033[0G"
110      CURSOR_HIDE: str = "\033[?25l"
111      CURSOR_SHOW: str = "\033[?25h"
112      SAVE_CURSOR: str = "\033[s"
113      RESTORE_CURSOR: str = "\033[u"
114  
115      @staticmethod
116      def move_up(n: int = 1) -> str:
117          """Move cursor up n lines."""
118          return f"\033[{n}A"
119  
120      @staticmethod
121      def move_down(n: int = 1) -> str:
122          """Move cursor down n lines."""
123          return f"\033[{n}B"
124  
125      @staticmethod
126      def move_to_column(col: int) -> str:
127          """Move cursor to column position."""
128          return f"\033[{col}G"
129  
130  
131  # =============================================================================
132  # Color Configuration for colorlog
133  # =============================================================================
134  
135  COLORLOG_COLORS: dict[str, str] = {
136      "DEBUG": "white",
137      "INFO": "green",
138      "WARNING": "yellow",
139      "ERROR": "red",
140      "CRITICAL": "red,bg_white",
141  }
142  
143  
144  # =============================================================================
145  # Display Constants
146  # =============================================================================
147  
148  # Preview lengths for logging and display
149  LOG_PREVIEW_LENGTH: int = 100
150  TASK_PREVIEW_LENGTH: int = 60
151  ERROR_PREVIEW_LENGTH: int = 40
152  WORKING_DIR_TRUNCATE_LENGTH: int = 40
153  MESSAGE_PREVIEW_LENGTH: int = 80
154  TOOL_PREVIEW_LENGTH: int = 80
155  PATH_TRUNCATE_LENGTH: int = 80
156  
157  # Terminal output
158  DEFAULT_TERMINAL_WIDTH: int = 80
159  MIN_TERMINAL_WIDTH: int = 50
160  MAX_TERMINAL_WIDTH: int = 120
161  RESULT_BOX_MAX_WIDTH: int = 55
162  
163  # Session table column widths
164  SESSION_ID_WIDTH: int = 30
165  SESSION_STATUS_WIDTH: int = 12
166  SESSION_CREATED_WIDTH: int = 20
167  
168  
169  # =============================================================================
170  # Box Drawing Characters (Unicode)
171  # =============================================================================
172  
173  class BoxChars:
174      """
175      Unicode box drawing characters for terminal output.
176  
177      Single source of truth for all box/border characters used in CLI display.
178      Provides both single-line and double-line variants.
179      """
180      # Single-line box
181      TOP_LEFT: str = "┌"
182      TOP_RIGHT: str = "┐"
183      BOTTOM_LEFT: str = "└"
184      BOTTOM_RIGHT: str = "┘"
185      HORIZONTAL: str = "─"
186      VERTICAL: str = "│"
187      LEFT_T: str = "├"
188      RIGHT_T: str = "┤"
189      TOP_T: str = "┬"
190      BOTTOM_T: str = "┴"
191      CROSS: str = "┼"
192  
193      # Double-line box
194      DOUBLE_TOP_LEFT: str = "╔"
195      DOUBLE_TOP_RIGHT: str = "╗"
196      DOUBLE_BOTTOM_LEFT: str = "╚"
197      DOUBLE_BOTTOM_RIGHT: str = "╝"
198      DOUBLE_HORIZONTAL: str = "═"
199      DOUBLE_VERTICAL: str = "║"
200  
201      # ASCII fallbacks for non-Unicode terminals
202      ASCII_TOP_LEFT: str = "+"
203      ASCII_TOP_RIGHT: str = "+"
204      ASCII_BOTTOM_LEFT: str = "+"
205      ASCII_BOTTOM_RIGHT: str = "+"
206      ASCII_HORIZONTAL: str = "-"
207      ASCII_VERTICAL: str = "|"
208  
209  
210  # =============================================================================
211  # Status and Decoration Icons
212  # =============================================================================
213  
214  class StatusIcons:
215      """
216      Unicode icons for status display.
217  
218      Single source of truth for all status indicators used in terminal output.
219      """
220      # Status indicators
221      SUCCESS: str = "✓"
222      FAILURE: str = "✗"
223      WARNING: str = "⚠"
224      INFO: str = "ℹ"
225      RUNNING: str = "⟳"
226      PENDING: str = "○"
227  
228      # Additional decorative symbols
229      BULLET: str = "•"
230      CIRCLE: str = "○"
231      CIRCLE_FILLED: str = "●"
232      STAR: str = "★"
233      LIGHTNING: str = "⚡"
234      GEAR: str = "⚙"
235      POINTER: str = "❯"
236      ARROW_RIGHT: str = "→"
237      ARROW_LEFT: str = "←"
238      ARROW_UP: str = "↑"
239      ARROW_DOWN: str = "↓"
240      TRIANGLE_RIGHT: str = "▶"
241      TRIANGLE_DOWN: str = "▼"
242      FOLDER: str = "▣"
243      FILE: str = "▫"
244      CLOCK: str = "◔"
245      BRAIN: str = "◆"
246  
247      # Spinner characters for progress indication
248      SPINNER: tuple[str, ...] = (
249          "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"
250      )
251      SPINNER_LINE: tuple[str, ...] = ("—", "\\", "|", "/")
252      SPINNER_ARROW: tuple[str, ...] = ("←", "↖", "↑", "↗", "→", "↘", "↓", "↙")
253  
254      # Pulsing circle spinner for structured elements (tools, skills, subagents)
255      # Uses ANSI 256-color codes to create a smooth brightness pulse effect
256      # Grayscale values: 232 (darkest) to 255 (brightest)
257      SPINNER_PULSE_CIRCLE: tuple[str, ...] = (
258          # Fade in (dim to bright)
259          "\033[38;5;240m●\033[0m",  # dim
260          "\033[38;5;243m●\033[0m",
261          "\033[38;5;246m●\033[0m",
262          "\033[38;5;249m●\033[0m",
263          "\033[38;5;252m●\033[0m",
264          "\033[38;5;255m●\033[0m",  # bright
265          # Fade out (bright to dim)
266          "\033[38;5;252m●\033[0m",
267          "\033[38;5;249m●\033[0m",
268          "\033[38;5;246m●\033[0m",
269          "\033[38;5;243m●\033[0m",
270      )
271  
272  
273  # =============================================================================
274  # API Constants
275  # =============================================================================
276  
277  # Default polling interval for HTTP client
278  DEFAULT_POLL_INTERVAL: float = 2.0
279  
280  # HTTP request timeout
281  DEFAULT_HTTP_TIMEOUT: int = 30
282  
283  
284  # =============================================================================
285  # Tool Display Formatting
286  # =============================================================================
287  
288  # Grid layout settings for tool display
289  TOOL_GRID_COLUMNS: int = 4
290  TOOL_GRID_COLUMN_WIDTH: int = 18
291  
292  # JSON preview settings
293  JSON_PREVIEW_MAX_LINES: int = 10
294  JSON_PREVIEW_MAX_LINE_LENGTH: int = 80
295  
296  # Todo plan display settings
297  TODO_PLAN_INDENT: int = 6
298  TODO_CONTENT_MAX_LENGTH: int = 55