Files
cowork-local/i18n/settings_dialog.py
T
a03a740ea1
CI / test (push) Canceled after 0s
Feature/perf ui logic (#13)
## Summary

Nhánh `feature/perf-ui-logic`: tối ưu hiệu năng/UI, sửa lỗi workspace và điều hướng, và làm cho công tắc **"Block network for agent-run commands"** chặn thật mọi đường ra mạng của app, **trừ nhà cung cấp AI**.

**Chặn mạng (b78d483, 8c497cf, 10b8379)**
- Bộ kiểm tra chung `application/network/network_guard.py`, nối vào cấu hình đang chạy ở Composition Root: đổi công tắc trong Settings là có hiệu lực ngay.
- Lệnh shell của agent và task script chạy trong **Windows AppContainer không có quyền mạng**: kernel chặn socket, ping, DNS, Invoke-WebRequest… Không cần quyền admin. Không cô lập được thì lệnh bị từ chối, không chạy khi mạng còn mở. macOS dùng `sandbox-exec`, Linux dùng `unshare --net`.
- Bật chặn thì: dừng MCP đang chạy, không khởi động server mới, từ chối lời gọi connector; Microsoft 365 (đăng nhập, Graph, đồng bộ cloud, rules, mail), Teams, nút Test REST/Jira/MCP, link đính kèm task, pip tự cài và tài nguyên web trong xem trước HTML đều bị từ chối.
- Vẫn dùng được: chat, tải danh sách model, thử model; tool OneDrive đã đồng bộ trên máy.
- Công tắc **mặc định tắt** khi mở app lần đầu; nhãn giữ nguyên như cũ.
- Xem trước HTML trong tab Folder giờ hiện được ảnh/CSS/JS từ web khi mạng mở (trước đây trang `file://` không tải được).
- Sửa lỗi app văng khi chuyển tab Graph → Folder: profile WebEngine của trang xem trước bị huỷ trước trang (`0xc0000409` trong Qt6Core.dll); giờ dùng một profile chung thuộc QApplication.
- Không cấp quyền AppContainer kế thừa lên thư mục chứa PySide6 (nếu có, Chromium không nạp được `Qt6WebEngineCore.dll` và tab Graph trắng).
- Cột mục lục trong Settings tính độ rộng theo kiểu chữ của mục đang chọn, "Sandbox Security Layer" không còn bị cắt.

**Các commit khác trong nhánh**
- `b7a41b3` mỗi thư mục làm việc chỉ thuộc về một project · `bbdf146` bật nút Sửa project khi đã có project đang mở
- `35f24e0`, `cc8d5c8`, `2e3e719`, `c699beb` canh hàng / khoảng cách thanh điều hướng
- `2759ed9` không refresh workspace khi chuyển tab Cowork · `7607f44` checkpoint hiệu năng và UI
- `8548c1e` chặn tool mạng của agent · `caf3b74` renderer GraphRAG native trên macOS · `c00b83c` khoảng cách metadata hàng project · `a04f8a9` ẩn picker workspace cloud

## Change Type

- [x] Cowork feature
- [x] Bug fix
- [ ] Core AI contribution
- [x] Test / hardening
- [x] 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?
- Mọi đường ra mạng do app tự mở, trừ nhà cung cấp AI (xem Summary).
- Test: `tests/test_network_guard_lanes.py` (có bài chạy AppContainer thật trên Windows), `tests/ui/test_html_preview_remote_images.py`.

What is intentionally NOT included?
- Chặn cả nhà cung cấp AI / chạy model trên máy (Phương án 2).
- Terminal người dùng tự gõ trong tab Folder, sinh ảnh, cơ chế tự tin chứng chỉ lạ (`tls_trust`).
- Huy hiệu trạng thái "đang chặn" trên thanh trên cùng.

## Validation

- [x] Unit tests
- [x] Integration tests
- [x] Manual verification
- [x] Regression check

Commands / evidence:
- `python -m pytest tests/test_network_guard_lanes.py tests/test_sandbox_block_network.py tests/ui -q` → chỉ còn 1 bài fail, fail cả trên `b7a41b3` (nhãn `ProjectRow` 'Project' chưa dịch, `tests/ui/test_i18n_khong_con_chu_cu.py`).
- `python -m pytest tests -q --ignore=tests/ui` → 4 bài fail, cả 4 cũng fail trên `b7a41b3` (`test_canonical_audit_logger`, 2 bài `test_mcp_audit_security`, `test_monitoring_tab_container`).
- Chạy cả `tests` trong một lượt thì treo ở các test dựng MainWindow trong `tests/ui`; `b7a41b3` cũng treo đúng chỗ đó.
- `check_imports.py` và `check_orphan_modules.py` PASS. `check_loc.py` báo 9 file quá dài, giống hệt trước khi sửa (không file nào do nhánh này làm dài thêm).
- Kiểm tra tay trên Windows 11: trong AppContainer, Python báo `WinError 10013`, ping/nslookup/PowerShell/curl đều không ra được mạng; cmd, git, python chạy bình thường.
- Kiểm tra tay trên Windows 11: xem trước HTML tải được 4/4 tài nguyên web khi mạng mở, 0/4 khi bật chặn; tab Graph hoạt động; tạo/huỷ trang xem trước nhiều lần không còn cảnh báo profile của Qt.

## Security Impact

Permission / credential / network / customer data impact:
- Network: khi bật công tắc, chỉ nhà cung cấp AI còn ra mạng; nội dung chat vẫn gửi tới nhà cung cấp AI.
- Permission: lần đầu chạy lệnh trong sandbox, app **thêm quyền (ACE) cho SID AppContainer** trên thư mục làm việc (ghi), thư mục cài Python gốc (đọc), gốc venv và `Scripts` (đọc). Không xoá quyền nào. Thư mục chứa PySide6 không bao giờ nhận quyền kế thừa; một quyền kế thừa sai trên venv (từ bản dev trước) được tự gỡ.
- Credential: không đổi. Khi chặn, trạng thái đăng nhập M365 được đọc thẳng từ kho token trên máy, không dựng MSAL.

## Compatibility

- [x] No breaking change
- [ ] Breaking change documented

Ghi chú: `block_network` mặc định đổi từ bật sang tắt cho cấu hình mới; máy đã lưu `true` thì giữ nguyên. Khi đang chặn, lệnh dùng công cụ cài trong thư mục người dùng (ngoài Program Files) có thể báo Access denied; thư viện trong venv của app không dùng được trong sandbox.

## Reviewer Notes

- `infrastructure/sandbox/appcontainer_process.py` gọi Win32 bằng ctypes (CreateAppContainerProfile, CreateProcessW với SECURITY_CAPABILITIES) và dùng `icacls` để cấp quyền: nên xem kỹ phần cấp quyền.
- `tests/conftest.py` thêm fixture autouse gỡ `network_guard` sau mỗi test, vì `build_context()` gắn cổng này ở mức process.
- `core/task_executors.py` đang đúng bằng trần LOC nên `_run_script` được tách sang `core/task_script.py`.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: minhanhpkpro <minhanhpkpro@gmail.com>
Co-authored-by: Duy Le Huu <duylh19@fpt.com>
Co-authored-by: thanhnv <thanhnv.ip@gmail.com>
Reviewed-on: #13
2026-09-20 12:26:03 +00:00

350 lines
30 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Chuỗi hiển thị — phần settings_dialog.
Cắt ra từ ``i18n.py``: một dict 3.000 dòng không mở nổi để sửa một chữ.
Cắt theo mốc phân đoạn có sẵn, nên mỗi cụm vẫn là các màn đi liền nhau.
``i18n.py`` gộp tất cả lại thành ``STRINGS``.
"""
from __future__ import annotations
from typing import Dict
STRINGS: Dict[str, Dict[str, str]] = {
"settings.sandbox_block_network": {
"en": "Block network for agent-run commands",
"ja": "エージェントが実行するコマンドのネットワークをブロック",
"vi": "Chặn mạng cho lệnh do agent chạy"},
"settings.allow_url_fetch": {
"en": "Allow the agent to fetch URLs (web pages, SharePoint / OneDrive links)",
"ja": "エージェントによるURL取得を許可(Webページ、SharePoint / OneDriveリンク)",
"vi": "Cho phép agent lấy dữ liệu từ URL (trang web, link SharePoint / OneDrive)"},
"settings.allow_url_fetch_tooltip": {
"en": ("Lets the agent's fetch_url tool read web pages, online documents and "
"SharePoint/OneDrive share links to search & process them. 'Block network' "
"overrides this switch. Default: on."),
"ja": "エージェントのfetch_urlツールがWebページ・オンライン文書・SharePoint/OneDrive共有リンクを"
"読み取れるようにします。「ネットワークをブロック」がオンの場合はそちらが優先されます。既定: オン。",
"vi": ("Cho phép tool fetch_url của agent đọc trang web, tài liệu online và link chia sẻ "
"SharePoint/OneDrive để tìm kiếm & xử lý. 'Chặn mạng' được ưu tiên hơn công tắc "
"này. Mặc định: bật.")},
"settings.test_internet": {
"en": "Test Internet", "ja": "インターネット接続テスト", "vi": "Kiểm tra Internet"},
"settings.test_internet_tooltip": {
"en": ("Live-checks the app's own outbound HTTPS path (the same one fetch_url uses) "
"and reports the concrete reason if it can't reach the internet."),
"ja": "アプリ自身の送信HTTPS経路(fetch_urlと同じ)を実際にテストし、インターネットに到達できない"
"場合は具体的な理由を表示します。",
"vi": ("Kiểm tra trực tiếp đường HTTPS ra ngoài của app (đúng đường mà fetch_url dùng) và "
"báo lý do cụ thể nếu không truy cập được internet.")},
"settings.testing_internet": {
"en": "Testing internet access…", "ja": "インターネット接続をテスト中…",
"vi": "Đang kiểm tra truy cập internet…"},
"settings.sandbox_block_network_tooltip": {
"en": ("Only the AI provider (chat, model list, model test) may reach the network. "
"Agent shell commands and task scripts run in a Windows AppContainer with no "
"network access; fetch_url, Jira, connectors/MCP, Microsoft 365, Teams, "
"connector tests, pip auto-install and remote content in HTML previews are refused."),
"ja": "ネットワークに接続できるのはAIプロバイダー(チャット・モデル一覧・モデルテスト)のみです。"
"エージェントのシェルコマンドとタスクスクリプトはネットワークなしのWindows AppContainerで実行され、"
"fetch_url・Jira・コネクタ/MCP・Microsoft 365・Teams・接続テスト・pip自動インストール・"
"HTMLプレビューの外部リソースは拒否されます。",
"vi": "Chỉ nhà cung cấp AI (chat, tải danh sách model, thử model) được ra mạng. Lệnh shell "
"của agent và task script chạy trong Windows AppContainer không có mạng; fetch_url, "
"Jira, connector/MCP, Microsoft 365, Teams, nút Test, tự cài thư viện và tài nguyên "
"web trong xem trước HTML đều bị từ chối."},
"settings.sandbox_unlimited": {"en": "Unlimited", "ja": "無制限", "vi": "Không giới hạn"},
"settings.sandbox_cpu_label": {"en": "CPU limit", "ja": "CPU 制限", "vi": "Giới hạn CPU"},
"settings.sandbox_memory_label": {"en": "Memory limit", "ja": "メモリ制限", "vi": "Giới hạn bộ nhớ"},
"settings.sandbox_disk_label": {"en": "Disk I/O limit", "ja": "ディスク I/O 制限", "vi": "Giới hạn disk I/O"},
"settings.sandbox_hint": {
"en": ("Applies to every run_command/install_package the agent executes "
"(Cowork, Code tab, and Schedule Task alike). 0 = unlimited. This layer is "
"independent of \"Agent Security\" above — it still applies even while that "
"toggle is off."),
"ja": "エージェントが実行するすべての run_command/install_package に適用されます"
"(Cowork、Code タブ、Schedule Task 共通)。0 = 無制限。この機能は上の「Agent "
"Security」とは独立しており、そのトグルがオフの間も適用され続けます。",
"vi": "Áp dụng cho mọi run_command/install_package mà agent chạy (Cowork, tab Code, "
"và Schedule Task). 0 = không giới hạn. Lớp này độc lập với \"Agent Security\" "
"ở trên — vẫn áp dụng ngay cả khi tắt Agent Security."},
"settings.group.mcp": {"en": "MCP Servers", "ja": "MCP サーバー", "vi": "MCP Servers"},
"settings.mcp_hint": {
"en": ("Connect to external MCP (Model Context Protocol) servers — e.g. the official "
"filesystem/GitHub/brave-search servers — and their tools become available to "
"the agent alongside Microsoft 365 and the built-in file/command tools."),
"ja": "外部の MCP(Model Context Protocol)サーバー(公式の filesystem/GitHub/brave-search "
"サーバーなど)に接続すると、そのツールが Microsoft 365 や組み込みのファイル/コマンド"
"ツールと並んでエージェントから利用できるようになります。",
"vi": "Kết nối tới các MCP server bên ngoài (vd: server filesystem/GitHub/brave-search chính "
"thức) — tool của chúng sẽ khả dụng cho agent cùng với Microsoft 365 và tool file/lệnh "
"có sẵn."},
"settings.mcp_add_btn": {"en": "Add server…", "ja": "サーバーを追加…", "vi": "Thêm server…"},
"settings.mcp_edit_btn": {"en": "Edit", "ja": "編集", "vi": "Sửa"},
"settings.mcp_delete_btn": {"en": "Delete", "ja": "削除", "vi": "Xóa"},
"settings.mcp_no_servers": {
"en": "(No MCP servers configured — click 'Add server…')",
"ja": "(MCP サーバーが設定されていません。「サーバーを追加…」をクリック)",
"vi": "(Chưa cấu hình MCP server nào — bấm 'Thêm server…')"},
"settings.mcp_delete_confirm": {
"en": "Remove MCP server \"{name}\"?", "ja": "MCP サーバー「{name}」を削除しますか?",
"vi": "Xóa MCP server \"{name}\"?"},
"mcp.add_title": {"en": "Add MCP server", "ja": "MCP サーバーを追加", "vi": "Thêm MCP server"},
"mcp.edit_title": {"en": "Edit MCP server", "ja": "MCP サーバーを編集", "vi": "Sửa MCP server"},
"mcp.name_label": {"en": "Name", "ja": "名前", "vi": "Tên"},
"mcp.name_placeholder": {"en": "e.g. filesystem", "ja": "例: filesystem", "vi": "vd: filesystem"},
"mcp.command_label": {"en": "Command", "ja": "コマンド", "vi": "Lệnh"},
"mcp.command_placeholder": {"en": "e.g. npx", "ja": "例: npx", "vi": "vd: npx"},
"mcp.args_label": {"en": "Arguments", "ja": "引数", "vi": "Tham số"},
"mcp.args_placeholder": {
"en": "e.g. -y @modelcontextprotocol/server-filesystem C:\\Data",
"ja": "例: -y @modelcontextprotocol/server-filesystem C:\\Data",
"vi": "vd: -y @modelcontextprotocol/server-filesystem C:\\Data"},
"mcp.hint": {
"en": ("The server is launched as a subprocess and talked to over stdio (the standard "
"MCP transport) — the SAME way Claude Desktop/other MCP clients connect to it."),
"ja": "サーバーはサブプロセスとして起動され、stdio(標準の MCP トランスポート)で通信します"
"— Claude Desktop など他の MCP クライアントと同じ方式です。",
"vi": "Server được khởi chạy như 1 subprocess và giao tiếp qua stdio (giao thức MCP chuẩn) "
"— giống cách Claude Desktop hay các MCP client khác kết nối tới nó."},
# ---- settings_dialog.py / ext_connector_dialog.py: External Connectors (CAD/CAE/Office) ----
"settings.group.ext": {
"en": "Connectors (MCP)",
"ja": "コネクタ(MCP)",
"vi": "Connectors (MCP)"},
"settings.ext_moved_hint": {
"en": "Connector (MCP / REST-API) setup moved to Monitoring → Tools → Connector.",
"ja": "コネクター(MCP / REST-API)の設定は「モニタリング → ツール → Connector」へ移動しました。",
"vi": "Thiết lập Connector (MCP / REST-API) đã chuyển sang Monitoring → Công cụ → Connector."},
"settings.ext_hint": {
"en": ("One place for every external tool source — grouped as CAD (NX/CATIA/SolidWorks/"
"AutoCAD), CAE (ANSA/ABAQUS/HyperWorks/ANSYS), MS365 (Microsoft 365/OneDrive/"
"SharePoint) and Other (any generic MCP server). MS365 auto-connects via the built-in "
"server once you sign in; for the rest, point each connector at an MCP server you "
"already have or a REST API it exposes (no vendor SDK is bundled)."),
"ja": "外部ツール接続を1か所に集約 — CAD(NX/CATIA/SolidWorks/AutoCAD)、CAE(ANSA/ABAQUS/"
"HyperWorks/ANSYS)、MS365(Microsoft 365/OneDrive/SharePoint)、Other(汎用 MCP サーバー)。"
"MS365 はサインインすると内蔵サーバーで自動接続。その他は既存の MCP サーバーまたは REST API を"
"指定してください(ベンダー SDK は同梱しません)。",
"vi": "Một nơi duy nhất cho mọi nguồn tool ngoài — nhóm theo CAD (NX/CATIA/SolidWorks/AutoCAD), "
"CAE (ANSA/ABAQUS/HyperWorks/ANSYS), MS365 (Microsoft 365/OneDrive/SharePoint) và Other "
"(MCP server bất kỳ). MS365 tự kết nối qua server tích hợp sau khi đăng nhập; còn lại bạn "
"trỏ mỗi connector tới MCP server bạn đã có hoặc REST API nó cung cấp (không kèm SDK hãng nào)."},
"settings.ext_add_btn": {"en": "Add connector…", "ja": "コネクタを追加…", "vi": "Thêm connector…"},
"settings.ext_edit_btn": {"en": "Edit", "ja": "編集", "vi": "Sửa"},
"settings.ext_delete_btn": {"en": "Delete", "ja": "削除", "vi": "Xóa"},
"settings.ext_delete_confirm": {
"en": "Remove connector \"{name}\"?", "ja": "コネクタ「{name}」を削除しますか?",
"vi": "Xóa connector \"{name}\"?"},
"ext.add_title": {"en": "Add connector", "ja": "コネクタを追加", "vi": "Thêm connector"},
"ext.edit_title": {"en": "Edit connector", "ja": "コネクタを編集", "vi": "Sửa connector"},
"ext.category_label": {"en": "Category", "ja": "カテゴリ", "vi": "Nhóm"},
"ext.preset_label": {"en": "App", "ja": "アプリ", "vi": "Ứng dụng"},
"ext.preset_custom": {"en": "(Custom…)", "ja": "(カスタム…)", "vi": "(Tuỳ chỉnh…)"},
"ext.name_label": {"en": "Display name", "ja": "表示名", "vi": "Tên hiển thị"},
"ext.name_placeholder": {"en": "e.g. NX (Site A)", "ja": "例: NX(サイトA)", "vi": "vd: NX (Site A)"},
"ext.mode_label": {"en": "Connection type", "ja": "接続方式", "vi": "Kiểu kết nối"},
"ext.mode_mcp": {"en": "MCP server (stdio)", "ja": "MCP サーバー(stdio)", "vi": "MCP server (stdio)"},
"ext.mode_rest": {"en": "REST API", "ja": "REST API", "vi": "REST API"},
"ext.mode_builtin": {"en": "built-in, auto-connect", "ja": "内蔵・自動接続", "vi": "tích hợp, tự kết nối"},
"settings.ms365_signin_btn": {"en": "Sign in to Microsoft 365", "ja": "Microsoft 365 にサインイン",
"vi": "Đăng nhập Microsoft 365"},
"settings.ms365_signout_btn": {"en": "Sign out", "ja": "サインアウト", "vi": "Đăng xuất"},
"settings.ms365_signed_in": {"en": "Microsoft 365: signed in as {who}",
"ja": "Microsoft 365: {who} でサインイン中",
"vi": "Microsoft 365: đã đăng nhập ({who})"},
"settings.ms365_signed_out": {
"en": "Microsoft 365: not signed in — one click, no Tenant/Client ID needed.",
"ja": "Microsoft 365: 未サインイン — ワンクリック、テナント/クライアント ID 不要。",
"vi": "Microsoft 365: chưa đăng nhập — 1 cú click, không cần Tenant/Client ID."},
"settings.ms365_signing_in": {
"en": "Microsoft 365: opening sign-in… follow the code prompt.",
"ja": "Microsoft 365: サインインを開始中… コードの案内に従ってください。",
"vi": "Microsoft 365: đang mở đăng nhập… làm theo hướng dẫn mã code."},
"settings.ms365_code_hint": {
"en": ("The sign-in page opened in your browser (<a href='{url}'>{url}</a>) and the code "
"below was copied to your clipboard — just paste it, then sign in with your Microsoft "
"account. This window closes automatically when sign-in completes."),
"ja": ("ブラウザでサインインページ(<a href='{url}'>{url}</a>)を開きました。下のコードはクリップボードに"
"コピー済みです — 貼り付けて Microsoft アカウントでサインインしてください。完了すると自動で閉じます。"),
"vi": ("Trang đăng nhập đã mở trong trình duyệt (<a href='{url}'>{url}</a>) và mã bên dưới đã được "
"copy vào clipboard — chỉ cần dán, rồi đăng nhập bằng tài khoản Microsoft. Cửa sổ này tự đóng "
"khi đăng nhập xong.")},
"settings.ms365_copy_code": {"en": "Copy code", "ja": "コードをコピー", "vi": "Copy mã"},
"settings.ms365_open_link": {"en": "Open link", "ja": "リンクを開く", "vi": "Mở link"},
"settings.ms365_local_connected": {
"en": "OneDrive / SharePoint: auto-connected via local sync — no sign-in needed.\nSynced folder: {path}",
"ja": "OneDrive / SharePoint: ローカル同期で自動接続 — サインイン不要。\n同期フォルダ: {path}",
"vi": "OneDrive / SharePoint: tự động kết nối qua thư mục sync local — không cần đăng nhập.\nThư mục đã sync: {path}"},
"settings.ms365_local_none": {
"en": "OneDrive / SharePoint: no locally-synced OneDrive folder found. Install/sign in to "
"the OneDrive desktop app and sync a folder, then reopen Settings.",
"ja": "OneDrive / SharePoint: ローカル同期の OneDrive フォルダが見つかりません。OneDrive デスクトップ"
"アプリでサインインしフォルダを同期してから、設定を開き直してください。",
"vi": "OneDrive / SharePoint: chưa tìm thấy thư mục OneDrive sync trên máy. Cài/đăng nhập OneDrive "
"desktop và sync một thư mục, rồi mở lại Settings."},
"ext.command_label": {"en": "Command", "ja": "コマンド", "vi": "Lệnh"},
"ext.command_placeholder": {"en": "e.g. python or npx", "ja": "例: python または npx", "vi": "vd: python hoặc npx"},
"ext.args_label": {"en": "Arguments", "ja": "引数", "vi": "Tham số"},
"ext.args_placeholder": {"en": "e.g. -m nx_mcp_server", "ja": "例: -m nx_mcp_server", "vi": "vd: -m nx_mcp_server"},
"ext.base_url_label": {"en": "Base URL", "ja": "ベース URL", "vi": "Base URL"},
"ext.base_url_placeholder": {
"en": "e.g. https://cad-api.internal.company.com",
"ja": "例: https://cad-api.internal.company.com",
"vi": "vd: https://cad-api.internal.company.com"},
"ext.api_key_label": {"en": "API key", "ja": "API キー", "vi": "API key"},
"ext.auth_header_label": {"en": "Auth header name", "ja": "認証ヘッダー名", "vi": "Tên header xác thực"},
"ext.auth_scheme_label": {"en": "Auth scheme", "ja": "認証スキーム", "vi": "Auth scheme"},
"ext.test_btn": {"en": "Test connection", "ja": "接続テスト", "vi": "Kiểm tra kết nối"},
"ext.err_no_command": {
"en": "Enter a command first.", "ja": "先にコマンドを入力してください。", "vi": "Hãy nhập lệnh trước."},
"ext.test_mcp_ok": {
"en": "MCP server started and responded.", "ja": "MCP サーバーが起動し応答しました。",
"vi": "MCP server đã khởi chạy và phản hồi."},
"settings.sec_enabled": {
"en": "Enable AI-assisted agent security guardrails",
"ja": "AI 支援のエージェント セキュリティ ガードレールを有効化",
"vi": "Bật các lớp bảo mật agent có AI hỗ trợ"},
"settings.sec_hint": {
"en": "Three independent layers: an AI reviews the user's request and "
"attachment content against the rules below before the agent "
"acts, and a whitelist + AI control-agent checks every "
"run_command/install_package call. A violation always blocks "
"the action and emails the admin below. Each AI check fails "
"OPEN (allows) if the model itself can't be reached — a gateway "
"hiccup must never make the agent unusable.",
"ja": "3つの独立した層があります:エージェントが行動する前に、AI がユーザーの"
"リクエストと添付ファイルの内容を下記のルールと照合してチェックし、"
"ホワイトリストと AI コントロールエージェントがすべての "
"run_command/install_package 呼び出しをチェックします。違反時は常に"
"操作をブロックし、下記の管理者にメールで通知します。各 AI チェックは"
"モデルに到達できない場合は「許可」側に倒れます(フェイルオープン)— "
"ゲートウェイの一時的な不調でエージェントが使えなくなることがあっては"
"なりません。",
"vi": "Ba lớp độc lập: AI kiểm tra yêu cầu của người dùng và nội dung file "
"đính kèm theo các rule bên dưới TRƯỚC khi agent hành động, và một "
"whitelist + AI control-agent kiểm tra mọi lệnh run_command/"
"install_package. Vi phạm sẽ luôn CHẶN hành động và gửi email cho "
"admin bên dưới. Mỗi lớp kiểm tra bằng AI sẽ MẶC ĐỊNH CHO PHÉP nếu "
"không gọi được model — một sự cố gateway tạm thời không được phép "
"làm agent ngừng hoạt động."},
"settings.sec_validate_prompt": {
"en": "Validate the user's request (prompt) before acting",
"ja": "行動する前にユーザーのリクエスト(プロンプト)を検証",
"vi": "Validate yêu cầu (prompt) của người dùng trước khi hành động"},
"settings.sec_validate_attachments": {
"en": "Scan attachment/file content for malicious payloads",
"ja": "添付/ファイルの内容に悪意あるペイロードがないかスキャン",
"vi": "Scan nội dung file đính kèm để phát hiện nội dung độc hại"},
"settings.sec_validate_commands": {
"en": "Check run_command / install_package against a whitelist",
"ja": "run_command / install_package をホワイトリストと照合",
"vi": "Kiểm tra run_command / install_package theo whitelist"},
"settings.sec_command_ai_check": {
"en": "Also let an AI control-agent judge commands not covered by the whitelist",
"ja": "ホワイトリストに含まれないコマンドは AI コントロールエージェントにも判定させる",
"vi": "Cho AI control-agent xét thêm các lệnh whitelist chưa liệt kê"},
"settings.sec_whitelist_label": {"en": "Command whitelist", "ja": "コマンド ホワイトリスト", "vi": "Whitelist lệnh"},
"settings.sec_whitelist_placeholder": {
"en": "One regex pattern per line, e.g. ^pip install\\n^pytest\\n^git ",
"ja": "1行に1つの正規表現、例: ^pip install\\n^pytest\\n^git ",
"vi": "Mỗi dòng 1 regex, vd: ^pip install\\n^pytest\\n^git "},
"settings.sec_whitelist_empty_warning": {
"en": "Empty whitelist + AI check off = every command is BLOCKED "
"(fail-closed) — add a pattern above or turn AI check back on.",
"ja": "ホワイトリストが空でAIチェックも無効の場合、すべてのコマンドが"
"ブロックされます(フェイルクローズ)。上にパターンを追加するか"
"AIチェックを再度有効にしてください。",
"vi": "Whitelist trống + tắt AI-check = MỌI lệnh sẽ bị CHẶN hết "
"(fail-closed) — hãy thêm pattern ở trên hoặc bật lại AI-check."},
"settings.sec_onedrive_label": {"en": "OneDrive rules link", "ja": "OneDrive ルールへのリンク", "vi": "Link OneDrive chứa rule"},
"settings.sec_onedrive_placeholder": {
"en": "(optional) sharing link to an admin-authored .md rules document",
"ja": "(任意)管理者が作成した .md ルール文書への共有リンク",
"vi": "(tuỳ chọn) link chia sẻ tới file .md rule do admin soạn"},
"settings.sec_admin_email_label": {"en": "Admin email", "ja": "管理者メール", "vi": "Email admin"},
"settings.sec_admin_email_placeholder": {
"en": "admin@yourcompany.com — receives violation alerts via Microsoft 365",
"ja": "admin@yourcompany.com — Microsoft 365 経由で違反アラートを受信",
"vi": "admin@yourcompany.com — nhận cảnh báo vi phạm qua Microsoft 365"},
"settings.sec_rules_path_hint": {
"en": "Local admin rules file (optional, edited directly, always applied): {path}",
"ja": "ローカルの管理者ルールファイル(任意・直接編集・常に適用): {path}",
"vi": "File rule admin cục bộ (tuỳ chọn, sửa trực tiếp, luôn được áp dụng): {path}"},
"settings.group.history": {"en": "Conversation history", "ja": "会話履歴", "vi": "Lịch sử hội thoại"},
"settings.history_local": {"en": "Local (this PC)", "ja": "ローカル(このPC)", "vi": "Local (máy này)"},
"settings.history_onedrive": {"en": "OneDrive", "ja": "OneDrive", "vi": "OneDrive"},
"settings.location": {"en": "Location", "ja": "保存先", "vi": "Nơi lưu"},
"settings.folder": {"en": "Folder", "ja": "フォルダ", "vi": "Thư mục"},
"settings.folder_placeholder": {
"en": "(optional) specific folder — leave empty for default",
"ja": "(任意)特定のフォルダ ― 空欄で既定値",
"vi": "(tuỳ chọn) thư mục cụ thể — để trống dùng mặc định"},
"settings.browse": {"en": "Browse…", "ja": "参照…", "vi": "Duyệt…"},
"settings.autosave": {"en": "Auto-save history after each turn", "ja": "各ターン後に履歴を自動保存", "vi": "Tự động lưu lịch sử sau mỗi lượt"},
"settings.group.cowork": {"en": "Cowork", "ja": "Cowork", "vi": "Cowork"},
"settings.max_parallel": {"en": "Max parallel conversations", "ja": "同時実行する会話数の上限", "vi": "Số hội thoại chạy song song tối đa"},
"settings.parallel_suffix": {"en": " conversations at once", "ja": " 件を同時実行", "vi": " hội thoại cùng lúc"},
"settings.parallel_tooltip": {
"en": ("How many conversations run in parallel. Within one conversation messages always "
"run one at a time (queued); only different conversations run in parallel."),
"ja": ("並列実行する会話数です。1つの会話内のメッセージは常に1件ずつ(キュー)実行され、"
"異なる会話同士のみ並列に実行されます。"),
"vi": ("Số cuộc trò chuyện chạy song song. Trong MỘT cuộc trò chuyện, tin nhắn luôn "
"chạy lần lượt (xếp hàng) để không bị trộn lẫn; chỉ các cuộc trò chuyện khác "
"nhau mới chạy song song.")},
"settings.group.attachments": {"en": "Attachments", "ja": "添付ファイル", "vi": "Tệp đính kèm"},
"settings.max_files": {"en": "Max files", "ja": "最大ファイル数", "vi": "Số tệp tối đa"},
"settings.max_files_suffix": {"en": " files / message", "ja": " 件 / メッセージ", "vi": " tệp / tin nhắn"},
"settings.max_files_tooltip": {
"en": "Maximum number of files attachable to one message.",
"ja": "1メッセージに添付できるファイル数の上限。",
"vi": "Số tệp tối đa đính kèm vào một tin nhắn."},
"settings.max_per_file": {"en": "Max per file", "ja": "ファイルあたりの上限", "vi": "Giới hạn mỗi tệp"},
"settings.max_per_file_suffix": {"en": " K tokens / file", "ja": " Kトークン / ファイル", "vi": " K tokens / tệp"},
"settings.max_per_file_tooltip": {
"en": ("Limits how much of each attached file's content is added to the prompt; anything "
"beyond this is truncated (fewer tokens, avoids exceeding the context limit)."),
"ja": "各添付ファイルの内容をプロンプトに含める量の上限。超過分は切り捨てられます(トークン削減、コンテキスト超過回避)。",
"vi": ("Giới hạn nội dung mỗi tệp đính kèm đưa vào prompt; phần vượt sẽ bị cắt "
"(giảm token, tránh lỗi vượt context).")},
"settings.group.structure": {"en": "GraphRAG", "ja": "GraphRAG", "vi": "GraphRAG"},
"settings.group.sandbox_limits": {"en": "Sandbox resource limits", "ja": "サンドボックスのリソース上限",
"vi": "Giới hạn tài nguyên Sandbox"},
"settings.max_nodes": {"en": "Max nodes", "ja": "最大ノード数", "vi": "Số node tối đa"},
"settings.unlimited": {"en": "Unlimited", "ja": "無制限", "vi": "Không giới hạn"},
"settings.nodes_suffix": {"en": " nodes", "ja": " ノード", "vi": " node"},
"settings.nodes_tooltip": {
"en": ("Cap the number of nodes in the Structure graph (0 = unlimited). "
"A lower cap speeds up scanning/layout for large folders."),
"ja": "構造グラフのノード数上限(0=無制限)。大きなフォルダでは低い値の方が高速です。",
"vi": "Giới hạn số node trong đồ thị Cấu trúc (0 = không giới hạn). Giá trị thấp hơn giúp quét/vẽ nhanh hơn với thư mục lớn."},
"settings.max_edges": {"en": "Max edges", "ja": "最大エッジ数", "vi": "Số cạnh tối đa"},
"settings.edges_suffix": {"en": " edges", "ja": " エッジ", "vi": " cạnh"},
"settings.edges_tooltip": {
"en": "Cap the number of edges in the Structure graph (0 = unlimited).",
"ja": "構造グラフのエッジ数上限(0=無制限)。",
"vi": "Giới hạn số cạnh trong đồ thị Cấu trúc (0 = không giới hạn)."},
"settings.tip": {
"en": "Tip: set your Internal Gateway URL + API key above, then pick a model.",
"ja": "ヒント: 上で社内ゲートウェイの URL と API キーを設定してからモデルを選んでください。",
"vi": "Mẹo: điền URL Gateway nội bộ + API key ở trên, rồi chọn model."},
"settings.loading_models": {"en": "Loading models…", "ja": "モデルを読み込み中…", "vi": "Đang tải danh sách model…"},
"settings.loaded_models": {
"en": "Loaded {n} model(s) for {provider}.", "ja": "{provider} のモデルを {n} 件読み込みました。",
"vi": "Đã tải {n} model cho {provider}."},
"settings.load_failed": {"en": "Load failed: {err}", "ja": "読み込み失敗: {err}", "vi": "Tải thất bại: {err}"},
"settings.load_models_error": {
"en": "No models loaded — {err}", "ja": "モデルを読み込めませんでした — {err}",
"vi": "Không tải được model nào — {err}"},
"settings.load_models_error_unknown": {
"en": "unknown error (check base URL / API key / network).",
"ja": "不明なエラー(URL・APIキー・ネットワークを確認)。",
"vi": "lỗi không xác định (kiểm tra base URL / API key / kết nối mạng)."},
"settings.test_connection": {"en": "Test connection", "ja": "接続テスト", "vi": "Test kết nối"},
"settings.test_connection_tooltip": {
"en": "Check connectivity to this provider right now and show the real reason if it fails.",
"ja": "このプロバイダーへの接続を今すぐ確認し、失敗した場合は本当の理由を表示します。",
"vi": "Kiểm tra kết nối tới provider này ngay và hiện lý do thật nếu thất bại."},
}