diff --git a/devdocs/05-开发进度与交接.md b/devdocs/05-开发进度与交接.md index c10fff2..fbeefda 100644 --- a/devdocs/05-开发进度与交接.md +++ b/devdocs/05-开发进度与交接.md @@ -987,3 +987,26 @@ curl -s -X PATCH "$BASE/api/v1/sessions/$SID" -H "Authorization: Bearer $TOK" \ > 2. 「任何 REST 失败都进队列」若要做,先设计图片/附件的安全重放。 > 3. `gapCursor == null` 且本端为空那条残留洞:可加「重连时 `loadLatest` 一次」兜底。 > 4. **W42(图片按钮改多选)已派单**(`feat/W42-image-multipick`,基线已追到 `eb22521`)。 + +> ## ★★ 锚点补记十四(2026-10-06 凌晨 · W42 图片入口改多选) +> +> ### 状态 +> `android` = `origin/android` = **`4355ebd`**(W42 合并提交;分支提交 `5a9f52a`);主树 **1143 测试 / 0 失败 / 0 错误**。W42 worktree 已清。 +> ⚠️ **只有编译 + JVM 单测证据,没有真机**(多选器交互与缩略图观感未经仪器测试)。 +> +> ### 改了什么 +> - **`PickVisualMedia()`(单选)→ `PickMultipleVisualMedia(ShareRules.MAX_IMAGES)`**(= 4),**仍然零权限**(没退回 SAF/存储授权)。回调变 `onImagesPicked(List)`;发送键可用性判据改看列表。 +> - `ChatUiState.draftImage: String?` → **`draftImages: List`**;输入栏上方的预览从一枚键变成**每张各自一枚移除键**(顺序即发送顺序);图片入口在**攒满 4 张后隐藏**(先移除才能重选)。 +> - **切分抽成唯一出处**:新增纯函数 `ui/chat/ImageSendPlan.kt` 的 `imageSendPlan(text, images, documents)`。 +> 判据:N=0 ⇒ 1 条(正文+附件);N=1 ⇒ 1 条(正文+图+附件);N=2…4 ⇒ N 条(**第一条**带正文+第一张图+全部附件,其余每条空正文+一张图);**N>4 ⇒ 只切 4 条**,超限张数如实报出。 +> - **复用而非另起**:分享路径原本那段切分是 `sendShared` 里内联的 `forEach`(**不是**纯函数),本次把它抽成 `imageSendPlan` + 私有 `emitPlannedMessages`,**输入栏那条路与分享落地共用同一段**。每张图的解码/缩放/重编码与「内联 or `/upload`」仍逐张走既有 `emitAndDeliver → deliver → deliverImage`。 +> - 超限文案抽成 `ShareRules.truncatedImagesNotice(kept, dropped)`(**逐字沿用**既有那句),分享路径与图片入口共用。 +> +> ### ⚠️ 两处要主人过目(子代理主动交代的) +> 1. **N≥2 时「她忙时发消息」偏好只套用在第一条**(`applySendPreference && index == 0`)。理由:第 2 条起声明打断=打断自己刚起的上一轮。 +> 替代方案是像分享路径那样**整批不声明**(改一行)。**N=1 时与今天逐字节相同**,所以这是个只影响新形态的选择。 +> 2. **文案措辞**:那句超限告知原文以「**分享的**图片」开头,现在也会出现在**图片入口**(那里并没有"分享")。任务书要求逐字沿用,所以照做;要改成入口中性的措辞属新文案,需主人拍板。 +> +> ### 待办(本节的) +> 1. **W42 真机**:多选器交互、输入栏那排缩略图观感、N 张落成 N 条的落库形态(模拟器或真机都行)。 +> 2. 上一条那两个决定等主人一句话。