Skip to content

Releases: ifzzh/iPaper

iPaper 1.13.7 — 笔记会话与准确来源回访

Choose a tag to compare

@ifzzh ifzzh released this 23 Sep 09:29

iPaper 1.13.7

Web 1.13.7 修复笔记在切换视图、处理冲突和等待限流时的保存问题,并将摘录回访绑定到实际来源。两个 Worker 复用 1.2.0,无数据库结构变化。

变化

  • 笔记按账号与论文保留同一个保存会话。切换页签、收起侧栏或切换原译文后,未决冲突仍须明确选择,不会自动用本地稿覆盖服务器。
  • 冲突决定只确认点击时提交的版本;等待期间输入的新内容继续保留并在确认后保存。面板和编辑器中的决定按钮使用同一队列。
  • Retry-After 等待由定时器唤醒,继续输入、离焦或重新打开面板不会递归重入保存过程,也不会提前发送请求。
  • 摘录回访先校验受控批注,再切换到确切 PDF 文档或结构结果及原译文侧;对应页面或内容块加载后才显示已定位。未保存的笔记保留,异步 PDF 加载不会再次抢占页签。

验证与发布状态

发布源码:65e00b49229b39ac9b9605b37e698f9202f894c1,平台 linux/amd64。Web/test 构建中的 354 个应用与前端产物逐文件哈希一致,运行镜像已从 Docker Hub 按固定摘要回拉校验。

  • 完整 Docker 非集成:577 passed+84 subtests;前端类型、36 项单元、构建与 npm audit 通过。
  • 候选镜像前端+隔离真实 API/合成夹具:笔记 21 项、组合回归 8 项、统一界面 16 项,合计 45 项通过。测试容器使用测试依赖和本地假供应商;不宣称对正式论文发起了相同的写入测试。
  • 四份 pip-audit 均为 0;Trivy 源码与三镜像无 HIGH/CRITICAL;三组件 SBOM 已生成,仅保存于私有证据。有效例外范围见源码提交对应的 漏洞例外。
  • 精确发布提交的 dev/main CI 均已通过(runs 35840774574 / 35842390634,无原始报告附件)。

本轮验收不发起真实模型、MinerU、OCR 或翻译请求。

正式验收

Web 已按上述固定摘要部署,三个服务健康,/readyz 通过。正式 AutoSci 原文实际渲染 22 页,三条真实浏览器验收通过:慢保存期间继续输入及切换页签、冲突跨侧栏/页签仍冻结且决定期间的新输入保留、实际 Web 重启后的笔记与冲突副本恢复及 390px 阅读。

本轮笔记写入使用独立标识,清理前按 owner/paper/revision/正文逐条核验;已有论文、聊天、处理结果、阅读位置、阅读历史及账号偏好哈希保持不变,临时记录已清理。来源跨文档/语言侧与 429 等待的组合验证来自候选镜像前端及隔离夹具,不冒充正式数据场景。维护会话已撤销,Daily 原设置按字节恢复并恢复启用运行。两个 Worker 全程未重启,1897 个既有文件逐项哈希一致;备份与只切换 Web、保留当前数据的回退工具已就绪。

组件与回退

组件 固定镜像
Web ifzzh520/ipaper:1.13.7@sha256:635e8a2e754b814d1a67af6f359989e452c5f862dc339a4d3aefb6bc6b14eb60
Translation Worker ifzzh520/ipaper-translation-worker:1.2.0@sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
Document Worker ifzzh520/ipaper-document-worker:1.2.0@sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

回退基线为 Web 1.13.6+Workers 1.2.0,保留当前数据库与已有笔记、冲突副本和来源记录;回退会重新暴露上述旧前端缺陷。未保存稿是浏览器会话内存,离开页面有提醒,不承诺浏览器重启后恢复。私人验收证据、备份、扫描 JSON 与 SBOM 不作为公开 Release 附件。

iPaper 1.13.6 — 被拒冲突决定的重新绑定

Choose a tag to compare

@ifzzh ifzzh released this 23 Sep 06:32

1.13.5 的镜像验收中 V1/V3/V5 通过、仅 V2「保留服务器版本」方向失败。插桩后拿到决定性证据:面板级按钮确实发送了编辑器捕获的"所见修订",但服务端报告笔记已再次前进(note_revision_conflict + preservedConflictId)——即用户看到冲突后笔记又被写入了。服务端拒绝过期决定并保留未看过的内容是正确安全的行为,问题是界面被拒后仍停留在过期修订,点第二次也不会成功。

