feat: wire dispatch execution and device import flows

This commit is contained in:
kris
2026-03-30 11:08:43 +08:00
parent 3b2bf59b65
commit 745b47e812
16 changed files with 1545 additions and 13 deletions

View File

@@ -86,6 +86,10 @@
- `POST /api/v1/projects/[projectId]/attachments` 正常,已支持图片 / 视频 / 文件上传与附件消息写入
- `POST /api/v1/projects/[projectId]/attachments/[attachmentId]/analyze` 正常,已支持手动触发主 Agent 附件分析
- `POST /api/v1/group-chats` 正常,已支持从会话首页直接发起独立群聊
- `GET /api/v1/projects/[projectId]/dispatch-plans` 正常,已支持读取群聊最新主 Agent 推荐下发方案
- `POST /api/v1/projects/[projectId]/dispatch-plans/[planId]/confirm` 正常,已支持把推荐目标确认成真正的线程执行单
- `GET /api/v1/devices/[deviceId]/import-draft` 正常,已支持读取设备导入草稿与最新决议
- `POST /api/v1/devices/[deviceId]/import-draft/select|review|apply` 正常,已支持设备候选线程勾选、导入决议和落地成真实聊天窗口
- `GET /api/v1/attachments/[attachmentId]/download` 正常,已支持会话鉴权下载和 task token 下载
- `POST /api/auth/login` 正常,会写入 `boss_session`
- `boss_session` 当前默认保持 30 天
@@ -129,6 +133,8 @@
- 项目聊天页当前已经改成聊天优先,只保留 `项目目标 / 版本记录` 两个轻入口线程预算、handoff、运维与转发能力仍保留数据和深层活动页但不再出现在主聊天面
- 线程改名当前遵循微信最新逻辑:从聊天页右上角进入会话信息页,再进行改名
- 当前已支持从单线程会话发起独立群聊:原会话保留,新群聊自动命名并可在群资料页改名
- 当前群聊编排主链已经补到第一阶段:群聊消息先进入主 Agent主 Agent 生成推荐下发方案,用户确认后再创建执行单;执行完成后线程原始结果会回群,主 Agent 再追加汇总
- 当前设备导入主链已经补到第一阶段:设备 heartbeat 可上报真实候选线程,系统会生成导入草稿;用户勾选后可生成导入决议,并把选中的线程真正落成聊天窗口
- 当前已支持微信式消息转发:长按消息可直接 `转发 / 多选 / 复制 / 删除`,单条消息转发显示为普通转发消息,多条消息转发显示为聊天记录卡片
- 当前已支持聊天附件主链:原生聊天框左侧 `+` 会打开底部抽屉,支持图片 / 视频 / 文件发送;图片 / PDF / 文本默认自动进入主 Agent 附件分析,视频 / Office / 大文件默认手动触发
- 当前附件与存储配置页位于 `我的 > 附件与存储`:默认使用服务器文件存储,用户可按账号切到阿里 OSS 私有桶;下载链会优先使用附件上传时固化的 OSS 快照,避免用户后续改配置后旧附件失效
@@ -205,6 +211,7 @@ npm run apk:debug
- 服务器邮件栈已部署完成,应用内也已经支持 email 模式,但默认开关还没切到 email
- OTA 版本中心、检查更新、执行升级和 APK 包下载已接通,但当前仍是文件型状态驱动的 MVP
- APP 实时日志同步、主 Agent 日志镜像、SSE 自动刷新和 Skill 同步页已经接通,但日志检索、告警和远程 Skill 管理仍未做
- 设备导入主链已补上后端闭环,但前台页面还没有把“候选勾选 / 决议预览 / 应用导入”完整串到 Web 和原生 Android需要后续 UI 接线
- 数据库尚未替代文件存储
- 域名入口的代理 / 分裂 DNS 结构仍未完全摸清
- 当前只支持服务器文件存储和阿里 OSS尚未接更多对象存储或更丰富的附件详情页

View File

