from pathlib import Path import hashlib,json folder=Path('C:/kefu/deploy/review-visibility-20260916') for root in [Path('C:/wechat_rpa'),Path('C:/kefu/wechat_rpa')]: p=root/'assets/ui/console-app.js';s=p.read_text(encoding='utf-8') needle='function taskHandoffLabel(task)' assert s.count(needle)==1 s=s.replace(needle,'''function taskCancelButton(task, label="取消任务"){ return task.deliveryUncertain ? "" : ``; } '''+needle) replacements={ '':'${taskCancelButton(task,"终止本任务")}', '':'${taskCancelButton(task)}', ' "cancel-task": () => callBridge("cancelTask", key),':''' "cancel-task": () => { if (STATE.task && STATE.task.key === key && STATE.task.deliveryUncertain) return toast("请先在企业微信核对发送结果,再选择核对后转人工。"); callBridge("cancelTask", key); },''' } for old,new in replacements.items(): assert s.count(old)==1,old s=s.replace(old,new) p.write_text(s,encoding='utf-8',newline='\n') test=folder/'frontend-test.mjs';s=test.read_text(encoding='utf-8') needle=" await check('可重试生成失败任务提供重试并传递正确key',async()=>{" assert s.count(needle)==1 s=s.replace(needle,''' await check('未知回执在自动页与队列页只能核对后转人工',async()=>{ for(const view of ['auto','queue']){ const p=await page(view,{task:{...task,awaitingReview:false,needsHuman:true,canRetry:true,deliveryUncertain:true,reviewReason:'发送结果待人工核对'}}); assert.equal(await p.locator('[data-action="approve-task"],[data-action="retry-task"],[data-action="cancel-task"]').count(),0); assert.equal(await p.locator('[data-action="handoff-task"]').count(),1); assert.match(await p.locator('[data-action="handoff-task"]').innerText(),/核对后转人工/);await p.close(); } }); '''+needle) test.write_text(s,encoding='utf-8') screens=folder/'frontend-final-screenshots.mjs';s=screens.read_text(encoding='utf-8');s=s.replace('[data-action="approve-task"],[data-action="retry-task"]','[data-action="approve-task"],[data-action="retry-task"],[data-action="cancel-task"]');screens.write_text(s,encoding='utf-8') manifest=folder/'frontend-files.json';results=json.loads(manifest.read_text(encoding='utf-8')) for result in results: for f in result['files']: f['sha256']=hashlib.sha256((Path(result['root'])/f['path']).read_bytes()).hexdigest() manifest.write_text(json.dumps(results,ensure_ascii=False,indent=2),encoding='utf-8') print('Hidden uncertain-delivery cancellation in both views and updated manifest.')