Files
cowork-local/docs/architecture/co4e-split-map-run-control.md
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

59 KiB

Bản đồ tách file — Run Control (trang Runs / Flow Status)

Gộp 215 symbol thô từ 3 agent quét song song trên ui/co4e_tab.py, còn lại 214 dòng sau khi gộp 1 trùng lặp thật (Co4ETab._reload_sidebar dòng 685, xem bên dưới).

  • File đích của lane run-control: presentation/co4e/co4e_run_control_widget.py — 18 symbol.
  • Phần còn lại của container: ui/co4e_tab.py — 173 symbol.
  • Thuộc lane/file khác (ngoài phạm vi run-control, chỉ ghi lại để tham khảo): 23 symbol (application/workflows/co4e_workflow_service.py, presentation/co4e/agent_list_panel.py, presentation/co4e/skills_list_panel.py, presentation/co4e/co4e_canvas_widget.py).
  • Note bắt đầu bằng khac tai lieu: tìm thấy trong dữ liệu thô: 0.

Phát hiện quan trọng nhất từ việc đối chiếu với bảng cũ

  1. Đường dẫn co4e_tab.py trong bảng cũ sai. Bảng cũ (docs/architecture/co4e-split-map.json) dùng target_file="presentation/co4e/co4e_tab.py" cho phần thân lớp Co4ETab còn lại, nhưng file đó ở repo hiện tại chỉ là factory build_co4e_tab() dài 53 dòng (bọc nguyên Co4ETab cũ 1:1, xem docstring của nó) — KHÔNG phải nơi lớp Co4ETab thật sự sống. Lớp đó vẫn đang ở ui/co4e_tab.py. Bảng này đã tự quy đổi mọi so sánh trước khi kết luận lệch.
  2. Phạm vi co4e_run_control_widget.py đã bị thu hẹp so với bảng cũ. Bảng cũ coi 'run control' là toàn bộ chuỗi: bảng Runs + logic thực thi run (start/stop/manual-mode/mode toolbar/event routing/popup) + sidebar quick-list các run gần đây. Lần quét 3-agent hiện tại (theo mô tả đích lặp lại trong nhiều ghi chú riêng lẻ) chỉ còn coi co4e_run_control_widget.py là trang Runs/Flow Status: bảng runs_table + các nút hành động trên từng dòng (stop/rename/delete/clear/mở thư mục) + nút quay lại + tiêu đề. Logic thực thi run, toolbar mode/run, và sidebar quick-list quay lại ở lại ui/co4e_tab.py. Đây là khác biệt lớn nhất — ảnh hưởng tới 34 dòng bên dưới (đánh dấu ở cột cuối).
  3. Bảng cũ không nhất quán giữa alias của Agent panel và Skills panel. ag_new_btn/agent_list/ag_edit_btn/ag_del_btn (alias trỏ vào AgentListPanel đã tách) được bảng cũ xếp vào presentation/co4e/agent_list_panel.py, nhưng sk_manage_btn/skill_list (alias trỏ vào SkillsListPanel, cùng bản chất) lại bị xếp vào co4e_tab.py. Bảng này chọn xử lý đồng nhất — coi cả hai cặp alias đều thuộc file panel tương ứng.
  4. Bảng cũ bỏ sót 2 symbol: Co4ETab.status_message (Signal cấp lớp) và Co4ETab._agent_panel (instance AgentListPanel do container giữ) không có dòng nào trong bảng cũ dù nằm trong phạm vi đã quét.

Bảng đầy đủ (sắp theo số dòng)

