{ "generated_from_raw_symbol_count": 367, "final_row_count": 363, "expected_controls_checked": [ "wf_list", "wf_edit_btn", "wf_dup_btn", "wf_del_btn", "wf_runbg_btn", "agent_list", "ag_new_btn", "ag_edit_btn", "ag_del_btn", "skill_list", "sk_manage_btn", "runs_btn", "runs_back_btn", "runs_table", "runs_side_list", "runs_more_btn", "name_edit", "add_step_btn", "save_btn", "save_tpl_btn", "mode_combo", "run_btn", "run_stop_btn", "run_rename_btn", "run_del_btn", "run_clear_btn", "ws_folder_btn" ], "expected_controls_ok": true, "khac_tai_lieu_notes_found": 0, "merged_duplicate_symbol_groups": [ "Co4ECanvas.dropEvent", "Co4ETab._co4e_routed_provider", "Co4ETab._config_expanded_w", "Co4ETab._reload_sidebar" ], "kept_separate_anomaly_symbols": [ "Co4ETab.showEvent" ], "rows": [ { "symbol": "Co4ETab._flow_outputs", "kind": "attribute", "line_display": "245", "line_start": 245, "line_end": 245, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "application/workflows/co4e_workflow_service.py", "note": "state per-flow outputs — ứng viên chuyển vào state machine thuần Python", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 29 ] }, { "symbol": "Co4ETab._outputs_for", "kind": "method", "line_display": "475-478", "line_start": 475, "line_end": 478, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "application/workflows/co4e_workflow_service.py", "note": "truy cập dict state per-flow outputs, thuần Python", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 54 ] }, { "symbol": "Co4ETab._duplicate_selected_workflow", "kind": "method", "line_display": "1239-1246", "line_start": 1239, "line_end": 1246, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "tương ứng _duplicate_flow() trong bảng plan.md dòng 616, nhưng tên hàm thực tế khác (_duplicate_selected_workflow). Gộp gọi service (co4e.duplicate_workflow, đĩa) với cập nhật UI (self._reload_sidebar(), self.status_message.emit) — cần tách; phần UI nên ở lại co4e_tab.py.", "in_old_table": "co", "old_table_mismatch": "ate_flow() trong bảng plan.md dòng 616, nhưng tên hàm thực tế khác (_duplicate_selected_workflow). Gộp gọi service (co4e.duplicate_workflow, đĩa)", "merged_from_raw_indices": [ 155 ] }, { "symbol": "Co4ETab._rename_workflow", "kind": "method", "line_display": "1273-1289", "line_start": 1273, "line_end": 1289, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "mở QInputDialog (cần Qt) rồi gọi co4e.save_workflow (đĩa), đồng bộ self._wf.name/self.name_edit nếu flow đang mở là flow bị đổi tên — gộp UI dialog + service + trạng thái chia sẻ self._wf trong 1 hàm, nên tách.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 157 ] }, { "symbol": "Co4ETab._delete_selected_workflow", "kind": "method", "line_display": "1291-1297", "line_start": 1291, "line_end": 1297, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "tương ứng _delete_flow() trong bảng plan.md dòng 616; gọi co4e.delete_workflow (đĩa).", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 158 ] }, { "symbol": "Co4ETab._save", "kind": "method", "line_display": "1304-1309", "line_start": 1304, "line_end": 1309, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "gộp _sync_wf_from_canvas (đọc canvas UI), lưu đĩa (co4e.save_workflow), và cập nhật UI (_reload_sidebar, status_message) — cần tách phần service khỏi phần UI khi chuyển sang co4e_workflow_service.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 160 ] }, { "symbol": "Co4ETab._autosave", "kind": "method", "line_display": "1311-1314", "line_start": 1311, "line_end": 1314, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "gọi self._sync_wf_from_canvas() (cần canvas) rồi co4e.get_workflow/save_workflow (đĩa).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 161 ] }, { "symbol": "Co4ETab._skill_map", "kind": "method", "line_display": "1376-1382", "line_start": 1376, "line_end": 1382, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "application/workflows/co4e_workflow_service.py", "note": "chuẩn bị nội dung skill (skills_mod.skill_prefix_for, đọc đĩa) để đưa vào lúc chạy flow/chat — không có trong bảng plan.md, tự xếp theo chức năng (dùng lúc run/build system prompt, không phải UI danh sách skill).", "in_old_table": "co", "old_table_mismatch": "ọc đĩa) để đưa vào lúc chạy flow/chat — không có trong bảng plan.md, tự xếp theo chức năng (dùng lúc run/build system prompt, không phải UI danh sá", "merged_from_raw_indices": [ 171 ] }, { "symbol": "Co4ETab.ag_new_btn", "kind": "attribute", "line_display": "550", "line_start": 550, "line_end": 550, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/agent_list_panel.py", "note": "hiện định nghĩa trực tiếp trong Co4ETab._build_sidebar — ứng viên chuyển sang agent_list_panel.py tương tự cách skills đã tách", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 69 ] }, { "symbol": "Co4ETab.agent_list", "kind": "attribute", "line_display": "558", "line_start": 558, "line_end": 558, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/agent_list_panel.py", "note": "cùng lý do với ag_new_btn", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 70 ] }, { "symbol": "Co4ETab.ag_edit_btn", "kind": "attribute", "line_display": "562", "line_start": 562, "line_end": 562, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/agent_list_panel.py", "note": "cùng lý do với ag_new_btn", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 71 ] }, { "symbol": "Co4ETab.ag_del_btn", "kind": "attribute", "line_display": "563", "line_start": 563, "line_end": 563, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/agent_list_panel.py", "note": "cùng lý do với ag_new_btn", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 72 ] }, { "symbol": "Co4ETab._new_agent", "kind": "method", "line_display": "1339-1340", "line_start": 1339, "line_end": 1340, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/agent_list_panel.py", "note": "tương ứng _create_agent() trong bảng plan.md dòng 620 (tên hàm thực tế là _new_agent).", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 166 ] }, { "symbol": "Co4ETab._edit_agent", "kind": "method", "line_display": "1342-1350", "line_start": 1342, "line_end": 1350, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/agent_list_panel.py", "note": "khớp _edit_agent() dòng 620 plan.md; gọi co4e.list_custom_agents() (đĩa).", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 167 ] }, { "symbol": "Co4ETab._edit_agent_dialog", "kind": "method", "line_display": "1352-1358", "line_start": 1352, "line_end": 1358, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/agent_list_panel.py", "note": "mở Co4EAgentDialog rồi co4e.save_custom_agent (đĩa) và self._reload_sidebar() — trạng thái chia sẻ, liên quan tới cắt ngang lát ở _reload_sidebar.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 168 ] }, { "symbol": "Co4ETab._delete_agent", "kind": "method", "line_display": "1360-1367", "line_start": 1360, "line_end": 1367, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/agent_list_panel.py", "note": "khớp _delete_agent() dòng 620 plan.md; gọi co4e.delete_custom_agent (đĩa).", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 169 ] }, { "symbol": "_status_color", "kind": "function", "line_display": "43-50", "line_start": 43, "line_end": 50, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 221 ] }, { "symbol": "_NodeItem", "kind": "class", "line_display": "59-210", "line_start": 59, "line_end": 210, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "class nội bộ gắn chặt với Co4ECanvas qua self.canvas backreference — nên đi cùng file với Co4ECanvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 222 ] }, { "symbol": "_NodeItem.__init__", "kind": "method", "line_display": "62-72", "line_start": 62, "line_end": 72, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 223 ] }, { "symbol": "_NodeItem.node", "kind": "attribute", "line_display": "64", "line_start": 64, "line_end": 64, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "giữ tham chiếu domain Node — dữ liệu chia sẻ với core/co4e.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 224 ] }, { "symbol": "_NodeItem.canvas", "kind": "attribute", "line_display": "65", "line_start": 65, "line_end": 65, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "backreference tới Co4ECanvas cha — mọi event của _NodeItem đều gọi ngược lên canvas (add_step_below, begin_connect, delete_node, các signal) — điểm khớp nối chặt nhất trong file", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 225 ] }, { "symbol": "_NodeItem.status", "kind": "attribute", "line_display": "66", "line_start": 66, "line_end": 66, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 226 ] }, { "symbol": "_NodeItem._porting", "kind": "attribute", "line_display": "67", "line_start": 67, "line_end": 67, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 227 ] }, { "symbol": "_NodeItem.boundingRect", "kind": "method", "line_display": "74-76", "line_start": 74, "line_end": 76, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "trả QRectF như kiểu giá trị, logic thuần", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 228 ] }, { "symbol": "_NodeItem._card_rect", "kind": "method", "line_display": "78-79", "line_start": 78, "line_end": 79, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 229 ] }, { "symbol": "_NodeItem.paint", "kind": "method", "line_display": "81-139", "line_start": 81, "line_end": 139, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "vẽ toàn bộ card: nền, header stripe, label, badge role, preview instructions/sub-agents, footer model/skills, 2 port — gộp nhiều việc nhưng vẫn dưới 80 dòng nên chưa bắt buộc tách thêm", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 230 ] }, { "symbol": "_NodeItem._in_out_port", "kind": "method", "line_display": "141-143", "line_start": 141, "line_end": 143, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "hình học thuần dùng QPointF như kiểu giá trị", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 231 ] }, { "symbol": "_NodeItem.itemChange", "kind": "method", "line_display": "145-156", "line_start": 145, "line_end": 156, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "ghi self.node.x/y rồi gọi self.canvas._reposition_edges() và emit self.canvas.graph_changed/node_selected — chạm trạng thái chia sẻ của canvas cha", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 232 ] }, { "symbol": "_NodeItem.hoverMoveEvent", "kind": "method", "line_display": "158-161", "line_start": 158, "line_end": 161, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 233 ] }, { "symbol": "_NodeItem.mousePressEvent", "kind": "method", "line_display": "163-174", "line_start": 163, "line_end": 174, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "đọc/ghi self.canvas._connect_from, gọi canvas._finish_connect/begin_port_drag — trạng thái connect-mode chia sẻ với Co4ECanvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 234 ] }, { "symbol": "_NodeItem.mouseMoveEvent", "kind": "method", "line_display": "176-181", "line_start": 176, "line_end": 181, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 235 ] }, { "symbol": "_NodeItem.mouseReleaseEvent", "kind": "method", "line_display": "183-189", "line_start": 183, "line_end": 189, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 236 ] }, { "symbol": "_NodeItem.mouseDoubleClickEvent", "kind": "method", "line_display": "191-193", "line_start": 191, "line_end": 193, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 237 ] }, { "symbol": "_NodeItem.contextMenuEvent", "kind": "method", "line_display": "195-207", "line_start": 195, "line_end": 207, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "gọi canvas.add_step_below/begin_connect/delete_node — trạng thái/hành vi thuộc canvas cha", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 238 ] }, { "symbol": "_NodeItem.center", "kind": "method", "line_display": "209-210", "line_start": 209, "line_end": 210, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "trả QPointF như kiểu giá trị", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 239 ] }, { "symbol": "_EdgeItem", "kind": "class", "line_display": "213-286", "line_start": 213, "line_end": 286, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "class nội bộ gắn chặt với Co4ECanvas qua self.canvas backreference", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 240 ] }, { "symbol": "_EdgeItem.__init__", "kind": "method", "line_display": "214-225", "line_start": 214, "line_end": 225, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 241 ] }, { "symbol": "_EdgeItem.edge", "kind": "attribute", "line_display": "216", "line_start": 216, "line_end": 216, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "tham chiếu domain Edge — chia sẻ với core/co4e.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 242 ] }, { "symbol": "_EdgeItem.canvas", "kind": "attribute", "line_display": "217", "line_start": 217, "line_end": 217, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "backreference tới Co4ECanvas — contextMenuEvent gọi canvas.delete_edge", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 243 ] }, { "symbol": "_EdgeItem._dst", "kind": "attribute", "line_display": "218", "line_start": 218, "line_end": 218, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 244 ] }, { "symbol": "_EdgeItem._hover", "kind": "attribute", "line_display": "224", "line_start": 224, "line_end": 224, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 245 ] }, { "symbol": "_EdgeItem._apply_pen", "kind": "method", "line_display": "227-235", "line_start": 227, "line_end": 235, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 246 ] }, { "symbol": "_EdgeItem.update_path", "kind": "method", "line_display": "237-239", "line_start": 237, "line_end": 239, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 247 ] }, { "symbol": "_EdgeItem.boundingRect", "kind": "method", "line_display": "241-242", "line_start": 241, "line_end": 242, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "gọi super().boundingRect() phụ thuộc trạng thái path sống của item", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 248 ] }, { "symbol": "_EdgeItem.shape", "kind": "method", "line_display": "244-249", "line_start": 244, "line_end": 249, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "dùng QPainterPathStroker trên self.path() sống của item", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 249 ] }, { "symbol": "_EdgeItem.hoverEnterEvent", "kind": "method", "line_display": "251-255", "line_start": 251, "line_end": 255, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 250 ] }, { "symbol": "_EdgeItem.hoverLeaveEvent", "kind": "method", "line_display": "257-261", "line_start": 257, "line_end": 261, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 251 ] }, { "symbol": "_EdgeItem.paint", "kind": "method", "line_display": "263-279", "line_start": 263, "line_end": 279, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 252 ] }, { "symbol": "_EdgeItem.contextMenuEvent", "kind": "method", "line_display": "281-286", "line_start": 281, "line_end": 286, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "gọi self.canvas.delete_edge(self.edge)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 253 ] }, { "symbol": "Co4ECanvas", "kind": "class", "line_display": "289-700", "line_start": 289, "line_end": 700, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "cắt ngang lát — class tiếp tục sau dòng 700 (dropEvent chưa kết thúc, có thể còn method khác chưa đọc) — cần agent gộp đối chiếu với phần đọc dòng 701+", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 254 ] }, { "symbol": "Co4ECanvas.node_selected", "kind": "attribute", "line_display": "290", "line_start": 290, "line_end": 290, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "Signal được node_property_panel.py (và co4e_tab.py) nối vào để nạp node được chọn — điểm chia sẻ giữa canvas và property panel", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 255 ] }, { "symbol": "Co4ECanvas.node_activated", "kind": "attribute", "line_display": "291", "line_start": 291, "line_end": 291, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "Signal double-click, có thể được co4e_tab.py nối để mở panel chỉnh sửa — cần kiểm nơi consume", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 256 ] }, { "symbol": "Co4ECanvas.graph_changed", "kind": "attribute", "line_display": "292", "line_start": 292, "line_end": 292, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "Signal báo graph đổi (autosave) — nhiều khả năng được co4e_tab.py/co4e_workflow_service.py nối để lưu flow, trạng thái chia sẻ xuyên lớp application", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 257 ] }, { "symbol": "Co4ECanvas.__init__", "kind": "method", "line_display": "296-315", "line_start": 296, "line_end": 315, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 258 ] }, { "symbol": "Co4ECanvas._scene", "kind": "attribute", "line_display": "299", "line_start": 299, "line_end": 299, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 259 ] }, { "symbol": "Co4ECanvas._nodes", "kind": "attribute", "line_display": "305", "line_start": 305, "line_end": 305, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "dict id->_NodeItem — trạng thái trung tâm được đọc/ghi bởi gần như mọi method của Co4ECanvas (add/delete/relayout/zoom/status/route edges)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 260 ] }, { "symbol": "Co4ECanvas._edges", "kind": "attribute", "line_display": "306", "line_start": 306, "line_end": 306, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "list _EdgeItem — trạng thái trung tâm tương tự self._nodes", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 261 ] }, { "symbol": "Co4ECanvas._connect_from", "kind": "attribute", "line_display": "307", "line_start": 307, "line_end": 307, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "trạng thái connect-mode, cũng được _NodeItem.mousePressEvent đọc/ghi qua self.canvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 262 ] }, { "symbol": "Co4ECanvas._zoom", "kind": "attribute", "line_display": "308", "line_start": 308, "line_end": 308, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 263 ] }, { "symbol": "Co4ECanvas._panning", "kind": "attribute", "line_display": "309", "line_start": 309, "line_end": 309, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 264 ] }, { "symbol": "Co4ECanvas._pan_start", "kind": "attribute", "line_display": "310", "line_start": 310, "line_end": 310, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 265 ] }, { "symbol": "Co4ECanvas._overlay", "kind": "attribute", "line_display": "311", "line_start": 311, "line_end": 311, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "widget zoom/fit overlay được co4e_tab.py hoặc co4e_canvas_widget.py truyền vào qua add_overlay()", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 266 ] }, { "symbol": "Co4ECanvas._port_src", "kind": "attribute", "line_display": "313", "line_start": 313, "line_end": 313, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 267 ] }, { "symbol": "Co4ECanvas._port_src_pt", "kind": "attribute", "line_display": "314", "line_start": 314, "line_end": 314, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 268 ] }, { "symbol": "Co4ECanvas._temp_edge", "kind": "attribute", "line_display": "315", "line_start": 315, "line_end": 315, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 269 ] }, { "symbol": "Co4ECanvas.add_overlay", "kind": "method", "line_display": "318-323", "line_start": 318, "line_end": 323, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 270 ] }, { "symbol": "Co4ECanvas._place_overlay", "kind": "method", "line_display": "325-330", "line_start": 325, "line_end": 330, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 271 ] }, { "symbol": "Co4ECanvas.resizeEvent", "kind": "method", "line_display": "332-334", "line_start": 332, "line_end": 334, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 272 ] }, { "symbol": "Co4ECanvas.scrollContentsBy", "kind": "method", "line_display": "336-341", "line_start": 336, "line_end": 341, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 273 ] }, { "symbol": "Co4ECanvas.showEvent", "kind": "method", "line_display": "343-345", "line_start": 343, "line_end": 345, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 274 ] }, { "symbol": "Co4ECanvas.load", "kind": "method", "line_display": "348-362", "line_start": 348, "line_end": 362, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "reset toàn bộ self._nodes/self._edges/self._connect_from/self._port_src/self._temp_edge — điểm nạp lại state từ flow, được co4e_tab.py hoặc co4e_workflow_service.py gọi khi mở flow", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 275 ] }, { "symbol": "Co4ECanvas.nodes", "kind": "method", "line_display": "364-365", "line_start": 364, "line_end": 365, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "chỉ đọc .node từ self._nodes, không gọi API Qt trực tiếp", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 276 ] }, { "symbol": "Co4ECanvas.edges", "kind": "method", "line_display": "367-368", "line_start": 367, "line_end": 368, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 277 ] }, { "symbol": "Co4ECanvas.add_node", "kind": "method", "line_display": "371-382", "line_start": 371, "line_end": 382, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "ghi self._nodes, scene.addItem, emit graph_changed/node_selected — trạng thái chia sẻ với property panel qua node_selected", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 278 ] }, { "symbol": "Co4ECanvas.add_step_below", "kind": "method", "line_display": "384-390", "line_start": 384, "line_end": 390, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "orchestration thuần, ủy quyền cho add_node (bản thân không gọi trực tiếp API Qt)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 279 ] }, { "symbol": "Co4ECanvas._chain_tail", "kind": "method", "line_display": "392-396", "line_start": 392, "line_end": 396, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 280 ] }, { "symbol": "Co4ECanvas.add_palette_step", "kind": "method", "line_display": "398-400", "line_start": 398, "line_end": 400, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 281 ] }, { "symbol": "Co4ECanvas.begin_connect", "kind": "method", "line_display": "402-403", "line_start": 402, "line_end": 403, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 282 ] }, { "symbol": "Co4ECanvas._finish_connect", "kind": "method", "line_display": "405-409", "line_start": 405, "line_end": 409, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 283 ] }, { "symbol": "Co4ECanvas.begin_port_drag", "kind": "method", "line_display": "412-419", "line_start": 412, "line_end": 419, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 284 ] }, { "symbol": "Co4ECanvas.update_port_drag", "kind": "method", "line_display": "421-424", "line_start": 421, "line_end": 424, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 285 ] }, { "symbol": "Co4ECanvas.finish_port_drag", "kind": "method", "line_display": "426-435", "line_start": 426, "line_end": 435, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 286 ] }, { "symbol": "Co4ECanvas._node_at", "kind": "method", "line_display": "437-441", "line_start": 437, "line_end": 441, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "dùng self._scene.items(scene_pt) — cần scene đang sống", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 287 ] }, { "symbol": "Co4ECanvas._make_edge", "kind": "method", "line_display": "443-451", "line_start": 443, "line_end": 451, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 288 ] }, { "symbol": "Co4ECanvas._add_edge_item", "kind": "method", "line_display": "453-456", "line_start": 453, "line_end": 456, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 289 ] }, { "symbol": "Co4ECanvas.delete_edge", "kind": "method", "line_display": "458-463", "line_start": 458, "line_end": 463, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 290 ] }, { "symbol": "Co4ECanvas.delete_node", "kind": "method", "line_display": "465-475", "line_start": 465, "line_end": 475, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 291 ] }, { "symbol": "Co4ECanvas.delete_selected", "kind": "method", "line_display": "477-481", "line_start": 477, "line_end": 481, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 292 ] }, { "symbol": "Co4ECanvas._zoom_by", "kind": "method", "line_display": "484-495", "line_start": 484, "line_end": 495, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 293 ] }, { "symbol": "Co4ECanvas.zoom_in", "kind": "method", "line_display": "497-498", "line_start": 497, "line_end": 498, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 294 ] }, { "symbol": "Co4ECanvas.zoom_out", "kind": "method", "line_display": "500-501", "line_start": 500, "line_end": 501, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 295 ] }, { "symbol": "Co4ECanvas.reset_zoom", "kind": "method", "line_display": "503-505", "line_start": 503, "line_end": 505, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 296 ] }, { "symbol": "Co4ECanvas.wheelEvent", "kind": "method", "line_display": "507-519", "line_start": 507, "line_end": 519, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 297 ] }, { "symbol": "Co4ECanvas.mousePressEvent", "kind": "method", "line_display": "522-529", "line_start": 522, "line_end": 529, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "trùng tên với _NodeItem.mousePressEvent nhưng là override của Co4ECanvas (pan chuột giữa) — đừng nhầm khi gộp map", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 298 ] }, { "symbol": "Co4ECanvas.mouseMoveEvent", "kind": "method", "line_display": "531-540", "line_start": 531, "line_end": 540, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 299 ] }, { "symbol": "Co4ECanvas.mouseReleaseEvent", "kind": "method", "line_display": "542-548", "line_start": 542, "line_end": 548, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 300 ] }, { "symbol": "Co4ECanvas.fit_view", "kind": "method", "line_display": "550-558", "line_start": 550, "line_end": 558, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 301 ] }, { "symbol": "Co4ECanvas.relayout", "kind": "method", "line_display": "560-578", "line_start": 560, "line_end": 578, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "phần tính waves/cols (compute_waves, defaultdict) là logic thuần, phần item.setPos() cần scene sống — có thể tách hàm tính toạ độ ra khỏi phần apply nếu muốn test thuần Python", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 302 ] }, { "symbol": "Co4ECanvas.relayout_if_vertical", "kind": "method", "line_display": "580-589", "line_start": 580, "line_end": 589, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "bản thân chỉ ra quyết định thuần dựa trên node.x, việc chạm Qt nằm trong relayout() được gọi", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 303 ] }, { "symbol": "Co4ECanvas.add_workflow", "kind": "method", "line_display": "591-610", "line_start": 591, "line_end": 610, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 304 ] }, { "symbol": "Co4ECanvas.update_node_status", "kind": "method", "line_display": "612-616", "line_start": 612, "line_end": 616, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "được co4e_run_control_widget.py gọi khi step chạy/xong/lỗi — điểm nối giữa canvas và run control", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 305 ] }, { "symbol": "Co4ECanvas.reset_statuses", "kind": "method", "line_display": "618-621", "line_start": 618, "line_end": 621, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "được co4e_run_control_widget.py gọi khi bắt đầu run mới", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 306 ] }, { "symbol": "Co4ECanvas.refresh_node", "kind": "method", "line_display": "623-626", "line_start": 623, "line_end": 626, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 307 ] }, { "symbol": "Co4ECanvas._node_rects", "kind": "method", "line_display": "628-638", "line_start": 628, "line_end": 638, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "dựng QRectF như kiểu giá trị từ item.pos() — logic hình học thuần", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 308 ] }, { "symbol": "Co4ECanvas._reposition_edges", "kind": "method", "line_display": "640-649", "line_start": 640, "line_end": 649, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "gọi e.update_path (setPath) trên item sống, dùng hàm định tuyến _route từ canvas_geometry.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 309 ] }, { "symbol": "Co4ECanvas.keyPressEvent", "kind": "method", "line_display": "652-669", "line_start": 652, "line_end": 669, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 310 ] }, { "symbol": "Co4ECanvas.dragEnterEvent", "kind": "method", "line_display": "671-675", "line_start": 671, "line_end": 675, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 311 ] }, { "symbol": "Co4ECanvas.dragMoveEvent", "kind": "method", "line_display": "677-681", "line_start": 677, "line_end": 681, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 312 ] }, { "symbol": "Co4ECanvas.dropEvent", "kind": "method", "line_display": "683-701", "line_start": 683, "line_end": 701, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 683-700, target gốc=presentation/co4e/co4e_canvas_widget.py) cắt ngang lát — cần agent gộp đối chiếu (thân try chưa đóng ở dòng 700, còn tiếp; xử lý JSON từ mimeData trong bộ nhớ, không phải file đĩa nên touches_disk_or_network=false) || (dòng 683-701, target gốc=presentation/co4e/co4e_canvas_widget.py) cắt ngang lát — cần agent gộp đối chiếu. Method dropEvent bắt đầu ở dòng 683 (ngoài khoảng được giao 701-791), chỉ dòng 701 (e.acceptProposedAction()) nằm trong lát này; dòng 702 là dòng trống cuối file. File ui/co4e_canvas.py chỉ có 702 dòng — không có nội dung nào khác trong khoảng 702-791 vì đã hết file. Xử lý drop từ sidebar (kind=='workflow' → add_workflow, ngược lại → add_palette_step) — logic thao tác node/canvas nên khớp nhóm _add_node/_connect_nodes trong bảng plan.md dòng 623 dù plan.md không liệt kê rõ dropEvent.", "in_old_table": "co", "old_table_mismatch": "nnect_nodes trong bảng plan.md dòng 623 dù plan.md không liệt kê rõ dropEvent.", "merged_from_raw_indices": [ 313, 314 ] }, { "symbol": "Co4ETab.canvas", "kind": "attribute", "line_display": "856", "line_start": 856, "line_end": 856, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "TRẠNG THÁI CHIA SẺ lớn nhất trong file — self.canvas được đọc/ghi ở gần như mọi nhóm chức năng khác (sync_wf_from_canvas, apply_workflow, node selection, run, add_blank_step...).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 100 ] }, { "symbol": "Co4ETab._build_canvas_overlay", "kind": "method", "line_display": "1041-1062", "line_start": 1041, "line_end": 1062, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "dựng nút zoom/fit gắn vào self.canvas.add_overlay(bar); các slot gọi thẳng self.canvas.zoom_in/zoom_out/fit_view (thuộc nhóm 3.2.2.21-22 trong plan.md → co4e_canvas_widget.py). Có thể tranh cãi nên giữ ở co4e_tab.py (được gọi từ _build_center) — ghi lại để người soát quyết.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 124 ] }, { "symbol": "Co4ETab.zoom_in_btn", "kind": "attribute", "line_display": "1054", "line_start": 1054, "line_end": 1054, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 125 ] }, { "symbol": "Co4ETab.zoom_out_btn", "kind": "attribute", "line_display": "1055", "line_start": 1055, "line_end": 1055, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 126 ] }, { "symbol": "Co4ETab.fit_btn", "kind": "attribute", "line_display": "1056", "line_start": 1056, "line_end": 1056, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_canvas_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 127 ] }, { "symbol": "_skill_names", "kind": "function", "line_display": "61-65", "line_start": 61, "line_end": 65, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "gọi skills_mod.list_skills()/builtin_skills() (đọc đĩa); dùng cho autocomplete /skill: trong _ChatInput — cũng liên quan skills_list_panel.py vì cùng nguồn dữ liệu", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 2 ] }, { "symbol": "_agent_names", "kind": "function", "line_display": "68-71", "line_start": 68, "line_end": 71, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "gọi co4e.list_custom_agents() (đọc đĩa); dùng cho autocomplete /agent: trong _ChatInput — cũng liên quan agent_list_panel.py vì cùng nguồn dữ liệu", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 3 ] }, { "symbol": "_directive_token", "kind": "function", "line_display": "122-134", "line_start": 122, "line_end": 134, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "logic regex thuần Python, test được không cần Qt", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 12 ] }, { "symbol": "_ChatInput", "kind": "class", "line_display": "137-226", "line_start": 137, "line_end": 226, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "khai báo 'submit = Signal()' ở dòng 141 là thuộc tính lớp (không phải self.)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 13 ] }, { "symbol": "_ChatInput.__init__", "kind": "method", "line_display": "143-151", "line_start": 143, "line_end": 151, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 14 ] }, { "symbol": "_ChatInput._popup", "kind": "attribute", "line_display": "145", "line_start": 145, "line_end": 145, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "QListWidget popup autocomplete", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 15 ] }, { "symbol": "_ChatInput._maybe_popup", "kind": "method", "line_display": "153-178", "line_start": 153, "line_end": 178, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 16 ] }, { "symbol": "_ChatInput._add_row", "kind": "method", "line_display": "180-184", "line_start": 180, "line_end": 184, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 17 ] }, { "symbol": "_ChatInput._accept", "kind": "method", "line_display": "186-199", "line_start": 186, "line_end": 199, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 18 ] }, { "symbol": "_ChatInput.focusOutEvent", "kind": "method", "line_display": "201-204", "line_start": 201, "line_end": 204, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 19 ] }, { "symbol": "_ChatInput.keyPressEvent", "kind": "method", "line_display": "206-226", "line_start": 206, "line_end": 226, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 20 ] }, { "symbol": "Co4ETab._chat_worker", "kind": "attribute", "line_display": "236", "line_start": 236, "line_end": 236, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "AgentWorker của chat, hiện giữ trên Co4ETab", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 25 ] }, { "symbol": "Co4ETab._build_chat", "kind": "method", "line_display": "1064-1127", "line_start": 1064, "line_end": 1127, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "dài ~63 dòng, gộp: header 'Messages' + toggle, chat_stack (QStackedWidget chứa 1 ChatView/flow), input row + usage label + composer + routing toggle. Tạo self._flow_logs (Dict[str, ChatView]) — TRẠNG THÁI CHIA SẺ dùng bởi _ensure_flow_log/_active_log/chat_log/_apply_workflow (self._wf) — điểm dễ vỡ nhất khi tách file chat ra khỏi co4e_tab.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 128 ] }, { "symbol": "Co4ETab._chat_widget", "kind": "attribute", "line_display": "1066", "line_start": 1066, "line_end": 1066, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 129 ] }, { "symbol": "Co4ETab._mhdr", "kind": "attribute", "line_display": "1072", "line_start": 1072, "line_end": 1072, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 130 ] }, { "symbol": "Co4ETab.msgs_icon", "kind": "attribute", "line_display": "1074", "line_start": 1074, "line_end": 1074, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 131 ] }, { "symbol": "Co4ETab.msgs_title", "kind": "attribute", "line_display": "1075", "line_start": 1075, "line_end": 1075, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 132 ] }, { "symbol": "Co4ETab.chat_toggle_btn", "kind": "attribute", "line_display": "1076", "line_start": 1076, "line_end": 1076, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 133 ] }, { "symbol": "Co4ETab.chat_stack", "kind": "attribute", "line_display": "1091", "line_start": 1091, "line_end": 1091, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "chuyển self.center_stack tương tự — dùng chung với self.center_stack (co4e_tab.py).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 134 ] }, { "symbol": "Co4ETab._flow_logs", "kind": "attribute", "line_display": "1092", "line_start": 1092, "line_end": 1092, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "Dict[str, ChatView] keyed theo workflow id — TRẠNG THÁI CHIA SẺ chính của toàn bộ logic chat theo-flow; đọc/ghi bởi _ensure_flow_log, _active_log, chat_log, _apply_workflow, và các hàm chat khác ngoài phạm vi đọc (>1400).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 135 ] }, { "symbol": "Co4ETab.chat_input_row", "kind": "attribute", "line_display": "1094", "line_start": 1094, "line_end": 1094, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 136 ] }, { "symbol": "Co4ETab._usage_total_lbl", "kind": "attribute", "line_display": "1099", "line_start": 1099, "line_end": 1099, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 137 ] }, { "symbol": "Co4ETab.chat_input", "kind": "attribute", "line_display": "1105", "line_start": 1105, "line_end": 1105, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 138 ] }, { "symbol": "Co4ETab.chat_send_btn", "kind": "attribute", "line_display": "1108", "line_start": 1108, "line_end": 1108, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 139 ] }, { "symbol": "Co4ETab.co4e_routing_toggle", "kind": "attribute", "line_display": "1113", "line_start": 1113, "line_end": 1113, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "RoutingToggle(self.ctx, 'co4e') — self.ctx là trạng thái chia sẻ của cả Co4ETab (khởi tạo ngoài phạm vi đọc).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 140 ] }, { "symbol": "Co4ETab._co4e_routed_provider", "kind": "attribute", "line_display": "1114; 1853", "line_start": 1114, "line_end": 1853, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 1114-1114, target gốc=presentation/co4e/co4e_chat_view.py) override provider cho lượt chat kế tiếp — dùng bởi _apply_co4e_routing (ngoài phạm vi đọc, >1400). || (dòng 1853-1853, target gốc=presentation/co4e/co4e_chat_view.py) gán None lần đầu tại đây (trong _apply_co4e_routing); đọc bằng getattr(self, '_co4e_routed_provider', None) ở _run_chat_turn dòng ~1922 — gợi ý có thể không được init trong __init__. Trạng thái routing theo từng lượt chat, dùng chung giữa chat-view và _start_canvas_run/manager.start.", "in_old_table": "chua/khong ro", "old_table_mismatch": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 1114-1114, target gốc=presentation/co4e/co4e_chat_view.py) overr", "merged_from_raw_indices": [ 141, 204 ] }, { "symbol": "Co4ETab._vsplit_sizes", "kind": "attribute", "line_display": "1121", "line_start": 1121, "line_end": 1121, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "dùng bởi _toggle_messages để restore kích thước splitter — chia sẻ với self._vsplit (co4e_tab.py).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 142 ] }, { "symbol": "Co4ETab._msgs_collapsed", "kind": "attribute", "line_display": "1122", "line_start": 1122, "line_end": 1122, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 143 ] }, { "symbol": "Co4ETab._toggle_messages", "kind": "method", "line_display": "1129-1161", "line_start": 1129, "line_end": 1161, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "thao tác self._vsplit (tạo ở co4e_tab.py/_build_center) — trạng thái chia sẻ giữa co4e_chat_view.py và co4e_tab.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 144 ] }, { "symbol": "Co4ETab._ensure_flow_log", "kind": "method", "line_display": "1164-1173", "line_start": 1164, "line_end": 1173, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "đọc/ghi self._flow_logs — trạng thái chia sẻ chính của chat theo-flow.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 145 ] }, { "symbol": "Co4ETab._active_log", "kind": "method", "line_display": "1175-1177", "line_start": 1175, "line_end": 1177, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "đọc self._wf — trạng thái chia sẻ với toàn bộ Co4ETab (canvas, sidebar, save/autosave, run control).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 146 ] }, { "symbol": "Co4ETab.chat_log", "kind": "method", "line_display": "1180-1183", "line_start": 1180, "line_end": 1183, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "@property, chỉ đọc, uỷ nhiệm cho _active_log().", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 147 ] }, { "symbol": "Co4ETab._plan_bubble", "kind": "method", "line_display": "1186-1187", "line_start": 1186, "line_end": 1187, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "@property getter, đọc self._active_log()._co4e_plan_bubble (thuộc tính gắn thêm vào từng instance ChatView).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 148 ] }, { "symbol": "Co4ETab._plan_bubble (setter)", "kind": "method", "line_display": "1189-1191", "line_start": 1189, "line_end": 1191, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "@_plan_bubble.setter, ghi self._active_log()._co4e_plan_bubble.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 149 ] }, { "symbol": "Co4ETab._chat_send", "kind": "method", "line_display": "1820-1846", "line_start": 1820, "line_end": 1846, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "self.chat_input.clear(), self._append_chat — thao tác widget; điều phối /agent /skill directive rồi gọi self._run_chat_turn (network qua provider, không trực tiếp trong hàm này)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 202 ] }, { "symbol": "Co4ETab._apply_co4e_routing", "kind": "method", "line_display": "1848-1883", "line_start": 1848, "line_end": 1883, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "gọi confirm_switch (dialog Qt) khi mode=='manual' và self._append_chat khi có switch — cần widget sống. Gán self._co4e_routed_provider (xem attribute riêng).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 203 ] }, { "symbol": "Co4ETab._extract_agent_directive", "kind": "method", "line_display": "1885-1891", "line_start": 1885, "line_end": 1891, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "regex thuần Python", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 205 ] }, { "symbol": "Co4ETab._resolve_agent", "kind": "method", "line_display": "1893-1901", "line_start": 1893, "line_end": 1901, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "tra cứu BUILTIN_AGENTS và co4e.list_custom_agents() (bộ nhớ/đĩa tùy triển khai list_custom_agents, không rõ trong khoảng đọc) — cross-reference với agent_list_panel.py (nguồn danh sách custom agent)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 206 ] }, { "symbol": "Co4ETab._run_chat_turn", "kind": "method", "line_display": "1903-1974", "line_start": 1903, "line_end": 1974, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "72 dòng, gộp: chuẩn bị prompt, tạo bubble stream, định nghĩa 4 closures nội bộ (job/on_event/done/failed) và khởi worker nền — nên tách các closures ra thành hàm riêng nếu dễ đọc hơn. Closure job() gọi run_cowork(provider,...) — network/AI call thật sự. Đọc/ghi self._chat_worker, self._co4e_routed_provider, self.chat_send_btn, self._wf; set log._co4e_plan_bubble=None (thuộc log là ChatView, không phải self).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 207 ] }, { "symbol": "Co4ETab._run_chat_turn.job", "kind": "function", "line_display": "1917-1946", "line_start": 1917, "line_end": 1946, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "closure nội bộ của _run_chat_turn, chạy trong AgentWorker (thread nền); gọi run_cowork(provider,...) — network/AI call thật; dùng usage_tracker (đọc/ghi trạng thái tích lũy usage)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 208 ] }, { "symbol": "Co4ETab._run_chat_turn.on_event", "kind": "function", "line_display": "1948-1954", "line_start": 1948, "line_end": 1954, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "closure nội bộ, cập nhật assistant.set_markdown và log.scroll_to_bottom (widget)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 209 ] }, { "symbol": "Co4ETab._run_chat_turn.done", "kind": "function", "line_display": "1956-1962", "line_start": 1956, "line_end": 1962, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "closure nội bộ, gán self._chat_worker = None, thao tác widget assistant/log", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 210 ] }, { "symbol": "Co4ETab._run_chat_turn.failed", "kind": "function", "line_display": "1964-1967", "line_start": 1964, "line_end": 1967, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "closure nội bộ, gán self._chat_worker = None, gọi self._append_chat lỗi", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 211 ] }, { "symbol": "Co4ETab._append_chat", "kind": "method", "line_display": "1976-1991", "line_start": 1976, "line_end": 1991, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "nhận tham số log tùy chọn, mặc định self.chat_log — dùng bởi rất nhiều method ở cả run-control (qua tham số log truyền vào) và chat-view; điểm nối giữa hai nhóm.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 212 ] }, { "symbol": "Co4ETab._fmt_usage", "kind": "method", "line_display": "1994-2001", "line_start": 1994, "line_end": 2001, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "format chuỗi thuần, đọc self.ctx.config.data — không chạm widget", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 213 ] }, { "symbol": "Co4ETab._apply_usage", "kind": "method", "line_display": "2003-2020", "line_start": 2003, "line_end": 2020, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "bub.add_usage(...) thao tác widget bubble; ghi self._flow_usage[wf_id] — trạng thái tổng usage theo flow, dùng chung với _refresh_usage_total", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 214 ] }, { "symbol": "Co4ETab._refresh_usage_total", "kind": "method", "line_display": "2022-2037", "line_start": 2022, "line_end": 2037, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "self._usage_total_lbl.setText — đọc self._wf, self._flow_usage", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 215 ] }, { "symbol": "Co4ETab._append_diff", "kind": "method", "line_display": "2039-2043", "line_start": 2039, "line_end": 2043, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 216 ] }, { "symbol": "Co4ETab._append_plan", "kind": "method", "line_display": "2045-2056", "line_start": 2045, "line_end": 2056, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "đọc/ghi log._co4e_plan_bubble (thuộc tính động trên đối tượng log/ChatView, không phải self)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 217 ] }, { "symbol": "_html_escape", "kind": "function", "line_display": "2082-2083", "line_start": 2082, "line_end": 2083, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_chat_view.py", "note": "hàm module-level (ngoài class Co4ETab), escape HTML thuần, dùng cho hiển thị chat", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 219 ] }, { "symbol": "_PLAN_GLYPH", "kind": "attribute", "line_display": "45-46", "line_start": 45, "line_end": 46, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "module-level dict glyph trạng thái dùng bởi _fmt_plan", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 0 ] }, { "symbol": "_fmt_plan", "kind": "function", "line_display": "49-58", "line_start": 49, "line_end": 58, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "helper thuần Python dùng bởi _render_plan()", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 1 ] }, { "symbol": "Co4ETab.manager", "kind": "attribute", "line_display": "238", "line_start": 238, "line_end": 238, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "Co4ERunManager — lõi run control, trạng thái chia sẻ với canvas (node status) và chat view (run_logs)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 26 ] }, { "symbol": "Co4ETab._flow_runs", "kind": "attribute", "line_display": "243", "line_start": 243, "line_end": 243, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "map wf_id->run id, chia sẻ với _open_flow/_close_flow_tab (co4e_tab.py) và canvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 27 ] }, { "symbol": "Co4ETab._run_logs", "kind": "attribute", "line_display": "244", "line_start": 244, "line_end": 244, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "map run_id->ChatView, chia sẻ với co4e_chat_view.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 28 ] }, { "symbol": "Co4ETab._flow_usage", "kind": "attribute", "line_display": "248", "line_start": 248, "line_end": 248, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "usage token/cost theo flow, hiển thị ở Messages header", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 30 ] }, { "symbol": "Co4ETab._manual_active", "kind": "attribute", "line_display": "252", "line_start": 252, "line_end": 252, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "chia sẻ với _close_flow_tab (co4e_tab.py) — set lại self.run_btn khi đóng tab", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 33 ] }, { "symbol": "Co4ETab._manual_order", "kind": "attribute", "line_display": "253", "line_start": 253, "line_end": 253, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 34 ] }, { "symbol": "Co4ETab._manual_idx", "kind": "attribute", "line_display": "254", "line_start": 254, "line_end": 254, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 35 ] }, { "symbol": "Co4ETab._cur_run_id", "kind": "method", "line_display": "460-473", "line_start": 460, "line_end": 473, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "logic thuần Python, không gọi Qt trực tiếp", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 53 ] }, { "symbol": "Co4ETab._update_run_btn", "kind": "method", "line_display": "480-482", "line_start": 480, "line_end": 482, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 55 ] }, { "symbol": "Co4ETab.runs_more_btn", "kind": "attribute", "line_display": "586", "line_start": 586, "line_end": 586, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 76 ] }, { "symbol": "Co4ETab.runs_side_list", "kind": "attribute", "line_display": "594", "line_start": 594, "line_end": 594, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 77 ] }, { "symbol": "Co4ETab._SIDE_RUNS", "kind": "attribute", "line_display": "605", "line_start": 605, "line_end": 605, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "class-level constant, không phải self.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 78 ] }, { "symbol": "Co4ETab._refresh_side_runs", "kind": "method", "line_display": "607-619", "line_start": 607, "line_end": 619, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 79 ] }, { "symbol": "Co4ETab._on_side_run_clicked", "kind": "method", "line_display": "621-629", "line_start": 621, "line_end": 629, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "chạm self.runs_table (định nghĩa ngoài khoảng đọc — thuộc trang Flow Status)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 80 ] }, { "symbol": "Co4ETab.mode_combo", "kind": "attribute", "line_display": "828", "line_start": 828, "line_end": 828, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "combo chọn run mode auto/plan/manual — thuộc nhóm _set_run_mode() trong plan.md dù được dựng bên trong _build_center (co4e_tab.py); ranh giới tách file ở đây dễ vỡ.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 97 ] }, { "symbol": "Co4ETab.run_btn", "kind": "attribute", "line_display": "833", "line_start": 833, "line_end": 833, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "nút Run — tương tự mode_combo, dựng trong _build_center nhưng thuộc nhóm run control; cũng bị _update_run_btn (<701), _on_run_clicked, _on_mode_changed đọc/ghi text.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 98 ] }, { "symbol": "Co4ETab.runs_btn", "kind": "attribute", "line_display": "840", "line_start": 840, "line_end": 840, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "toggle chuyển sang trang Runs (self.center_stack) — chia sẻ state center_stack với co4e_tab.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 99 ] }, { "symbol": "Co4ETab._build_runs_page", "kind": "method", "line_display": "873-932", "line_start": 873, "line_end": 932, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "dựng trang bảng Runs (theo dõi mọi run của mọi flow) — dùng self.manager (Co4ERunManager, sẽ thay bằng co4e_workflow_service) — trạng thái chia sẻ.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 102 ] }, { "symbol": "Co4ETab.runs_back_btn", "kind": "attribute", "line_display": "882", "line_start": 882, "line_end": 882, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 103 ] }, { "symbol": "Co4ETab.runs_title", "kind": "attribute", "line_display": "887", "line_start": 887, "line_end": 887, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 104 ] }, { "symbol": "Co4ETab.ws_folder_btn", "kind": "attribute", "line_display": "892", "line_start": 892, "line_end": 892, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 105 ] }, { "symbol": "Co4ETab.run_stop_btn", "kind": "attribute", "line_display": "900", "line_start": 900, "line_end": 900, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 106 ] }, { "symbol": "Co4ETab.run_rename_btn", "kind": "attribute", "line_display": "905", "line_start": 905, "line_end": 905, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 107 ] }, { "symbol": "Co4ETab.run_del_btn", "kind": "attribute", "line_display": "909", "line_start": 909, "line_end": 909, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 108 ] }, { "symbol": "Co4ETab.run_clear_btn", "kind": "attribute", "line_display": "913", "line_start": 913, "line_end": 913, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "clicked gọi self.manager.clear_finished() — trạng thái chia sẻ self.manager.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 109 ] }, { "symbol": "Co4ETab.runs_table", "kind": "attribute", "line_display": "921", "line_start": 921, "line_end": 921, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 110 ] }, { "symbol": "Co4ETab._current_mode", "kind": "method", "line_display": "1384-1385", "line_start": 1384, "line_end": 1385, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "đọc self.mode_combo — khớp nhóm _set_run_mode() dòng 624 plan.md.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 172 ] }, { "symbol": "Co4ETab._on_mode_changed", "kind": "method", "line_display": "1387-1393", "line_start": 1387, "line_end": 1393, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "reset self._manual_active/_manual_order/_manual_idx (trạng thái chia sẻ với luồng manual step _manual_step/_manual_run_or_advance, ngoài phạm vi đọc >1400) và gọi self._cur_run_id() (chia sẻ với self.manager).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 173 ] }, { "symbol": "Co4ETab._on_run_clicked", "kind": "method", "line_display": "1395-1400", "line_start": 1395, "line_end": 1400, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "cắt ngang lát — cần agent gộp đối chiếu (tiếp tục sau dòng 1400). Dùng self.manager.stop() và self._cur_run_id() — trạng thái chia sẻ với co4e_workflow_service tương lai. Khớp nhóm _run_flow()/_stop_flow() dòng 618 plan.md (dù đó là bản service, đây là UI handler nút Run).", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 174 ] }, { "symbol": "Co4ETab.", "kind": "method", "line_display": "1401-1405", "line_start": 1401, "line_end": 1405, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "cắt ngang lát — cần agent gộp đối chiếu. Định nghĩa (def ...) nằm ở lát trước dòng 1401 nên tên chính xác không xác định được; đoạn thấy được chỉ dispatch theo self._current_mode() sang _manual_run_or_advance() hoặc _start_canvas_run() — thuộc nhóm Run/mode.", "in_old_table": "chua/khong ro", "old_table_mismatch": "(def ...) nằm ở lát trước dòng 1401 nên tên chính xác không xác định được; đoạn thấy được chỉ dispatch theo self._current_mode() sang _manual_run_or", "merged_from_raw_indices": [ 175 ] }, { "symbol": "Co4ETab._start_canvas_run", "kind": "method", "line_display": "1407-1424", "line_start": 1407, "line_end": 1424, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self.manager.start(...) — spawn chạy flow (dẫn tới gọi provider AI ở tầng khác); đọc/ghi self._wf, self._flow_runs, self._flow_runs[wf_id], self._run_logs, self.chat_log — trạng thái chia sẻ giữa run-control và chat-view. self.manager (Co4ERunManager) nên đổi sang application/workflows/co4e_workflow_service.py theo mapping.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 176 ] }, { "symbol": "Co4ETab._run_single", "kind": "method", "line_display": "1426-1431", "line_start": 1426, "line_end": 1431, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "wrapper mỏng gọi _start_canvas_run; đọc self._wf.id", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 177 ] }, { "symbol": "Co4ETab._run_from", "kind": "method", "line_display": "1433-1437", "line_start": 1433, "line_end": 1437, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "wrapper mỏng gọi _start_canvas_run với self._downstream(node_id)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 178 ] }, { "symbol": "Co4ETab._downstream", "kind": "method", "line_display": "1439-1450", "line_start": 1439, "line_end": 1450, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "thuật toán BFS thuần Python, chỉ đọc self.canvas.edges() làm input — test được với danh sách edge giả lập, không cần canvas thật", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 179 ] }, { "symbol": "Co4ETab._manual_run_or_advance", "kind": "method", "line_display": "1453-1466", "line_start": 1453, "line_end": 1466, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self.canvas.reset_statuses() và self._append_chat (self._append_chat thuộc nhóm chat-view) — cắt ngang giữa run-control và chat-view. Đọc/ghi self._manual_active, self._manual_order, self._manual_idx, self._wf, self._outputs_for(...), self._plan_bubble — trạng thái run thuần túy chia sẻ với _manual_step.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 180 ] }, { "symbol": "Co4ETab._manual_step", "kind": "method", "line_display": "1468-1484", "line_start": 1468, "line_end": 1484, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self.manager.start(...) (network/AI qua provider) và self.run_btn.setText, self._append_chat (chat-view); đọc/ghi self._manual_idx, self._manual_order, self._wf, self._flow_runs, self._run_logs, self.chat_log — trạng thái chia sẻ rộng giữa run-control và chat-view.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 181 ] }, { "symbol": "Co4ETab._topo_order", "kind": "method", "line_display": "1486-1491", "line_start": 1486, "line_end": 1491, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "đọc self.canvas.nodes()/edges() làm dữ liệu đầu vào, logic tính toán thuần túy (co4e.compute_waves) — test được với dữ liệu giả", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 182 ] }, { "symbol": "Co4ETab._on_manager_event", "kind": "method", "line_display": "1494-1550", "line_start": 1494, "line_end": 1550, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "method dài (57 dòng), gộp nhiều việc không liên quan: định tuyến sự kiện chạy theo từng flow (routing run_id -> log), cập nhật trạng thái node trên canvas, hiển thị bubble chat (assistant/diff/plan/tool-failed — thuộc co4e_chat_view.py), xử lý hoàn tất run (run_done/run_error), hiển thị popup thông báo, cập nhật status bar. Nên tách phần hiển thị chat (self._append_chat/_append_diff/_append_plan) sang co4e_chat_view.py, giữ phần routing/flow-completion ở co4e_run_control_widget.py. Đọc/ghi self._flow_runs, self._run_logs, self.chat_log, self.canvas, self._wf, self._outputs_for(...), self._manual_active, self._manual_idx — trạng thái chia sẻ rất rộng, điểm dễ vỡ nhất khi tách file.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 183 ] }, { "symbol": "Co4ETab._notify_run_finished", "kind": "method", "line_display": "1552-1573", "line_start": 1552, "line_end": 1573, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "tạo QMessageBox không chặn; khởi tạo lazy self._run_popups (xem attribute riêng)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 184 ] }, { "symbol": "Co4ETab._run_popups", "kind": "attribute", "line_display": "1560-1561", "line_start": 1560, "line_end": 1561, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "khởi tạo lazy (list rỗng) trong _notify_run_finished qua hasattr guard — không init trong __init__; giữ ref các QMessageBox non-blocking khỏi bị GC", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 185 ] }, { "symbol": "Co4ETab._refresh_runs", "kind": "method", "line_display": "1575-1616", "line_start": 1575, "line_end": 1616, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "render bảng runs_table + gọi self._refresh_side_runs() (sidebar) + cập nhật self.flow_bar.setTabText và self._sections['co4e.runs_tab'] — self._sections và self.flow_bar là trạng thái chia sẻ với co4e_tab.py (container/sidebar).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 186 ] }, { "symbol": "Co4ETab._stop_selected_run", "kind": "method", "line_display": "1618-1624", "line_start": 1618, "line_end": 1624, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 187 ] }, { "symbol": "Co4ETab._delete_selected_run", "kind": "method", "line_display": "1626-1639", "line_start": 1626, "line_end": 1639, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "đọc/ghi self._flow_runs, self._run_logs — trạng thái chia sẻ với _on_manager_event/_start_canvas_run", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 188 ] }, { "symbol": "Co4ETab._runs_context_menu", "kind": "method", "line_display": "1641-1655", "line_start": 1641, "line_end": 1655, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 189 ] }, { "symbol": "Co4ETab._open_run_output_folder", "kind": "method", "line_display": "1704-1715", "line_start": 1704, "line_end": 1715, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "path.mkdir + open_location (spawn process); dùng bởi _runs_context_menu 'Open output'", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 194 ] }, { "symbol": "Co4ETab._rename_selected_run", "kind": "method", "line_display": "1717-1748", "line_start": 1717, "line_end": 1748, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi co4e.save_workflow(wf) (ghi đĩa); đọc/ghi self._flows (list flow của sidebar/tab-bar), self.flow_bar, self.name_edit, self._wf — chạm nhiều trạng thái chia sẻ với co4e_tab.py container (tab bar + name edit thuộc header, không rõ nằm ở panel nào) — rủi ro vỡ cao khi tách.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 195 ] }, { "symbol": "Co4ETab._run_selected_in_background", "kind": "method", "line_display": "1750-1760", "line_start": 1750, "line_end": 1760, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self.manager.start(...) (network/AI) và self._refresh_side_runs() (widget)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 196 ] }, { "symbol": "Co4ETab._wf_by_id", "kind": "method", "line_display": "1762-1770", "line_start": 1762, "line_end": 1770, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi co4e.get_workflow(wf_id) (đọc đĩa) và self._sync_wf_from_canvas() (không nằm trong khoảng đọc) — đọc self._wf; dùng chung bởi _rerun_run_item/_open_run_from_table (Runs tab) và có thể cả co4e_tab.py container", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 197 ] }, { "symbol": "Co4ETab._rerun_run_item", "kind": "method", "line_display": "1772-1783", "line_start": 1772, "line_end": 1783, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self.manager.start(...) (network/AI)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 198 ] }, { "symbol": "Co4ETab._open_run_from_table", "kind": "method", "line_display": "1785-1804", "line_start": 1785, "line_end": 1804, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "gọi self._open_flow(wf) (không nằm trong khoảng đọc, theo plan.md thuộc co4e_tab.py) và self.canvas.update_node_status — nối Runs tab với việc mở flow trên canvas, điểm khớp nối giữa run-control và container/canvas.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 199 ] }, { "symbol": "_qcolor", "kind": "function", "line_display": "2086-2088", "line_start": 2086, "line_end": 2088, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_run_control_widget.py", "note": "hàm module-level (ngoài class Co4ETab), tạo QColor từ hex string — dùng kiểu giá trị QColor, không cần QApplication sống; dùng trong _refresh_runs để tô màu status", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 220 ] }, { "symbol": "_EqualTabBar", "kind": "class", "line_display": "74-94", "line_start": 74, "line_end": 94, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 4 ] }, { "symbol": "_EqualTabBar._GAP", "kind": "attribute", "line_display": "80", "line_start": 80, "line_end": 80, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "class-level constant, không phải self.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 5 ] }, { "symbol": "_EqualTabBar.tabSizeHint", "kind": "method", "line_display": "82-90", "line_start": 82, "line_end": 90, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 6 ] }, { "symbol": "_EqualTabBar.resizeEvent", "kind": "method", "line_display": "92-94", "line_start": 92, "line_end": 94, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 7 ] }, { "symbol": "Co4ETab", "kind": "class", "line_display": "229-700", "line_start": 229, "line_end": 700, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "Lớp kéo dài quá dòng 700 (cắt ngang lát) — chỉ ghi nhận phần 229-700; 'status_message = Signal(str)' dòng 230 là thuộc tính lớp, không phải self.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 21 ] }, { "symbol": "Co4ETab.__init__", "kind": "method", "line_display": "232-304", "line_start": 232, "line_end": 304, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "method 73 dòng, gộp: khởi state run/flow, dựng splitter 3 cột (sidebar/center/config), wiring canvas & config panel, gọi _reload_sidebar (đọc đĩa qua co4e.list_workflows) và _open_flow; chạm rất nhiều thuộc tính chia sẻ: self._wf, self._flows, self.manager, self._flow_runs, self._run_logs, self._flow_outputs, self._flow_usage, self.config, self.canvas (gán ở _build_center ngoài khoảng đọc này)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 22 ] }, { "symbol": "Co4ETab.ctx", "kind": "attribute", "line_display": "234", "line_start": 234, "line_end": 234, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 23 ] }, { "symbol": "Co4ETab._wf", "kind": "attribute", "line_display": "235", "line_start": 235, "line_end": 235, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "trạng thái chia sẻ — đọc/ghi bởi canvas, run control, chat view", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 24 ] }, { "symbol": "Co4ETab._flows", "kind": "attribute", "line_display": "257", "line_start": 257, "line_end": 257, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "danh sách flow đang mở dạng tab — trạng thái chia sẻ nhạy cảm (nêu rõ trong hướng dẫn đề bài)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 36 ] }, { "symbol": "Co4ETab._active_flow_idx", "kind": "attribute", "line_display": "258", "line_start": 258, "line_end": 258, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "chỉ số tab đang active — chia sẻ giữa _open_flow, _on_flow_tab_changed, _reflect_active_run", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 37 ] }, { "symbol": "Co4ETab._split", "kind": "attribute", "line_display": "261", "line_start": 261, "line_end": 261, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 38 ] }, { "symbol": "Co4ETab._config_collapsed", "kind": "attribute", "line_display": "274", "line_start": 274, "line_end": 274, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "trạng thái cho _toggle_config (định nghĩa dòng 989, ngoài khoảng đọc); plan.md xếp _toggle_config ở co4e_tab.py container", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 40 ] }, { "symbol": "Co4ETab._config_expanded_w", "kind": "attribute", "line_display": "275; 995", "line_start": 275, "line_end": 995, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 275-275, target gốc=presentation/co4e/co4e_tab.py) cùng lý do với _config_collapsed || (dòng 995-995, target gốc=presentation/co4e/co4e_tab.py) gán trong nhánh collapse của _toggle_config; có thể đã khởi tạo trong __init__ (ngoài phạm vi đọc).", "in_old_table": "chua/khong ro", "old_table_mismatch": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 275-275, target gốc=presentation/co4e/co4e_tab.py) cùng lý do vớ", "merged_from_raw_indices": [ 41, 122 ] }, { "symbol": "Co4ETab._narrow_guard", "kind": "attribute", "line_display": "280", "line_start": 280, "line_end": 280, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "gắn với _apply_narrow_layout (dòng 977, ngoài khoảng đọc)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 42 ] }, { "symbol": "Co4ETab._open_flow", "kind": "method", "line_display": "307-338", "line_start": 307, "line_end": 338, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "khớp plan.md: _open_flow() -> co4e_tab.py, gọi canvas; chạm self._flows, self.flow_bar (định nghĩa ngoài khoảng đọc), self.canvas", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 43 ] }, { "symbol": "Co4ETab._close_other_flows", "kind": "method", "line_display": "340-355", "line_start": 340, "line_end": 355, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 44 ] }, { "symbol": "Co4ETab._show_runs", "kind": "method", "line_display": "357-367", "line_start": 357, "line_end": 367, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "chuyển đổi center_stack giữa flow editor và Runs table — liên quan Flow Status (run control)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 45 ] }, { "symbol": "Co4ETab._on_flow_tab_changed", "kind": "method", "line_display": "369-385", "line_start": 369, "line_end": 385, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "chạm self.center_stack (định nghĩa ngoài khoảng đọc, ở _build_center)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 46 ] }, { "symbol": "Co4ETab._sync_runs_toggle", "kind": "method", "line_display": "387-394", "line_start": 387, "line_end": 394, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 47 ] }, { "symbol": "Co4ETab._add_tab_close_button", "kind": "method", "line_display": "396-406", "line_start": 396, "line_end": 406, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 48 ] }, { "symbol": "Co4ETab._close_flow_tab_button", "kind": "method", "line_display": "408-412", "line_start": 408, "line_end": 412, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 49 ] }, { "symbol": "Co4ETab._close_flow_tab", "kind": "method", "line_display": "414-442", "line_start": 414, "line_end": 442, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "chạm self._flow_runs/_run_logs/_manual_active/self.run_btn (chia sẻ với run control widget)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 50 ] }, { "symbol": "Co4ETab._sync_active_flow_tab_text", "kind": "method", "line_display": "444-447", "line_start": 444, "line_end": 447, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 51 ] }, { "symbol": "Co4ETab._build_sidebar", "kind": "method", "line_display": "485-603", "line_start": 485, "line_end": 603, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": ">80 dòng (119 dòng) — gộp dựng 4 section (Workflows/Agents/Skills/Runs) + wiring nhiều nút bấm; nên tách theo section: Workflows giữ ở container, Agents nên chuyển agent_list_panel.py, Skills đã tách (chỉ còn wiring), Runs nên chuyển co4e_run_control_widget.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 56 ] }, { "symbol": "Co4ETab._sections", "kind": "attribute", "line_display": "493", "line_start": 493, "line_end": 493, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "trạng thái chia sẻ (nêu rõ trong hướng dẫn đề bài) — dùng bởi _fold_section, _sync_section_arrow", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 60 ] }, { "symbol": "Co4ETab.sidebar", "kind": "attribute", "line_display": "494", "line_start": 494, "line_end": 494, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 61 ] }, { "symbol": "Co4ETab.side_split", "kind": "attribute", "line_display": "498", "line_start": 498, "line_end": 498, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 62 ] }, { "symbol": "_Col", "kind": "class", "line_display": "503-511", "line_start": 503, "line_end": 511, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "adapter nội bộ định nghĩa bên trong _build_sidebar, chỉ dùng tại chỗ", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 57 ] }, { "symbol": "_Col.__init__", "kind": "method", "line_display": "506-507", "line_start": 506, "line_end": 507, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 58 ] }, { "symbol": "_Col.addWidget", "kind": "method", "line_display": "509-511", "line_start": 509, "line_end": 511, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 59 ] }, { "symbol": "Co4ETab.wf_new_btn", "kind": "attribute", "line_display": "516", "line_start": 516, "line_end": 516, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 63 ] }, { "symbol": "Co4ETab.wf_list", "kind": "attribute", "line_display": "527", "line_start": 527, "line_end": 527, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 64 ] }, { "symbol": "Co4ETab.wf_edit_btn", "kind": "attribute", "line_display": "534", "line_start": 534, "line_end": 534, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 65 ] }, { "symbol": "Co4ETab.wf_dup_btn", "kind": "attribute", "line_display": "535", "line_start": 535, "line_end": 535, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 66 ] }, { "symbol": "Co4ETab.wf_del_btn", "kind": "attribute", "line_display": "536", "line_start": 536, "line_end": 536, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 67 ] }, { "symbol": "Co4ETab.wf_runbg_btn", "kind": "attribute", "line_display": "543", "line_start": 543, "line_end": 543, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 68 ] }, { "symbol": "Co4ETab._skills_panel", "kind": "attribute", "line_display": "575", "line_start": 575, "line_end": 575, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "instantiate SkillsListPanel đã tách; Co4ETab giữ wiring theo comment trong code (dòng 571-574)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 73 ] }, { "symbol": "Co4ETab.sk_manage_btn", "kind": "attribute", "line_display": "576", "line_start": 576, "line_end": 576, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "cùng lý do với _skills_panel", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 74 ] }, { "symbol": "Co4ETab.skill_list", "kind": "attribute", "line_display": "578", "line_start": 578, "line_end": 578, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "cùng lý do với _skills_panel", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 75 ] }, { "symbol": "Co4ETab._section", "kind": "method", "line_display": "631-663", "line_start": 631, "line_end": 663, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "chạm self._sections (chia sẻ) — helper dựng section sidebar dùng chung", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 81 ] }, { "symbol": "Co4ETab._fold_section", "kind": "method", "line_display": "665-677", "line_start": 665, "line_end": 677, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 82 ] }, { "symbol": "Co4ETab._sync_section_arrow", "kind": "method", "line_display": "679-681", "line_start": 679, "line_end": 681, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 83 ] }, { "symbol": "Co4ETab._icon_btn", "kind": "method", "line_display": "683-687", "line_start": 683, "line_end": 687, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "helper dùng chung tạo nút icon, dùng bởi cả section Workflows và Agents", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 84 ] }, { "symbol": "Co4ETab._reload_sidebar", "kind": "method", "line_display": "689-722", "line_start": 689, "line_end": 722, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 689-700, target gốc=presentation/co4e/co4e_tab.py) cắt ngang lát — cần agent gộp đối chiếu (method tiếp tục sau dòng 700); gọi co4e.list_workflows() (đọc đĩa) rồi dựng QListWidgetItem trực tiếp trong cùng hàm — trộn data-fetch và UI, nên tách phần đọc dữ liệu sang co4e_workflow_service.py || (dòng 689-722, target gốc=unsure) cắt ngang lát — cần agent gộp đối chiếu (bắt đầu trước dòng 701). Gộp refresh cả agent_list và skill_list trong cùng 1 hàm — nên tách thành _refresh_agents_list (agent_list_panel.py) và _refresh_skills_list (skills_list_panel.py) như plan.md yêu cầu; gọi co4e.list_custom_agents() (đĩa) và skills_mod.skill_prefix_for (đĩa).", "in_old_table": "co", "old_table_mismatch": "[GỘP 2 lượt quét trùng ký hiệu] (dòng 689-700, target gốc=presentation/co4e/co4e_tab.py) cắt ngang lát", "merged_from_raw_indices": [ 85, 86 ] }, { "symbol": "Co4ETab._build_center", "kind": "method", "line_display": "731-871", "line_start": 731, "line_end": 871, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "dài ~140 dòng, làm nhiều việc không liên quan: dựng flow tab bar (ẩn, không hiển thị cho user), dựng runs-page stack, toolbar flow (name_edit/save/save_tpl/mode_combo/run_btn/runs_btn), tạo canvas, gọi _build_canvas_overlay, tạo chat widget, splitter dọc self._vsplit. Nên tách nhỏ. Đọc self._wf.name (dòng 814) và tạo self.center_stack — TRẠNG THÁI CHIA SẺ dùng bởi _show_runs/_apply_workflow (ngoài phạm vi đọc). Khớp phần '_build_canvas()' trong bảng plan.md dòng 615.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 88 ] }, { "symbol": "Co4ETab.flow_bar", "kind": "attribute", "line_display": "738", "line_start": 738, "line_end": 738, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "QTabBar bị ẩn (setVisible False dòng 802), chỉ dùng làm index nội bộ ánh xạ flow↔canvas — trạng thái chia sẻ với _on_flow_tab_changed/_close_flow_tab (định nghĩa <701, ngoài phạm vi đọc).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 89 ] }, { "symbol": "Co4ETab.flow_add_btn", "kind": "attribute", "line_display": "764", "line_start": 764, "line_end": 764, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "ẩn (setVisible False), không hiển thị cho user hiện tại.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 90 ] }, { "symbol": "Co4ETab.flow_scroll", "kind": "attribute", "line_display": "781", "line_start": 781, "line_end": 781, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 91 ] }, { "symbol": "Co4ETab.center_stack", "kind": "attribute", "line_display": "805", "line_start": 805, "line_end": 805, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "TRẠNG THÁI CHIA SẺ — chuyển đổi giữa trang Runs (co4e_run_control_widget) và trang flow editor; dùng bởi _show_runs (ngoài phạm vi đọc) và _apply_workflow.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 92 ] }, { "symbol": "Co4ETab.name_edit", "kind": "attribute", "line_display": "814", "line_start": 814, "line_end": 814, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "khởi tạo từ self._wf.name — trạng thái chia sẻ; cũng bị _on_name_changed/_new_workflow đọc/ghi.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 93 ] }, { "symbol": "Co4ETab.add_step_btn", "kind": "attribute", "line_display": "819", "line_start": 819, "line_end": 819, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 94 ] }, { "symbol": "Co4ETab.save_btn", "kind": "attribute", "line_display": "822", "line_start": 822, "line_end": 822, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 95 ] }, { "symbol": "Co4ETab.save_tpl_btn", "kind": "attribute", "line_display": "826", "line_start": 826, "line_end": 826, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 96 ] }, { "symbol": "Co4ETab._vsplit", "kind": "attribute", "line_display": "863", "line_start": 863, "line_end": 863, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "splitter dọc canvas/chat — dùng chung với _toggle_messages (co4e_chat_view.py thao tác self._vsplit.setSizes) — trạng thái chia sẻ giữa co4e_tab.py và co4e_chat_view.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 101 ] }, { "symbol": "Co4ETab._NARROW", "kind": "attribute", "line_display": "971", "line_start": 971, "line_end": 971, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "hằng class-level (không phải self.), ngưỡng chiều rộng dùng bởi _apply_narrow_layout.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 118 ] }, { "symbol": "Co4ETab.showEvent", "kind": "method", "line_display": "973-975", "line_start": 973, "line_end": 975, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "Qt override, gọi self._narrow_guard.attach() (đối tượng khởi tạo ngoài phạm vi đọc, <701). [ANOMALY: cùng tên method định nghĩa 2 lần ở 2 dòng khác nhau trong cùng class -- có khả năng là lỗi nguồn (định nghĩa sau đè định nghĩa trước), không phải do quét trùng; giữ 2 dòng riêng, cần người quyết định định nghĩa nào còn hiệu lực]", "in_old_table": "chua/khong ro", "old_table_mismatch": "ợng khởi tạo ngoài phạm vi đọc, <701). [ANOMALY: cùng tên method định nghĩa 2 lần ở 2 dòng khác nhau trong cùng class -- có khả", "merged_from_raw_indices": [ 119 ] }, { "symbol": "Co4ETab._apply_narrow_layout", "kind": "method", "line_display": "977-987", "line_start": 977, "line_end": 987, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "so self._config_collapsed rồi gọi self._toggle_config() — trạng thái chia sẻ với node_property_panel wrap logic.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 120 ] }, { "symbol": "Co4ETab._toggle_config", "kind": "method", "line_display": "989-1032", "line_start": 989, "line_end": 1032, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "dài 44 dòng, gộp: ẩn/hiện self.config (widget thuộc node_property_panel.py), đổi icon, tính lại self._split.setSizes, gọi _refresh_min_width — thao tác trực tiếp self.config/self.config_container (node_property_panel.py) và self._split (co4e_tab.py) cùng lúc — ranh giới tách file dễ vỡ nhất ở đoạn này. Ghi self._config_expanded_w.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 121 ] }, { "symbol": "Co4ETab._refresh_min_width", "kind": "method", "line_display": "1034-1039", "line_start": 1034, "line_end": 1039, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "thao tác trực tiếp self._split (QSplitter) và self.config_container — chia sẻ với _build_center/_wrap_config.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 123 ] }, { "symbol": "Co4ETab._apply_workflow", "kind": "method", "line_display": "1194-1207", "line_start": 1194, "line_end": 1207, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "hàm điều phối trung tâm khi mở 1 flow: gán self._wf (TRẠNG THÁI CHIA SẺ dùng khắp mọi nhóm chức năng — canvas, chat_stack/_flow_logs, config panel, run button, usage total). Đây là điểm nối chính giữa các file sau khi tách — không nên tách nhỏ hơn nếu không rất cẩn thận.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 150 ] }, { "symbol": "Co4ETab._new_workflow", "kind": "method", "line_display": "1209-1217", "line_start": 1209, "line_end": 1217, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "gọi self._open_flow(...) — khớp dòng plan.md '_open_flow() -> co4e_tab.py → gọi canvas'.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 151 ] }, { "symbol": "Co4ETab._selected_wf", "kind": "method", "line_display": "1219-1225", "line_start": 1219, "line_end": 1225, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "đọc self.wf_list (sidebar, dựng ở _build_sidebar <701) rồi gọi co4e.get_workflow (đĩa).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 152 ] }, { "symbol": "Co4ETab._load_selected_workflow", "kind": "method", "line_display": "1227-1230", "line_start": 1227, "line_end": 1230, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 153 ] }, { "symbol": "Co4ETab._edit_selected_workflow", "kind": "method", "line_display": "1232-1237", "line_start": 1232, "line_end": 1237, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 154 ] }, { "symbol": "Co4ETab._wf_context_menu", "kind": "method", "line_display": "1248-1271", "line_start": 1248, "line_end": 1271, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "dựng QMenu cho sidebar flows, điều phối gọi _edit_selected_workflow/_rename_workflow/_duplicate_selected_workflow/_run_selected_in_background/_delete_selected_workflow (một số nằm ngoài phạm vi đọc, dòng >1400).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 156 ] }, { "symbol": "Co4ETab._sync_wf_from_canvas", "kind": "method", "line_display": "1299-1302", "line_start": 1299, "line_end": 1302, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "đọc self.canvas.nodes()/edges() và ghi self._wf.nodes/edges/name — cầu nối giữa co4e_canvas_widget.py và trạng thái self._wf chia sẻ; cân nhắc đặt cùng canvas nếu muốn canvas tự chịu trách nhiệm export dữ liệu.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 159 ] }, { "symbol": "Co4ETab._on_name_changed", "kind": "method", "line_display": "1316-1318", "line_start": 1316, "line_end": 1318, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "ghi self._wf.name (trạng thái chia sẻ) rồi gọi self._sync_active_flow_tab_text() (định nghĩa dòng 444, ngoài phạm vi đọc).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 162 ] }, { "symbol": "Co4ETab._add_blank_step", "kind": "method", "line_display": "1320-1322", "line_start": 1320, "line_end": 1322, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "nút 'Add' trên toolbar uỷ nhiệm sang self.canvas.add_palette_step — liên quan nhóm _add_node() trong plan.md (co4e_canvas_widget.py) nhưng bản thân handler chỉ là cầu nối từ toolbar.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 163 ] }, { "symbol": "Co4ETab.set_project", "kind": "method", "line_display": "1658-1674", "line_start": 1658, "line_end": 1674, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "gọi load_project(project_id) (đọc đĩa) và self.manager.set_output_root/set_current_project (self.manager nên là co4e_workflow_service). Gán self._project_id, self._project_dir — không chắc là lần gán đầu tiên (có thể đã init ở __init__ ngoài khoảng đọc). Không khớp rõ nhóm nào trong danh sách đích cho trước — xếp tạm vào co4e_tab.py vì đây là API binding cấp container gọi từ ngoài.", "in_old_table": "chua/khong ro", "old_table_mismatch": "ể đã init ở __init__ ngoài khoảng đọc). Không khớp rõ nhóm nào trong danh sách đích cho trước — xếp tạm vào co4e_tab.py vì đây là", "merged_from_raw_indices": [ 190 ] }, { "symbol": "Co4ETab._flow_output_root", "kind": "method", "line_display": "1676-1686", "line_start": 1676, "line_end": 1686, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "helper dùng chung bởi cả chat (_out_dir) và run-control (_open_workspace_folder, _open_run_output_folder) — trạng thái/logic cắt ngang nhiều nhóm; đọc self._project_dir, self.ctx.config", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 191 ] }, { "symbol": "Co4ETab._refresh_ws_folder_btn", "kind": "method", "line_display": "1688-1693", "line_start": 1688, "line_end": 1693, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 192 ] }, { "symbol": "Co4ETab._open_workspace_folder", "kind": "method", "line_display": "1695-1702", "line_start": 1695, "line_end": 1702, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "root.mkdir + open_location (mở file explorer hệ điều hành — spawn process)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 193 ] }, { "symbol": "Co4ETab.showEvent", "kind": "method", "line_display": "1806-1809", "line_start": 1806, "line_end": 1809, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "override Qt lifecycle method của chính QWidget container nên phải ở lại co4e_tab.py; gọi self._refresh_runs() (thuộc co4e_run_control_widget.py) — điểm nối giữa container và run-control widget. [ANOMALY: cùng tên method định nghĩa 2 lần ở 2 dòng khác nhau trong cùng class -- có khả năng là lỗi nguồn (định nghĩa sau đè định nghĩa trước), không phải do quét trùng; giữ 2 dòng riêng, cần người quyết định định nghĩa nào còn hiệu lực]", "in_old_table": "chua/khong ro", "old_table_mismatch": "giữa container và run-control widget. [ANOMALY: cùng tên method định nghĩa 2 lần ở 2 dòng khác nhau trong cùng class -- có khả", "merged_from_raw_indices": [ 200 ] }, { "symbol": "Co4ETab._out_dir", "kind": "method", "line_display": "1811-1817", "line_start": 1811, "line_end": 1817, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/co4e_tab.py", "note": "d.mkdir(parents=True, exist_ok=True) — ghi đĩa; dùng chung bởi _run_chat_turn (chat) và tiềm năng bởi run-control; đọc self._wf.name, self._flow_output_root()", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 201 ] }, { "symbol": "Co4ETab._retranslate", "kind": "method", "line_display": "2059-2079", "line_start": 2059, "line_end": 2079, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/co4e_tab.py", "note": "cập nhật text i18n cho rất nhiều widget thuộc nhiều nhóm khác nhau (sidebar buttons, runs_table, run control buttons) và gọi self._reload_sidebar()/self._refresh_runs() — thuộc container vì bao trùm toàn tab, dù có thể tách nhỏ theo từng panel sau này.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 218 ] }, { "symbol": "_SectionHeader", "kind": "class", "line_display": "30-52", "line_start": 30, "line_end": 52, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Widget nội bộ (header có thể click, thu/mở section) chỉ dùng bởi StepConfigPanel; không có trong bảng plan.md/function_list.md, xếp cùng chỗ với StepConfigPanel vì mô tả node_property_panel.py là 'Bọc StepConfigPanel'", "in_old_table": "co", "old_table_mismatch": "section) chỉ dùng bởi StepConfigPanel; không có trong bảng plan.md/function_list.md, xếp cùng chỗ với StepConfigPanel vì mô tả node_property_panel", "merged_from_raw_indices": [ 315 ] }, { "symbol": "_SectionHeader.clicked", "kind": "attribute", "line_display": "36", "line_start": 36, "line_end": 36, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Signal Qt khai báo ở cấp class, không phải self. gán trong __init__", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 316 ] }, { "symbol": "_SectionHeader.mousePressEvent", "kind": "method", "line_display": "38-41", "line_start": 38, "line_end": 41, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 317 ] }, { "symbol": "_SectionHeader.showEvent", "kind": "method", "line_display": "43-52", "line_start": 43, "line_end": 52, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "recompute fontMetrics khi label thực sự hiển thị — cần widget đang sống, không test được nếu không có QApplication", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 318 ] }, { "symbol": "_add_section", "kind": "function", "line_display": "55-130", "line_start": 55, "line_end": 130, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Hàm dựng UI khối section thu gọn/mở rộng (header + body animate) dùng riêng cho StepConfigPanel; chứa 2 closure nội bộ _on_finished và _toggle. Không có trong bảng cũ.", "in_old_table": "co", "old_table_mismatch": "closure nội bộ _on_finished và _toggle. Không có trong bảng cũ.", "merged_from_raw_indices": [ 319 ] }, { "symbol": "_add_section._on_finished", "kind": "function", "line_display": "103-112", "line_start": 103, "line_end": 112, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "closure lồng bên trong _add_section, không phải hàm top-level — chỉ tồn tại khi _add_section chạy", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 320 ] }, { "symbol": "_add_section._toggle", "kind": "function", "line_display": "114-127", "line_start": 114, "line_end": 127, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "closure lồng bên trong _add_section, gắn vào header.clicked", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 321 ] }, { "symbol": "StepConfigPanel", "kind": "class", "line_display": "133-528", "line_start": 133, "line_end": 528, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "cắt ngang lát — cần agent gộp đối chiếu (lớp còn tiếp tục sau dòng 528, chỉ đọc được 1-528). Bảng plan.md/function_list.md không liệt kê StepConfigPanel trực tiếp (chỉ có _build_config_panel() -> co4e_tab.py container); xếp theo mô tả node_property_panel.py 'Bọc StepConfigPanel, nối chọn node sang panel thuộc tính' trong danh sách đích được giao cho task này — người quyết cuối nên xác nhận lại.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 322 ] }, { "symbol": "StepConfigPanel.changed", "kind": "attribute", "line_display": "134", "line_start": 134, "line_end": 134, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Signal Qt: bất kỳ field nào đổi -> canvas repaint node + autosave; đây là điểm nối trạng thái chia sẻ với canvas/co4e_workflow_service, cần giữ tên/signature khi tách file", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 323 ] }, { "symbol": "StepConfigPanel.run_node", "kind": "attribute", "line_display": "135", "line_start": 135, "line_end": 135, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Signal Qt 'chạy step này' — nối sang co4e_run_control_widget.py hoặc co4e_workflow_service.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 324 ] }, { "symbol": "StepConfigPanel.run_from", "kind": "attribute", "line_display": "136", "line_start": 136, "line_end": 136, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Signal Qt 'chạy từ bước này' — nối sang co4e_run_control_widget.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 325 ] }, { "symbol": "StepConfigPanel.delete_node", "kind": "attribute", "line_display": "137", "line_start": 137, "line_end": 137, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Signal Qt xoá step — nối sang co4e_canvas_widget.py để xoá node trên canvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 326 ] }, { "symbol": "StepConfigPanel.__init__", "kind": "method", "line_display": "139-313", "line_start": 139, "line_end": 313, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": ">80 dòng (174 dòng) — gộp nhiều việc không liên quan: dựng section Cơ bản, section Model&Quyền, section Skills&Tệp, section Sub-agents (ẩn/hiện theo is_parallel), và dựng hàng nút footer Run/Run-from/Delete, cộng thêm cơ chế 'outer.addStretch(1)' vá lỗi layout. Nên tách thành các hàm _build_basic_section(), _build_model_section(), _build_skills_section(), _build_subagent_section(), _build_footer() riêng khi tách file.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 327 ] }, { "symbol": "StepConfigPanel.ctx", "kind": "attribute", "line_display": "141", "line_start": 141, "line_end": 141, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "context được truyền từ ngoài vào, dùng cho _ai_draft/_load_models (gọi AI provider) — trạng thái chia sẻ với co4e_tab.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 328 ] }, { "symbol": "StepConfigPanel._step", "kind": "attribute", "line_display": "142", "line_start": 142, "line_end": 142, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Step đang chỉnh sửa — trạng thái chia sẻ giữa load_step()/_on_edit()/mọi hành động subagent+attachment; do canvas gán vào qua load_step()", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 329 ] }, { "symbol": "StepConfigPanel._node_id", "kind": "attribute", "line_display": "143", "line_start": 143, "line_end": 143, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "id node đang chọn — dùng để emit run_node/run_from/delete_node; là cầu nối canvas <-> property panel", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 330 ] }, { "symbol": "StepConfigPanel._loading", "kind": "attribute", "line_display": "144", "line_start": 144, "line_end": 144, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "cờ chặn _on_edit() chạy lại trong lúc load_step() đang set giá trị field", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 331 ] }, { "symbol": "StepConfigPanel.label_edit", "kind": "attribute", "line_display": "159", "line_start": 159, "line_end": 159, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 332 ] }, { "symbol": "StepConfigPanel.role_edit", "kind": "attribute", "line_display": "163", "line_start": 163, "line_end": 163, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 333 ] }, { "symbol": "StepConfigPanel.icon_edit", "kind": "attribute", "line_display": "170", "line_start": 170, "line_end": 170, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 334 ] }, { "symbol": "StepConfigPanel.instructions_edit", "kind": "attribute", "line_display": "175", "line_start": 175, "line_end": 175, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 335 ] }, { "symbol": "StepConfigPanel.gen_btn", "kind": "attribute", "line_display": "178", "line_start": 178, "line_end": 178, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "nút 'AI draft' — enable chỉ khi có ctx", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 336 ] }, { "symbol": "StepConfigPanel.context_edit", "kind": "attribute", "line_display": "192", "line_start": 192, "line_end": 192, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 337 ] }, { "symbol": "StepConfigPanel.model_combo", "kind": "attribute", "line_display": "201", "line_start": 201, "line_end": 201, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 338 ] }, { "symbol": "StepConfigPanel.load_models_btn", "kind": "attribute", "line_display": "204", "line_start": 204, "line_end": 204, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 339 ] }, { "symbol": "StepConfigPanel.perm_combo", "kind": "attribute", "line_display": "214", "line_start": 214, "line_end": 214, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 340 ] }, { "symbol": "StepConfigPanel.verify_chk", "kind": "attribute", "line_display": "221", "line_start": 221, "line_end": 221, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 341 ] }, { "symbol": "StepConfigPanel.rounds_spin", "kind": "attribute", "line_display": "223", "line_start": 223, "line_end": 223, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 342 ] }, { "symbol": "StepConfigPanel.skills_list", "kind": "attribute", "line_display": "236", "line_start": 236, "line_end": 236, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "checklist skill của registry, gán checked theo step.skills", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 343 ] }, { "symbol": "StepConfigPanel.attach_list", "kind": "attribute", "line_display": "242", "line_start": 242, "line_end": 242, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 344 ] }, { "symbol": "StepConfigPanel.attach_add_btn", "kind": "attribute", "line_display": "244", "line_start": 244, "line_end": 244, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 345 ] }, { "symbol": "StepConfigPanel.attach_del_btn", "kind": "attribute", "line_display": "247", "line_start": 247, "line_end": 247, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 346 ] }, { "symbol": "StepConfigPanel._parallel_card", "kind": "attribute", "line_display": "263", "line_start": 263, "line_end": 263, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "card cả section Sub-agents; load_step() ẩn/hiện toàn bộ card này theo step.is_parallel", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 347 ] }, { "symbol": "StepConfigPanel.sub_list", "kind": "attribute", "line_display": "264", "line_start": 264, "line_end": 264, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 348 ] }, { "symbol": "StepConfigPanel.sub_add_btn", "kind": "attribute", "line_display": "267", "line_start": 267, "line_end": 267, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 349 ] }, { "symbol": "Co4ETab.config", "kind": "attribute", "line_display": "268", "line_start": 268, "line_end": 268, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "StepConfigPanel + wiring changed/run_node/run_from/delete_node (dòng 268-273) — khớp vai trò mô tả cho node_property_panel.py", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 39 ] }, { "symbol": "StepConfigPanel.sub_del_btn", "kind": "attribute", "line_display": "270", "line_start": 270, "line_end": 270, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 350 ] }, { "symbol": "StepConfigPanel.run_btn", "kind": "attribute", "line_display": "283", "line_start": 283, "line_end": 283, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "click emit run_node(self._node_id)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 351 ] }, { "symbol": "StepConfigPanel.run_from_btn", "kind": "attribute", "line_display": "287", "line_start": 287, "line_end": 287, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "click emit run_from(self._node_id)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 352 ] }, { "symbol": "StepConfigPanel.del_btn", "kind": "attribute", "line_display": "290", "line_start": 290, "line_end": 290, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "click emit delete_node(self._node_id)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 353 ] }, { "symbol": "StepConfigPanel.load_step", "kind": "method", "line_display": "316-354", "line_start": 316, "line_end": 354, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "Điểm nối chính giữa canvas (khi chọn node) và panel thuộc tính — nhận (node_id, step, skill_names) từ ngoài rồi ghi self._step/self._node_id; đây là API mà co4e_canvas_widget.py hoặc co4e_tab.py sẽ gọi khi chọn node", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 354 ] }, { "symbol": "StepConfigPanel.clear_step", "kind": "method", "line_display": "356-359", "line_start": 356, "line_end": 359, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "gọi khi bỏ chọn node — reset self._step/self._node_id", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 355 ] }, { "symbol": "StepConfigPanel._on_edit", "kind": "method", "line_display": "362-378", "line_start": 362, "line_end": 378, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "ghi ngược giá trị field UI vào self._step rồi emit changed() — canvas repaint + autosave phụ thuộc signal này, đổi tên/behavior ở đây ảnh hưởng cả canvas lẫn service lưu flow", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 356 ] }, { "symbol": "StepConfigPanel._available_agent_names", "kind": "method", "line_display": "380-390", "line_start": 380, "line_end": 390, "needs_qt_widget": false, "touches_disk_or_network": true, "target_file": "presentation/co4e/node_property_panel.py", "note": "staticmethod; gọi core.co4e.list_custom_agents() đọc file JSON trong AGENTS_DIR trên đĩa — logic thuần Python nhưng có I/O, có thể tách ra application layer nếu cần test không đụng đĩa", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 357 ] }, { "symbol": "StepConfigPanel._add_subagent", "kind": "method", "line_display": "392-408", "line_start": 392, "line_end": 408, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "dùng QInputDialog để chọn/nhập tên agent song song", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 358 ] }, { "symbol": "StepConfigPanel._edit_subagent", "kind": "method", "line_display": "410-428", "line_start": 410, "line_end": 428, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "double-click 1 dòng sub-agent để chọn lại agent khác", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 359 ] }, { "symbol": "StepConfigPanel._del_subagent", "kind": "method", "line_display": "430-437", "line_start": 430, "line_end": 437, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 360 ] }, { "symbol": "StepConfigPanel._add_attachment", "kind": "method", "line_display": "439-453", "line_start": 439, "line_end": 453, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "QFileDialog chỉ chọn đường dẫn hiển thị tên file, không tự đọc nội dung ở đây (nội dung được đọc lúc chạy step, ở nơi khác)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 361 ] }, { "symbol": "StepConfigPanel._del_attachment", "kind": "method", "line_display": "455-462", "line_start": 455, "line_end": 462, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 362 ] }, { "symbol": "StepConfigPanel._ai_draft", "kind": "method", "line_display": "464-498", "line_start": 464, "line_end": 498, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/node_property_panel.py", "note": "gọi generate_agent_prompt(ctx.build_active_provider(), ...) qua AgentWorker — gọi network tới AI provider, chạy nền rồi cập nhật UI ở callback done(); nếu tách sang service, phần gọi AI nên chuyển xuống application layer, phần còn lại (QInputDialog + set text) ở lại đây", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 363 ] }, { "symbol": "StepConfigPanel._draft_worker", "kind": "attribute", "line_display": "497", "line_start": 497, "line_end": 497, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "giữ tham chiếu AgentWorker (QThread-like) để không bị GC giữa lúc job async đang chạy", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 364 ] }, { "symbol": "StepConfigPanel._load_models", "kind": "method", "line_display": "500-528", "line_start": 500, "line_end": 528, "needs_qt_widget": true, "touches_disk_or_network": true, "target_file": "presentation/co4e/node_property_panel.py", "note": "gọi preview_ai.fetch_live_models(ctx) qua AgentWorker — network call tới provider để lấy danh sách model; cắt ngang lát — cần agent gộp đối chiếu vì dòng cuối trùng đúng biên đọc được giao (528), chưa chắc thân method đã hết ở đây", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 365 ] }, { "symbol": "StepConfigPanel._model_worker", "kind": "attribute", "line_display": "525", "line_start": 525, "line_end": 525, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "giữ tham chiếu AgentWorker của _load_models để không bị GC", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 366 ] }, { "symbol": "Co4ETab._wrap_config", "kind": "method", "line_display": "934-964", "line_start": 934, "line_end": 964, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "bọc self.config (StepConfigPanel) với header expand/collapse — khớp mô tả node_property_panel.py trong prompt.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 111 ] }, { "symbol": "Co4ETab.config_toggle_btn", "kind": "attribute", "line_display": "946", "line_start": 946, "line_end": 946, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 112 ] }, { "symbol": "Co4ETab.config_title", "kind": "attribute", "line_display": "951", "line_start": 951, "line_end": 951, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 113 ] }, { "symbol": "Co4ETab._cfg_vlayout", "kind": "attribute", "line_display": "957", "line_start": 957, "line_end": 957, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "dùng lại trong _toggle_config (co4e_tab.py) — trạng thái chia sẻ.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 114 ] }, { "symbol": "Co4ETab._cfg_top_spacer", "kind": "attribute", "line_display": "961", "line_start": 961, "line_end": 961, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "QSpacerItem — kiểu giá trị layout, không cần QApplication đang sống.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 115 ] }, { "symbol": "Co4ETab._cfg_bot_spacer", "kind": "attribute", "line_display": "962", "line_start": 962, "line_end": 962, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 116 ] }, { "symbol": "Co4ETab.config_container", "kind": "attribute", "line_display": "963", "line_start": 963, "line_end": 963, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "dùng lại bởi _toggle_config (co4e_tab.py) — trạng thái chia sẻ giữa node_property_panel.py và co4e_tab.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 117 ] }, { "symbol": "Co4ETab._on_node_selected", "kind": "method", "line_display": "1325-1331", "line_start": 1325, "line_end": 1331, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "khớp mô tả 'nối chọn node sang panel thuộc tính' trong prompt. Đọc self.canvas.nodes() và self.config, toggle self._config_collapsed (trạng thái chia sẻ với _toggle_config ở co4e_tab.py).", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 164 ] }, { "symbol": "Co4ETab._on_config_changed", "kind": "method", "line_display": "1333-1336", "line_start": 1333, "line_end": 1336, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/node_property_panel.py", "note": "gọi self.canvas.refresh_node cho từng node rồi self._autosave() — cầu nối property panel ↔ canvas ↔ service lưu đĩa.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 165 ] }, { "symbol": "Co4ETab._manage_skills", "kind": "method", "line_display": "1369-1373", "line_start": 1369, "line_end": 1373, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "presentation/co4e/skills_list_panel.py", "note": "mở SkillsDialog rồi self._reload_sidebar() — không có tên tương ứng trực tiếp trong bảng plan.md, tự xếp theo mô tả skills_list_panel.py.", "in_old_table": "co", "old_table_mismatch": "-", "merged_from_raw_indices": [ 170 ] }, { "symbol": "_PaletteList", "kind": "class", "line_display": "97-119", "line_start": 97, "line_end": 119, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "unsure", "note": "list kéo-thả dùng chung cho wf_list và agent_list, phát payload CO4E_MIME hiểu bởi canvas — không rõ nên đặt ở co4e_tab.py (nơi dùng) hay co4e_canvas_widget.py (định nghĩa giao thức CO4E_MIME)", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 8 ] }, { "symbol": "_PaletteList.__init__", "kind": "method", "line_display": "102-106", "line_start": 102, "line_end": 106, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "unsure", "note": "cùng lý do với class _PaletteList", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 9 ] }, { "symbol": "_PaletteList._payload_role", "kind": "attribute", "line_display": "104", "line_start": 104, "line_end": 104, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "unsure", "note": "cùng lý do với class _PaletteList", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 10 ] }, { "symbol": "_PaletteList.startDrag", "kind": "method", "line_display": "108-119", "line_start": 108, "line_end": 119, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "unsure", "note": "cùng lý do với class _PaletteList; dùng CO4E_MIME từ co4e_canvas", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 11 ] }, { "symbol": "Co4ETab._project_id", "kind": "attribute", "line_display": "249", "line_start": 249, "line_end": 249, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "unsure", "note": "project Workspace đang chọn, ảnh hưởng đường dẫn output flow — không chắc thuộc container hay run control", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 31 ] }, { "symbol": "Co4ETab._project_dir", "kind": "attribute", "line_display": "250", "line_start": 250, "line_end": 250, "needs_qt_widget": false, "touches_disk_or_network": false, "target_file": "unsure", "note": "cùng lý do với _project_id", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 32 ] }, { "symbol": "Co4ETab._reflect_active_run", "kind": "method", "line_display": "449-457", "line_start": 449, "line_end": 457, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "unsure", "note": "cầu nối giữa self.manager (run control) và self.canvas (canvas widget) — không chắc nên đặt file nào", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 52 ] }, { "symbol": "Co4ETab._palette_item", "kind": "method", "line_display": "724-728", "line_start": 724, "line_end": 728, "needs_qt_widget": true, "touches_disk_or_network": false, "target_file": "unsure", "note": "staticmethod helper dùng chung để tạo QListWidgetItem cho cả agent_list, skill_list, và cả node palette sequential/parallel (thấy dùng ở dòng 701-704) — không rõ nên đặt ở agent_list_panel.py, skills_list_panel.py hay co4e_canvas_widget.py.", "in_old_table": "chua/khong ro", "old_table_mismatch": "-", "merged_from_raw_indices": [ 87 ] } ] }