@@ -741,13 +741,7 @@ def assemble_workspace_tabs(
741741 project_layouts_map [chat_id ].append (layout ["rootPath" ])
742742
743743 # Get composer data entries with conversations
744- composer_rows = safe_fetchall (
745- global_db ,
746- "SELECT key, value FROM cursorDiskKV WHERE key LIKE 'composerData:%'"
747- " AND value IS NOT NULL"
748- " AND value LIKE '%fullConversationHeadersOnly%'"
749- " AND value NOT LIKE '%fullConversationHeadersOnly\" :[]%'" ,
750- )
744+ composer_rows = safe_fetchall (global_db , COMPOSER_ROWS_WITH_HEADERS_SQL )
751745
752746 invalid_workspace_aliases = infer_invalid_workspace_aliases (
753747 composer_rows = composer_rows ,
@@ -761,34 +755,12 @@ def assemble_workspace_tabs(
761755 )
762756
763757 for row in composer_rows :
764- composer_id = row ["key" ].split (":" )[1 ]
765- try :
766- parsed = json .loads (row ["value" ])
767- except (json .JSONDecodeError , TypeError , ValueError ) as e :
768- payload_len , payload_fp = _kv_payload_log_meta (row ["value" ])
769- _logger .warning (
770- "Failed to decode Composer from composerData:%s: %s (key=%s, payload_len=%d, payload_sha256=%s)" ,
771- composer_id ,
772- e ,
773- row ["key" ],
774- payload_len ,
775- payload_fp ,
776- )
777- parse_warnings .record_composer_skipped ()
778- continue
779- try :
780- composer = Composer .from_dict (parsed , composer_id = composer_id )
781- except SchemaError as e :
782- # Drift skipped + logged so the two primary conversation
783- # paths (list_workspaces + get_workspace_tabs) agree on what
784- # counts as a valid composer.
785- _logger .warning (
786- "Failed to parse Composer from composerData:%s: %s" ,
787- composer_id ,
788- e ,
789- )
790- parse_warnings .record_composer_skipped ()
758+ composer = parse_composer_data_row (
759+ row ["key" ], row ["value" ], parse_warnings = parse_warnings ,
760+ )
761+ if composer is None :
791762 continue
763+ composer_id = composer .composer_id
792764 try :
793765 # Determine project
794766 pid = determine_project_for_conversation (
0 commit comments