@dylanl1/dsh-plugin-pdf 0.1.2 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/NATIVE_V1.md +3 -1
  2. package/README.md +54 -114
  3. package/README.zh.md +61 -121
  4. package/SPEC.md +46 -51
  5. package/dist/THIRD_PARTY_NOTICES.md +1 -56
  6. package/dist/client.js +5045 -2779
  7. package/dist/embedding.js +34 -9
  8. package/dist/engines.js +49 -4
  9. package/dist/image-host.js +837 -505
  10. package/dist/index.js +6790 -4126
  11. package/dist/ocr-host.js +1036 -175
  12. package/dist/ocr.js +4 -1
  13. package/dist/translation.js +43 -14
  14. package/dist/types/adapters/host/dsh/agent-tools.d.ts +1 -1
  15. package/dist/types/adapters/host/dsh/document-status.d.ts +0 -1
  16. package/dist/types/adapters/host/dsh/form-guidance.d.ts +2 -2
  17. package/dist/types/adapters/host/dsh/image-backends.d.ts +19 -3
  18. package/dist/types/adapters/host/dsh/image-tools.d.ts +15 -0
  19. package/dist/types/adapters/host/dsh/image-transport.d.ts +8 -7
  20. package/dist/types/adapters/host/dsh/index.d.ts +3 -2
  21. package/dist/types/adapters/host/dsh/model-cache-identity.d.ts +26 -0
  22. package/dist/types/adapters/host/dsh/ocr-session-llm.d.ts +2 -3
  23. package/dist/types/adapters/host/dsh/ocr-tool.d.ts +4 -2
  24. package/dist/types/adapters/host/dsh/page-content.d.ts +27 -0
  25. package/dist/types/adapters/host/dsh/pdf-evidence-meta.d.ts +13 -148
  26. package/dist/types/adapters/host/dsh/retrieval-prefetch.d.ts +49 -0
  27. package/dist/types/adapters/host/dsh/retrieval.d.ts +132 -25
  28. package/dist/types/adapters/host/dsh/translation-model.d.ts +3 -5
  29. package/dist/types/adapters/host/ocr/local-backend.d.ts +4 -0
  30. package/dist/types/contracts/indexing.d.ts +156 -0
  31. package/dist/types/embedding/registry.d.ts +2 -1
  32. package/dist/types/embedding/types.d.ts +10 -2
  33. package/dist/types/entrypoints/image-understanding-host.d.ts +2 -8
  34. package/dist/types/host/image-understanding-plugin.d.ts +1 -1
  35. package/dist/types/modules/document/index.d.ts +7 -0
  36. package/dist/types/modules/document/page-content-error.d.ts +3 -0
  37. package/dist/types/modules/document/page-content-native.d.ts +10 -0
  38. package/dist/types/modules/document/page-content-ocr.d.ts +5 -0
  39. package/dist/types/modules/document/page-content-text.d.ts +12 -0
  40. package/dist/types/modules/document/page-content.d.ts +158 -0
  41. package/dist/types/modules/engines/cache-identity.d.ts +16 -0
  42. package/dist/types/modules/engines/catalog.d.ts +20 -0
  43. package/dist/types/modules/engines/directory.d.ts +1 -0
  44. package/dist/types/modules/engines/index.d.ts +3 -0
  45. package/dist/types/modules/engines/serialization.d.ts +3 -0
  46. package/dist/types/modules/engines/types.d.ts +13 -0
  47. package/dist/types/modules/evidence/agent-page-image.d.ts +9 -112
  48. package/dist/types/modules/evidence/agent-page-read.d.ts +36 -2
  49. package/dist/types/modules/evidence/image-capture.d.ts +1 -6
  50. package/dist/types/modules/evidence/index.d.ts +9 -136
  51. package/dist/types/modules/evidence/provenance.d.ts +8 -0
  52. package/dist/types/modules/evidence/reference-store.d.ts +91 -1
  53. package/dist/types/modules/evidence/status.d.ts +17 -0
  54. package/dist/types/modules/evidence/text-range.d.ts +28 -0
  55. package/dist/types/modules/evidence/text-target.d.ts +7 -1
  56. package/dist/types/modules/forms/index.d.ts +4 -4
  57. package/dist/types/modules/forms/inspection-references.d.ts +1 -1
  58. package/dist/types/modules/forms/validation.d.ts +4 -8
  59. package/dist/types/modules/image-understanding/service.d.ts +24 -42
  60. package/dist/types/modules/model-write/index.d.ts +1 -2
  61. package/dist/types/modules/ocr/service.d.ts +51 -3
  62. package/dist/types/modules/retrieval/cache.d.ts +44 -2
  63. package/dist/types/modules/retrieval/document-policy.d.ts +83 -0
  64. package/dist/types/modules/retrieval/index.d.ts +4 -1
  65. package/dist/types/modules/retrieval/page-content.d.ts +4 -0
  66. package/dist/types/modules/retrieval/paragraphs.d.ts +1 -12
  67. package/dist/types/modules/retrieval/shared-source.d.ts +25 -0
  68. package/dist/types/modules/retrieval/text.d.ts +19 -1
  69. package/dist/types/modules/retrieval/types.d.ts +83 -9
  70. package/dist/types/modules/retrieval/vector.d.ts +3 -0
  71. package/dist/types/modules/working-copy/index.d.ts +1 -1
  72. package/dist/types/modules/working-copy/ports.d.ts +11 -0
  73. package/dist/types/modules/working-copy/service.d.ts +13 -1
  74. package/dist/types/ocr/types.d.ts +2 -1
  75. package/dist/types/shared/contracts.d.ts +4 -0
  76. package/dist/types/shared/geometry/native-viewport.d.ts +0 -18
  77. package/dist/types/shared/geometry/text-target.d.ts +2 -6
  78. package/dist/types/shared/native.d.ts +2 -1
  79. package/dist/types/shared/passive-poll.d.ts +4 -0
  80. package/dist/types/translation/locales.d.ts +4 -3
  81. package/dist/types/translation/schema.d.ts +14 -0
  82. package/dist/types/translation/types.d.ts +12 -2
  83. package/docs/AI_READER_TOOLS.md +87 -210
  84. package/docs/ARCHITECTURE_V2.md +64 -18
  85. package/docs/ENGINE_EXTENSIONS.md +295 -25
  86. package/docs/RETRIEVAL_EXPERIMENT.md +169 -47
  87. package/docs/UX_TYPOGRAPHY.md +3 -3
  88. package/package.json +13 -13
  89. package/dist/types/adapters/host/dsh/image-auxiliary.d.ts +0 -20
package/SPEC.md CHANGED
@@ -218,7 +218,7 @@ P3 模型回复默认显示在当前会话中。只有用户明确要求或执
218
218
 
219
219
  用户主动发送文字、区域和整页,以及会话中的解读/翻译在 P3 交付。独立选区翻译另按 FR-13 提前提供,不属于向会话发送内容。
220
220
 
