senclaw/ai-office

app Trụ sở điều hành cho công ty một người: Sếp giao việc, một đội AI tự phân công theo sơ đồ phụ thuộc, làm song song, dừng lại hỏi khi thiếu thông tin chỉ Sếp quyết được, và nộp báo cáo mà mọi con số đều trích nguồn để Sếp kiểm chứng lại. Kèm dashboard điều hành (mục tiêu quý, họp sáng/tối với Giám đốc vận hành AI, chi phí AI), bảng việc kanban AI-làm-Sếp-duyệt, văn phòng 3D isometric theo thời gian thực, và chợ 190 vai trò để lập đội theo đề bài. Soul của từng nhân sự xem và sửa được, kèm ô xem system prompt thật sự gửi đi và nút khôi phục bản gốc. Văn phòng tự học: mỗi lần Sếp duyệt hay trả lại, bài học được ghi vào hồ sơ kinh nghiệm của từng nhân sự cho lần sau.

Install

senclaw app install senclaw/ai-office

Verifies sha512 and SenClaw’s signature before writing to disk.

Documentation

AI Office — công ty một người 🏢

Space App mô phỏng ý tưởng "one-person company": Sếp (bạn) giao nhiệm vụ, một văn phòng AI gồm Trưởng phòng, Nghiên cứu, Nội dung, Phân tích, Kiểm định tự phân công, làm việc, bàn giao lẫn nhau và nộp lại Báo cáo tổng hợp — kèm mô phỏng văn phòng 3D isometric theo thời gian thực (agent đi lại bàn giao, speech bubble, trạng thái đang làm / ✓ xong / đi bàn giao).

Từ v1.1 app là một trụ sở điều hành (kiểu OPC HQ) với 5 tab:

  • ☀ Điều hành — bàn làm việc của Sếp: khối Nhân sự đang chờ Sếp trả lời (xem Leo thang bên dưới) nằm trên cùng, rồi 5 thẻ KPI (độ bám hướng = % việc mở có gắn mục tiêu, tiến độ mục tiêu quý, số việc chờ duyệt, nhịp điều hành = chuỗi ngày họp sáng, token AI trong tháng), nút Họp sáng (Giám đốc vận hành điểm tình hình + đề xuất 3 ưu tiên + cảnh báo việc lạc hướng) và Họp tối (đã làm / còn tồn / chuẩn bị ngày mai) — biên bản là một lượt LLM thật trên toàn cảnh văn phòng, lưu mỗi ngày một bản; kèm khối Mục tiêu quý (OKR rút gọn: key results tick ✓, tiến độ %).
  • 📋 Bảng việc — kanban HỘP VIỆC → ĐANG LÀM → CHỜ SẾP DUYỆT → HOÀN TẤT: AI làm, Sếp duyệt. Việc AI làm xong lên bàn Sếp chờ nghiệm thu; Sếp Duyệt (→ Hoàn tất) hoặc Trả lại kèm ghi chú — việc tự xếp lại hàng đợi và cả đội làm lại với ghi chú của Sếp trong context. Thẻ không gắn mục tiêu bị dán nhãn ⚠ lạc hướng. Việc có thể tạo vào thẳng Hộp việc (chưa chạy) rồi bấm ▶ Chạy sau.
  • 🏢 Văn phòng — sàn 3D isometric + feed bàn giao như trước.
  • 👥 Nhân sự — sơ đồ tổ chức: mẫu công ty dựng sẵn (xưởng nội dung / công ty phần mềm / quỹ đầu tư — mỗi mẫu gồm 2 đội, 8 nhân sự và mục tiêu quý gieo sẵn; áp mẫu không xoá gì, đội trùng tên bị bỏ qua), chợ nhân tài + tự lập đội theo đề bài (xem dưới), đội nhóm + biên chế (tuyển/tạm dừng/gán skill), trước là modal nay là tab riêng.
  • 📜 Lịch sử — sổ ghi mọi nhiệm vụ đã qua tay văn phòng (trước là modal).