symbol dòng file đích lý do có trong bảng cũ chưa chỗ nào thấy bảng cũ sai
_PLAN_GLYPH 46-47 ui/co4e_tab.py module-level dict constant, không phải self. -- 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 co 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.
_fmt_plan 50-59 ui/co4e_tab.py 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 co 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.
_skill_names 62-66 ui/co4e_tab.py 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 co -
_agent_names 69-72 ui/co4e_tab.py 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 co -
_EqualTabBar 75-95 ui/co4e_tab.py 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 co -
_EqualTabBar._GAP 81 ui/co4e_tab.py hằng số nội bộ của _EqualTabBar co -
_EqualTabBar.tabSizeHint 83-91 ui/co4e_tab.py - co -
_EqualTabBar.resizeEvent 93-95 ui/co4e_tab.py - co -
_PaletteList 98-120 ui/co4e_tab.py 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 co -
_PaletteList.__init__ 103-107 ui/co4e_tab.py - co -
_PaletteList._payload_role 105 ui/co4e_tab.py - co -
_PaletteList.startDrag 109-120 ui/co4e_tab.py - co -
_directive_token 123-135 ui/co4e_tab.py 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 co -
_ChatInput 138-227 ui/co4e_tab.py ô 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 co -
_ChatInput.submit 142 ui/co4e_tab.py Signal khai báo ở cấp lớp -- QUYET DINH: Signal của _ChatInput — đi cùng class chua -
_ChatInput.__init__ 144-152 ui/co4e_tab.py - co -
_ChatInput._popup 146 ui/co4e_tab.py - co -
_ChatInput._maybe_popup 154-179 ui/co4e_tab.py 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 co -
_ChatInput._add_row 181-185 ui/co4e_tab.py - co -
_ChatInput._accept 187-200 ui/co4e_tab.py - co -
_ChatInput.focusOutEvent 202-205 ui/co4e_tab.py - co -
_ChatInput.keyPressEvent 207-227 ui/co4e_tab.py - co -
Co4ETab 230-700 ui/co4e_tab.py 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 co -
Co4ETab.status_message 231 ui/co4e_tab.py 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 ở đó) chua 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.
Co4ETab.__init__ 233-305 ui/co4e_tab.py 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 co -
Co4ETab.ctx 235 ui/co4e_tab.py - co -
Co4ETab._wf 236 ui/co4e_tab.py 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ữ co -
Co4ETab._chat_worker 237 ui/co4e_tab.py AgentWorker của chat — lane co4e_chat_view.py chưa tồn tại, giữ nguyên co -
Co4ETab.manager 239 ui/co4e_tab.py 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 co 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.
Co4ETab._flow_runs 244 ui/co4e_tab.py 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 co 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.
Co4ETab._run_logs 245 ui/co4e_tab.py map run_id->ChatView (thuộc lane chat), ghi bởi _manual_step/_start_canvas_run ở co4e_tab.py — container giữ co 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.
Co4ETab._flow_outputs 246 application/workflows/co4e_workflow_service.py đã 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 co -
Co4ETab._flow_usage 249 ui/co4e_tab.py 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 co 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.
Co4ETab._project_id 250 ui/co4e_tab.py 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 co -
Co4ETab._project_dir 251 ui/co4e_tab.py cùng lý do với _project_id co -
Co4ETab._manual_active 253 ui/co4e_tab.py 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 co 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.
Co4ETab._manual_order 254 ui/co4e_tab.py cùng nhóm với _manual_active — xem lý do ở đó co 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.
Co4ETab._manual_idx 255 ui/co4e_tab.py cùng nhóm với _manual_active — xem lý do ở đó co 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.
Co4ETab._flows 258 ui/co4e_tab.py 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 co -
Co4ETab._active_flow_idx 259 ui/co4e_tab.py cùng nhóm trạng thái chia sẻ với _flows -- QUYET DINH: cùng nhóm với _flows co -
Co4ETab._split 262 ui/co4e_tab.py splitter 3 cột của cả tab co -
Co4ETab.config 269 ui/co4e_tab.py 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 co -
Co4ETab._config_collapsed 275 ui/co4e_tab.py 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 co -
Co4ETab._config_expanded_w 276 ui/co4e_tab.py cùng lý do với _config_collapsed co -
Co4ETab._narrow_guard 281 ui/co4e_tab.py guard bố cục hẹp của cả tab co -
Co4ETab._open_flow 308-339 ui/co4e_tab.py đọ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 co -
Co4ETab._close_other_flows 341-356 ui/co4e_tab.py đọc/ghi self._flows, self._active_flow_idx, self.flow_bar co -
Co4ETab._show_runs 358-368 ui/co4e_tab.py 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ẽ co -
Co4ETab._on_flow_tab_changed 370-386 ui/co4e_tab.py đọc/ghi self._active_flow_idx, self.center_stack (self.center_stack định nghĩa ngoài dòng 700) co -
Co4ETab._sync_runs_toggle 388-395 ui/co4e_tab.py 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) co -
Co4ETab._add_tab_close_button 397-407 ui/co4e_tab.py - co -
Co4ETab._close_flow_tab_button 409-413 ui/co4e_tab.py - co -
Co4ETab._close_flow_tab 415-443 ui/co4e_tab.py đọ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 co -
Co4ETab._sync_active_flow_tab_text 445-448 ui/co4e_tab.py - co -
Co4ETab._reflect_active_run 450-458 ui/co4e_tab.py đọ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 co -
Co4ETab._cur_run_id 461-474 ui/co4e_tab.py 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 co 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.
Co4ETab._outputs_for 476-479 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._update_run_btn 481-483 ui/co4e_tab.py 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 co 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.
Co4ETab._build_sidebar 486-599 ui/co4e_tab.py 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) co -
Co4ETab._sections 494 ui/co4e_tab.py dict trạng thái chia sẻ cho các section sidebar (fold/unfold) — đọc/ghi bởi _section, _fold_section, _sync_section_arrow co -
Co4ETab.sidebar 495 ui/co4e_tab.py - co -
Co4ETab.side_split 499 ui/co4e_tab.py - co -
_build_sidebar._Col 504-512 ui/co4e_tab.py 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 co -
_Col.__init__ 507-508 ui/co4e_tab.py - co -
_Col.addWidget 510-512 ui/co4e_tab.py - co -
Co4ETab.wf_new_btn 517 ui/co4e_tab.py - co -
Co4ETab.wf_list 528 ui/co4e_tab.py - co -
Co4ETab.wf_edit_btn 535 ui/co4e_tab.py - co -
Co4ETab.wf_dup_btn 536 ui/co4e_tab.py - co -
Co4ETab.wf_del_btn 537 ui/co4e_tab.py - co -
Co4ETab.wf_runbg_btn 544 ui/co4e_tab.py - co -
Co4ETab._agent_panel 556 ui/co4e_tab.py 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) chua 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.
Co4ETab.ag_new_btn 557 presentation/co4e/agent_list_panel.py alias trỏ tới self._agent_panel.new_btn — widget thật nằm ở agent_list_panel.py co -
Co4ETab.agent_list 559 presentation/co4e/agent_list_panel.py alias trỏ tới self._agent_panel.list_widget co -
Co4ETab.ag_edit_btn 560 presentation/co4e/agent_list_panel.py alias trỏ tới self._agent_panel.edit_btn co -
Co4ETab.ag_del_btn 562 presentation/co4e/agent_list_panel.py alias trỏ tới self._agent_panel.del_btn co -
Co4ETab._skills_panel 571 ui/co4e_tab.py 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ũ co -
Co4ETab.sk_manage_btn 572 presentation/co4e/skills_list_panel.py 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_* co 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.
Co4ETab.skill_list 574 presentation/co4e/skills_list_panel.py alias trỏ tới self._skills_panel.list_widget — xem ghi chú ở sk_manage_btn co 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.
Co4ETab.runs_more_btn 582 ui/co4e_tab.py 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 co 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.
Co4ETab.runs_side_list 590 ui/co4e_tab.py 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 co 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.
Co4ETab._SIDE_RUNS 601 ui/co4e_tab.py 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 co 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.
Co4ETab._refresh_side_runs 603-615 ui/co4e_tab.py đọ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 co 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.
Co4ETab._on_side_run_clicked 617-625 ui/co4e_tab.py 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 co 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.
Co4ETab._section 627-659 ui/co4e_tab.py helper dựng UI section chung cho sidebar, ghi vào self._sections[key] co -
Co4ETab._fold_section 661-673 ui/co4e_tab.py đọc self._sections co -
Co4ETab._sync_section_arrow 675-678 ui/co4e_tab.py đọc self._sections co -
Co4ETab._icon_btn 679-683 ui/co4e_tab.py - co -
Co4ETab._reload_sidebar 685-718 ui/co4e_tab.py [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 co -
Co4ETab._palette_item 720-724 ui/co4e_tab.py 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 co -
Co4ETab._build_center 727-867 ui/co4e_tab.py 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 co -
Co4ETab.flow_bar 734 ui/co4e_tab.py QTabBar ẩn dùng làm index ánh xạ flow<->canvas, không phải trang Runs co -
Co4ETab.flow_add_btn 760 ui/co4e_tab.py - co -
Co4ETab.flow_scroll 777 ui/co4e_tab.py - co -
Co4ETab.center_stack 801 ui/co4e_tab.py 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 co -
Co4ETab._build_runs_page 869-928 presentation/co4e/co4e_run_control_widget.py khớp đúng mô tả đích: dựng bảng runs_table + nút back/stop/rename/delete/clear/mở-thư-mục-workspace co -
Co4ETab.runs_back_btn 878 presentation/co4e/co4e_run_control_widget.py - co -
Co4ETab.runs_title 883 presentation/co4e/co4e_run_control_widget.py - co -
Co4ETab.ws_folder_btn 888 presentation/co4e/co4e_run_control_widget.py 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) co -
Co4ETab.run_stop_btn 896 presentation/co4e/co4e_run_control_widget.py - co -
Co4ETab.run_rename_btn 901 presentation/co4e/co4e_run_control_widget.py - co -
Co4ETab.run_del_btn 905 presentation/co4e/co4e_run_control_widget.py - co -
Co4ETab.run_clear_btn 909 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab.runs_table 917 presentation/co4e/co4e_run_control_widget.py 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) co -
Co4ETab._wrap_config 930-960 ui/co4e_tab.py 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' co -
Co4ETab.config_toggle_btn 942 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab.config_title 947 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab._cfg_vlayout 953 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab._cfg_top_spacer 957 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab._cfg_bot_spacer 958 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab.config_container 959 ui/co4e_tab.py thuộc khung bọc _wrap_config co -
Co4ETab._NARROW 967 ui/co4e_tab.py 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 co -
Co4ETab.showEvent 969-971 ui/co4e_tab.py 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ũ co -
Co4ETab._apply_narrow_layout 973-983 ui/co4e_tab.py - co -
Co4ETab._toggle_config 985-1028 ui/co4e_tab.py không thuộc trang Runs; đọc/ghi self._split (splitter 3 cột chia sẻ với _build_center/_wrap_config) co -
Co4ETab._refresh_min_width 1030-1035 ui/co4e_tab.py - co -
Co4ETab._build_canvas_overlay 1037-1058 presentation/co4e/co4e_canvas_widget.py 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 co -
Co4ETab.zoom_in_btn 1050 presentation/co4e/co4e_canvas_widget.py nút overlay canvas — ngoài phạm vi run-control co -
Co4ETab.zoom_out_btn 1051 presentation/co4e/co4e_canvas_widget.py nút overlay canvas — ngoài phạm vi run-control co -
Co4ETab.fit_btn 1052 presentation/co4e/co4e_canvas_widget.py nút overlay canvas — ngoài phạm vi run-control co -
Co4ETab._build_chat 1060-1123 ui/co4e_tab.py 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 co -
Co4ETab._chat_widget 1062 ui/co4e_tab.py 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 co -
Co4ETab._mhdr 1068 ui/co4e_tab.py 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 co -
Co4ETab.msgs_icon 1070 ui/co4e_tab.py 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 co -
Co4ETab.msgs_title 1071 ui/co4e_tab.py 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 co -
Co4ETab.chat_toggle_btn 1072 ui/co4e_tab.py 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 co -
Co4ETab.chat_stack 1087 ui/co4e_tab.py 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 co -
Co4ETab._flow_logs 1088 ui/co4e_tab.py 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 co -
Co4ETab.chat_input_row 1090 ui/co4e_tab.py 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 co -
Co4ETab._usage_total_lbl 1095 ui/co4e_tab.py 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 co -
Co4ETab.chat_input 1101 ui/co4e_tab.py 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 co -
Co4ETab.chat_send_btn 1104 ui/co4e_tab.py 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 co -
Co4ETab.co4e_routing_toggle 1109 ui/co4e_tab.py 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 co -
Co4ETab._co4e_routed_provider 1110 ui/co4e_tab.py 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 co -
Co4ETab._vsplit_sizes 1117 ui/co4e_tab.py 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 co -
Co4ETab._msgs_collapsed 1118 ui/co4e_tab.py 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 co -
Co4ETab._toggle_messages 1125-1157 ui/co4e_tab.py 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 co -
Co4ETab._ensure_flow_log 1160-1169 ui/co4e_tab.py 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 co -
Co4ETab._active_log 1171-1173 ui/co4e_tab.py 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 co -
Co4ETab.chat_log 1175-1179 ui/co4e_tab.py 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 co -
Co4ETab._plan_bubble 1181-1187 ui/co4e_tab.py 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 co -
Co4ETab._apply_workflow 1190-1204 ui/co4e_tab.py 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 co -
Co4ETab._new_workflow 1205-1213 ui/co4e_tab.py gọi self._open_flow (ngoài lát này) co -
Co4ETab._selected_wf 1215-1221 ui/co4e_tab.py co4e.get_workflow đọc storage — thuần logic sidebar, không thuộc trang Runs co -
Co4ETab._load_selected_workflow 1223-1226 ui/co4e_tab.py - co -
Co4ETab._edit_selected_workflow 1228-1233 ui/co4e_tab.py - co -
Co4ETab._duplicate_selected_workflow 1235-1242 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._wf_context_menu 1244-1267 ui/co4e_tab.py 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) co -
Co4ETab._rename_workflow 1269-1285 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._delete_selected_workflow 1287-1293 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._sync_wf_from_canvas 1295-1298 ui/co4e_tab.py đọ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ũ co -
Co4ETab._save 1300-1305 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._autosave 1307-1310 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._on_name_changed 1312-1314 ui/co4e_tab.py gọi self._sync_active_flow_tab_text (ngoài lát này) co -
Co4ETab._add_blank_step 1316-1318 ui/co4e_tab.py - co -
Co4ETab._on_node_selected 1321-1327 ui/co4e_tab.py đọ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 co -
Co4ETab._on_config_changed 1329-1332 ui/co4e_tab.py cùng lý do với _on_node_selected co -
Co4ETab._new_agent 1335-1336 presentation/co4e/agent_list_panel.py khớp bảng cũ, ngoài phạm vi run-control co -
Co4ETab._edit_agent 1338-1346 presentation/co4e/agent_list_panel.py khớp bảng cũ, ngoài phạm vi run-control co -
Co4ETab._edit_agent_dialog 1348-1354 presentation/co4e/agent_list_panel.py co4e.save_custom_agent ghi storage; mở dialog Qt -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control co -
Co4ETab._delete_agent 1356-1363 presentation/co4e/agent_list_panel.py co4e.delete_custom_agent ghi storage -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control co -
Co4ETab._manage_skills 1365-1369 presentation/co4e/skills_list_panel.py mở SkillsDialog (Qt) -- QUYET DINH: khớp bảng cũ, ngoài phạm vi run-control co -
Co4ETab._skill_map 1372-1378 application/workflows/co4e_workflow_service.py 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 co -
Co4ETab._current_mode 1380-1381 ui/co4e_tab.py 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 co 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.
Co4ETab._on_mode_changed 1383-1389 ui/co4e_tab.py 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 co 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.
Co4ETab._on_run_clicked 1391-1400 ui/co4e_tab.py 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 co 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.
Co4ETab._start_canvas_run 1403-1420 ui/co4e_tab.py 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 co 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.
Co4ETab._plan_bubble 1413 ui/co4e_tab.py 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 co (nhung o dong khac: 1186-1187) -
Co4ETab._run_single 1422-1427 ui/co4e_tab.py - co 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.
Co4ETab._run_from 1429-1433 ui/co4e_tab.py - co 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.
Co4ETab._downstream 1435-1446 ui/co4e_tab.py đọ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 co 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.
Co4ETab._manual_run_or_advance 1449-1462 ui/co4e_tab.py 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 co 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.
Co4ETab._manual_order 1458 ui/co4e_tab.py 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 co (nhung o dong khac: 253) 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.
Co4ETab._manual_idx 1459 ui/co4e_tab.py trạng thái mode thủ công, dùng bởi _manual_step/_on_manager_event co (nhung o dong khac: 254) 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.
Co4ETab._manual_active 1460 ui/co4e_tab.py trạng thái mode thủ công, đọc bởi _on_manager_event co (nhung o dong khac: 252) 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.
Co4ETab._manual_step 1464-1480 ui/co4e_tab.py ghi self._flow_runs[wf.id] và self._run_logs[run_id] — dict chia sẻ với _start_canvas_run/_on_manager_event co 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.
Co4ETab._topo_order 1482-1487 ui/co4e_tab.py đọc self.canvas.nodes()/edges() — thuần logic sắp xếp topo co 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.
Co4ETab._on_manager_event 1490-1546 ui/co4e_tab.py 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 co 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.
Co4ETab._notify_run_finished 1548-1569 ui/co4e_tab.py 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 co 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.
Co4ETab._run_popups 1557 ui/co4e_tab.py 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 co 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.
Co4ETab._refresh_runs 1571-1612 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab._stop_selected_run 1614-1620 presentation/co4e/co4e_run_control_widget.py nút Stop của bảng Flow Status co -
Co4ETab._delete_selected_run 1622-1635 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab._runs_context_menu 1637-1651 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab.set_project 1654-1670 ui/co4e_tab.py đọ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 co -
Co4ETab._project_id 1659 ui/co4e_tab.py 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 co (nhung o dong khac: 249) -
Co4ETab._project_dir 1660 ui/co4e_tab.py 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 co (nhung o dong khac: 250) -
Co4ETab._flow_output_root 1672-1682 ui/co4e_tab.py 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 co -
Co4ETab._refresh_ws_folder_btn 1684-1689 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab._open_workspace_folder 1691-1698 presentation/co4e/co4e_run_control_widget.py hành động của nút 'mở thư mục workspace'; mkdir + open_location (spawn process) co -
Co4ETab._open_run_output_folder 1700-1711 presentation/co4e/co4e_run_control_widget.py mở thư mục output của 1 run cụ thể — dùng trong context menu bảng Flow Status; mkdir + open_location co -
Co4ETab._rename_selected_run 1713-1744 presentation/co4e/co4e_run_control_widget.py 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 co -
Co4ETab._run_selected_in_background 1746-1756 ui/co4e_tab.py 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 co 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.
Co4ETab._wf_by_id 1758-1766 ui/co4e_tab.py co4e.get_workflow đọc file workflow đã lưu trên đĩa; helper dùng chung nhiều nơi (rerun, open-from-table) co 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.
Co4ETab._rerun_run_item 1768-1779 ui/co4e_tab.py 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 co 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.
Co4ETab._open_run_from_table 1781-1800 ui/co4e_tab.py 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 co 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.
Co4ETab.showEvent 1802-1805 ui/co4e_tab.py override Qt lifecycle của chính Co4ETab, gọi self._refresh_runs() — phải ở lại widget chính co -
Co4ETab._out_dir 1807-1813 ui/co4e_tab.py mkdir; dùng cho chat/flow deliverables, không liên quan bảng Flow Status co -
Co4ETab._chat_send 1816-1842 ui/co4e_tab.py - co -
Co4ETab._apply_co4e_routing 1844-1879 ui/co4e_tab.py ghi self._co4e_routed_provider; nhánh 'manual' dựng dialog confirm_switch(self,...) nên cần widget sống co -
Co4ETab._co4e_routed_provider 1849 ui/co4e_tab.py dùng bởi _run_chat_turn để chọn provider — reset mỗi lần _apply_co4e_routing chạy co -
Co4ETab._extract_agent_directive 1881-1887 ui/co4e_tab.py thuần regex, test được không cần Qt co -
Co4ETab._resolve_agent 1889-1897 ui/co4e_tab.py co4e.list_custom_agents() đọc dữ liệu agent tuỳ biến đã lưu co -
Co4ETab._run_chat_turn 1899-1970 ui/co4e_tab.py 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 co -
Co4ETab._chat_worker 1953 ui/co4e_tab.py 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 co (nhung o dong khac: 236) -
Co4ETab._append_chat 1972-1987 ui/co4e_tab.py - co -
Co4ETab._fmt_usage 1990-1997 ui/co4e_tab.py thuần formatting, không cần Qt co -
Co4ETab._apply_usage 1999-2016 ui/co4e_tab.py ghi self._flow_usage[wf_id] — tổng usage theo flow, chia sẻ với _refresh_usage_total co -
Co4ETab._refresh_usage_total 2018-2033 ui/co4e_tab.py đọc self._flow_usage và self._wf — trạng thái chia sẻ với _apply_usage co -
Co4ETab._append_diff 2035-2039 ui/co4e_tab.py - co -
Co4ETab._append_plan 2041-2052 ui/co4e_tab.py ghi log._co4e_plan_bubble — thuộc tính gắn động lên ChatView, chia sẻ với _run_chat_turn co -
Co4ETab._retranslate 2055-2075 ui/co4e_tab.py 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 co -
_html_escape 2078-2079 ui/co4e_tab.py 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 co -
_qcolor 2082-2084 presentation/co4e/co4e_run_control_widget.py 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 co -

Chỗ thấy khác tài liệu — cần người quyết

Không có symbol nào trong 215 symbol thô có note bắt đầu bằng khac tai lieu: — mục này để trống theo đúng yêu cầu tự kiểm (không có gì cần liệt kê).