11from __future__ import annotations
22
33import json
4+ import logging
45import os
56import sqlite3
67from datetime import datetime , timezone
78
9+ _logger = logging .getLogger (__name__ )
10+
811from utils .cli_chat_reader import list_cli_projects
912from utils .exclusion_rules import build_searchable_text , is_excluded_by_rules
1013from utils .path_helpers import (
1417)
1518from utils .workspace_descriptor import read_json_file
1619from utils .workspace_path import get_cli_chats_path
20+ from models import Composer , SchemaError
1721from services .workspace_db import (
1822 _build_composer_id_to_workspace_id ,
1923 _collect_invalid_workspace_ids ,
@@ -72,7 +76,32 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
7276 for row in composer_rows :
7377 cid = row ["key" ].split (":" )[1 ]
7478 try :
75- cd = json .loads (row ["value" ])
79+ parsed = json .loads (row ["value" ])
80+ except (json .JSONDecodeError , TypeError , ValueError ) as e :
81+ _logger .warning (
82+ "Failed to decode Composer from composerData:%s: %s" ,
83+ cid ,
84+ e ,
85+ )
86+ continue
87+ if not isinstance (parsed , dict ):
88+ _logger .warning (
89+ "Failed to parse Composer from composerData:%s: expected object, got %s" ,
90+ cid ,
91+ type (parsed ).__name__ ,
92+ )
93+ continue
94+ try :
95+ composer = Composer .from_dict (parsed , composer_id = cid )
96+ except SchemaError as e :
97+ _logger .warning (
98+ "Failed to parse Composer from composerData:%s: %s" ,
99+ cid ,
100+ e ,
101+ )
102+ continue
103+ cd = composer .raw
104+ try :
76105 pid = _determine_project_for_conversation (
77106 cd , cid , project_layouts_map ,
78107 project_name_map , workspace_path_map ,
@@ -98,10 +127,14 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
98127 "lastUpdatedAt" : to_epoch_ms (cd .get ("lastUpdatedAt" )) or to_epoch_ms (cd .get ("createdAt" )) or 0 ,
99128 "createdAt" : to_epoch_ms (cd .get ("createdAt" )) or 0 ,
100129 })
101- except Exception :
102- pass
103- except Exception :
104- pass
130+ except Exception as e :
131+ _logger .warning (
132+ "Failed to process Composer from composerData:%s: %s" ,
133+ cid ,
134+ e ,
135+ )
136+ except Exception as e :
137+ _logger .error ("Failed to load composer rows from global storage: %s" , e )
105138
106139 # Group workspace entries by normalized folder path
107140 folder_to_entries : dict [str , list ] = {}
@@ -114,8 +147,12 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
114147 first_folder = folders [0 ] if folders else None
115148 if first_folder :
116149 norm_folder = normalize_file_path (first_folder )
117- except Exception :
118- pass
150+ except Exception as e :
151+ _logger .warning (
152+ "Failed to read workspace.json for %s: %s" ,
153+ entry ["name" ],
154+ e ,
155+ )
119156 if not norm_folder :
120157 norm_folder = entry ["name" ] # fallback to workspace ID
121158 entry_folder_map [entry ["name" ]] = norm_folder
@@ -139,7 +176,12 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
139176 for e in group
140177 if os .path .isfile (os .path .join (workspace_path , e ["name" ], "state.vscdb" ))
141178 )
142- except Exception :
179+ except Exception as e :
180+ _logger .warning (
181+ "Failed to resolve mtime for workspace folder %s: %s" ,
182+ norm_folder ,
183+ e ,
184+ )
143185 mtime = 0
144186
145187 workspace_name = _get_workspace_display_name (workspace_path , primary ["name" ])
@@ -238,7 +280,7 @@ def _safe_fetchall(query: str, params: tuple = ()) -> list:
238280 "source" : "cli" ,
239281 })
240282 except Exception as e :
241- print ( f "Failed to load CLI projects: { e } " )
283+ _logger . warning ( "Failed to load CLI projects: %s" , e )
242284
243285 projects .sort (key = lambda p : p ["lastModified" ], reverse = True )
244286 return projects
0 commit comments