# agentoffice
**Repository Path**: artifacttrace/agentoffice
## Basic Information
- **Project Name**: agentoffice
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: MulanPSL-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 1
- **Created**: 2026-07-11
- **Last Updated**: 2026-08-03
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# AgentOffice
AgentOffice 是一个基于 Rust 和 Slint 的本地桌面应用。它从 FusionHub 获取最近会话,通过 ArtifactTrace 启动 AOInbox Run,将聊天内容整理为候选任务、候选 Run、任务变更或外部智能体工作卡。
## 工作原理
AgentOffice 本身不负责判断聊天内容是不是任务。它负责确定性的编排工作,语义判断由 ArtifactTrace 中的 AOInbox Agent 完成。
一次 AOInbox 批次按以下方式工作:
1. 用户点击“提交 AOInbox”,或者自动收取定时器到期;
2. AgentOffice 读取设置,检查 FusionHub、ArtifactTrace、AOInbox Task 目录和 prompt;
3. 如果启用的来源需要候选工单判断,AgentOffice 先启动“任务语义编目”Run,更新 `07-17-任务语义编目/tasks.md`;
4. AgentOffice 从 FusionHub 获取时间窗口内的最近会话;
5. 会话按来源分组并切成 chunk,同时写入本批次的 request、snapshot 和任务索引;
6. AgentOffice 根据来源选择固定 route,并通过 ArtifactTrace 启动对应 Agent;
7. AOInbox Agent 读取本批次被授权的文件,将结果写入 AOInbox Task 的 `outputs` 或 `working` 目录;
8. AgentOffice 等待或刷新输出,对模型生成的 Markdown 做确定性校验和解析;
9. 候选结果显示在“任务信箱”。只有用户确认后,AgentOffice 才会创建 Task、创建 Run 或记录任务变更。
### 流程图
```mermaid
flowchart TD
Start["用户提交 AOInbox
或自动收取到期"] --> Preflight["读取设置并检查
连接、Task 目录和 Prompt"]
Preflight --> Catalog{"当前来源是否需要
候选工单判断"}
Catalog -- "是" --> CatalogRun["通过 ArtifactTrace 启动
任务语义编目 Run"]
CatalogRun --> CatalogFile["更新任务语义索引
07-17-任务语义编目/tasks.md"]
Catalog -- "否" --> Fetch
CatalogFile --> Fetch["从 FusionHub 获取最近会话"]
Fetch --> Prepare["按来源分组和切片
生成 request、chunk、snapshot 和索引"]
Prepare --> Route{"按来源选择固定 Route"}
Route -- "微信等人类聊天" --> HumanFacts["阿本提取 Facts
使用 fact-schema.md"]
HumanFacts --> HumanDecision["阿云生成候选工单
使用 chat-candidate-decision.md"]
Route -- "DeepSeek、Qwen、Kimi 等" --> AiDecision["阿云直接生成候选工单
使用 ai-chat-candidate-decision.md"]
Route -- "Codex、Claude" --> WorkCard["阿云提取外部工作卡
使用 coding-agent.md"]
HumanDecision --> Outputs["写入 AOInbox 输出文件"]
AiDecision --> Outputs
WorkCard --> Outputs
Outputs --> Validate["AgentOffice 确定性校验并解析 Markdown"]
Validate --> Inbox["在任务信箱展示候选结果"]
Inbox --> Confirm{"用户确认"}
Confirm -- "确认" --> Dispatch["创建 Task、启动 Run
或记录本地任务变更"]
Confirm -- "暂不处理" --> Keep["保留、停放或忽略候选"]
```
### 三类处理 Route
#### 1. 人类聊天
微信等人类聊天采用两个阶段,避免同一个 Agent 同时提取事实和做任务判断:
1. 阿本读取 request 中列出的 chunk;
2. 阿本根据 `fact-schema.md` 提取可核验 Facts,写入本批次的 `working/<批次>/facts.md`;
3. Facts Run 完成后,AgentOffice 再启动阿云;
4. 阿云读取 Facts、任务索引和任务语义索引;
5. 阿云根据 `chat-candidate-decision.md` 输出候选任务、候选 Run、任务变更或无动作结论。
#### 2. AI 对话
DeepSeek、Qwen、元宝、豆包、Kimi、ChatGPT 和 Gemini 等 AI 对话采用单阶段处理:
1. 阿云读取 request 授权的全部 chunk;
2. 同时读取本批次冻结的任务索引和任务语义索引;
3. 根据 `ai-chat-candidate-decision.md` 还原对话中的工作事项;
4. 输出候选任务、候选 Run、任务变更或无动作结论。
#### 3. 外部代码智能体
Codex 和 Claude 会话不生成普通候选工单,而是生成外部智能体工作进展卡:
1. 阿云读取 request 授权的 chunk;
2. chunk 信息不足时,按规则有限回溯 snapshot;
3. 根据 `coding-agent.md` 提取工作目的、当前进度、后续计划、阻塞和失败点;
4. 将工作卡写入 `outputs/external-agent-work.<来源>.<批次>.md`。
### 为什么需要任务语义编目
仅有 Task ID 和标题通常不足以判断一段新对话属于哪个已有 Task。“任务语义编目”Task 会将当前任务情况整理到 `tasks.md`,AOInbox 再将它与本批次的结构化任务索引一起使用:
- `task-index.json` 冻结本批次允许引用的 Task ID;
- `tasks.md` 提供这些 Task 的语义背景;
- AgentOffice 的本地校验器确保模型不能引用本批次索引之外的 Task。
模型负责语义匹配,AgentOffice 负责路径、批次、白名单和输出格式等确定性约束。
## 运行前准备
需要准备:
- Rust 工具链;
- 正在运行的 FusionHub;
- 正在运行的 ArtifactTrace;
- ArtifactTrace workspace 中的 AOInbox Task;
- ArtifactTrace workspace 中的“任务语义编目”Task。
## 首次设置
打开 AgentOffice 的“设置”页面,填写:
1. `FusionHub URL`,例如 `http://localhost:8866`;
2. `ArtifactTrace WS`,例如 `ws://127.0.0.1:8868/ws`;
3. `AOInbox Task 目录`。
点击“选择目录”,选择 AOInbox Task 本身,不要选择它下面的 `prompts` 目录。
示例:
```text
Windows:
D:\artifacttrace-workspace\tasks\07-12-aoinbox
macOS:
/Users/yourname/artifacttrace/tasks/07-12-aoinbox
```
点击“保存设置”。AgentOffice 会检查:
- 路径是否为可访问的绝对目录;
- 当前启用的数据源所需的 prompt 文件是否存在;
- prompt 文件是否为空。
设置保存在当前使用的 SQLite 数据库中。复制数据库到另一台电脑时,其中的绝对路径不会自动变化,需要重新选择目录。
## ArtifactTrace 目录约定
AOInbox Task 和“任务语义编目”Task 必须位于同一个 `tasks` 目录下:
```text
/
└── tasks/
├── 07-12-aoinbox/
│ ├── TASK.md
│ ├── prompts/
│ │ ├── fact-schema.md
│ │ ├── chat-candidate-decision.md
│ │ ├── ai-chat-candidate-decision.md
│ │ └── coding-agent.md
│ ├── inputs/
│ ├── outputs/
│ └── working/
└── 07-17-任务语义编目/
├── TASK.md
└── tasks.md
```
AgentOffice 根据所选 AOInbox Task 目录的父目录,自动查找:
```text
../07-17-任务语义编目/tasks.md
```
因此不需要再配置一条“任务语义编目”绝对路径,但 Task ID 当前固定为 `07-17-任务语义编目`。如果 ArtifactTrace 中使用了其他 Task ID,需要同步修改 AgentOffice 代码。
## Prompt 从哪里读取
每次提交 AOInbox 时,AgentOffice 会从所选 Task 的 `prompts` 目录读取规则:
| 文件 | 用途 |
| --- | --- |
| `fact-schema.md` | 从微信等人类聊天提取 Facts |
| `chat-candidate-decision.md` | 根据 Facts 生成候选工单 |
| `ai-chat-candidate-decision.md` | 从 AI 对话生成候选工单 |
| `coding-agent.md` | 从 Codex、Claude 等会话提取工作卡 |
修改这些文件后,下一批 AOInbox Run 会直接使用新内容,不需要重新编译 AgentOffice。
## 基本使用流程
1. 启动 FusionHub 和 ArtifactTrace;
2. 启动 AgentOffice;
3. 在设置页完成连接和 AOInbox Task 目录配置;
4. 在“任务信箱”点击“提交 AOInbox”;
5. 等待 AOInbox Run 完成并刷新输出;
6. 检查候选任务、候选 Run、任务变更和外部智能体工作卡;
7. 确认候选后再派发到 ArtifactTrace。