From 811d011178644e88a73b2ec20ce0e35851bf4465 Mon Sep 17 00:00:00 2001 From: kris Date: Tue, 31 Mar 2026 23:40:07 +0800 Subject: [PATCH] fix: shorten android chat send timeout --- README.md | 1 + .../app/src/main/java/com/hyzq/boss/BossApiClient.java | 3 ++- .../com/hyzq/boss/BossApiClientDispatchPlansTest.java | 8 ++++---- docs/architecture/current_runtime_and_deploy_status_cn.md | 1 + 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 160ca4e..95b7c7c 100644 --- a/README.md +++ b/README.md @@ -115,6 +115,7 @@ Android APK: - 当前 `AI 账号` 页顶部会显式展示“当前主控身份”,并提供 `校验主控 / 测试主 Agent 对话` 两个动作,切换主控后可直接验证聊天通路 - 当前 `OpenAiOnboardingActivity` 在登录成功后会直接给出 `测试主 Agent 对话` 入口,可一键跳到 `master-agent` 聊天页 - 当前主控若还是 `Master Codex Node`,但节点离线或执行立即失败,主 Agent 会优先尝试已配置的 `OpenAI API` 备用账号,避免聊天直接掉成失败日志 +- 当前原生 Android 的聊天发送已改成更短的客户端等待窗口;`master-agent` 单聊依赖服务端快速入队和消息流里的“思考中 / 超时 / 重试等待”状态,不再要求客户端长时间同步阻塞 - 当前群资料页已经支持“修复群成员”:如果历史脏群里混入了 `master-agent` 或失效线程引用,前台会明确提示并允许重新选择真实线程成员,修复后会正式写回群成员账本 - 当前原生聊天页也会直接提示“修复群成员”:当群里存在失效线程或不可下发成员时,`ProjectDetailActivity` 会在消息流上方直接给出 `去修复` 入口,并跳到群资料页完成修复 - 当前 Web 群聊页也已补上待确认推荐的刷新恢复:群聊详情会在服务端读取最近一条 `pending_user_confirmation` 的 dispatch plan,并在刷新或重新进入页面后继续显示“等待你确认主 Agent 推荐” diff --git a/android/app/src/main/java/com/hyzq/boss/BossApiClient.java b/android/app/src/main/java/com/hyzq/boss/BossApiClient.java index 60c18ab..dd041a6 100644 --- a/android/app/src/main/java/com/hyzq/boss/BossApiClient.java +++ b/android/app/src/main/java/com/hyzq/boss/BossApiClient.java @@ -30,6 +30,7 @@ public class BossApiClient { private static final int DEFAULT_CONNECT_TIMEOUT_MS = 12000; private static final int DEFAULT_READ_TIMEOUT_MS = 12000; private static final int CHAT_FLOW_READ_TIMEOUT_MS = 65000; + private static final int CHAT_SEND_READ_TIMEOUT_MS = 20000; private static final String PREFS_NAME = "boss_native_client"; private static final String KEY_SESSION_COOKIE = "session_cookie"; private static final String KEY_RESTORE_TOKEN = "restore_token"; @@ -181,7 +182,7 @@ public class BossApiClient { "/api/v1/projects/" + encode(projectId) + "/messages", payload.toString(), DEFAULT_CONNECT_TIMEOUT_MS, - CHAT_FLOW_READ_TIMEOUT_MS + CHAT_SEND_READ_TIMEOUT_MS ); } diff --git a/android/app/src/test/java/com/hyzq/boss/BossApiClientDispatchPlansTest.java b/android/app/src/test/java/com/hyzq/boss/BossApiClientDispatchPlansTest.java index 905bccb..c19b3cf 100644 --- a/android/app/src/test/java/com/hyzq/boss/BossApiClientDispatchPlansTest.java +++ b/android/app/src/test/java/com/hyzq/boss/BossApiClientDispatchPlansTest.java @@ -110,7 +110,7 @@ public class BossApiClientDispatchPlansTest { } @Test - public void sendProjectMessageUsesExtendedReadTimeoutForMasterAgent() throws Exception { + public void sendProjectMessageUsesQueueFriendlyReadTimeoutForMasterAgent() throws Exception { RecordingConnection connection = new RecordingConnection(new URL("https://boss.hyzq.net/api/v1/projects/master-agent/messages")); RecordingBossApiClient apiClient = new RecordingBossApiClient(connection); @@ -120,11 +120,11 @@ public class BossApiClientDispatchPlansTest { assertEquals("/api/v1/projects/master-agent/messages", apiClient.lastPath); assertEquals("POST", connection.requestMethodValue); assertEquals(12000, connection.connectTimeoutValue); - assertEquals(65000, connection.readTimeoutValue); + assertEquals(20000, connection.readTimeoutValue); } @Test - public void sendProjectMessageUsesExtendedReadTimeoutForNormalThread() throws Exception { + public void sendProjectMessageUsesQueueFriendlyReadTimeoutForNormalThread() throws Exception { RecordingConnection connection = new RecordingConnection(new URL("https://boss.hyzq.net/api/v1/projects/thread-1/messages")); RecordingBossApiClient apiClient = new RecordingBossApiClient(connection); @@ -134,7 +134,7 @@ public class BossApiClientDispatchPlansTest { assertEquals("/api/v1/projects/thread-1/messages", apiClient.lastPath); assertEquals("POST", connection.requestMethodValue); assertEquals(12000, connection.connectTimeoutValue); - assertEquals(65000, connection.readTimeoutValue); + assertEquals(20000, connection.readTimeoutValue); } @Test diff --git a/docs/architecture/current_runtime_and_deploy_status_cn.md b/docs/architecture/current_runtime_and_deploy_status_cn.md index 359911d..e302c21 100644 --- a/docs/architecture/current_runtime_and_deploy_status_cn.md +++ b/docs/architecture/current_runtime_and_deploy_status_cn.md @@ -112,6 +112,7 @@ cd /Users/kris/code/boss - 当前 `OpenAiOnboardingActivity` 在登录成功后会直接弹出 `测试主 Agent 对话`,可一键进入 `master-agent` 聊天页验证主控链路 - 当前 `AI 账号` 页顶部会直接展示“当前主控身份”,并提供 `校验主控 / 测试主 Agent 对话` 两个入口,切换主控后不必再手动退回会话页验证 - 当前如果主控身份还是 `Master Codex Node`,但该节点离线或执行立即失败,主 Agent 会优先尝试已配置的 `OpenAI API` 备用账号,不再把失败日志直接原样回给用户 +- 当前原生 Android 的聊天发送已收短客户端等待窗口;`master-agent` 单聊依赖服务端快速入队和消息流里的“主 Agent 思考中 / 回复超时 / 重试等待”状态,不再要求客户端长时间同步阻塞 - 当前设备导入主链也已补上第一轮后端闭环:`heartbeat` 可上报真实项目候选,服务端会生成 `deviceImportDraft`;用户可提交勾选结果、生成导入决议,再把选中的线程真正落成聊天窗口 - Web 与原生 Android 当前都已补上“新设备导入草稿 -> 勾选 -> 决议预览 -> 应用导入”的前台流程;已绑定生产设备继续保留 heartbeat 自动导入主链 - 当前设备导入前台的状态表达已经统一为:`等待候选线程 / 等待勾选 / 建议生成中 / 建议已生成 / 已导入`,并会回显最终导入的线程名