Repository navigation
Load Steward history images as they come into view - #8601
loopx-agent wants to merge 3 commits into
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
本次评审对应提交 667d6da51bfb984efb3c8c0612d5cde896e82c5e。
[P2] 让历史图片在原消息处恢复。 图片 GET 一次返回 503 后,同一地址恢复 200,原对话里的图片仍损坏。点「刷新状态」或保持原阅读位置都不会重试;切出再进入并滚回旧消息后才恢复。 时间线渲染
动机 / Motivation
回到原管家会话查找带图证据的人,需要尽快读到文本,也要能在原消息处读回图片。打开已绑定的管家对话,要在收到包含所有历史图片 base64 的分页后才能读消息。历史分页改送原图地址;滚动到较早消息时再取对应字节。90 条历史、12 张图的配对样本中,首次历史 JSON 从 1,173,427 字节降到 29,215 字节。原图、消息顺序和分页摘要都能按原会话读回;较早的图片在滚到它时才发请求。本轮验证的是隔离打包 App 与真实本地 HTTP/原会话存储,不等同已安装 App、在线飞书或端到端延迟收益。新链路缺一次图片请求暂时失败后的原位恢复。
改动思路 / Approach
分页和媒体读取继续复用原会话、附件及可见历史校验;原图无需在首屏随正文一起传输。保留该传输,补上图片读取失败后的原位恢复即可。 前端沿用原来的会话分页和 source 校验,只在同源绑定会话选择链接形式。服务端从原消息核对附件和摘要;这条额外的网络请求需要独立处理暂时失败。
具体改动 / Changes
关键代码讲解
以 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @ 6fdc007 为准。BOUND-APP-ORIGINAL、FROZEN-PREFIX 和 LEGACY-SCOPE 已核对;HISTORY-RECOVERY 未满足。前端请求头 同时覆盖首次和增量历史。地址与原图读取 保留消息、位置及内容版本;变化后旧地址和旧分页证明失效。原 journal 继续校验当前内容并复用解析,时间线 交给浏览器按需取图,但没有处理图片读取失败。普通、无分页及指定 Turn 的响应继续内联。
对主干的风险 / Risks
在实际打包界面里,让一张较旧图片的首次 GET 短暂返回 503,再恢复同一份 journal。原地址已返回 200 和原来 97,337 字节,点「刷新状态」后仍只见损坏占位,没有新的图片请求。切出对话、回来并重新滚到原消息才读回原图。正文始终可读。
语义与 CI 对齐
精确 head 的 252 项 Python 测试、两个提交的打包构建、Core 类型检查、diff、DCO 和双语检查通过;基线 14 项相关历史用例通过。实测 12 张原图逐字节匹配,错摘要和跨站请求拒绝。上面的浏览器失败用例仍未通过,未查询托管 CI。
我的整体评价 / Verdict
保留按需传输及现有摘要检查。请让用户留在原消息就能看见暂时失败并重试;复测恢复后原图读回,同时确认旧摘要仍拒绝。每次取图仍读取原 journal,当前没有整段历史时延或完整 IO 的收益结论。 桌面首屏与基线的最新图文排布一致;390 像素窄屏可读旧图与消息。临时失败后桌面只留文件名和损坏占位,同一位置没有恢复入口。 浏览验证用合成内容,未测已安装 App、实时飞书或真实用户的阅读时延。
English verdict: REQUEST_CHANGES. At 667d6da, the linked response defers original bytes, but one temporary image failure remains broken after normal refresh. Add and verify in-place recovery.
| <ReturnDeliveryStatus delivery={item.message.returnDelivery} /> | ||
| {item.message.queueInputCancelled ? <span>{locale === "zh-CN" ? "已取消排队" : "Cancelled before starting"}</span> : null} | ||
| {item.message.attachments?.length ? <div className="personal-message-images">{item.message.attachments.map((attachment) => isDocumentAttachment(attachment.mimeType) ? <DocumentAttachment key={attachment.id} {...attachment} zh={locale === "zh-CN"}/> : <img alt={attachment.name} key={attachment.id} src={attachment.dataUrl} />)}</div> : null} | ||
| {item.message.attachments?.length ? <div className="personal-message-images">{item.message.attachments.map((attachment) => isDocumentAttachment(attachment.mimeType) ? <DocumentAttachment key={attachment.id} {...attachment} zh={locale === "zh-CN"}/> : <img alt={attachment.name} key={attachment.id} src={attachment.dataUrl} loading="lazy" />)}</div> : null} |
There was a problem hiding this comment.
[P2] 让历史图片在原消息处恢复。 实际打包界面中,先成功打开已绑定的管家对话,再滚到尚未加载的旧图。让隔离 journal 暂时不可读,该图片请求返回 503;恢复原字节后,同一地址已经返回 200 和原来 97,337 字节。点「刷新状态」仍只有损坏占位,浏览器没有再发图片请求。切出对话、重进再滚动才恢复。请提供可见的失败状态和原位重试,或沿现有恢复动作有界重读;保留原 Session、消息、位置和摘要检查,勿让旧地址绕过 404。
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
…story-images-20261111 Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Request changes conclusion (author-owned PR; GitHub blocks formal self-review)
Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · max
本次评审对应提交 8273db97d827867b8c792a1f9f8aba2f701ffb18。
[P2] 刷新历史后采用同一原消息的新图片地址。 原图字节变化后,服务端拒绝旧地址并在新历史里给出有效的新地址。挂载中的消息在刷新后仍持有旧摘要,点「重试图片」继续拿到 404。重开同一条原消息才显示当前图片。 重试分支
动机 / Motivation
在已绑定管家对话里追溯图片证据的人。打开已绑定的管家对话时,历史分页把 12 张合成原图都作为 base64 送入浏览器。同源 App 改用带原图摘要的地址,先到最新消息或指定消息,再读取附近图片。旧问题中的临时 503 已能通过原消息内的「重试图片」恢复。同一 90 条历史的 JSON 从 1,173,427 降到 29,215 字节,12 张原图逐字节一致。最新视图只读附近图片,临时 503 在同一条消息恢复。验证范围为打包 Dashboard、真实本机 HTTP 和隔离合成原会话,原生安装与在线飞书未参与。原图字节变化后,服务端拒绝旧地址并在新历史里给出有效的新地址。挂载中的消息在刷新后仍持有旧摘要,点「重试图片」继续拿到 404。重开同一条原消息才显示当前图片。
改动思路 / Approach
保留原消息、附件和分页摘要的校验。浏览器负责可见位置与重试,已验证历史负责带回当前附件地址。新提交解决了临时失败。请让已有历史合并路径更新同一条已验证消息的图片引用。 绑定历史继续走原会话的分页和验证。浏览器定位到最新或指定消息之后才请求附近图片。短暂失败后的重试仍用同一地址,已失效的摘要则要从最新验证的原历史取得替换地址。
具体改动 / Changes
关键代码讲解
以 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md @ 3a5899f 为准。ORIGINAL-IMAGE 与 TRANSIENT-IN-PLACE-RETRY 已验证,STALE-HISTORY-RECOVERY 未满足。图片地址投影 把原消息、附件槽和摘要写进地址,分页证明也随地址更新。消息定位 完成后才加载附近图片。原消息重试 恢复原地址的暂时失败。刷新后的历史合并 仍保留已有附件,当前读取给出的新引用没有进入已经显示的那条消息。
对主干的风险 / Risks
保持同一 Session、消息和附件槽,只在隔离样本中换图。旧分页证明要求重读,新地址返回 200 和 57,803 字节。点击「刷新状态」确实发出历史读取,随后点「重试图片」仍请求旧地址并返回第二次 404。重开同一条原消息后,新图立即显示。基线始终有已下载的内联图可读,这次新增的地址失效让旧位置直接变成空图。
语义与 CI 对齐
90 条历史、12 张图,分页 JSON 从 1,173,427 降到 29,215 字节,原图逐字节一致。桌面和窄屏从最新消息打开不会取最旧图,窄屏深链正确聚焦。此前 503 发现已复测通过,两次 503 后可用同一地址原位恢复。252 项 Python 检查、两份打包构建、DCO、diff 和双语检查通过。保留对旧摘要及外部来源的拒绝。
我的整体评价 / Verdict
保留延迟加载和原位 503 重试。请让刷新后的已验证附件引用进入原消息,补上旧地址 404 后的同页恢复用例。 桌面和窄屏的最新消息与两张原图仍在同一位置。旧图短暂失败后可在消息内恢复。图像摘要已经更换时,刷新后同一条消息仍留着旧图的失败状态。 验证用隔离合成原会话,未测已安装 App 或线上服务。
English verdict: REQUEST_CHANGES. Transient 503 recovery now works at the original message. The mounted row still retries an expired digest after a verified history refresh. Adopt the verified replacement attachment without reopening the conversation.
| }, [ready, requested, source]); | ||
| if (requested && imageRead.failed) return <div className="personal-history-notice"> | ||
| <div role="status"><span>{name}</span><span>{zh ? "图片无法显示" : "Could not load image"}</span></div> | ||
| <button type="button" onClick={() => setImageRead({source})}>{zh ? "重试图片" : "Retry image"}</button> |
There was a problem hiding this comment.
[P2] 刷新后使用已验证的新图片地址。 在真实打包界面保持同一原会话、消息和附件槽,只替换隔离样本中的一张图。旧分页证明返回 restart,新地址返回 200 和 57,803 字节。点击「刷新状态」完成历史读取后,这里的重试仍发出同一旧地址并返回 404。重开原消息后可见新图。现有 reconcileConversationReturns 保留旧附件,即使同源历史已读回新链接。请只从同一原 Session 和消息的已验证历史更新附件引用,保留旧摘要 404、原位 503 重试及活跃消息,补一个实际浏览器回归。
Opening a bound Steward conversation used to transfer every historical image as base64 before the timeline could render. The same-origin App now asks for image links in its paged history. It positions the conversation at the latest result or the requested message before fetching the nearby images.
If an image read fails, the user can retry it in the original message. The retry uses the same Session, message, attachment slot, and content digest. A changed image still invalidates its previous link and history proof. The journal, legacy inline responses, and Turn input remain unchanged.
Validation: the packaged browser test checks that opening the latest result skips the offscreen image, scrolling requests it, a 503 can be retried to a 200 at the same address, and a direct link only loads the image at that position. The bound conversation and original quote browser smokes, focused HTTP tests, dashboard build, and standard pre-merge canary also passed.