From f3ee2e0d7b2389128a7fb1715d89aebd58a0027b Mon Sep 17 00:00:00 2001 From: AskaEth Date: Mon, 5 Oct 2026 14:42:20 +0800 Subject: [PATCH] =?UTF-8?q?docs(05):=20=E9=94=9A=E7=82=B9=E8=A1=A5?= =?UTF-8?q?=E8=AE=B0=E5=8D=81=E5=9B=9B=E2=80=94=E2=80=94W42=20=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E5=85=A5=E5=8F=A3=E6=94=B9=E5=A4=9A=E9=80=89=EF=BC=88?= =?UTF-8?q?N=20=E5=BC=A0=E6=8C=89=E6=97=A2=E6=9C=89=E5=88=87=E5=88=86?= =?UTF-8?q?=E8=90=BD=E6=88=90=20N=20=E6=9D=A1=E6=B6=88=E6=81=AF=E3=80=81?= =?UTF-8?q?=E5=88=87=E5=88=86=E6=8A=BD=E6=88=90=E5=94=AF=E4=B8=80=E7=BA=AF?= =?UTF-8?q?=E5=87=BD=E6=95=B0=E7=94=B1=E8=BE=93=E5=85=A5=E6=A0=8F=E4=B8=8E?= =?UTF-8?q?=E5=88=86=E4=BA=AB=E5=85=B1=E7=94=A8=EF=BC=89=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E7=99=BB=E8=AE=B0=E4=B8=A4=E5=A4=84=E5=BE=85=E4=B8=BB=E4=BA=BA?= =?UTF-8?q?=E8=BF=87=E7=9B=AE=EF=BC=88N>=3D2=20=E6=97=B6=E5=81=8F=E5=A5=BD?= =?UTF-8?q?=E5=8F=AA=E5=A5=97=E7=AC=AC=E4=B8=80=E6=9D=A1=E3=80=81=E8=B6=85?= =?UTF-8?q?=E9=99=90=E6=96=87=E6=A1=88=E5=B8=A6=E3=80=8C=E5=88=86=E4=BA=AB?= =?UTF-8?q?=E7=9A=84=E3=80=8D=E5=AD=97=E6=A0=B7=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devdocs/05-开发进度与交接.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) 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. 上一条那两个决定等主人一句话。