221
- **当前首版**:用户在工具菜单进入解释模式,状态条显示发送与退出操作。选中文字,或选择“框选区域”后在单页拖出矩形;两种选段都须在选区旁输入问题并保存,才计入临时选段。已保存选段可通过页上的编号标记重新编辑或删除;文字与区域可按选择顺序混合发送。同一 PDF 最多收集 20 个选段,其中区域图像最多 5 张,文字总计不超过 24000 字符;这些选段不会写入 PDF 批注或未保存状态。区域图像经 `pdf.region` 由 Host 基于已授权工作副本绘制、核对附件字节并产生会话限定的区域证据 `refId`;文字选段经 `pdf.selection` 由 Host 按 PDFium 字形位置重新提取、核对整页文字并签发引用。Client 仍负责临时选段、提词组合与发送前来源复核;发送区域图像时经 `pdf.image` 的 `prepare-reference` 再验证会话、文档、源文件、附件与摘要,直送图片只使用 Host 返回的字节。提交时只向该 PDF 所属且仍为当前激活的会话排队一轮普通用户提词;解释主模型固定跟随该会话模型,模型回复出现在聊天中。区域图像默认只在当前模型声明支持图像时直送;配置为 `ocr-text` 时先识别文字,配置为 `auxiliary-vision` 时先由第二个视觉模型生成描述,两者都只将带来源及局限说明的派生文字发送给当前会话。没有可用路线或转换失败时保留选段与问题并显示错误,不把空内容当成成功。此版尚未实现整页附件发送、聊天输入框草稿预览或另行指定解释主模型。下表是后续完整目标,并非全部已交付;真实模型与桌面交互尚待验收。
221
+ **当前首版**:用户在工具菜单进入解释模式,状态条显示发送与退出操作。选中文字,或选择“框选区域”后在单页拖出矩形;两种选段都须在选区旁输入问题并保存,才计入临时选段。已保存选段可通过页上的编号标记重新编辑或删除;文字与区域可按选择顺序混合发送。同一 PDF 最多收集 20 个选段,其中区域图像最多 5 张,文字总计不超过 24000 字符;这些选段不会写入 PDF 批注或未保存状态。区域图像经 `pdf.region` 由 Host 基于已授权工作副本绘制、核对附件字节并产生会话限定的区域证据 `refId`;文字选段经 `pdf.selection` 由 Host 按 PDFium 字形位置重新提取、核对整页文字并签发引用。Client 仍负责临时选段、提词组合与发送前来源复核;发送区域图像时经 `pdf.image` 的 `prepare-reference` 再验证会话、文档、源文件、附件与摘要,直送图片只使用 Host 返回的字节。提交时只向该 PDF 所属且仍为当前激活的会话排队一轮普通用户提词;解释主模型固定跟随该会话模型,模型回复出现在聊天中。区域图像在当前模型声明支持图像时直送;文本会话则调用所选图像理解引擎生成描述,只将带来源及局限说明的派生文字发送给当前会话,不自动降级为 OCR。没有可用路线或转换失败时保留选段与问题并显示错误,不把空内容当成成功。此版尚未实现整页附件发送、聊天输入框草稿预览或另行指定解释主模型。下表是后续完整目标,并非全部已交付;真实模型与桌面交互尚待验收。
222
222
 
223
223
  解释模式在 PDF 设置中分别配置 `explanationGeneralInstruction`、`explanationTextInstruction`、`explanationImageInstruction`;每项是可选的普通文字,留空时沿用内置行为,不要求用户编写占位符。每项最多 2000 字符,可通过 profile patch 配置。插件负责按顺序插入已校验文字、问题和图片,不能把图片序列化为普通文字;来源警示、证据引用和 Host 校验始终保留。旧版 `explanationPromptTemplate` 仍供已有 profile 使用:只有三个新字段均为空时才生效;设置页可明确切换到分项提示词。旧模板仍要求恰好一次 `{{items}}`,并限制长度 8192 字符。
224
224
 
@@ -291,13 +291,17 @@ P3 翻译默认目标语言建议为简体中文,入口应展示目标语言
291
291
 
292
292
  图像能力查询以当前执行路线的精确 provider/model 为准,使用宿主的输入模态声明。显式包含 image 才向模型提供图像块;未包含 image 和能力未知分别说明。能力来自目录/适配器/配置,不是实际视觉理解能力的测试。发送或工具执行时重新检查,不能仅使用打开文档时缓存的能力;不自动替用户切换模型。
293
293
 
294
- 模型不支持图像时,用户仍能在查看器中查看、选取和生成图像。默认 `session-vision` 路线禁用的是直接交给该模型解读的动作;用户可显式选择已配置且可用的 `ocr-text` 或 `auxiliary-vision` 路线。前者只提取图中文字,不能替代对图表、空间关系或版面的视觉理解;后者调用另一个视觉模型描述截图,仍可能遗漏或误读视觉细节。当前会话模型只接收相应的派生文字,不接收截图。没有可用路线或可读取内容时保留选段和问题并给出原因,不能把空内容当成成功发送;后端不自动从一种路线降级到另一种。
294
+ 模型不支持图像时,用户仍能查看、选取和生成图像。解释模式由 Host 在发送时检查当前会话:明确支持图像时直接附上经验证的图片,不额外调用视觉模型;否则调用配置的图像理解引擎,将注明来源与局限的描述文字交给当前会话。缺少可用视觉引擎时保留选段和问题,明确说明原因,不自动改用 OCR。用户或模型仍可单独请求 OCR;它只提取可见文字,不能替代图表、空间关系或版面的视觉理解。
295
295
 
296
- 图像理解是独立于 OCR 的 Host 服务:请求携带所属会话身份、PNG 区域图像和用户问题,服务依 profile 配置选中一个后端,在准备内容时重新检查其可用性,结果要么允许将原图送入该会话,要么返回注明后端、来源和局限的派生文字。解释模式的框选 PNG 当前先由 PDF Host 的 `pdf.region` 根据页面坐标绘制与签发引用,而不是从浏览器可见区域截图;Host 拒绝与请求版本不符或被附件存储改写像素的结果。当前内置 `session-vision`(默认)、`ocr-text` 与 `auxiliary-vision`;通过 `pdf-image-understanding` 的 `config.backend` 在 profile patch 中显式选择,缺失或不可用时失败并说明原因,不自动调用其他后端。`auxiliary-vision` 另须配置 `config.auxiliaryVision.provider` 和 `model`,可选 `reasoningEffort`、`maxOutputTokens`;所选模型必须在 DSH 中可用且声明支持图像输入。截图会传给这个第二模型,可能产生额外费用;其描述而非原图进入当前会话,且描述不是经校验的视觉事实。其他插件仍可注入 `imageUnderstanding` 服务,注册带稳定 ID 的后端,并用自己的 Fiber 管理注销。目前没有图像理解设置卡片。OCR 服务单独选择自己的识别引擎,两层配置不互相替代。
296
+ 图片处理只保留两个独立可扩展契约:`ocr.recognize(image)` 返回文字、可选位置与置信信息;`imageUnderstanding.understand(image, prompt)` 实际调用后端并返回生成的文字及来源。直接传图是会话编排,不属于图像引擎;OCR 不再重复注册成图像后端。内置图像引擎只有 `dsh-vision`,默认跟随当前会话;选择“指定模型”后才加载并显示 DSH 按提供商分组的视觉模型列表及该模型公布的推理强度,不要求手填 Provider、Model 或 reasoningEffort。选择只修改 PDF 的引擎配置,不切换聊天模型;底层仍保存 provider/model 和可选 reasoningEffort,切回跟随时同时清除这些覆盖。指定模式尚未选定模型时不能保存;已保存但暂时不可用的模型保留显示,不能自动改成跟随或另一模型。Host 在真正调用前重新检查所选模型及图像输入能力。最终解释仍由当前会话回答。
297
+
298
+ PDF 设置统一选择 `ocrEngine`、`imageEngine` 和 embedding 引擎,默认及第三方实现都通过同一服务注册。文字识别索引 `indexScanPages` 与视觉描述索引 `indexImageDescriptions` 是每份 PDF 独立保存的两个开关,放在搜索侧栏并复用全局引擎;设置页不重复展示这两个开关,也没有文档级引擎覆盖。两项可同时开启,视觉描述索引为整页生成文字再索引,仍非图表区域识别或图像向量化。开启语义检索后,后台预建可能在首次搜索前调用这些引擎并产生费用。
299
+
300
+ 解释模式的框选 PNG 由 PDF Host 的 `pdf.region` 根据坐标渲染与签发引用,发送前再验证源文件、版本与附件;拒绝附件像素被改写或工作副本已变化的结果。第三方插件注入现有 Host 服务,通过 `ctx.effect()` 注册并在卸载时撤销,不创建另一份注册表;可运行示例与契约测试位于 `examples/` 和 `tests/examples/`。
297
301
 
