## Summary epic r04 - begin refactor ## Change Type - [x] Cowork feature - [ ] Bug fix - [ ] Core AI contribution - [ ] Test / hardening - [ ] Performance - [ ] Documentation ## Related Work Cowork Task: Core Repo: http://34.143.229.138/gitea-admin/fsg-ai-core-assets Core AI Issue: Core Task: Related PR: ## Scope What is intentionally included? What is intentionally NOT included? ## Validation - [ ] Unit tests - [ ] Integration tests - [ ] Manual verification - [ ] Regression check Commands / evidence: ## Security Impact Permission / credential / network / customer data impact: ## Compatibility - [ ] No breaking change - [ ] Breaking change documented ## Reviewer Notes Anything Cowork reviewers should pay attention to. --------- Co-authored-by: Anh Tran Nguyen Minh <anhtnm1@fpt.com> Co-authored-by: Huong Le Thi Thien <huongltt35@fpt.com> Co-authored-by: Nam Pham Dinh Thanh <nampdt@fpt.com> Co-authored-by: Vu Dam Tuan <vudt15@fpt.com> Co-authored-by: Hiep Ha Van <hiephv3@fpt.com> Co-authored-by: Lam Hoang Van <lamhv7@fpt.com> Reviewed-on: #7 Co-authored-by: Duy Le Huu <duylh19@fpt.com>
7.3 KiB
Bản đồ tách StepConfigPanel (ui/co4e_config_panel.py → presentation/co4e/)
- Phạm vi lượt này: chỉ
StepConfigPanel(nguyên bản dòng 1-528 củaui/co4e_config_panel.py). Không đụng file nào khác thuộc làn N1 (ui/co4e_tab.py,ui/co4e_canvas.py,docs/architecture/co4e-split-map.md/.json). - Lý do phải tách thêm, dù chỉ 1 class:
StepConfigPanelmột mình đã 396 dòng (133-528); cộng thêm module docstring + khối import của một file riêng sẽ vượt trần 400 dòng (CASAN Check 2). Giải pháp: cắt-dán (không viết lại logic) thành 3 file theo trách nhiệm.
File đích
| symbol | dòng gốc | file đích | ghi chú |
|---|---|---|---|
_SECTION_ANIM_MS |
27 | presentation/co4e/step_config_section.py |
hằng số dùng bởi _add_section |
_SectionHeader |
30-52 | presentation/co4e/step_config_section.py |
QLabel clickable, không có hành vi nghiệp vụ riêng |
_add_section |
55-130 | presentation/co4e/step_config_section.py |
khung ▶/▼ dùng chung cho 4 nhóm trường của StepConfigPanel; không đọc/ghi state của panel |
StepConfigPanel (Signal + __init__) |
133-313 | presentation/co4e/node_property_panel.py |
4 Signal (changed/run_node/run_from/delete_node) + dựng toàn bộ form |
StepConfigPanel.load_step |
316-354 | presentation/co4e/node_property_panel.py |
nạp Step vào form |
StepConfigPanel.clear_step |
356-359 | presentation/co4e/node_property_panel.py |
xoá state, tắt panel |
StepConfigPanel._on_edit |
362-378 | presentation/co4e/node_property_panel.py |
ghi field UI ngược vào Step |
StepConfigPanel._available_agent_names |
380-390 | presentation/co4e/node_property_actions_mixin.py (_StepConfigActionsMixin) |
staticmethod, dùng bởi _add_subagent/_edit_subagent |
StepConfigPanel._add_subagent |
392-408 | presentation/co4e/node_property_actions_mixin.py |
|
StepConfigPanel._edit_subagent |
410-428 | presentation/co4e/node_property_actions_mixin.py |
|
StepConfigPanel._del_subagent |
430-437 | presentation/co4e/node_property_actions_mixin.py |
|
StepConfigPanel._add_attachment |
439-453 | presentation/co4e/node_property_actions_mixin.py |
|
StepConfigPanel._del_attachment |
455-462 | presentation/co4e/node_property_actions_mixin.py |
|
StepConfigPanel._ai_draft |
464-498 | presentation/co4e/node_property_actions_mixin.py |
dùng AgentWorker thật (không mock trong __init__) |
StepConfigPanel._load_models |
500-528 | presentation/co4e/node_property_actions_mixin.py |
dùng AgentWorker thật |
Cách ghép lại: mixin + đa kế thừa
node_property_panel.py:
class StepConfigPanel(_StepConfigActionsMixin, QScrollArea):
...
_StepConfigActionsMixin là mixin THUẦN — không __init__ riêng, chỉ đọc/ghi
state có sẵn trên self do StepConfigPanel.__init__ định nghĩa
(self._step, self._node_id, self.ctx, self.sub_list, self.attach_list,
self.instructions_edit, self.gen_btn, self.model_combo,
self.load_models_btn).
Khác với bước co4e_canvas_widget.py (Co4ECanvas override nhiều method Qt như
paintEvent/mousePressEvent, nên thứ tự mixin-trước-base là bắt buộc để
MRO ưu tiên override của mixin): ở đây không có method nào của
_StepConfigActionsMixin trùng tên với QScrollArea, nên thứ tự kế thừa
không ảnh hưởng hành vi. Giữ thứ tự mixin-trước chỉ để nhất quán quy ước, không
phải yêu cầu kỹ thuật bắt buộc.
Import thừa cố ý giữ nguyên
PROVIDER_LABELS (nguyên bản dòng 21, from ..config import PROVIDER_LABELS)
không được dùng ở đâu trong toàn bộ ui/co4e_config_panel.py gốc (đã xác minh
bằng grep). Vẫn giữ nguyên import này trong node_property_panel.py (chỉ đổi
số cấp .. → ...), không xoá, để đúng phạm vi "chỉ dời chỗ" của lượt tách
này — xoá một import "thừa" là một quyết định dọn dẹp ngoài phạm vi được giao.
Thay đổi comment/test ngoài phạm vi "chỉ dời chỗ" (ghi riêng, không lẫn vào phần move)
- Docstring module của 3 file mới (
step_config_section.py,node_property_actions_mixin.py,node_property_panel.py) — viết MỚI hoàn toàn bằng tiếng Việt theo quy ước CASAN cho file mới trongpresentation/(mẫuinfrastructure/persistence/json/atomic_json_file.py). Đây không phải sửa một comment cũ bị sai do dời chỗ — module docstring nguyên bản (dòng 1-9 củaui/co4e_config_panel.py) mô tả cả file cũ (đã bị chia làm 3), nên mỗi file mới cần một docstring kiến trúc riêng thay vì copy y hệt bản gốc. ui/co4e_config_panel.py(file cũ) — docstring được viết lại (vẫn tiếng Anh, khớp quy ước "sửa file cũ tiếng Anh thì giữ tiếng Anh") để nói rõStepConfigPanelđã dời đi đâu, thay vì mô tả hành vi như thể class còn định nghĩa tại chỗ — comment cũ sẽ SAI (nói rằng lớp "ở đây" trong khi không còn) nếu giữ nguyên.tests/characterization/test_node_property_panel.py(dòng ~296-307 nguyên bản) — SỬA kỹ thuật patch/restore của caseCASE_ADD_SUBAGENT_EMPTY_NAMES_USES_GETTEXT_QUIRK_OK, không đổi bất kỳ assert/hành vi nào. Bản gốc dùngStepConfigPanel.__dict__["_available_agent_names"]để lưu lại method gốc trước khi monkey-patch, rồi gán lại y hệt lúc restore. Sau khi_available_agent_nameschuyển vào_StepConfigActionsMixin(mixin riêng), nó không còn nằm trongStepConfigPanel.__dict__(chỉ được kế thừa qua MRO) →KeyError. Thay bằng: gán đè trực tiếp lênStepConfigPanel(vẫn shadow đúng như cũ), và khi xong dùngdel StepConfigPanel._available_agent_namesđể nó rơi trở lại đúng method kế thừa từ mixin — hành vi quan sát được của test (các assertsub_agents) giữ nguyên 100%, chỉ đổi CÁCH lưu/khôi phục attribute bị monkey-patch. Đây là hệ quả tất yếu của yêu cầu tách mixin trong lượt này (test được viết khi class còn nguyên khối), không phải sửa test để che một thay đổi hành vi.
Xác minh
.venv/Scripts/python.exe tools/check_co4e.py— chạy TRƯỚC và SAU khi sửa, output giống hệt nhau cả 2 lần (KET QUA: Co4E sap xep lai, khong mat control nao)..venv/Scripts/python.exe -m pytest tests/characterization/test_node_property_panel.py -q—1 passedcả trước (đo trên code gốc, class còn ởui/co4e_config_panel.py) lẫn sau khi tách..venv/Scripts/python.exe -m pytest tests -q --tb=short -rf --continue-on-collection-errors—287 passed, 1 skippedsau khi tách (không có test nào khác vỡ vì importStepConfigPaneltừui/co4e_config_panel.py).- AST-scan
domain/+application/cho import PySide6/PyQt:KHONG CO. - Số dòng file mới:
node_property_panel.py293,node_property_actions_mixin.py202,step_config_section.py134 — cả 3 đều ≤ 400.