修复

  • 决定被拒后重新绑定:父级收到 note_revision_conflict 时清掉过期的"所见修订"捕获,重新拉取笔记并把待决冲突绑定到最新的冲突行与修订,用户可再次决定并作用于服务器当前版本(被替换内容已由服务端另存副本)。
  • 编辑器在笔记冲突行变化时重新上报待决冲突,两个阅读器行为一致。
  • 镜像验收脚本把"决定被拒一次"视为合法路径:最多重试三次(每次等待刷新后的按钮),记录每次请求体与响应状态。

验证

  • 隔离笔记套件 21 项、复核 5 个复现、后端 25 项全部通过;类型检查与构建通过。
  • 1.13.5 镜像上的逐步探针确认 V1 收尾为「已保存」(服务器与编辑器同为最新正文、零冲突)。
  • 安全门禁:4×pip-audit 0、Trivy 源码 0、三镜像 0 HIGH/CRITICAL、SBOM、dev/main CI success。
  • 镜像验收:对本补丁镜像复跑 V1/V2/V3/V5。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.6 sha256:31cfc89dc4351d3aeaf355b3d1dab3a4768ac1bac23dead25225a456628d1b1c
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 42d579a。

限制与回退

  • 回退基线 Web 1.13.5 + Workers 1.2.0;笔记/冲突/来源记录不因回退丢失。
  • 不含跨论文笔记工作区、Agent、RAG、图谱与带批注 PDF 导出。

iPaper 1.13.5 — 冲突决定的修订来源与保存状态自愈

Choose a tag to compare

@ifzzh ifzzh released this 23 Sep 05:50

1.13.4 之后用已发布镜像自带前端复跑镜像验收,V1/V3/V5 通过、V2 的「保留服务器版本」方向仍失败,且 V1 收尾状态显示"未保存的修改"(服务器与编辑器其实都已是最新正文)。逐步骤诊断确认两处原因并修复。

修了什么

  • 面板级冲突提示的决定没有带上编辑器所见的修订:NoteConflictBanner 调用决定接口时未传 revision,父级只能用自己 state 里的 note 修订(可能已过期)→ 服务端按"过期决定"拒绝,冲突保持未决。现在 revision 优先级为"调用方传入(编辑器捕获的所见修订)→ 编辑器当前待决冲突的修订 → 本页 note 的修订",只有都未知时才先重新拉取一次;编辑器通过 onConflictChange 上报待决冲突,两个阅读器共用,面板入口与编辑器内按钮语义一致。
  • 保存状态自愈:服务器正文与编辑器正文完全一致且无待决冲突时,编辑器立即进入「已保存」(清掉草稿与待发保存),不再对服务器已持有的正文显示"未保存"。

验证

  • 隔离笔记套件增至 21 项,新增:①打开批注页签让编辑器卸载后,用面板级冲突提示"保留我的草稿",断言决定 200、服务器为该文本、被替换的远端文本仍可找回、回到笔记页签显示已保存;②服务器已持有编辑器所显正文时不得显示"未保存"。
  • 复核 5 个复现、后端 25 项与全量 Docker 非集成套件继续通过;安全门禁 pip-audit/Trivy/SBOM 全 0;dev/main CI success。
  • 镜像验收:对本补丁镜像复跑 V1/V2/V3/V5(真实容器自带静态前端 + owner 作用域维护会话,用后撤销)。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.5 sha256:c64121187542fc403b9960527e322984429b3713d02fc6531f242f5b3d989ffc
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 133d0cd。

限制与回退

  • 回退基线 Web 1.13.4 + Workers 1.2.0;笔记/冲突/来源记录不因回退丢失。
  • 不含跨论文笔记工作区、Agent、RAG、图谱与带批注 PDF 导出。

iPaper 1.13.4 — 笔记保存去重与定时器隔离

Choose a tag to compare

@ifzzh ifzzh released this 23 Sep 03:46

用已发布镜像自带的前端复跑 V1/V2 镜像验收(逐步记录状态)后定位到三处与"重复保存/定时器互相取消"有关的问题,它们只在真实时序下暴露:

  1. 成功保存取消了待发的防抖:为取消"决定之后的重试"而在成功分支清掉的其实是同一个定时器,新文本的防抖被取消 → 新文本不再自动保存。
  2. 相同正文的重复/迟到提交被当成冲突:面板重挂载后再提交一次服务器已持有的正文时,旧基准让后端生成"两边内容相同"的冲突,界面停在"待选择"。
  3. 客户端去重在正文与服务器一致时仍会排一次保存。