Vận hành

Mỗi bước là một lượt LLM thật qua daemon bridge (llm.request): Trưởng phòng lập kế hoạch phân công, từng agent xử lý phần việc của mình với ngữ cảnh là các phần nó phụ thuộc (+ trí nhớ riêng, wiki, skill nắm giữ), Kiểm định soát rủi ro, Trưởng phòng tổng hợp báo cáo.

DAG phân công — phần việc độc lập chạy song song

Kế hoạch của Trưởng phòng không còn là một danh sách phẳng mà là một đồ thị: mỗi phần việc khai deps — những phần phải xong trước nó. Engine chạy theo đợt: mỗi vòng lấy ra các phần đã đủ điều kiện rồi chạy cùng lúc (tối đa 3, tắt bằng cờ parallel trong Cài đặt). Nghiên cứu và Phân tích không liên quan nhau thì làm song song, Nội dung đợi cả hai — thay vì cả phòng xếp hàng một người một lượt như trước.

deps chỉ được trỏ tới phần việc xuất hiện trước nó trong kế hoạch, nên DAG không thể có chu trình dù LLM trả về gì; vòng lặp ready-set luôn kết thúc. Kiểm định phụ thuộc mọi phần việc lá, tức là nó vẫn luôn là chốt chặn cuối.

Hệ quả về ngữ cảnh: một phần việc chỉ thấy kết quả của các phần nó phụ thuộc, không phải mọi thứ đã xong. Đó mới là mô hình đúng — hai phần chạy cùng lúc thật sự không thể thấy nhau.

Làm lại — Kiểm định trả việc về đúng người

Trước đây chỉ Sếp mới bắt làm lại được, và trả lại là xoá sạch mọi phần việc để cả đội chạy lại từ đầu. Nay Kiểm định có quyền trả về đúng một phần việc bằng marker [[LÀM LẠI: <key nhân sự> | lý do]]. Engine đặt phần việc đó và toàn bộ nhánh phụ thuộc vào nó về pending rồi chạy tiếp — nhánh song song không liên quan giữ nguyên kết quả, không tốn lượt LLM nào. Tối đa một vòng làm lại mỗi nhiệm vụ (MAX_REWORK_ROUNDS) để không quay vòng vô tận.

Leo thang — nhân sự hỏi Sếp giữa chừng

Trước đây Sếp chỉ gặp việc ở cuối đường (cột CHỜ SẾP DUYỆT), nên một giả định sai ở bước đầu vẫn ngốn hết các lượt LLM còn lại rồi mới lộ ra. Nay mỗi nhân sự được phép dừng lại hỏi: thiếu một thông tin mà chỉ Sếp quyết được thì nó trả về marker [[HỎI SẾP: câu hỏi | phương án A | phương án B]], engine bắt được sẽ

  1. ghi một dòng vào bảng escalations và đẩy việc sang trạng thái blocked — đội giữ nguyên bàn, không bốc việc mới đè lên (xem Db::BUSY_STATUSES);
  2. dựng thẻ câu hỏi trên tab Điều hành (và widget, và office_list_escalations);
  3. đứng chờ. Sếp trả lời → nhân sự làm tiếp ngay phần việc đang dở với câu trả lời trong context. Hết giờ chờ (mặc định 15 phút, đổi trong Cài đặt) → đội tự quyết và được yêu cầu ghi rõ giả định đã dùng ở cuối phần việc.

Mỗi phần việc chỉ được hỏi một lần — sau khi có câu trả lời là phải làm cho xong. Marker sót lại bị gỡ khỏi bàn giao nên không lọt vào báo cáo. Tắt toàn bộ cơ chế bằng cờ escalation trong Cài đặt.

Trích nguồn — Sếp kiểm chứng lại được mọi con số