298
302
  #### 9.3 OCR 的功能边界(P0;模型入口 P3)
299
303
 
300
- 目标行为:按需识别单页或单页区域,由用户主动触发;不因打开文件自动 OCR 整份文档。当前阅读器经认证的 `pdf.ocr` 接口让 Host 判定所属会话的 OCR 后端是否可用、渲染整页或指定区域,并在执行前再次检查。独立 Host `image-ocr` 插件还接通 `pdf_ocr_page` 与 `ocr_recognize` 模型工具;首版默认以当前会话的视觉模型识别页面图像,文本模型只有在以后配置独立的本地/远端 OCR 后端时才能走这条路径。SessionLLM 结果目前只有转写文字和图像覆盖范围,不提供可用于精确标注的词/行坐标。
304
+ 直接 OCR 按需识别单页或单页区域,由用户主动触发;开启语义检索及文字识别索引后,后台预建可对原生文字缺失/损坏的页调用同一个 OCR 引擎。当前阅读器经认证的 `pdf.ocr` 接口让 Host 判定所属会话的 OCR 后端是否可用、渲染整页或指定区域,并在执行前再次检查。独立 Host `image-ocr` 插件提供通用 `ocr_recognize` 工具,消费 `pdf_page_render` 返回的图像句柄;区域 OCR 仅由 UI 发起。引擎可以是当前视觉会话模型、本地或远端实现,其实际可用性由所选后端决定。SessionLLM 结果目前只有转写文字和图像覆盖范围,不提供可用于精确标注的词/行坐标。
301
305
 
302
306
  OCR 的输入是明确版本的页面/区域图像。默认识别页面基础内容,避免新建高亮、选区边框和便笺遮挡原文;已经扁平化进页面的标记无法以此方式去除。视觉解读默认包含工作副本的可见标注,结果须说明实际是否包含标注;批注正文另外提供。OCR 与视觉读取的不同标注策略须在预览和结果中可查。
303
307
 
@@ -393,19 +397,23 @@ PDF 文件大小上限不在设置卡片中编辑;Host 的 `maxFileBytes` 默
393
397
 
394
398
  选中文字后,浮动工具条提供“翻译”。统一翻译功能与具体引擎分离,默认使用 DSH 模型,支持切换到后续厂商或本地实现;不提供关闭翻译的设置。设置卡片只配置引擎与超时;原文始终自动检测,初次默认采用 PDF 所属会话的 DSH 模型、译成中文、30 秒超时。目标语言在翻译视图中从中、英、日、韩、法、德语选项中选择,改变后保存至当前 Profile 的插件设置,后续翻译默认沿用。
395
399
 
396
- 当前模型翻译提示按选区语义区分输出:完整句子/长段落直接翻译;独立短语逐义列出短语类别、适用含义及例句;单词给出可靠可判断的音标,并逐义列出词性、含义和例句。无法可靠判断读音时不编造音标。首版沿用当前会话模型,不另设翻译/OCR 模型选择;后续可独立配置这两项,解释模式仍固定跟随会话模型。
400
+ 当前模型自行判断选区语义及输出类型,不按词数强制分类:句子、可读的句子片段和长段落直接翻译;独立短语逐义列出短语类别、适用含义及例句;单词给出可靠可判断的音标,并逐义列出词性、含义和例句。可利用有界邻近文字纠正提取错误或补全残缺内容;通过 `interpretation` 单独返回据以翻译的文字、修复类型、确定程度及说明,UI 保留原选区并明确标出推测。正常片段不为凑成完整句子而添写内容;不凭空补造人名、数字或事实。不设置 `recognized` 或选区完整性门禁;仍无法理解时由模型在结果中说明不确定性,代码不再二次判断是否可译、修复是否改变原文,或按词汇类型限制音标。协议结构、权限、大小和请求生命周期仍需校验。无法可靠判断读音时由模型省略音标。首版沿用当前会话模型,不另设翻译/OCR 模型选择;后续可独立配置这两项,解释模式仍固定跟随会话模型。
401
+
402
+ 这条独立翻译流程提交当前选中文字及两侧各最多 80 个字符的邻近文字,不附带聊天上下文,也不调用 P3 的模型 PDF 工具;它不向会话消息或日志追加原文、请求或译文。结果在右侧阅读辅助栏的翻译视图显示,包含原文、可选修复结果、页码、引擎和完整/部分状态,支持取消、重试、切换目标语言后再次翻译和复制。复制修复后的译文时附带原文和修复/推测说明,避免将补全当作 PDF 原文。
397
403
 
398
- 这条独立翻译流程只提交当前选中文字,不附带聊天上下文,也不调用 P3 的模型 PDF 工具;它不向会话消息或日志追加原文、请求或译文。结果在右侧阅读辅助栏的翻译视图显示,包含原文、页码、引擎和完整/部分状态,支持取消、重试、切换目标语言后再次翻译和复制。
404
+ 原文区固定展示发起翻译时捕获的选中文字,加载、失败、取消、重试和更换目标语言时也保持显示,不依赖模型是否返回修复说明。词条结果仅显示类型、音标、释义及例句,不再重复原文标题;纠正或补全使用独立说明区,明确区分原始选文与模型解释后的文字。
399
405
 
400
- 单次输入限制为 8192 个 UTF-16 字符、统一输出限制为 32768 个字符;DSH 模型实现输出上限为 4096 tokens。超限输入明确报错,不静默截断;输出截断保留部分译文并提示未完成。明确关闭译文、切换文档或配置变化取消旧请求,迟到结果不能替换新选区;切换到其他右栏视图或折叠阅读辅助栏保留翻译状态,正在执行的翻译继续运行。翻译不改变 PDF 或保存状态,缺少模型服务不妨碍阅读与编辑。图像理解的后端选择只影响解释模式框选区域,不改变翻译模型或 OCR 自身的引擎配置。
406
+ 单次输入限制为 8192 个 UTF-16 字符、统一输出限制为 32768 个字符;DSH 模型实现输出上限为 4096 tokens。超限输入明确报错,不静默截断;输出截断保留部分译文并提示未完成。明确关闭译文、切换文档或配置变化取消旧请求,迟到结果不能替换新选区;切换到其他右栏视图或折叠阅读辅助栏保留翻译状态,正在执行的翻译继续运行。翻译不改变 PDF 或保存状态,缺少模型服务不妨碍阅读与编辑。图像理解引擎供图片理解工具、解释的派生文字处理与视觉描述索引共用,不改变翻译或 OCR 的引擎配置。
401
407
 
402
- ### FR-14:悬浮工具栏与右侧阅读辅助栏(已实现,悬浮样式待交互验收)
408
+ ### FR-14:左右细轨与右侧阅读辅助栏
403
409
 