修复

  • 定时器拆分:防抖与重试改为两个独立引用;成功保存只清重试、不再取消新文本的防抖;决定与切换论文时两者都取消。
  • 后端按内容幂等:笔记 PUT 提交的正文与服务器当前正文完全相同时(无论基准是否过期)直接返回当前笔记(duplicate: true),不制造冲突、不改写正文;正文不同且基准过期仍 409 并保留副本。
  • 客户端去重:记录服务器已知正文,恢复/重试在正文已一致时不再排保存,只标记「已保存」。

验证

  • 后端 tests/test_paper_notes.py 25 项(新增"重复确认当前正文不是冲突");全量 Docker 非集成套件通过(一次 arXiv 外部接口用例为网络抖动,单独复跑通过)。
  • 浏览器:复核 5 个复现全部通过;隔离笔记套件 19 项全部通过(含被本补丁修复的慢保存用例)。
  • 安全门禁:4×pip-audit 0、Trivy 源码 0、三镜像 0 HIGH/CRITICAL、SBOM、dev/main CI success。
  • 镜像验收:对本补丁镜像跑 V1/V2/V3/V5(真实容器自带静态前端 + owner 作用域维护会话,用后撤销,只创建可识别记录)。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.4 sha256:e44a4986447565758ad29b69e1d742a3d37e462aed89db5f594d9a8c570d0b91
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 1ad8797。

限制与回退

  • 回退基线 Web 1.13.3 + Workers 1.2.0(依次 1.13.2/1.13.1);笔记/冲突/来源记录不因回退丢失。
  • 不含跨论文笔记工作区、Agent、RAG、图谱与带批注 PDF 导出。

iPaper 1.13.3 — 已发布镜像的笔记边界补强

Choose a tag to compare

@ifzzh ifzzh released this 23 Sep 01:31

1.13.2 修好了 1.13.1 复核的 V1–V6;随后用已发布镜像的静态前端做真实镜像验收时,又暴露两处只影响真实时序的边界,本补丁收尾(同一主题,非新功能)。

修了什么

  1. 保存期间切换面板后再重挂载:较早请求在面板卸载后成功返回时,草稿表里的基准修订没有随之推进,重挂载后继续保存会拿旧基准,制造一次假冲突。现在成功响应即使组件已卸载,也会把草稿表的基准修订更新为服务器确认的新修订,草稿文本保持最新。
  2. 决定之后仍有在途定时保存:一次失败保存排定的自动重试可能在冲突已被决定、编辑器已换成服务器正文之后触发,用旧基准把服务器正文当草稿再提交 → 重复冲突。现在任何决定(及成功保存)都会取消待发的重试,重试回调也跳过"草稿 == 已确认正文"。

验证

  • 隔离套件 frontend/unified-tests/notes.spec.ts 19 项、后端 tests/test_paper_notes.py 24 项、全量 Docker 非集成套件、前端类型/单元/构建均通过。
  • 真实镜像验收脚本纳入仓库(frontend/production-notes-v132.spec.ts + playwright.production-v132.config.ts),对本补丁镜像运行 V1 慢保存期间继续输入、V2 真实冲突两个方向、V3 40 次连续保存、V5 摘录回到来源;只创建并清理可识别记录。
  • 安全门禁:4×pip-audit 0、Trivy 源码 0、三镜像 0 HIGH/CRITICAL、SBOM、dev/main CI success。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.3 sha256:e6189b458159938b12ce2bd7e9a92d923b7e2384d6d40c7cdf2d52741cea504c
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 94aa0ad。

限制与回退

  • 回退基线 Web 1.13.2 + Workers 1.2.0(更早为 1.13.1);笔记/冲突/来源记录不因回退丢失。
  • 不含跨论文笔记工作区、Agent、RAG、图谱与带批注 PDF 导出。

iPaper 1.13.2 — 笔记可靠性与写入限流补丁(V1–V6)

Choose a tag to compare

@ifzzh ifzzh released this 22 Sep 09:10

iPaper 1.13.2 逐项修复 1.13.1 独立复核的 V1–V6,并把复核的 2 个后端 + 5 个浏览器复现纳入常驻回归;没有放宽任何修订校验。仅 Web 变化,Worker 复用 1.2.0。

V1 保存期间继续输入/切换面板不再丢字

  • 成功、失败、冲突与"未知结果"四条路径都只把最新文本写入草稿(不再用请求快照覆盖更新的输入):较早请求成功时若已有更新输入,草稿不删除而是以新修订为基准继续保存;失败时也不会把 A 写回覆盖 B。
  • 草稿按 owner+paper 隔离并跨问答/批注/笔记、侧栏、原文/译文与论文切换存续;重新挂载自动恢复并继续保存。每请求带论文/账号纪元,迟到/重复响应不能改写新编辑器。