Một báo cáo tự tin kiểu "biên lợi nhuận gộp 60–70%, tỷ lệ mua lặp lại >40%" mà không nói lấy ở đâu là thứ nguy hiểm nhất văn phòng có thể nộp: Sếp đem đi ra quyết định, và không có cách nào truy ngược. Nay mọi con số phải kèm nhãn [nguồn: …] ngay sau nó.

Danh sách nhãn được phép dựng động theo đúng những gì phần việc đó thật sự có trong tay (source_rules()) — liệt kê nhãn web: cho một nhân sự không bật công cụ chỉ là mời nó bịa đường link:

NhãnKhi nào có
[nguồn: wiki:<đường dẫn>]bật wiki và tra được tài liệu liên quan
[nguồn: tệp:<tên tệp>]bật workspace và Sếp có để tệp trong đó
[nguồn: web:<trang>]bật "worker dùng công cụ" và nhân sự có skill
[nguồn: TÊN ĐỒNG NGHIỆP]phần việc này phụ thuộc bàn giao của người khác
[nguồn: trí nhớ]bật trí nhớ riêng
[nguồn: ước lượng]luôn có — bắt buộc dùng khi con số do agent tự suy ra

Nhãn cuối là chỗ dựa quan trọng nhất: nó biến một con số bịa thành một con số được dán nhãn là phỏng đoán. Prompt nói thẳng — "một con số dán nhãn phỏng đoán còn dùng được, một con số bịa nguồn thì Sếp đem đi ra quyết định và trả giá".

Ba chốt chặn nối tiếp:

  1. Nhân sự kết bài bằng mục Nguồn, và bị cấm bịa tên báo cáo thị trường / hãng nghiên cứu / link mà nó không thực sự đọc được trong lượt đó.
  2. Kiểm định lấy việc rà số liệu không nguồn làm việc đầu tiên, và được quyền [[LÀM LẠI: …]] nếu phần lớn số liệu không nguồn hoặc có nguồn bịa.
  3. Trưởng phòng không được gỡ nhãn cho câu văn gọn, không được nâng ước lượng thành sự thật, và phải kết báo cáo bằng mục NGUỒN & ĐỘ TIN CẬY chia ba nhóm: kiểm chứng được / trí nhớ nội bộ / ước lượng — chưa kiểm chứng. Nhóm cuối chính là danh sách việc Sếp cần tự xác minh trước khi xuống tiền.