404
- PDF 内容区顶部居中悬浮一行工具栏,不占用正文布局高度,包含返回、比例/适应宽度,以及工具、撤销/重做、保存、另存为和丢弃全部修改。页码、总页数和上一页/下一页位于右阅读辅助栏底部。保存中、已保存和未保存状态只在状态变化后于 PDF 内容区右上角短暂显示,并在窄窗口下避开工具栏;保存失败、版本冲突等需要处理的提示仍持续显示。中间控件在窄宽度下横向滚动,工具菜单不会被横向滚动区裁切。悬浮工具栏、就近标注工具条和保存状态提示采用玻璃质感,同时保证文字对比度;减少透明度、高对比度或不支持背景模糊时使用可读的实体背景。
410
+ 左工具栏、PDF 内容区、右阅读辅助栏为三个实际占位的布局列。左右入口栏均采用 56px 一体玻璃细轨,按钮宽 36px;分组用细线区分,不叠加多块玻璃。展开、折叠和调宽仅重新分配内容区与右栏宽度,自动适应模式保持页内阅读位置。保留右栏开合以及内部内容的淡入、位移动画;拖动调宽时直接跟随指针,减少动态效果设置下取消位移动画。
411
+
412
+ 左细轨提供返回及历史、缩放、解释、便签、区域截图、OCR、文档操作及后台任务入口。撤销/重做纵向排列;高度不足时收进文档菜单。中部只滚动工具列表,解释计数、发送和退出固定可见,错误入口复用计数行。页码、总页数和上一页/下一页始终位于右细轨底部,展开或折叠内容卡片不移动、不重复挂载。保存、OCR、索引等任务共用任务入口和面板;索引运行中可取消,完成通知可由“完成”关闭,失败可重建。当前 PDF 的建立/重建入口位于搜索面板,细轨不单独显示索引按钮。其他成功反馈短暂保留,失败及冲突保留待处理。各类菜单挂在当前 Reader 的浮层内,不被细轨滚动或玻璃层裁切。减少透明度、高对比度或不支持背景模糊时使用可读的实体背景。
405
413
 
406
414
  删除插件底部重复的文件路径和“重新加载”栏,文件路径继续使用宿主已提供的文档头部。重新加载保留在工具菜单中,并继续遵循冲突与丢弃提示规则。
407
415
 
408
- 主区域分为两栏:左边是独立滚动的 PDF 内容区;右边是阅读辅助内容区,最右侧保留竖向功能入口。默认展开标注视图,参考宽度为 320 像素,窄窗口按可用空间限制宽度,折叠后只保留 44 像素入口栏及紧凑页码导航。辅助栏可拖动分隔线调宽,也支持聚焦分隔线后用左右方向键及 Home/End 调整;功能入口支持上下方向键及 Home/End 切换。展开、折叠或用户调整宽度后,“适应宽度”根据实际 PDF 内容区重新计算,并保持当前页内阅读位置,不记录为跳转。页面、书签、翻译、标注和搜索共用辅助内容区,一次展示一种视图,切换视图不改变 PDF 可用宽度。
416
+ 右栏默认展开标注视图,总宽参考 296px,内容卡片保留原有可读宽度;窄窗口按可用空间限制或自动折叠,折叠后保留 56px 细轨。辅助栏可拖动分隔线调宽,也支持聚焦分隔线后用左右方向键及 Home/End 调整;功能入口支持上下方向键及 Home/End 切换。展开、折叠或用户调整宽度后,“适应宽度”根据实际 PDF 内容区重新计算,并保持当前页内阅读位置,不记录为跳转。页面、书签、翻译、标注和搜索共用辅助内容区,一次展示一种视图,切换视图不改变 PDF 可用宽度。
409
417
 
410
418
  | 右栏视图 | 用途与入口 |
411
419
  | --- | --- |
@@ -451,42 +459,29 @@ Sidebar 的当前页面、缩放、选区和跳转返回栈是阅读状态;不
451
459
 
452
460
  选区快照及附图通过宿主现有的消息/附件机制进入会话日志,确保恢复会话后仍能重现模型收到的材料。插件可以维护自己的草稿及索引,但不在宿主会话中写入未声明的事件类型。
453
461
 
454
- ## 8. 模型工具能力草案(P3)
462
+ ## 8. 模型工具契约
455
463
 
456
- 面向 AI 阅读场景的阶段化工具设计见 [AI_READER_TOOLS.md](./docs/AI_READER_TOOLS.md),配套模块边界见 [ARCHITECTURE_V2.md](./docs/ARCHITECTURE_V2.md)。只读证据、模型直接写草稿和用户批准保存已接入;检索引用可交给标注与精确页内导航,Host 重验源文件/全文/字形,成功跳转复用多级回退。搜索/书签续读绑定会话和文档版本,状态报告区分能力支持与当前可用。真实 Desktop 验收仍待完成,下表目标不等于全部已实现。
464
+ 工具按确定性职责划分,当前源码的完整输入、输出和限额见 [AI_READER_TOOLS.md](./docs/AI_READER_TOOLS.md)。模型组合搜索、读取、标注和导航,不注册总结、问答等工作流工具。
457
465
 
458
- 当前已注册 `pdf_open`、`pdf_close`、`pdf_current`、`pdf_read_page`、`pdf_search`、`pdf_page_annotations`、`pdf_bookmarks`、`pdf_render_page`、`pdf_ocr_page`,以及新增的 `pdf_status`、`pdf_locate`、`pdf_context`、`pdf_find_related`、`pdf_image_context`、`pdf_navigate`、`pdf_annotate`、`pdf_annotation_update`、`pdf_annotation_delete`、`pdf_outline_edit`、`pdf_form_inspect_page`、`pdf_fill_form`、`pdf_save`;独立 OCR 插件另注册 `ocr_recognize`,可读取由 PDF 页图工具暂存的会话限定图像句柄。标注修改/删除使用页标注列表给出的精确 ID,在与 Reader 共用的可撤销草稿中生效;内置书签及表单填写也进入共享草稿,仅覆盖保存需要用户确认。`pdf_open` 在 Host 打开受会话权限约束的工作副本,不会在 Client 侧栏打开标签;后台副本有数量、内存及空闲时间上限,`pdf_close` 只释放后台所有权,不关闭阅读器标签或删除草稿。`pdf_render_page` 默认只向确认为视觉模型的当前路线提供图片附件;显式传入 `mode: configured-backend` 才调用 profile 选择的 `imageUnderstanding` 后端:直送图像仍要求当前模型支持视觉,`ocr-text` 或 `auxiliary-vision` 则返回注明来源、可用模型信息及局限的派生文字,不向当前会话提供图片,也不自动降级到另一后端。可选 `question` 传给选定后端以指导处理。`pdf_render_page` 和 `pdf_ocr_page` 都生成来源 `refId`;`pdf_image_context(documentId, refId)` 只在当前 Agent 会话及重新取得授权的工作副本中复用它:直送附件须再检查当前模型视觉能力,OCR/辅助视觉引用只给派生文字,来源或附件失效则报错。`pdf_ocr_page` 经当前 OCR 后端返回文字,不把转写当作经校验的 PDF 原文字层。首版 SessionLLM OCR 仍需要视觉模型,后续本地/远端后端才可能让文本模型使用 OCR。P0 阅读闭环不以模型调用作为验收路径。
466
+ | 能力 | 工具 |
467
+ | --- | --- |
468
+ | 文档生命周期与状态 | `pdf_current`、`pdf_open`、`pdf_close`、`pdf_info`、`pdf_status`、`pdf_save` |
469
+ | 页面读取与导航 | `pdf_page_read`、`pdf_page_render`、`pdf_page_jump` |
470
+ | 检索与证据 | `pdf_keyword_search`、`pdf_semantic_search`、`pdf_evidence_read` |
471
+ | 表单 | `pdf_form_inspect`、`pdf_form_fill` |
472
+ | 标注 | `pdf_annotation_list`、`pdf_annotation_create`、`pdf_annotation_update`、`pdf_annotation_delete` |
473
+ | 内置书签 | `pdf_bookmark_list`、`pdf_bookmark_edit` |
474
+ | 通用图像处理 | `ocr_recognize`、`image_understand` |
459
475
 