V2 冲突决定真正生效且可操作

  • 409 与重试对账发现的远端变更进入同一状态:并排对比服务器版本与我的草稿 + 「保留服务器版本 / 保留我的草稿」,不再只有文案没有按钮。
  • 保留服务器版本会同步编辑器、基准修订、草稿与状态;保留我的草稿提交当前确认的正文(随决定发送),被替换的服务器版本另存副本。
  • 决定期间暂停防抖/blur 自动提交并防重复;未决定前不推进基准,普通保存无法绕过冲突;决定后第三次写入时拒绝旧决定并展示新冲突;面板入口与编辑器入口等价。

V3 笔记写入的独立 owner 级限流与退避

  • 新增 note_writes(120 次 / 60 秒,owner 级)覆盖笔记 PUT、批注增删改、摘录插入、回答复制与冲突决定,不再消耗通用 mutation(60 次/小时);复核的"每十秒保存一次、连续十分钟"61 次全部成功,远超人类速度的爆发仍被拒。
  • 前端遵循 Retry-After:显示等待时长、保留最新草稿、等待期间继续输入并于到期保存最新文本;手动重试同样遵循;畸形/缺失头用 ≤60 秒有界后备。其他敏感入口阈值不变。

V4 冲突决定的修订比较严格化

  • revision 缺失/类型错误 → 400;null 只匹配真正不存在的当前版本;空字符串、旧字符串、错误字符串一律 409 并保留未见副本。修订矩阵进入常驻测试;旧删除修订的撤销仍 409。

V5 摘录从笔记回到来源

  • 笔记「来源」中的摘录带「回到来源」入口,复用批注自身的受控来源定位(四类内容各自的页/块/译文修订),不新建另一套导航;批注被删除时保留摘录并提示"来源批注已被删除,定位仅供参考",来源失效按既有规则降级。

V6 发布边界

ac82ea1..9f83967 之后的运行行为改动(409 后先重取再展示冲突、组件纪元校验、内容类型标注)与 V1–V5 一并纳入本补丁;验收使用本补丁确切产物与发布后固定摘要容器。

验证

  • 后端 tests/test_paper_notes.py 24 项(含限流节奏/有界/owner 隔离、修订矩阵、决定正文、单条批注读取);受影响回归与全量 Docker 非集成套件;复核 2 个后端复现通过。
  • 浏览器 frontend/unified-tests/notes.spec.ts 19 项(复核 5 个复现 + 429/Retry-After 等待并保存最新文本 + 既有持久高亮/笔记/回答/结构译文/双页面/页级记录等)。
  • 安全门禁:4×pip-audit 0、Trivy 源码 0、三镜像 0 HIGH/CRITICAL、SBOM、dev/main CI success。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.2 sha256:20b4792088b0f873a4ec9010cee115b1743c5cb1f386cb52b6503ee8a8d88bfb
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 7f9173e。

限制与回退

  • 不含跨论文笔记工作区、Agent、RAG、图谱与带批注 PDF 导出。
  • 结构摘录回访仍以存下的范围与完整摘录校验为准,无法匹配时只显示块级来源与说明。
  • 回退基线 Web 1.13.1 + Workers 1.2.0:不丢失已保存的笔记/冲突/来源记录(schema 只有兼容增量),但会重新暴露 1.13.1 的 V1–V5 缺陷。

iPaper 1.13.1 — 阅读笔记可靠性收尾(R1–R8)

Choose a tag to compare

@ifzzh ifzzh released this 22 Sep 03:45

iPaper 1.13.1 逐项收尾 1.13.0 独立验收的 R1–R8:不放宽任何修订校验,优先修好会丢失笔记的保存与冲突路径,再补齐四类批注、编辑/撤销、幂等、来源回访与额度边界。仅 Web 变化,Worker 复用 1.2.0。

R1 自动保存与编辑版本绑定

  • 单调编辑版本 + 串行保存泵:同一时刻只有一个 PUT;只记录"想要的文本",响应返回后继续发送最新文本。
  • 只有"确认版本 == 当前编辑版本"才显示「已保存」;慢响应、重复响应、切换论文/账号后的响应都不能改写新编辑器(请求带论文/账号纪元)。
  • 修复 1.13.0 受控 textarea 未回写本地状态的缺陷(此前实际无法连续输入)。

