Files
cowork-local/docs/architecture/co4e-split-map-run-control.json
T
lamhv7andClaude Sonnet 5 0631abf85f feat(co4e): tách 6 widget UI khỏi ui/co4e_tab.py sang presentation/co4e/*
Lane N3 (Co4E Studio) — dùng bộ workflow refactor-god-file, mỗi bước có
characterization test trước khi tách, hậu kiểm ranh giới tầng sau mỗi bước:

- skills_list_panel.py / agent_list_panel.py — 2 khu vực sidebar
- co4e_canvas_widget.py + canvas_items.py + canvas_interaction_mixin.py —
  Co4ECanvas tách 3 file (vượt 400 dòng nếu đứng một mình)
- node_property_panel.py + node_property_actions_mixin.py +
  step_config_section.py — StepConfigPanel, cùng lý do
- co4e_run_control_widget.py — RunsPagePanel (trang Flow Status)
- co4e_chat_view.py — ChatPanel + _ChatInput + helper autocomplete
- palette_list.py — _PaletteList dời khỏi ui/co4e_tab.py, hết import ngược
  presentation -> ui (agent/skills panel giờ import top-level)

ui/co4e_tab.py giảm 2089 -> 1878 dòng, chỉ còn phần wiring + business logic
(Co4ERunManager/AgentWorker chưa đổi — nằm ngoài phạm vi này, xem docstring
presentation/co4e/co4e_tab.py). ui/co4e_canvas.py và ui/co4e_config_panel.py
còn lại là compat shim re-export, không đổi API cho bên gọi.

Thêm tests/test_co4e_integration.py — dựng thật Co4ETab qua build_co4e_tab(),
lái luồng qua nhiều panel trong cùng instance (thêm node, mở/gập chat, chuyển
trang Flow Status rồi quay lại không mất state canvas) — bắt lỗi wiring
xuyên-panel mà characterization test từng panel riêng không thấy được.

Đã xác minh: pytest 348 passed/1 skipped, tools/check_co4e.py sạch, không
file nào >400 dòng, domain/application không import PySide6, và so pixel
before/after (git worktree tại HEAD cũ) ra 0/1.125.000 pixel khác biệt.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-25 18:43:42 +09:00

2807 lines
116 KiB
JSON

{
"lane": "run-control (Flow Status / trang Runs)",
"source_file_scanned": "ui/co4e_tab.py",
"generated_from_raw_symbol_count": 215,
"raw_scan_agents": 3,
"final_row_count": 214,
"run_control_widget_target": "presentation/co4e/co4e_run_control_widget.py",
"container_target": "ui/co4e_tab.py",
"run_control_widget_symbol_count": 18,
"container_symbol_count": 173,
"other_lane_symbol_count": 23,
"khac_tai_lieu_notes_found": 0,
"merged_duplicate_symbol_groups": [
"Co4ETab._reload_sidebar (dong 685, 2 luot quet trung, gop thanh 685-718)"
],
"kept_separate_anomaly_symbols": [
"Co4ETab.showEvent (2 dinh nghia cung ten trong 1 class -- anomaly co that trong source, ban thu 2 de len ban dau luc runtime; khop voi 'kept_separate_anomaly_symbols' cua bang cu)"
],
"old_table_reference": "docs/architecture/co4e-split-map.json",
"systemic_old_table_finding": "Bang cu dung target_file='presentation/co4e/co4e_tab.py' cho phan than class Co4ETab con lai, nhung file that o repo hien tai la ui/co4e_tab.py (2084+ dong) -- presentation/co4e/co4e_tab.py chi la factory build_co4e_tab() 53 dong (xem docstring file do), khong phai noi class Co4ETab song. Moi so sanh trong bang nay da tu quy doi 'presentation/co4e/co4e_tab.py' -> 'ui/co4e_tab.py' truoc khi ket luan mismatch.",
"scope_narrowing_finding": "Bang cu (o thoi diem no duoc quet) coi co4e_run_control_widget.py la ca 'run control' theo nghia rong: gom ca bang Runs (runs_table) LAN logic thuc thi run (start/stop/manual-mode/mode-toolbar/event routing/popup) va ca sidebar quick-list cac run gan day. Mo ta dich cua lan quet 3-agent lan nay (an trong ghi chu tung dong) thu hep pham vi: co4e_run_control_widget.py CHI con la TRANG Runs/Flow Status (bang + nut hanh dong tren tung dong + nut mo thu muc workspace); logic thuc thi run, toolbar mode/run, va sidebar quick-list deu o lai ui/co4e_tab.py. Day la khac biet lon nhat giua bang cu va bang nay -- xem cot 'cho nao thay bang cu sai' cho tung dong lien quan.",
"khac_tai_lieu_rows": [],
"rows": [
{
"symbol": "_PLAN_GLYPH",
"kind": "attribute",
"line_start": 46,
"line_end": 47,
"line_display": "46-47",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "module-level dict constant, không phải self.<attr> -- QUYET DINH: glyph dùng bởi _fmt_plan cho bong bóng 'plan' trong CHAT, không phải bảng Runs; bảng cũ xếp nhầm vào co4e_run_control_widget.py",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 45-46) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "_fmt_plan",
"kind": "function",
"line_start": 50,
"line_end": 59,
"line_display": "50-59",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "helper format cho _append_plan (chat), không đụng runs_table; bảng cũ xếp nhầm vào co4e_run_control_widget.py",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 49-58) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "_skill_names",
"kind": "function",
"line_start": 62,
"line_end": 66,
"line_display": "62-66",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "gọi skills_mod.list_skills()/builtin_skills() — có thể chạm đĩa qua core.skills -- QUYET DINH: helper autocomplete cho _ChatInput — thuộc lane co4e_chat_view.py (chưa tồn tại), ngoài phạm vi lane run-control nên giữ nguyên vị trí hiện tại",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_agent_names",
"kind": "function",
"line_start": 69,
"line_end": 72,
"line_display": "69-72",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "gọi co4e.list_custom_agents() — chạm đĩa qua core.co4e -- QUYET DINH: cùng lý do với _skill_names — autocomplete /agent trong chat",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_EqualTabBar",
"kind": "class",
"line_start": 75,
"line_end": 95,
"line_display": "75-95",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "helper QTabBar cho sidebar icon-tabs — không liên quan Flow Status -- QUYET DINH: QTabBar tiện ích cho sidebar icon-tabs, không liên quan Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_EqualTabBar._GAP",
"kind": "attribute",
"line_start": 81,
"line_end": 81,
"line_display": "81",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "hằng số nội bộ của _EqualTabBar",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_EqualTabBar.tabSizeHint",
"kind": "method",
"line_start": 83,
"line_end": 91,
"line_display": "83-91",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_EqualTabBar.resizeEvent",
"kind": "method",
"line_start": 93,
"line_end": 95,
"line_display": "93-95",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_PaletteList",
"kind": "class",
"line_start": 98,
"line_end": 120,
"line_display": "98-120",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "list kéo-thả vào canvas cho Workflows/Agents/Skills palette — không phải Runs -- QUYET DINH: list kéo-thả cho palette Workflows/Agents/Skills, không phải Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_PaletteList.__init__",
"kind": "method",
"line_start": 103,
"line_end": 107,
"line_display": "103-107",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_PaletteList._payload_role",
"kind": "attribute",
"line_start": 105,
"line_end": 105,
"line_display": "105",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_PaletteList.startDrag",
"kind": "method",
"line_start": 109,
"line_end": 120,
"line_display": "109-120",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_directive_token",
"kind": "function",
"line_start": 123,
"line_end": 135,
"line_display": "123-135",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "logic thuần regex cho autocomplete /skill /agent trong chat — test được không cần Qt -- QUYET DINH: regex thuần cho autocomplete /skill /agent — lane co4e_chat_view.py (chưa tồn tại), giữ nguyên",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput",
"kind": "class",
"line_start": 138,
"line_end": 227,
"line_display": "138-227",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "ô chat với popup autocomplete — không liên quan Flow Status -- QUYET DINH: ô nhập chat với popup autocomplete — lane co4e_chat_view.py (chưa tồn tại), giữ nguyên",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput.submit",
"kind": "attribute",
"line_start": 142,
"line_end": 142,
"line_display": "142",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "Signal khai báo ở cấp lớp -- QUYET DINH: Signal của _ChatInput — đi cùng class",
"in_old_table": "chua",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput.__init__",
"kind": "method",
"line_start": 144,
"line_end": 152,
"line_display": "144-152",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput._popup",
"kind": "attribute",
"line_start": 146,
"line_end": 146,
"line_display": "146",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput._maybe_popup",
"kind": "method",
"line_start": 154,
"line_end": 179,
"line_display": "154-179",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gọi _skill_names/_agent_names (chạm đĩa gián tiếp) và định vị popup bằng tọa độ màn hình",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput._add_row",
"kind": "method",
"line_start": 181,
"line_end": 185,
"line_display": "181-185",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput._accept",
"kind": "method",
"line_start": 187,
"line_end": 200,
"line_display": "187-200",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput.focusOutEvent",
"kind": "method",
"line_start": 202,
"line_end": 205,
"line_display": "202-205",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_ChatInput.keyPressEvent",
"kind": "method",
"line_start": 207,
"line_end": 227,
"line_display": "207-227",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab",
"kind": "class",
"line_start": 230,
"line_end": 700,
"line_display": "230-700",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cắt ngang lát — cần agent gộp đối chiếu (thân lớp trải dài quá dòng 700, đây chỉ là phần đầu) -- QUYET DINH: lớp container chính — phần còn lại sau khi các widget con (canvas/node-property/agent/skills/run-control/chat) đã tách",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.status_message",
"kind": "attribute",
"line_start": 231,
"line_end": 231,
"line_display": "231",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "Signal khai báo ở cấp lớp -- QUYET DINH: Signal cấp lớp của chính Co4ETab; KHÔNG có trong bảng cũ (thiếu sót ở đó)",
"in_old_table": "chua",
"old_table_mismatch": "BANG CU BO SOT: khong co dong nao cho symbol nay du no ro rang ton tai trong pham vi da quet (367 symbol tho cua bang cu) -- co the do agent quet truoc bo lot."
},
{
"symbol": "Co4ETab.__init__",
"kind": "method",
"line_start": 233,
"line_end": 305,
"line_display": "233-305",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gộp nhiều việc: khởi state run-per-flow, dựng splitter 3 cột, wiring StepConfigPanel, narrow-guard, rồi mở flow đầu tiên — biên độ rủi ro cao khi tách vì đụng gần hết thuộc tính self chia sẻ toàn tab -- QUYET DINH: constructor container — sẽ đổi để dựng Co4ERunControlWidget thay vì tự vẽ bảng Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.ctx",
"kind": "attribute",
"line_start": 235,
"line_end": 235,
"line_display": "235",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._wf",
"kind": "attribute",
"line_start": 236,
"line_end": 236,
"line_display": "236",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái chia sẻ toàn tab — workflow đang hiển thị trên canvas, đọc/ghi bởi rất nhiều method (flow tabs, run, sidebar, config) -- QUYET DINH: trạng thái trung tâm toàn tab, container giữ",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._chat_worker",
"kind": "attribute",
"line_start": 237,
"line_end": 237,
"line_display": "237",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "AgentWorker của chat — lane co4e_chat_view.py chưa tồn tại, giữ nguyên",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.manager",
"kind": "attribute",
"line_start": 239,
"line_end": 239,
"line_display": "239",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "Co4ERunManager dùng chung giữa canvas (mirror trạng thái node) và trang Runs (self.runs_table — định nghĩa ngoài dòng 700, có thể ở co4e_run_control_widget) — điểm nối quan trọng giữa hai lát -- QUYET DINH: Co4ERunManager dùng chung giữa canvas, chat VÀ bảng Runs — quyết định: container SỞ HỮU, co4e_run_control_widget.py nhận qua constructor/callback (dependency injection) thay vì tự tạo. Bảng cũ xếp thẳng vào co4e_run_control_widget.py dù chính ghi chú của nó gọi đây là 'điểm nối' — coi là quá vội",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 238) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._flow_runs",
"kind": "attribute",
"line_start": 244,
"line_end": 244,
"line_display": "244",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái chia sẻ wf_id -> active run id, đọc/ghi bởi _open_flow, _close_flow_tab, _cur_run_id, _reflect_active_run -- QUYET DINH: dict wf_id->run id, ghi bởi _open_flow/_close_flow_tab/_start_canvas_run (đều ở co4e_tab.py) — container giữ, run-control đọc/ghi qua callback. Bảng cũ xếp vào co4e_run_control_widget.py — không khớp nơi ghi chính",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 243) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._run_logs",
"kind": "attribute",
"line_start": 245,
"line_end": 245,
"line_display": "245",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "map run_id->ChatView (thuộc lane chat), ghi bởi _manual_step/_start_canvas_run ở co4e_tab.py — container giữ",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 244) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._flow_outputs",
"kind": "attribute",
"line_start": 246,
"line_end": 246,
"line_display": "246",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi lane run-control. Hiện tại vật lý vẫn còn ở ui/co4e_tab.py dòng 246 chờ lane đó dọn",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._flow_usage",
"kind": "attribute",
"line_start": 249,
"line_end": 249,
"line_display": "249",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "usage token/cost hiển thị ở header CHAT (Messages), không phải bảng Runs — bảng cũ xếp nhầm vào co4e_run_control_widget.py",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 248) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._project_id",
"kind": "attribute",
"line_start": 250,
"line_end": 250,
"line_display": "250",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "workspace hiện chọn — dùng chung bởi chat (_out_dir) và nút mở-thư-mục của Runs; container giữ, expose qua callback",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._project_dir",
"kind": "attribute",
"line_start": 251,
"line_end": 251,
"line_display": "251",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng lý do với _project_id",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._manual_active",
"kind": "attribute",
"line_start": 253,
"line_end": 253,
"line_display": "253",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái MODE THỦ CÔNG — thuộc nhóm run-execution, mô tả đích lane này loại trừ mode/run toolbar khỏi co4e_run_control_widget.py. Bảng cũ xếp vào co4e_run_control_widget.py — mâu thuẫn trực tiếp với phạm vi hiện tại",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 252) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_order",
"kind": "attribute",
"line_start": 254,
"line_end": 254,
"line_display": "254",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng nhóm với _manual_active — xem lý do ở đó",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 253) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_idx",
"kind": "attribute",
"line_start": 255,
"line_end": 255,
"line_display": "255",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng nhóm với _manual_active — xem lý do ở đó",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 254) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._flows",
"kind": "attribute",
"line_start": 258,
"line_end": 258,
"line_display": "258",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái chia sẻ danh sách flow đang mở (browser-style tabs) — đọc/ghi bởi toàn bộ nhóm _open_flow/_close_flow_tab/_on_flow_tab_changed -- QUYET DINH: danh sách flow-tab kiểu browser, không phải Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._active_flow_idx",
"kind": "attribute",
"line_start": 259,
"line_end": 259,
"line_display": "259",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng nhóm trạng thái chia sẻ với _flows -- QUYET DINH: cùng nhóm với _flows",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._split",
"kind": "attribute",
"line_start": 262,
"line_end": 262,
"line_display": "262",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "splitter 3 cột của cả tab",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.config",
"kind": "attribute",
"line_start": 269,
"line_end": 269,
"line_display": "269",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "container giữ tham chiếu StepConfigPanel (đã tách ở node_property_panel.py, file cấm sửa của lane khác) — cùng khuôn mẫu với _agent_panel/_skills_panel: instance do container tạo/giữ, nội dung panel ở file riêng. Bảng cũ xếp thẳng dòng này vào node_property_panel.py — không nhất quán với cách nó xử lý _agent_panel",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._config_collapsed",
"kind": "attribute",
"line_start": 275,
"line_end": 275,
"line_display": "275",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái thu/phóng của KHUNG bọc quanh panel (co4e_tab.py), không phải nội dung panel",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._config_expanded_w",
"kind": "attribute",
"line_start": 276,
"line_end": 276,
"line_display": "276",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng lý do với _config_collapsed",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._narrow_guard",
"kind": "attribute",
"line_start": 281,
"line_end": 281,
"line_display": "281",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "guard bố cục hẹp của cả tab",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._open_flow",
"kind": "method",
"line_start": 308,
"line_end": 339,
"line_display": "308-339",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc/ghi self._flows, self._active_flow_idx, self.flow_bar — quản lý flow tab kiểu browser, không phải trang Runs -- QUYET DINH: quản lý flow-tab kiểu browser",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._close_other_flows",
"kind": "method",
"line_start": 341,
"line_end": 356,
"line_display": "341-356",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc/ghi self._flows, self._active_flow_idx, self.flow_bar",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._show_runs",
"kind": "method",
"line_start": 358,
"line_end": 368,
"line_display": "358-368",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "chuyển center_stack giữa flow editor và trang Runs; gọi bởi self.runs_btn (định nghĩa ngoài dòng 700, thuộc toolbar) và runs_more_btn (sidebar) — không thao tác trực tiếp runs_table nên không chắc thuộc co4e_run_control_widget hay ở lại co4e_tab.py làm điều phối trang -- QUYET DINH: điều phối chuyển trang center_stack giữa flow editor và trang Runs — container sở hữu center_stack; sẽ gọi API show()/hide() hoặc setCurrentWidget trên Co4ERunControlWidget thay vì tự vẽ",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._on_flow_tab_changed",
"kind": "method",
"line_start": 370,
"line_end": 386,
"line_display": "370-386",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc/ghi self._active_flow_idx, self.center_stack (self.center_stack định nghĩa ngoài dòng 700)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._sync_runs_toggle",
"kind": "method",
"line_start": 388,
"line_end": 395,
"line_display": "388-395",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "dùng getattr(self, 'runs_btn', None) vì runs_btn (toolbar, ngoài dòng 700) có thể chưa tồn tại — đồng bộ trạng thái toggle của trang Runs -- QUYET DINH: đồng bộ nút toggle runs_btn ở toolbar (thuộc co4e_tab.py, KHÔNG phải trang Runs)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._add_tab_close_button",
"kind": "method",
"line_start": 397,
"line_end": 407,
"line_display": "397-407",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._close_flow_tab_button",
"kind": "method",
"line_start": 409,
"line_end": 413,
"line_display": "409-413",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._close_flow_tab",
"kind": "method",
"line_start": 415,
"line_end": 443,
"line_display": "415-443",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc/ghi self._flow_runs, self._run_logs, self._flows, self._active_flow_idx, self.run_btn (định nghĩa ngoài dòng 700) — nhiều trạng thái chia sẻ chạm cùng lúc",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._sync_active_flow_tab_text",
"kind": "method",
"line_start": 445,
"line_end": 448,
"line_display": "445-448",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._reflect_active_run",
"kind": "method",
"line_start": 450,
"line_end": 458,
"line_display": "450-458",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.manager.all_runs(), ghi self._flow_runs, gọi self.canvas.update_node_status — cầu nối giữa run manager (chia sẻ với trang Runs) và canvas -- QUYET DINH: cầu nối manager -> canvas (update_node_status trên canvas thuộc co4e_tab.py) — đi cùng nhóm thực thi run, không phải bảng Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._cur_run_id",
"kind": "method",
"line_start": 461,
"line_end": 474,
"line_display": "461-474",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "logic thuần: đọc self._wf, self._flow_runs, self.manager.get() — test được không cần Qt -- QUYET DINH: tra cứu run đang chạy CỦA FLOW HIỆN TẠI, dùng bởi _reflect_active_run (canvas mirror, co4e_tab.py) — không đụng runs_table. Bảng cũ xếp vào co4e_run_control_widget.py — không khớp nơi dùng chính",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 460-473) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._outputs_for",
"kind": "method",
"line_start": 476,
"line_end": 479,
"line_display": "476-479",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "logic thuần dict, test được không cần Qt -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ) cho cặp _flow_outputs/_outputs_for; ngoài phạm vi lane run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._update_run_btn",
"kind": "method",
"line_start": 481,
"line_end": 483,
"line_display": "481-483",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc nhóm run toolbar (self.run_btn) — theo mô tả target, co4e_run_control_widget KHÔNG bao gồm mode/run toolbar nên method này không nên vào đó -- QUYET DINH: nút Run của toolbar mode/run — mô tả đích loại trừ nhóm này khỏi co4e_run_control_widget.py; bảng cũ xếp vào đó — mâu thuẫn với phạm vi hiện tại",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 480-482) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._build_sidebar",
"kind": "method",
"line_start": 486,
"line_end": 599,
"line_display": "486-599",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "method dài >80 dòng, gộp nhiều việc không liên quan nhau: dựng section Workflows (list + edit/dup/del/run-bg), section Agents (AgentListPanel wiring), section Skills (SkillsListPanel wiring), section Runs sidebar quick-list, và lắp splitter dọc side_split — nên tách nhỏ thêm theo từng section -- QUYET DINH: dựng toàn bộ sidebar (Workflows/Agents/Skills/Runs quick-list)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._sections",
"kind": "attribute",
"line_start": 494,
"line_end": 494,
"line_display": "494",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "dict trạng thái chia sẻ cho các section sidebar (fold/unfold) — đọc/ghi bởi _section, _fold_section, _sync_section_arrow",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.sidebar",
"kind": "attribute",
"line_start": 495,
"line_end": 495,
"line_display": "495",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.side_split",
"kind": "attribute",
"line_start": 499,
"line_end": 499,
"line_display": "499",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_build_sidebar._Col",
"kind": "class",
"line_start": 504,
"line_end": 512,
"line_display": "504-512",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "class cục bộ (locals) bên trong _build_sidebar — adapter cho side_split, không phải class module-level -- QUYET DINH: class cục bộ, adapter cho side_split",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_Col.__init__",
"kind": "method",
"line_start": 507,
"line_end": 508,
"line_display": "507-508",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_Col.addWidget",
"kind": "method",
"line_start": 510,
"line_end": 512,
"line_display": "510-512",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_new_btn",
"kind": "attribute",
"line_start": 517,
"line_end": 517,
"line_display": "517",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_list",
"kind": "attribute",
"line_start": 528,
"line_end": 528,
"line_display": "528",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_edit_btn",
"kind": "attribute",
"line_start": 535,
"line_end": 535,
"line_display": "535",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_dup_btn",
"kind": "attribute",
"line_start": 536,
"line_end": 536,
"line_display": "536",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_del_btn",
"kind": "attribute",
"line_start": 537,
"line_end": 537,
"line_display": "537",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.wf_runbg_btn",
"kind": "attribute",
"line_start": 544,
"line_end": 544,
"line_display": "544",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._agent_panel",
"kind": "attribute",
"line_start": 556,
"line_end": 556,
"line_display": "556",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "AgentListPanel — panel đã tách sẵn ở presentation/co4e/agent_list_panel.py (ngoài phạm vi lát này) -- QUYET DINH: container giữ instance AgentListPanel (đã tách sẵn) — KHÔNG có trong bảng cũ (thiếu sót ở đó, ag_new_btn/agent_list/ag_edit_btn/ag_del_btn có dòng nhưng _agent_panel thì không)",
"in_old_table": "chua",
"old_table_mismatch": "BANG CU BO SOT: khong co dong nao cho symbol nay du no ro rang ton tai trong pham vi da quet (367 symbol tho cua bang cu) -- co the do agent quet truoc bo lot."
},
{
"symbol": "Co4ETab.ag_new_btn",
"kind": "attribute",
"line_start": 557,
"line_end": 557,
"line_display": "557",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "alias trỏ tới self._agent_panel.new_btn — widget thật nằm ở agent_list_panel.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.agent_list",
"kind": "attribute",
"line_start": 559,
"line_end": 559,
"line_display": "559",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "alias trỏ tới self._agent_panel.list_widget",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.ag_edit_btn",
"kind": "attribute",
"line_start": 560,
"line_end": 560,
"line_display": "560",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "alias trỏ tới self._agent_panel.edit_btn",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.ag_del_btn",
"kind": "attribute",
"line_start": 562,
"line_end": 562,
"line_display": "562",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "alias trỏ tới self._agent_panel.del_btn",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._skills_panel",
"kind": "attribute",
"line_start": 571,
"line_end": 571,
"line_display": "571",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "SkillsListPanel — panel đã tách sẵn ở presentation/co4e/skills_list_panel.py (ngoài phạm vi lát này) -- QUYET DINH: container giữ instance SkillsListPanel (đã tách sẵn) — khớp bảng cũ",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.sk_manage_btn",
"kind": "attribute",
"line_start": 572,
"line_end": 572,
"line_display": "572",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/skills_list_panel.py",
"reason": "alias trỏ tới self._skills_panel.manage_btn — cùng bản chất với ag_new_btn ở trên. Bảng cũ xếp dòng này (và skill_list) vào co4e_tab.py trong khi ag_* tương ứng lại xếp vào agent_list_panel.py — KHÔNG NHẤT QUÁN giữa 2 cặp alias giống hệt nhau trong cùng bảng cũ; ở đây chọn xử lý đồng nhất với ag_*",
"in_old_table": "co",
"old_table_mismatch": "BANG CU KHONG NHAT QUAN: xep Co4ETab.sk_manage_btn vao ui/co4e_tab.py trong khi alias tuong duong ben Agent (ag_new_btn/agent_list/...) lai xep vao agent_list_panel.py; o day chon dong nhat -> presentation/co4e/skills_list_panel.py."
},
{
"symbol": "Co4ETab.skill_list",
"kind": "attribute",
"line_start": 574,
"line_end": 574,
"line_display": "574",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/skills_list_panel.py",
"reason": "alias trỏ tới self._skills_panel.list_widget — xem ghi chú ở sk_manage_btn",
"in_old_table": "co",
"old_table_mismatch": "BANG CU KHONG NHAT QUAN: xep Co4ETab.skill_list vao ui/co4e_tab.py trong khi alias tuong duong ben Agent (ag_new_btn/agent_list/...) lai xep vao agent_list_panel.py; o day chon dong nhat -> presentation/co4e/skills_list_panel.py."
},
{
"symbol": "Co4ETab.runs_more_btn",
"kind": "attribute",
"line_start": 582,
"line_end": 582,
"line_display": "582",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "nút icon trong sidebar mở trang Runs (gọi self._show_runs(True)) — điểm vào trang Flow Status nhưng không phải một phần của bảng runs_table -- QUYET DINH: nút icon nằm trong sidebar (dựng bởi _build_sidebar, ở co4e_tab.py) mở trang Runs — không phải một phần của runs_table. Bảng cũ xếp vào co4e_run_control_widget.py vì cùng 'chủ đề Runs', nhưng nơi nó được XÂY lại là sidebar",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 586) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab.runs_side_list",
"kind": "attribute",
"line_start": 590,
"line_end": 590,
"line_display": "590",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "danh sách rút gọn các run trong sidebar — KHÁC với self.runs_table của trang Flow Status (định nghĩa ngoài dòng 700, có thể ở co4e_run_control_widget); dễ nhầm là cùng một bảng nên tách agent gộp cần đối chiếu -- QUYET DINH: danh sách rút gọn run trong sidebar, KHÁC self.runs_table của trang Flow Status — dựng trong _build_sidebar (co4e_tab.py). Mô tả đích của _build_runs_page nói rõ co4e_run_control_widget.py = bảng runs_table + nút hành động, không bao gồm sidebar quick-list",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 594) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._SIDE_RUNS",
"kind": "attribute",
"line_start": 601,
"line_end": 601,
"line_display": "601",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "hằng số class — số run hiển thị trong sidebar quick-list, không phải trang runs_table chính -- QUYET DINH: hằng số cho sidebar quick-list — cùng nhóm runs_side_list",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 605) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._refresh_side_runs",
"kind": "method",
"line_start": 603,
"line_end": 615,
"line_display": "603-615",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.manager.runs(), ghi self.runs_side_list — sidebar quick-list, khác trang Flow Status runs_table -- QUYET DINH: cùng nhóm runs_side_list",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 607-619) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._on_side_run_clicked",
"kind": "method",
"line_start": 617,
"line_end": 625,
"line_display": "617-625",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gọi self._show_runs(True) rồi đọc self.runs_table (định nghĩa ngoài dòng 1-700, khả năng ở co4e_run_control_widget) để chọn dòng tương ứng — điểm nối giữa sidebar quick-list và trang Runs, cần agent gộp đối chiếu với file định nghĩa runs_table -- QUYET DINH: handler click của sidebar quick-list; có đọc self.runs_table nên cần API cầu nối sang co4e_run_control_widget.py khi tách, nhưng bản thân handler thuộc sidebar nên ở co4e_tab.py",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 621-629) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._section",
"kind": "method",
"line_start": 627,
"line_end": 659,
"line_display": "627-659",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "helper dựng UI section chung cho sidebar, ghi vào self._sections[key]",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._fold_section",
"kind": "method",
"line_start": 661,
"line_end": 673,
"line_display": "661-673",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self._sections",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._sync_section_arrow",
"kind": "method",
"line_start": 675,
"line_end": 678,
"line_display": "675-678",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self._sections",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._icon_btn",
"kind": "method",
"line_start": 679,
"line_end": 683,
"line_display": "679-683",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._reload_sidebar",
"kind": "method",
"line_start": 685,
"line_end": 718,
"line_display": "685-718",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "[GOP 2 luot quet trung ky hieu dong 685] cắt ngang lát — cần agent gộp đối chiếu (thân method tiếp tục ngoài dòng 700); gọi co4e.list_workflows() nên chạm đĩa || cắt ngang lát — cần agent gộp đối chiếu (bắt đầu ở dòng 685, trước khoảng được giao 701-1400; phần thấy được chỉ là vòng lặp nạp custom agents + skills vào agent_list/skill_list) -- QUYET DINH: [GỘP 2 lượt quét trùng ký hiệu ở dòng 685] một agent đọc thân đến 700 (cắt ngang lát), agent kia đọc tới 718 (vòng lặp nạp agent/skill) — gộp thành 1 dòng 685-718; nạp lại toàn bộ sidebar, không phải trang Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._palette_item",
"kind": "method",
"line_start": 720,
"line_end": 724,
"line_display": "720-724",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "staticmethod tạo QListWidgetItem cho palette — không liên quan trang Runs -- QUYET DINH: factory QListWidgetItem cho palette — sidebar, không phải Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._build_center",
"kind": "method",
"line_start": 727,
"line_end": 867,
"line_display": "727-867",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "method dài >80 dòng, gộp nhiều việc không liên quan: dựng flow tab bar (QTabBar ẩn), gọi _build_runs_page() để nhét vào center_stack, dựng toolbar flow (name/add/save/mode/run/runs toggle), dựng canvas + overlay + splitter dọc với chat. Nên tách nhỏ. Gán self.center_stack — trạng thái chia sẻ dùng ở nhiều nơi (switch giữa trang Runs và flow editor, cả _show_runs ngoài lát này). -- QUYET DINH: dựng flow tab bar + toolbar + canvas/chat splitter; GỌI self._build_runs_page() để nhét vào center_stack — khi tách, chỗ gọi này đổi thành khởi tạo Co4ERunControlWidget(...) rồi add vào center_stack",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.flow_bar",
"kind": "attribute",
"line_start": 734,
"line_end": 734,
"line_display": "734",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "QTabBar ẩn dùng làm index ánh xạ flow<->canvas, không phải trang Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.flow_add_btn",
"kind": "attribute",
"line_start": 760,
"line_end": 760,
"line_display": "760",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.flow_scroll",
"kind": "attribute",
"line_start": 777,
"line_end": 777,
"line_display": "777",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.center_stack",
"kind": "attribute",
"line_start": 801,
"line_end": 801,
"line_display": "801",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái chia sẻ giữa trang Runs (stack 0) và flow editor (stack 1) — dùng bởi _show_runs (ngoài lát này) để chuyển trang -- QUYET DINH: container sở hữu QStackedWidget chứa [trang Runs, flow editor]; trang Runs (index 0) sẽ LÀ instance Co4ERunControlWidget được add vào đây",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._build_runs_page",
"kind": "method",
"line_start": 869,
"line_end": 928,
"line_display": "869-928",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "khớp đúng mô tả đích: dựng bảng runs_table + nút back/stop/rename/delete/clear/mở-thư-mục-workspace",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.runs_back_btn",
"kind": "attribute",
"line_start": 878,
"line_end": 878,
"line_display": "878",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.runs_title",
"kind": "attribute",
"line_start": 883,
"line_end": 883,
"line_display": "883",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.ws_folder_btn",
"kind": "attribute",
"line_start": 888,
"line_end": 888,
"line_display": "888",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "nút mở thư mục workspace — click gọi self._open_workspace_folder (định nghĩa ngoài lát này, có khả năng touches_disk_or_network=true)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.run_stop_btn",
"kind": "attribute",
"line_start": 896,
"line_end": 896,
"line_display": "896",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.run_rename_btn",
"kind": "attribute",
"line_start": 901,
"line_end": 901,
"line_display": "901",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.run_del_btn",
"kind": "attribute",
"line_start": 905,
"line_end": 905,
"line_display": "905",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.run_clear_btn",
"kind": "attribute",
"line_start": 909,
"line_end": 909,
"line_display": "909",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "click gọi self.manager.clear_finished() — self.manager là trạng thái chia sẻ (run manager) không định nghĩa trong lát này",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.runs_table",
"kind": "attribute",
"line_start": 917,
"line_end": 917,
"line_display": "917",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "bảng chính của trang Runs; double-click gọi self._open_run_from_table, context menu gọi self._runs_context_menu (cả hai định nghĩa ngoài lát này)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._wrap_config",
"kind": "method",
"line_start": 930,
"line_end": 960,
"line_display": "930-960",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "wrap panel cấu hình step, không thuộc trang Runs -- QUYET DINH: khung bọc/thu-phóng quanh StepConfigPanel — thuộc bố cục của co4e_tab.py, không phải nội dung panel. Bảng cũ xếp cả cụm này vào node_property_panel.py (file cấm sửa của lane khác) — không đúng vai trò 'khung bọc' vs 'nội dung panel'",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.config_toggle_btn",
"kind": "attribute",
"line_start": 942,
"line_end": 942,
"line_display": "942",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.config_title",
"kind": "attribute",
"line_start": 947,
"line_end": 947,
"line_display": "947",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._cfg_vlayout",
"kind": "attribute",
"line_start": 953,
"line_end": 953,
"line_display": "953",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._cfg_top_spacer",
"kind": "attribute",
"line_start": 957,
"line_end": 957,
"line_display": "957",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._cfg_bot_spacer",
"kind": "attribute",
"line_start": 958,
"line_end": 958,
"line_display": "958",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.config_container",
"kind": "attribute",
"line_start": 959,
"line_end": 959,
"line_display": "959",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc khung bọc _wrap_config",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._NARROW",
"kind": "attribute",
"line_start": 967,
"line_end": 967,
"line_display": "967",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "hằng số class-level, không liên quan trang Runs -- QUYET DINH: hằng số bố cục hẹp của cả tab",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.showEvent",
"kind": "method",
"line_start": 969,
"line_end": 971,
"line_display": "969-971",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "Qt override, gắn narrow_guard -- QUYET DINH: [ANOMALY — 2 định nghĩa showEvent cùng tên trong 1 class, bảng cũ đã ghi nhận 'kept_separate_anomaly_symbols'] bản đầu (969-971) chỉ gắn narrow_guard, bị bản thứ 2 (1802) ghi đè lúc runtime; giữ TÁCH RIÊNG như bảng cũ",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._apply_narrow_layout",
"kind": "method",
"line_start": 973,
"line_end": 983,
"line_display": "973-983",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._toggle_config",
"kind": "method",
"line_start": 985,
"line_end": 1028,
"line_display": "985-1028",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "không thuộc trang Runs; đọc/ghi self._split (splitter 3 cột chia sẻ với _build_center/_wrap_config)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._refresh_min_width",
"kind": "method",
"line_start": 1030,
"line_end": 1035,
"line_display": "1030-1035",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._build_canvas_overlay",
"kind": "method",
"line_start": 1037,
"line_end": 1058,
"line_display": "1037-1058",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_canvas_widget.py",
"reason": "overlay zoom cho canvas — không thuộc trang Runs -- QUYET DINH: overlay zoom/fit gắn LÊN canvas qua self.canvas.add_overlay(); chấp nhận quyết định của bảng cũ — thuộc lane canvas, ngoài phạm vi run-control. Hiện tại canvas vẫn ở ui/co4e_canvas.py (chưa đổi tên), việc dời file này KHÔNG thuộc lane này",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.zoom_in_btn",
"kind": "attribute",
"line_start": 1050,
"line_end": 1050,
"line_display": "1050",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_canvas_widget.py",
"reason": "nút overlay canvas — ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.zoom_out_btn",
"kind": "attribute",
"line_start": 1051,
"line_end": 1051,
"line_display": "1051",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_canvas_widget.py",
"reason": "nút overlay canvas — ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.fit_btn",
"kind": "attribute",
"line_start": 1052,
"line_end": 1052,
"line_display": "1052",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_canvas_widget.py",
"reason": "nút overlay canvas — ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._build_chat",
"kind": "method",
"line_start": 1060,
"line_end": 1123,
"line_display": "1060-1123",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "method dài >60 dòng, dựng toàn bộ khung chat (header, stack theo flow, composer, routing toggle, usage total) — không thuộc trang Runs -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._chat_widget",
"kind": "attribute",
"line_start": 1062,
"line_end": 1062,
"line_display": "1062",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._mhdr",
"kind": "attribute",
"line_start": 1068,
"line_end": 1068,
"line_display": "1068",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.msgs_icon",
"kind": "attribute",
"line_start": 1070,
"line_end": 1070,
"line_display": "1070",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.msgs_title",
"kind": "attribute",
"line_start": 1071,
"line_end": 1071,
"line_display": "1071",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_toggle_btn",
"kind": "attribute",
"line_start": 1072,
"line_end": 1072,
"line_display": "1072",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_stack",
"kind": "attribute",
"line_start": 1087,
"line_end": 1087,
"line_display": "1087",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "một ChatView mỗi flow — trạng thái chia sẻ đọc bởi _apply_workflow, _ensure_flow_log, _active_log -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._flow_logs",
"kind": "attribute",
"line_start": 1088,
"line_end": 1088,
"line_display": "1088",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "Dict[str, ChatView] theo wf.id — trạng thái chia sẻ giữa các tab flow -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_input_row",
"kind": "attribute",
"line_start": 1090,
"line_end": 1090,
"line_display": "1090",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._usage_total_lbl",
"kind": "attribute",
"line_start": 1095,
"line_end": 1095,
"line_display": "1095",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_input",
"kind": "attribute",
"line_start": 1101,
"line_end": 1101,
"line_display": "1101",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_send_btn",
"kind": "attribute",
"line_start": 1104,
"line_end": 1104,
"line_display": "1104",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.co4e_routing_toggle",
"kind": "attribute",
"line_start": 1109,
"line_end": 1109,
"line_display": "1109",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._co4e_routed_provider",
"kind": "attribute",
"line_start": 1110,
"line_end": 1110,
"line_display": "1110",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "override provider định tuyến cho lượt kế tiếp — trạng thái đọc/ghi ở nhiều nơi ngoài lát này (dòng 1849, 1871, 1878) -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._vsplit_sizes",
"kind": "attribute",
"line_start": 1117,
"line_end": 1117,
"line_display": "1117",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._msgs_collapsed",
"kind": "attribute",
"line_start": 1118,
"line_end": 1118,
"line_display": "1118",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._toggle_messages",
"kind": "method",
"line_start": 1125,
"line_end": 1157,
"line_display": "1125-1157",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "expand/collapse khung chat, đọc/ghi self._vsplit — không thuộc trang Runs -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._ensure_flow_log",
"kind": "method",
"line_start": 1160,
"line_end": 1169,
"line_display": "1160-1169",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._active_log",
"kind": "method",
"line_start": 1171,
"line_end": 1173,
"line_display": "1171-1173",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.chat_log",
"kind": "attribute",
"line_start": 1175,
"line_end": 1179,
"line_display": "1175-1179",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "property, không phải attribute gán trực tiếp — liệt kê vì là symbol công khai -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._plan_bubble",
"kind": "attribute",
"line_start": 1181,
"line_end": 1187,
"line_display": "1181-1187",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "property getter/setter, ủy quyền sang self._active_log()._co4e_plan_bubble -- QUYET DINH: khung CHAT — thuộc lane co4e_chat_view.py (chưa tồn tại); giữ nguyên ui/co4e_tab.py cho tới khi lane đó tách, ngoài phạm vi lane run-control. Bảng cũ đã xếp sẵn vào presentation/co4e/co4e_chat_view.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._apply_workflow",
"kind": "method",
"line_start": 1190,
"line_end": 1204,
"line_display": "1190-1204",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gán self._wf — trạng thái chia sẻ trung tâm của cả tab (đọc/ghi khắp nơi); gọi self.canvas.load/relayout/fit_view và self._update_run_btn/_refresh_usage_total (ngoài lát này) -- QUYET DINH: gán self._wf trung tâm — container",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._new_workflow",
"kind": "method",
"line_start": 1205,
"line_end": 1213,
"line_display": "1205-1213",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gọi self._open_flow (ngoài lát này)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._selected_wf",
"kind": "method",
"line_start": 1215,
"line_end": 1221,
"line_display": "1215-1221",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "co4e.get_workflow đọc storage — thuần logic sidebar, không thuộc trang Runs",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._load_selected_workflow",
"kind": "method",
"line_start": 1223,
"line_end": 1226,
"line_display": "1223-1226",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._edit_selected_workflow",
"kind": "method",
"line_start": 1228,
"line_end": 1233,
"line_display": "1228-1233",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._duplicate_selected_workflow",
"kind": "method",
"line_start": 1235,
"line_end": 1242,
"line_display": "1235-1242",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "co4e.duplicate_workflow ghi storage -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._wf_context_menu",
"kind": "method",
"line_start": 1244,
"line_end": 1267,
"line_display": "1244-1267",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "menu chuột phải cho danh sách flow đã lưu, không phải trang Runs -- QUYET DINH: menu chuột phải cho danh sách flow đã lưu (sidebar)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._rename_workflow",
"kind": "method",
"line_start": 1269,
"line_end": 1285,
"line_display": "1269-1285",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "co4e.save_workflow ghi storage; đọc/ghi self._wf.name và self.name_edit -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._delete_selected_workflow",
"kind": "method",
"line_start": 1287,
"line_end": 1293,
"line_display": "1287-1293",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "co4e.delete_workflow ghi storage -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._sync_wf_from_canvas",
"kind": "method",
"line_start": 1295,
"line_end": 1298,
"line_display": "1295-1298",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.canvas.nodes()/edges() và self.name_edit, ghi vào self._wf — trạng thái chia sẻ -- QUYET DINH: khớp bảng cũ",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._save",
"kind": "method",
"line_start": 1300,
"line_end": 1305,
"line_display": "1300-1305",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "co4e.save_workflow ghi storage -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._autosave",
"kind": "method",
"line_start": 1307,
"line_end": 1310,
"line_display": "1307-1310",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "co4e.save_workflow ghi storage -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._on_name_changed",
"kind": "method",
"line_start": 1312,
"line_end": 1314,
"line_display": "1312-1314",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gọi self._sync_active_flow_tab_text (ngoài lát này)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._add_blank_step",
"kind": "method",
"line_start": 1316,
"line_end": 1318,
"line_display": "1316-1318",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._on_node_selected",
"kind": "method",
"line_start": 1321,
"line_end": 1327,
"line_display": "1321-1327",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.canvas.nodes(), self.config, self._config_collapsed -- QUYET DINH: đọc canvas selection rồi TOGGLE khung bọc _wrap_config (self._config_collapsed) — thuộc container, không phải nội dung StepConfigPanel. Bảng cũ xếp vào node_property_panel.py — không đúng vai trò khung bọc vs nội dung panel",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._on_config_changed",
"kind": "method",
"line_start": 1329,
"line_end": 1332,
"line_display": "1329-1332",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cùng lý do với _on_node_selected",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._new_agent",
"kind": "method",
"line_start": 1335,
"line_end": 1336,
"line_display": "1335-1336",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "khớp bảng cũ, ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._edit_agent",
"kind": "method",
"line_start": 1338,
"line_end": 1346,
"line_display": "1338-1346",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "khớp bảng cũ, ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._edit_agent_dialog",
"kind": "method",
"line_start": 1348,
"line_end": 1354,
"line_display": "1348-1354",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "co4e.save_custom_agent ghi storage; mở dialog Qt -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._delete_agent",
"kind": "method",
"line_start": 1356,
"line_end": 1363,
"line_display": "1356-1363",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "presentation/co4e/agent_list_panel.py",
"reason": "co4e.delete_custom_agent ghi storage -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._manage_skills",
"kind": "method",
"line_start": 1365,
"line_end": 1369,
"line_display": "1365-1369",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/skills_list_panel.py",
"reason": "mở SkillsDialog (Qt) -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._skill_map",
"kind": "method",
"line_start": 1372,
"line_end": 1378,
"line_display": "1372-1378",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "application/workflows/co4e_workflow_service.py",
"reason": "logic thuần, không phải trang Runs — thuộc nhóm run/mode bị loại trừ khỏi run_control_widget theo mô tả đích -- QUYET DINH: đã có quyết định của lane workflow-service (bảng cũ); ngoài phạm vi run-control",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._current_mode",
"kind": "method",
"line_start": 1380,
"line_end": 1381,
"line_display": "1380-1381",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuộc mode/run toolbar — loại trừ khỏi run_control_widget theo mô tả đích -- QUYET DINH: đọc mode_combo của toolbar mode/run — mô tả đích loại trừ nhóm mode/run khỏi co4e_run_control_widget.py; bảng cũ xếp vào đó — mâu thuẫn với phạm vi hiện tại",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1384-1385) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._on_mode_changed",
"kind": "method",
"line_start": 1383,
"line_end": 1389,
"line_display": "1383-1389",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "reset self._manual_active/_manual_order/_manual_idx — thuộc mode/run toolbar, loại trừ khỏi run_control_widget theo mô tả đích -- QUYET DINH: cùng nhóm mode/run toolbar — xem lý do ở _current_mode",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1387-1393) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._on_run_clicked",
"kind": "method",
"line_start": 1391,
"line_end": 1400,
"line_display": "1391-1400",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "cắt ngang lát — cần agent gộp đối chiếu (thân method tiếp tục sau dòng 1400). Đây là logic thực thi run — loại trừ khỏi run_control_widget theo mô tả đích; gọi self.manager.stop (trạng thái chia sẻ run manager) -- QUYET DINH: logic bấm nút Run (thực thi) — cùng nhóm bị loại trừ, xem lý do ở _current_mode",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1395-1400) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._start_canvas_run",
"kind": "method",
"line_start": 1403,
"line_end": 1420,
"line_display": "1403-1420",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "logic khởi chạy run trên canvas (không phải bảng Flow Status); đọc/ghi self._wf, self._flows tiles, self._flow_runs, self._run_logs — trạng thái chia sẻ với _on_manager_event và _manual_step",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1407-1424) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._plan_bubble",
"kind": "attribute",
"line_start": 1413,
"line_end": 1413,
"line_display": "1413",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gán lại None khi bắt đầu run mới; cũng gán ở _manual_run_or_advance (1457) và đọc/ghi trong _append_plan qua log._co4e_plan_bubble — có thể đã khởi tạo lần đầu ở __init__ ngoài phạm vi đọc",
"in_old_table": "co (nhung o dong khac: 1186-1187)",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._run_single",
"kind": "method",
"line_start": 1422,
"line_end": 1427,
"line_display": "1422-1427",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1426-1431) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._run_from",
"kind": "method",
"line_start": 1429,
"line_end": 1433,
"line_display": "1429-1433",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1433-1437) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._downstream",
"kind": "method",
"line_start": 1435,
"line_end": 1446,
"line_display": "1435-1446",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.canvas.edges() — chỉ cần canvas object tồn tại, không cần app hiển thị; logic đồ thị thuần",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1439-1450) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_run_or_advance",
"kind": "method",
"line_start": 1449,
"line_end": 1462,
"line_display": "1449-1462",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "khởi tạo self._manual_order/_manual_idx/_manual_active — trạng thái mode thủ công, không liên quan bảng Flow Status",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1453-1466) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_order",
"kind": "attribute",
"line_start": 1458,
"line_end": 1458,
"line_display": "1458",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái mode thủ công, dùng bởi _manual_step; có thể đã khởi tạo ở __init__ ngoài phạm vi đọc",
"in_old_table": "co (nhung o dong khac: 253)",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 253) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_idx",
"kind": "attribute",
"line_start": 1459,
"line_end": 1459,
"line_display": "1459",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái mode thủ công, dùng bởi _manual_step/_on_manager_event",
"in_old_table": "co (nhung o dong khac: 254)",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 254) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_active",
"kind": "attribute",
"line_start": 1460,
"line_end": 1460,
"line_display": "1460",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái mode thủ công, đọc bởi _on_manager_event",
"in_old_table": "co (nhung o dong khac: 252)",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 252) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._manual_step",
"kind": "method",
"line_start": 1464,
"line_end": 1480,
"line_display": "1464-1480",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "ghi self._flow_runs[wf.id] và self._run_logs[run_id] — dict chia sẻ với _start_canvas_run/_on_manager_event",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1468-1484) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._topo_order",
"kind": "method",
"line_start": 1482,
"line_end": 1487,
"line_display": "1482-1487",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self.canvas.nodes()/edges() — thuần logic sắp xếp topo",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1486-1491) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._on_manager_event",
"kind": "method",
"line_start": 1490,
"line_end": 1546,
"line_display": "1490-1546",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "method gộp nhiều việc không liên quan: routing event theo loại (node_status/node_output/node_diff/node_plan/node_tool/run_done|error), cập nhật canvas, ghi self._outputs_for, dọn self._flow_runs/self._run_logs, gọi popup thông báo — nên tách nhỏ thêm dù chưa vượt 80 dòng. KHÔNG thuộc bảng Flow Status (không đụng runs_table trực tiếp), là logic thực thi run nên ở lại co4e_tab.py theo _doc",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1494-1550) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._notify_run_finished",
"kind": "method",
"line_start": 1548,
"line_end": 1569,
"line_display": "1548-1569",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "tạo QMessageBox không chặn, ghi self._run_popups — popup thông báo chung, không phải phần bảng Flow Status",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1552-1573) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._run_popups",
"kind": "attribute",
"line_start": 1557,
"line_end": 1557,
"line_display": "1557",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "danh sách giữ tham chiếu QMessageBox không-chặn để tránh bị GC — khởi tạo có điều kiện (hasattr) ngay trong _notify_run_finished thay vì __init__",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1560-1561) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._refresh_runs",
"kind": "method",
"line_start": 1571,
"line_end": 1612,
"line_display": "1571-1612",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "dựng lại bảng self.runs_table từ manager — đúng lõi 'Flow Status'; cũng đụng self._sections và self.flow_bar (tab text 'RUNS N') và gọi self._refresh_side_runs() — trạng thái chia sẻ với sidebar/tab strip ngoài phạm vi widget này, cần API cầu nối khi tách",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._stop_selected_run",
"kind": "method",
"line_start": 1614,
"line_end": 1620,
"line_display": "1614-1620",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "nút Stop của bảng Flow Status",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._delete_selected_run",
"kind": "method",
"line_start": 1622,
"line_end": 1635,
"line_display": "1622-1635",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "nút Delete; ghi self._flow_runs.pop/self._run_logs.pop — dict chia sẻ với logic thực thi run ở co4e_tab.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._runs_context_menu",
"kind": "method",
"line_start": 1637,
"line_end": 1651,
"line_display": "1637-1651",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "context menu của runs_table (open run/output/rename/delete); action 'open_run' gọi self._open_run_from_table vốn cần self._open_flow + self.canvas (ở co4e_tab.py) — cần callback cầu nối khi tách",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab.set_project",
"kind": "method",
"line_start": 1654,
"line_end": 1670,
"line_display": "1654-1670",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "đọc/ghi self._project_id, self._project_dir; gọi load_project (đọc đĩa) và manager.set_output_root/set_current_project; gọi self._refresh_ws_folder_btn() thuộc widget Flow Status — cần API cầu nối khi tách ra co4e_run_control_widget.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._project_id",
"kind": "attribute",
"line_start": 1659,
"line_end": 1659,
"line_display": "1659",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "trạng thái workspace hiện tại, dùng bởi manager.set_current_project và các hàm mở thư mục — chia sẻ giữa co4e_tab.py và co4e_run_control_widget.py",
"in_old_table": "co (nhung o dong khac: 249)",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._project_dir",
"kind": "attribute",
"line_start": 1660,
"line_end": 1660,
"line_display": "1660",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "dùng bởi _flow_output_root — ảnh hưởng trực tiếp tới nút 'mở thư mục workspace' của Flow Status",
"in_old_table": "co (nhung o dong khac: 250)",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._flow_output_root",
"kind": "method",
"line_start": 1672,
"line_end": 1682,
"line_display": "1672-1682",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "helper Path dùng chung bởi cả chat (_out_dir) và nút 'mở thư mục workspace' của Flow Status (_open_workspace_folder/_refresh_ws_folder_btn) — widget Flow Status cần được truyền hàm này qua callback/property thay vì tự tính",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._refresh_ws_folder_btn",
"kind": "method",
"line_start": 1684,
"line_end": 1689,
"line_display": "1684-1689",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "cập nhật self.ws_folder_btn (nút mở thư mục workspace) — phụ thuộc self._flow_output_root() ở co4e_tab.py",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._open_workspace_folder",
"kind": "method",
"line_start": 1691,
"line_end": 1698,
"line_display": "1691-1698",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "hành động của nút 'mở thư mục workspace'; mkdir + open_location (spawn process)",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._open_run_output_folder",
"kind": "method",
"line_start": 1700,
"line_end": 1711,
"line_display": "1700-1711",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "mở thư mục output của 1 run cụ thể — dùng trong context menu bảng Flow Status; mkdir + open_location",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._rename_selected_run",
"kind": "method",
"line_start": 1713,
"line_end": 1744,
"line_display": "1713-1744",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "nút Rename của bảng Flow Status; nhưng đồng bộ qua self._flows, self.flow_bar.setTabText, self.name_edit — trạng thái tab/canvas chia sẻ với co4e_tab.py, cần callback cầu nối; co4e.save_workflow ghi đĩa",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._run_selected_in_background",
"kind": "method",
"line_start": 1746,
"line_end": 1756,
"line_display": "1746-1756",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "chạy 1 flow được chọn (self._selected_wf(), không rõ nguồn — có thể là danh sách sidebar chứ không phải runs_table); gọi self._refresh_side_runs() — không khớp mô tả 'CHỈ bảng Flow Status' nên giữ ở co4e_tab.py",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1750-1760) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._wf_by_id",
"kind": "method",
"line_start": 1758,
"line_end": 1766,
"line_display": "1758-1766",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "co4e.get_workflow đọc file workflow đã lưu trên đĩa; helper dùng chung nhiều nơi (rerun, open-from-table)",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1762-1770) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._rerun_run_item",
"kind": "method",
"line_start": 1768,
"line_end": 1779,
"line_display": "1768-1779",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "docstring nói 'double-click a run in the history' nhưng item.data(Qt.UserRole) trực tiếp gợi ý đây là list sidebar 'side runs', KHÔNG phải bảng Flow Status (khác cách _open_run_from_table truy cập runs_table qua item.row()) — cần người quyết đây thuộc trang nào -- QUYET DINH: gọi self.manager.start(...) tức THỰC THI run (network/AI) — cùng nhóm run-execution bị loại trừ khỏi co4e_run_control_widget.py; bảng cũ xếp vào đó. Nghi vấn về nguồn item (sidebar hay bảng) không đổi kết luận vì lý do loại trừ là do HÀNH VI thực thi chứ không phải nơi click",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1772-1783) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab._open_run_from_table",
"kind": "method",
"line_start": 1781,
"line_end": 1800,
"line_display": "1781-1800",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "double-click bảng Flow Status nhưng gọi self._open_flow (chuyển tab) và self.canvas.update_node_status trực tiếp — vượt ra ngoài phạm vi 'chỉ bảng runs_table' nên giữ ở co4e_tab.py, cần callback nếu tách runs_table riêng",
"in_old_table": "co",
"old_table_mismatch": "BANG CU SAI/QUA RONG: xep vao presentation/co4e/co4e_run_control_widget.py (dong 1785-1804) nhung pham vi run-control hien tai (mo ta dich cua 3 agent quet) loai tru nhom nay -> quyet dinh o day = ui/co4e_tab.py."
},
{
"symbol": "Co4ETab.showEvent",
"kind": "method",
"line_start": 1802,
"line_end": 1805,
"line_display": "1802-1805",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "override Qt lifecycle của chính Co4ETab, gọi self._refresh_runs() — phải ở lại widget chính",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._out_dir",
"kind": "method",
"line_start": 1807,
"line_end": 1813,
"line_display": "1807-1813",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "mkdir; dùng cho chat/flow deliverables, không liên quan bảng Flow Status",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._chat_send",
"kind": "method",
"line_start": 1816,
"line_end": 1842,
"line_display": "1816-1842",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._apply_co4e_routing",
"kind": "method",
"line_start": 1844,
"line_end": 1879,
"line_display": "1844-1879",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "ghi self._co4e_routed_provider; nhánh 'manual' dựng dialog confirm_switch(self,...) nên cần widget sống",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._co4e_routed_provider",
"kind": "attribute",
"line_start": 1849,
"line_end": 1849,
"line_display": "1849",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "dùng bởi _run_chat_turn để chọn provider — reset mỗi lần _apply_co4e_routing chạy",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._extract_agent_directive",
"kind": "method",
"line_start": 1881,
"line_end": 1887,
"line_display": "1881-1887",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuần regex, test được không cần Qt",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._resolve_agent",
"kind": "method",
"line_start": 1889,
"line_end": 1897,
"line_display": "1889-1897",
"needs_qt_widget": false,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "co4e.list_custom_agents() đọc dữ liệu agent tuỳ biến đã lưu",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._run_chat_turn",
"kind": "method",
"line_start": 1899,
"line_end": 1970,
"line_display": "1899-1970",
"needs_qt_widget": true,
"touches_disk_or_network": true,
"target_file": "ui/co4e_tab.py",
"reason": "method dài, gộp: dựng prompt, chạy AgentWorker nền gọi provider AI (network), stream sự kiện vào bubble Qt, cập nhật usage — nên tách nhỏ thêm dù chỉ 72 dòng vì nhiều trách nhiệm khác nhau (build prompt / worker job / event routing / usage). Không liên quan bảng Flow Status",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._chat_worker",
"kind": "attribute",
"line_start": 1953,
"line_end": 1953,
"line_display": "1953",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "vị trí xuất hiện đầu tiên theo văn bản là trong hàm lồng 'done'; gán thật sự lúc chạy là dòng 1969 (w = AgentWorker...); có thể đã khởi tạo None ở __init__ ngoài phạm vi đọc",
"in_old_table": "co (nhung o dong khac: 236)",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._append_chat",
"kind": "method",
"line_start": 1972,
"line_end": 1987,
"line_display": "1972-1987",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._fmt_usage",
"kind": "method",
"line_start": 1990,
"line_end": 1997,
"line_display": "1990-1997",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "thuần formatting, không cần Qt",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._apply_usage",
"kind": "method",
"line_start": 1999,
"line_end": 2016,
"line_display": "1999-2016",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "ghi self._flow_usage[wf_id] — tổng usage theo flow, chia sẻ với _refresh_usage_total",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._refresh_usage_total",
"kind": "method",
"line_start": 2018,
"line_end": 2033,
"line_display": "2018-2033",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "đọc self._flow_usage và self._wf — trạng thái chia sẻ với _apply_usage",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._append_diff",
"kind": "method",
"line_start": 2035,
"line_end": 2039,
"line_display": "2035-2039",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._append_plan",
"kind": "method",
"line_start": 2041,
"line_end": 2052,
"line_display": "2041-2052",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "ghi log._co4e_plan_bubble — thuộc tính gắn động lên ChatView, chia sẻ với _run_chat_turn",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "Co4ETab._retranslate",
"kind": "method",
"line_start": 2055,
"line_end": 2075,
"line_display": "2055-2075",
"needs_qt_widget": true,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "gộp retranslate cho CẢ widget chung (wf_new_btn, self._sections) LẪN các nút riêng của Flow Status (runs_back_btn, run_stop_btn, run_rename_btn, run_del_btn, run_clear_btn, runs_table headers, ws_folder_btn) — khi tách co4e_run_control_widget.py cần chia method này làm hai, phần Flow Status nên có retranslate riêng gọi từ đây",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_html_escape",
"kind": "function",
"line_start": 2078,
"line_end": 2079,
"line_display": "2078-2079",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "ui/co4e_tab.py",
"reason": "hàm module-level thuần string escape; không thấy nơi gọi trong phạm vi 1401-2084 nên chưa rõ nó phục vụ phần nào — có thể dùng ở phần chat render ngoài phạm vi đọc -- QUYET DINH: escape string thuần cho phần render CHAT — lane co4e_chat_view.py (chưa tồn tại); bảng cũ đã xếp sẵn vào đó, ngoài phạm vi run-control nên giữ nguyên vị trí vật lý hiện tại",
"in_old_table": "co",
"old_table_mismatch": "-"
},
{
"symbol": "_qcolor",
"kind": "function",
"line_start": 2082,
"line_end": 2084,
"line_display": "2082-2084",
"needs_qt_widget": false,
"touches_disk_or_network": false,
"target_file": "presentation/co4e/co4e_run_control_widget.py",
"reason": "QColor là kiểu giá trị (như QPointF/QRectF), không cần QApplication sống; chỉ thấy dùng trong _refresh_runs (tô màu cột status của bảng Flow Status) trong phạm vi đọc",
"in_old_table": "co",
"old_table_mismatch": "-"
}
]
}