5caca86ad1
新增纯 TS 合并模块 merge-history-items:以 taskId→行列表 二级索引替代 原 mergeProgress 的 [...map.values()].find() 全表扫描(O(n×m)→O(n+m))。 命中语义与原实现一致(taskId 相同且 resultId 相同或 incoming 无 resultId),命中后删除旧 key 写入新 key,shopName 变化不再留下幽灵 重复条目,同批内后到条目可命中先到新增。BrandShopDataCrawlTab 的 mergeProgress 改用该模块。9 个测试覆盖默认、批量、幂等、空、单元素、 maxItems 限流、非法输入、keyOf 故障零变更与幽灵条目场景。