460
- 下表是更完整的 P3 能力草案,不等于全部已实现。`pdf_read`、`pdf_render`、`pdf_ocr`、`pdf_annotations` 是概念名,现有具体入口分别为 `pdf_read_page`、`pdf_render_page`、`pdf_ocr_page`、`pdf_page_annotations` 和新工具 `pdf_annotate`。`pdf_save` 已注册,但只支持明确文档的原路径覆盖,并要求 DSH 受信交互渠道的单独批准;表中的“另存为目标”仍属未来能力。
476
+ 页图工具只生成图像及可信句柄;OCR 与图像理解工具只消费句柄,并调用同一服务中的已配置引擎。文本模型可取得句柄供其他引擎处理,但不能接收图片后就被视为看懂图片。区域 OCR 仅由 UI 提供,不注册模型工具或区域参数;两种入口共用底层识别、取消、限额和错误处理。
461
477
 
462
- | 能力草案 | 主要输入 | 主要输出或效果 |
463
- | --- | --- | --- |
464
- | `pdf_open` | 明确路径 | 会话内文档句柄、源版本、工作修订号、页数、可用能力和限制。 |
465
- | `pdf_read` | 文档句柄;页范围、区域、选区引用或文字块范围之一;auto/text/visual 方式;输出限额/游标 | 按 FR-09 返回文字、页面图像及相关标注;标明来源、覆盖范围、未读取的内容、版本和继续读取信息。 |
466
- | `pdf_search` | 文档句柄、查询;首调可选 fromPage/offset,续调只用同 query + opaque cursor | 有界精确命中、每个命中的持久 evidence.refId 与精确 UTF-16 范围;实际覆盖页、无文字页和下一游标。续读不得混用初始位置,查询或版本变化须重启。 |
467
- | `pdf_render` | 文档句柄、物理页码、可选区域、清晰度/图像限额、标注策略 | 完整页或局部合成图像、实际尺寸、页面坐标、版本及继续放大读取信息;进入模型前检查图像能力。 |
468
- | `pdf_ocr` | 文档句柄、物理页码、可选区域、识别语言/选项、输出限额 | 经统一 OCR 功能调用当前配置引擎;返回文字块、位置、引擎来源、可用置信信息、识别范围及失败区域;NoneOCR 明确返回已关闭;不要求当前模型具备图像输入能力。 |
469
- | `pdf_annotations` | 已实现 `pdf_page_annotations`、`pdf_annotate`、`pdf_annotation_update`、`pdf_annotation_delete`;位置、精确标注 ID 或预期修订 | 标注列表或可撤销草稿的增/改/删结果;复杂区域/结构定位仍是草案。 |
470
- | `pdf_bookmarks` / `pdf_outline_edit` | 已实现;精确 outlineId 与文档修订 | 列出、编辑 PDF 内置目录,支持层级与目标调整;原子写入共享草稿。 |
471
- | `pdf_save` | 已实现:文档句柄、预期工作修订号;其他目标路径仍是草案 | 用户批准后覆盖原路径;返回提交的修订号、新源版本、路径或明确的冲突/权限结果。 |
472
- | `pdf_status` | 文档句柄 | 当前路径、版本、未保存状态、观察时可用性与 capabilityDetails 的 supported/available/reason;探测所选 OCR/图像后端,不以服务存在代替可用。 |
473
-
474
- 工具共同要求:
475
-
476
- - 调用必须明确指定文档,不根据“用户现在聚焦的 tab”隐式选择文件。
477
- - 修改须提供预期工作修订号;陈旧修订拒绝修改,并告知如何重新读取。保存同时验证源文件版本。
478
- - `pdf_read` 可以从局部游标继续读取同一页,不因输出截断而跳过页面剩余内容。
479
- - 搜索必须覆盖组合后的连续文本,而不只逐个 PDF 内部文字对象匹配,以便找到跨文字块的词句。
480
- - 输出有可配置的页数、文字量、结果数或图像大小上限,并明确说明实际范围及是否完整。
481
- - 无文字层、区域没有文字、无法可靠排序和读取失败是不同结果,不能合并成同一个空字符串。页摘要也不能仅根据文字长度断言扫描页、空白页或完整可读。
482
- - 直接向当前模型提供图像的工具及整页/区域发送遵循其精确路线的图像输入能力;区分支持、不支持和未知。显式选择派生文字后端时,分别检查该后端及其所需模型/服务,返回来源和局限,不声称当前模型看过原图。执行时重新检查;无法输入图像时说明原因,不把传输成功等同于模型可以理解图像。
483
- - 读取分清文字、视觉和标注的实际覆盖范围。图像不足以辨认或只进行了 OCR 时明确限制,提供局部继续读取或其他方式;纯文字输出不被标为整页视觉阅读成功。
484
- - OCR 结果必须带来源和位置;OCR 任务与分页搜索报告未识别范围。识别完成不隐式修改 PDF,不把模型转写结果伪装成原有文字。工具不绕过设置自选另一厂商、不更改 OCR 配置、不隐式切换引擎。
485
- - 工具读取不自动改变阅读视图。用户明确要求的 `pdf_navigate` 及点击工具卡,在精确证据验证成功后进入与手动操作相同的多级返回栈,包含同页不同位置;普通读取/滚动不入栈。查看器后退不等同于模型上下文回退,不新增模型 back 工具。
486
- - UI 和模型工具调用同一组文档操作,权限、冲突判断和失败语义一致。
487
- - 模型创建标注默认只改变工作副本;只有明确调用保存工具才写入文件。
488
- - 工具结果和会话中的可见引用使用能被宿主正常记录与重放的消息及附件;读取内容不依赖隐蔽内存注入。
489
- - 取消读取或绘制应释放资源。修改批次提交前取消不留下半批变更;持久保存提交之后的取消不得把已提交结果伪装成未发生。
478
+ 读页及搜索签发来源明确的引用;`pdf_evidence_read` 负责重读、缩小和连续跨页范围解析。标注与精确跳转消费同一种最终引用,执行时重新验证源文件、文档修订、整页文字和原生字形。关键词搜索负责精确/显式归一化匹配,语义搜索要求实际可用的 embedding 引擎,不静默返回关键词结果。搜索续调只用同一工具的 `searchId`,输出限额、覆盖范围和未完成状态必须明确。
479
+
480
+ 模型只操作本会话获准的文档,不根据 UI 聚焦状态隐式写入。UI 与模型复用唯一工作副本、草稿、修订、撤销历史和文件保存入口。`pdf_info` 读取文件元信息而不取得长期模型引用;重复 `pdf_open` 不重复累加同一模型持有者,`pdf_close` 不关闭 UI 或删除草稿。源变化和陈旧修订拒绝写入。
481
+
482
+ 单页表单填写、连续范围标注和书签树批量编辑仍是事务:全部成功或零修改。表单检查图与编号映射属于同一快照,填写后读回验证;不让模型分别读取后自行拼接。标注修改保留对象身份与评论关联。修改直接进入未保存草稿,只有 `pdf_save` 通过 DSH 受信交互请求批准;批准绑定将保存的修订、差异及源摘要,不接受模型自报的授权。模型另存为仍未提供。
483
+
484
+ 所有工具支持会话隔离、取消与卸载排空;文档和派生文字是资料,不是指令。读取、搜索和编辑不自动移动用户视图。只有明确请求的 `pdf_page_jump` 或用户点击证据卡会定位到已验证内容,成功后进入统一的多级回退历史,不新增模型 back 工具。真实模型、Desktop 和外部阅读器验收与自动测试分别报告。
490
485
 