@@ -247,6 +247,7 @@
- 写入 `data/boss-state.json`
- 更新设备状态
-`pairingCode` 合法,则 claim 设备绑定草稿并返回 token
- 若携带 `projectCandidates[]`,则会同步生成或刷新对应设备的 `deviceImportDraft`
#### `POST /api/projects/[projectId]/goals/[goalId]/toggle`
@@ -308,6 +309,7 @@
- 当前主链路优先走 `Master Codex Node``task queue -> local-agent -> codex exec -> complete`
- 如本机节点未接通,可切到 `OpenAI API` 容灾账号
- 群聊项目当前会带上 `collaborationGate`,用于标明当前是否需要先经主 Agent / 用户审批
- 群聊文本消息当前还会返回 `dispatchPlan / dispatchRecommendation`,用于展示主 Agent 推荐的线程下发方案
#### `GET /api/v1/projects/[projectId]/participants`
@@ -349,6 +351,24 @@
- 群名会按成员线程自动生成
- 创建完成后仍可在群资料页改名
#### `GET /api/v1/projects/[projectId]/dispatch-plans`
- 用途:读取当前群聊最近一批主 Agent 推荐下发方案
- 当前行为:
- 只返回当前群聊关联的 dispatch plan
- 会附带目标线程列表、审批状态、已确认目标和最近一次确认人
#### `POST /api/v1/projects/[projectId]/dispatch-plans/[planId]/confirm`
- 用途:由用户确认主 Agent 推荐的下发目标
- 输入:
- `approvedTargetProjectIds[]`
- 当前行为:
- 只允许对 `pending_user_confirmation` 的 dispatch plan 执行确认
- 确认后会创建真正的 `dispatchExecution`
- 会写入一条 `kind=system_notice` 的群聊系统消息
- 同时会为每个执行单创建 `taskType=dispatch_execution` 的主 Agent 任务,等待对应设备的 local-agent 认领
#### `GET /api/v1/accounts`
- 用途:返回 AI 账号列表、当前主控身份和切换历史
@@ -514,6 +534,38 @@
- 用途修改设备名称、头像、账号、状态、endpoint、备注和项目列表
#### `GET /api/v1/devices/[deviceId]/import-draft`
- 用途:读取某台设备最新的项目候选导入草稿
- 当前行为:
- 返回最新 `deviceImportDraft`
- 如果已经做过导入决议,还会一并返回最新 `deviceImportResolution`
#### `POST /api/v1/devices/[deviceId]/import-draft/select`
- 用途:提交用户勾选的候选线程
- 输入:
- `selectedCandidateIds[]`
- 当前行为:
- 只接受当前导入草稿里真实存在的候选项
- 提交后会把草稿推进到 `pending_resolution`
#### `POST /api/v1/devices/[deviceId]/import-draft/review`
- 用途:生成主 Agent 风格的设备导入决议
- 当前行为:
- 会基于已勾选候选生成 `deviceImportResolution`
- 当前决议为服务端同步 heuristic 版
- 决议会区分 `create_thread_conversation | attach_existing | skip`
#### `POST /api/v1/devices/[deviceId]/import-draft/apply`
- 用途:应用导入决议,把选中的线程真正落成聊天窗口
- 当前行为:
- `create_thread_conversation` 会生成新的单线程会话
- `attach_existing` 会补充现有会话的设备 / 线程映射
- 应用后草稿和决议都会变成 `applied`
#### `GET /api/v1/devices/[deviceId]/skills`
- 用途:读取指定设备已经同步上来的 Skill 列表
@@ -628,8 +680,13 @@
- `replyBody`
- `errorMessage`
- `requestId`
- `dispatchExecutionId`
- `targetProjectId`
- `targetThreadId`
- `rawThreadReply`
- 当前行为:
- `completed` 时把真实主 Agent 回复写回 `master-agent` 项目消息账本
- `taskType=dispatch_execution` 时,会把线程原始结果镜像回群聊,再追加一条主 Agent 汇总,并更新对应执行单状态
- `failed` 时写入 relay 失败消息,并更新 AI 账号健康状态
- 当前保护:要求 `x-boss-device-token` 或匹配登录会话
@@ -661,6 +718,8 @@
- local-agent 会周期性请求 `POST /api/v1/master-agent/tasks/claim`
- 认领到任务后会执行本机 `codex exec`
- 执行完成后会调用 `POST /api/v1/master-agent/tasks/[taskId]/complete`
- 对群聊下发链路,认领到的 `dispatch_execution` 任务会带 `dispatchExecutionId / targetProjectId / targetThreadId`
- local-agent 回写完成时会同时带上 `rawThreadReply`,服务端据此把线程原始结果和主 Agent 汇总回写到群聊
## 5. 当前状态存储
@@ -687,6 +746,10 @@
- `deviceSkills`
- `appLogs`
- `masterAgentTasks`
- `dispatchPlans`
- `dispatchExecutions`
- `deviceImportDrafts`
- `deviceImportResolutions`
- `opsFaults`
- `opsRepairTickets`
- `opsRepairVerifications`

View File