R2 失败草稿的可靠生命周期

  • 未提交文本按 owner + paper 存在会话级草稿表:切换问答/批注/笔记、收起侧栏、切换原文/译文后仍可恢复;重新挂载自动取回。
  • 「重试保存」+ 有界自动重试(3 次,3/8/20 秒);重试前先 GET 对账:服务器已有相同文本 → 直接确认已保存;修订已前进 → 转为冲突,不用旧草稿覆盖。
  • 有未保存内容时关闭页面有离开提醒;退出登录/账号变化清空该 owner 草稿;不写入无边界 localStorage、不落日志。

R3 冲突解决绑定所见修订并保留双方

  • 409 后立即重取笔记并展示服务器版本与我的草稿,笔记页签与批注面板都有「保留服务器版本 / 保留我的草稿」。
  • 解决请求必须带用户所见的 revision;期间第三次写入 → 409 stale_decision 并把未见内容另存为冲突副本;选择草稿时被替换的服务器版本同样另存。冲突记录不再删除(已应用标记 resolved:<choice>)。

R4 四类内容逐一修通

  • 版式译文改用该 document 自身受控文件校验(所有权/路径/指纹),不再拿原文哈希代替。
  • 结构批注按 documentId 查询(此前用 result id,保存成功但列表为空);结果与文档对应关系服务端核验。
  • translationRevision 接受现有字符串身份并核验确为该块当前译文修订;锚点校验块/字段/范围。

R5 批注编辑、改色、删除与撤销闭环

  • 删除成功后用服务器返回的新修订更新撤销记录;失败不显示已删除、撤销失败保留重试;后端继续拒绝旧修订。
  • 新增「编辑」:改文字 + 四色改色,保存/冲突/失败有状态;修改后刷新与回访仍正确。

R6 依据稳定身份判重

  • 回答按 (owner, paper, session, message)、摘录按 (owner, paper, annotation) 判重,正文用不可见身份标记;多行/列表/公式回答重复保存返回 200 且只保留一份,不再 503。

R7 真实来源、版本与阅读顺序

  • 回答来源保存完整对象(标签、sourceId、可解析的页/块)并可在笔记面板点击回访;摘录来源含内容类型、页/块与译文修订。
  • _source_state 比较文档哈希、结果修订、译文修订,并逐字比较完整摘录;重解析/重译/替换文件后不画旧位置,保留摘录并说明。
  • 批注分页(默认 100,最大 200)返回 nextCursor/total/orderKey,按文档内阅读顺序展示并可加载更多;无文字层时提供手写页级记录;导出含论文标识、内容类型、页/块与来源语义且剥离内部标记;兼容 1.13.0 已产生的记录。

R8 子单元已缓存时不再被时间额度拦住

  • 只在确实有待发请求时检查执行时间;块子单元已缓存仅待发布时不再拦截(真实请求仍经受时间保护的 reserve_attempt)。
  • 计划与执行同语义,识别四种剩余状态;复用检查点不重复调用、不清零用量;确有待发请求且时间耗尽仍拒绝并要求增额;保留 1.12.1 的部署上限、重译估算、逐维度用量与 429 余量。

验证

  • 后端 tests/test_paper_notes.py 15 项、tests/test_translation_budget.py 33 项;浏览器 frontend/unified-tests/notes.spec.ts 9 项(慢响应、失败草稿恢复重试、冲突即时控件与双方保留、撤销用新修订、编辑改色、结构原文保存后立即可见等)。
  • 独立验收 6 项后端复现中 5 项通过;test_undo_using_revision_kept_by_current_ui 保留为失败诊断(模拟旧 UI 旧修订,后端仍应拒绝),常驻测试断言"旧修订 409、删除返回的新修订可撤销"。
  • 门禁:Docker 非集成 568 passed + 84 subtests;前端类型/20 单元/构建;全部浏览器套件(统一 16、topics 2、daily 1、keywords 3、metadata 2、reading-tools 3、structured 1、understanding 1、额度 3、笔记 9);4×pip-audit 0;Trivy 源码 0;三镜像 0 HIGH/CRITICAL;dev/main CI success。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.1 sha256:f8460a1873b4f4e7f793e842b30c64f5585a66845643dbb4871c6b5c801fe6aa
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 ac82ea1。