491
486
  ## 9. 质量要求
492
487
 
@@ -648,30 +643,30 @@ P1 统一使用 PDF 内置目录;读取与跳转的常规交互已验收,新
648
643
  - **长文档路径**:原 `documentPreviews` / Sidebar 入口进入 Reader 后,以数字页几何和有界活跃窗口维持连续滚动;只在视口附近绘制页面。离页释放画布/文字 DOM。没有后台全页预热;搜索按需读取文字,后续查询以有界缓存和页面摘要跳过确定无匹配的页。缩放预览作用于整个页面窗口,提交比例后重算布局并恢复可见页锚点;侧栏页面缩略图列表只挂载可见项。
649
644
  - **选择和图像**:跨页文字保留逐页几何;一次区域截图后恢复文字模式,按工作副本区域渲染 PNG,仅包含 PDF 页面内容,不合成原生标注或阅读器叠加的标注、便签,并遵循 PDF 自带页面方向。当前截图上限为 2 倍和 1600 万像素,不使用桌面截图。
650
645
  - **PDF 内置目录**:统一支持读取、跳转和编辑;修改在共享草稿中可撤销,保存后写入 PDF,不再维护独立个人书签。
651
- - **OCR**:独立 Host `image-ocr` 插件提供 `ocr` 服务、后端注册和 `ocr_recognize` 工具;阅读器经认证的 `pdf.ocr` 接口按资源所属会话查询可用性、原生渲染整页/区域并调用该服务。目前只内置使用当前会话视觉模型的 SessionLLM 后端,返回可复制文字与覆盖范围;整页结果可作页级搜索,不提供可靠词/行坐标,也不创建 PDF 文字层。Local/Remote Host 后端和精确坐标层仍待接通。
652
- - **图像理解与解释**:独立 Host `image-understanding` 插件提供 `imageUnderstanding` 服务和经认证的 `pdf.image` 请求。默认 `session-vision` 后端在当前会话模型明确支持图像时允许发送 PNG;profile patch 可显式选择 `ocr-text`,或选择内置 `auxiliary-vision` 并指定第二视觉模型的 provider/model(可选推理等级与输出上限)。辅助模型接收截图、生成描述,当前会话只收到标明来源及局限的描述;额外模型请求可能产生费用。其他 Host 插件仍可注册自己的后端并在卸载时注销。解释模式把带问题的文字选段与单页区域按顺序组成一轮会话提词;文字由 `pdf.selection` 重新提取,区域发送时经 `pdf.image` 的 `prepare-reference` 重验并以 Host 返回的字节直送,Client 暂存截图不参与直送。模型工具 `pdf_render_page` 仅在显式 `mode: configured-backend` 时复用这项后端选择,默认页图输出不变。模型真实响应、Desktop 交互及边界场景仍待验收。
653
- - **翻译**:公开 `@dylanl1/dsh-plugin-pdf/translation` SDK 和独立 Registry / Service,默认使用内置 DSH 模型,也可切换已安装的其他引擎;经认证 Host 路由只提交选中文字,复用模型凭据,不加入会话历史。默认目标语言中文;模型不可用时阅读与标注仍可用。
654
- - **设置与限额**:ConfigForms 设置卡片手动保存及恢复默认;目标语言在翻译视图选择后自动保存到当前 Profile,PDF 大小上限通过 bundle/profile patch 配置,不在设置卡片中编辑。Host OCR 默认选中 SessionLLM 后端、超时 120 秒;DSH 翻译默认超时 30 秒,返回栈 100 项,PDF 上限 64 MiB。高亮快捷色初始为五色(含 `#ffff00`),用户可编辑色位;不提供全局默认标注颜色。选区翻译输入 8192 个 UTF-16 字符,统一输出 32768 字符,DSH 模型输出最多 4096 tokens。
646
+ - **OCR**:独立 Host `image-ocr` 插件提供 `ocr` 服务、后端注册和 `ocr_recognize` 工具;阅读器经认证的 `pdf.ocr` 接口按资源所属会话查询可用性、渲染整页/区域并调用同一服务。内置会话模型转写与本地 Tesseract;前者仅提供文字及覆盖范围,后者可提供词/行几何。引擎结果保留各自精度,不创建 PDF 隐藏文字层。文字识别索引对原生文字缺失/损坏页复用所选引擎。
647
+ - **图像理解与解释**:独立 Host `image-understanding` 插件提供 `imageUnderstanding` 服务,契约为图像与提示词输入、生成文字输出。内置 `dsh-vision` 统一跟随当前会话或指定 provider/model 的视觉调用;第三方实现走相同注册与卸载接口。视觉描述索引复用所选图像理解引擎,不再有额外索引引擎设置。解释模式按顺序把带问题的文字与区域组成一轮提词:视觉会话直接接收 Host 验证的图片,文本会话接收配置引擎生成的描述,不静默转成 OCR。文字由 `pdf.selection` 重新提取,图片在发送前重验引用与源版本,Client 暂存图不作为直送权威。`pdf_page_render` 仅生产图像/句柄;`image_understand` 实际调用图像引擎处理句柄。
648
+ - **翻译**:公开 `@dylanl1/dsh-plugin-pdf/translation` SDK 和独立 Registry / Service,默认使用内置 DSH 模型,也可切换已安装的其他引擎;经认证 Host 路由提交选中文字及有界邻近文字,复用模型凭据,不加入会话历史。模型判断单词、短语或句子类型,正常句子片段允许直接翻译,不再由词数强制分类。引擎可通过可选的 `interpretation` 返回纠正/补全文字、确定或推测标记及解释;UI 分开展示原选区和修复结果,词典标题使用修复后的原文,推测不会呈现为 PDF 原文,不修改 PDF。无法恢复时仍可重试或重新选择。默认目标语言中文;模型不可用时阅读与标注仍可用。
649
+ - **设置与限额**:ConfigForms 设置卡片自动保存并支持恢复默认;目标语言在翻译视图选择后自动保存到当前 Profile,PDF 大小上限通过 bundle/profile patch 配置,不在设置卡片中编辑。Host OCR 默认选中 SessionLLM 后端、超时 120 秒;DSH 翻译默认超时 30 秒,返回栈 100 项,PDF 上限 64 MiB。高亮快捷色初始为五色(含 `#ffff00`),用户可编辑色位;不提供全局默认标注颜色。选区翻译输入 8192 个 UTF-16 字符,统一输出 32768 字符,DSH 模型输出最多 4096 tokens。
655
650
  - **导航**:每个 PDF 标签有独立返回栈;成功跳转记录 PDF 坐标与视图状态,普通滚动不入栈,失败或无位移跳转不入栈,返回不重复入栈。内容基线改变时重置相应导航/OCR 状态。
