0757d07521d203b3387bc5d92912331570807cb3
Boss 控制台 MVP
这个仓库当前已经收口成“下一条 AI 线程不需要重新摸索结构和部署方式”的状态。真实实现是一套基于 Next.js App Router 的移动控制台,加一个本地 device-agent,持久化仍然是 data/boss-state.json,部署链路是 systemd + Caddy + launchd。
先读哪里
按这个顺序看,交接成本最低:
docs/architecture/ai_handoff_index_cn.mddocs/architecture/repo_map_cn.mddocs/architecture/current_runtime_and_deploy_status_cn.mddocs/architecture/api_and_service_inventory_cn.mddocs/architecture/boss_server_connection_and_deploy_cn.mdprompts/codex_fullstack_build_and_deploy_prompt_cn.md
当前有效目录
src/app:当前 Web 页面和 API 路由src/components:共享 UI 和交互组件src/lib:文件型状态模型和聚合投影视图src/lib/execution:当前已落地的执行底座抽象层,包含ExecutionBackend / PromptAssembler / PermissionPolicy / RemoteRuntimeAdapter / OrchestrationBackend默认实现local-agent:本地设备端心跳 + thread-context 上报服务deployment:Caddy、systemd、launchd配置scripts:本地启动、安装、远端部署脚本design:Pencil 原稿和导出图android:原生 Android 客户端工程和 APK 构建目录docs/architecture:当前权威中文文档prompts:交给其他 Codex 线程的提示词
当前仅作参考或占位的目录
docs/source-material:历史材料,不是运行时真相deploy:空占位目录,不参与当前部署src/boss_control:空占位目录,不参与当前运行src/boss_device_agent:空占位目录,不参与当前运行
当前运行状态(2026-04-03)
本地:
npm run lint已通过npm run build已通过GET http://127.0.0.1:3000/api/health正常GET http://127.0.0.1:3000/api/v1/conversations正常GET http://127.0.0.1:3000/api/v1/projects/master-agent正常,主 Agent 项目页已能显示最近 APP 日志GET http://127.0.0.1:3000/api/v1/accounts正常,已返回主 GPT / 备用 GPT / API 容灾账号摘要POST http://127.0.0.1:3000/api/v1/accounts/master-codex-primary/validate正常,已验证会明确提示“主 GPT 不在手机里直接登录”,并校验绑定设备在线状态POST http://127.0.0.1:3102/api/v1/accounts/onboard/master-node正常,已验证会保存 Master Codex Node 绑定信息并返回显式登录指引POST http://127.0.0.1:3102/api/v1/accounts/onboard/openai-api正常,已验证会对 API Key 做真实 OpenAI 探针校验;无效 Key 会返回真实错误GET http://127.0.0.1:3000/api/v1/devices/mac-studio/skills正常,已返回本机同步 Skill 列表POST http://127.0.0.1:3000/api/auth/login正常,会写入boss_sessionCookieGET http://127.0.0.1:3000/api/auth/session正常POST http://127.0.0.1:3000/api/auth/restore正常,已验证可用原生 restore token 恢复登录态POST http://127.0.0.1:3000/api/v1/projects/master-agent/messages正常,已验证可通过Mac Studio local-agent -> 本机 Master Codex Node -> 回写项目账本返回真实主 Agent 回复POST http://127.0.0.1:3000/api/v1/projects/[projectId]/messages正常,普通单线程会话当前会返回conversation_reply任务,并等待绑定设备上的真实 Codex 线程回写POST http://127.0.0.1:3000/api/auth/logout正常,退出后访问受保护/api/v1/*会返回401GET http://127.0.0.1:3000/api/v1/user/ota/package正常,当前会返回最新 APK 包- 当前这台开发机的
launchd常驻local-agent已恢复:GET http://127.0.0.1:4317/health现在可在数十毫秒内返回,且在手动 heartbeat 执行期间仍能正常回包 - 当前 Boss 已新增
src/lib/execution/执行底座抽象层;当前生产主链仍然沿用local-agent -> codex exec resume,只是执行责任已开始通过ExecutionBackend / PromptAssembler / PermissionPolicy / RemoteRuntimeAdapter / OrchestrationBackend默认实现收束 - 当前
claw-code已以最小ClawBackendAdapter形式接入执行底座,但默认关闭;只有在显式配置BOSS_CLAW_*且可用性探测通过时,master-agent当前对话里才会出现并允许选择claw-runtime - 如果历史上已经保存过
backendOverride=claw-runtime,但当前Claw Runtime不可用,运行时会自动回退到默认后端,并在前台显示明确原因 - 当前
oh-my-codex已以最小OmxTeamBackendAdapter形式接入执行底座,但默认关闭;当前已经接到 Web 群聊详情页 / 原生群资料页的编排后端选择卡,可在Boss Native与OMX Team间切换,OMX 不可用时会自动回退到默认后端并明确提示原因 - 当前仓库已自带一个本地 OMX smoke runtime:
scripts/omx-team-smoke.mjs。在还没有真实oh-my-codex可执行文件时,可以先用它验证OmxTeamBackendAdapter -> selector -> dispatch_execution -> 回写群聊账本这条链 - 当前仓库已自带一个本地 smoke runtime:
scripts/claw-runtime-smoke.mjs。在还没有真实claw-code可执行文件时,可以先用它验证ClawBackendAdapter -> backendOverride -> 异步回流整条链 GET http://127.0.0.1:4317/api/v1/skills正常,已返回本机扫描到的 Codex SkillPOST http://127.0.0.1:4317/api/v1/heartbeat正常,且会顺带触发thread-context上报launchd已加载:~/Library/LaunchAgents/com.hyzq.boss.local-agent.plist
服务器:
- 服务器地址:
106.53.170.158 - 代码路径:
/opt/boss boss-web.service正常caddy.service正常postfix.service正常dovecot.service正常GET http://127.0.0.1:3000/api/health正常GET http://127.0.0.1:3000/api/v1/conversations正常
域名和 HTTPS:
- 服务器本机
dig +short boss.hyzq.net返回106.53.170.158 - 服务器本机
curl --resolve boss.hyzq.net:443:127.0.0.1 https://boss.hyzq.net -I返回307并跳转到/auth/login - 当前本机网络
dig +short boss.hyzq.net仍返回198.18.1.188 - 当前本机网络
curl -I http://boss.hyzq.net返回308 - 当前本机网络
curl -I https://boss.hyzq.net返回HTTP/2 307并跳转到/auth/login - 当前本机网络
curl https://boss.hyzq.net/api/health返回{"ok":true,...} - 当前本机网络
curl https://boss.hyzq.net/api/v1/conversations已返回真实聚合数据 - 当前本机网络
nc -vz boss.hyzq.net 25 587 993全部成功
当前结论更新为:
- 当前网络下
boss.hyzq.net的 HTTP/HTTPS 已可达 Caddy/TLS和外部443路径都已经能实际返回页面跳转- 公网域名下的 Web API 也已经能实际返回健康探针和业务数据
- 服务器上的
Postfix + Dovecot已部署完成,公网25 / 587 / 993当前也已经可达 - 但当前网络下
dig仍显示198.18.1.188,说明这里可能存在代理层、分裂 DNS 或中间入口,不要再把这个解析值自动当成错误配置
Android APK:
- 已生成 Android debug APK:
android/app/build/outputs/apk/debug/app-debug.apk - 已生成 Android signed release APK:
android/app/build/outputs/apk/release/app-release.apk npm run apk:release还会额外产出带版本号的文件:android/app/build/outputs/apk/release/boss-android-v{versionName}-release.apk- 当前最新 release 构建版本:
2.5.11(versionCode=24) - 当前 APK 已切到原生 Android 客户端:
MainActivity + BossApiClient + 原生 XML 布局 - 真机开发约束:除非用户明确要求切换设备,后续 Android 开发、ADB 安装、交互回归与问题复现统一只使用
PLB110;如果PLB110当前不在线,应先恢复这台设备连接,不自动切到其他手机 - Android 真机无线调试如果要尽量稳定,优先使用“同一局域网 + 初次 USB 启用后执行
adb tcpip 5555+adb connect <phone-ip>:5555”这条链路;它通常比只依赖系统“无线调试配对码”更稳 - Android 系统层面对“无线调试”没有真正的永久不掉线开关;重启手机、切 Wi‑Fi、切热点、ADB server 重启、USB 调试被重新切换后,都可能导致无线调试自动失效
- 真机调试时建议固定同一 SSID、避免代理/VPN 改路、开发者选项里开启“保持唤醒”,并在需要长时间稳定调试时优先保留 USB 兜底;如果必须完全避免自动断开,不要只依赖无线调试
- 当前原生活动页已经覆盖:会话首页、项目详情、项目目标、版本记录、会话信息、群资料、发起群聊、消息转发、线程详情、设备详情、添加设备、账号与安全、设置、AI 账号、主 Agent 提示词 / 记忆、技能、运维中心、关于
- 当前原生一级体验已回退到微信式交互:
会话 / 设备 / 我的固定底部 tab,会话首页是简单聊天列表,主 Agent / 审计对话以普通置顶会话样式排在最前;项目详情页是聊天优先,只保留项目目标 / 版本记录两个轻入口 - 当前会话首页右上角已切回
+入口:直接从首页发起独立群聊;设备页右上角仍是+添加 - 当前会话首页已升级成“项目聚合 + 线程下钻”的结构:如果某个 Codex 文件夹只导入了 1 个线程,会话列表直接显示这个线程;如果同一文件夹导入了多个线程,会话首页只显示该文件夹归档项,点进去再看这个项目下的全部线程
- 当前会话首页的数据源已分成两层:
/api/v1/conversations继续保留平铺线程视图给群聊创建、转发等内部能力使用;首页和原生根页改走/api/v1/conversations/home,文件夹归档详情走/api/v1/conversation-folders/[folderKey] - 当前会话搜索仍然保留线程可达性:如果命中单线程项目,会直接进入该线程;如果命中多线程项目里的某条线程,结果会显示
项目 / 线程,点击后先进入项目文件夹页并定位到对应线程,不会把首页重新打平成线程列表 - 当前首页的
置顶 / 已读 / 时间 / 预览 / 上下文环都已经按项目会话聚合:单线程项目直接作用在线程,多线程项目则作用在文件夹归档项,文件夹时间和预览取内部最新线程,上下文环取内部最需要关注的线程 - 当前会话信息页已经支持按微信最新逻辑改线程名;群聊会作为独立新会话创建,默认自动命名,创建后可在群资料页改名
- 原生顶部安全区当前已补齐状态栏 inset 处理,并把首页 / 会话信息 / 群资料 / 发起群聊 / 转发目标等页面的顶部操作区域收回到可点击安全区内
- 当前消息转发已经切到微信式链路:长按消息可直接
转发 / 多选 / 复制 / 删除,多选后底部只保留转发,统一进入原生会话选择页 - 当前单条消息转发会在目标会话里显示为普通转发消息;多条消息会合并成一张“聊天记录”卡片,不再走旧的备注转发页
- 当前群聊调度主链已补上第一轮业务闭环:群聊文字消息会先进入主 Agent 生成推荐下发方案,用户确认后创建真正的线程执行单,执行完成后会把线程原始结果回写到群聊,再追加一条主 Agent 汇总
- 当前
approval_required群聊已补齐两条审批动作:可以确认主 Agent 推荐,也可以明确拒绝;拒绝后会把群审批状态写成rejected,并在群里追加系统提示,不会继续下发到线程 - 当前原生聊天页已把待审批推荐前移到主消息流:
ProjectDetailActivity会直接显示确认下发 / 拒绝,刷新后也能恢复最近一条待确认推荐 - 当前
approval_required群聊在已有待确认推荐时,会拒绝继续生成新的推荐,并提示用户先确认或拒绝当前推荐,避免审批消息叠加 - 当前三条聊天主链都已接入真实等待链路:
主 Agent 单聊 / 普通线程单聊 / 群聊确认下发当前都会返回任务信息,原生 Android 会保持等待直到收到真实回写或明确超时提示 - 当前
我的 > AI 账号已补登录 OpenAI 平台账号、接入阿里百炼备用账号与绑定 Master Codex Node三条显式入口;OpenAI API 登录成功后会立即设为当前主控,阿里百炼账号会作为备用链路保存 - 当前
登录 OpenAI 平台账号已升级成浏览器辅助登录流:会先进入原生引导页,再自动打开OpenAI Platform登录页;用户登录后可直接跳到API Keys页面,回 APP 粘贴 key 完成接入 - 当前
AI 账号页顶部会显式展示“当前主控身份”,并提供校验主控 / 测试主 Agent 对话两个动作,切换主控后可直接验证聊天通路 - 当前阿里百炼备用链已完成一次真实线上闭环验证:手动切到
aliyun-qwen-backup后,POST /api/v1/projects/master-agent/messages会返回queued,并已实际回流阿里备用链正常。到master-agent会话 - 当前
我的 > AI 账号已把阿里百炼备用模型切成预设选择:Web 和原生 Android 都支持直接切换qwen3.5-plus / qwen3.5-flash,只有在预设不适用时才需要填自定义模型 - 当前
我的 > 主 Agent 提示词 / 记忆页面已补:管理员全局主提示词只读展示、用户主提示词、当前对话附加提示词,以及用户通用记忆 / 跨项目项目记忆的新增、编辑、删除接口;当前对话设置按登录账号隔离,管理员全局主提示词不可覆盖 - 当前 Web 端
master-agent会话页右上角也已补齐微信式三点菜单,支持直接进入提示词 / 模型 / 推理强度 / 记忆 / 刷新 - 当前
approval_required群聊在 Web 端已统一用单一状态快照驱动:如果有新的待确认推荐,会自动折叠旧的拒绝态;如果上次推荐已拒绝,会明确展示“重新生成新的推荐”的恢复入口 - 当前
OpenAiOnboardingActivity在登录成功后会直接给出测试主 Agent 对话入口,可一键跳到master-agent聊天页 - 当前主控若还是
Master Codex Node,但节点离线或执行立即失败,主 Agent 会优先尝试已配置的OpenAI API / 阿里百炼 Qwen备用账号,避免聊天直接掉成失败日志 - 当前原生 Android 的聊天发送已改成更短的客户端等待窗口;
master-agent单聊依赖服务端快速入队和消息流里的“思考中 / 超时 / 重试等待”状态,不再要求客户端长时间同步阻塞 - 当前群资料页已经支持“修复群成员”:如果历史脏群里混入了
master-agent或失效线程引用,前台会明确提示并允许重新选择真实线程成员,修复后会正式写回群成员账本 - 当前原生聊天页也会直接提示“修复群成员”:当群里存在失效线程或不可下发成员时,
ProjectDetailActivity会在消息流上方直接给出去修复入口,并跳到群资料页完成修复 - 当前 Web 群聊页也已补上待确认推荐的刷新恢复:群聊详情会在服务端读取最近一条
pending_user_confirmation的 dispatch plan,并在刷新或重新进入页面后继续显示“等待你确认主 Agent 推荐” - 当前设备导入主链已补上真实审核闭环:设备 heartbeat 可上报真实项目候选,服务端会生成
import draft;用户提交勾选后会先排队device_import_resolution主 Agent 任务,前台进入“主 Agent 审核中”并自动刷新,任务完成后才写回正式导入建议,再把选中的线程真正落成聊天窗口 - 当前新设备导入前台已经接通:Web
添加设备成功后会直接进入“导入项目”步骤;设备页详情里也可再次打开导入草稿。原生 Android 端同样已补DeviceImportDraftActivity,可完成勾选 -> 预览决议 -> 应用导入 - 当前设备导入前台文案与状态卡已收口:会明确显示
等待候选线程 / 等待勾选 / 建议已生成 / 已导入,并在导入后回显真正落到会话首页的线程名 - 当前已导入设备也支持自动同步项目理解:绑定设备 heartbeat 发现活跃线程有新活动、或线程本身刚回写新结果时,都会自动排隐藏的主 Agent 理解任务,把项目目标、当前进度和技术架构回写到项目理解和项目记忆
- 当前主 Agent 对活跃线程的同步已经升级成“线程状态文档 + 最近进展事件 + 关键时刻深拉”:heartbeat / thread reply 平时优先追加轻量进展事件,只有在线程首次理解、状态变薄、长时间未全量刷新或主 Agent 真正接手时,才重新触发全量理解
- 当前 Web 和 Android 都已经提供线程状态只读入口:Web 可直接打开
/conversations/[projectId]/thread-status,Android 可在单线程会话信息中进入ThreadStatusActivity,查看当前目标、阶段、进度、架构、阻塞、建议下一步,以及最近 5 条进展事件 - 当前
dispatch_execution完成回写已补幂等:同一个执行单重复完成,不会再向群聊重复追加线程原始回复和主 Agent 汇总 - 当前当 heartbeat 同时携带旧
projects和新projectCandidates时,服务端会优先走import draft,不再绕过勾选/应用阶段直接把旧项目目录导入为聊天窗口 - 当前设备导入
review已补 owner/admin 鉴权,并改成真正的异步审核链:review只负责排队device_import_resolution任务并返回 queued 状态,等 local-agent 完成回写后才把决议写回草稿和会话账本 - 当前原生 APP 会话页的“刷新失败”已按当前 tab 的主数据源独立判错:
会话只看会话请求本身,设备只看设备请求,我的只在settings + ota同时失败时才提示刷新失败 - 当前
设备和我的根页已收口为简单列表;运维与修复 / AI 账号 / 技能保留在一级我的,审计对话作为置顶会话保留在会话首页 - 原生客户端当前直接调用
https://boss.hyzq.net的 Boss API,不再打开 WebView 2.0.1已修复华为真机上因Theme.SplashScreen与AppCompatActivity不兼容导致的启动闪退2.1.0已在本机连接的华为真机上完成签名包覆盖安装与启动复核,原生三栏入口和子活动页声明已全部接通2.1.1已补上原生 OTA 下载链路:关于页会直接请求受保护的/api/v1/user/ota/package,下载完成后可拉起系统安装器2.2.0已把原生 UI 从控制台风格回退到微信式简单列表和聊天优先视图,并复核了设备页 / 我的页 / 深层高级入口2.2.1已继续补齐原生交互细节:聊天页发送后会先出现本地“发送中”气泡,关于页会展示 OTA 下载进度 / 重试 / 安装授权提示,根 tab 会记住用户上次停留位置并改成“再按一次返回进入后台”2.3.0已把会话模型切到“线程 = 聊天窗口”,补上文件夹名副信息、后台活跃数量动态图标、微信式会话信息页、线程改名、独立群聊创建、群资料页,以及主 Agent / 审计对话普通置顶会话化2.4.0已把消息转发切到微信式原生链路:聊天页支持长按消息操作、多选合并转发、统一目标会话选择页;单条消息转发显示为普通转发消息,多条消息转发显示为“聊天记录”卡片2.5.0已补齐聊天附件主链:原生聊天框左侧+会打开底部抽屉,支持图片 / 视频 / 文件发送;默认走服务器文件存储,我的 > 附件与存储可切到阿里 OSS 私有桶;附件消息已支持下载 / 打开、手动分析、自动分析状态,以及带 task token 的主 Agent 附件分析链接2.5.1继续收口微信式原生 UI:聊天页普通态顶部已隐藏刷新按钮,只保留右上角“信息”;发起群聊页顶部说明和选择区已压成更轻的会话式密度,候选线程继续复用微信式会话卡片2.5.2继续补齐深层原生页:项目目标 / 版本迭代记录 / 会话信息 / 群资料已进一步向设计图收口;附件消息卡片的分析状态和动作文案也压成了更轻的微信式层级2.5.4已把我的根页收口成微信式资料区 + 白底菜单列表,并同步把设置 / 账号与安全 / AI 账号 / 技能 / 运维与修复的顶部说明从重soft panel降成轻量列表说明2.5.5已补上群资料页的“修复群成员”主链:历史脏群会明确提示失效成员,并允许重新选择真实线程成员写回群资料;approval_required群聊也已补齐“确认 / 拒绝”两条审批动作
本地启动
开发态:
cd /Users/kris/code/boss
npm install
npm run dev
构建态:
cd /Users/kris/code/boss
npm run build
npm start
说明:
npm run build前会自动清理.next,避免旧目录残留导致ENOTEMPTY
默认入口:
- 登录页:http://127.0.0.1:3000/auth/login
- 会话页:http://127.0.0.1:3000/conversations
- 设备页:http://127.0.0.1:3000/devices
设备端本地服务
手动启动:
cd /Users/kris/code/boss
./scripts/start-local-agent.sh ./local-agent/config.example.json
安装常驻 launchd:
cd /Users/kris/code/boss
./scripts/install-local-launchagent.sh
如需把常驻 agent 指回本地开发控制面:
cd /Users/kris/code/boss
./scripts/install-local-launchagent.sh /Users/kris/code/boss/local-agent/config.example.json
device-agent 当前职责:
- 上报设备状态、账号、5h/7d 额度和项目列表
- 向云端
/api/device-heartbeat发心跳 - 向云端
/api/v1/workers/{workerId}/thread-context发线程预算更新 - 递归扫描本机
~/.codex/skills,并同步到云端/api/v1/devices/[deviceId]/skills - 轮询云端
/api/v1/master-agent/tasks/claim,并用当前电脑已登录的codex账号执行主 Agent 任务 - 将主 Agent 执行结果回写到云端
/api/v1/master-agent/tasks/[taskId]/complete - 对普通单线程会话,认领到的
conversation_reply任务会直接恢复到目标 Codex 线程,并把线程原始回复回写到对应聊天窗口 - 对群聊线程分发任务,认领到的
dispatch_execution任务会把原始线程结果和主 Agent 汇总一起回写到群聊消息账本 local-agent对conversation_reply当前会优先使用codex exec resume <targetCodexThreadRef>,只有缺失真实线程引用时才退回--ephemerallocal-agent对dispatch_execution当前会按orchestrationBackendId分流:默认继续走codex exec resume;当任务显式选择omx-team且本机omxEnabled + omxCommand/omxArgs可用时,会改走OMX Team RuntimeJSON 协议执行local-agent当前的任务完成回写已通过RemoteRuntimeAdapter标准化,conversation_reply / dispatch_execution的完成结果都会先归一到统一远程执行结果结构,再进入主 Agent 完成路由RemoteRuntimeAdapter当前还会拦截固定模式的线程内部环境提示(如“当前会话环境只读 / cwd 我可以在命令里指向 …”),并改写成系统失败提示,不再把这类脏文本直接回写到单聊或群聊- 当前设备模型已支持同一台 Mac / Windows 同时接入 Codex
GUI + CLI双能力;设备详情页会同时展示两种能力状态,并允许切换默认执行模式 - 当前同项目
GUI / CLI并行写入风险已接入项目/文件夹级冲突控制:默认阻断,用户可仅对当前异常项目/文件夹选择禁止 / 允许本次 / 永久放行 local-agent当前会先启动本地4317健康监听,再异步执行首次 heartbeat 和 task poll,避免控制面短暂阻塞时本地健康检查一起挂死- Codex 项目/线程扫描当前已搬到 worker 线程执行,避免
.codex/logs_1.sqlite和state_5.sqlite的同步扫描阻塞主线程 HTTP 响应 - 如果某个历史群聊里已经没有真实线程成员,当前不会再表现成“发了没反应”,而是会在群里追加一条
system_notice,提示用户先重新整理群成员 - 设备导入审核当前已经升级成
local-agent -> codex exec -> complete的真实任务链;Web 和 Android 前台都会在pending_resolution阶段显示“主 Agent 审核中”并自动刷新,审核失败时保留当前勾选以便重新生成 - 提供本地
/health、/api/v1/device、/api/v1/skills、/api/v1/heartbeat
当前常驻默认值:
launchd默认加载local-agent/config.cloud.json,控制面指向https://boss.hyzq.netlocal-agent/config.example.json保留给本地127.0.0.1:3000回环开发
部署入口
- 服务器连接与部署:
docs/architecture/boss_server_connection_and_deploy_cn.md - 服务器调试 skill:
$HOME/.codex/skills/boss-server-debug/SKILL.md - 远端部署脚本:
scripts/deploy-server.sh - 远端邮件部署脚本:
scripts/install-server-mail.sh - 远端初始化脚本:
scripts/bootstrap-server.sh - APK 发布脚本:
scripts/publish-apk-to-public.sh systemd配置:deployment/systemd/boss-web.serviceCaddy配置:deployment/Caddyfile- 邮件配置:
deployment/mail/ - Android 原生入口:
android/app/src/main/java/com/hyzq/boss/MainActivity.java - Android API 客户端:
android/app/src/main/java/com/hyzq/boss/BossApiClient.java - Android 原生会话页:
android/app/src/main/java/com/hyzq/boss/ProjectDetailActivity.java - Android 原生设备页:
android/app/src/main/java/com/hyzq/boss/DeviceDetailActivity.java - Android 原生我的页:
android/app/src/main/java/com/hyzq/boss/AiAccountsActivity.java、android/app/src/main/java/com/hyzq/boss/OpsCenterActivity.java、android/app/src/main/java/com/hyzq/boss/SettingsActivity.java - Android 微信式 surface contract:
android/app/src/main/java/com/hyzq/boss/WechatSurfaceMapper.java - Android 聊天页布局:
android/app/src/main/res/layout/activity_project_chat.xml - 服务器环境示例:
.env.server.example
当前 scripts/deploy-server.sh:
- 优先从 macOS Keychain 读取
ubuntu@106.53.170.158的密码 - 如果 Keychain 不可用,再回退读取
BOSS_SERVER_PASS - 当前已明确排除
data/目录,部署不会再覆盖服务器上的boss-state.json - 部署脚本当前会先在本机执行
npm run build,再把本机已经验证通过的.next构建产物同步到服务器 - 同步前会先在服务器上删除旧
.next并修正/opt/boss所有权,避免 rsync 被历史 root 产物卡住 - 服务器当前不再现编 Next standalone,而是直接重启使用本机同步过去的构建产物,避免服务器端 tracing / 权限差异导致部署失败
- 远端重启服务后会自动执行一次
curl -fsS http://127.0.0.1:3000/api/health
APK 构建:
cd /Users/kris/code/boss
npm run apk:debug
cd /Users/kris/code/boss
npm run apk:release
cd /Users/kris/code/boss
npm run aab:release
说明:
npm run apk:debug现在会在 Gradle 构建完成后自动执行scripts/publish-apk-to-public.shnpm run apk:release会先准备本机 release keystore,再构建 signed release APK,并发布到public/downloads- 最新 APK 会同步到
public/downloads/boss-android-latest.apk - 同时也会额外保留一份带版本号的 APK:
public/downloads/boss-android-v{versionName}-{flavor}.apk npm run aab:release会先准备本机 release keystore,再构建 signed release AAB,并发布到public/downloads- 最新 AAB 会同步到
public/downloads/boss-android-latest.aab - 同时也会额外保留一份带版本号的 AAB:
public/downloads/boss-android-v{versionName}-{flavor}.aab - AAB 归档元数据会写入
public/downloads/boss-android-latest-aab.json - OTA 下载入口固定走受保护的
GET /api/v1/user/ota/package - release 签名文件当前放在本机:
android/keystores/boss-release.keystoreandroid/signing/release-signing.properties- 以上文件已加入
.gitignore,不会进仓库
关键实现说明
- 当前持久化是真正生效的文件存储:
data/boss-state.json - Web 生产启动和服务器
systemd都显式设置了BOSS_STATE_FILE,避免 Next standalone 误把状态写进.next/standalone/data/ - Web 生产启动、服务器
systemd和部署构建当前都显式设置了BOSS_RUNTIME_ROOT,避免process.cwd()在 standalone / 服务器构建阶段误把整个仓库根目录带进 tracing next.config.ts已显式排除deployment / docs / design / local-agent / prompts / scripts / android等非运行时目录,避免服务器端 standalone tracing 卷入运维资产导致构建失败- 文件写入已经改成串行事务队列 + 原子写入 +
data/boss-state.json.bak备份恢复,heartbeat和 APP 日志并发写不会再互相覆盖 - 当前文件存储里已经包含:
projects / messages / goals / versionsauthAccounts / otaUpdates / otaUpdateLogsthreadContextSnapshots / threadHandoffPackages / threadContextAlertsdeviceEnrollmentsdeviceSkills / appLogsopsFaults / opsRepairTickets / opsRepairVerificationsauditRequests / auditResults / capabilities
- 根布局会挂载
AppLogBridge,前端路由切换、运行时异常、发送消息、OTA 操作都会通过/api/v1/app-logs实时同步到服务器 - Web 端根布局当前仍保留
NativeAppBridge,用于浏览器态与历史桥接兼容;当前正式 APK 已改为原生 Activity + 原生 API 客户端,不再依赖 WebView - APP 日志桥已经改成会话感知:只会按当前登录账号解析绑定设备,不再在未登录页默认按全局管理员设备写日志
- APP 外壳已经从“桌面预览卡片”切回真机态:移动端不再渲染假的
9:41 / 5G状态栏,底部会话 / 设备 / 我的导航固定在视口底部,背景改为全屏 cover,不再出现圆角矩形外壳 - 原生 Android 当前也和这套产品口径对齐:根页采用微信式简单列表,项目聊天页改成消息流优先,
设备 / 我的页不再展示控制台式统计卡片 - 原生聊天页当前会即时渲染本地发送中消息,并且只有在用户接近底部或本次发送是主动触发时才自动滚到底
- 登录成功后的进入首页链路已做稳态处理:会先确认
/api/auth/session可读,再执行replace(/conversations),并附带一次原生级兜底跳转,避免真机 WebView 偶发停留在“正在进入会话首页” /api/v1/events已作为 SSE 出口使用,会话页、设备页、技能页和项目详情页会按事件自动刷新,不再只靠手动刷新- 我的页新增
技能入口,/me/skills会按设备分组展示 Skill,并支持一键复制调用语句 - 我的页新增
主 Agent 提示词 / 记忆入口,/me/master-agent会展示管理员全局主提示词、用户主提示词、当前对话附加提示词、组合预览,以及当前用户的通用记忆和跨项目项目记忆 - 我的页新增
AI 账号入口,/me/ai-accounts会展示主 GPT / 备用 GPT / API 容灾,并明确主链路优先走已登录ChatGPT Plus / Codex的Master Codex Node AI 账号页面当前已补上显式登录指引:手机端不会直接弹出 ChatGPT OAuth;主 GPT 的登录动作必须在绑定电脑上的 Codex / ChatGPT Plus 会话里完成,再回手机端点“测试连接 / 校验连接”AI 账号页面当前已升级成双入口:首页会显式展示登录 OpenAI 平台账号和绑定电脑上的 Codex 节点登录 OpenAI 平台账号当前通过填写OpenAI API Key完成;校验成功后会立即创建/更新openai_api主账号,并设为当前主控绑定电脑上的 Codex 节点当前会创建/更新master_codex_node主账号,并可直接设为当前主控;同时会返回“登录发生在绑定设备上”的明确中文指引- 当前公网服务器对
api.openai.com仍存在出网阻塞;OpenAI API Key登录入口已经实现,但在服务器恢复出网前,公网校验会返回明确的中文网络错误,建议先切回Master Codex Node POST /api/v1/accounts/[accountId]/validate当前不再只看nodeId;对master_codex_node会同时校验绑定设备是否在线,并在设备离线时返回明确的降级说明- API 容灾当前不走服务器预置 Key,而是由用户在 APP 的
我的 > AI 账号中自行配置OpenAI API账号 - 设备页当前只展示已接入生产链路的设备,历史演示脏数据已经从正式设备视图、运维视图和审计视图中剔除
- 本机
local-agent现在会直接从~/.codex/state_5.sqlite / logs_1.sqlite / session_index.jsonl / .codex-global-state.json动态发现真实 Codex 线程,并在 heartbeat 里上报projectCandidates - 线程发现当前会优先保留每个 Codex 文件夹下的“主工作线程”;如果同一文件夹里同时存在
worker / explorer这类子线程,会优先过滤掉这些子线程,避免会话首页被子代理线程冲成异常多条 - 如果某条历史线程在 Codex 本地状态库里是
read-only,local-agent当前会在候选发现和codex exec resume前都直接拒绝这类线程,避免把只读线程误当成可开发线程继续复用 - 如果某个项目下已经存在历史
worker / explorer子线程,即使数据库权限后来被改成可写,也不能默认把它们当成主开发线程复用;这类线程往往还带着“只读勘察 / 不改文件”的历史上下文,恢复开发时应优先回到该项目的主交接线程,或先显式补发“解除只读勘察限制”的新用户指令 - 对已经绑定的生产设备,服务端现在会在 heartbeat 时自动选中建议导入项、生成导入决议并直接应用;因此会话页会自动出现这台设备当前真实运行的 Codex 线程窗口
- 对已经绑定的生产设备,服务端现在会在 heartbeat 时自动选中建议导入项、生成导入决议并直接应用;如果某个项目下存在多个线程,会话首页会先显示项目归档项,而不是把所有线程平铺在首页
- 对已经绑定的生产设备,如果某些自动导入线程已经不再出现在最新
projectCandidates[]中,服务端会在下一次 heartbeat 自动清理这些过时会话,避免旧线程长期滞留首页 - 登录页当前已临时切到免验证模式,点击“登录”会直接进入会话首页
- 认证现在已经有最小会话链路:登录后会写入
boss_sessionCookie,默认保持 30 天,会话 / 设备 / 我的 / 线程页面以及主要/api/v1/*接口都要求有效会话 - 新增
GET /api/auth/session、POST /api/auth/logout与POST /api/auth/restore - 原生 Android 客户端当前会把
boss_session / restore token / account存到SharedPreferences,用于重启后恢复会话 - 验证码新增防刷与防重放:60 秒冷却、15 分钟窗口限流,登录连续失败 5 次后会锁定 10 分钟
POST /api/auth/send-code现在会先按用途校验账号状态:登录 / 忘记密码要求账号已存在,注册要求账号尚未注册- 当前登录页已临时放开成“一键进入”,账号密码和验证码输入暂时不作为拦截条件
POST /api/auth/send-code与固定验证码000000仍保留给注册 / 重置密码和后续认证收口,不作为当前登录页前置条件- 新注册和重置密码现在使用
scrypt哈希;历史sha256密码会在下一次密码登录时自动迁移 - 原生 Android 当前把
ProjectForwardActivity / ThreadDetailActivity / OpsCenterActivity等复杂能力下沉到二级或更深层入口,不再把线程预算 / 转发 / 运维说明堆在主聊天页和一级我的页 - 原生 OTA 当前除了整包下载和系统安装器拉起,还会在关于页保留本地下载状态;离开关于页再回来时,仍能看到进行中 / 失败 / 待授权 / 可安装状态
- Android 本地 Gradle 验证当前必须串行执行,避免并发
testDebugUnitTest / compileDebugJavaWithJavac / assembleDebug相互踩坏中间产物 - 当前默认最高管理员账号:
17600003315 - 当前默认测试密码:
boss123456 - 当前本机 Codex 节点
mac-studio已绑定到17600003315 - 主 Agent 对话当前真实执行链路是:
Boss Web -> 写入用户消息 -> 返回 queued/running -> master-agent task queue -> local-agent / OpenAI API -> complete task -> project ledger master-agent单聊当前已改成“快速入队 + 异步回流”:发送后会立即返回任务包和masterReplyState,前台先显示“主 Agent 思考中”,真实回复稍后自动回写到账本- 原生 Android 当前会把
master-agent的等待态保留在消息流里:发送后常驻显示“主 Agent 思考中”,超时后改成“主 Agent 回复超时 + 重试等待”,收到新回复后会自动清掉,不再只靠 toast 提示 master-agent单聊当前已支持当前对话级别的模型 / 推理强度覆盖,服务端会优先把该会话的agentControls用到实际 OpenAI 回复和 Master Codex Node 执行 prompt 中- 原生 Android 当前在
master-agent聊天页右上角提供微信式...菜单,菜单项包含模型 / 推理强度 / 会话信息 / 刷新 - 服务器已经部署
Postfix + Dovecot,邮箱别名verify@boss.hyzq.net/no-reply@boss.hyzq.net当前会投递到本机bossmail邮箱 - 应用内
POST /api/auth/send-code已经支持 email 模式,并可通过/opt/boss/.env.server切换;本轮已临时切到 email 模式验证成功,随后恢复默认 fixed - 应用内
GET /api/v1/user/ota/POST /api/v1/user/ota/GET /api/v1/user/ota/package现在已经支持 OTA 状态、检查更新、执行升级和 APK 包下载 GET /api/v1/app-logs现在已支持登录态下按deviceId / projectId / level / category / source / cursor查询日志分页- 设备写接口
POST /api/v1/app-logs、POST /api/v1/devices/[deviceId]/skills、POST /api/v1/workers/[workerId]/thread-context现在都要求有效设备 token 或匹配登录会话 - 当前认证仍是 MVP:已有最小会话 Cookie,但还没有刷新令牌、跨端会话治理、吊销审计和 CSRF 防护
- 聊天附件当前已支持真实上传、消息落账本、受保护下载和原生打开;默认存储后端为服务器文件存储
- 当前用户已可在
我的 > 附件与存储切到阿里 OSS 私有桶,下载链会按附件快照生成签名地址,避免用户后续修改配置后旧附件失效 - 图片 / PDF / 文本默认自动进入主 Agent 附件分析;视频 / Office / 大文件默认手动触发
- 当前采用“极轻云 + 本地设备端”的路线,云端只承载 Web、轻 API 和状态文件
- 服务器侧主 Agent 对话能否返回真实大模型回复,依赖被绑定设备的
local-agent在线并能执行codex exec;服务器本身不直接持有主 GPT 会话 - 原生 Android 当前不再依赖长时间同步等待
master-agent完整回复;消息发送后会立即进入“主 Agent 思考中”状态,并通过后台轮询刷新真实回复
Description
Languages
Kotlin
39.6%
TypeScript
36.3%
JavaScript
10.9%
Shell
8.4%
CSS
2.1%
Other
2.7%