diff --git a/README.md b/README.md index ae0c78c..98a3587 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ - `src/boss_control`:空占位目录,不参与当前运行 - `src/boss_device_agent`:空占位目录,不参与当前运行 -## 当前运行状态(2026-03-28) +## 当前运行状态(2026-03-29) 本地: @@ -90,7 +90,7 @@ 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.4.0`(`versionCode=12`) +- 当前最新 release 构建版本:`2.5.0`(`versionCode=13`) - 当前 APK 已切到原生 Android 客户端:`MainActivity + BossApiClient + 原生 XML 布局` - 当前原生活动页已经覆盖:会话首页、项目详情、项目目标、版本记录、会话信息、群资料、发起群聊、消息转发、线程详情、设备详情、添加设备、账号与安全、设置、AI 账号、技能、运维中心、关于 - 当前原生一级体验已回退到微信式交互:`会话 / 设备 / 我的` 固定底部 tab,会话首页是简单聊天列表,`主 Agent / 审计对话` 以普通置顶会话样式排在最前;项目详情页是聊天优先,只保留 `项目目标 / 版本记录` 两个轻入口 @@ -107,6 +107,7 @@ Android APK: - `2.2.1` 已继续补齐原生交互细节:聊天页发送后会先出现本地“发送中”气泡,关于页会展示 OTA 下载进度 / 重试 / 安装授权提示,根 tab 会记住用户上次停留位置并改成“再按一次返回进入后台” - `2.3.0` 已把会话模型切到“线程 = 聊天窗口”,补上文件夹名副信息、后台活跃数量动态图标、微信式会话信息页、线程改名、独立群聊创建、群资料页,以及 `主 Agent / 审计对话` 普通置顶会话化 - `2.4.0` 已把消息转发切到微信式原生链路:聊天页支持长按消息操作、多选合并转发、统一目标会话选择页;单条消息转发显示为普通转发消息,多条消息转发显示为“聊天记录”卡片 +- `2.5.0` 已补齐聊天附件主链:原生聊天框左侧 `+` 会打开底部抽屉,支持图片 / 视频 / 文件发送;默认走服务器文件存储,`我的 > 附件与存储` 可切到阿里 OSS 私有桶;附件消息已支持下载 / 打开、手动分析、自动分析状态,以及带 task token 的主 Agent 附件分析链接 ## 本地启动 @@ -287,6 +288,8 @@ npm run aab:release - `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 会话 diff --git a/android/app/build.gradle b/android/app/build.gradle index 95e56a4..0c02155 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -36,8 +36,8 @@ android { applicationId "com.hyzq.boss" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion - versionCode 12 - versionName "2.4.0" + versionCode 13 + versionName "2.5.0" buildConfigField "String", "BOSS_API_BASE_URL", "\"https://boss.hyzq.net\"" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } diff --git a/docs/architecture/ai_handoff_index_cn.md b/docs/architecture/ai_handoff_index_cn.md index 01928e3..e3d221a 100644 --- a/docs/architecture/ai_handoff_index_cn.md +++ b/docs/architecture/ai_handoff_index_cn.md @@ -35,6 +35,10 @@ - `src/lib/boss-device-auth.ts`:设备 token / 登录会话混合鉴权辅助 - `src/lib/boss-events.ts`:SSE 事件总线 - `src/lib/boss-master-agent.ts`:主 Agent 真实回复链路、Master Codex Node relay 与 API 容灾逻辑 +- `src/lib/boss-attachments.ts`:附件类型识别、分析状态决策和下载头 +- `src/lib/boss-storage.ts`:附件存储抽象、配置校验和脱敏输出 +- `src/lib/boss-storage-server-file.ts`:服务器文件存储上传 / 读取 +- `src/lib/boss-storage-aliyun-oss.ts`:阿里 OSS 私有桶上传 / 签名下载 - `src/lib/boss-ota.ts`:APK OTA 产物定位与元数据读取 - `src/lib/boss-projections.ts`:当前聚合 BFF 投影视图 - `src/components/app-runtime.tsx`:APP 日志桥、SSE 刷新和 Skill 面板 @@ -51,6 +55,7 @@ - `android/app/src/main/java/com/hyzq/boss/GroupInfoActivity.java`:原生群资料页,支持群名修改与成员查看 - `android/app/src/main/java/com/hyzq/boss/GroupCreateActivity.java`:原生独立群聊创建页 - `android/app/src/main/java/com/hyzq/boss/ForwardTargetActivity.java`:原生微信式会话选择页,承接单条转发与多选合并转发 +- `android/app/src/main/java/com/hyzq/boss/AttachmentComposerState.java`:原生附件发送确认规则与待上传附件模型 - `android/app/src/main/java/com/hyzq/boss/DeviceDetailActivity.java`:原生设备详情与技能入口 - `android/app/src/main/java/com/hyzq/boss/AiAccountsActivity.java`:原生 AI 账号管理页 - `android/app/src/main/java/com/hyzq/boss/OpsCenterActivity.java`:原生运维 / 审计中心 @@ -75,6 +80,11 @@ - `GET /api/v1/projects/master-agent` 正常,主 Agent 项目页已能看到 APP 实时日志 - `GET /api/v1/accounts` 正常,已返回主 GPT / 备用 GPT / API 容灾摘要 - `GET /api/v1/devices/mac-studio/skills` 正常 +- `GET /api/v1/storage/config` 正常,已返回当前登录用户的附件存储模式和脱敏 OSS 摘要 +- `POST /api/v1/storage/config/validate` 正常,已验证可校验并保存阿里 OSS 私有桶配置 +- `POST /api/v1/projects/[projectId]/attachments` 正常,已支持图片 / 视频 / 文件上传与附件消息写入 +- `POST /api/v1/projects/[projectId]/attachments/[attachmentId]/analyze` 正常,已支持手动触发主 Agent 附件分析 +- `GET /api/v1/attachments/[attachmentId]/download` 正常,已支持会话鉴权下载和 task token 下载 - `POST /api/auth/login` 正常,会写入 `boss_session` - `boss_session` 当前默认保持 30 天 - `GET /api/auth/session` 正常 @@ -118,6 +128,8 @@ - 线程改名当前遵循微信最新逻辑:从聊天页右上角进入会话信息页,再进行改名 - 当前已支持从单线程会话发起独立群聊:原会话保留,新群聊自动命名并可在群资料页改名 - 当前已支持微信式消息转发:长按消息可直接 `转发 / 多选 / 复制 / 删除`,单条消息转发显示为普通转发消息,多条消息转发显示为聊天记录卡片 +- 当前已支持聊天附件主链:原生聊天框左侧 `+` 会打开底部抽屉,支持图片 / 视频 / 文件发送;图片 / PDF / 文本默认自动进入主 Agent 附件分析,视频 / Office / 大文件默认手动触发 +- 当前附件与存储配置页位于 `我的 > 附件与存储`:默认使用服务器文件存储,用户可按账号切到阿里 OSS 私有桶;下载链会优先使用附件上传时固化的 OSS 快照,避免用户后续改配置后旧附件失效 - 主 Agent 项目页会实时吸收 APP 端日志,用于边对话边指导 APK / Web 优化 - 移动端 UI 已去掉假的状态栏与桌面预览壳;底部一级导航固定在视口底部,返回逻辑不会再把 APP 根页直接弹回桌面 - `项目目标` 支持用户编辑、主 Agent 复核、完成项自动划线 @@ -139,7 +151,7 @@ - 邮件:`Postfix + Dovecot` - Android:`AppCompatActivity + 原生 XML 布局 + HttpURLConnection` - 原生登录恢复:`SharedPreferences + restore token` -- 当前最新原生 APK:`2.4.0`(`versionCode=12`) +- 当前最新原生 APK:`2.5.0`(`versionCode=13`) 当前不要误判成已经用了: @@ -193,7 +205,7 @@ npm run apk:debug - APP 实时日志同步、主 Agent 日志镜像、SSE 自动刷新和 Skill 同步页已经接通,但日志检索、告警和远程 Skill 管理仍未做 - 数据库尚未替代文件存储 - 域名入口的代理 / 分裂 DNS 结构仍未完全摸清 -- 图片 / 视频真实文件上传仍未接对象存储 +- 当前只支持服务器文件存储和阿里 OSS,尚未接更多对象存储或更丰富的附件详情页 - 认证没有真实 session 和令牌吊销 ## 9. 继续开发时的工作原则 diff --git a/docs/architecture/api_and_service_inventory_cn.md b/docs/architecture/api_and_service_inventory_cn.md index b75ab42..7a95826 100644 --- a/docs/architecture/api_and_service_inventory_cn.md +++ b/docs/architecture/api_and_service_inventory_cn.md @@ -50,6 +50,8 @@ - 当前已经支持微信式消息转发:长按消息可直接 `转发 / 多选 / 复制 / 删除` - 当前多选模式会切换成微信式 `取消 + 已选数量 + 底部转发` 状态 - 当前统一使用 `ForwardTargetActivity` 选择目标会话,替换旧的备注转发主链 + - 当前已支持聊天附件主链:输入框左侧 `+` 会打开底部抽屉,支持图片 / 视频 / 文件发送;图片 / 视频先确认,文件直接发送 + - 当前附件消息支持下载、原生打开、手动分析和自动分析状态展示 - `线程详情 / 运维调试` 仍保留对应原生活动页,但已退出主聊天面 - 当前已补上本地发送中气泡、发送按钮状态控制,以及“只有接近底部才自动滚到底”的消息流行为 - 当前根页导航: @@ -124,6 +126,7 @@ - `GET /devices/add` - `GET /me/security` - `GET /me/about` +- `GET /me/storage` - `GET /me/ai-accounts` - `GET /me/ops` - `GET /me/ops/audit` @@ -389,6 +392,69 @@ - 当前目标既可以是单线程会话,也可以是群聊、`主 Agent` 或 `审计对话` - 非开发任务下如命中线程沟通限制,接口会预留 `approvalRequired / approvalReason` 返回 +#### `POST /api/v1/projects/[projectId]/attachments` + +- 用途:上传图片 / 视频 / 文件,并在当前会话写入附件消息 +- 输入: + - `file` + - `sourceType`: `image | video | file` +- 当前行为: + - 默认使用当前登录用户的附件存储配置,未配置时走 `server_file` + - 用户切到 `oss + aliyun_oss` 后,会上传到阿里 OSS 私有桶,并在附件里固化 `storageSnapshot` + - 图片 / PDF / 文本默认会生成 `queued_auto` 附件分析任务 + - 视频 / Office / 大文件默认标记为 `ready_manual` +- 返回: + - `message` + - `attachment` + - `analysisTask` + - `downloadUrl` + +#### `POST /api/v1/projects/[projectId]/attachments/[attachmentId]/analyze` + +- 用途:手动触发某个附件的主 Agent 分析 +- 当前行为: + - 仅允许对 `ready_manual` 或 `failed` 状态的附件重新发起 + - 返回新的 `attachment_analysis` 任务摘要 + +#### `GET /api/v1/attachments/[attachmentId]/download` + +- 用途:受保护下载或预览附件 +- 当前保护: + - 默认要求有效 `boss_session` + - 对主 Agent 附件分析任务,支持 `taskId + token` 的受控下载 +- 当前行为: + - `server_file` 会直接流式返回文件 + - `aliyun_oss` 会按附件上传时固化的 `storageSnapshot` 生成临时签名 URL 并跳转 + +#### `GET /api/v1/storage/config` + +- 用途:读取当前登录用户的附件存储配置 +- 返回: + - `mode`: `server_file | oss` + - `ossProvider` + - 已脱敏的 OSS 配置摘要 + +#### `PATCH /api/v1/storage/config` + +- 用途:更新当前登录用户的附件存储模式或 OSS 草稿配置 +- 当前行为: + - 默认模式为 `server_file` + - 当前 OSS provider 仅支持 `aliyun_oss` + +#### `POST /api/v1/storage/config/validate` + +- 用途:校验并保存当前登录用户的阿里 OSS 配置 +- 最小配置字段: + - `accessKeyId` + - `accessKeySecret` + - `bucket` + - `endpoint` + - `region` + - `prefix`(可选) +- 当前行为: + - 只支持阿里 OSS 私有桶 + 签名 URL + - 成功后会回写已脱敏配置和验证时间 + #### `POST /api/v1/projects/[projectId]/goals` - 用途:新增项目目标 @@ -601,6 +667,7 @@ - `authSessions` - `aiAccounts` - `aiAccountSwitchHistory` +- `userAttachmentStorageConfigs` - `threadContextSnapshots` - `threadHandoffPackages` - `threadContextAlerts` @@ -623,5 +690,6 @@ - 正式数据库 - 正式鉴权中间件 -- 图片 / 视频真实文件上传和对象存储 +- 多家对象存储适配(当前只有服务器文件存储和阿里 OSS) +- 完整的附件详情页与富预览器 - 完整的多端用户会话系统与刷新令牌体系 diff --git a/docs/architecture/current_runtime_and_deploy_status_cn.md b/docs/architecture/current_runtime_and_deploy_status_cn.md index 02bf483..7814af2 100644 --- a/docs/architecture/current_runtime_and_deploy_status_cn.md +++ b/docs/architecture/current_runtime_and_deploy_status_cn.md @@ -1,6 +1,6 @@ # Boss 当前运行与部署状态 -更新时间:`2026-03-28` +更新时间:`2026-03-29` ## 1. 本地状态 @@ -114,7 +114,7 @@ cd /Users/kris/code/boss - 当前已生成 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` - 当前 release 构建还会额外生成带版本号的 APK:`android/app/build/outputs/apk/release/boss-android-v{versionName}-release.apk` -- 当前最新 release 构建版本:`2.4.0`(`versionCode=12`) +- 当前最新 release 构建版本:`2.5.0`(`versionCode=13`) - 当前 release keystore 位于本机 `android/keystores/boss-release.keystore`,签名参数位于 `android/signing/release-signing.properties` - `2.0.1` 已在本机连接的华为真机上复核通过,修复了 `Theme.SplashScreen` 导致的 `AppCompatActivity` 启动闪退 - `2.1.0` 已把 Web 一级页和主要二级页全部补成原生活动页:`MainActivity / ProjectDetailActivity / ProjectGoalsActivity / ProjectVersionsActivity / ProjectForwardActivity / ThreadDetailActivity / DeviceDetailActivity / DeviceEnrollmentActivity / SkillInventoryActivity / SecurityActivity / SettingsActivity / AiAccountsActivity / OpsCenterActivity / AboutActivity` @@ -124,6 +124,9 @@ cd /Users/kris/code/boss - `2.2.1` 已继续补齐原生交互细节:聊天页会即时显示本地“发送中”气泡,并且只在用户接近底部或本次发送主动触发时自动滚到底;关于页会显示 OTA 下载进度 / 重试 / 安装授权提示,离开后再回来仍会恢复本地下载状态;根 tab 会记住最近一次用户停留页,并把一级页返回逻辑收成“先回会话 tab,再按一次返回进入后台” - `2.3.0` 已把原生会话模型切到“线程 = 聊天窗口”:补上文件夹名副信息、后台活跃数量动态图标、微信式会话信息页、线程改名、独立群聊创建、群资料页,以及 `主 Agent / 审计对话` 普通置顶会话化 - `2.4.0` 已把原生消息转发切到微信式链路:单条消息支持长按直接转发,多选消息支持合并转发成聊天记录卡片,统一使用原生会话选择页替换旧的备注转发页 +- `2.5.0` 已补齐聊天附件主链:原生聊天框左侧 `+` 已改成底部抽屉,支持图片 / 视频 / 文件发送;图片 / PDF / 文本会自动排队给主 Agent 分析,视频 / Office / 大文件改成手动触发 +- `2.5.0` 已上线 `我的 > 附件与存储`:默认使用服务器文件存储,用户可切到阿里 OSS 私有桶并填写最小配置;下载链会使用附件上传时固化的 OSS 快照,避免后续改配置后旧附件失效 +- 当前附件分析任务已带受控 `task token` 下载链接和文本摘录:本地开发环境会跟随请求 origin 生成链接,生产环境默认走 `https://boss.hyzq.net` ## 2. 服务器状态 @@ -207,7 +210,7 @@ cd /Users/kris/code/boss - API 容灾当前由用户在 APP 的 `我的 > AI 账号` 页面自行配置 `OpenAI API` 账号,不再依赖服务器预置 Key - 原生 Android 的二级深层页虽然仍保留 `ProjectForwardActivity / ThreadDetailActivity / OpsCenterActivity` 等能力,但它们已经退出主 UI 正面;后续如再加入口,需继续遵守“一级微信式,复杂能力下沉”的规则 - Android 本地 Gradle 验证当前必须串行执行;如果并发跑 `testDebugUnitTest / compileDebugJavaWithJavac / assembleDebug`,会导致中间产物互踩并出现假失败 -- 图片 / 视频真实文件上传仍未接对象存储 +- 聊天附件当前已经支持真实上传、消息落账本、受保护下载和原生打开;默认后端为服务器文件存储,可按用户切到阿里 OSS 私有桶 - 认证虽然已有最小会话 Cookie,但还没有刷新令牌、跨端会话治理、CSRF 防护和更细的风控策略 - 邮件对外正式投递仍缺少 DNS / 信誉相关的最终收口,例如 SPF、DKIM、DMARC、MX 与退信策略 - 外部真实邮箱的 end-to-end 收件链路还没有在生产账号上完成最终验收 diff --git a/public/downloads/boss-android-latest-aab.json b/public/downloads/boss-android-latest-aab.json index 3144704..ffee918 100644 --- a/public/downloads/boss-android-latest-aab.json +++ b/public/downloads/boss-android-latest-aab.json @@ -1,11 +1,11 @@ { "artifactType": "aab", - "fileName": "boss-android-v2.4.0-release.aab", - "urlPath": "/downloads/boss-android-v2.4.0-release.aab", - "sizeBytes": 2894817, - "updatedAt": "2026-03-28T00:59:18Z", - "sha256": "beaca830a470bb5af180cb75dff60fc9e2039f10214480ae0cd7503bd793af22", - "versionName": "2.4.0", - "versionCode": 12, + "fileName": "boss-android-v2.5.0-release.aab", + "urlPath": "/downloads/boss-android-v2.5.0-release.aab", + "sizeBytes": 2906325, + "updatedAt": "2026-03-29T09:19:37Z", + "sha256": "e230a1e0eae8e1e6d264f11feb3125ff40661dc2e049e18d8f683c3571e3a568", + "versionName": "2.5.0", + "versionCode": 13, "buildFlavor": "release" } diff --git a/public/downloads/boss-android-latest.aab b/public/downloads/boss-android-latest.aab index 7efbf84..9498c1b 100644 Binary files a/public/downloads/boss-android-latest.aab and b/public/downloads/boss-android-latest.aab differ diff --git a/public/downloads/boss-android-latest.apk b/public/downloads/boss-android-latest.apk index cc9802e..143d82a 100644 Binary files a/public/downloads/boss-android-latest.apk and b/public/downloads/boss-android-latest.apk differ diff --git a/public/downloads/boss-android-latest.json b/public/downloads/boss-android-latest.json index d08462b..75a7da6 100644 --- a/public/downloads/boss-android-latest.json +++ b/public/downloads/boss-android-latest.json @@ -1,10 +1,10 @@ { - "fileName": "boss-android-v2.4.0-release.apk", + "fileName": "boss-android-v2.5.0-release.apk", "urlPath": "/api/v1/user/ota/package", - "sizeBytes": 3071649, - "updatedAt": "2026-03-28T00:59:14Z", - "sha256": "34831f13e8458fe668f7358c6a0d37d39430d3b8002a6c998b445b40f99e3672", - "versionName": "2.4.0", - "versionCode": 12, + "sizeBytes": 3083087, + "updatedAt": "2026-03-29T09:20:05Z", + "sha256": "92183a0ebed80da5e363ffcd8e41a4acfd650aac76072ac5a4e432af5902f59f", + "versionName": "2.5.0", + "versionCode": 13, "buildFlavor": "release" } diff --git a/public/downloads/boss-android-v2.5.0-release.aab b/public/downloads/boss-android-v2.5.0-release.aab new file mode 100644 index 0000000..9498c1b Binary files /dev/null and b/public/downloads/boss-android-v2.5.0-release.aab differ diff --git a/public/downloads/boss-android-v2.5.0-release.apk b/public/downloads/boss-android-v2.5.0-release.apk new file mode 100644 index 0000000..143d82a Binary files /dev/null and b/public/downloads/boss-android-v2.5.0-release.apk differ