progress.md 32 KB

Progress

Session Log

  • 开始 Analytics 远程公告通道实现:用户确认使用 Cloudflare KV;目标是 Worker/Dashboard/Client 全链路实现 Markdown 公告,客户端与 30 分钟版本检查共用轮询,公告关闭后同 ID 不再显示。
  • 文件型计划 catchup 首次使用示例路径失败,实际脚本位于 ~/.config/opencode/.../session-catchup.py,已重跑成功并记录到计划。
  • 已完成 Analytics Worker 和 Dashboard 公告管理改造:Worker 新增公开 /notice、管理员 /api/notice GET/POST/DELETE;Dashboard 新增公告标题、启用状态、Markdown 内容、读取/发布/停用交互。
  • 已完成客户端远程公告接入:UpdateNotifier 与版本检查共用 30 分钟定时器,公告使用独立 Dialog 和 Markdown 渲染,关闭后以 remote_notice_dismissed_id 记录同 ID 不再显示。
  • 已新增 analytics/scripts/setup-notice-kv.mjsanalytics/workersetup:notice-kv 脚本,文档补充 KV 创建、公告接口、Dashboard 使用和排查说明。
  • 验证进展:node --check analytics/worker/src/index.jsnode --check analytics/scripts/setup-notice-kv.mjs 已通过;Dashboard 内嵌脚本首次检查失败是检查命令正则转义问题,准备换字符串索引方式重跑。
  • 第一次 npm run build 发现 remoteNotice.tsnotice.enabled !== false 在类型收窄后恒为 true,已改为过滤后直接归一 enabled: true
  • 复查公告停用流程时发现 DELETE /api/notice 需要 CORS 预检支持,已将 Worker Access-Control-Allow-Methods 补充 DELETE,并重跑 Worker 语法检查通过。
  • 远程公告通道验证完成:node --check analytics/worker/src/index.jsnode --check analytics/scripts/setup-notice-kv.mjs、Dashboard 内嵌脚本 new Function 检查、cd client; npm run build、本轮变更文件 git diff --check 均通过;构建仍只有既有 chunk 体积警告,diff check 仍只有 LF/CRLF 提示。
  • 用户本地执行 npm run setup:notice-kv 失败,原因是本地 Wrangler 没有 CLOUDFLARE_API_TOKEN 且脚本以非交互方式调用 Wrangler。已改造为部署前自动幂等执行:优先复用 NOTICE_STORE_ID/已配置 id/账号中已有 namespace,不存在才创建;deploy-if-changed.mjs 会在 analytics/worker 部署前调用该脚本。
  • 开始活跃留存与配置使用统计改造:已进入文件型计划,范围限定为客户端配置使用上报、Worker 汇总查询和 Dashboard 展示,不做任务漏斗/错误/耗时统计。
  • 已完成客户端埋点接入:user_config.json 新增 analytics_created_atanalytics.ts 支持 config_usage;应用启动、设置保存、生图测试、Step02/Step03/Step04 启动会按白名单上报配置枚举值。
  • 已完成 Worker 和 Dashboard 改造:Worker 支持 config_usage,新增 /api/retention/api/config-usagesummary 增加活跃/新老客户端;Dashboard 增加活跃指标卡、留存概览、配置使用分布和最近事件分页。
  • 验证通过:node --check analytics/worker/src/index.jsnode --check client/electron/services/configStore.cjs、Dashboard 内嵌脚本 new Function 语法检查、cd client; npm run build、本次改动文件 git diff --check。构建仍只有既有 chunk 体积警告,diff check 仍只有 LF/CRLF 提示。
  • 已修复代码评审提出的旧匿名客户端 ID 迁移问题:analytics.ts 会读取旧 localStorage.analytics_client_id,优先用旧 ID 覆盖并保存到 user_config.json;当前埋点也直接使用旧 ID。验证通过 cd client; npm run buildgit diff --check -- client/src/shared/analytics/analytics.ts
  • 已修复代码评审提出的 /api/latest 分页总数采样口径问题:分页 total 改用 COUNT(),与 LIMIT/OFFSET 明细行数一致,不再用 SUM(_sample_interval) 估算事件数。验证通过 node --check analytics/worker/src/index.jsgit diff --check -- analytics/worker/src/index.js
  • 已修复线上 /api/summary/api/retention 返回 query failed 的高风险 SQL:移除 toDateOrNull/dateDiff/COUNT(DISTINCT IF(...)) 组合,summary 改为多个简单去重查询,retention 改为查询 app_open 明细后在 Worker JS 中计算;查询失败时增加 console.error,并在 analytics/README.md 补充 wrangler tail 查看日志方式。验证通过 node --check analytics/worker/src/index.jsgit diff --check
  • 已初始化文件型计划,用于跟踪导入招标文件页面重做任务。
  • 已查看客户端导入页、现有文件解析服务、配置存储和工具目录概览,确认需要重做 UI 并重写解析服务分流。
  • 已细读 doc2markdown-node、MinerU Agent、MinerU 精准 API demo 的关键流程,下一步迁入/复用解析逻辑。
  • 已完成客户端解析链路改造:Electron 文件服务按配置分流本地解析、MinerU-Agent、MinerU 精准 API;导入页改为配置标题 + Markdown 渲染器。
  • 已通过 node -e "require('./electron/services/fileService.cjs'); console.log('file service ok')"node -e "import('./electron/services/doc2markdown/convert.mjs').then(() => console.log('converter ok'))"、本地 Markdown 转换 smoke test、npm run buildnpm audit
  • 开始技术方案缓存迁移:目标是从 Renderer localStorage 改为 Electron Main 侧 userData 文件存储,并同步开发说明。
  • 已完成技术方案缓存迁移:新增 workspaceStore.cjsworkspaceIpc.cjs、preload window.yibiao.workspace,技术方案 Hook 改为异步读写 Main 侧缓存;npm run build 通过。
  • 已完成 Step02 招标文件解析:新增解析模式切换、并发流式解析、进度与结果展示,项目概述和技术评分要求成功且进度 100% 后才允许进入目录生成;npm run build 通过。
  • 已重做 Step02 用户体验:模式选择改为明确的按钮式 Segmented Control,结果展示改为左侧任务列表 + 右侧单项阅读器,不再把所有解析结果铺满页面;npm run build 通过。
  • 已完成 Step03 目录生成迁移:将旧版后端目录生成 Prompt 与自由/评分项对齐工作流迁入 client service,新增目录生成页面、过程日志、目录树、详情编辑、添加/删除目录项;npm run build 通过。
  • 已完成 Step02/Step03 后台任务化:新增 Main 侧 taskServicebidAnalysisTaskoutlineGenerationTasktasks:* IPC/preload,招标文件解析和目录生成切页面不中断,任务状态与结果持续写入 technical_plan.jsonnpm run build 和任务模块加载验证通过。
  • 已严格对齐后端 /api/outline/generate-stream 的目录生成容错机制:client aiService 新增 collectJsonResponse,目录生成每一步改为 schema 标准化 + validator + JSON 修复 + 最多 3 轮重试;outlineGenerationTask.cjs prompt、validator 和工作流已按 backend OutlineService 迁移;模块加载、假 AI 流程和 npm run build 验证通过。
  • 开始 Step04 正文生成与 Word 导出:已确认后端正文生成接口、导出 Word payload、旧前端叶子节点生成逻辑和 client 当前任务/导出占位结构。
  • 已新增 Main 侧正文生成任务、任务 IPC/preload 入口、技术方案正文状态类型、Step04 页面主体和 Word 导出服务;首次 CJS 模块验证发现 ??/|| 混用语法错误,已改为中间变量修复。
  • Step04 正文生成与 Word 导出已完成集成:模块加载验证、Word buffer 生成、假 AI 正文任务流程和 npm run build 均通过;构建仍有既有 chunk 体积警告。
  • 已核对并修复 Step04 代码评审问题:目录变更时清空正文生成缓存和 outline 节点旧 content;正文 Markdown 渲染移除 rehypeRaw,避免模型输出 HTML 被渲染成 DOM;任务模块加载和 npm run build 通过。
  • 已给正文生成结果增加开头重复章节标题过滤:在 Main 侧流式结果写入工作区前清理独立标题行,覆盖编号标题、Markdown 标题、加粗标题和中文序号标题;针对性用例、假 AI 任务和 npm run build 通过。
  • 开始 toolbar 拖动与页面内部滚动优化:已进入文件型计划,目标是让底部悬浮工具条可通过手柄拖动,并消除页面全局滚动条。
  • 已完成 toolbar 拖动与页面内部滚动优化:FloatingToolbar 增加拖动手柄和边界约束;全局布局改为 100vh 内部滚动;设置页拆成内部滚动层和悬浮工具条层;移除 toolbar 底部预留空间;client/开发说明.md 已补充规则;npm run buildgit diff --check 通过。
  • 开始 GitHub Release 自动打包与更新检查:目标是 v* tag 触发 Windows/macOS 构建,自动生成 Release notes,并在打包客户端启动时检查 GitHub Release 更新。
  • 已完成 GitHub Release 自动打包与更新检查:安装 electron-builder / electron-updater;补齐 client/package.json 打包配置;新增 .github/workflows/release.yml;新增 updateService.cjs 并接入主进程;更新开发说明;npm run buildnpm auditupdateService 模块加载、Windows unpacked 和 NSIS 打包验证通过。
  • 已修复首次远程发布验证问题:v2.0.1 Actions 成功但 Release 无产物,是因为正式 Release 与 electron-builder 默认 draft 发布类型冲突;workflow 已改为构建后用 gh release upload --clobber 显式上传,同时 Release notes 改为基于 git log 生成,并支持手动输入已有 tag 重新发布。
  • 已修复 Actions Build rendererTS2688: Cannot find type definition file for 'plist':新增 @types/plist devDependency,并在 workflow 中补装该类型包以兼容手动重跑旧 tag;npm run buildnpm audit 通过。
  • 已确认用户此前点击的是旧 run 的 Re-run all jobs,不会使用 main 上修复后的 workflow;已通过 gh workflow run release.yml --ref main -f tag_name=v2.0.1 触发最新 workflow,v2.0.1 Release 已成功上传 13 个构建资产并更新提交列表说明。
  • 已排查 Windows 安装包“无响应”:下载文件完整且可解包,本地启动后安装器进程有响应窗口;同时已将后续构建产物命名修正为 Yibiao-版本-平台-架构.ext,本地 NSIS 构建验证通过。
  • 已修复打包后图标仍为 Electron 默认图标:恢复 Windows exe 图标资源编辑;macOS workflow 在打包前从 assets/icon_256.png 生成 assets/icon.icnspackage.json 格式、npm run buildgit diff --check 通过。
  • 已统一 Step02/Step03 左侧进度块为 Step04 的 content-outline-stats 风格:Step02 任务列表、Step03 生成日志保持独立滚动;清理旧进度卡样式;npm run buildgit diff --check 通过。
  • 已将 Step04 Word 导出从手写 XML/浅层 Markdown 正则改为 Markdown AST 到 docx 对象模型:支持标题、加粗、斜体、删除线、链接、列表、表格、引用、代码块和图片导出;模块 smoke test、表格/图片 zip 检查、npm run buildnpm auditgit diff --check 通过。
  • 已完成 Step04 正文智能表格与可选配图:设置页新增生图模型状态显示和测试结果持久化;正文生成先做 AI 编排决策,再按决策生成 Markdown 表格和可选图片;生图结果保存到 workspace/generated-images/ 并以 yibiao-asset://generated-images/... 插入正文;预览协议和 Word 导出读取均已支持;模块加载、无生图/有生图 smoke test、npm run buildgit diff --check 通过。
  • 已完成 Step04 正文首批体验修正:生成正文落盘前规范 <br>,前端正文页启用 raw <br> 渲染,Word 导出将 <br> 写成真实换行;图例去掉“AI 生成示意”;图片和图例居中;图片支持点击全屏查看;开发者模式下显示配图计划/尝试/成功/失败/跳过统计;npm run build、正文任务 smoke test、Word <br> 导出 smoke test、git diff --check 通过。
  • 已完成 Step04 正文第二批优化收尾:mermaid.ink pako: 编码改为压缩 JSON 状态;正文任务插入的 Mermaid URL 返回 200 image/png;Word 导出 Mermaid 代码块可嵌入 word/media/*.png,且不保留 Mermaid 源代码;mermaid.ink 失败时 Word 导出写入可读占位不崩溃;模块加载、正文任务 smoke test、Word 导出 smoke test、失败路径 smoke test、npm run buildgit diff --check 均通过。npm run build 仍有既有 chunk 体积警告,git diff --check 仍有 LF/CRLF 提示。
  • 已完成 Step04 正文第三批优化:安装 mermaid 依赖;正文生成中的 Mermaid 改为保存代码块;正文页用 Mermaid 动态导入进行前端本地渲染;Word 导出新增 export:word-progress 事件、preload 订阅、Renderer 进度弹窗和核对提示;导出服务返回图片失败 warnings 并写控制台日志,失败时 Word 中保留可读占位。模块加载、正文任务 Mermaid 代码块 smoke test、Word Mermaid 图片导出 smoke test、失败路径 smoke test、npm run buildgit diff --check 均通过。构建新增 Mermaid 动态分包,仍有 chunk 体积警告;git diff --check 仍有 LF/CRLF 提示。
  • 已修复 Step04 评审问题:正文编排阶段单章节失败会降级为纯正文生成,不再阻断全文任务;Word 导出识别 WebP 并在 Electron 运行时转 PNG;Word 导出补充常见 HTML 节点转换和不支持标签 warning。模块加载、编排失败降级 smoke test、HTML 表格/列表/换行导出 smoke test、WebP Node 失败路径、npm run buildgit diff --check 通过。普通 Node 环境无 nativeImage,WebP 真正转 PNG 需在 Electron Main 运行时手动复验。
  • 已优化 Step04 进度展示:正文任务 stats 增加 content.phase、编排总数/完成数和生成总数/完成数;前端在编排阶段优先显示绿色“编排统计”进度条,目录节点从“待生成”改为“编排中”;编排完成后自动切回原有正文生成进度。模块加载、正文任务 stats smoke test、npm run buildgit diff --check 通过。
  • 已完成 Step04 前端性能优化(不改流式 chunk 节流):合并正文任务开始/完成/失败处的重复状态事件;ContentEditPage 预计算目录节点状态、叶子数和字数,避免渲染目录时反复递归统计;正文 Markdown 渲染拆为 memo 组件,只有正文内容变化才重新解析;TechnicalPlanHome 使用最新 event.task 并把 UI 任务日志裁剪为最近 80 条。模块加载、正文任务事件 smoke test、npm run buildgit diff --check 通过。
  • 已修复 Step04 全文重新生成行为:点击“重新生成正文”并确认开始后,Renderer 先清空全文正文、章节状态、任务进度并写入工作区缓存;Main 侧收到全文 regenerate 时也清空 outline content 和 sections 后再计算初始进度,避免旧内容导致进度仍是 100%。全文重新生成清空 smoke test、npm run buildgit diff --check 通过。
  • 已完成 Step04 Mermaid 配图渲染失败自修复:正文任务在追加 Mermaid 代码块前先做前端兼容规则和 mermaid.ink 渲染校验;失败后调用文本模型按错误信息最多修复 3 轮;修复通过写入修复后的 Mermaid,连续失败则取消该 Mermaid 配图、保留正文并记录失败统计。模块加载、修复成功 smoke test、连续失败取消 smoke test、npm run buildgit diff --check 通过。
  • 已完成 Step04 配图阶段重构:编排阶段允许 AI 生图和 Mermaid 双候选;正文生成阶段只保存纯正文;新增 illustrating 配图阶段和前端配图进度;配图阶段先按 AI 上限选择 AI 目标,未入选 AI 但有 Mermaid 候选的章节降级为 Mermaid;AI 生图并发 2、Mermaid 校验/修复并发 5,AI 生图失败不自动降级 Mermaid。配图阶段 smoke test、模块加载、npm run buildgit diff --check 通过。
  • 已修复 Step04 Word 导出表格与编号问题:parseMarkdown() 前对 Markdown 表格做导出层归一化,支持标题后紧跟表格和表格行被压成一行的情况;Markdown/HTML 有序列表改为每个列表块独立 numbering reference,避免 Word 跨块连续编号。模块加载、导出 smoke test、npm run buildgit diff --check 通过;git diff --check 仍只有 LF/CRLF 提示。
  • 已完成 Step04 Word 导出压缩表格二次修复:针对截图中的“表头正常、分隔行后拼接数据行”形态,导出前按表头列数拆回 GFM 表格行;截图同形态 smoke test 生成 1 个 Word 表格和 3 行表格行,且不再残留 :--- 文本。exportService 模块加载、npm run buildgit diff --check 通过;构建仍有 Mermaid 相关 chunk 体积警告,git diff --check 仍只有 LF/CRLF 提示。
  • 已完成 Step04 单章重新生成流程调整:新增 contentGenerationPlans 持久化最终编排/配图决策;全文生成后保存每个小节 ai/mermaid/none;单章重新生成优先复用历史编排并跳过编排模型,缺失时只编排目标小节一次,然后重新生成正文并按编排结果重新配图。单章复用与缺失两条 smoke test、正文任务模块加载、npm run buildgit diff --check 通过;git diff --check 仍只有 LF/CRLF 提示。
  • 已修复 Step04 Word 导出 HTML 容器 P2:div/section/article 包含表格、列表、引用、图片等块级子节点时递归导出为 Word 原生结构;纯内联容器仍保持单段落输出;p 中出现块级子节点也拆块处理。HTML wrapper smoke test 通过:包裹表格生成 2 个 Word 表格,包裹列表保留 2 个列表项;exportService 模块加载、npm run buildgit diff --check 通过,仍只有 LF/CRLF 提示。
  • 已修复 Step04 Word 导出列表项内表格问题:Markdown 表格归一化现在会保留空白前缀缩进,并让压缩表格拆出的行继承表头缩进,避免列表内 GFM 表格被破坏。列表项内表格 smoke test 通过:生成 1 个 Word 表格、外围列表保留 2 个列表项,且不残留 | 备件类别:--- 文本;exportService 模块加载、npm run buildgit diff --check 通过,仍只有 LF/CRLF 提示。
  • 开始知识库完整分析流程重构:已根据用户确认记录完整方案、关键取舍和提示词缓存策略;下一步梳理现有知识库服务、IPC、类型和页面。
  • 已梳理现有知识库 Main 服务和 IPC:当前上传后立即 AI 整理并生成 items.json,前端没有继续分析入口;需要改为先生成候选条目和 block,再由用户输入批次大小启动匹配。
  • 已完成知识库完整流程重构:上传后准备 Markdown、block、筛除日志和两轮候选条目;新增 startMatching/readAnalysis IPC/preload/type;前端新增分析调试页和批次输入;匹配阶段按固定全文前缀 + 变量条目批次调用 AI,随后补漏最多两轮并由程序回填正文。
  • 验证通过:node --check electron/services/knowledgeBaseService.cjsnode --check electron/ipc/knowledgeBaseIpc.cjsnode --check electron/preload.cjs、知识库 block/filter/prompt smoke test、两次 npm run buildgit diff --check 仅发现非本次修改的 client/doc/知识库设计.md EOF 空行和 LF/CRLF 提示。
  • 已按反馈优化知识库提示词缓存结构:移除知识库主流程所有 system prompt,改为多条 user 消息;全文 block 单独作为第一条 user message,任务要求和变量条目放后续 user message。已显式兼容第二轮补充条目返回 {"items":[]},会继续合并首轮条目并进入待匹配。node --check、prompt smoke test、npm run build 通过。
  • 已为知识库流程增加开发者模式详细 JSONL 日志:写入 userData/logs/knowledge-base/<documentId>.jsonl,记录文档状态更新、复制/转换、block 筛选统计、每次 AI 调用开始/结束、prompt 消息长度、条目/匹配/补漏数量、保存路径和异常堆栈;分析调试页会展示日志路径。node --check、prompt smoke test、npm run build 通过。
  • 开始 Step03 目录生成弹窗 UI 改造:目标是移除页面原生成方式切换,点击生成目录后在弹窗内选择生成方式和多选参考知识库文档,本轮不改目录生成后台逻辑。
  • 已完成 Step03 目录生成弹窗 UI 改造:OutlineEditPage 中生成按钮改为打开配置弹窗;弹窗内选择自由生成/按评分项对齐并显示解释;按文件夹列出知识库文档并支持多选完成状态文档;页面顶部移除原生成方式切换。npm run build 通过,仍只有既有 chunk 体积警告;git diff --check 只有既有 LF/CRLF 提示。
  • 已按反馈重做 Step03 弹窗内“参考知识库”交互:改为紧凑搜索框 + 左侧折叠文件夹树 + 右侧已选文档清单;默认只展开第一个有可用文档的文件夹,搜索时自动展开命中结果;默认只展示已完成文档,支持文件夹全选/取消和已选文档移除/清空。npm run build 通过,仍只有既有 chunk 体积警告。
  • 已完成 Step03 目录生成应用知识库:目录生成 payload 传入参考知识库文档 ID;Main 侧任务服务注入知识库服务;知识库只读返回 document_id::item_id/title/resume;目录生成按当前一级目录关键词筛选最多 15 条知识条目,只在二三级目录 prompt 中注入;目录节点只保留合法 knowledge_item_ids。已验证对齐模式非法 ID 过滤、自由模式一级目录不使用知识库/二三级使用知识库、CJS 语法检查、npm run buildgit diff --check
  • 继续 Step03 知识库目录 Patch 增强:当前 outlineGenerationTask.cjs 仍存在旧的章节级知识条目筛选、二三级 prompt 注入和自由模式知识库强制 fallback,需要改为先生成完整目录再全局 Patch。
  • 已完成 Step03 知识库目录 Patch 增强:主目录生成不再接收/注入知识库条目,选中文档只在完整目录审核通过后读取轻量条目并调用一次全局 Patch;Patch 只允许 bindings/additions,过滤非法目录/知识 ID,新增节点由程序编号,并全局去重 knowledge_item_ids。验证通过:CJS 语法检查、临时 smoke test、npm run buildgit diff --check
  • 已修复 Step03 知识库 Patch 全部过滤问题:Patch prompt 改为真实 ID 示例 + 三类白名单(可绑定目录、可新增父级、可用知识 ID);Patch 校验改为严格抛错并触发 collectJsonResponse 修复,覆盖占位 ID、短 ID、一级绑定、三级 parent、重复知识 ID 等;开发者模式任务日志新增白名单规模、校验失败原因、原始尝试摘要和校验通过统计。修复 smoke test、CJS 语法检查、npm run buildgit diff --check 通过。
  • 开始 Step03 知识库 additions-only 重构:已确认 outlineGenerationTask.cjs 仍保留旧 bindings/additions + knowledge_item_ids Patch、严格知识 ID 校验和应用层绑定落盘逻辑;下一步替换为只补缺失三级目录。
  • 已完成 Step03 知识库 additions-only 重构:知识库增强 prompt 不再暴露知识库 ID,只输出 additions[parent_id,title,description];normalizer 支持数组/items/directories 归一、删除多余字段、三级 parent 自动上提、description 用 title 补齐和 parent+title 去重;应用层只把新增三级目录追加到现有二级目录并用空知识 ID 集合归一,确保不落 knowledge_item_ids。验证通过:临时 smoke test、5 个 CJS node --checknpm run buildgit diff --check;构建仍只有既有 chunk 体积警告,diff check 仍只有 LF/CRLF 提示。
  • 已完成 Step04 正文编排阶段关联知识库:正文编排 JSON 新增 knowledge.item_ids;编排 prompt 在章节动态信息前加入固定知识库轻量清单,只含 id/title/resume;Main 侧读取 reference_knowledge_document_ids 并复用知识库轻量条目读取;前端启动正文生成时传入当前参考知识库文档 ID;本轮不改正文生成 prompt、不读取知识库正文。验证通过:node --check electron/services/contentGenerationTask.cjs、知识库编排归一化 smoke test、npm run buildgit diff --checknpm run build 仍只有既有 chunk 体积警告,git diff --check 仍只有 LF/CRLF 提示。
  • 已完成 Step04 正文生成阶段应用知识库:Main 侧按 documentId::itemId 建立知识库正文素材 Map;正文生成时按当前小节 contentPlan.knowledge.item_ids 解析对应 content,并在正文 prompt 中只注入 content,不传 ID、标题或简介;知识库素材消息放在项目概述之后、章节上下文之前以提升缓存命中可能。验证通过:node --check electron/services/contentGenerationTask.cjs、正文 prompt content-only smoke test、npm run buildgit diff --check;构建仍只有既有 chunk 体积警告,diff check 仍只有 LF/CRLF 提示。
  • 开始知识库查看链路性能埋点:目标是在开发者模式下记录 openDocument() 点击、IPC 读取、返回数据规模、状态更新、条目列表渲染、DOM 提交、Long Task 和下一帧可见,以区分慢点来自读取链路、列表渲染还是单条原文渲染。
  • 已完成知识库查看链路性能埋点:新增 document-items trace,并让 document-markdown trace 从点击开始贯穿 IPC 读取和渲染可见;条目集合会统计总 content 字符数、最大条目、HTML/表格/图片/URL 分布,条目列表也接入 Profiler、DOM 指标、Long Task 和下一帧可见。第一次构建发现 metrics.chars 类型推断问题,显式声明为 Record<string, number>cd client; npm run build 通过,仍只有既有 chunk 体积警告。
  • 已将知识库“查看原文”改为弹窗:条目列表不再被原文视图替换,关闭弹窗后保留原滚动位置;弹窗复用现有原文 Markdown 渲染、开发者模式 item-source trace 和一帧延迟渲染逻辑,并新增专用遮罩/卡片/内部滚动样式。验证通过:cd client; npm run build,仍只有既有 chunk 体积警告。
  • 开始并完成标书查重元数据模块首版:新增 Main 侧 duplicateCheckServiceduplicate-check:start-metadata-analysis IPC/preload;Step02 自动启动元数据分析;正文提取与元数据提取并发,内部按文件线性处理;正文提取使用 preserveImages: true 并按文件保存 Markdown;元数据页展示两条进度、横向滚动对比表和重复项标红。验证通过:CJS node --check、模块加载和 cd client; npm run build,构建仍只有既有 chunk 体积警告。
  • 已优化标书查重元数据模块:Step02 右上角新增“重新查重”,通过 force: true 强制重跑当前文件批次;时间类元数据改为同一天即橙色高亮,不再要求完全一致。验证通过:node --check electron\services\duplicateCheckService.cjsnode --check electron\preload.cjscd client; npm run build
  • 已完成标书查重 WPS/DOC/PDF 元数据增强:新增 cfb 依赖;doc2markdown/convert.mjs 导出 withLegacyWordDocxFile().doc/.wps 读取 OLE SummaryInformationDocumentSummaryInformation、自定义属性和 WPS/Kingsoft 痕迹,并尝试转 .docx 补充 docProps;PDF 展开全部 Info/XMP、fingerprints、permissions 和原始 /Author 等记录;动态前缀字段参与横向比较。验证通过:node --check electron\services\duplicateCheckService.cjs、转换模块动态 import、查重服务模块加载、npm run buildgit diff --checknpm audit 仍报既有 mermaid moderate 漏洞,未自动修复。
  • 开始标书查重目录分析首版:已确认用户要求纯程序提取目录并比对;招标文件只做句子白名单,投标文件目录项若直接来自招标文件则不计重复;下一步扩展 Main 状态和前端目录 Tab。
  • 已完成标书查重目录分析首版:Main 侧基于已提取 Markdown 生成招标句子白名单,按显式目录页/Markdown 标题/语义标题提取投标文件多级目录,命中招标文件句子的目录项不计重复;新增强重复/疑似相似组和文件两两相似度。前端目录 Tab 展示概览、相似度矩阵、文件目录树、重复组和“来自招标文件”灰色标签。验证通过:node --check electron\services\duplicateCheckService.cjsnode --check electron\preload.cjsnode --check electron\ipc\duplicateCheckIpc.cjs、查重服务模块加载、npm run buildgit diff --check 仅本轮文件 LF/CRLF 提示,另有既有 client/doc/标书查重.md:54 trailing whitespace 未处理。
  • 开始标书查重正文和图片比对:目标是正文按句子用程序聚合重复,招标文件句子作为排除白名单;图片按 hash 找完全相同图片;两个分析在正文 Markdown 提取完成后并发运行,前端用文件编号条和分页列表展示。
  • 已完成标书查重正文和图片比对:新增 contentAnalysisimageAnalysis 工作区状态;正文提取完成后并发运行目录、正文和图片分析。正文比对移除图片后拆句,用招标句子 Set 排除引用内容,再按规范化句子 Map 聚合跨投标文件重复;图片比对解析 Markdown/HTML 图片,读取 yibiao-asset/data/file 图片字节并按 SHA256 聚合。前端正文/图片 Tab 已实现投标文件 A/B/C 编号条、重复句子分页和重复图片分页缩略图。验证通过:node --check electron\services\duplicateCheckService.cjsnode --check electron\preload.cjsnode --check electron\ipc\duplicateCheckIpc.cjs、查重服务模块加载、npm run build;全量 git diff --check 仍有既有 client/doc/标书查重.md:54 trailing whitespace,本轮相关文件仅 LF/CRLF 提示。
  • 已修复标书查重正文分句的表格拼接问题:正文比对前先提取结构化文本块,HTML 表格按单元格解析,Markdown 管道表按行列解析;移除 isLikelyMergedTableSentence() 特例过滤;正文清洗不再删除编号前缀,保留原始标点。真实缓存验证 无偏离 + 编号 + 下一单元格正文 异常句为 0,模拟重复分析中表格拼接异常为 0。验证通过:node --check electron\services\duplicateCheckService.cjsnode --check electron\preload.cjsnode --check electron\ipc\duplicateCheckIpc.cjs、查重服务模块加载、真实缓存/Markdown 表格 smoke test、npm run buildgit diff --check -- client/electron/services/duplicateCheckService.cjs
  • 已修复标书查重正文比对忽略句首序号:normalizeContentSentence() 现在仅剥离句首结构性序号,展示句仍保留原文;招标引用排除和投标文件重复聚合都会把 3.特别要求:...特别要求:... 视为同句。真实缓存验证目标句命中招标白名单 5 次且不再进入重复句;GB/T 29768-2013交货期:30天质保期:3年第2包 均不被误删。验证通过:CJS 语法检查、preload/IPC 检查、查重服务模块加载、npm run buildgit diff --check -- client/electron/services/duplicateCheckService.cjs
  • 已完成标书查重正文序号归一化二次修复:正文分句改为先生成 normalized,再用 normalized 判断是否有信息量,避免短标题因句首序号变长而进入重复池;句首结构序号补齐 Markdown 转义 1\.、全角数字、括号/圈号后额外分隔符和章节号。真实缓存模拟验证:截图短标题重复项为 0,normalized 句首序号残留为 0,“特别要求”招标引用仍未进入重复结果。验证通过:node --check electron\services\duplicateCheckService.cjsnode --check electron\preload.cjsnode --check electron\ipc\duplicateCheckIpc.cjs、私有函数用例、真实缓存模拟、git diff --check -- client/electron/services/duplicateCheckService.cjsnpm run build;构建仍只有既有 chunk 体积警告。