Từ 21/08 tôi đã viết xong 7 file R02 với 46 test xanh, và báo là "xong R02". Báo sai: code mới nằm song song, KHÔNG một dòng nào ngoài infrastructure/ và tests/ gọi tới nó. App vẫn chạy nguyên trên config.py, 29 file dùng nó, và khoá API của người dùng vẫn nằm plaintext trong config.json suốt 4 ngày. Commit này mới là phần refactor thật. Bù 21 thành viên còn thiếu (85 dòng) ------------------------------------ JsonConfigRepository có 18/34 thành viên công khai của AppConfig nên không tráo được. Chép nguyên ngữ nghĩa 21 cái còn lại: load, ms365_*, ext_connectors, connect_external, routing_mode_for, seeded_*, mcp_servers, teams, history, structure, monitoring_visibility, model_label, ca_bundle... Giờ 40/34, không thiếu gì. Không phải thiết kế mới — chừng nào 29 file còn gọi qua ctx.config thì repository phải trả lời được đúng các câu hỏi cũ. ROUTING_MODES lấy theo bản Delta (4 chế độ, có "fallback" từ R03-T03) chứ không theo bản main cũ 3 chế độ. Chép bản cũ là routing "fallback" âm thầm rơi về "off" sau khi Delta merge, không lỗi nào báo. Composition Root (R08-T10, phần đầu) ------------------------------------- presentation/shell/bootstrap.py: một chỗ duy nhất quyết định app dựng bằng mảnh nào. app.py::run giờ gọi build_context() thay cho AppConfig.load(). Đây cũng là chỗ ráp kho bí mật vào; máy không có keyring thì secrets=None và mọi thứ chạy như cũ. Kiểm trên dữ liệu thật ---------------------- Chạy lên máy tôi, migration tự chạy đúng như thiết kế: openai_compat 39 ký tự config.json -> Windows Credential Manager ollama giá trị bù nhìn, để nguyên trong file, không đẩy vào kho schema_version 1 -> 2 sao lưu config.json.v20260825-193206.bak Sau khi bật lại app và để nó ghi cấu hình, config.json vẫn sạch: api_key rỗng, không còn chuỗi nào có hình dạng khoá. scripts/audit_security.py sạch. Tiêu chí nghiệm thu A của plan (dòng 244) — "0 lưu trữ plaintext API Key trong JSON" — tới commit này mới thật sự đạt. 632 test xanh. check_dialogs, check_nav, check_design_parity đều qua. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cowork Local
Cowork Local is the internal AI cowork desktop platform owned by the Cowork Team. It provides the Cowork runtime, workspace and agent experiences, MCP/connectors, security controls, and model routing foundation.
The Cowork Team owns this product and its stable branch. The FSG AI Core Team contributes selected reusable capabilities through branches and Pull Requests; it is not the owner or final merger of this repository.
Quick start
The imported application is a Python/PySide6 package. Run it from the directory that contains cowork_local:
python -m cowork_local
The source snapshot does not include a complete runtime dependency manifest. Use the Cowork Team's supported runtime environment until that packaging contract is documented. The reliable automated test surface currently checked by CI is:
python -m pip install -r cowork_local/requirements-test.txt
python -m pytest cowork_local/tests -q
When already inside this repository, run python -m pytest tests -q.
Configuration and runtime data live under ~/.cowork_local/. Provider keys and local unlock codes must be supplied through environment variables or an approved secret manager; see .env.example.
Contributing
Start with START_CONTRIBUTING.md, then read CONTRIBUTING.md. Core AI task execution remains in fsg-ai-core-assets; source changes are reviewed as Pull Requests in this repository.
Security concerns should follow SECURITY.md. Ownership and completion rules are documented under docs/governance/.