推进 OCR UI 与 provider 删除验收
This commit is contained in:
+13
-13
@@ -8,35 +8,36 @@
|
||||
|
||||
## 现象
|
||||
|
||||
P2 目标中包含 MinerU OCR 能力收口。当前已补后端 mock route、真实 MinerU HTTP client、sidecar 写入、`.mnote/ocr-index.json`、`includeOcr=true` 搜索命中和浏览器 API smoke。但 active job store、realtime job event、前端入口/任务栏仍未落地。
|
||||
P2 目标中包含 MinerU OCR 能力收口。当前已补后端 mock route、真实 MinerU HTTP client、sidecar 写入、`.mnote/ocr-index.json`、`includeOcr=true` 搜索命中、resource tab 图片/PDF OCR 工具条、附件/File Tree 资源菜单入口和浏览器 UI smoke。但 active job store、realtime job event、全局任务栏/任务抽屉和 AI 资源上下文仍未落地。
|
||||
|
||||
## 证据
|
||||
|
||||
- `rust/crates/mnote-web/src/routes/local_ocr.rs` 已注册 `jobs/status/read/insert`,`provider=mock` 能写入 `{pageStem}.ocr/*.ocr.md` 和 `.mnote/ocr-index.json`。
|
||||
- `provider=mineru` 在有 token 时会走真实 HTTP client:申请上传 URL、PUT 上传、轮询结果、下载 zip、提取 Markdown,并写入 `{pageStem}.ocr/*.ocr.md` / `.mnote/ocr-index.json`。该路径已有本地 HTTP mock 单测覆盖,不访问外网。
|
||||
- `local_search_index` 已支持 `includeOcr=true` 命中 OCR owner page;`task526-local-folder-ocr-api-smoke.js` 已覆盖浏览器上下文调用 mock OCR API、搜索命中和显式 insert 链接。
|
||||
- `local_search_index` 已支持 `includeOcr=true` 命中 OCR owner page;增量刷新也已排除 hash 后缀 OCR sidecar,不再把 `*.ocr.md` 当普通页面命中。
|
||||
- `task526-local-folder-ocr-api-smoke.js` 已覆盖浏览器上下文调用 mock OCR API、图片 resource tab 手动 OCR、工具条状态、打开 OCR、搜索命中和显式 insert 链接。
|
||||
- 设计中的活动任务生命周期、`local_ocr.job.updated` 和浏览器可见入口仍未完成。
|
||||
|
||||
## 影响
|
||||
|
||||
- 用户无法从本地图片或图片型 PDF 通过 UI 手动触发 MinerU OCR。
|
||||
- 搜索的 `includeOcr=true` 已能命中 OCR sidecar,但真实 MinerU 结果仍缺 UI 触发链和任务状态可见性。
|
||||
- 用户已能从本地图片/PDF resource tab、附件菜单和 File Tree 资源菜单触发 OCR;但离开当前资源后的全局任务抽屉仍缺。
|
||||
- 搜索的 `includeOcr=true` 已能命中 OCR sidecar,`includeOcr=false` 不应命中普通 OCR sidecar;本轮补了增量索引过滤测试。
|
||||
- AI 资源上下文无法优先读取已有 OCR Markdown。
|
||||
|
||||
## 下一步
|
||||
|
||||
1. 已完成后端 mock 最小闭环:路径规划、sidecar frontmatter、`.mnote/ocr-index.json`、mock OCR job route、status/read、Page Tree 过滤和 `includeOcr=true` 搜索 owner page。
|
||||
2. 已补浏览器 API smoke:mock OCR、status/read/jobs、`includeOcr=true` 搜索 owner page 和显式 insert link。
|
||||
3. 下一步接长任务状态、`local_ocr.job.updated` realtime 事件、前端 OCR 入口/任务栏和 AI 资源上下文读取 OCR sidecar。
|
||||
3. 下一步接长任务状态、`local_ocr.job.updated` realtime 事件、全局 OCR 任务栏/任务抽屉和 AI 资源上下文读取 OCR sidecar。
|
||||
|
||||
## 验收
|
||||
|
||||
- [x] Rust route/helper 测试覆盖 sidecar 路径/frontmatter、index stale/error redaction、mock OCR job 写入、status/read、无 token、越界拒绝、非图片/PDF 拒绝、mock 失败 response 脱敏和显式 insert link。
|
||||
- [x] local search 测试覆盖 OCR 命中返回 owner page,OCR sidecar 不作为普通页面。
|
||||
- [x] local search 测试覆盖 OCR 命中返回 owner page,普通与 hash 后缀 OCR sidecar 不作为普通页面。
|
||||
- [x] Page Tree 测试覆盖 OCR sidecar 可在 File Tree 作为资源文件可见,但不作为普通页面进入 Page Tree。
|
||||
- [x] Rust route 测试覆盖无 token response 形态。
|
||||
- [x] Rust route 测试覆盖 `provider=mineru` 后端成功路径:申请上传 URL、PUT 上传、轮询结果、下载 zip、提取 Markdown、写 sidecar/index。
|
||||
- [~] 浏览器 smoke 覆盖图片/PDF 手动 OCR、任务栏状态、打开 OCR、搜索 OCR 命中和插入 OCR 链接。(当前 `task526` 覆盖 mock OCR API、搜索命中、显式 insert link 和 OCR sidecar resource tab 打开;真实 UI 入口/任务栏待做)
|
||||
- [~] 浏览器 smoke 覆盖图片/PDF 手动 OCR、任务栏状态、打开 OCR、搜索 OCR 命中和插入 OCR 链接。(当前 `task526` 覆盖图片 resource tab 手动 OCR、工具条状态、mock OCR API、搜索命中、显式 insert link 和 OCR sidecar resource tab 打开;全局任务栏/任务抽屉待做)
|
||||
|
||||
## 2026-06-01 后端 mock 闭环记录
|
||||
|
||||
@@ -63,18 +64,18 @@ P2 目标中包含 MinerU OCR 能力收口。当前已补后端 mock route、真
|
||||
- mock 失败响应与 `.mnote/ocr-index.json` 失败条目统一脱敏为 `provider_error_redacted`
|
||||
- 显式 `ocr/insert` link 模式把 `[OCR:photo.png](./Page.ocr/photo.png.ocr.md)` 追加进 owner Markdown;未调用 insert 时不改正文
|
||||
|
||||
本文继续保持 `process`:前端 OCR 入口、任务栏和 active job / realtime event 尚未完成。
|
||||
本文继续保持 `process`:全局任务栏、active job store / realtime event 和 AI 资源上下文尚未完成。
|
||||
|
||||
2026-06-01 只读复核更新:
|
||||
|
||||
- Subagent 复核确认:route/mock/search 测试已落地,早期“没有实际 OCR route”的描述已经过时。
|
||||
- 本 bug 不归档的阻塞点更新为:真实 MinerU HTTP client、active job store / `local_ocr.job.updated`、前端入口/任务栏、AI 资源上下文读取 OCR sidecar 和完整 UI browser smoke。
|
||||
- 本 bug 不归档的阻塞点更新为:active job store / `local_ocr.job.updated`、全局任务栏/任务抽屉、AI 资源上下文读取 OCR sidecar 和完整 UI browser smoke。
|
||||
|
||||
2026-06-01 浏览器 API smoke 续补:
|
||||
|
||||
- 新增 `scripts/task526-local-folder-ocr-api-smoke.js`,在真实浏览器登录态页面内通过 `fetch` 串起 `POST /api/local-folder/ocr/jobs`、`status`、`read`、`jobs`、`/api/search/documents includeOcr=true` 和 `POST /api/local-folder/ocr/insert`。
|
||||
- 已验证 `provider=mock` 会生成 `docs/Page.ocr/photo.png.ocr.md`,`includeOcr=false` 不命中 OCR 文本,`includeOcr=true` 返回 owner page 且带 `hasOcr/ocrEvidence`,显式 insert 才向 owner Markdown 追加 `[OCR:photo.png](...)`。
|
||||
- 续补后已验证 OCR sidecar 可作为 Markdown resource tab 打开,截图写入 `tmp/task526-local-folder-ocr-api-smoke/02-ocr-resource-tab.png`。
|
||||
- 新增 `scripts/task526-local-folder-ocr-api-smoke.js`,在真实浏览器登录态页面内通过 UI 和 `fetch` 串起图片 resource tab OCR 工具条、`POST /api/local-folder/ocr/jobs`、`status`、`read`、`jobs`、`/api/search/documents includeOcr=true` 和 `POST /api/local-folder/ocr/insert`。
|
||||
- 已验证 `provider=mock` 会生成 `docs/Page.ocr/photo.png.ocr.md`,resource tab 工具条显示 OCR 完成并可打开/插入;`includeOcr=false` 不命中 OCR 文本,`includeOcr=true` 返回 owner page 且带 `hasOcr/ocrEvidence`,显式 insert 才向 owner Markdown 追加 `[OCR:photo.png](...)`。
|
||||
- 续补后已验证 OCR sidecar 可作为 Markdown resource tab 打开,截图写入 `tmp/task526-local-folder-ocr-api-smoke/03-ocr-resource-tab.png`;OCR 工具条截图写入 `tmp/task526-local-folder-ocr-api-smoke/02-ocr-toolbar.png`。
|
||||
- 已通过:
|
||||
- `node --check scripts/task526-local-folder-ocr-api-smoke.js`
|
||||
- `MNOTE_UI_BASE_URL=http://127.0.0.1:3301 MNOTE_WEB_SMOKE_BASE_URL=http://127.0.0.1:3301 node scripts/task526-local-folder-ocr-api-smoke.js`
|
||||
@@ -97,7 +98,6 @@ P2 目标中包含 MinerU OCR 能力收口。当前已补后端 mock route、真
|
||||
|
||||
本文继续保持 `process` 的剩余原因:
|
||||
|
||||
- 前端本地文件 / 图片 / PDF 资源没有 OCR 操作入口。
|
||||
- OCR jobs 仍是同步请求 + `.mnote/ocr-index.json` 历史状态,没有 active job store。
|
||||
- 缺少 `local_ocr.job.updated` realtime event 与全局任务栏 UI。
|
||||
- AI 资源上下文还没有优先读取 OCR sidecar。
|
||||
|
||||
+28
-1
@@ -2,7 +2,7 @@
|
||||
|
||||
## 状态
|
||||
|
||||
- 状态:process
|
||||
- 状态:done
|
||||
- Owner:07-ai / OpenClaw provider integration
|
||||
- 发现时间:2026-06-01
|
||||
|
||||
@@ -96,3 +96,30 @@ Reasonix 只读复核(`reasonix-2026-06-01T00-32-52-539Z-c41a37a3`)结论与
|
||||
- Gemini 当前只有 URL normalize、DOM 打开/复用对话和 `conversation_id: page.url()`,没有 provider 级远端删除 helper。
|
||||
|
||||
因此 MNote 侧 `7-44` / `task512` / `task513` 只能证明 MNote provider conversation binding,不足以替代外部 provider 仓库的 DeepSeek / Gemini 删除单测。
|
||||
|
||||
## 2026-06-01 DeepSeek / Gemini 降级语义补齐
|
||||
|
||||
本文已可归档到 `done`:外部 OpenClaw provider 仓库补齐了 DeepSeek / Gemini provider 级删除语义和单测,但没有伪造远端删除成功。
|
||||
|
||||
外部仓库 `/home/lix/openclaw-zero-token-latest` 当前新增/更新:
|
||||
|
||||
- `src/zero-token/providers/deepseek-web-client.ts`
|
||||
- 新增 `deleteDeepSeekConversationUnsupported()`。
|
||||
- `DeepSeekWebClient.deleteConversation()` 返回 `remote_delete_failed`、`providerDeleteMode=unsupported`、`attempted=false`。
|
||||
- `src/zero-token/providers/gemini-web-client-browser.ts`
|
||||
- 新增 `deleteGeminiConversationUnsupported()`。
|
||||
- `GeminiWebClientBrowser.deleteConversation()` 返回 `remote_delete_failed`、`providerDeleteMode=unsupported`、`attempted=false`。
|
||||
- `src/zero-token/providers/web-session-binding.test.ts`
|
||||
- 覆盖 DeepSeek / Gemini 在缺少已验证远端删除 API 时不能返回 `remote_deleted`。
|
||||
|
||||
已通过外部仓库验证:
|
||||
|
||||
- `pnpm exec vitest run --config scripts/vitest.zero-token-web.config.ts src/zero-token/providers/web-session-binding.test.ts --reporter=dot`:1 file / 8 tests passed。
|
||||
- `pnpm exec vitest run --config scripts/vitest.zero-token-web.config.ts --reporter=dot`:3 files / 16 tests passed。
|
||||
- `git diff --check`
|
||||
|
||||
归档口径:
|
||||
|
||||
- Doubao 已有真实 provider 远端删除 helper 和成功/失败单测。
|
||||
- DeepSeek / Gemini 没有可靠远端删除 API 时,provider 级 `deleteConversation` 明确返回 `remote_delete_failed`,不会让 MNote 或 OpenClaw 上层误标 `remote_deleted`。
|
||||
- 后续若要实现 DeepSeek / Gemini 真实远端删除,需要先抓取和验证真实 provider API,再新增 capability,而不是重新打开本文的“单测缺口”。
|
||||
Reference in New Issue
Block a user