CI / test (push) Canceled after 0s
## 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>
63 lines
2.5 KiB
Python
63 lines
2.5 KiB
Python
"""Dialog shown in Confirm mode before a write/run action executes."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, Tuple
|
|
|
|
from PySide6.QtWidgets import (
|
|
QDialog, QDialogButtonBox, QLabel, QPlainTextEdit, QVBoxLayout,
|
|
)
|
|
|
|
from ..i18n import tr
|
|
|
|
|
|
class PermissionDialog(QDialog):
|
|
"""Hộp thoại xin phép chạy một tool có rủi ro: hiện xem trước hành động rồi hỏi
|
|
Đồng ý / Từ chối.
|
|
"""
|
|
def __init__(self, action: Dict[str, Any], parent=None):
|
|
"""Hộp thoại xin phép trước khi agent chạy một hành động nhạy cảm.
|
|
|
|
Hiện nguyên văn thứ sắp chạy: người dùng phải thấy đúng cái mình đang đồng ý,
|
|
không phải một câu mô tả chung chung.
|
|
"""
|
|
super().__init__(parent)
|
|
preview = action.get("preview", {})
|
|
self.setWindowTitle(tr("permission.title"))
|
|
self.setMinimumWidth(620)
|
|
|
|
lay = QVBoxLayout(self)
|
|
heading = QLabel(preview.get("title", action.get("name", tr("permission.default_action"))))
|
|
heading.setStyleSheet("font-weight:600; font-size:14px;")
|
|
lay.addWidget(heading)
|
|
|
|
subtitle = {
|
|
"command": tr("permission.subtitle_command"),
|
|
"diff": tr("permission.subtitle_diff"),
|
|
}.get(preview.get("kind", "info"), tr("permission.subtitle_default"))
|
|
sub = QLabel(subtitle)
|
|
sub.setObjectName("hint")
|
|
lay.addWidget(sub)
|
|
|
|
view = QPlainTextEdit()
|
|
view.setReadOnly(True)
|
|
view.setPlainText(preview.get("text", ""))
|
|
view.setStyleSheet("font-family: Consolas, 'Courier New', monospace;")
|
|
view.setMinimumHeight(260)
|
|
lay.addWidget(view)
|
|
|
|
buttons = QDialogButtonBox()
|
|
self.approve_btn = buttons.addButton(tr("permission.approve"), QDialogButtonBox.AcceptRole)
|
|
self.approve_btn.setObjectName("primary")
|
|
self.reject_btn = buttons.addButton(tr("permission.reject"), QDialogButtonBox.RejectRole)
|
|
self.reject_btn.setObjectName("danger")
|
|
buttons.accepted.connect(self.accept)
|
|
buttons.rejected.connect(self.reject)
|
|
lay.addWidget(buttons)
|
|
|
|
@staticmethod
|
|
def ask(action: Dict[str, Any], parent=None) -> Tuple[bool, bool]:
|
|
"""Returns ``(approved, False)`` — remember is always False (whitelist removed)."""
|
|
dlg = PermissionDialog(action, parent)
|
|
approved = dlg.exec() == QDialog.Accepted
|
|
return approved, False
|