@@ -216,6 +216,16 @@ def strip_symbols_from(self, text: str) -> str:
216216 return text .strip ()
217217
218218
219+ # Common patterns that should be applied to all profiles
220+ COMMON_SKIP_PATTERNS = [
221+ # Timestamp patterns - filter log lines with timestamps in first 20 chars
222+ (2 , r'^.{0,20}\[\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}' ), # [YYYY-MM-DD HH:MM:SS format
223+ (2 , r'^.{0,20}\d{4}-\d{2}-\d{2}\s+\d{2}:\d{2}:\d{2}' ), # YYYY-MM-DD HH:MM:SS format (no brackets)
224+ (2 , r'^.{0,20}\d{2}:\d{2}:\d{2}' ), # HH:MM:SS format in first 20 chars
225+ (2 , r'^.{0,20}\d{4}/\d{2}/\d{2}\s+\d{2}:\d{2}:\d{2}' ), # YYYY/MM/DD HH:MM:SS format
226+ (2 , r'^.{0,20}\d{2}/\d{2}/\d{4}\s+\d{2}:\d{2}:\d{2}' ), # MM/DD/YYYY HH:MM:SS format
227+ ]
228+
219229# Profile definitions
220230CLAUDE_PROFILE = Profile (
221231 name = 'claude' ,
@@ -231,7 +241,7 @@ def strip_symbols_from(self, text: str) -> str:
231241 (1 , r'\s*✻' ), # Interim thinking
232242 (0 , r'│ Do' ),
233243 ],
234- skip_patterns = [
244+ skip_patterns = COMMON_SKIP_PATTERNS + [
235245 # Level 1: Filter unless -v (tips, hints, usage info, single-word status)
236246 (1 , r'[A-Z][a-z]+…' ), # Single words like "Sparkling.", "Running."
237247 (1 , r'Tip:' ), # Tips
@@ -293,7 +303,7 @@ def strip_symbols_from(self, text: str) -> str:
293303
294304AIDER_PROFILE = Profile (
295305 name = 'aider' ,
296- skip_patterns = [
306+ skip_patterns = COMMON_SKIP_PATTERNS + [
297307 (1 , r'^Main model:' ),
298308 (1 , r'^Editor model:' ),
299309 (1 , r'^Weak model:' ),
@@ -308,7 +318,7 @@ def strip_symbols_from(self, text: str) -> str:
308318
309319PIPET_PROFILE = Profile (
310320 name = 'pipet' ,
311- skip_patterns = [
321+ skip_patterns = COMMON_SKIP_PATTERNS + [
312322 (1 , r'^Analyzing package' ),
313323 (1 , r'^Package:' ),
314324 (1 , r'^Version:' ),
@@ -319,6 +329,7 @@ def strip_symbols_from(self, text: str) -> str:
319329
320330PYTHON_PROFILE = Profile (
321331 name = 'python' ,
332+ skip_patterns = COMMON_SKIP_PATTERNS ,
322333 prompt_patterns = [
323334 r'^>>>\s*' , # Python REPL prompt
324335 r'^\.\.\.\s*' , # Python continuation prompt
@@ -328,6 +339,7 @@ def strip_symbols_from(self, text: str) -> str:
328339
329340MYSQL_PROFILE = Profile (
330341 name = 'mysql' ,
342+ skip_patterns = COMMON_SKIP_PATTERNS ,
331343 prompt_patterns = [
332344 r'^mysql>\s*' , # MySQL prompt
333345 r'^->\s*' , # MySQL continuation
@@ -337,6 +349,7 @@ def strip_symbols_from(self, text: str) -> str:
337349
338350PSQL_PROFILE = Profile (
339351 name = 'psql' ,
352+ skip_patterns = COMMON_SKIP_PATTERNS ,
340353 prompt_patterns = [
341354 r'^\w+=#\s*' , # PostgreSQL prompt (database=#)
342355 r'^\w+=-#\s*' , # PostgreSQL continuation
@@ -349,7 +362,7 @@ def strip_symbols_from(self, text: str) -> str:
349362 name = 'default' ,
350363 response_prefix = '' ,
351364 raw_skip_patterns = [],
352- skip_patterns = [] ,
365+ skip_patterns = COMMON_SKIP_PATTERNS ,
353366 speak_patterns = [],
354367 prompt_patterns = [],
355368 skip_progress = [],
0 commit comments