Biên bản họp sáng/tối cũng chịu ràng buộc tương tự: mọi nhận định phải truy được về bảng việc (nhắc việc thì kèm #id, nhắc số thì lấy đúng số đã cho), không được thêm doanh thu hay mốc thời gian không có trong toàn cảnh.

Trên giao diện, nhãn nguồn hiện thành chip nhỏ; chỗ ước lượng mang thêm ⚠ để Sếp quét mắt là ra ngay danh sách cần kiểm.

Chưng cất kinh nghiệm — phán quyết của Sếp không bay hơi

Ghi chú "trả lại" của Sếp trước đây chỉ sống đúng một nhiệm vụ: nó vào redo_ctx cho lần chạy lại rồi mất. Nhiệm vụ sau, cùng nhân sự, cùng lỗi.

Nay mỗi lần Sếp duyệt hoặc trả lại, một lượt LLM chạy ở nền đọc lại toàn cảnh nhiệm vụ vừa khép (phần việc từng người, ghi chú của Kiểm định khi bắt làm lại, phán quyết + ghi chú của Sếp) và rút bài học cụ thể, hành động được cho từng nhân sự đã tham gia. Bài học vào agents.experience, và agent_system() nhét thẳng chúng vào system prompt của lần sau:

BÀI HỌC BẠN ĐÃ RÚT RA từ các nhiệm vụ trước — bám sát, đừng lặp lại lỗi cũ:
- Luôn ghi nguồn cho mọi số liệu thị phần (đã vấp 3 lần)

Một lượt LLM cho cả đội, không phải mỗi người một lượt: rẻ hơn N lần và mô hình nhìn được ai làm gì nên quy lỗi đúng người hơn. Prompt yêu cầu chép nguyên văn bài học cũ khi vấn đề lặp lại, nhờ vậy Db::merge_lessons đếm được số lần vấp bằng khớp chính xác. Hồ sơ giữ tối đa 6 bài học (ưu tiên bài vấp nhiều nhất) để không phình theo số nhiệm vụ.

Bài học vấp đủ 3 lần thì không còn là chuyện riêng của một người: nó được ghi vào wiki/ai-office/playbook/… để cả văn phòng — kể cả người mới tuyển từ chợ nhân tài — đọc được. Tắt toàn bộ bằng cờ experience trong Cài đặt.

Lưu ý cài đặt: ảnh chụp task + steps phải lấy trước khi gọi Db::return_task — hàm đó xoá sạch step để Trưởng nhóm phân công lại, nên đọc lại từ DB trong tác vụ nền sẽ chỉ thấy một nhiệm vụ rỗng, đúng lúc tín hiệu học quý nhất thì không còn gì để học.

Soul — persona chi phối hành vi, xem và sửa được

agent.prompt là thứ điều khiển một nhân sự mạnh nhất: tới 6.000 ký tự persona so với một dòng duty. Trước 1.3.0 nó là hộp đen — chỉ ghi được lúc tuyển từ chợ, rồi không xem cũng không sửa được ở đâu.

Nay có ba đường: dialog Chi tiết nhân sự, GET/PUT /api/agents/:key/soul, và MCP office_get_soul / office_set_soul.

Hai chi tiết quan trọng hơn bản thân ô nhập:

  • **effective** — system prompt THẬT SỰ gửi đi, dựng bằng đúng agent_system() lúc chạy nhiệm vụ. Soul chỉ là một mảnh; khung văn phòng, kỹ năng nắm giữ, bài học đã rút và luật chốt tiếng Việt do engine ghép vào. Không có ô xem này thì sửa soul là sửa mù.
  • **original** — persona gốc từ chợ. talent đã ghi nguồn và danh mục nằm trong binary, nên bản gốc luôn lấy lại được; UI hiện nhãn "đã sửa khác bản gốc" kèm nút khôi phục. Đây là chỗ đối chiếu với OpenOPC lộ ra thiếu sót: nó giữ persona dạng prompt_refs: list[str] nên sửa là thêm lớp, bản gốc còn nguyên; ở đây soul là một chuỗi, sửa là ghi đè — mất đường lùi nếu không có trường này.

Từ chối sửa khi đội đang chạy nhiệm vụ (409): nửa nhiệm vụ theo bản cũ, nửa theo bản mới thì kết quả không truy được về đâu. Trần 8.000 ký tự — soul đi vào MỌI lượt LLM của người đó, dài là tốn thật chứ không tốn một lần.

Đối chiếu với OpenOPC: khái niệm khớp (template_id ↔ talent, inline prompt được _looks_like_prompt_path() hỗ trợ chính thức, ghép nhiều lớp lúc chạy). Phần sửa từng nhân viên thì ai-office có mà OpenOPC không — TalentService bên đó chỉ đọc prompt_refs, còn TalentDetailModal chỉ xem và tuyển.

Chợ nhân tài & tự lập đội

Biên chế mặc định chỉ có 5 vai trò chung chung. Chợ nhân tài bổ sung 190 vai trò dựng sẵn (marketing, kỹ thuật, sản phẩm, thiết kế, bán hàng, chiến lược, tài chính, kiểm định…), mỗi vai trò kèm một persona đầy đủ. Người tuyển từ chợ mang persona đó vào thẳng system prompt của mình (agents.prompt), thay vì chỉ một câu mô tả vai trò — đây là khác biệt lớn nhất về chất lượng đầu ra.

Persona giữ nguyên văn tiếng Anh vì mô hình bám persona tiếng Anh tốt hơn hẳn bản dịch; đổi lại agent_system() chốt cứng một dòng CRITICAL OUTPUT RULE: write every answer in VIETNAMESE, nếu không cả phòng sẽ quay sang trả lời tiếng Anh theo persona. Biên chế mặc định (prompt rỗng) vẫn chạy khung tiếng Việt như cũ.

Tự lập đội theo đề bài: Sếp mô tả việc → một lượt LLM đọc đề bài cùng chỉ mục chợ → đề xuất tên đội và tối đa 5 vai trò kèm lý do từng người. Đây là đề xuất, chưa tạo gì: Sếp bỏ tick ai không cần rồi mới bấm lập đội. Vai trò LLM bịa ra (không có trong danh mục) bị lọc thẳng, và tên hiển thị luôn lấy từ danh mục chứ không tin chữ LLM trả về.

Nguồn danh mục là 190 persona của HKUDS/OpenOPC, phần thân cắt ở ranh giới ## dưới 6000 ký tự — xem NOTICE.md về nguồn gốc và tình trạng giấy phép.

Biên chế linh hoạt: nhân sự tự nhận nhiệm vụ (luôn có phần việc) hoặc tăng cường (chỉ được giao khi nhiệm vụ cần chuyên môn đó); có thể tạm dừng / kích hoạt từng nhân sự và gán skill / sub-agent (persona) mà nhân sự nắm giữ — lấy từ inventory của daemon (/api/skills, /api/cowork/personas).

Kiến trúc

Một binary Rust (axum + rusqlite) phục vụ tất cả trên port 4420:

  • / — web UI (React + Vite, build sẵn trong web_dist/)
  • /api/* — REST: agents, tasks (+/approve, /return, /start, PATCH/DELETE), tasks/:id/events (UI poll mỗi giây), board, dashboard, goals, meetings, escalations (+/:id/answer), presets (+/:key/apply), talents (+/hire), recruit (+/apply), stats, llm-info
  • /api/mcp/sse — MCP server **ai-office-mcp** (JSON-RPC 2.0 qua HTTP+SSE), 30 tools office_*: giao việc (office_create_task — nhận goal_id, start:false để vào Hộp việc), theo dõi (office_status, office_get_task), lấy báo cáo (office_get_report), bảng việc & duyệt (office_board, office_approve_task, office_return_task, office_start_task, office_set_task_goal), điều hành (office_dashboard, office_run_meeting — họp sáng/tối), mục tiêu quý (office_list_goals, office_add_goal, office_update_goal), biên chế (office_list_agents, office_add_agent, office_remove_agent, office_update_agent — gồm enabled / auto_assign / skills), leo thang (office_list_escalations, office_answer_escalation — trả lời ngay trong chat, không cần mở app), mẫu công ty (office_list_presets, office_apply_preset), chợ nhân tài & tự lập đội (office_list_talents, office_hire, office_recruit, office_recruit_apply), sổ sách (office_stats, office_list_tasks), đội nhóm (office_list_teams, office_add_team).

DB tại ~/.senclaw/space-apps/ai-office/ai-office.db: teams, agents (thêm cột talent/prompt), tasks (thêm goal_id/approval/boss_note), steps, events, goals, meetings, escalations, settings. steps mang thêm deps (cạnh DAG) và rework_note; agents mang thêm talent / prompt / experience. Danh mục chợ nhân tài không nằm trong DB — nó là src/talents.json biên dịch thẳng vào binary.

Vòng đời một việc: inbox (tùy chọn) → pending → planning/running/review (↔ blocked khi nhân sự hỏi Sếp) → done + approval='waiting' (chờ Sếp) → Sếp duyệt approval='approved' hoặc trả lại (returned + ghi chú → tự re-queue, các step cũ xoá để Trưởng nhóm phân công lại). status='done' vẫn là mốc "AI đã xong" như cũ nên skill/agent chờ báo cáo không đổi hành vi.

Trí nhớ riêng & kho tài liệu (cần daemon SenClaw mới)

  • Mỗi nhân sự có knowledge space riêng ai-office:<key> trong hệ Knowledge của daemon: ở LIVE mode agent recall trí nhớ của mình trước khi làm và lưu memo sau khi xong — trí nhớ các agent độc lập, không lẫn nhau. Xem trong dialog Chi tiết của Nhân sự, hoặc trên desktop_app (Knowledge → dropdown chọn space).
  • Wiki là kho tài liệu của văn phòng: trước khi làm việc phòng tra cứu /api/wiki/search, báo cáo tổng hợp tự lưu vào wiki/ai-office/… (event 📚).
  • Biên chế động: thêm/sửa/xoá nhân sự (tối đa 7 bàn) qua UI hoặc MCP (office_add_agent, office_remove_agent); engine phân công theo roster hiện tại.

Kèm theo:

  • personas/ — 5 persona (manager/research/content/analysis/qa) được daemon cài khi install app; dùng được ngay với Cowork/DAG dispatch (persona:ai-office__office-*).
  • skills/ — ai-office-run (giao việc & chờ báo cáo), ai-office-status (xem tiến độ/báo cáo).
  • widget office-status cho dashboard.

Dev

cargo run -p ai-office            # backend trên :4420 (PORT env để đổi)
cd apps/ai-office/web && npm run dev   # Vite dev server, proxy /api → :4420

Đóng gói

apps/ai-office/scripts/pack.sh    # build web + binary → release/ + ai-office-app.zip

Cài zip qua Space Apps của SenClaw; daemon tự chạy binary, health-check /api/status, proxy iframe và auto-register MCP ai-office-mcp.

Declared permissions

{
  "network": [
    "127.0.0.1"
  ],
  "exec": [
    "./ai-office"
  ]
}

Declared by the publisher, not enforced by SenClaw. The CLI compares this against what you already have installed and asks before anything widens.

Published by

@senclawtrusted
benji
51 packages · 21 downloads · member since 2026-07 · GitHub since 2015-06

The checkmark means SenClaw confirmed who this publisher is. It says nothing about whether their packages are safe.

About

Owner@senclaw
Latest1.3.0
Downloads2

Versions

VersionTagsArtifactsPublished
1.3.0latestdarwin-arm64, linux-x64, win32-x642026-08-15
1.2.0darwin-arm64, linux-x64, win32-x642026-08-12
1.0.2darwin-arm64, linux-x64, win32-x642026-08-09
1.0.1darwin-arm64, linux-x64, win32-x642026-08-07
1.0.0darwin-arm642026-07-20

Artifacts · 1.3.0

PlatformFormatSignatureFileSize
darwin-arm64zipunsignedai-office-app.zip3508 KB
linux-x64zipunsignedai-office-app.zip3883 KB
win32-x64zipunsignedai-office-app.zip3826 KB

Unsigned builds require sign-in to download and are not distributed to the auto-updater, because unsigned executables from a new domain get flagged as unsafe. Sign and notarize (macOS) or Authenticode-sign (Windows) to distribute publicly.

Auto-update endpoints

For a Tauri app — add to tauri.conf.json:

"endpoints": ["https://hub-store.bacnd.com/api/v1/updates/tauri/senclaw/ai-office/{{target}}/{{arch}}/{{current_version}}"]

For an electron-updater app — generic provider URL:

https://hub-store.bacnd.com/updates/senclaw/ai-office/stable

Only signed/notarized artifacts are offered as updates — a client fetches the update without credentials, and unsigned binaries are not publicly downloadable.

Something wrong with this package?

Report this package

Report this package

Tell us what is wrong and a moderator will look at it. Be specific — a report that names a version and a behaviour can be checked in minutes; one that says “looks sketchy” cannot be acted on at all.

Not about this package? Contact us instead. What happens to a report is described in reporting and moderation.

API: GET https://hub-store.bacnd.com/api/v1/packages/senclaw/ai-office