1313 get_workspace_folder_paths ,
1414 normalize_file_path ,
1515 to_epoch_ms ,
16+ warn_workspace_json_read ,
1617)
1718from utils .exclusion_rules import build_searchable_text , is_excluded_by_rules
1819from utils .text_extract import extract_text_from_bubble
@@ -46,6 +47,19 @@ def _try_loads_kv_value(raw: str | None) -> Any | None:
4647 return None
4748
4849
50+ _KV_VALUE_LOG_LIMIT = 200
51+
52+
53+ def _kv_value_log_preview (value : object | None , limit : int = _KV_VALUE_LOG_LIMIT ) -> str :
54+ """Truncated KV payload for warning logs (avoids multi-MB log lines on bad rows)."""
55+ if value is None :
56+ return "None"
57+ text = value if isinstance (value , str ) else str (value )
58+ if len (text ) > limit :
59+ return text [:limit ] + "..."
60+ return text
61+
62+
4963def assemble_workspace_tabs (
5064 workspace_id : str ,
5165 workspace_path : str ,
@@ -73,11 +87,7 @@ def assemble_workspace_tabs(
7387 if first_folder :
7488 target_folder = normalize_file_path (first_folder )
7589 except Exception as e :
76- _logger .warning (
77- "Failed to read workspace.json for %s: %s" ,
78- workspace_id ,
79- e ,
80- )
90+ warn_workspace_json_read (_logger , workspace_id , e )
8191 if target_folder :
8292 for entry in workspace_entries :
8393 try :
@@ -87,11 +97,7 @@ def assemble_workspace_tabs(
8797 if f2 and normalize_file_path (f2 ) == target_folder :
8898 matching_ws_ids .add (entry ["name" ])
8999 except Exception as e :
90- _logger .warning (
91- "Failed to read workspace.json for %s: %s" ,
92- entry ["name" ],
93- e ,
94- )
100+ warn_workspace_json_read (_logger , entry ["name" ], e )
95101
96102 bubble_map : dict [str , dict ] = {}
97103 code_block_diff_map : dict [str , list ] = {}
@@ -122,12 +128,12 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
122128 continue
123129 try :
124130 parsed = json .loads (row ["value" ])
125- except json .JSONDecodeError as e :
131+ except ( json .JSONDecodeError , TypeError , ValueError ) as e :
126132 _logger .warning (
127- "Failed to decode Bubble from %s: %s (value: %r)" ,
133+ "Failed to decode Bubble from %s: %s (value_preview= %r)" ,
128134 row ["key" ],
129135 e ,
130- row ["value" ],
136+ _kv_value_log_preview ( row ["value" ]) ,
131137 )
132138 continue
133139 try :
@@ -206,12 +212,13 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
206212 continue
207213 try :
208214 parsed = json .loads (row ["value" ])
209- except json .JSONDecodeError as e :
215+ except ( json .JSONDecodeError , TypeError , ValueError ) as e :
210216 _logger .warning (
211- "Failed to decode Composer from composerData:%s: %s (value: %r)" ,
217+ "Failed to decode Composer from composerData:%s: %s (key=%s, value_preview= %r)" ,
212218 composer_id ,
213219 e ,
214- row ["value" ],
220+ row ["key" ],
221+ _kv_value_log_preview (row ["value" ]),
215222 )
216223 continue
217224 try :
0 commit comments