限制与回退

  • 不含全库笔记工作区、双链、知识图谱、跨论文检索、自动生成笔记与带批注 PDF 导出。
  • 结构高亮以存下的范围与完整摘录校验为准,无法匹配时只显示块级来源与说明。
  • 回退基线 Web 1.13.0 + Workers 1.2.0;回退会重新暴露 1.13.0 的笔记可靠性缺陷(慢保存覆盖、草稿丢失、冲突覆盖、批注断路),用户新增的笔记与冲突草稿仍然保留,不会被旧数据库覆盖。

iPaper 1.13.0 — 阅读高亮、批注与单篇笔记

Choose a tag to compare

@ifzzh ifzzh released this 21 Sep 17:22

iPaper 1.13.0 在现有阅读器内加入持久高亮、批注、单篇 Markdown 笔记、保存已有 AI 回答与 Markdown 导出。本轮不新增任何真实模型 / MinerU / OCR / 翻译调用:保存回答只复制已持久化内容。

能力

  • 高亮与批注:在原文 PDF、已有 BabelDOC 译文与结构正文中选中文字,保存高亮或简短批注;四种淡色(淡紫/灰蓝/雾粉/暖黄),批注可修改、删除并可明确撤销。高亮是持久记录,不是当前 DOM 的临时效果。
  • 批注侧栏:右侧「问答 / 批注 / 笔记」页签:按阅读顺序列出摘录、自己的批注、文档类型与页码/块来源,可筛选(原文/版式译文、结构内容、仅批注)与搜索;点击定位来源并显示详情,来源失效时给出说明而不是跳到别的内容。
  • 单篇主笔记:每人每篇一份 Markdown 笔记,编辑/预览、1.2 秒防抖自动保存与状态(保存中/已保存/保存失败),可把摘录明确插入并保留可回访来源。笔记依附论文,不随主题或关键词迁移。
  • 保存已有 AI 回答:助手消息「存入本篇笔记」只复制已持久化内容与当时的来源标签,不重新问模型;流式或未成功保存的回合不可存;重复点击幂等。
  • Markdown 导出:标题、作者、arXiv/DOI、导出时间、笔记正文、摘录与批注、来源记录;不含密钥、令牌或服务器绝对路径;?annotations=0 只导出正文。

来源定位与版本

  • PDF(原文与版式译文各自独立)保存页号与归一化行矩形(按页面旋转反算到未旋转坐标系),多行逐行记录;缩放、旋转、适合宽度、窗口变化与虚拟页面重渲染后位置仍正确,不覆盖段间空白或相邻栏。
  • 结构内容保存块、字段(text/caption/cell:r:c)、文字范围与译文修订;重新解析或重译后先按存下的摘录校验当前文本,不匹配则不画高亮并提示来源变化。
  • 扫描件/无可靠文字层按页级记录降级保存,不自动 OCR、不伪造文字高亮;源文件被替换或结果失效时保留摘录并明确 stale/canNavigate=false。

数据与边界

新增 reading_annotations、reading_notes、reading_note_entries、reading_note_conflicts(纯增量、旧版本可读写);所有读写 owner 隔离并在写入前校验论文/文档/结果归属,沿用认证、CSRF 与限流。上限:摘录 8,000 字符、批注 2,000 字符、笔记 256 KiB、每篇有效批注 2,000 条、列表分页 ≤200。并发编辑以修订校验处理:冲突时把来稿存为可恢复草稿并让用户明确选择保留哪一份;摘录/回答插入同事务读取-追加-写回,不吞掉并发内容。论文文件、哈希与译文不被修改。

验证

  • 后端 tests/test_paper_notes.py(7 项):批注生命周期与撤销、owner 隔离与 CSRF、锚点/尺寸/颜色/类型校验与页级降级、主笔记冲突草稿与显式解决、摘录插入修订校验与去重、回答保存归属校验与幂等(含 user 角色/不存在/未持久化)、导出内容与私有路径剥离、来源失效降级。
  • 浏览器 frontend/unified-tests/notes.spec.ts(独立配置 + 合成结构化夹具,3 项):选中 → 高亮/批注 → 侧栏 → 刷新后仍在且页面绘制高亮 → 点击回访;笔记自动保存 → 刷新恢复 → 导出一致;owner 隔离与非法锚点拒绝;把种子回答存入笔记且重复点击不产生副本。
  • 门禁:Docker 非集成 558 passed + 84 subtests;前端类型检查、20 项单元测试、构建;统一 16 与 topics 2、daily 1、keywords 3、metadata 2、reading-tools 3、structured 1、understanding 1、额度 3、笔记 3;4×pip-audit 0;Trivy 源码 0;三镜像 0 HIGH/CRITICAL;dev/main CI success。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.13.0 sha256:43bec3edc8bf3c2dd0b2e683d686c3baa37343927fcb97156dddea1c1f61802b
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 4b30451。

