Files
cowork-local/ui/permission_dialog.py
T
f9f6bc01fd
CI / test (push) Canceled after 0s
Feature/delta team/epic r04 (#7)
## 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>
2026-08-31 05:15:13 +00:00

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