Feature/fsg gamma team ui fix #3

Merged
gitea-admin merged 41 commits from feature/FSG_GammaTeam_UI_Fix into main 2026-08-20 12:12:59 +00:00
3 changed files with 41 additions and 16 deletions
Showing only changes of commit dc6cb309c2 - Show all commits
+15 -10
View File
@@ -1274,7 +1274,7 @@ STRINGS: Dict[str, Dict[str, str]] = {
"dashboard.card_in": {"en": "Input", "ja": "入力", "vi": "Input"}, "dashboard.card_in": {"en": "Input", "ja": "入力", "vi": "Input"},
"dashboard.card_out": {"en": "Output", "ja": "出力", "vi": "Output"}, "dashboard.card_out": {"en": "Output", "ja": "出力", "vi": "Output"},
"dashboard.card_cache": {"en": "Cache", "ja": "キャッシュ", "vi": "Cache"}, "dashboard.card_cache": {"en": "Cache", "ja": "キャッシュ", "vi": "Cache"},
"dashboard.card_cost": {"en": "Total cost", "ja": "合計コスト", "vi": "Tổng chi phí"}, "dashboard.card_cost": {"en": "Cost", "ja": "コスト", "vi": "Chi phí"},
"dashboard.card_turns": {"en": "{n} turns", "ja": "{n} ターン", "vi": "{n} lượt"}, "dashboard.card_turns": {"en": "{n} turns", "ja": "{n} ターン", "vi": "{n} lượt"},
"dashboard.prices_label": { "dashboard.prices_label": {
"en": "Unit price (USD / 1M tokens):", "ja": "単価 (USD / 100万トークン):", "en": "Unit price (USD / 1M tokens):", "ja": "単価 (USD / 100万トークン):",
@@ -1309,7 +1309,7 @@ STRINGS: Dict[str, Dict[str, str]] = {
"dashboard.ref_last_week": {"en": "Last week", "ja": "先週", "vi": "Tuần trước"}, "dashboard.ref_last_week": {"en": "Last week", "ja": "先週", "vi": "Tuần trước"},
"dashboard.ref_last_month": {"en": "Last month", "ja": "先月", "vi": "Tháng trước"}, "dashboard.ref_last_month": {"en": "Last month", "ja": "先月", "vi": "Tháng trước"},
"dashboard.ref_last_year": {"en": "Last year", "ja": "昨年", "vi": "Năm trước"}, "dashboard.ref_last_year": {"en": "Last year", "ja": "昨年", "vi": "Năm trước"},
"usage.budget_title": {"en": "Budget", "ja": "予算", "vi": "Budget"}, "usage.budget_title": {"en": "Budget", "ja": "予算", "vi": "Ngân sách"},
"usage.budget_no_budget": {"en": "No budget set", "ja": "予算未設定", "vi": "Chưa đặt Budget"}, "usage.budget_no_budget": {"en": "No budget set", "ja": "予算未設定", "vi": "Chưa đặt Budget"},
"usage.budget_used_pct": {"en": "{pct}% used", "ja": "{pct}% 使用済み", "vi": "Đã dùng {pct}%"}, "usage.budget_used_pct": {"en": "{pct}% used", "ja": "{pct}% 使用済み", "vi": "Đã dùng {pct}%"},
"usage.budget_over_warning": {"en": "⚠ Over 85% of budget used", "usage.budget_over_warning": {"en": "⚠ Over 85% of budget used",
@@ -2374,10 +2374,10 @@ STRINGS: Dict[str, Dict[str, str]] = {
# ---- monitoring_tab.py (📊 Monitoring Dashboard) -------------------- # ---- monitoring_tab.py (📊 Monitoring Dashboard) --------------------
"monitoring.title": {"en": "Monitoring Dashboard", "ja": "モニタリングダッシュボード", "vi": "Bảng giám sát"}, "monitoring.title": {"en": "Monitoring Dashboard", "ja": "モニタリングダッシュボード", "vi": "Bảng giám sát"},
"monitoring.refresh": {"en": "Refresh", "ja": "更新", "vi": "Làm mới"}, "monitoring.refresh": {"en": "Refresh", "ja": "更新", "vi": "Làm mới"},
"monitoring.tab_security": {"en": "Security Events", "ja": "セキュリティイベント", "vi": "Sự kiện bảo mật"}, "monitoring.tab_security": {"en": "Security", "ja": "セキュリティ", "vi": "Bảo mật"},
"monitoring.tab_mcp": {"en": "MCP Call History", "ja": "MCP 呼び出し履歴", "vi": "Lịch sử gọi MCP"}, "monitoring.tab_mcp": {"en": "MCP", "ja": "MCP", "vi": "MCP"},
"monitoring.tab_actions": {"en": "Action Logs", "ja": "アクションログ", "vi": "Nhật ký hành động"}, "monitoring.tab_actions": {"en": "Actions", "ja": "アクション", "vi": "Hành động"},
"monitoring.tab_agents": {"en": "Agent Status", "ja": "エージェント状態", "vi": "Trạng thái Agent"}, "monitoring.tab_agents": {"en": "Agent", "ja": "エージェント", "vi": "Agent"},
"monitoring.tab_accounts": {"en": "Accounts", "ja": "アカウント", "vi": "Tài khoản"}, "monitoring.tab_accounts": {"en": "Accounts", "ja": "アカウント", "vi": "Tài khoản"},
"monitoring.col_time": {"en": "Time", "ja": "時刻", "vi": "Thời gian"}, "monitoring.col_time": {"en": "Time", "ja": "時刻", "vi": "Thời gian"},
"monitoring.col_role": {"en": "Agent Role", "ja": "エージェント役割", "vi": "Vai trò Agent"}, "monitoring.col_role": {"en": "Agent Role", "ja": "エージェント役割", "vi": "Vai trò Agent"},
@@ -2390,6 +2390,9 @@ STRINGS: Dict[str, Dict[str, str]] = {
"monitoring.overview_calls": {"en": "Calls", "ja": "呼び出し", "vi": "Lượt gọi"}, "monitoring.overview_calls": {"en": "Calls", "ja": "呼び出し", "vi": "Lượt gọi"},
# The fold under the Sandbox summary line — the wireframe shows only the # The fold under the Sandbox summary line — the wireframe shows only the
# summary, so the ID / created / uptime / limits rows live behind this. # summary, so the ID / created / uptime / limits rows live behind this.
"monitoring.overview_disk_free": {
"en": "{size} free", "ja": "空き {size}", "vi": "{size} trống"},
"monitoring.overview_disk_label": {"en": "Disk", "ja": "ディスク", "vi": "Đĩa"},
"monitoring.overview_sbx_detail": { "monitoring.overview_sbx_detail": {
"en": "Details", "ja": "詳細", "vi": "Chi tiết"}, "en": "Details", "ja": "詳細", "vi": "Chi tiết"},
"monitoring.col_detail": {"en": "Detail", "ja": "詳細", "vi": "Chi tiết"}, "monitoring.col_detail": {"en": "Detail", "ja": "詳細", "vi": "Chi tiết"},
@@ -2429,7 +2432,7 @@ STRINGS: Dict[str, Dict[str, str]] = {
# ---- monitoring_tab.py — Overview card dashboard --------------------- # ---- monitoring_tab.py — Overview card dashboard ---------------------
"monitoring.tab_overview": {"en": "Overview", "ja": "概要", "vi": "Tổng quan"}, "monitoring.tab_overview": {"en": "Overview", "ja": "概要", "vi": "Tổng quan"},
"monitoring.overview_usage_title": { "monitoring.overview_usage_title": {
"en": "Token Usage & Cost", "ja": "トークン使用量とコスト", "vi": "Sử dụng token & Chi phí"}, "en": "Token & Cost", "ja": "トークンとコスト", "vi": "Token & Chi phí"},
"monitoring.overview_currency": {"en": "Currency:", "ja": "通貨:", "vi": "Tiền tệ:"}, "monitoring.overview_currency": {"en": "Currency:", "ja": "通貨:", "vi": "Tiền tệ:"},
"monitoring.tab_agents_admin": { "monitoring.tab_agents_admin": {
"en": "Agents Admin", "ja": "エージェント管理", "vi": "Agents Admin"}, "en": "Agents Admin", "ja": "エージェント管理", "vi": "Agents Admin"},
@@ -2894,11 +2897,11 @@ STRINGS: Dict[str, Dict[str, str]] = {
"ja": "質問をAIがフィルターキーワードに変換します。", "ja": "質問をAIがフィルターキーワードに変換します。",
"vi": "AI chuyển câu hỏi thành từ khóa lọc (vd: \"hôm nay lệnh nào bị lỗi?\")."}, "vi": "AI chuyển câu hỏi thành từ khóa lọc (vd: \"hôm nay lệnh nào bị lỗi?\")."},
"monitoring.overview_activity_title": { "monitoring.overview_activity_title": {
"en": "Recent Activity", "ja": "最近のアクティビティ", "vi": "Hoạt động gần đây"}, "en": "Recent log", "ja": "最近のログ", "vi": "Nhật ký gần đây"},
"monitoring.overview_no_activity": { "monitoring.overview_no_activity": {
"en": "No activity yet.", "ja": "まだアクティビティはありません。", "vi": "Chưa có hoạt động nào."}, "en": "No activity yet.", "ja": "まだアクティビティはありません。", "vi": "Chưa có hoạt động nào."},
"monitoring.overview_resource_title": { "monitoring.overview_resource_title": {
"en": "Resource Usage", "ja": "リソース使用状況", "vi": "Sử dụng tài nguyên"}, "en": "Resources", "ja": "リソース", "vi": "Tài nguyên"},
"monitoring.overview_res_cpu": {"en": "CPU", "ja": "CPU", "vi": "CPU"}, "monitoring.overview_res_cpu": {"en": "CPU", "ja": "CPU", "vi": "CPU"},
"monitoring.overview_res_mem": {"en": "Memory", "ja": "メモリ", "vi": "Bộ nhớ"}, "monitoring.overview_res_mem": {"en": "Memory", "ja": "メモリ", "vi": "Bộ nhớ"},
"monitoring.overview_res_disk": {"en": "Disk I/O", "ja": "ディスク I/O", "vi": "Disk I/O"}, "monitoring.overview_res_disk": {"en": "Disk I/O", "ja": "ディスク I/O", "vi": "Disk I/O"},
@@ -2925,7 +2928,9 @@ STRINGS: Dict[str, Dict[str, str]] = {
"monitoring.pricing_col_input": {"en": "Input price", "ja": "入力単価", "vi": "Giá input"}, "monitoring.pricing_col_input": {"en": "Input price", "ja": "入力単価", "vi": "Giá input"},
"monitoring.pricing_col_output": {"en": "Output price", "ja": "出力単価", "vi": "Giá output"}, "monitoring.pricing_col_output": {"en": "Output price", "ja": "出力単価", "vi": "Giá output"},
"monitoring.overview_sandbox_details_title": { "monitoring.overview_sandbox_details_title": {
"en": "Sandbox Details", "ja": "サンドボックス詳細", "vi": "Chi tiết Sandbox"}, # One section now, holding both the sandbox facts and the permissions.
"en": "Sandbox & Permissions", "ja": "サンドボックスと権限",
"vi": "Sandbox & Quyền"},
"monitoring.overview_sandbox_id": {"en": "Sandbox ID", "ja": "サンドボックス ID", "vi": "Sandbox ID"}, "monitoring.overview_sandbox_id": {"en": "Sandbox ID", "ja": "サンドボックス ID", "vi": "Sandbox ID"},
"monitoring.overview_status": {"en": "Status", "ja": "状態", "vi": "Trạng thái"}, "monitoring.overview_status": {"en": "Status", "ja": "状態", "vi": "Trạng thái"},
"monitoring.overview_status_running": {"en": "Running", "ja": "実行中", "vi": "Đang chạy"}, "monitoring.overview_status_running": {"en": "Running", "ja": "実行中", "vi": "Đang chạy"},
+20 -3
View File
@@ -530,8 +530,11 @@ class MonitoringTab(QWidget):
self.ov_cpu_lbl, self.ov_cpu_bar, self.ov_cpu_val = _bar_row() self.ov_cpu_lbl, self.ov_cpu_bar, self.ov_cpu_val = _bar_row()
self.ov_mem_lbl, self.ov_mem_bar, self.ov_mem_val = _bar_row() self.ov_mem_lbl, self.ov_mem_bar, self.ov_mem_val = _bar_row()
self.ov_disk_lbl, self.ov_disk_val = _text_row() self.ov_diskfree_lbl, self.ov_diskfree_val = _text_row()
self.ov_network_lbl, self.ov_network_val = _text_row() # I/O and network rates keep working; they are read from the detail
# fold rather than the summary line the wireframe draws.
self.ov_disk_lbl, self.ov_disk_val = QLabel(), QLabel()
self.ov_network_lbl, self.ov_network_val = QLabel(), QLabel()
res_lay.addStretch(1) res_lay.addStretch(1)
# ---- Model pricing (beside the CPU/resource group) ------------------ # ---- Model pricing (beside the CPU/resource group) ------------------
@@ -730,6 +733,7 @@ class MonitoringTab(QWidget):
self.action_page.filter_edit.setPlaceholderText(tr("monitoring.filter_placeholder")) self.action_page.filter_edit.setPlaceholderText(tr("monitoring.filter_placeholder"))
self.ov_cpu_lbl.setText(tr("monitoring.overview_res_cpu")) self.ov_cpu_lbl.setText(tr("monitoring.overview_res_cpu"))
self.ov_mem_lbl.setText(tr("monitoring.overview_res_mem")) self.ov_mem_lbl.setText(tr("monitoring.overview_res_mem"))
self.ov_diskfree_lbl.setText(tr("monitoring.overview_disk_label"))
self.ov_disk_lbl.setText(tr("monitoring.overview_res_disk")) self.ov_disk_lbl.setText(tr("monitoring.overview_res_disk"))
self.ov_network_lbl.setText(tr("monitoring.overview_res_network")) self.ov_network_lbl.setText(tr("monitoring.overview_res_network"))
# model pricing panel # model pricing panel
@@ -745,7 +749,9 @@ class MonitoringTab(QWidget):
tr("monitoring.pricing_col_maxout"), tr("monitoring.pricing_col_input"), tr("monitoring.pricing_col_maxout"), tr("monitoring.pricing_col_input"),
tr("monitoring.pricing_col_output")]) tr("monitoring.pricing_col_output")])
self.ov_sandbox_details_group.setTitle(tr("monitoring.overview_sandbox_details_title").upper()) self.ov_sandbox_details_group.setTitle(
# "&" is a mnemonic marker in a group-box title — double it.
tr("monitoring.overview_sandbox_details_title").upper().replace("&", "&&"))
self.ov_sbx_id_lbl.setText(tr("monitoring.overview_sandbox_id")) self.ov_sbx_id_lbl.setText(tr("monitoring.overview_sandbox_id"))
self.ov_sbx_status_lbl.setText(tr("monitoring.overview_status")) self.ov_sbx_status_lbl.setText(tr("monitoring.overview_status"))
self.ov_sbx_created_lbl.setText(tr("monitoring.overview_created")) self.ov_sbx_created_lbl.setText(tr("monitoring.overview_created"))
@@ -809,7 +815,18 @@ class MonitoringTab(QWidget):
except Exception: except Exception:
mem_pct = 0 mem_pct = 0
self.ov_mem_bar.setValue(min(mem_pct, 100)) self.ov_mem_bar.setValue(min(mem_pct, 100))
try:
self.ov_mem_val.setText(f"{_fmt_bytes(own_mem)}/{_fmt_bytes(total_mem)}")
except Exception: # noqa: BLE001
self.ov_mem_val.setText(_fmt_bytes(own_mem)) self.ov_mem_val.setText(_fmt_bytes(own_mem))
# Free disk on the workspace drive — a capacity fact, unlike the I/O
# rate that used to sit here, and the one the drawing shows.
try:
free = psutil.disk_usage(str(self.ctx.config.cowork_output_dir())).free
self.ov_diskfree_val.setText(
tr("monitoring.overview_disk_free", size=_fmt_bytes(free)))
except Exception: # noqa: BLE001
self.ov_diskfree_val.setText(tr("monitoring.na"))
now = time.monotonic() now = time.monotonic()
try: try:
+5 -2
View File
@@ -50,8 +50,10 @@ class StatCard(QFrame):
# sizeHint hundreds of px wide, forcing its WHOLE grid column open and # sizeHint hundreds of px wide, forcing its WHOLE grid column open and
# throwing every card in the row out of alignment. # throwing every card in the row out of alignment.
self.sub_lbl.setWordWrap(True) self.sub_lbl.setWordWrap(True)
lay.addWidget(self.title_lbl) # Number first, name under it — the figure is what the eye is looking
# for, and it is how the audit page's tiles are drawn.
lay.addWidget(self.value_lbl) lay.addWidget(self.value_lbl)
lay.addWidget(self.title_lbl)
lay.addWidget(self.sub_lbl) lay.addWidget(self.sub_lbl)
def set(self, title: str, value: str, sub: str = "") -> None: def set(self, title: str, value: str, sub: str = "") -> None:
@@ -100,8 +102,9 @@ class BudgetCard(QFrame):
# sizeHint hundreds of px wide, forcing its WHOLE grid column open and # sizeHint hundreds of px wide, forcing its WHOLE grid column open and
# throwing every card in the row out of alignment. # throwing every card in the row out of alignment.
self.sub_lbl.setWordWrap(True) self.sub_lbl.setWordWrap(True)
lay.addWidget(self.title_lbl) # Same order as StatCard: the number first, its name under it.
lay.addWidget(self.value_lbl) lay.addWidget(self.value_lbl)
lay.addWidget(self.title_lbl)
lay.addWidget(self.sub_lbl) lay.addWidget(self.sub_lbl)
row = QHBoxLayout() row = QHBoxLayout()