656
651
  - **续读位置**:独立 Host 模块 [reading-positions.ts](<./src/modules/navigation/reading-positions.ts>) 按**文件路径**在插件私有存储中记住每份 PDF 的最后一个阅读位置(页、页内坐标、缩放、fit、视口锚点),只保留最新一条,不写入 PDF 字节。V1 记录同时保存当时的源 PDF **字节**哈希(`workspaces.bytesHash(snapshot.bytes)`)。打开文档时若本客户端会话没有内存中的标签位置,则回退到该记录并恢复;恢复走与书签相同的跳转路径但**不入返回栈**(`remember = false`)。页号超出当前页数报 `page-missing`,否则哈希不同报 `content-changed`。普通未保存标注编辑不改变基线字节,但仅保存标注也会改变 PDF 字节,因此旧位置可能被标为过期;这是目前保留的 V1 行为,并非只在外部改写时才失效。要区分“仅标注保存”与“页面内容改写”,需要另行设计稳定页面内容指纹及数据迁移。位置写入节流(上限延迟 1 秒);标签关闭时另有一次不带标签取消信号的尽力写入,恢复判定前不写入以免覆盖旧位置。
657
- - **按页列标注工具**:Host 注册 `pdf_page_annotations`,按物理页返回该页的标注。数据取自会话工作副本的**标注投影**(与阅读器当前显示一致),因此包含尚未保存的新增与改动,并以 `draft` 标出;导航链接与表单域(`Link`/`Popup`/`Widget`)不属于标注,不返回;其余类型照常返回并用 `readOnly` 标出阅读器不能编辑的那些。**PDF 本身不记录被高亮的文字**(插件新建的标记只写颜色,不写 `Contents`),因此文字标记的覆盖文字是从页面文字几何**近似还原**的,字段名为 `excerpt`,工具描述里明确说明它不是精确字符区间;仅当该页存在文字标记时才读取页面文字,只有便笺的页不会为此付出一次原生读取。摘录计算有几何和文本扫描预算,超限时省略可选摘录。结果按不透明 `nextCursor`/`limit` 分页,每次最多 50 项、总 JSON 至多 30000 字符;游标绑定文档、页和工作副本修订,编辑后须从头读取。标注批注与覆盖文字都属于不可信文档内容。
658
- - **阅读提示词**:Host 适配器 [system-prompt.ts](<./src/adapters/host/dsh/system-prompt.ts>) 注册固定的意图判断指引(section `pdf:reader-context`),不声明当前有 PDF 打开,不注入文档标识、文件路径或页码,也不按阅读器状态决定是否出现。指引保留工具名:当对话仍不足以确定“这段话/当前页”等指代目标时,把用户可能正在阅读 PDF 作为一种假设;若工具可用,先调用 `pdf_current` 检查本会话的可见 PDF,再对确定的目标用 `pdf_read_page` 阅读当前页。多份文档且目标不明时先澄清;当前页并不等于用户选中的具体段落,阅读后仍不明确时应有针对性地询问。没有可见 PDF 时不搜索或打开无关文件;已有明确的其他目标时不检查 PDF。文字始终按不可信内容处理,指引不增加读取权限。该 section 是非插值的静态文本,打开、关闭、翻页及阅读提示过期均不改变它;插件加载时各会话都有固定的提示词开销,不承诺整个请求的缓存命中率。通过可选注入注册,宿主缺少 systemPrompt 服务时阅读器仍可加载;卸载时等待该注册释放。模型是否按此启发式采取行动仍需真实会话验收。
652
+ - **按页列标注工具**:Host 注册 `pdf_annotation_list`,按物理页返回该页的标注。数据取自会话工作副本的**标注投影**(与阅读器当前显示一致),因此包含尚未保存的新增与改动,并以 `draft` 标出;导航链接与表单域(`Link`/`Popup`/`Widget`)不属于标注,不返回;其余类型照常返回并用 `readOnly` 标出阅读器不能编辑的那些。**PDF 本身不记录被高亮的文字**(插件新建的标记只写颜色,不写 `Contents`),因此文字标记的覆盖文字是从页面文字几何**近似还原**的,字段名为 `excerpt`,工具描述里明确说明它不是精确字符区间;仅当该页存在文字标记时才读取页面文字,只有便笺的页不会为此付出一次原生读取。摘录计算有几何和文本扫描预算,超限时省略可选摘录。结果按不透明 `nextCursor`/`limit` 分页,每次最多 50 项、总 JSON 至多 30000 字符;游标绑定文档、页和工作副本修订,编辑后须从头读取。标注批注与覆盖文字都属于不可信文档内容。
653
+ - **阅读提示词**:Host 适配器 [system-prompt.ts](<./src/adapters/host/dsh/system-prompt.ts>) 注册固定的意图判断指引(section `pdf:reader-context`),不声明当前有 PDF 打开,不注入文档标识、文件路径或页码,也不按阅读器状态决定是否出现。指引保留工具名:当对话仍不足以确定“这段话/当前页”等指代目标时,把用户可能正在阅读 PDF 作为一种假设;若工具可用,先调用 `pdf_current` 检查本会话的可见 PDF,再对确定的目标用 `pdf_page_read` 阅读当前页。多份文档且目标不明时先澄清;当前页并不等于用户选中的具体段落,阅读后仍不明确时应有针对性地询问。没有可见 PDF 时不搜索或打开无关文件;已有明确的其他目标时不检查 PDF。文字始终按不可信内容处理,指引不增加读取权限。该 section 是非插值的静态文本,打开、关闭、翻页及阅读提示过期均不改变它;插件加载时各会话都有固定的提示词开销,不承诺整个请求的缓存命中率。通过可选注入注册,宿主缺少 systemPrompt 服务时阅读器仍可加载;卸载时等待该注册释放。模型是否按此启发式采取行动仍需真实会话验收。
659
654
 
660
655
  ### 11.2 后续仍需完成或确认
661
656
 
662
657
  1. **验收与性能**:实际宿主的常规交互已由用户确认通过;外部阅读器标注互操作、不同 PDF 样本和取消/冲突/会话切换竞态边界尚未完成专项验收。已有合成组件基准,但真实长文档的首屏、滚动、远页绘制、编辑、保存及全部进程峰值内存仍需测量。缩略图列表在千页文件中的资源占用、未缓存远页等待也需代表样本验收。标注投影与响应元数据差量化、未知 appearance 重叠区域的预览保真仍需继续完善。
663
658
  2. **布局交互验收**:FR-14 已实现并通过类型检查、构建;窄窗口、辅助栏调宽/折叠、鼠标锚点缩放、键盘操作、页码底栏与后台翻译的常规宿主交互已由用户确认通过,异常窗口尺寸和竞态仍需专项验证。
664
659
  3. **读取兼容**:PDF 自带显示页标签、需密码文件交互式解锁、加密保存和远程文件提供方均尚未实现。特殊 PDF、权限、签名与不支持标注继续按明确限制处理。
665
- 4. **OCR 扩展**:厂商引擎、专属设置表单与凭据绑定尚未内置;LocalOCR 同源 HTTP / HTTPS 资源方案在自定义 scheme 场景仍需确认。批量 OCR、复杂目录兼容和更多标注类型没有确定交付阶段。
660
+ 4. **OCR 扩展**:本地与模型 OCR、动态注册与引擎配置已经接通;第三方厂商的认证和协议适配由扩展实现,`examples/http-engines` 提供可运行结构及自动化契约测试。批量 OCR、复杂样本的识别质量和其他厂商适配仍需专项验证。
666
661
  5. **P1 书签**:右栏内置目录及编辑、页面缩略图已接入,常规交互已经用户验收;仍需以真实嵌套目录、失效目标、文件变化及重启重开的样本完成专项验证。