@@ -1,6 +1,6 @@
# Boss 当前运行与部署状态
更新时间:`2026-03-29`
更新时间:`2026-03-30`
## 1. 本地状态
@@ -97,6 +97,8 @@ cd /Users/kris/code/boss
- 项目详情页当前已补齐微信式消息转发:长按消息会弹出 `转发 / 多选 / 复制 / 删除 / 取消`;单条消息直接进入统一会话选择页,多选消息会进入合并转发链路
- 原生转发目标页当前统一由 `ForwardTargetActivity` 承接;一次只允许选择一个目标会话,目标可为单线程会话、群聊、`主 Agent``审计对话`
- 当前单条消息转发会在目标会话中显示为普通转发消息,并保留 `forwardSource`;多条消息会落成 `forward_bundle` 聊天记录卡片,并保留来源会话、时间范围和摘要条目
- 当前群聊编排主链已补上第一轮闭环:群聊文本消息会先进入主 Agent 生成推荐下发方案;用户确认后会创建真正的线程执行单,并写入系统通知;执行完成后会把线程原始结果镜像回群聊,再追加一条主 Agent 汇总
- 当前设备导入主链也已补上第一轮后端闭环:`heartbeat` 可上报真实项目候选,服务端会生成 `deviceImportDraft`;用户可提交勾选结果、生成导入决议,再把选中的线程真正落成聊天窗口
- 会话页、设备页、技能页和项目详情页当前都通过 `/api/v1/events` 的 SSE 自动刷新
- 我的页当前保留 `账号与安全 / 设置 / 运维与修复 / AI 账号 / 技能 / 关于` 六个一级入口;`AI 账号` 支持查看 `主 GPT / 备用 GPT / API 容灾`,并明确主链路优先走已经在绑定电脑上登录 `ChatGPT Plus / Codex``Master Codex Node`
- 主 Agent 当前真实对话链路已验证通过:`Boss Web -> /api/v1/projects/master-agent/messages -> master-agent task queue -> local-agent -> codex exec -> /complete -> 项目消息账本`
@@ -136,6 +138,8 @@ cd /Users/kris/code/boss
- `2.5.3` 已把聊天页里自己发出的消息顶部元信息收成只显示时间,不再重复 `你 · 时间`,文本消息、附件卡片和聊天记录卡片都会共用这条规则
- 当前附件分析任务已带受控 `task token` 下载链接和文本摘录:本地开发环境会跟随请求 origin 生成链接,生产环境默认走 `https://boss.hyzq.net`
- `2.5.x` 当前已补上会话首页独立建群入口:可以不从单线程聊天内部出发,直接在会话首页右上角 `+` 建立新群聊;同时已把多个原生自定义 top bar 页面统一纳入状态栏安全区处理
- 当前 `local-agent` 已能回写带 `dispatchExecutionId / targetProjectId / targetThreadId / rawThreadReply` 的任务完成载荷,群聊分发执行结果不再只停留在主 Agent 队列
- 当前设备导入决议仍是服务端同步 heuristic 版,下一阶段可再升级成真正通过 `local-agent -> codex exec` 参与理解的主 Agent 决议
## 2. 服务器状态
@@ -216,6 +220,8 @@ cd /Users/kris/code/boss
- APP 实时日志当前已能同步到主 Agent 会话,但还没有单独的日志检索、分页和告警升级规则
- Skill 清单当前按设备同步和展示已经可用,但还没有“安装 / 卸载 Skill”这种远程管理能力
- 服务器侧主 Agent 实时回复依赖被绑定设备的 `local-agent` 在线并能执行 `codex exec`;如果设备离线,只能保留任务或走 API 容灾账号
- 设备导入主链的后端状态机已经跑通下一阶段重点从“纯后端打通”切到“Web / Android 把候选勾选、决议预览和应用导入完整接到前台”
- 设备导入的后端主链已经打通,但 Web / Android 仍未把“候选项目勾选与导入应用”完整接进前台页面;当前主要可通过 API 和后续 UI 接线验证
- API 容灾当前由用户在 APP 的 `我的 > AI 账号` 页面自行配置 `OpenAI API` 账号,不再依赖服务器预置 Key
- 原生 Android 的二级深层页虽然仍保留 `ProjectForwardActivity / ThreadDetailActivity / OpsCenterActivity` 等能力,但它们已经退出主 UI 正面;后续如再加入口,需继续遵守“一级微信式,复杂能力下沉”的规则
- Android 本地 Gradle 验证当前必须串行执行;如果并发跑 `testDebugUnitTest / compileDebugJavaWithJavac / assembleDebug`,会导致中间产物互踩并出现假失败

View File

@@ -37,6 +37,22 @@
本轮开发默认先做 `WP1 + WP2`,随后再进入 `WP3 + WP4`
截至 `2026-03-30` 的最新进度补充:
- `WP1` 已持续回写到 `README.md``current_runtime_and_deploy_status_cn.md``api_and_service_inventory_cn.md`
- `WP2` 已完成到“可运行闭环”的第一阶段:
- 群聊文本消息会先进入主 Agent 生成 `dispatchPlan`
- 用户已可通过确认接口批准目标线程
- 系统会创建真正的 `dispatchExecution`
- local-agent 已可认领 `dispatch_execution` 任务
- 执行完成后会把线程原始结果回群,并补一条主 Agent 汇总
- `WP3` 已完成到“后端闭环第一阶段”:
- 设备 heartbeat 可上报真实项目候选
- 服务端会生成 `deviceImportDraft`
- 用户可提交候选勾选结果
- 系统可生成导入决议并应用到真实聊天窗口
- 下一阶段重点转为 Web / Android 页面接线和真机回归
适用范围:
- 单主 Agent