限制与回退

  • 不含全库笔记工作区、双链、知识图谱、跨论文检索、自动生成笔记与带批注 PDF 导出。
  • 结构内容高亮以存下的范围与摘录校验为准;无法匹配时只显示块级来源与说明。
  • 回退基线 Web 1.12.1 + Workers 1.2.0;新增表可空且旧版本忽略,回退只切镜像,不用旧数据库覆盖新增记录。

iPaper 1.12.1 — 额度边界修复(时间增额、部署上限、重译计划、实际用量)

Choose a tag to compare

@ifzzh ifzzh released this 21 Sep 10:07

iPaper 1.12.1 修复 1.12.0 独立复核确认的四类额度边界缺陷。仅 Web 变化;Translation/Document Worker 复用已验证的 1.2.0 摘要。

R1 仅延长时间也能继续;时间耗尽不再被判为可续跑

  • 续跑计划独立判定时间维度:有计划中工作且累计时间已用满时返回 sufficient=false、time.exhausted=true、overage.seconds.required = 已用+1(下限,不是剩余耗时估计)。
  • POST …/resume 在时间耗尽且仍有工作时拒绝入队(budget_time_exhausted 带 minimum),不会入队后立刻再次超时;只调整小时数即可继续,其他维度无需改动,累计用量不清零。
  • 前端"是否确有变化"改为考虑四个维度(此前遗漏 seconds,只延长小时数时按钮仍禁用),并显示"累计执行时间已用完(X 分钟 / 上限 Y 分钟)"。
  • 反向也同样修正:已无待发请求时续跑只做发布,不因时间耗尽失败(状态/取消检查与执行时间检查分离,逐块循环只在真正需要工作时检查时间)。

R2 所有预算路径都受部署上限约束

  • IPAPER_TRANSLATION_MAX_* 明确是最大值;校验作用于最终合成额度(默认、空预算、部分字段、显式预算四条路径逐维度比对)。
  • 上限低于内置默认值时有效默认值被压到该上限(启动日志说明,预览返回 defaultCappedByCeiling),不会出现"上限 100、默认 500 仍准入";显式超限返回 invalid_budget 并指出维度;合成异常超限返回 500 类 invalid_budget_configuration,不静默通过。

R3 单块重译的续跑计划与执行一致

  • resume_plan 使用与执行侧相同的 force=True(kind == 'retranslate')重译语义:旧成功译文不再被当作本次重译已完成,当前任务已保存的有效子单元仍从估算中扣除;预览与执行对同一块给出相同请求数。

R4 实际用量按输入/输出分别记完整性

  • actual_usage 分别统计输入与输出(inputComplete/outputComplete、各自缺失次数);只有两个维度都有合法供应商数据才 complete。单项缺失显示未知/部分统计,未按 0 记,也未改变事前预留或推断未计费。

回归

  • 复核的四项私有复现已纳入 tests/test_translation_budget.py,并按修复后的契约补充:降上限后较小范围可准入、四条预算路径均受上限约束、无待发请求时耗尽时钟仍能完成发布、五种供应商用量形状、零请求与进行中请求。
  • 修正两处弱断言:截图量级执行改用真实预扣的计数假模型(usage.requests == calls 且 200 ≤ requests ≤ 245);"低于已用量"分支改用两请求任务真正走到。
  • tests/test_daily_scheduler_state.py 改为按运行时日期推导期望(此前硬编码日期,跨过"今天"后会误判)。
  • 浏览器套件新增 R1 回归:耗尽时间的任务只把累计小时数从 1 改到 4、其余维度不动即可提交成功。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.12.1 sha256:0d04b51819dcc79c4b29aaaa66f3017681a094ba9136259cfa95faa6b72e2ad1
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 d8748f0。

限制与回退

  • 时间维度只能判断"是否已耗尽",无法预估剩余时长;额度仍是准入上限,不承诺必然完成。
  • 回退基线 Web 1.12.0 + Workers 1.2.0;无 schema 改动,回退只切镜像。

iPaper 1.12.0 — 结构化翻译额度:更大默认值、可调整上限与增额续跑

Choose a tag to compare

@ifzzh ifzzh released this 20 Sep 07:49

iPaper 1.12.0 修掉结构化翻译被自身小额度挡住的问题:整篇翻译默认额度提高、上限可按任务与部署调整、已停止的任务可以增额续跑。仅 Web 变化;Translation/Document Worker 复用已验证的 1.2.0 摘要。

原因