667
- 6. **P3 会话与模型工具**:解释模式可将文字和单页区域组成一轮提词;区域由 Host 绘制并签发会话限定引用。Host 提供文档生命周期、读页、检索、标注、书签、表单、页图和 OCR 工具;证据按 30 天/256 条清理,图像像素仍在受保护附件存储,运行时 detach 不删除持久证据或草稿。`pdf_search` 的精确命中与相关检索/定位/上下文均返回文字引用;`pdf_annotate` 接受 reference 目标,经共享解析器重验后直接写入草稿,Reader 通过 `pdf.watch` 同步。`pdf_navigate` 接受 `{documentId,refId,tabId?}`,也保留互斥的页号/contentVersion 形式;三个历史文字工具卡复用相同的源文件、全文、精确范围及 native 字形校验,再定位可见 Reader 并记录多级回退。源/几何/权限异常拒绝,不凭历史坐标猜测。保存仍单独批准。游标绑定身份、版本及查询/列表,能力状态实际探测所选后端,不能把服务存在当可用。普通页图不合成未保存草稿;答案内联引用、图像工具卡和完整解释提词的统一证据仍待实现。真实模型与 Desktop 交互仍需验收;解释主模型固定跟随会话,辅助视觉模型由 profile 显式配置。详情见 [AI 阅读工具设计与状态](./docs/AI_READER_TOOLS.md)。
662
+ 6. **P3 会话与模型工具**:解释模式可将文字和单页区域组成一轮提词;区域由 Host 绘制并签发会话限定引用。Host 提供文档生命周期、读页、检索、标注、书签、表单、页图和 OCR 工具;证据按 30 天/256 条清理,图像像素仍在受保护附件存储,运行时 detach 不删除持久证据或草稿。`pdf_keyword_search` 的精确命中与相关检索/定位/上下文均返回文字引用;`pdf_annotation_create` 接受 reference 目标,经共享解析器重验后直接写入草稿,Reader 通过 `pdf.watch` 同步。`pdf_page_jump` 接受 `{documentId,refId,tabId?}`,也保留互斥的页号/contentVersion 形式;三个历史文字工具卡复用相同的源文件、全文、精确范围及 native 字形校验,再定位可见 Reader 并记录多级回退。源/几何/权限异常拒绝,不凭历史坐标猜测。保存仍单独批准。游标绑定身份、版本及查询/列表,能力状态实际探测所选后端,不能把服务存在当可用。普通页图不合成未保存草稿;答案内联引用、图像工具卡和完整解释提词的统一证据仍待实现。真实模型与 Desktop 交互仍需验收;解释主模型固定跟随会话,图片处理使用 PDF 设置中的图像理解引擎。详情见 [AI 阅读工具设计与状态](./docs/AI_READER_TOOLS.md)。
668
663
  7. **自定义 UI 组件体系化**:现状清单与待办见 [第 9.1 节「自定义 UI 组件现状」](#91-自定义-ui-组件现状)。分类与 API 方案尚未确定;在确定触发口径、键盘规格和移动端取舍之前,不开始实现。
669
664
  8. **阅读提示词的真实触发率**:静态意图指引的注册、工具名、无状态播报及卸载行为由自动化测试覆盖。真实模型仍需验证:模糊指代时是否先检查 `pdf_current` 并按结果阅读;已有明确的非 PDF 目标时是否避免误触发;无文档、多文档或无法确定具体段落时是否恰当澄清。不以自动化文本断言代替模型行为验收,也不通过注入实时文档状态来强制触发。
670
665
  9. **续读位置的剩余边界**:正常恢复与"外部改写后跳过并提示"已有端到端覆盖。仍需确认:同一路径另存为或改名后是否应继承位置(当前按路径独立,不继承);多标签同时打开同一文件时以最后一次写入为准是否符合预期;插件私有存储被清理后回退到第 1 页。当前不提供关闭该功能的设置。
671
666
 
672
667
  ## 12. 设计依据
673
668
 
674
- 功能要求由用户需求和本 SPEC 的设计建议组成。以下宿主文档固定到 DeepSeek Harness 的 `d743267388641bc76f17c45ce8b4c231aed1d32c`(0.2.1-alpha.2 合并点),用于确认接入约束,不表示该版本已经通过本仓库 CI;当前 CI 依赖的是 0.2.0-rc.2:
669
+ 功能要求由用户需求和本 SPEC 的设计建议组成。以下宿主文档固定到 DeepSeek Harness 的 `d743267388641bc76f17c45ce8b4c231aed1d32c`(0.2.1-alpha.2 合并点),用于确认接入约束,不表示该版本已经通过本仓库 CI;当前 CI 依赖的是 0.2.1-rc.5:
675
670
 
676
671
  - [第一个插件](https://github.com/deepseek-ai/deepseek-harness/blob/d743267388641bc76f17c45ce8b4c231aed1d32c/docs/user/develop/basic/index.zh.md):本地插件、依赖注入和 effect 生命周期。
677
672
  - [打包与安装插件](https://github.com/deepseek-ai/deepseek-harness/blob/d743267388641bc76f17c45ce8b4c231aed1d32c/docs/user/develop/basic/publish.zh.md):独立 bundle、profile、外部 linked package 和 patch 层。
@@ -2,7 +2,7 @@
2
2
 
3
3
  This plugin includes the following dependencies and local runtime assets.
4
4
 
5
- ## @deepseek-ai/dsh-util-workspace-path 0.2.1-rc.3
5
+ ## @deepseek-ai/dsh-util-workspace-path 0.2.1-rc.5
6
6
 
7
7
  License: MIT
8
8
 
@@ -699,12 +699,6 @@ License: Apache-2.0
699
699
 
700
700
 
701
701
 
702
- ## tr46 0.0.3
703
-
704
- License: MIT
705
-
706
- Source: git+https://github.com/Sebmaster/tr46.js.git
707
-
708
702
  ## tslib 1.14.1
709
703
 
710
704
  License: 0BSD
@@ -724,55 +718,6 @@ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
724
718
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
725
719
  PERFORMANCE OF THIS SOFTWARE.
726
720
 
727
- ## webidl-conversions 3.0.1
728
-
729
- License: BSD-2-Clause
730
-
731
- ### LICENSE.md
732
-
733
- # The BSD 2-Clause License
734
-
735
- Copyright (c) 2014, Domenic Denicola
736
- All rights reserved.
737
-
738
- Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
739
-
740
- 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
741
-
742
- 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
743
-
744
- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
745
-
746
-
747
- ## whatwg-url 5.0.0
748
-
749
- License: MIT
750
-
751
- ### LICENSE.txt
752
-
753
- The MIT License (MIT)
754
-
755
- Copyright (c) 2015–2016 Sebastian Mayr
756
-
757
- Permission is hereby granted, free of charge, to any person obtaining a copy
758
- of this software and associated documentation files (the "Software"), to deal
759
- in the Software without restriction, including without limitation the rights
760
- to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
761
- copies of the Software, and to permit persons to whom the Software is
762
- furnished to do so, subject to the following conditions:
763
-
764
- The above copyright notice and this permission notice shall be included in
765
- all copies or substantial portions of the Software.
766
-
767
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
768
- IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
769
- FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
770
- AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
771
- LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
772
- OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
773
- THE SOFTWARE.
774
-
775
-
776
721
  ## zod 4.4.3
777
722
 
778
723
  License: MIT