用户选 15 页 / 271 块 / 0 可复用,估算 245 次请求、273,044 输入、247,782 输出 token,被应用自己的 200 次请求上限挡住(不是供应商余额)。旧实现把默认值与上限写成同一常量,API 只能降低;旧任务保存独立的 budget_json,续跑入口不接受新额度。

A. 额度

项目 原默认=硬上限 新默认(整篇翻译) 部署上限(可配置)
模型请求 200 500 2,000
输入 token 保守预留 500,000 1,000,000 5,000,000
输出 token 预留 250,000 500,000 2,000,000
累计执行时间 2 小时 4 小时 12 小时
  • 只有 translate / parse_translate / retranslate 使用新值;概览、深度解读、分析导出、划词翻译与纯解析保持 200/50 万/25 万/2 小时,API 也无法调大。
  • 部署上限可用 IPAPER_TRANSLATION_MAX_REQUESTS / _INPUT_TOKENS / _OUTPUT_TOKENS / _SECONDS 覆盖;非正整数配置启动即失败,不静默夹取。
  • 超出时明确指出是哪一项(所需 vs 当前额度)并提供一键"使用所需额度";估算分别给出基础请求、允许的 429 重试余量与两者之和,不再把重试上限称作"最多请求数"。
  • 估算与提交使用同一份已确认额度;页码/语言/解析版本/额度变化都会重新估算,过期预览不能提交。
  • 任务详情把"已预留"(保守预扣)与"供应商实际用量"分开显示,缺失的实际用量不补零。
  • 保留单请求 120 秒、SDK 重试关闭、全局并发 2、每 owner 一个活动任务、队列/文件配额、取消与防重复提交。

B. 增额续跑

  • 新增只读 POST /api/processing/jobs/<id>/resume-plan:已用量 + 剩余范围估算(应用单元检查点)+ 所需额度与部署上限。
  • POST /api/processing/jobs/<id>/resume 支持可选 budget:校验 owner/CSRF/类型/状态/上限,不得低于已用量,新额度是整个任务的累计总额;变更与排队同事务完成并记录前后额度事件。重复点击不重复排队。
  • 已完成的块与子单元继续复用;解析后超预算保留解析结果并展示新的调整入口,等用户明确继续。

组件

仓库 版本 Registry 摘要
ifzzh520/ipaper 1.12.0 sha256:2a9b2b602fea34c2d01b8184d6efb1c891a32d50fffaed1d3d649f7d0208c943
ifzzh520/ipaper-translation-worker 1.2.0 sha256:a5fa3b4316802c15e99a7387baa49604166fb6092a1aca34b8c5e34de3d52003
ifzzh520/ipaper-document-worker 1.2.0 sha256:2c501ad68bdfc2e282518a813c46e548f598b1af85acc1069058741a45587298

源码提交 494cca0。

验证

  • tests/test_translation_budget.py 19 项:类型边界、部署上限与非法输入、环境变量覆盖与非法配置失败、截图量级(271 块 / 245 基础请求)在旧 200 上限被拒而新默认通过、超限维度明细、增额续跑用量保留与幂等、低于已用量/超上限拒绝、只读续跑计划、已完成单元不重复、非翻译类型拒绝、预扣与实际用量分离、跨 owner 拒绝。
  • 浏览器套件 translation-budget.spec.ts(独立配置 + 合成假云/假模型):默认与上限来自 API、解析前如实说明、超限项与一键调整、超上限与非法值就地拒绝、任务记录确认额度、预扣与实际用量分列、停止任务续跑全流程。
  • 门禁:Docker 非集成测试 539 passed, 1 deselected, 84 subtests passed;前端类型/20 单元/构建;统一 16 与 topics 2、daily 1、keywords 3、metadata 2、reading-tools 3、structured 1、understanding 1、translation-budget 2;四份 pip-audit 0;Trivy 源码 0;三镜像 0 个 HIGH/CRITICAL;三 SBOM;dev/main CI 通过。
  • 正式只读复核:报告论文解析仍为 271 块(现已有 265 块可复用、仅需 6 次请求,样例已变化);同账号另一篇 223 块 / 0 可复用的论文在旧上限因输出预留 292,348 > 250,000 被判超限,新默认 500,000 通过。复核不创建任务、不调用模型。

限制与回退

  • 额度是准入上限,不代表必然完成;实际耗时与用量取决于供应商。提高额度不会让任务主动多发请求。
  • 回退基线 Web 1.11.0 + Workers 1.2.0;本轮无数据库 schema 改动,回退只切镜像。