@customize-agent/server 4.0.116 → 4.0.118

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 (72) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +65 -61
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/required-server-files.json +3 -1
  5. package/.next/server/chunks/1928.js +1 -1
  6. package/.next/server/chunks/1936.js +1 -1
  7. package/.next/server/chunks/6041.js +69 -69
  8. package/.next/server/chunks/8204.js +1 -1
  9. package/.next/server/middleware-build-manifest.js +1 -1
  10. package/.next/server/pages/404.html +1 -1
  11. package/.next/server/pages/500.html +1 -1
  12. package/.next/server/pages/asset-library.html +1 -1
  13. package/.next/server/pages/document-roles.html +1 -1
  14. package/.next/server/pages/documents.html +1 -1
  15. package/.next/server/pages/guide.html +1 -1
  16. package/.next/server/pages/index.html +1 -1
  17. package/.next/server/pages/knowledge/file-detail.html +1 -1
  18. package/.next/server/pages/knowledge/files.html +1 -1
  19. package/.next/server/pages/knowledge/manage.html +1 -1
  20. package/.next/server/pages/knowledge.html +1 -1
  21. package/.next/server/pages/models.html +1 -1
  22. package/.next/server/pages/overview.html +1 -1
  23. package/.next/server/pages/prompt.html +1 -1
  24. package/.next/server/pages/settings.html +1 -1
  25. package/.next/server/pages/system/logs.html +1 -1
  26. package/.next/server/pages-manifest.json +24 -24
  27. package/.next/static/56P8i_y0wG1AJbu_xC4nI/_buildManifest.js +1 -0
  28. package/.next/static/chunks/187-358527d7061417bf.js +1 -0
  29. package/.next/static/chunks/209-5117020514c2bd0c.js +4 -0
  30. package/.next/static/chunks/230-8184e70eae35f2bb.js +1 -0
  31. package/.next/static/chunks/{945-9e9382e35f024c04.js → 238-16333381c574f65b.js} +1 -1
  32. package/.next/static/chunks/{289-39ef5df8097382b4.js → 289-35ac595388bbd018.js} +14 -14
  33. package/.next/static/chunks/455-e1b41ac4946d2b6f.js +6 -0
  34. package/.next/static/chunks/506-93f730bc149d0dce.js +1 -0
  35. package/.next/static/chunks/576-6699fed6c88502fe.js +1 -0
  36. package/.next/static/chunks/580-618d7d7e7b74daf6.js +19 -0
  37. package/.next/static/chunks/644-3299885a9dc1ef78.js +11 -0
  38. package/.next/static/chunks/649-06b72042a4de8074.js +4 -0
  39. package/.next/static/chunks/665-88e20299084b9e73.js +1 -0
  40. package/.next/static/chunks/7-20bcc985742a9ae1.js +10 -0
  41. package/.next/static/chunks/788-3afeb069ed706ac0.js +1 -0
  42. package/.next/static/chunks/pages/_app-34260fc817f32ddc.js +185 -0
  43. package/.next/static/chunks/pages/{asset-library-dc19b6ccd193de27.js → asset-library-bedc7113dfc7ad6a.js} +1 -1
  44. package/.next/static/chunks/pages/{document-roles-33e93d6bee1b0381.js → document-roles-3d8c5440cc3f15fd.js} +1 -1
  45. package/.next/static/chunks/pages/documents-fcf2ad9543097b4d.js +1 -0
  46. package/.next/static/chunks/pages/{guide-40908b2721e92d01.js → guide-9d7d88a25d972c06.js} +1 -1
  47. package/.next/static/chunks/pages/knowledge/{file-detail-58d6d3365af15b4c.js → file-detail-b9b728f62832b91c.js} +1 -1
  48. package/.next/static/chunks/pages/knowledge/{files-3bf25ca6491cebe3.js → files-cf9a04089447fcd8.js} +1 -1
  49. package/.next/static/chunks/pages/knowledge/{manage-c98ed288e65c3e84.js → manage-67b5c7fe257f37c5.js} +1 -1
  50. package/.next/static/chunks/pages/{models-4fb81218cff53e21.js → models-89f9769a32da8e5f.js} +1 -1
  51. package/.next/static/chunks/pages/{prompt-031bc6ab32830ae5.js → prompt-09514790e22505cb.js} +1 -1
  52. package/.next/static/chunks/pages/system/{logs-b073e55810452aca.js → logs-b274976ce158117c.js} +1 -1
  53. package/.next/static/css/58ab2477d4a05124.css +1 -0
  54. package/next.config.ts +0 -1
  55. package/package.json +2 -2
  56. package/scripts/verify-next-static.js +9 -5
  57. package/.next/static/SYuSSOYmrJbaCRIbjCuR_/_buildManifest.js +0 -1
  58. package/.next/static/chunks/155-2f71ef31b9336adb.js +0 -1
  59. package/.next/static/chunks/337-b06909f6d29f6d1f.js +0 -1
  60. package/.next/static/chunks/403-0469cb096084301f.js +0 -1
  61. package/.next/static/chunks/405-74ecbacd0b5a3128.js +0 -8
  62. package/.next/static/chunks/433-233659be69169c19.js +0 -1
  63. package/.next/static/chunks/455-97ad88d6604f54b7.js +0 -6
  64. package/.next/static/chunks/478-ac4777b05b3c42e8.js +0 -1
  65. package/.next/static/chunks/497-58fdc9f4b4437f94.js +0 -4
  66. package/.next/static/chunks/576-fdadae734b47b56b.js +0 -1
  67. package/.next/static/chunks/713-efe6b531f7a30a5f.js +0 -1
  68. package/.next/static/chunks/985-4b4a3ed36ada16eb.js +0 -4
  69. package/.next/static/chunks/pages/_app-35958e1c02c7aede.js +0 -212
  70. package/.next/static/chunks/pages/documents-31b36cb18b965b3b.js +0 -1
  71. package/.next/static/css/31dcc01973fbcb8a.css +0 -1
  72. /package/.next/static/{SYuSSOYmrJbaCRIbjCuR_ → 56P8i_y0wG1AJbu_xC4nI}/_ssgManifest.js +0 -0
@@ -7,16 +7,16 @@
7
7
  说明:以下内容仅用于事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
8
8
  建议关注事实:${a.factFields.map(a=>a.name).join("、")}
9
9
  章节内容建议:${a.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ")}`:""}`).join(";")||"以当前模板章节为准"}
10
- 质量提醒:${a.gateRules.map(a=>a.name).join("、")}`}},23760:(a,b,c)=>{c.d(b,{AC:()=>m,Ai:()=>o,BV:()=>r,Ff:()=>k,M$:()=>G,N1:()=>C,Nz:()=>i,Ty:()=>s,bM:()=>D,f8:()=>v,gN:()=>t,iC:()=>q,k0:()=>w,kQ:()=>F,mR:()=>E,qK:()=>B,yw:()=>A,z0:()=>j});var d=c(8753),e=c(74329),f=c(78217),g=c(91977),h=c(52511);function i(a){return e.hc.test(a.message)}function j(a){let b="string"==typeof a?a:a.message;if("error"===("string"==typeof a?void 0:a.level))return"blocking";for(let a of e.gr)if(a.pattern.test(b))return a.severity;return"minor"}function k(a){let b={blocking:0,important:0,minor:0};for(let c of a)b[j(c)]+=1;return b}function l(a,b){let c=a.replace(/[\][()`*_>#|{},。、“”‘’:;!?,.!?:;-]+/gu," ").replace(e.ug," ").trim();if(c.length<120)return;let d=c.match(/[A-Za-z][A-Za-z-]{2,}|[\p{Script=Han}]{2,}/gu)||[];if(d.length<30)return;let f=1,g=new Map;for(let a=0;a<d.length;a+=1){let c=d[a].toLowerCase();if(g.set(c,(g.get(c)||0)+1),a>0&&c===d[a-1].toLowerCase()?f+=1:f=1,f>=12)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:"请重新生成该小节,禁止保留连续重复的英文单词或无意义片段。"}}let h=[...g.entries()].sort((a,b)=>b[1]-a[1])[0];if(h&&h[1]>=25&&h[1]/d.length>=.42)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:`检测到“${h[0]}”异常高频重复,请重新生成该小节。`}}function m(a,b=[]){let c=[],d=l(a,"全文");for(let a of(d&&c.push(d),b)){let b=l(a.content,`章节“${a.title}”`);for(let d of(b&&c.push(b),a.sections||[])){let b=d.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"));if(!e)continue;let f=l(e[1],`小节“${d}”`);f&&c.push(f)}}return c}function n(a){return!!/提示词要求|疑似提示词指令标题|配置要求缺少必要内容|适用性自相矛盾|正式表格不足|目录与正文|不得出现/u.test(a.message)||!(!i(a)||/章节审查|最终质量审查|规划小节正文过短|正文篇幅明显低于目标|正文缺少规划小节|缺少规划小节|小节内容补写未完成|正文存在空泛占位表达|结构化事实读取不足|正文可能未显式覆盖|仅包含文件类型和占位符|不在本次招标范围内/u.test(a.message)||/空小节|小节只有标题|只有标题或表格无正文/u.test(a.message)&&!/全文|整篇|生成未完成|章节生成失败/u.test(a.message))}function o(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&n(a))},{key:"basic_facts",label:"基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"structured_precision",label:"结构化精确参数已使用",passed:b.preciseFacts.length<e.mu||a.every(a=>"error"!==a.level||!e.Ab.test(a.message))},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))},{key:"no_project_contamination",label:"无项目污染和事实一致性阻断",passed:!a.some(a=>"error"===a.level&&e.Uv.test(a.message)&&n(a))}],f=a.filter(a=>"error"===a.level&&n(a));return{passed:0===f.length,blockingIssues:f,checklist:d}}function p(a){let b=[];for(let c of a.split(e.AQ))e.w7.test(c)&&e.N3.test(c)&&b.push(c);return b}function q(a){let b=[...a.matchAll(e.DB)],c=[];for(let d=1;d<b.length;d+=1){let f=b[d].index||0,g=b[d+1]?.index??a.length,h=a.slice(f,g);e.Ks.test(h)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现基础信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(0===b.length)return c;let d=b[0].index||0,f=b[1]?.index??a.length,g=a.slice(d,f),h=g.search(e.jM);if(h<=0)return c;let i=g.slice(0,h).replace(e.Dc,""),j=[];for(let a of e.Y8)RegExp(`${a}\\s*[::]`,"u").test(i)&&j.push(a);return j.length>=3&&c.push({level:"warning",message:`基础信息表前重复叙述字段:${j.join("、")}`,suggestion:"基础信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述名称、编号、范围、周期、质量等字段。"}),c}function r(a){let b=[],c=[];for(let b of e.ZH)a.includes(b)&&c.push(b);c.length>0&&b.push({level:"warning",message:`存在模板化前缀或套话:${c.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入对象、动作、措施、检查和闭环。"});let d=a.match(/OCR|知识库|提示词|绑定片段|兜底|后台|文件路径|PDF|DWG|Excel|识别错误/giu);return d?.length&&b.push({level:"error",message:`正文包含后台或资料处理话术:${[...new Set(d)].join("、")}`,suggestion:"请改为正式文档语言,例如“资料文字不清”“资料口径不一致”“项目资料”,不得暴露后台处理过程。"}),b}function s(a){let b=[];for(let c of a){let a=(c.sections||[]).filter(Boolean),d=a.filter((b,c)=>a.indexOf(b)!==c);d.length>0&&b.push({level:"warning",message:`${c.title} 存在重复小节:${[...new Set(d)].join("、")}`,suggestion:"请保留用户需求、模板或显式大纲中真实需要的小节,删除重复项。"});let e=new Map;for(let b of a){let a=/劳动力|人员|工种/u.test(b)?"劳动力计划":/机械|设备|机具/u.test(b)?"机械设备计划":/材料|物资/u.test(b)?"材料物资计划":/冬季|雨季|高温|台风|大风/u.test(b)?"特殊气候措施":"";a&&e.set(a,[...e.get(a)||[],b])}for(let[a,d]of e)d.length>1&&b.push({level:"warning",message:`${c.title} 存在重复主题小节:${a}(${d.join("、")})`,suggestion:"请合并同类小节,只保留一个主表或主方案,其他位置采用引用或执行说明。"})}return b}function t(a){let b=e.HX.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=0,d=0;for(let a of b[1].split(e.A5))e.ZT.test(a)&&e.EB.test(a)&&(c+=1,e.sr.test(a)&&(d+=1));return c>0&&0===d?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function u(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").replace(/^\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/[()]/gu,a=>"("===a?"(":")").replace(/[\s::.。;;,,、]+$/gu,"").replace(/的(?=保障体系|管理体系|控制体系|措施|方案|计划|要求)/gu,"").replace(/[\s()()::.。;;,,、-]/gu,"").trim()}function v(a){let b=function(a){let b=e.HX.exec(a);return b?b[1].split(e.A5).map(a=>/^\s*\d+\.\d+\s+(.+)$/u.exec(a.trim())).filter(a=>!!a).map(a=>u(a[1]||"")).filter(Boolean):[]}(a),c=[...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>u(a[1]||"")).filter(Boolean);if(0===b.length||0===c.length)return[];let d=new Set(c),f=new Set(b),g=b.filter(a=>!d.has(a)),h=c.filter(a=>!f.has(a)),i=[];return g.length>0&&i.push({level:"warning",message:`目录小节未在正文中找到:${[...new Set(g)].join("、")}`,suggestion:"请以用户 outline 抽取出的章节为准,修正文目录与正文二级小节编号及标题。"}),h.length>0&&i.push({level:"warning",message:`正文小节未进入目录:${[...new Set(h)].join("、")}`,suggestion:"请重新生成目录,确保只收录正文二级小节,不收录三级小节。"}),i}function w(a){let b=[],c=a.split(e.A5).map(a=>a.trim()).filter(a=>a&&!/^#{1,6}\s+/u.test(a)&&!/^\s*\|/u.test(a)&&!/^<div\b/iu.test(a)),d=c.find(a=>u(a).length<=1);d&&b.push({level:"warning",message:`正文存在孤立字或残缺段落:${d}`,suggestion:"请删除残缺行或重新生成所在小节。"});let f=c.find(a=>/[,、;:和与在为对将]$/u.test(a)||/(通过|包括|如下|主要包括)$/u.test(a));f&&b.push({level:"warning",message:`正文存在疑似截断句:${f}`,suggestion:"请补完整该段落,避免以连接词、逗号或冒号结尾。"});let g=c.find(a=>a.length>380);return g&&b.push({level:"warning",message:`正文存在过长段落:${g}`,suggestion:"请拆分为多段或表格,改善导出版式和可读性。"}),b}function x(a){return a.split(e.A5).filter(a=>!/^#{1,6}\s+/u.test(a.trim())).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*:?-{3,}:?/u.test(a)).filter(a=>!/^<\/?div\b/iu.test(a.trim())).join("\n").replace(/[|*_`<>-]/gu,"").replace(e.ug,"").length}function y(a){let b=[...a.matchAll(/^(#{3,4})\s+(.+)$/gmu)];return b.map((c,d)=>{let e=c[1].length,f=(c.index||0)+c[0].length,g=b.slice(d+1).find(a=>a[1].length<=e),h=g?.index??a.length,i=(c[2]||"").trim();return{rawTitle:i,title:u(i),level:e,body:a.slice(f,h)}}).filter(a=>a.title&&(3===a.level||4===a.level))}function z(a,b,c,d,f){let g=x(d),h=e.w7.test(d)&&e.N3.test(d),i=x(d.split("\n").filter(a=>!e.w7.test(a)&&!e.N3.test(a)).join("\n").replace(/^#{1,6}\s+.+$/gmu,""));if(h&&i<20)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"table_only",planned:f,message:`${a} 小节只有标题或表格无正文:${b}`};if(!(g>=80)||!(i>=20)){if(0===g)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"empty",planned:f,message:`${a} 空小节:${b}`};if(g<180)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"too_short",planned:f,message:`${a} ${f?"规划小节":"正文小节"}正文过短:${b}`}}}function A(a,b){let c=[],d=new Set;for(let e of b){let b=e.content?.trim()?e.content:a;for(let a of e.sections||[]){let f=u(a),g=function(a,b){return y(a).find(a=>(function(a,b){let c=u(a),d=u(b);return!!(c&&d&&c===d)})(a.rawTitle,b))}(b,a),h=`${e.title}|${f}|planned`;if(!g){c.push({chapterTitle:e.title,sectionTitle:a,level:3,bodyLength:0,reason:"missing_planned_section",planned:!0,message:`${e.title} 缺少规划小节:${a}`}),d.add(h);continue}let i=z(e.title,f||a,g.level,g.body,!0);i&&c.push(i),d.add(h)}for(let a of y(b)){let b=`${e.title}|${a.title}|actual`,f=`${e.title}|${a.title}|planned`;if(d.has(b)||d.has(f))continue;let g=z(e.title,a.title,a.level,a.body,!1);g&&("empty"===g.reason||"table_only"===g.reason)&&c.push(g),d.add(b)}}return c}function B(a,b){return A(a,b).map(a=>({level:"empty"===a.reason?"error":"warning",message:a.message,suggestion:"missing_planned_section"===a.reason?"建议补写该二级小节;如正文已在相邻小节覆盖,可作为质量优化项处理。":"table_only"===a.reason?"请在表格前后补充来源、适用范围、结论和执行要求。":"建议补充与该小节相关的材料事实、适用边界和必要说明。"}))}function C(a,b){let c=[],d=a.replace(e.ug,""),f=function(a){let b=new Set;for(let c of a.preciseFacts){let a=`${c.processingType||""} ${c.roleId} ${c.sourceFile}`;if(!e.FM.test(a)&&"precise_fact"!==c.roleId)continue;let d=`${c.key} ${c.fieldName||""} ${c.value}`;for(let a of d.matchAll(e.No)){let c=a[0].trim();/万元|元|报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(`${c} ${d}`)||/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂|页码|目录/u.test(d)||/^\d+$/.test(c)&&10>Number(c)||b.add(c)}}return[...b]}(b),g=function(a,b){let c=0;for(let d of a)b.includes(d.replace(e.ug,""))&&(c+=1);return c}(f,d);return f.length>=e.mu&&g/f.length<e.tg&&c.push({level:"warning",message:`可靠精确参数使用不足:${g}/${f.length}`,suggestion:"请将资料中可靠的规格、参数、数量、时间、比例和标准编号写入对应章节;商务金额、单价、税率、预留金不得写入正文。"}),b.bills.length>0&&!e.pP.test(a)&&c.push({level:"error",message:"正文未体现结构化数据资料",suggestion:"请从表格、列表或明细中提取对象、单位、数量、规格和关键参数补入对应章节。"}),b.drawings.length>0&&!e._U.test(a)&&c.push({level:"error",message:"正文未体现设计/方案/说明类资料",suggestion:"请从设计、方案或说明资料中提取对象、流程、节点、做法、配置、规则和标准要求。"}),c}function D(a){let b=[];for(let c of e.IA)c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见资料/按文件”。"});return b}function E(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,f=[];for(let a of(0,d.V)().autoSpecGates)(function(a,b){for(let c of b)try{if(RegExp(c,"iu").test(a))return!0}catch{if(a.includes(c))return!0}return!1})(c,a.templateMatchers)&&f.push(a);if(0===f.length)return[];let g=[],h=p(a).length,i=0;for(let b of f){for(let c of(i=Math.max(i,b.minTables||0),b.requiredTexts))a.includes(c)||g.push({level:"warning",message:`配置要求缺少必要内容:${c}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let c of b.forbiddenTexts)a.includes(c)&&g.push({level:"error",message:`配置要求不得出现:${c}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"})}return e.bu.test(a)&&g.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"}),i&&h<i&&g.push({level:"error",message:`配置要求正式表格不足:${h}/${i}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),g}function F(a,b,c,d,h,i,j){if(!a)return b;let k=[...b],l=function(a){let b=[...a.project,...a.schedule,...a.quality,...a.safety,...a.resources];for(let c of Object.values(a.schemaFacts))b.push(...c);return b}(c),m=function(a,b){let c=new Set;for(let a of b)c.add(a.key),a.fieldName&&c.add(a.fieldName);for(let b of a.tables){for(let a of b.headers)c.add(a);for(let a of b.rows)for(let b of a)c.add(b)}return c}(c,l),n=new Set(d.map(a=>a.title));for(let b of a.factFields){if(!b.required)continue;let a=c.schemaFacts[b.id]||[],e=!1,f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId));for(let a of d){if(e&&f)break;for(let c of a.evidence)!e&&!a.missingFacts.includes(b.name)&&(0,g.I2)(c,b)&&(e=!0),!f&&(0,g.I2)(c,b)&&(f=!0)}0!==a.length||m.has(b.name)||e||k.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||k.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}for(let b of a.chapterRules){let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&k.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let o=p(h),q=function(a){let b=[];for(let c of a.matchAll(e.gW))b.push({alt:c[1]||"",url:c[2]||"",index:c.index??0});return b}(h),r=(0,f.Cv)(h);for(let b of a.gateRules){let a=b.evaluator?b.evaluator:e.cA[b.type]?.(b)??{subject:"document",operator:"contains",value:b.value||b.target},f=a.target||b.target||"",g=a.value||b.value||f,p=d.find(a=>a.title===f),s=function(a){for(let c of e.Lp){let d=c(a);if(d){var b;return{level:a.rule.level,message:(b=a.rule,`${b.name}:${d}`)}}}}({rule:b,evaluator:a,target:f,value:g,min:a.min||Number(b.value)||1,markdown:h,textScope:"chapter"===a.subject&&p?p.content:h,regex:g?function(a){try{return RegExp(a,"iu")}catch{return}}(g):void 0,chapter:p,factNames:m,chapterTitles:n,tableBlocks:o,imageRefs:q,estimatedPages:r,allFacts:l,factsModel:c,fileBindings:i,promptBindings:j});s&&k.push(s)}return k}function G(a,b){let c=function(a){let b="";for(let c of(0,h.dU)(a))c.content&&(b+=`${c.content}
10
+ 质量提醒:${a.gateRules.map(a=>a.name).join("、")}`}},23760:(a,b,c)=>{c.d(b,{AC:()=>n,Ai:()=>p,BV:()=>s,Ff:()=>l,K1:()=>y,M$:()=>J,N1:()=>F,Nz:()=>j,Ty:()=>t,bM:()=>G,f8:()=>w,gN:()=>u,iC:()=>r,k0:()=>z,kQ:()=>I,mR:()=>H,qK:()=>E,yw:()=>D,z0:()=>k});var d=c(8753),e=c(74329),f=c(78217),g=c(70208),h=c(91977),i=c(52511);function j(a){return e.hc.test(a.message)}function k(a){let b="string"==typeof a?a:a.message;if("error"===("string"==typeof a?void 0:a.level))return"blocking";for(let a of e.gr)if(a.pattern.test(b))return a.severity;return"minor"}function l(a){let b={blocking:0,important:0,minor:0};for(let c of a)b[k(c)]+=1;return b}function m(a,b){let c=a.replace(/[\][()`*_>#|{},。、“”‘’:;!?,.!?:;-]+/gu," ").replace(e.ug," ").trim();if(c.length<120)return;let d=c.match(/[A-Za-z][A-Za-z-]{2,}|[\p{Script=Han}]{2,}/gu)||[];if(d.length<30)return;let f=1,g=new Map;for(let a=0;a<d.length;a+=1){let c=d[a].toLowerCase();if(g.set(c,(g.get(c)||0)+1),a>0&&c===d[a-1].toLowerCase()?f+=1:f=1,f>=12)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:"请重新生成该小节,禁止保留连续重复的英文单词或无意义片段。"}}let h=[...g.entries()].sort((a,b)=>b[1]-a[1])[0];if(h&&h[1]>=25&&h[1]/d.length>=.42)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:`检测到“${h[0]}”异常高频重复,请重新生成该小节。`}}function n(a,b=[]){let c=[],d=m(a,"全文");for(let a of(d&&c.push(d),b)){let b=m(a.content,`章节“${a.title}”`);for(let d of(b&&c.push(b),a.sections||[])){let b=d.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"));if(!e)continue;let f=m(e[1],`小节“${d}”`);f&&c.push(f)}}return c}function o(a){return!!/提示词要求|疑似提示词指令标题|配置要求缺少必要内容|适用性自相矛盾|正式表格不足|目录与正文|不得出现/u.test(a.message)||!(!j(a)||/章节审查|最终质量审查|规划小节正文过短|正文篇幅明显低于目标|正文缺少规划小节|缺少规划小节|小节内容补写未完成|正文存在空泛占位表达|结构化事实读取不足|正文可能未显式覆盖|仅包含文件类型和占位符|不在本次招标范围内/u.test(a.message)||/空小节|小节只有标题|只有标题或表格无正文/u.test(a.message)&&!/全文|整篇|生成未完成|章节生成失败/u.test(a.message))}function p(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&o(a))},{key:"basic_facts",label:"基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"structured_precision",label:"结构化精确参数已使用",passed:b.preciseFacts.length<e.mu||a.every(a=>"error"!==a.level||!e.Ab.test(a.message))},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))},{key:"no_project_contamination",label:"无项目污染和事实一致性阻断",passed:!a.some(a=>"error"===a.level&&e.Uv.test(a.message)&&o(a))}],f=a.filter(a=>"error"===a.level&&o(a));return{passed:0===f.length,blockingIssues:f,checklist:d}}function q(a){let b=[];for(let c of a.split(e.AQ))e.w7.test(c)&&e.N3.test(c)&&b.push(c);return b}function r(a){let b=[...a.matchAll(e.DB)],c=[];for(let d=1;d<b.length;d+=1){let f=b[d].index||0,g=b[d+1]?.index??a.length,h=a.slice(f,g);e.Ks.test(h)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现基础信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(0===b.length)return c;let d=b[0].index||0,f=b[1]?.index??a.length,g=a.slice(d,f),h=g.search(e.jM);if(h<=0)return c;let i=g.slice(0,h).replace(e.Dc,""),j=[];for(let a of e.Y8)RegExp(`${a}\\s*[::]`,"u").test(i)&&j.push(a);return j.length>=3&&c.push({level:"warning",message:`基础信息表前重复叙述字段:${j.join("、")}`,suggestion:"基础信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述名称、编号、范围、周期、质量等字段。"}),c}function s(a){let b=[],c=[];for(let b of e.ZH)a.includes(b)&&c.push(b);c.length>0&&b.push({level:"warning",message:`存在模板化前缀或套话:${c.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入对象、动作、措施、检查和闭环。"});let d=a.match(/OCR|知识库|提示词|绑定片段|兜底|后台|文件路径|PDF|DWG|Excel|识别错误/giu);return d?.length&&b.push({level:"error",message:`正文包含后台或资料处理话术:${[...new Set(d)].join("、")}`,suggestion:"请改为正式文档语言,例如“资料文字不清”“资料口径不一致”“项目资料”,不得暴露后台处理过程。"}),b}function t(a){let b=[];for(let c of a){let a=(c.sections||[]).filter(Boolean),d=a.filter((b,c)=>a.indexOf(b)!==c);d.length>0&&b.push({level:"warning",message:`${c.title} 存在重复小节:${[...new Set(d)].join("、")}`,suggestion:"请保留用户需求、模板或显式大纲中真实需要的小节,删除重复项。"});let e=new Map;for(let b of a){let a=/劳动力|人员|工种/u.test(b)?"劳动力计划":/机械|设备|机具/u.test(b)?"机械设备计划":/材料|物资/u.test(b)?"材料物资计划":/冬季|雨季|高温|台风|大风/u.test(b)?"特殊气候措施":"";a&&e.set(a,[...e.get(a)||[],b])}for(let[a,d]of e)d.length>1&&b.push({level:"warning",message:`${c.title} 存在重复主题小节:${a}(${d.join("、")})`,suggestion:"请合并同类小节,只保留一个主表或主方案,其他位置采用引用或执行说明。"})}return b}function u(a){let b=e.HX.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=0,d=0;for(let a of b[1].split(e.A5))e.ZT.test(a)&&e.EB.test(a)&&(c+=1,e.sr.test(a)&&(d+=1));return c>0&&0===d?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function v(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").replace(/^\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/[()]/gu,a=>"("===a?"(":")").replace(/[\s::.。;;,,、]+$/gu,"").replace(/的(?=保障体系|管理体系|控制体系|措施|方案|计划|要求)/gu,"").replace(/[\s()()::.。;;,,、-]/gu,"").trim()}function w(a){let b=function(a){let b=e.HX.exec(a);return b?b[1].split(e.A5).map(a=>/^\s*\d+\.\d+\s+(.+)$/u.exec(a.trim())).filter(a=>!!a).map(a=>v(a[1]||"")).filter(Boolean):[]}(a),c=[...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>v(a[1]||"")).filter(Boolean);if(0===b.length||0===c.length)return[];let d=new Set(c),f=new Set(b),g=b.filter(a=>!d.has(a)),h=c.filter(a=>!f.has(a)),i=[];return g.length>0&&i.push({level:"error",message:`目录与正文不一致,目录小节未在正文中找到:${[...new Set(g)].join("、")}`,suggestion:"请以最终清洗后的正文二级标题为准重新生成目录。"}),h.length>0&&i.push({level:"error",message:`目录与正文不一致,正文小节未进入目录:${[...new Set(h)].join("、")}`,suggestion:"请重新生成目录,确保只收录正文二级小节,不收录三级小节。"}),i}function x(a){let b=a.replace(/^#{1,6}\s+/u,"").replace(/^\s*\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").trim(),c=(0,g.GQ)(b),d=/^(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用).+|(?:如|若|如果)(?:涉及|不涉及|适用|不适用).+|.*(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成).*|.*(?:按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项))\s*$/u;return d.test(b)||d.test(c)}function y(a){let b=[...a.matchAll(/^#{2,6}\s+(.+)$/gmu)].map(a=>(0,g.GQ)(a[1]||"")).filter(x);return b.length>0?[{level:"error",message:`正文存在疑似提示词指令标题:${[...new Set(b)].slice(0,8).join("、")}`,suggestion:"请删除或改写为正式施工组织设计小节标题,目录也不得收录该类标题。"}]:[]}function z(a){let b=[],c=a.split(e.A5).map(a=>a.trim()).filter(a=>a&&!/^#{1,6}\s+/u.test(a)&&!/^\s*\|/u.test(a)&&!/^<div\b/iu.test(a)),d=c.find(a=>v(a).length<=1);d&&b.push({level:"warning",message:`正文存在孤立字或残缺段落:${d}`,suggestion:"请删除残缺行或重新生成所在小节。"});let f=c.find(a=>/[,、;:和与在为对将]$/u.test(a)||/(通过|包括|如下|主要包括)$/u.test(a));f&&b.push({level:"warning",message:`正文存在疑似截断句:${f}`,suggestion:"请补完整该段落,避免以连接词、逗号或冒号结尾。"});let g=c.find(a=>a.length>380);return g&&b.push({level:"warning",message:`正文存在过长段落:${g}`,suggestion:"请拆分为多段或表格,改善导出版式和可读性。"}),b}function A(a){return a.split(e.A5).filter(a=>!/^#{1,6}\s+/u.test(a.trim())).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*:?-{3,}:?/u.test(a)).filter(a=>!/^<\/?div\b/iu.test(a.trim())).join("\n").replace(/[|*_`<>-]/gu,"").replace(e.ug,"").length}function B(a){let b=[...a.matchAll(/^(#{3,4})\s+(.+)$/gmu)];return b.map((c,d)=>{let e=c[1].length,f=(c.index||0)+c[0].length,g=b.slice(d+1).find(a=>a[1].length<=e),h=g?.index??a.length,i=(c[2]||"").trim();return{rawTitle:i,title:v(i),level:e,body:a.slice(f,h)}}).filter(a=>a.title&&(3===a.level||4===a.level))}function C(a,b,c,d,f){let g=A(d),h=e.w7.test(d)&&e.N3.test(d),i=A(d.split("\n").filter(a=>!e.w7.test(a)&&!e.N3.test(a)).join("\n").replace(/^#{1,6}\s+.+$/gmu,""));if(h&&i<20)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"table_only",planned:f,message:`${a} 小节只有标题或表格无正文:${b}`};if(!(g>=80)||!(i>=20)){if(0===g)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"empty",planned:f,message:`${a} 空小节:${b}`};if(g<180)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"too_short",planned:f,message:`${a} ${f?"规划小节":"正文小节"}正文过短:${b}`}}}function D(a,b){let c=[],d=new Set;for(let e of b){let b=e.content?.trim()?e.content:a;for(let a of e.sections||[]){let f=v(a),g=function(a,b){return B(a).find(a=>(function(a,b){let c=v(a),d=v(b);return!!(c&&d&&c===d)})(a.rawTitle,b))}(b,a),h=`${e.title}|${f}|planned`;if(!g){c.push({chapterTitle:e.title,sectionTitle:a,level:3,bodyLength:0,reason:"missing_planned_section",planned:!0,message:`${e.title} 缺少规划小节:${a}`}),d.add(h);continue}let i=C(e.title,f||a,g.level,g.body,!0);i&&c.push(i),d.add(h)}for(let a of B(b)){let b=`${e.title}|${a.title}|actual`,f=`${e.title}|${a.title}|planned`;if(d.has(b)||d.has(f))continue;let g=C(e.title,a.title,a.level,a.body,!1);g&&("empty"===g.reason||"table_only"===g.reason)&&c.push(g),d.add(b)}}return c}function E(a,b){return D(a,b).map(a=>({level:"empty"===a.reason?"error":"warning",message:a.message,suggestion:"missing_planned_section"===a.reason?"建议补写该二级小节;如正文已在相邻小节覆盖,可作为质量优化项处理。":"table_only"===a.reason?"请在表格前后补充来源、适用范围、结论和执行要求。":"建议补充与该小节相关的材料事实、适用边界和必要说明。"}))}function F(a,b){let c=[],d=a.replace(e.ug,""),f=function(a){let b=new Set;for(let c of a.preciseFacts){let a=`${c.processingType||""} ${c.roleId} ${c.sourceFile}`;if(!e.FM.test(a)&&"precise_fact"!==c.roleId)continue;let d=`${c.key} ${c.fieldName||""} ${c.value}`;for(let a of d.matchAll(e.No)){let c=a[0].trim();/万元|元|报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(`${c} ${d}`)||/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂|页码|目录/u.test(d)||/^\d+$/.test(c)&&10>Number(c)||b.add(c)}}return[...b]}(b),g=function(a,b){let c=0;for(let d of a)b.includes(d.replace(e.ug,""))&&(c+=1);return c}(f,d);return f.length>=e.mu&&g/f.length<e.tg&&c.push({level:"warning",message:`可靠精确参数使用不足:${g}/${f.length}`,suggestion:"请将资料中可靠的规格、参数、数量、时间、比例和标准编号写入对应章节;商务金额、单价、税率、预留金不得写入正文。"}),b.bills.length>0&&!e.pP.test(a)&&c.push({level:"error",message:"正文未体现结构化数据资料",suggestion:"请从表格、列表或明细中提取对象、单位、数量、规格和关键参数补入对应章节。"}),b.drawings.length>0&&!e._U.test(a)&&c.push({level:"error",message:"正文未体现设计/方案/说明类资料",suggestion:"请从设计、方案或说明资料中提取对象、流程、节点、做法、配置、规则和标准要求。"}),c}function G(a){let b=[];for(let c of e.IA)c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见资料/按文件”。"});return b}function H(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,f=[];for(let a of(0,d.V)().autoSpecGates)(function(a,b){for(let c of b)try{if(RegExp(c,"iu").test(a))return!0}catch{if(a.includes(c))return!0}return!1})(c,a.templateMatchers)&&f.push(a);if(0===f.length)return[];let g=[],h=q(a).length,i=0;for(let b of f){for(let c of(i=Math.max(i,b.minTables||0),b.requiredTexts))a.includes(c)||g.push({level:"warning",message:`配置要求缺少必要内容:${c}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let c of b.forbiddenTexts)a.includes(c)&&g.push({level:"error",message:`配置要求不得出现:${c}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"})}return e.bu.test(a)&&g.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"}),i&&h<i&&g.push({level:"error",message:`配置要求正式表格不足:${h}/${i}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),g}function I(a,b,c,d,g,i,j){if(!a)return b;let k=[...b],l=function(a){let b=[...a.project,...a.schedule,...a.quality,...a.safety,...a.resources];for(let c of Object.values(a.schemaFacts))b.push(...c);return b}(c),m=function(a,b){let c=new Set;for(let a of b)c.add(a.key),a.fieldName&&c.add(a.fieldName);for(let b of a.tables){for(let a of b.headers)c.add(a);for(let a of b.rows)for(let b of a)c.add(b)}return c}(c,l),n=new Set(d.map(a=>a.title));for(let b of a.factFields){if(!b.required)continue;let a=c.schemaFacts[b.id]||[],e=!1,f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId));for(let a of d){if(e&&f)break;for(let c of a.evidence)!e&&!a.missingFacts.includes(b.name)&&(0,h.I2)(c,b)&&(e=!0),!f&&(0,h.I2)(c,b)&&(f=!0)}0!==a.length||m.has(b.name)||e||k.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||k.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}for(let b of a.chapterRules){let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&k.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let o=q(g),p=function(a){let b=[];for(let c of a.matchAll(e.gW))b.push({alt:c[1]||"",url:c[2]||"",index:c.index??0});return b}(g),r=(0,f.Cv)(g);for(let b of a.gateRules){let a=b.evaluator?b.evaluator:e.cA[b.type]?.(b)??{subject:"document",operator:"contains",value:b.value||b.target},f=a.target||b.target||"",h=a.value||b.value||f,q=d.find(a=>a.title===f),s=function(a){for(let c of e.Lp){let d=c(a);if(d){var b;return{level:a.rule.level,message:(b=a.rule,`${b.name}:${d}`)}}}}({rule:b,evaluator:a,target:f,value:h,min:a.min||Number(b.value)||1,markdown:g,textScope:"chapter"===a.subject&&q?q.content:g,regex:h?function(a){try{return RegExp(a,"iu")}catch{return}}(h):void 0,chapter:q,factNames:m,chapterTitles:n,tableBlocks:o,imageRefs:p,estimatedPages:r,allFacts:l,factsModel:c,fileBindings:i,promptBindings:j});s&&k.push(s)}return k}function J(a,b){let c=function(a){let b="";for(let c of(0,i.dU)(a))c.content&&(b+=`${c.content}
11
11
 
12
- `);return b}(b);if(!c.trim())return[];let d=a.replace(e.ug," ");for(let a of c.matchAll(e.QX)){let b=(a[1]||"").replace(e.ug," ").trim();if(b&&d.includes(b))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前绑定材料生成的正文。"}]}return[]}},29281:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},36041:(a,b,c)=>{c.d(b,{h0x:()=>d.h0,bVF:()=>d.bV,OXS:()=>cX,jGg:()=>d.jG,R1O:()=>cY,Bhi:()=>d.Bh,xmB:()=>d.xm});var d=c(52511),e=c(76760),f=c(19898),g=c(44533),h=c(29281),i=c(25840),j=c(6444),k=c(85441);let l={id:"default_general_document",name:"通用文档",factFields:[{id:"document_identity",name:"对象名称",aliases:["项目名称","工程名称","文档名称","任务名称","招标项目名称","建设项目名称"],category:"identity",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.75,minForValidation:.85,allowPathOnly:!1},conflictPolicy:"strict"},{id:"schedule_requirement",name:"周期要求",aliases:["计划工期","工期","周期要求","进度节点要求","开工日期","竣工日期"],category:"schedule",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"strict"},{id:"quality_requirement",name:"质量要求",aliases:["质量要求","质量标准","验收要求","评价标准"],category:"quality",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"safety_requirement",name:"安全合规要求",aliases:["安全要求","安全合规要求","风险控制要求","合规要求"],category:"safety",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"technical_parameter",name:"技术参数",aliases:["技术参数","参数规格范围","规格","型号","尺寸","标准编号","材料设备"],category:"technical",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"resource_plan",name:"资源配置",aliases:["劳动力","机械","检测设备","应急物资","资源配置","人员配置"],category:"resource",cardinality:"multiple",derivationPolicy:"plan_inferable",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.45,minForValidation:.55,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"commercial_data",name:"商务数据",aliases:["报价","单价","合价","综合单价","预留金","税率","金额","利润"],category:"commercial",cardinality:"multiple",derivationPolicy:"forbidden",usagePolicy:"do_not_use",confidencePolicy:{minForGeneration:1,minForValidation:1,allowPathOnly:!1},conflictPolicy:"ignore"},{id:"rule_requirement",name:"规则要求",aliases:["规则要求","变更说明","实施范围","对象范围","结构化数据范围"],category:"compliance",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.6,minForValidation:.7,allowPathOnly:!1},conflictPolicy:"allow_multiple"}],forbiddenValuePatterns:[/投标报价|报价明细|单价|合价|综合单价|预留金|暂列金额|税率|增值税|利润|结算/u],diagnosticValuePatterns:[/OCR|识别错误|乱码|无法确认|疑似|不确定|绑定片段|兜底|知识库|提示词|后台|文件路径|PDF|DWG|Excel/u],lowConfidenceValuePatterns:[/无法确认|疑似|不确定|需复核|文字模糊|语义断裂|识别错误|乱码/u]},m={...l,id:"construction_organization_design",name:"施工组织设计"};function n(a,b){return a.factFields.find(a=>a.name===b||a.aliases.some(a=>b.includes(a)||a.includes(b)))}function o(a,b){return a.forbiddenValuePatterns.some(a=>a.test(b))}function p(a,b){return a.diagnosticValuePatterns.some(a=>a.test(b))}function q(a,b){return a.lowConfidenceValuePatterns.some(a=>a.test(b))}var r=c(81125),s=c(56942);function t(a){return/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(a)}function u(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/[\s,。,.;;::《》“”‘’()()_-]+/gu,"").toLowerCase()}function v(a,b){let c=u(b);if(!c||c.length<4)return!0;let d=u(a);return!!d.includes(c)||c.length>=12&&d.includes(c.slice(0,Math.max(8,Math.floor(.72*c.length))))}function w(a){let b=[],c=a.markdown||"";for(let e of a.spec.factFields.filter(a=>a.required)){var d;!((d=e.name).length<4||t(d))&&/\d|GB|JGJ|C\d|HRB|DN|mm|MPa|kPa|工期|质量|安全|项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数/u.test(d)&&!v(c,e.name)&&b.push({level:"info",message:`正文可能未显式覆盖“${e.name}”`,suggestion:"建议检查对应章节是否已自然表达该事实。"})}let e=a.summary.facts.projectName;!e||"当前知识库项目"===e||t(e)||v(c,e)||b.push({level:"warning",message:"正文未明显体现关键对象名称",suggestion:"建议在概况、背景或首页标题中体现当前文档的关键对象名称。"});let f=a.summary.facts.documentNo;for(let a of(f&&!c.includes(f)&&b.push({level:"info",message:"正文未体现文档/任务编号",suggestion:"如文档需要编号,请在概况、背景或首页信息中补充。"}),["知识库证据","文件角色","提示词角色","文档规范包","规范包","后台自动规范","后台优化建议","基础事实候选","材料未提供","未检索到"]))c.includes(a)&&b.push({level:"error",message:`正文包含后台流程话术:${a}`,suggestion:"请重新生成或在审查阶段删除后台流程描述。"});return b}function x(a,b){let c=[],d=new Set([b.projectName,...b.fingerprint.projectNames].filter(Boolean));for(let e of b.contaminationCandidates)e.length>=6&&!d.has(e)&&a.replace(/\s+/gu,"").includes(e.replace(/\s+/gu,""))&&c.push({level:"error",message:`正文疑似混入其他对象名称:${e}`,suggestion:"请检查绑定材料选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.documentNos,f=a.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)?.find(a=>!e.includes(a));return f&&e.length>0&&c.push({level:"error",message:`正文疑似混入其他文档编号:${f}`,suggestion:"请重新生成并检查是否召回了其他绑定材料。"}),c}function y(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/\s+/gu,"").replace(/[,。,.;;::《》“”‘’()()_-]/gu,"").toLowerCase()}function z(a,b){let c=a.trim();if(p(b,c)||o(b,c))return"";let d=y(c);return!d||d.length>80?"":d}function A(a){let b=a.profile||l,c=[],d=new Map;for(let c of a.facts){let a=c.fieldName||c.key;a&&function(a,b){let c=n(b,a);return c?"single"===c.cardinality&&"allow_multiple"!==c.conflictPolicy&&"ignore"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)}(a,b)&&z(String(c.value),b)&&d.set(a,[...d.get(a)||[],{value:String(c.value),source:c.sourceFile}])}for(let[a,e]of d){let d=new Map;for(let a of e){let c=z(a.value,b);c&&d.set(c,[...d.get(c)||[],a])}if(d.size>1){let b=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");c.push({level:"error",message:`事实一致性冲突:${a} 存在多个值:${b}`,suggestion:"请确认当前绑定材料组,或在模板绑定中只绑定当前文档所需材料。"})}}let e=a.summary.facts.projectName;if(e&&"当前知识库项目"!==e&&!/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|招标工程量清单封面|招标工程量清单扉页|工程量清单表|清单封面|清单扉页|\d{1,2}\.\d{1,2}/u.test(e)){let b=y(a.markdown);[e,...a.summary.fingerprint.projectNames].flatMap(a=>[a,a.replace(/^\d+(?:\.\d+)?[^\u4e00-\u9fa5]*/u,""),a.replace(/\([^)]*\)|([^)]*)/gu,"")]).map(a=>y(a)).filter(a=>a.length>=8).some(a=>b.includes(a)||a.length>=12&&b.includes(a.slice(0,Math.max(8,Math.floor(.72*a.length)))))||c.push({level:"warning",message:`正文未包含当前对象名称:${e}`,suggestion:"请确认标题、概况或背景信息是否已体现当前对象名称。"})}return c}var B=c(77598),C=c(58965),D=c(91977);function E(a,b=0){let c="drawing"===a.processingType||a.roleId?.includes("drawing")?"视觉资料":"table"===a.processingType||a.roleId?.includes("bill")?"表格资料":"rule"===a.processingType||a.roleId?.includes("tender")?"规则资料":"文本资料";return`${c}片段${b+1}${a.sectionTitle?`(${a.sectionTitle.replace(C.tK,"")})`:""}`}function F(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(C.VX,"").replace(C.tK,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function G(a){let b=F(a),c=Math.max(1,b.length),d=(b.match(/[\u4e00-\u9fa5]/gu)||[]).length,e=(b.match(/\d/gu)||[]).length,f=(b.match(/项目|任务|质量|安全|周期|验收|材料|设备|表格|数据|参数|规范|标准|流程|资源|风险/gu)||[]).length,g=(b.match(/CAD|AcDb|Polyline|ByLayer|ObjectId|Handle|Model|Layout|图层|页码|第\s*\d+\s*页|打印|版权所有|^[\s\W\d_]+$/gimu)||[]).length,h=(b.match(/(?:序号|项目名称|事项|单位|数量|单价|金额|备注)/gu)||[]).length,i=Math.min(1,d/c*.7+Math.min(.3,(e+3*f)/120)),j=Math.min(1,.18*g+.04*Math.max(0,h-8)+.35*(d/c<.25));return{noiseScore:j,factDensity:i,shouldUse:b.length>=30&&j<.72&&i>.08}}function H(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=F(b).split("\n").map(a=>a.trim()).filter(a=>a&&!/^第\s*\d+\s*页\s*(?:共\s*\d+\s*页)?$/u.test(a)).join("\n"),f=G(d);if(d.length>20&&f.shouldUse)return d;let g=[...new Set(F(d).split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>{let b=/计划工期|合同工期|工期|合同估算价|合同估算价格|投资估算|估算价格|工程估算价|最高投标限价|招标控制价|建设地点|建设规模|质量标准/u.test(a);if(!b&&/综合单价|合价|报价明细|投标报价|税率|增值税|利润|预留金|暂列金额|结算/u.test(a))return!1;let c=/\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年)|DN\s*\d+|Φ\s*\d+|φ\s*\d+|C\d{2,}|HRB\d+|GB\/?T?\s*[\w.-]+|JGJ\s*[\w.-]+|\d+\s*[×xX]\s*\d+/iu.test(a),d=/项目|工程|工期|合同|估算|价格|地点|规模|清单|图纸|设计|规格|型号|数量|单位|材料|设备|管|线|电缆|混凝土|钢筋|砌体|门窗|防水|标准|规范|验收|做法|参数|尺寸|标高|厚度|强度|等级|系统|安装/u.test(a);return b||c||d&&/\d/u.test(a)&&a.length<=260}))].slice(0,80).join("\n");return g.length>20?`资料参数行摘要:
12
+ `);return b}(b);if(!c.trim())return[];let d=a.replace(e.ug," ");for(let a of c.matchAll(e.QX)){let b=(a[1]||"").replace(e.ug," ").trim();if(b&&d.includes(b))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前绑定材料生成的正文。"}]}return[]}},29281:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},36041:(a,b,c)=>{c.d(b,{h0x:()=>d.h0,bVF:()=>d.bV,OXS:()=>c$,jGg:()=>d.jG,R1O:()=>c_,Bhi:()=>d.Bh,xmB:()=>d.xm});var d=c(52511),e=c(76760),f=c(19898),g=c(44533),h=c(29281),i=c(25840),j=c(6444),k=c(85441);let l={id:"default_general_document",name:"通用文档",factFields:[{id:"document_identity",name:"对象名称",aliases:["项目名称","工程名称","文档名称","任务名称","招标项目名称","建设项目名称"],category:"identity",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.75,minForValidation:.85,allowPathOnly:!1},conflictPolicy:"strict"},{id:"schedule_requirement",name:"周期要求",aliases:["计划工期","工期","周期要求","进度节点要求","开工日期","竣工日期"],category:"schedule",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"strict"},{id:"quality_requirement",name:"质量要求",aliases:["质量要求","质量标准","验收要求","评价标准"],category:"quality",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"safety_requirement",name:"安全合规要求",aliases:["安全要求","安全合规要求","风险控制要求","合规要求"],category:"safety",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"technical_parameter",name:"技术参数",aliases:["技术参数","参数规格范围","规格","型号","尺寸","标准编号","材料设备"],category:"technical",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"resource_plan",name:"资源配置",aliases:["劳动力","机械","检测设备","应急物资","资源配置","人员配置"],category:"resource",cardinality:"multiple",derivationPolicy:"plan_inferable",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.45,minForValidation:.55,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"commercial_data",name:"商务数据",aliases:["报价","单价","合价","综合单价","预留金","税率","金额","利润"],category:"commercial",cardinality:"multiple",derivationPolicy:"forbidden",usagePolicy:"do_not_use",confidencePolicy:{minForGeneration:1,minForValidation:1,allowPathOnly:!1},conflictPolicy:"ignore"},{id:"rule_requirement",name:"规则要求",aliases:["规则要求","变更说明","实施范围","对象范围","结构化数据范围"],category:"compliance",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.6,minForValidation:.7,allowPathOnly:!1},conflictPolicy:"allow_multiple"}],forbiddenValuePatterns:[/投标报价|报价明细|单价|合价|综合单价|预留金|暂列金额|税率|增值税|利润|结算/u],diagnosticValuePatterns:[/OCR|识别错误|乱码|无法确认|疑似|不确定|绑定片段|兜底|知识库|提示词|后台|文件路径|PDF|DWG|Excel/u],lowConfidenceValuePatterns:[/无法确认|疑似|不确定|需复核|文字模糊|语义断裂|识别错误|乱码/u]},m={...l,id:"construction_organization_design",name:"施工组织设计"};function n(a,b){return a.factFields.find(a=>a.name===b||a.aliases.some(a=>b.includes(a)||a.includes(b)))}function o(a,b){return a.forbiddenValuePatterns.some(a=>a.test(b))}function p(a,b){return a.diagnosticValuePatterns.some(a=>a.test(b))}function q(a,b){return a.lowConfidenceValuePatterns.some(a=>a.test(b))}var r=c(81125),s=c(56942);function t(a){return/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(a)}function u(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/[\s,。,.;;::《》“”‘’()()_-]+/gu,"").toLowerCase()}function v(a,b){let c=u(b);if(!c||c.length<4)return!0;let d=u(a);return!!d.includes(c)||c.length>=12&&d.includes(c.slice(0,Math.max(8,Math.floor(.72*c.length))))}function w(a){let b=[],c=a.markdown||"";for(let e of a.spec.factFields.filter(a=>a.required)){var d;!((d=e.name).length<4||t(d))&&/\d|GB|JGJ|C\d|HRB|DN|mm|MPa|kPa|工期|质量|安全|项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数/u.test(d)&&!v(c,e.name)&&b.push({level:"info",message:`正文可能未显式覆盖“${e.name}”`,suggestion:"建议检查对应章节是否已自然表达该事实。"})}let e=a.summary.facts.projectName;!e||"当前知识库项目"===e||t(e)||v(c,e)||b.push({level:"warning",message:"正文未明显体现关键对象名称",suggestion:"建议在概况、背景或首页标题中体现当前文档的关键对象名称。"});let f=a.summary.facts.documentNo;for(let a of(f&&!c.includes(f)&&b.push({level:"info",message:"正文未体现文档/任务编号",suggestion:"如文档需要编号,请在概况、背景或首页信息中补充。"}),["知识库证据","文件角色","提示词角色","文档规范包","规范包","后台自动规范","后台优化建议","基础事实候选","材料未提供","未检索到"]))c.includes(a)&&b.push({level:"error",message:`正文包含后台流程话术:${a}`,suggestion:"请重新生成或在审查阶段删除后台流程描述。"});return b}function x(a,b){let c=[],d=new Set([b.projectName,...b.fingerprint.projectNames].filter(Boolean));for(let e of b.contaminationCandidates)e.length>=6&&!d.has(e)&&a.replace(/\s+/gu,"").includes(e.replace(/\s+/gu,""))&&c.push({level:"error",message:`正文疑似混入其他对象名称:${e}`,suggestion:"请检查绑定材料选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.documentNos,f=a.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)?.find(a=>!e.includes(a));return f&&e.length>0&&c.push({level:"error",message:`正文疑似混入其他文档编号:${f}`,suggestion:"请重新生成并检查是否召回了其他绑定材料。"}),c}function y(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/\s+/gu,"").replace(/[,。,.;;::《》“”‘’()()_-]/gu,"").toLowerCase()}function z(a,b){let c=a.trim();if(p(b,c)||o(b,c))return"";let d=y(c);return!d||d.length>80?"":d}function A(a){let b=a.profile||l,c=[],d=new Map;for(let c of a.facts){let a=c.fieldName||c.key;a&&function(a,b){let c=n(b,a);return c?"single"===c.cardinality&&"allow_multiple"!==c.conflictPolicy&&"ignore"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)}(a,b)&&z(String(c.value),b)&&d.set(a,[...d.get(a)||[],{value:String(c.value),source:c.sourceFile}])}for(let[a,e]of d){let d=new Map;for(let a of e){let c=z(a.value,b);c&&d.set(c,[...d.get(c)||[],a])}if(d.size>1){let b=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");c.push({level:"error",message:`事实一致性冲突:${a} 存在多个值:${b}`,suggestion:"请确认当前绑定材料组,或在模板绑定中只绑定当前文档所需材料。"})}}let e=a.summary.facts.projectName;if(e&&"当前知识库项目"!==e&&!/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|招标工程量清单封面|招标工程量清单扉页|工程量清单表|清单封面|清单扉页|\d{1,2}\.\d{1,2}/u.test(e)){let b=y(a.markdown);[e,...a.summary.fingerprint.projectNames].flatMap(a=>[a,a.replace(/^\d+(?:\.\d+)?[^\u4e00-\u9fa5]*/u,""),a.replace(/\([^)]*\)|([^)]*)/gu,"")]).map(a=>y(a)).filter(a=>a.length>=8).some(a=>b.includes(a)||a.length>=12&&b.includes(a.slice(0,Math.max(8,Math.floor(.72*a.length)))))||c.push({level:"warning",message:`正文未包含当前对象名称:${e}`,suggestion:"请确认标题、概况或背景信息是否已体现当前对象名称。"})}return c}var B=c(77598),C=c(58965),D=c(91977);function E(a,b=0){let c="drawing"===a.processingType||a.roleId?.includes("drawing")?"视觉资料":"table"===a.processingType||a.roleId?.includes("bill")?"表格资料":"rule"===a.processingType||a.roleId?.includes("tender")?"规则资料":"文本资料";return`${c}片段${b+1}${a.sectionTitle?`(${a.sectionTitle.replace(C.tK,"")})`:""}`}function F(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(C.VX,"").replace(C.tK,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function G(a){let b=F(a),c=Math.max(1,b.length),d=(b.match(/[\u4e00-\u9fa5]/gu)||[]).length,e=(b.match(/\d/gu)||[]).length,f=(b.match(/项目|任务|质量|安全|周期|验收|材料|设备|表格|数据|参数|规范|标准|流程|资源|风险/gu)||[]).length,g=(b.match(/CAD|AcDb|Polyline|ByLayer|ObjectId|Handle|Model|Layout|图层|页码|第\s*\d+\s*页|打印|版权所有|^[\s\W\d_]+$/gimu)||[]).length,h=(b.match(/(?:序号|项目名称|事项|单位|数量|单价|金额|备注)/gu)||[]).length,i=Math.min(1,d/c*.7+Math.min(.3,(e+3*f)/120)),j=Math.min(1,.18*g+.04*Math.max(0,h-8)+.35*(d/c<.25));return{noiseScore:j,factDensity:i,shouldUse:b.length>=30&&j<.72&&i>.08}}function H(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=F(b).split("\n").map(a=>a.trim()).filter(a=>a&&!/^第\s*\d+\s*页\s*(?:共\s*\d+\s*页)?$/u.test(a)).join("\n"),f=G(d);if(d.length>20&&f.shouldUse)return d;let g=[...new Set(F(d).split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>{let b=/计划工期|合同工期|工期|合同估算价|合同估算价格|投资估算|估算价格|工程估算价|最高投标限价|招标控制价|建设地点|建设规模|质量标准/u.test(a);if(!b&&/综合单价|合价|报价明细|投标报价|税率|增值税|利润|预留金|暂列金额|结算/u.test(a))return!1;let c=/\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年)|DN\s*\d+|Φ\s*\d+|φ\s*\d+|C\d{2,}|HRB\d+|GB\/?T?\s*[\w.-]+|JGJ\s*[\w.-]+|\d+\s*[×xX]\s*\d+/iu.test(a),d=/项目|工程|工期|合同|估算|价格|地点|规模|清单|图纸|设计|规格|型号|数量|单位|材料|设备|管|线|电缆|混凝土|钢筋|砌体|门窗|防水|标准|规范|验收|做法|参数|尺寸|标高|厚度|强度|等级|系统|安装/u.test(a);return b||c||d&&/\d/u.test(a)&&a.length<=260}))].slice(0,80).join("\n");return g.length>20?`资料参数行摘要:
13
13
  ${g}`:d.length>80&&f.noiseScore<.9?d:[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d}(a.filePath,a.content),c=G(b);return{item:{...a,content:b,score:a.score*(1+c.factDensity)*(1-.45*c.noiseScore)},quality:c}}),g=f.filter(a=>a.quality.shouldUse||/附件,仅作为内部事实提取依据/u.test(a.item.content)),h=Number.isFinite(b)&&b>0?Math.ceil(b):void 0,i=(g.length>=Math.min(3,a.length)?g:f).sort((a,b)=>b.item.score-a.item.score).filter(a=>{let b=function(a){let b=a.content.replace(/\s+/gu," ").trim();return`${a.filePath}:${a.sectionTitle||""}:${(0,B.createHash)("sha1").update(b).digest("hex")}`}(a.item);return!d.has(b)&&(d.add(b),!0)}),j=h?i.slice(0,h):i;if(c){let b=f.reduce((a,b)=>a+b.quality.noiseScore,0),d=f.reduce((a,b)=>a+b.quality.factDensity,0);c.evidence.raw+=a.length,c.evidence.used+=j.length,c.evidence.filteredNoise+=Math.max(0,f.length-g.length),c.evidence.avgNoiseScore=f.length?Number((b/f.length).toFixed(3)):0,c.evidence.avgFactDensity=f.length?Number((d/f.length).toFixed(3)):0}return j.map(a=>a.item)}function I(a,b={},c){let d=Number.isFinite(b.maxItems)&&b.maxItems>0?Math.floor(b.maxItems):void 0,e=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.floor(b.maxChars):void 0,f=H(a,void 0,c),g=b.preservePinned?f.filter(a=>"pinned-evidence"===a.source||"bound-file"===a.source||"required-fact-evidence"===a.source):[],h=f.filter(a=>!g.includes(a)),i=[],j=new Map,k=0,l=(a,b=!1)=>{if(d&&i.length>=d)return;let c=j.get(a.filePath)||0;if(!b&&c>=4)return;let f=F(a.content),g=k+f.length;e&&i.length>0&&g>e||(i.push({...a,content:f}),j.set(a.filePath,c+1),k=g)};for(let a of g)l(a,!0);for(let a of h)l(a);return i}function J(a,b=0){return`- ${E(a,b)}:${F(a.content).replace(/\s+/gu," ").slice(0,260)}`}function K(a,b){let c=new Map;for(let d of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|map|drawing|design/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(d.filePath,d.processingType),f=c.get(d.filePath)||{filePath:d.filePath,kind:b,roleId:d.roleId,processingType:d.processingType,score:d.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图-/u,"").replace(/-完整地图$/u,"完整地图"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(d.filePath,b),contentUse:"map"===b?"作为视觉/地图证据,用于说明空间关系、区域划分、点位、路线或布局。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、明细、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,d.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
14
14
  ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","基础事实","附件资料","视觉资料","图片资料"].filter(b=>(0,D.Lk)(a,b)||c.includes(b)))]}(d,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=d.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),c.set(d.filePath,f)}let d=[...c.values()].sort((a,b)=>b.score-a.score),f={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of d)f[a.kind].push(a);let g=[`绑定材料包:文本片段 ${b.length} 条、结构化材料 ${d.length} 个。`,`材料类型分布:文本 ${f.text.length}、文档 ${f.document.length}、表格/数据 ${f.spreadsheet.length+f.table.length}、图片 ${f.image.length}、视觉/地图 ${f.map.length}、其他 ${f.attachment.length}。`,"正文必须只写材料中的事实、参数、数量、做法和要求,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:b,resources:d,byKind:f,summary:g}}function L(a,b=6e3,c=18e3){return Math.max(b,Math.min(c,Math.ceil(5.5*(Number.isFinite(a)&&a>0?Math.ceil(a):1200))))}function M(a,b,c,d){let e=b.trim();if(e){if(!Number.isFinite(d)||!d||c.chars+e.length<=d){a.push(e),c.chars+=e.length;return}c.omitted+=1}}function N(a,b,c){let d={chars:0,omitted:0},e=[],f=new Set,g=new Set,h=[...a].sort((a,b)=>b.score-a.score);for(let a of h){if(g.has(a.filePath))continue;let h=e.length;M(e,c(a,e.length),d,b),e.length>h&&(g.add(a.filePath),f.add(a))}for(let a of h)f.has(a)||M(e,c(a,e.length),d,b);return{lines:e,omitted:d.omitted}}function O(a,b={}){let c=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.ceil(b.maxChars):void 0,d=N(a.resources,c?Math.floor(.35*c):void 0,(a,b)=>[`- 资料:${E(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(F).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")),e=N(a.textEvidence,c?Math.floor(.65*c):void 0,(a,b)=>`${E(a,b)}
15
15
  类型:${a.processingType||"reference"}
16
16
  章节/片段:${a.sectionTitle?.replace(C.tK,"")||"资料片段"}
17
17
  内容:${F(a.content).replace(/\s+/gu," ")}`),f=d.omitted+e.omitted>0?`提示:完整证据池仍保留 ${a.textEvidence.length} 条文本片段、${a.resources.length} 个结构化材料;为控制单次模型输入,本次只发送预算内高相关且覆盖多来源的证据,未发送片段将在章节/小节相关检索和质量校验中继续参与。`:"";return[a.summary,f,d.lines.length?`结构化资料:
18
18
  ${d.lines.join("\n")}`:"",e.lines.length?`文本/附件片段:
19
- ${e.lines.join("\n\n---\n\n")}`:""].filter(Boolean).join("\n\n")}var P=c(70208);function Q(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let R=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,S=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,T=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu,U=/^#{2,6}\s+(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用)|^#{2,6}\s+(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:如|若|如果)(?:涉及|不涉及|适用|不适用)|^#{2,6}\s+.*(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成)|^#{2,6}\s+.*(?:按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项)\s*$/gmu;function V(a){return(function(a){let b=a.trim(),c=/^```(?:markdown|md)?\s*\n([\s\S]*?)\n```\s*$/iu.exec(b);return c?c[1].trim():a})(a).replace(/\b(m|㎡)\s*2\b/giu,"平方米").replace(/\bm\s*[²2]\b/giu,"平方米").replace(/\b(m|㎥)\s*3\b/giu,"立方米").replace(/\bm\s*[³3]\b/giu,"立方米").replace(/\bmm2\b/giu,"平方毫米").replace(/\bcm2\b/giu,"平方厘米").replace(/\bkm2\b/giu,"平方千米").replace(/\s*×\s*/gu,"\xd7").replace(/\s*≤\s*/gu,"≤").replace(/\s*≥\s*/gu,"≥").replace(/\s*±\s*/gu,"\xb1").replace(R,"").replace(S,"").replace(T,"").replace(U,"").replace(C.tK,"").replace(/^#\s+/gmu,"").replace(C.VX,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").split(/\r?\n/u).filter(a=>{let b=a.trim();if(!b||/^\s*\|/u.test(b)||/^\s*\|?\s*:?-{3,}:?/u.test(b))return!0;let c=(0,P.GQ)(b.replace(/^#{1,6}\s+/u,""));return!(c.length<=1)&&!(/[,、;:和与在为对将]$/u.test(c)||/(通过|包括|如下|主要包括)$/u.test(c))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}let W="你正在生成可直接交付的专业文档,不是系统调试报告。\n通用质量约束只用于补充用户要求、模板章节和绑定提示词;除事实安全、结构边界和导出格式要求外,不得覆盖用户明确要求。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n用户提供的信息和绑定材料应内化为正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\nMarkdown 表格格式硬约束:凡是输出 Markdown 表格,必须使用标准 GFM 表格格式。\n表格必须包含表头行、分隔线和数据行;表头下一行必须是分隔线,例如 |---|---|。\n禁止只输出连续的“| 字段 | 值 |”裸表格行;两列键值信息表默认使用表头 | 信息项 | 内容 |。\n表头、分隔线和数据行必须连续,中间不得插入正文、说明、空行或补充段落。\n正文表格不得展示后台溯源列或系统过程列,如“资料来源/说明”“资料来源/证明”“知识库来源”等。\n项目名称、项目编号、招标人/业主/建设单位、建设地点、建设规模、计划工期、质量标准、合同估算价等项目基础信息,只能在项目基本信息表中集中输出一次;后续章节如需引用,应写入正文或专业表格的业务字段,不得重复生成项目基础信息键值表。\n正文不得把原始文件条款、说明性附件或系统过程内容误作为章节标题或目录项。\n正文事实必须来自当前模板、用户要求、绑定提示词和绑定材料;信息不足或来源冲突时应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出。",X="只生成当前小节正文,不生成其他二级小节,不重复章节一级标题。\n优先使用当前模板、用户要求、绑定提示词和绑定材料中的事实;缺少依据时不得编造具体数值、名称、时间、规格或责任。\n小节应有实质正文;除非用户或模板明确要求纯表格,否则表格只能作为辅助表达,不能整节只有表格。\n不得用通用兜底段落、空泛管理话术或后台缺料说明冒充正文;信息不足时只写已有事实、适用边界和待复核口径。";function Y(a){return(0,P.GQ)(a.replace(/^#+\s*/u,"")).replace(/^(?:第)?[一二三四五六七八九十百千万\d]+章\s*/u,"").trim().replace(/\s+/gu,"")}function Z(a,b){let c=Y(a),d=Y(b);return!!(c&&d&&c===d)}function $(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>(0,P.GQ)(a[1]||"")).filter(a=>a.length>=2&&a.length<=80).filter(a=>!/^\d+(?:\.\d+){2,}\s+/u.test(a)))]}function _(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;let e=/^(#{4,5})\s+(.+)$/u.exec(a.trim());if(e){if(!c)return"#####"===e[1]?a.replace(/^\s*#####/u,"####"):a;let b=(e[2]||"").trim(),f=(0,P.GQ)(b.replace(/^\d+\.\d+\.\d+\s+/u,""));return f?(d+=1,`#### ${c}.${d} ${f}`):a}return a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function aa(a){let b=[],c="";for(let d of a.split(/\r?\n/u)){let a=d.trim(),e=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a);if(e){c=e[1];continue}if(/^##\s+/u.test(a)&&(c=""),!c)continue;let f=/^####\s+(.+)$/u.exec(a);if(f){let a=(f[1]||"").trim();RegExp(`^${ai(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${(0,P.GQ)(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}}return b}function ab(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[(0,P.tb)(b,a.title),"",...c.flatMap((a,c)=>[` ${function(a,b,c){let d=(0,P.GQ)(c);return!function(a){let b=/^\s*(\d+)\.(\d+)[..、]?\s+(.+)$/u.exec(a);return!!b&&(0,P.GQ)(b[3]||"").trim()===(0,P.GQ)(a).trim()}(c)?`${a+1}.${b+1} ${d}`:d}(b,c,a)}`,""])]})].join("\n")}function ac(a){return a.replace(/<div class="document-cover">[\s\S]*?<\/div>\s*(?:<div class="page-break"><\/div>\s*)?/giu,"").replace(/^#\s+.+\n{1,2}/u,"")}function ad(a){return a.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+第[一二三四五六七八九十百千万\d]+章|\n##\s+)/gmu,"").replace(/^<div class="page-break"><\/div>\s*(?=##\s+第[一二三四五六七八九十百千万\d]+章)/gmu,"")}function ae(a){let b=!1;return a.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+)/gmu,a=>b?"":(b=!0,a)).replace(/\n{3,}/gu,"\n\n").trim()}function af(a,b){let c=ae(a);b.forEach((a,b)=>{let d=(0,P.GQ)(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${ai(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${(0,P.tb)(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0,g=0,h="",i=new Set,j=a=>{let c=b[e]?.sections||[],d=ak(a);return c.findIndex(a=>ak(a)===d)},k=(a,c)=>{let d=(0,P.GQ)(a),k=j(d),l=b[e]?.sections||[];if(l.length>0&&k<0)return f||(f=1,h=`${e+1}.1`),(g+=1)<=4?`#### ${e+1}.${f}.${g} ${d}`:`**${d}**`;let m=k>=0?k+1:f+1,n=k>=0?ak(l[k]):ak(d);return i.has(n)?(f=m,h=c||`${e+1}.${f}`,g+=1,`#### ${e+1}.${f}.${g} ${d}`):(f=m,g=0,h=c||`${e+1}.${f}`,i.add(n),`### ${e+1}.${f} ${k>=0?(0,P.GQ)(l[k]):d}`)},l=!1;return d.map(a=>{let c=a.trim();if(/^##\s+目录\s*$/u.test(c))return l=!0,a;if(l&&/^<div class="page-break"><\/div>$/u.test(c))return l=!1,a;if(l)return a;if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(c))return e+=1,f=0,g=0,h="",i=new Set,a;let d=/^##\s+\d+[..、]\s+(.+)$/u.exec(c);if(e>=0&&d)return k(d[1]||"");let m=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(c);if(e>=0&&m)return k(m[3]||"",`${m[1]}.${m[2]}`);let n=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&n)return k(n[3]||"",n[1]&&n[2]?`${n[1]}.${n[2]}`:void 0);let o=/^####\s+(\d+)\.(\d+)(?!\.)\s+(.+)$/u.exec(c);if(e>=0&&o)return k(o[3]||"",`${o[1]}.${o[2]}`);let p=/^####\s+(?:(\d+)\.(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&p){let a=p[1]&&p[2]?`${p[1]}.${p[2]}`:h,c=(0,P.GQ)(p[4]||""),d=ak(c),l=j(c)>=0&&!i.has(d);return!f||a&&a!==h&&(0===(b[e]?.sections||[]).length||l)?k(c,a):(g+=1)<=4?`#### ${e+1}.${f}.${g} ${c}`:`**${c}**`}return a}).join("\n")}function ag(a,b){let c=a.replace(/知识库|提示词|绑定片段|后台|资料库|OCR|联网增强|联网检索|网页资料|搜索结果|根据网页|互联网资料|在线资料|浏览器|搜索引擎/giu,"项目资料").replace(/建议补充/gu,"需完善").replace(/\b兜底\b|兜底生成|兜底片段/gu,"补充完善").replace(/施工方(?!法|案|式|针|向)/gu,"我公司").replace(/投标人/gu,"我公司").replace(/高度重视/gu,"严格落实").replace(/重中之重/gu,"关键控制事项");for(let a of b?.forbiddenTerms||[])a&&/^(?:工程造价|造价|报价|投标报价|报价明细|综合单价|单价|合价|金额|税率|增值税|利润|预留金|暂列金额|报价明细表|最高投标限价|招标控制价)$/u.test(a)&&(c=c.split(/\r?\n/u).filter(b=>!RegExp(ai(a),"u").test(b)).join("\n"));return c}function ah(a,b){if(!b)return ag(a);let c=function(a,b){let c=a;for(let a of b?.requiredTables||[])c=function(a,b){if(/项目基本信息/u.test(b)&&(/项目基本信息/u.test(a)||/\|\s*信息项\s*\|\s*内容\s*\|/u.test(a)||/\|\s*项目名称\s*\|[^\n]*(?:徽光阁|项目施工|工程)/u.test(a))||RegExp(ai(b),"u").test(a))return a;let c=/项目基本信息/u.test(b)?"":`**${b}**
19
+ ${e.lines.join("\n\n---\n\n")}`:""].filter(Boolean).join("\n\n")}var P=c(70208);function Q(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let R=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,S=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,T=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu,U=/^#{2,6}\s+(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用)|^#{2,6}\s+(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:如|若|如果)(?:涉及|不涉及|适用|不适用)|^#{2,6}\s+.*(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成)|^#{2,6}\s+.*(?:按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项)\s*$/gmu,V=/^(?:\d+(?:\.\d+)*\s*)?(?:[-—–]\s*)?(?:(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用).+|(?:如|若|如果)(?:涉及|不涉及|适用|不适用).+|.*(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成).*|.*(?:按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项))\s*$/u;function W(a){let b=a.replace(/^#{1,6}\s+/u,"").replace(/^\s*\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").trim(),c=(0,P.GQ)(b);return V.test(b)||V.test(c)}function X(a){return(function(a){let b=a.trim(),c=/^```(?:markdown|md)?\s*\n([\s\S]*?)\n```\s*$/iu.exec(b);return c?c[1].trim():a})(a).replace(/\b(m|㎡)\s*2\b/giu,"平方米").replace(/\bm\s*[²2]\b/giu,"平方米").replace(/\b(m|㎥)\s*3\b/giu,"立方米").replace(/\bm\s*[³3]\b/giu,"立方米").replace(/\bmm2\b/giu,"平方毫米").replace(/\bcm2\b/giu,"平方厘米").replace(/\bkm2\b/giu,"平方千米").replace(/\s*×\s*/gu,"\xd7").replace(/\s*≤\s*/gu,"≤").replace(/\s*≥\s*/gu,"≥").replace(/\s*±\s*/gu,"\xb1").replace(R,"").replace(S,"").replace(T,"").replace(U,"").replace(C.tK,"").replace(/^#\s+/gmu,"").replace(C.VX,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").split(/\r?\n/u).filter((a,b,c)=>{let d=b>0?(0,P.GQ)((c[b-1]||"").trim().replace(/^#{1,6}\s+/u,"")):"",e=(0,P.GQ)(a.trim().replace(/^#{1,6}\s+/u,""));if(d&&W(d)&&e.length>0&&e.length<=12&&!/^#{1,6}\s/u.test(a.trim()))return!1;let f=a.trim();if(!f||/^\s*\|/u.test(f)||/^\s*\|?\s*:?-{3,}:?/u.test(f))return!0;let g=(0,P.GQ)(f.replace(/^#{1,6}\s+/u,""));return!(g.length<=1||W(g))&&!(/[,、;:和与在为对将]$/u.test(g)||/(通过|包括|如下|主要包括)$/u.test(g))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}let Y="你正在生成可直接交付的专业文档,不是系统调试报告。\n通用质量约束只用于补充用户要求、模板章节和绑定提示词;除事实安全、结构边界和导出格式要求外,不得覆盖用户明确要求。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n用户提供的信息和绑定材料应内化为正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\nMarkdown 表格格式硬约束:凡是输出 Markdown 表格,必须使用标准 GFM 表格格式。\n表格必须包含表头行、分隔线和数据行;表头下一行必须是分隔线,例如 |---|---|。\n禁止只输出连续的“| 字段 | 值 |”裸表格行;两列键值信息表默认使用表头 | 信息项 | 内容 |。\n表头、分隔线和数据行必须连续,中间不得插入正文、说明、空行或补充段落。\n正文表格不得展示后台溯源列或系统过程列,如“资料来源/说明”“资料来源/证明”“知识库来源”等。\n项目名称、项目编号、招标人/业主/建设单位、建设地点、建设规模、计划工期、质量标准、合同估算价等项目基础信息,只能在项目基本信息表中集中输出一次;后续章节如需引用,应写入正文或专业表格的业务字段,不得重复生成项目基础信息键值表。\n正文不得把原始文件条款、说明性附件或系统过程内容误作为章节标题或目录项。\n正文事实必须来自当前模板、用户要求、绑定提示词和绑定材料;信息不足或来源冲突时应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出。",Z="只生成当前小节正文,不生成其他二级小节,不重复章节一级标题。\n优先使用当前模板、用户要求、绑定提示词和绑定材料中的事实;缺少依据时不得编造具体数值、名称、时间、规格或责任。\n小节应有实质正文;除非用户或模板明确要求纯表格,否则表格只能作为辅助表达,不能整节只有表格。\n不得用通用兜底段落、空泛管理话术或后台缺料说明冒充正文;信息不足时只写已有事实、适用边界和待复核口径。";function $(a){return(0,P.GQ)(a.replace(/^#+\s*/u,"")).replace(/^(?:第)?[一二三四五六七八九十百千万\d]+章\s*/u,"").trim().replace(/\s+/gu,"")}function _(a,b){let c=$(a),d=$(b);return!!(c&&d&&c===d)}function aa(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>(0,P.GQ)(a[1]||"")).filter(a=>a.length>=2&&a.length<=80).filter(a=>!W(a)).filter(a=>!/^\d+(?:\.\d+){2,}\s+/u.test(a)))]}function ab(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;let e=/^(#{4,5})\s+(.+)$/u.exec(a.trim());if(e){if(!c)return"#####"===e[1]?a.replace(/^\s*#####/u,"####"):a;let b=(e[2]||"").trim(),f=(0,P.GQ)(b.replace(/^\d+\.\d+\.\d+\s+/u,""));return f?(d+=1,`#### ${c}.${d} ${f}`):a}return a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function ac(a){let b=[],c="";for(let d of a.split(/\r?\n/u)){let a=d.trim(),e=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a);if(e){c=e[1];continue}if(/^##\s+/u.test(a)&&(c=""),!c)continue;let f=/^####\s+(.+)$/u.exec(a);if(f){let a=(f[1]||"").trim();RegExp(`^${al(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${(0,P.GQ)(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}}return b}function ad(a=[]){return[...new Set(a.map(a=>(0,P.GQ)(a)).filter(a=>a.length>=2&&!W(a)))]}function ae(a){return["## 目录","",...a.flatMap((a,b)=>{let c=ad(a.sections||[]);return[(0,P.tb)(b,a.title),"",...c.flatMap((a,c)=>[` ${function(a,b,c){let d=(0,P.GQ)(c);return!function(a){let b=/^\s*(\d+)\.(\d+)[..、]?\s+(.+)$/u.exec(a);return!!b&&(0,P.GQ)(b[3]||"").trim()===(0,P.GQ)(a).trim()}(c)?`${a+1}.${b+1} ${d}`:d}(b,c,a)}`,""])]})].join("\n")}function af(a){return a.replace(/<div class="document-cover">[\s\S]*?<\/div>\s*(?:<div class="page-break"><\/div>\s*)?/giu,"").replace(/^#\s+.+\n{1,2}/u,"")}function ag(a){return a.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+第[一二三四五六七八九十百千万\d]+章|\n##\s+)/gmu,"").replace(/^<div class="page-break"><\/div>\s*(?=##\s+第[一二三四五六七八九十百千万\d]+章)/gmu,"")}function ah(a){let b=!1;return a.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+)/gmu,a=>b?"":(b=!0,a)).replace(/\n{3,}/gu,"\n\n").trim()}function ai(a,b){let c=ah(a);b.forEach((a,b)=>{let d=(0,P.GQ)(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${al(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${(0,P.tb)(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0,g=0,h="",i=new Set,j=a=>{let c=b[e]?.sections||[],d=an(a);return c.findIndex(a=>an(a)===d)},k=(a,c)=>{let d=(0,P.GQ)(a);if(W(d))return"";let k=j(d),l=b[e]?.sections||[];if(l.length>0&&k<0)return f||(f=1,h=`${e+1}.1`),(g+=1)<=4?`#### ${e+1}.${f}.${g} ${d}`:`**${d}**`;let m=k>=0?k+1:f+1,n=k>=0?an(l[k]):an(d);return i.has(n)?(f=m,h=c||`${e+1}.${f}`,g+=1,`#### ${e+1}.${f}.${g} ${d}`):(f=m,g=0,h=c||`${e+1}.${f}`,i.add(n),`### ${e+1}.${f} ${k>=0?(0,P.GQ)(l[k]):d}`)},l=!1;return d.map(a=>{let c=a.trim();if(/^##\s+目录\s*$/u.test(c))return l=!0,a;if(l&&/^<div class="page-break"><\/div>$/u.test(c))return l=!1,a;if(l)return a;if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(c))return e+=1,f=0,g=0,h="",i=new Set,a;let d=/^##\s+\d+[..、]\s+(.+)$/u.exec(c);if(e>=0&&d)return k(d[1]||"");let m=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(c);if(e>=0&&m)return k(m[3]||"",`${m[1]}.${m[2]}`);let n=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&n)return k(n[3]||"",n[1]&&n[2]?`${n[1]}.${n[2]}`:void 0);let o=/^####\s+(\d+)\.(\d+)(?!\.)\s+(.+)$/u.exec(c);if(e>=0&&o)return k(o[3]||"",`${o[1]}.${o[2]}`);let p=/^####\s+(?:(\d+)\.(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&p){let a=p[1]&&p[2]?`${p[1]}.${p[2]}`:h,c=(0,P.GQ)(p[4]||""),d=an(c),l=j(c)>=0&&!i.has(d);return!f||a&&a!==h&&(0===(b[e]?.sections||[]).length||l)?k(c,a):(g+=1)<=4?`#### ${e+1}.${f}.${g} ${c}`:`**${c}**`}return a}).filter(a=>""!==a).join("\n")}function aj(a,b){let c=a.replace(/知识库|提示词|绑定片段|后台|资料库|OCR|联网增强|联网检索|网页资料|搜索结果|根据网页|互联网资料|在线资料|浏览器|搜索引擎/giu,"项目资料").replace(/建议补充/gu,"需完善").replace(/\b兜底\b|兜底生成|兜底片段/gu,"补充完善").replace(/施工方(?!法|案|式|针|向)/gu,"我公司").replace(/投标人/gu,"我公司").replace(/高度重视/gu,"严格落实").replace(/重中之重/gu,"关键控制事项");for(let a of b?.forbiddenTerms||[])a&&/^(?:工程造价|造价|报价|投标报价|报价明细|综合单价|单价|合价|金额|税率|增值税|利润|预留金|暂列金额|报价明细表|最高投标限价|招标控制价)$/u.test(a)&&(c=c.split(/\r?\n/u).filter(b=>!RegExp(al(a),"u").test(b)).join("\n"));return c}function ak(a,b){if(!b)return aj(a);let c=function(a,b){let c=a;for(let a of b?.requiredTables||[])c=function(a,b){if(/项目基本信息/u.test(b)&&(/项目基本信息/u.test(a)||/\|\s*信息项\s*\|\s*内容\s*\|/u.test(a)||/\|\s*项目名称\s*\|[^\n]*(?:徽光阁|项目施工|工程)/u.test(a))||RegExp(al(b),"u").test(a))return a;let c=/项目基本信息/u.test(b)?"":`**${b}**
20
20
 
21
21
  | 项目 | 内容 | 数据口径 | 备注 |
22
22
  |---|---|---|---|
@@ -26,7 +26,7 @@ ${c}`;let g=e.find(a=>(a.index||0)>(f.index||0)),h=g?.index??a.length;return`${a
26
26
 
27
27
  ${c}
28
28
 
29
- ${a.slice(h).trimStart()}`}(c,a);return c}(a,b);for(let a of(b.forbidCover&&(c=ac(c)),b.forbidToc&&(c=ad(c)),b.preferredTerms||[]))if(a.from&&a.from!==a.to){if("施工方"===a.from){c=c.replace(/施工方(?!法|案|式|针|向)/gu,a.to);continue}c=c.replace(RegExp(ai(a.from),"gu"),a.to)}return(c=ag(c,b)).replace(/\n{3,}/gu,"\n\n").trim()}function ai(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function aj(a){return/\|[^\n]+\|\s*\n\s*\|\s*:?-{3,}:?\s*\|/u.test(a)}function ak(a){return(0,P.GQ)(a.replace(/^\s*\d+(?:\.\d+)*(?:[..、]|\s)+/u,"")).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").replace(/[()]/gu,a=>"("===a?"(":")").replace(/[\s::.。;;,,、]+$/gu,"").replace(/的(?=保障体系|管理体系|控制体系|措施|方案|计划|要求)/gu,"").replace(/[\s()()::.。;;,,、-]/gu,"").trim()}function al(a,b){if(!b)return[];let c=[],d=[...a.matchAll(U)].map(a=>(a[0]||"").replace(/^#{2,6}\s+/u,"").trim()).filter(Boolean);d.length>0&&c.push({level:"error",message:`正文存在疑似提示词指令标题:${d.slice(0,5).join("、")}`,suggestion:"请删除或改写为正式施工组织设计小节标题。"});let e=/document-cover|^#\s+/mu.test(a),f=/^##\s+目录\s*$/mu.test(a);"required"!==b.coverPolicy||e||c.push({level:"error",message:"正文缺少提示词要求的封面",suggestion:"用户明确要求封面时,应保留封面内容。"}),"required"!==b.tocPolicy||f||c.push({level:"error",message:"正文缺少提示词要求的目录",suggestion:"用户明确要求目录时,应基于最终合法正文标题生成目录。"}),b.forbidCover&&e&&c.push({level:"error",message:"正文残留封面内容",suggestion:"总控提示词禁止封面时,正式正文必须直接进入第一章。"}),b.forbidToc&&f&&c.push({level:"error",message:"正文残留目录内容",suggestion:"总控提示词禁止目录时,正式正文不得生成目录或导航页。"});let g=(b.requiredTables||[]).filter(b=>!RegExp(ai(b),"u").test(a)||!function(a,b){let c=a.search(RegExp(ai(b),"u"));return!(c<0)&&aj(a.slice(c,Math.min(a.length,c+1600)))}(a,b));g.length>0&&c.push({level:"error",message:`正文缺少总控提示词要求的正式表格:${g.join("、")}`,suggestion:"请在对应章节补齐表名、表头、分隔线和数据行,不得只写表名或空表。"});let h=(b.requiredKeywords||[]).filter(b=>b&&!RegExp(ai(b),"u").test(a));h.length>0&&c.push({level:"warning",message:`正文缺少提示词要求覆盖的关键词:${h.join("、")}`,suggestion:"请在相关章节自然补齐这些要点,避免堆砌关键词。"});let i=(b.forbiddenPatterns||[]).filter(b=>b&&RegExp(ai(b),"u").test(a));i.length>0&&c.push({level:"warning",message:`正文出现提示词禁止内容:${i.join("、")}`,suggestion:"请删除或替换为正式交付表述。"});let j=(b.forbiddenTerms||[]).filter(b=>b&&RegExp(ai(b),"u").test(a));j.length>0&&c.push({level:"warning",message:`正文残留总控提示词禁止词:${j.join("、")}`,suggestion:"请改为正式交付语言,删除后台话术、第三人称和口号式表达。"});let k=b.exactHeadings||[];if(k.length>0){let d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>(0,P.GQ)(a[1]||"")).filter(a=>"目录"!==a||"required"!==b.tocPolicy),e=k.map(P.GQ),f=k.filter(a=>!d.includes((0,P.GQ)(a))),g=b.forbidExtraHeadings?d.filter(a=>!e.includes((0,P.GQ)(a))):[];f.length>0&&c.push({level:"error",message:`正文缺少提示词指定一级章节:${f.join("、")}`,suggestion:"请严格按用户提示词 OUTLINE 输出一级章节。"}),g.length>0&&c.push({level:"error",message:`正文出现提示词未允许的一级章节:${g.join("、")}`,suggestion:"请删除或并入指定一级章节,不得新增一级章节。"})}let l=(b.forbiddenSubjects||[]).filter(b=>b&&RegExp(ai(b),"u").test(a));l.length>0&&c.push({level:"warning",message:`正文残留禁用主体表达:${l.join("、")}`,suggestion:"请统一改为用户提示词指定的表达主体。"});let m=a.replace(/\s/gu,"").length;return b.minChars&&m<b.minChars&&c.push({level:"warning",message:`正文长度低于提示词要求:当前 ${m} 字,要求不少于 ${b.minChars} 字`,suggestion:"请按章节深度扩写,但不得编造资料外事实。"}),c}function am(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=(0,P.YZ)(b),d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>({index:a.index||0,raw:a[0],title:(0,P.YZ)(a[1]||"")})),e=d.find(a=>a.title===c);if(!e)return;let f=d.find(a=>a.index>e.index&&a.title!==c),g=e.index+e.raw.length,h=f?.index??a.length;return{start:e.index,end:h,heading:e.raw,body:a.slice(g,h)}}(a,d.title);if(!b){c.push({level:"error",message:`${d.title} 正文缺少章节标题`,suggestion:"请重新生成,确保模板章节完整输出。"});continue}let e=b.heading+b.body,f=(d.sections||[]).filter(a=>!function(a,b){let c=ak(b);return a.split(/\r?\n/u).some(a=>{let b=/^#{2,4}\s+(.+)$/u.exec(a.trim());return!!b&&ak(b[1]||"")===c})}(e,a));f.length>0&&c.push({level:"error",message:`${d.title} 正文缺少规划小节:${f.join("、")}`,suggestion:"请重新生成或检查审查阶段是否删除了二级小节。"}),d.tableSections?.length&&!aj(e)&&c.push({level:"error",message:`${d.title} 缺少必要的正式表格`,suggestion:"请按模板 tableSections/tableRequirements 在对应小节补充正式 Markdown 表格。"})}return c}function an(a){let b=[...a.matchAll(/^##\s+.+$/gmu)];if(0===b.length)return a;let c=a.slice(0,b[0].index||0);for(let d=0;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f),h=[...g.matchAll(/^###\s+(\d+)\.(\d+)\s+.+$/gmu)];if(h.length<2){c+=g;continue}let i=h[0].index||0;c+=g.slice(0,i)+h.map((a,b)=>{let c=a.index||0,d=h[b+1]?.index??g.length;return{order:Number(a[2]||b+1),content:g.slice(c,d).trim()}}).sort((a,b)=>a.order-b.order).map(a=>a.content).join("\n\n")+"\n\n"}return c.replace(/\n{3,}/gu,"\n\n").trim()}function ao(a,b,c={}){let d=ah(Q(a,!!c.forbidDrawingImages),c.promptRules),e=an(_(V(c.promptRules?"required"===c.promptRules.coverPolicy?"required"===c.promptRules.tocPolicy?d:ad(d):"required"===c.promptRules.tocPolicy?ac(d):ac(ad(d)):d))),f=function(a,b){let c=af(ae(ad(a)),b),d=[...c.matchAll(/^##\s+(.+)$/gmu)];return b.map((a,e)=>{let f=(0,P.tb)(e,a.title),g=d.find(b=>Z(b[1]||"",a.title)||Z(b[1]||"",f));if(!g||void 0===g.index)return a.sections||[];let h=d.find(a=>(a.index||0)>(g.index||0)&&b.some(b=>Z(a[1]||"",b.title))),i=a.sections||[];if(i.length>0)return i;let j=$(c.slice(g.index,h?.index??c.length));return j.length>0?j.slice(0,6):[]})}(e,b),g=b.map((a,b)=>({...a,sections:f[b]?.length?f[b]:a.sections||[]}));return{markdown:ah(an(_(V(c.promptRules?.tocPolicy==="required"?function(a,b){let c=af(a,b),d=ad(c),e=[...d.matchAll(/^##\s+(.+)$/gmu)],f=ab(b.map(a=>{if(a.sections?.length)return a;let c=e.find(b=>Z(b[1]||"",a.title));if(!c||void 0===c.index)return a;let f=e.find(a=>(a.index||0)>(c.index||0)&&b.some(b=>Z(a[1]||"",b.title))),g=$(d.slice(c.index,f?.index??d.length)).slice(0,8);return g.length?{...a,sections:g}:a})),g=/^##\s+目录\s*$/mu.exec(c);if(g?.index!==void 0){let a=g.index+g[0].length,b=c.slice(a).search(/\n##\s+第[一二三四五六七八九十百千万\d]+章/u),d=[...c.slice(a).matchAll(/\n<div class="page-break"><\/div>/gu)],e=d[0]?.index??(b>=0?b:c.length-a),h=a+e;return`${c.slice(0,g.index)}${f.trim()}${c.slice(h)}`.replace(/\n{3,}/gu,"\n\n")}let h='<div class="page-break"></div>',i=c.indexOf(h);if(i>=0){let a=i+h.length;return`${c.slice(0,a)}
29
+ ${a.slice(h).trimStart()}`}(c,a);return c}(a,b);for(let a of(b.forbidCover&&(c=af(c)),b.forbidToc&&(c=ag(c)),b.preferredTerms||[]))if(a.from&&a.from!==a.to){if("施工方"===a.from){c=c.replace(/施工方(?!法|案|式|针|向)/gu,a.to);continue}c=c.replace(RegExp(al(a.from),"gu"),a.to)}return(c=aj(c,b)).replace(/\n{3,}/gu,"\n\n").trim()}function al(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function am(a){return/\|[^\n]+\|\s*\n\s*\|\s*:?-{3,}:?\s*\|/u.test(a)}function an(a){return(0,P.GQ)(a.replace(/^\s*\d+(?:\.\d+)*(?:[..、]|\s)+/u,"")).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分]\s*/u,"").replace(/[()]/gu,a=>"("===a?"(":")").replace(/[\s::.。;;,,、]+$/gu,"").replace(/的(?=保障体系|管理体系|控制体系|措施|方案|计划|要求)/gu,"").replace(/[\s()()::.。;;,,、-]/gu,"").trim()}function ao(a,b){if(!b)return[];let c=[],d=[...a.matchAll(U)].map(a=>(a[0]||"").replace(/^#{2,6}\s+/u,"").trim()).filter(Boolean);d.length>0&&c.push({level:"error",message:`正文存在疑似提示词指令标题:${d.slice(0,5).join("、")}`,suggestion:"请删除或改写为正式施工组织设计小节标题。"});let e=/document-cover|^#\s+/mu.test(a),f=/^##\s+目录\s*$/mu.test(a);"required"!==b.coverPolicy||e||c.push({level:"error",message:"正文缺少提示词要求的封面",suggestion:"用户明确要求封面时,应保留封面内容。"}),"required"!==b.tocPolicy||f||c.push({level:"error",message:"正文缺少提示词要求的目录",suggestion:"用户明确要求目录时,应基于最终合法正文标题生成目录。"}),b.forbidCover&&e&&c.push({level:"error",message:"正文残留封面内容",suggestion:"总控提示词禁止封面时,正式正文必须直接进入第一章。"}),b.forbidToc&&f&&c.push({level:"error",message:"正文残留目录内容",suggestion:"总控提示词禁止目录时,正式正文不得生成目录或导航页。"});let g=(b.requiredTables||[]).filter(b=>!RegExp(al(b),"u").test(a)||!function(a,b){let c=a.search(RegExp(al(b),"u"));return!(c<0)&&am(a.slice(c,Math.min(a.length,c+1600)))}(a,b));g.length>0&&c.push({level:"error",message:`正文缺少总控提示词要求的正式表格:${g.join("、")}`,suggestion:"请在对应章节补齐表名、表头、分隔线和数据行,不得只写表名或空表。"});let h=(b.requiredKeywords||[]).filter(b=>b&&!RegExp(al(b),"u").test(a));h.length>0&&c.push({level:"warning",message:`正文缺少提示词要求覆盖的关键词:${h.join("、")}`,suggestion:"请在相关章节自然补齐这些要点,避免堆砌关键词。"});let i=(b.forbiddenPatterns||[]).filter(b=>b&&RegExp(al(b),"u").test(a));i.length>0&&c.push({level:"warning",message:`正文出现提示词禁止内容:${i.join("、")}`,suggestion:"请删除或替换为正式交付表述。"});let j=(b.forbiddenTerms||[]).filter(b=>b&&RegExp(al(b),"u").test(a));j.length>0&&c.push({level:"warning",message:`正文残留总控提示词禁止词:${j.join("、")}`,suggestion:"请改为正式交付语言,删除后台话术、第三人称和口号式表达。"});let k=b.exactHeadings||[];if(k.length>0){let d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>(0,P.GQ)(a[1]||"")).filter(a=>"目录"!==a||"required"!==b.tocPolicy),e=k.map(P.GQ),f=k.filter(a=>!d.includes((0,P.GQ)(a))),g=b.forbidExtraHeadings?d.filter(a=>!e.includes((0,P.GQ)(a))):[];f.length>0&&c.push({level:"error",message:`正文缺少提示词指定一级章节:${f.join("、")}`,suggestion:"请严格按用户提示词 OUTLINE 输出一级章节。"}),g.length>0&&c.push({level:"error",message:`正文出现提示词未允许的一级章节:${g.join("、")}`,suggestion:"请删除或并入指定一级章节,不得新增一级章节。"})}let l=(b.forbiddenSubjects||[]).filter(b=>b&&RegExp(al(b),"u").test(a));l.length>0&&c.push({level:"warning",message:`正文残留禁用主体表达:${l.join("、")}`,suggestion:"请统一改为用户提示词指定的表达主体。"});let m=a.replace(/\s/gu,"").length;return b.minChars&&m<b.minChars&&c.push({level:"warning",message:`正文长度低于提示词要求:当前 ${m} 字,要求不少于 ${b.minChars} 字`,suggestion:"请按章节深度扩写,但不得编造资料外事实。"}),c}function ap(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=(0,P.YZ)(b),d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>({index:a.index||0,raw:a[0],title:(0,P.YZ)(a[1]||"")})),e=d.find(a=>a.title===c);if(!e)return;let f=d.find(a=>a.index>e.index&&a.title!==c),g=e.index+e.raw.length,h=f?.index??a.length;return{start:e.index,end:h,heading:e.raw,body:a.slice(g,h)}}(a,d.title);if(!b){c.push({level:"error",message:`${d.title} 正文缺少章节标题`,suggestion:"请重新生成,确保模板章节完整输出。"});continue}let e=b.heading+b.body,f=(d.sections||[]).filter(a=>!function(a,b){let c=an(b);return a.split(/\r?\n/u).some(a=>{let b=/^#{2,4}\s+(.+)$/u.exec(a.trim());return!!b&&an(b[1]||"")===c})}(e,a));f.length>0&&c.push({level:"error",message:`${d.title} 正文缺少规划小节:${f.join("、")}`,suggestion:"请重新生成或检查审查阶段是否删除了二级小节。"}),d.tableSections?.length&&!am(e)&&c.push({level:"error",message:`${d.title} 缺少必要的正式表格`,suggestion:"请按模板 tableSections/tableRequirements 在对应小节补充正式 Markdown 表格。"})}return c}function aq(a){let b=[...a.matchAll(/^##\s+.+$/gmu)];if(0===b.length)return a;let c=a.slice(0,b[0].index||0);for(let d=0;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f),h=[...g.matchAll(/^###\s+(\d+)\.(\d+)\s+.+$/gmu)];if(h.length<2){c+=g;continue}let i=h[0].index||0;c+=g.slice(0,i)+h.map((a,b)=>{let c=a.index||0,d=h[b+1]?.index??g.length;return{order:Number(a[2]||b+1),content:g.slice(c,d).trim()}}).sort((a,b)=>a.order-b.order).map(a=>a.content).join("\n\n")+"\n\n"}return c.replace(/\n{3,}/gu,"\n\n").trim()}function ar(a,b,c={}){let d=ak(Q(a,!!c.forbidDrawingImages),c.promptRules),e=aq(ab(X(c.promptRules?"required"===c.promptRules.coverPolicy?"required"===c.promptRules.tocPolicy?d:ag(d):"required"===c.promptRules.tocPolicy?af(d):af(ag(d)):d))),f=function(a,b){let c=ai(ah(ag(a)),b),d=[...c.matchAll(/^##\s+(.+)$/gmu)];return b.map((a,e)=>{let f=(0,P.tb)(e,a.title),g=d.find(b=>_(b[1]||"",a.title)||_(b[1]||"",f));if(!g||void 0===g.index)return a.sections||[];let h=d.find(a=>(a.index||0)>(g.index||0)&&b.some(b=>_(a[1]||"",b.title))),i=a.sections||[];if(i.length>0)return i;let j=aa(c.slice(g.index,h?.index??c.length));return j.length>0?j.slice(0,6):[]})}(e,b),g=b.map((a,b)=>({...a,sections:f[b]?.length?f[b]:a.sections||[]}));return{markdown:ak(aq(ab(X(c.promptRules?.tocPolicy==="required"?function(a,b){let c=ai(a,b),d=ag(c),e=[...d.matchAll(/^##\s+(.+)$/gmu)],f=ae(b.map(a=>{if(a.sections?.length)return a;let c=e.find(b=>_(b[1]||"",a.title));if(!c||void 0===c.index)return a;let f=e.find(a=>(a.index||0)>(c.index||0)&&b.some(b=>_(a[1]||"",b.title))),g=aa(d.slice(c.index,f?.index??d.length)).slice(0,8);return g.length?{...a,sections:g}:a})),g=/^##\s+目录\s*$/mu.exec(c);if(g?.index!==void 0){let a=g.index+g[0].length,b=c.slice(a).search(/\n##\s+第[一二三四五六七八九十百千万\d]+章/u),d=[...c.slice(a).matchAll(/\n<div class="page-break"><\/div>/gu)],e=d[0]?.index??(b>=0?b:c.length-a),h=a+e;return`${c.slice(0,g.index)}${f.trim()}${c.slice(h)}`.replace(/\n{3,}/gu,"\n\n")}let h='<div class="page-break"></div>',i=c.indexOf(h);if(i>=0){let a=i+h.length;return`${c.slice(0,a)}
30
30
 
31
31
  ${f}
32
32
 
@@ -36,20 +36,20 @@ ${c.slice(a).trimStart()}`}return`${f}
36
36
 
37
37
  <div class="page-break"></div>
38
38
 
39
- ${c}`}(e,g):af(e,g)))),c.promptRules),chapters:g}}function ap(a,b={}){let c=a.chapters.map((a,b)=>(function(a,b){let c=`## ${(0,P.tb)(b,a.title)}`,d=V(a.content);var e=/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
39
+ ${c}`}(e,g):ai(e,g)))),c.promptRules),chapters:g}}function as(a,b={}){let c=a.chapters.map(a=>({...a,sections:ad(a.sections||[])})),d=c.map((a,b)=>(function(a,b){let c=`## ${(0,P.tb)(b,a.title)}`,d=X(a.content);var e=/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
40
40
 
41
- ${d}`,f=a.title;let g=e.split(/\r?\n/u),h=!1;return g.filter((a,b)=>{let d=a.trim(),e=/^##\s+(.+)$/u.exec(a.trim())?.[1]||"";if(e){if(Z(e,c))return!h&&(h=!0,!0);if(b>0&&Z(e,f))return!1}return!(d&&!/^#{1,6}\s+/u.test(d)&&Z(d,f))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()})(a,b)),d=c.filter(Boolean).join("\n\n"),e=a.chapters.map((a,b)=>{if(a.sections?.length)return a;let d=$(af(c[b]||"",[a])).slice(0,8);return d.length?{...a,sections:d}:a});return ao(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',ab(e),'\n<div class="page-break"></div>\n',d].join("\n"),a.chapters,b).markdown}var aq=c(78217),ar=c(23760),as=c(73024),at=c(15751),au=c(95393),av=c(96770);function aw(a){return(0,B.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function ax(a){return Array.isArray(a)?a.map(a=>String(a||"").trim()).filter(Boolean):"string"==typeof a&&a.trim()?[a.trim()]:[]}function ay(a){return Array.isArray(a)?a.filter(a=>a&&"object"==typeof a):a&&"object"==typeof a?[a]:[]}function az(a,b){return a.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/giu,"-").replace(/^-|-$/gu,"").slice(0,48)||b}function aA(a){if(null==a)return"";if("string"==typeof a)return a;if("number"==typeof a||"boolean"==typeof a)return String(a);try{return JSON.stringify(a)}catch{return String(a)}}function aB(a){if(a?.aborted)throw Error("用户中止")}let aC=new Map,aD=0;function aE(){let a=process.env.DOCUMENT_LLM_CONCURRENCY;if(!a?.trim())return;let b=Number(a);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}let aF=aE(),aG=0,aH=[];function aI(){return aF??0}function aJ(a,b){let c=(0,av.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function aK(){let a=(0,h.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}function aL(a,b){let c=aE(),d=aF;if(void 0===c||void 0===aF){aG=a?0:aG+1,b&&(b.llm.currentLimit=0);return}a?(aG=0,0===aH.length&&aF<c&&(aF+=1)):(aG+=1)>=2&&(aF=Math.max(1,aF-1)),b&&(b.llm.currentLimit=aF,d!==aF&&(b.llm.limitAdjustments+=1))}async function aM(a,b,c){for(;void 0!==aF&&aD>=aF;){let a=Date.now();if(c&&(c.llm.throttledWaits+=1),b?.aborted)throw Error("用户中止");await new Promise((a,c)=>{let d={resolve:a,reject:c,active:!0,signal:b};d.onAbort=()=>{if(!d.active)return;d.active=!1;let a=aH.indexOf(d);a>=0&&aH.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),aH.push(d)}),c&&(c.llm.throttledWaitMs+=Date.now()-a)}aD+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,aD));try{let b=await a();return aL(!0,c),b}catch(a){throw aL(!1,c),a}finally{for(aD=Math.max(0,aD-1);aH.length>0;){let a=aH.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function aN(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=aK();if(!e)return;let{model:f,provider:g}=e,h=aw({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?aw(g.apiKey):""}),i=aC.get(h);i||(i=(0,au.createProvider)(aJ(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aC.set(h,i));let j=Math.max(3e4,Number(d.timeoutMs??process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await aM(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),j)}),h=[i.chat([{role:"system",content:c?`${a}
42
- 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal}),g];return d.signal&&h.push(new Promise((a,b)=>{if(d.signal?.aborted)return void b(Error("用户中止"));f=()=>b(Error("用户中止")),d.signal?.addEventListener("abort",f,{once:!0})})),Promise.race(h).finally(()=>{e&&clearTimeout(e),f&&d.signal?.removeEventListener("abort",f)})},d.signal,d.diagnostics)).content.trim()}catch(a){if(d.diagnostics&&(d.diagnostics.llm.failures+=1),d.signal?.aborted)throw Error("用户中止",{cause:a});return}}async function aO(a,b,c){let d,e=new AbortController;if(c?.aborted)throw Error("用户中止");let f=()=>e.abort();c?.addEventListener("abort",f,{once:!0});let g=new Promise(a=>{d=setTimeout(()=>{e.abort(),a(null)},b)}),h=[Promise.resolve().then(()=>a(e.signal)),g];c&&h.push(new Promise((a,b)=>{e.signal.addEventListener("abort",()=>{c.aborted&&b(Error("用户中止"))},{once:!0})}));try{let a=await Promise.race(h);if(c?.aborted)throw Error("用户中止");return a}finally{d&&clearTimeout(d),c?.removeEventListener("abort",f)}}async function aP(a,b,c={}){let d=await aN(a,b,!0,{maxTokens:c.maxTokens,temperature:c.temperature,signal:c.signal,diagnostics:c.diagnostics,timeoutMs:c.timeoutMs});if(d)try{return JSON.parse(function(a){let b=a.trim(),c=b.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/iu)?.[1]?.trim();if(c)return c;let d=b.indexOf("{"),e=b.lastIndexOf("}"),f=b.indexOf("["),g=b.lastIndexOf("]"),h=d>=0&&e>d?b.slice(d,e+1):"",i=f>=0&&g>f?b.slice(f,g+1):"";return h&&(!i||d<=f)?h:i||b}(d))}catch{return}}function aQ(a){let b=[],c=new Set;for(let d of a.filter(a=>"table"===a.processingType)){if(c.has(d.filePath))continue;c.add(d.filePath);let a=(0,g.aY)(),f=e.isAbsolute(d.filePath)?d.filePath:as.existsSync(e.join(a,"knowledgeBase",d.filePath))?e.join(a,"knowledgeBase",d.filePath):e.join(a,d.filePath),h=e.extname(d.filePath).toLowerCase();if(as.existsSync(f)&&[".xlsx",".xls",".csv"].includes(h))try{let a=at.readFile(f,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let e=a.Sheets[c],f=at.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let g=f.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=f[g].filter(Boolean),i=f.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:d.roleId||"table",sheet:c,headers:h,rows:i,sourceFile:d.filePath,sourceRange:e["!ref"]})}continue}catch{}let i=d.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(i.length<2)continue;let j=i[0].includes("|")?"|":i[0].includes(" ")?" ":",",k=i.map(a=>a.split(j).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);k.length<2||b.push({tableType:d.roleId||"table",headers:k[0],rows:k.slice(1),sourceFile:d.filePath,sourceRange:d.sectionTitle})}return b}function aR(a,b,c){let d=(0,D.Uy)(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!(0,D.I2)(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ")],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}async function aS(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_CHARS??45e3))),h=Math.max(8,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_ITEMS??48))),i=0,j=[];for(let b of a.slice(0,h)){let a=aA(b.content).replace(/\s+/gu," ").slice(0,Math.max(800,Math.floor(g/h))),c=`文件:${b.filePath}
41
+ ${d}`,f=a.title;let g=e.split(/\r?\n/u),h=!1;return g.filter((a,b)=>{let d=a.trim(),e=/^##\s+(.+)$/u.exec(a.trim())?.[1]||"";if(e){if(_(e,c))return!h&&(h=!0,!0);if(b>0&&_(e,f))return!1}return!(d&&!/^#{1,6}\s+/u.test(d)&&_(d,f))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()})(a,b)),e=d.filter(Boolean).join("\n\n"),f=c.map((a,b)=>{if(a.sections?.length)return a;let c=aa(ai(d[b]||"",[a])).slice(0,8);return c.length?{...a,sections:ad(c)}:a});return ar(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',ae(f),'\n<div class="page-break"></div>\n',e].join("\n"),c,b).markdown}var at=c(78217),au=c(23760),av=c(73024),aw=c(15751),ax=c(95393),ay=c(96770);function az(a){return(0,B.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function aA(a){return Array.isArray(a)?a.map(a=>String(a||"").trim()).filter(Boolean):"string"==typeof a&&a.trim()?[a.trim()]:[]}function aB(a){return Array.isArray(a)?a.filter(a=>a&&"object"==typeof a):a&&"object"==typeof a?[a]:[]}function aC(a,b){return a.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/giu,"-").replace(/^-|-$/gu,"").slice(0,48)||b}function aD(a){if(null==a)return"";if("string"==typeof a)return a;if("number"==typeof a||"boolean"==typeof a)return String(a);try{return JSON.stringify(a)}catch{return String(a)}}function aE(a){if(a?.aborted)throw Error("用户中止")}let aF=new Map,aG=0;function aH(){let a=process.env.DOCUMENT_LLM_CONCURRENCY;if(!a?.trim())return;let b=Number(a);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}let aI=aH(),aJ=0,aK=[];function aL(){return aI??0}function aM(a,b){let c=(0,ay.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function aN(){let a=(0,h.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}function aO(a,b){let c=aH(),d=aI;if(void 0===c||void 0===aI){aJ=a?0:aJ+1,b&&(b.llm.currentLimit=0);return}a?(aJ=0,0===aK.length&&aI<c&&(aI+=1)):(aJ+=1)>=2&&(aI=Math.max(1,aI-1)),b&&(b.llm.currentLimit=aI,d!==aI&&(b.llm.limitAdjustments+=1))}async function aP(a,b,c){for(;void 0!==aI&&aG>=aI;){let a=Date.now();if(c&&(c.llm.throttledWaits+=1),b?.aborted)throw Error("用户中止");await new Promise((a,c)=>{let d={resolve:a,reject:c,active:!0,signal:b};d.onAbort=()=>{if(!d.active)return;d.active=!1;let a=aK.indexOf(d);a>=0&&aK.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),aK.push(d)}),c&&(c.llm.throttledWaitMs+=Date.now()-a)}aG+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,aG));try{let b=await a();return aO(!0,c),b}catch(a){throw aO(!1,c),a}finally{for(aG=Math.max(0,aG-1);aK.length>0;){let a=aK.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function aQ(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=aN();if(!e)return;let{model:f,provider:g}=e,h=az({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?az(g.apiKey):""}),i=aF.get(h);i||(i=(0,ax.createProvider)(aM(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aF.set(h,i));let j=Math.max(3e4,Number(d.timeoutMs??process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await aP(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),j)}),h=[i.chat([{role:"system",content:c?`${a}
42
+ 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal}),g];return d.signal&&h.push(new Promise((a,b)=>{if(d.signal?.aborted)return void b(Error("用户中止"));f=()=>b(Error("用户中止")),d.signal?.addEventListener("abort",f,{once:!0})})),Promise.race(h).finally(()=>{e&&clearTimeout(e),f&&d.signal?.removeEventListener("abort",f)})},d.signal,d.diagnostics)).content.trim()}catch(a){if(d.diagnostics&&(d.diagnostics.llm.failures+=1),d.signal?.aborted)throw Error("用户中止",{cause:a});return}}async function aR(a,b,c){let d,e=new AbortController;if(c?.aborted)throw Error("用户中止");let f=()=>e.abort();c?.addEventListener("abort",f,{once:!0});let g=new Promise(a=>{d=setTimeout(()=>{e.abort(),a(null)},b)}),h=[Promise.resolve().then(()=>a(e.signal)),g];c&&h.push(new Promise((a,b)=>{e.signal.addEventListener("abort",()=>{c.aborted&&b(Error("用户中止"))},{once:!0})}));try{let a=await Promise.race(h);if(c?.aborted)throw Error("用户中止");return a}finally{d&&clearTimeout(d),c?.removeEventListener("abort",f)}}async function aS(a,b,c={}){let d=await aQ(a,b,!0,{maxTokens:c.maxTokens,temperature:c.temperature,signal:c.signal,diagnostics:c.diagnostics,timeoutMs:c.timeoutMs});if(d)try{return JSON.parse(function(a){let b=a.trim(),c=b.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/iu)?.[1]?.trim();if(c)return c;let d=b.indexOf("{"),e=b.lastIndexOf("}"),f=b.indexOf("["),g=b.lastIndexOf("]"),h=d>=0&&e>d?b.slice(d,e+1):"",i=f>=0&&g>f?b.slice(f,g+1):"";return h&&(!i||d<=f)?h:i||b}(d))}catch{return}}function aT(a){let b=[],c=new Set;for(let d of a.filter(a=>"table"===a.processingType)){if(c.has(d.filePath))continue;c.add(d.filePath);let a=(0,g.aY)(),f=e.isAbsolute(d.filePath)?d.filePath:av.existsSync(e.join(a,"knowledgeBase",d.filePath))?e.join(a,"knowledgeBase",d.filePath):e.join(a,d.filePath),h=e.extname(d.filePath).toLowerCase();if(av.existsSync(f)&&[".xlsx",".xls",".csv"].includes(h))try{let a=aw.readFile(f,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let e=a.Sheets[c],f=aw.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let g=f.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=f[g].filter(Boolean),i=f.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:d.roleId||"table",sheet:c,headers:h,rows:i,sourceFile:d.filePath,sourceRange:e["!ref"]})}continue}catch{}let i=d.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(i.length<2)continue;let j=i[0].includes("|")?"|":i[0].includes(" ")?" ":",",k=i.map(a=>a.split(j).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);k.length<2||b.push({tableType:d.roleId||"table",headers:k[0],rows:k.slice(1),sourceFile:d.filePath,sourceRange:d.sectionTitle})}return b}function aU(a,b,c){let d=(0,D.Uy)(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!(0,D.I2)(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ")],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}async function aV(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_CHARS??45e3))),h=Math.max(8,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_ITEMS??48))),i=0,j=[];for(let b of a.slice(0,h)){let a=aD(b.content).replace(/\s+/gu," ").slice(0,Math.max(800,Math.floor(g/h))),c=`文件:${b.filePath}
43
43
  角色:${b.roleId||""}
44
44
  处理:${b.processingType||""}
45
- 内容:${a}`;if(j.length>0&&i+c.length>g)break;i+=c.length,j.push(c)}let k=j.join("\n\n---\n\n");if(!k.trim())return{facts:[],stages:f};aB(e);let l=(0,D.Uy)(c,d),m=l.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),n=await aP(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
45
+ 内容:${a}`;if(j.length>0&&i+c.length>g)break;i+=c.length,j.push(c)}let k=j.join("\n\n---\n\n");if(!k.trim())return{facts:[],stages:f};aE(e);let l=(0,D.Uy)(c,d),m=l.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),n=await aS(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
46
46
  返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"reference","confidence":0.8}]}。
47
47
 
48
48
  动态事实 schema:
49
49
  ${m}
50
50
 
51
51
  资料:
52
- ${k}`,{signal:e});return(aB(e),n?.facts?.length)?{facts:n.facts.filter(a=>a.key&&a.value).map(a=>{let b=l.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:aA(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${n.facts.length} 条事实`}]}:{facts:[],stages:f}}let aT=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;function aU(a){return aA(a).replace(/[\u00A0\u2002-\u200B\u3000]/gu," ").replace(/([\p{Script=Han}])\s+([\p{Script=Han}])/gu,"$1$2").replace(/(\d)\s+(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/(合同|投资|工程|项目)\s*估\s*算\s*(?:价格|价)/gu,"$1估算价").replace(/计划\s*工\s*期/gu,"计划工期").replace(/合同\s*工\s*期/gu,"合同工期").replace(/质量\s*标\s*准/gu,"质量标准").replace(/建设\s*地\s*点/gu,"建设地点").replace(/建设\s*规\s*模/gu,"建设规模").replace(/招标\s*范\s*围/gu,"招标范围").replace(/最高\s*投\s*标\s*限\s*价/gu,"最高投标限价").replace(/招标\s*控\s*制\s*价/gu,"招标控制价").replace(/[::]\s*/gu,":").replace(/\s+/gu," ").trim()}let aV=[{fieldId:"project_name",key:"项目名称",fieldName:"项目名称",pattern:/(?:项目名称|工程名称|招标项目名称)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_code",key:"项目编号",fieldName:"项目编号",pattern:/(?:项目编号|招标项目编号|工程编号)[::\s为是]+([A-Za-z0-9\-_.()()]{4,80})/u},{fieldId:"owner",key:"招标人",fieldName:"招标人",pattern:/(?:招标人|建设单位|发包人)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_location",key:"建设地点",fieldName:"建设地点",pattern:/建设地点[::\s为是]+([^\n。;;]{2,100})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/建设规模[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"project_scope",key:"招标范围",fieldName:"招标范围",pattern:/招标范围[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"schedule_requirement",key:"计划工期",fieldName:"周期要求",pattern:/(?:(?:计划工期|合同工期|总工期)[::\s为是约]*|工期[::\s为是约]+)([^\n。;;]{0,40}?\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)(?:[^\n。;;]{0,30})?)/u},{fieldId:"quality_standard",key:"质量标准",fieldName:"质量标准",pattern:/质量标准[::\s为是]+([^\n。;;]{1,60})/u},{fieldId:"project_investment_estimate",key:"合同估算价格",fieldName:"项目投资估算",pattern:/(?:合同估算价格|合同估算价|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价)[::\s为是约]+([^\n。;;]{0,80}?\d+(?:\.\d+)?\s*(?:万元|元))/u}];function aW(a,b){let c=aU(aA(b));return!(!a||!c||c.length>260||/###|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应/u.test(c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c))&&("schedule_requirement"===a?c.length<=90&&/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(c):"quality_standard"===a?c.length<=40&&/合格|优良|一次性验收|国家.*验收|达到/u.test(c)&&!/工期|投标|技术标准/u.test(c):"owner"===a?c.length<=80&&!/将报|监督管理部门|投标人|中标/u.test(c):"project_location"===a?c.length<=120&&!/见招标公告|详见|投标/u.test(c):"project_code"===a?/^[A-Za-z0-9\-_.()()]+$/u.test(c):"project_investment_estimate"===a?c.length<=100&&/\d+(?:\.\d+)?\s*(?:万元|元)/u.test(c):c.length<=220)}function aX(a){let b=[],c=new Set;for(let d of a)for(let a of aU(d.content).split(/\r?\n/u).flatMap(a=>{let b=a.replace(/\s+/gu," ").trim();return b.length>260?b.split(/(?=\d+(?:\.\d+)?\s*[^\s::]{2,12}[::])/u):[b]}).filter(Boolean))if(!/报价明细|综合单价|税率|增值税|利润|结算/u.test(a)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))for(let e of aV){let f=e.pattern.exec(a),g=f?.[1]?.trim();if(!g||!aW(e.fieldId,g))continue;let h=`${d.filePath}:${e.fieldId}:${g}`;c.has(h)||(c.add(h),b.push({key:e.key,fieldName:e.fieldName,fieldId:e.fieldId,value:g,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:Math.max(.82,d.score||.82),sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle}}))}return b.slice(0,80)}function aY(a,b=l){let c=[],d=new Set;for(let e of a){let a=`${e.roleId||""} ${e.processingType||""} ${e.filePath} ${e.sectionTitle||""}`;if(!/drawing|table|bill|boq|draw|data|sheet|spec|standard|record|report|表格|数据|规格|参数|标准|记录|报告|清单|图纸|说明/u.test(a)&&e.score<.75)continue;let f=aA(e.content).replace(/\s+/gu," ");for(let a of f.matchAll(aT)){let g=a[0].trim();if(!g||o(b,g))continue;let h=Math.max(0,(a.index||0)-40),i=Math.min(f.length,(a.index||0)+g.length+40),j=f.slice(h,i);if(p(b,j)||q(b,j))continue;let k=`${e.filePath}:${g}`;d.has(k)||(d.add(k),c.push({key:"精确参数",fieldName:"技术参数",fieldId:"technical_parameter",value:g,sourceFile:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",confidence:Math.max(.7,e.score||.7),sourceRef:{filePath:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",sectionTitle:e.sectionTitle}}))}}return c.slice(0,240)}function aZ(a){return`${a.key} ${a.fieldName||""} ${a.value} ${a.roleId} ${a.processingType||""} ${a.sourceFile}`}function a$(a){return/合同估算价|合同估算价格|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价/u.test(a)}function a_(a){let b=aZ(a);return!a$(b)&&/投标保证金|发票类型|开标时间|公共资源交易监督管理|不良行为记录|投诉举报|资质投诉|投标承诺|违约金|中标服务费|交易平台|保证金账户|投标有效期|报价明细|投标报价|单价|合价|税率|增值税|利润|结算/u.test(b)}function a0(a){return aA(a).replace(/\s+/gu," ").trim()}function a1(a,b=[]){return[...new Set([a,...b,...a.split(/[\s、,。;;::/\\_-]+/u)].map(a0).filter(a=>a.length>=2))]}function a2(a,b,c){var d,e;let f=a0(c.label);if(!f||o(b,f)||p(b,f))return;let g=c.id||(d=c.source,e=c.fieldId,`${d}:${e||f}`.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-|-$/gu,"")||`${d}-${Math.random().toString(36).slice(2,8)}`),h=c.queries?.length?c.queries.map(a0).filter(Boolean):a1(f),i=a.find(a=>a.id===g||a.label===f);if(i){i.required=i.required||c.required,i.queries=[...new Set([...i.queries,...h])];return}a.push({...c,id:g,label:f,queries:h})}function a3(a,b,c,d,e,f=[]){"do_not_use"!==c.usagePolicy&&"diagnostic_only"!==c.usagePolicy&&"forbidden"!==c.derivationPolicy&&a2(a,b,{label:c.name,category:c.category,required:e,source:d,fieldId:c.id,queries:a1(c.name,[...c.aliases,...f])})}function a4(a){let b=new Set;return a.filter(a=>{let c=`${a.sourceFile}:${a.key}:${a.value}`;return!b.has(c)&&(b.add(c),!0)})}function a5(a){let b=a.profile||l,c=a4([...a.factsModel.factIndex.parameterFacts,...a.factsModel.factIndex.tableFacts,...a.factsModel.factIndex.drawingFacts,...a.factsModel.factIndex.billFacts,...a.factsModel.factIndex.reliableFacts]);return a.needs.map(d=>{let e=a4(c.filter(a=>(function(a,b,c){let d=aZ(a);if(a_(a)||o(c,d)||p(c,d))return!1;if(b.fieldId&&a.fieldId===b.fieldId||n(c,a.fieldName||a.key)?.id===b.fieldId||b.queries.filter(a=>a.length>=2).some(a=>d.includes(a)))return!0;let e=n(c,b.label);return!!(e&&[e.name,...e.aliases].some(a=>a.length>=2&&d.includes(a)))})(a,d,b))).sort((a,b)=>(b.confidence||0)-(a.confidence||0)),f=(a.evidence||[]).filter(a=>(function(a,b,c){let d=`${a.filePath} ${a.roleId||""} ${a.processingType||""} ${a.sectionTitle||""} ${a.content}`;return!(o(c,d)||p(c,d))&&b.queries.some(a=>a.length>=2&&d.includes(a))})(a,d,b)),g=Math.max(0,...e.map(a=>a.confidence||0)),h=0===e.length&&0===f.length?"missing":g>0&&g<.58?"low_confidence":"satisfied";return{need:d,facts:e,evidence:f,status:h}})}function a6(a){return aA(a).replace(/\s+/gu," ").trim().slice(0,220)}function a7(a,b=[],c=[],d,e=l){let f=b=>a.filter(a=>b.some(b=>`${a.key} ${a.fieldName||""}`.includes(b))),g=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),h=a.filter(a=>{let b=`${a.key} ${a.fieldName||""} ${a.value}`;return/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|ISO|IEC|IEEE|RFC|API|台|套|个|项|批|次|份|人|㎡/iu.test(b)&&(!o(e,b)||a$(b))&&!p(e,b)}),i=a.filter(a=>"table"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/u.test(`${a.roleId} ${a.sourceFile}`)),j=function(a,b,c,d){let e=a.filter(a=>p(d,aZ(a))||q(d,aZ(a))),f=a.filter(a=>{let b=aZ(a);return a.confidence>=.58&&!a_(a)&&!o(d,b)&&!p(d,b)&&!q(d,b)}),g=[...b.filter(a=>!a_(a)),...f.filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|IEC|台|套|个|项|批|次|份|人|㎡|型号|规格|数量|单位/iu.test(aZ(a)))].filter((a,b,c)=>c.findIndex(b=>b.sourceFile===a.sourceFile&&b.value===a.value&&b.key===a.key)===b).slice(0,360),h=f.filter(a=>"table"===a.processingType||/table|sheet|表格|清单|明细|数据|参数行摘要/u.test(aZ(a))),i=f.filter(a=>"drawing"===a.processingType||/drawing|draw|dwg|图纸|设计|尺寸|标高|管径|做法/u.test(aZ(a)));return{reliableFacts:f.slice(0,500),parameterFacts:g,tableFacts:h.slice(0,240),drawingFacts:i.slice(0,240),billFacts:c.slice(0,240),diagnostics:e.slice(0,120)}}(a,h,i,e);return{project:a,schedule:f(["工期","开工","竣工","节点","周期"]),quality:f(["质量","验收"]),safety:f(["安全","风险"]),resources:f(["劳动力","材料","机械","设备","资源"]),tables:b,drawings:g("drawing"),bills:i,preciseFacts:h,rules:g("rule"),specifications:g("specification"),schemaFacts:function(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}(a,d),factIndex:j,missing:[...new Set(c)],conflicts:function(a,b,c=l){let d=(b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.fieldName||a.key))]).filter(a=>(function(a,b){let c=n(b,a);return c?"single"===c.cardinality&&"ignore"!==c.conflictPolicy&&"allow_multiple"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)})(a,c)),e=[];for(let b of d){let d=a.filter(a=>a.key===b||a.fieldName===b||n(c,a.fieldName||a.key)?.name===b),f=new Map;for(let a of d){let b=function(a,b){let c=aA(a).trim();if(p(b,c)||o(b,c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c))return"";let d=aA(c).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();return d&&!(d.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(c)?d:""}(a.value,c);b&&f.set(b,[...f.get(b)||[],a])}if(f.size>1){let a=[...f.values()].slice(0,4).map(a=>`${aA(a[0].value).slice(0,120)}(${[...new Set(a.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");e.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return e.slice(0,8)}(a,d,e)}}let a8=[{key:"project_name",label:"项目名称",aliases:["项目名称","工程名称","招标项目名称"],valueType:"text"},{key:"project_code",label:"项目编号",aliases:["项目编号","招标项目编号","工程编号"],valueType:"identifier"},{key:"owner",label:"招标人",aliases:["招标人","项目业主","建设单位","发包人","采购人"],valueType:"organization"},{key:"project_location",label:"建设地点",aliases:["建设地点","实施地点","服务地点","交付地点"],valueType:"location"},{key:"project_scale",label:"建设规模",aliases:["建设规模","工程规模","项目规模"],valueType:"scale"},{key:"schedule_requirement",label:"计划工期",aliases:["计划工期","合同工期","总工期","工期","实施周期","服务期限"],valueType:"duration"},{key:"quality_standard",label:"质量标准",aliases:["质量标准","质量目标","验收标准","服务标准"],valueType:"standard"},{key:"project_investment_estimate",label:"合同估算价",aliases:["合同估算价","合同估算价格","投资估算","估算价格","最高投标限价","招标控制价","预算金额"],valueType:"money"}];function a9(a){return/^(见|详见|参见|按|以).{0,30}(招标公告|招标文件|投标人须知|前附表|合同|附件|图纸|清单|约定|规定|执行)/u.test(a)||/见招标公告|见投标人须知前附表|详见|按.*执行/u.test(a)}function ba(a,b){let c=aU(a.value),d=[],e=30,f=!1;(!c||c.length>260)&&(f=!0,e-=100,d.push("空值或过长")),/###|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应|招标人有权核查/u.test(c)&&(f=!0,e-=100,d.push("大段条款或 Markdown 噪声")),a8.some(a=>a.key!==b.key&&a.aliases.some(a=>c.includes(a)))&&(e-=45,d.push("包含其他字段名,疑似字段串位")),a9(c)&&(e-=35,d.push("引用型弱值"));let g=function(a,b){switch(b.valueType){case"duration":if(!/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(a))return{rejected:!0,score:-80,reason:"缺少明确工期数值和时间单位"};return{rejected:!1,score:45,reason:"包含明确工期数值和时间单位"};case"money":if(!/\d+(?:\.\d+)?\s*(?:万元|元|亿元)/u.test(a))return{rejected:!0,score:-80,reason:"缺少明确金额数值和单位"};if(/综合单价|税率|增值税|利润|报价明细/u.test(a))return{rejected:!0,score:-90,reason:"命中非目标商务明细"};return{rejected:!1,score:45,reason:"包含明确金额数值和单位"};case"standard":if(!/合格|优良|一次性验收|达到|满足|符合/u.test(a))return{rejected:!0,score:-70,reason:"不符合标准类字段表达"};if(/工期|投标|技术标准|有效期/u.test(a))return{rejected:!0,score:-90,reason:"标准字段包含其他字段或投标条款"};return{rejected:!1,score:40,reason:"符合标准类字段表达"};case"location":if(a9(a))return{rejected:!1,score:-40,reason:"引用型地点弱值"};if(!/(省|市|区|县|镇|街道|路|园区|大道|巷|内|号)/u.test(a))return{rejected:!1,score:-10,reason:"地点具体性不足"};return{rejected:!1,score:35,reason:"包含具体地址特征"};case"organization":if(/监督管理部门|投标人|中标候选人|评标委员会/u.test(a))return{rejected:!0,score:-90,reason:"组织字段角色串位"};if(/(公司|集团|单位|委员会|机关|中心|局|院|所|政府|运营管理)/u.test(a))return{rejected:!1,score:35,reason:"包含组织名称特征"};return{rejected:!1,score:5,reason:"组织名称特征较弱"};case"identifier":if(!/^[A-Za-z0-9\-_.()()]+$/u.test(a))return{rejected:!0,score:-70,reason:"编号格式不合法"};return{rejected:!1,score:35,reason:"符合编号格式"};case"scale":if(/\d+(?:\.\d+)?\s*(?:㎡|平方米|m²|米|m|层|栋|座|万元|元)/iu.test(a))return{rejected:!1,score:30,reason:"包含规模数值或单位"};return{rejected:!1,score:5,reason:"规模字段为文本描述"};default:return{rejected:!1,score:a.length>=2?10:-20,reason:"文本字段"}}}(c,b);return e+=g.score,d.push(g.reason),g.rejected&&(f=!0),"evidence"===a.sourceType&&(e+=20,d.push("来源为证据原文")),a.sourceName&&/招标文件|招标公告|前附表|合同|需求书|正文/u.test(a.sourceName)&&(e+=15,d.push("来源文件可信")),"generated_markdown"===a.sourceType&&(e-=10),{...a,value:c,confidence:e,rejected:f,reasons:d}}function bb(a){return function(a,b=a8){let c=new Map;for(let d of b){let b=a.filter(a=>a.fieldKey===d.key).sort((a,b)=>b.confidence-a.confidence),e=b.find(a=>!a.rejected&&a.confidence>0);e&&c.set(d.key,{fieldKey:d.key,label:d.label,value:e.value,source:e.sourceName||e.sourceType,confidence:e.confidence,candidates:b,selectedReason:e.reasons.join(";")})}return c}([...function(a){let b=[];for(let c of a){let a=function(a){let b=`${a.fieldId||""}${a.key||""}${a.fieldName||""}`;return a8.find(c=>c.key===a.fieldId||c.aliases.some(a=>b.includes(a)))}(c);if(!a)continue;let d=aA(c.value);b.push(ba({fieldKey:a.key,label:a.label,value:d,sourceType:"structured_fact",sourceName:c.sourceFile||c.sourceRef?.sectionTitle||"structured_fact"},a))}return b}(a.facts),...function(a,b="generated_markdown"){let c=[];for(let d of a.split(/\r?\n/u)){if(!/^\|.*\|\s*$/u.test(d)||/^\|\s*:?-{3,}:?/u.test(d))continue;let a=d.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.replace(/\*\*/gu,"").trim());if(a.length<2)continue;let e="序号"===a[0]&&a.length>=3?a[1]:a[0],f="序号"===a[0]&&a.length>=3?a[2]:a[1],g="序号"===a[0]&&a.length>=4?a[3]:a[2],h=a8.find(a=>a.aliases.some(a=>e.includes(a))||a.label===e);!h||!f||/内容|参数|资料未明确/u.test(f)||c.push(ba({fieldKey:h.key,label:h.label,value:f,sourceType:"generated_markdown",sourceName:g||b},h))}return c}(a.markdown||"")])}function bc(a){return a?({"knowledge-base":"知识库","document-readiness":"生成准备度检查","quality-repair":"质量补写","export-gate":"导出门禁","final-format":"正式排版","multimodal-files":"多模态文件理解","llm-json":"LLM 事实抽取","llm-review":"LLM 审查","document-workflow":"最终规范校验"})[a]:void 0}function bd(a,b={}){let c={executionVersion:2,title:{role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",file_understanding:"文件角色读取",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",asset_generation:"生成资源处理",llm_review:"LLM 审查优化",validation:"内容优化与质量校验",formatting:"正式排版整理",export_ready:"导出就绪检查",reference:"资料增强"}[a.type],group:a.type,...a,...b};return{...c,roleName:c.roleName||bc(c.roleId),subtitle:c.subtitle||c.roleName||bc(c.roleId)}}function be(a,b){let c=a.findIndex(a=>a.type===b.type&&a.roleId===b.roleId&&a.promptId===b.promptId);return c>=0?(a[c]={...b,order:a[c]?.order??b.order},c):(a.push(b),a.length-1)}function bf(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}var bg=c(74329);async function bh(a,b,c,d){let e=Date.now();try{return await c()}finally{let c=Date.now();a.metrics.push({name:b,startedAt:e,endedAt:c,durationMs:c-e,meta:d})}}function bi(a){return a.toLowerCase()}function bj(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}function bk(a){let b=[];for(let c of a)bg.ee.lastIndex=0,bg.ee.test(c)&&b.push(c);return b}function bl(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function bm(a,b,c,e){let f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=O({chapterId:b.id,textEvidence:c,resources:[],byKind:{map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]},summary:""},{maxChars:L(1800,8e3,Math.max(14e3,3500*aI()))}),h=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
52
+ ${k}`,{signal:e});return(aE(e),n?.facts?.length)?{facts:n.facts.filter(a=>a.key&&a.value).map(a=>{let b=l.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:aD(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${n.facts.length} 条事实`}]}:{facts:[],stages:f}}let aW=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;function aX(a){return aD(a).replace(/[\u00A0\u2002-\u200B\u3000]/gu," ").replace(/([\p{Script=Han}])\s+([\p{Script=Han}])/gu,"$1$2").replace(/(\d)\s+(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/(合同|投资|工程|项目)\s*估\s*算\s*(?:价格|价)/gu,"$1估算价").replace(/计划\s*工\s*期/gu,"计划工期").replace(/合同\s*工\s*期/gu,"合同工期").replace(/质量\s*标\s*准/gu,"质量标准").replace(/建设\s*地\s*点/gu,"建设地点").replace(/建设\s*规\s*模/gu,"建设规模").replace(/招标\s*范\s*围/gu,"招标范围").replace(/最高\s*投\s*标\s*限\s*价/gu,"最高投标限价").replace(/招标\s*控\s*制\s*价/gu,"招标控制价").replace(/[::]\s*/gu,":").replace(/\s+/gu," ").trim()}let aY=[{fieldId:"project_name",key:"项目名称",fieldName:"项目名称",pattern:/(?:项目名称|工程名称|招标项目名称)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_code",key:"项目编号",fieldName:"项目编号",pattern:/(?:项目编号|招标项目编号|工程编号)[::\s为是]+([A-Za-z0-9\-_.()()]{4,80})/u},{fieldId:"owner",key:"招标人",fieldName:"招标人",pattern:/(?:招标人|建设单位|发包人)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_location",key:"建设地点",fieldName:"建设地点",pattern:/建设地点[::\s为是]+([^\n。;;]{2,100})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/建设规模[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"project_scope",key:"招标范围",fieldName:"招标范围",pattern:/招标范围[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"schedule_requirement",key:"计划工期",fieldName:"周期要求",pattern:/(?:(?:计划工期|合同工期|总工期)[::\s为是约]*|工期[::\s为是约]+)([^\n。;;]{0,40}?\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)(?:[^\n。;;]{0,30})?)/u},{fieldId:"quality_standard",key:"质量标准",fieldName:"质量标准",pattern:/质量标准[::\s为是]+([^\n。;;]{1,60})/u},{fieldId:"project_investment_estimate",key:"合同估算价格",fieldName:"项目投资估算",pattern:/(?:合同估算价格|合同估算价|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价)[::\s为是约]+([^\n。;;]{0,80}?\d+(?:\.\d+)?\s*(?:万元|元))/u}];function aZ(a,b){let c=aX(aD(b));return!(!a||!c||c.length>260||/###|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应/u.test(c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c))&&("schedule_requirement"===a?c.length<=90&&/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(c):"quality_standard"===a?c.length<=40&&/合格|优良|一次性验收|国家.*验收|达到/u.test(c)&&!/工期|投标|技术标准/u.test(c):"owner"===a?c.length<=80&&!/将报|监督管理部门|投标人|中标/u.test(c):"project_location"===a?c.length<=120&&!/见招标公告|详见|投标/u.test(c):"project_code"===a?/^[A-Za-z0-9\-_.()()]+$/u.test(c):"project_investment_estimate"===a?c.length<=100&&/\d+(?:\.\d+)?\s*(?:万元|元)/u.test(c):c.length<=220)}function a$(a){let b=[],c=new Set;for(let d of a)for(let a of aX(d.content).split(/\r?\n/u).flatMap(a=>{let b=a.replace(/\s+/gu," ").trim();return b.length>260?b.split(/(?=\d+(?:\.\d+)?\s*[^\s::]{2,12}[::])/u):[b]}).filter(Boolean))if(!/报价明细|综合单价|税率|增值税|利润|结算/u.test(a)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))for(let e of aY){let f=e.pattern.exec(a),g=f?.[1]?.trim();if(!g||!aZ(e.fieldId,g))continue;let h=`${d.filePath}:${e.fieldId}:${g}`;c.has(h)||(c.add(h),b.push({key:e.key,fieldName:e.fieldName,fieldId:e.fieldId,value:g,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:Math.max(.82,d.score||.82),sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle}}))}return b.slice(0,80)}function a_(a,b=l){let c=[],d=new Set;for(let e of a){let a=`${e.roleId||""} ${e.processingType||""} ${e.filePath} ${e.sectionTitle||""}`;if(!/drawing|table|bill|boq|draw|data|sheet|spec|standard|record|report|表格|数据|规格|参数|标准|记录|报告|清单|图纸|说明/u.test(a)&&e.score<.75)continue;let f=aD(e.content).replace(/\s+/gu," ");for(let a of f.matchAll(aW)){let g=a[0].trim();if(!g||o(b,g))continue;let h=Math.max(0,(a.index||0)-40),i=Math.min(f.length,(a.index||0)+g.length+40),j=f.slice(h,i);if(p(b,j)||q(b,j))continue;let k=`${e.filePath}:${g}`;d.has(k)||(d.add(k),c.push({key:"精确参数",fieldName:"技术参数",fieldId:"technical_parameter",value:g,sourceFile:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",confidence:Math.max(.7,e.score||.7),sourceRef:{filePath:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",sectionTitle:e.sectionTitle}}))}}return c.slice(0,240)}function a0(a){return`${a.key} ${a.fieldName||""} ${a.value} ${a.roleId} ${a.processingType||""} ${a.sourceFile}`}function a1(a){return/合同估算价|合同估算价格|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价/u.test(a)}function a2(a){let b=a0(a);return!a1(b)&&/投标保证金|发票类型|开标时间|公共资源交易监督管理|不良行为记录|投诉举报|资质投诉|投标承诺|违约金|中标服务费|交易平台|保证金账户|投标有效期|报价明细|投标报价|单价|合价|税率|增值税|利润|结算/u.test(b)}function a3(a){return aD(a).replace(/\s+/gu," ").trim()}function a4(a,b=[]){return[...new Set([a,...b,...a.split(/[\s、,。;;::/\\_-]+/u)].map(a3).filter(a=>a.length>=2))]}function a5(a,b,c){var d,e;let f=a3(c.label);if(!f||o(b,f)||p(b,f))return;let g=c.id||(d=c.source,e=c.fieldId,`${d}:${e||f}`.toLowerCase().replace(/[^\p{L}\p{N}]+/gu,"-").replace(/^-|-$/gu,"")||`${d}-${Math.random().toString(36).slice(2,8)}`),h=c.queries?.length?c.queries.map(a3).filter(Boolean):a4(f),i=a.find(a=>a.id===g||a.label===f);if(i){i.required=i.required||c.required,i.queries=[...new Set([...i.queries,...h])];return}a.push({...c,id:g,label:f,queries:h})}function a6(a,b,c,d,e,f=[]){"do_not_use"!==c.usagePolicy&&"diagnostic_only"!==c.usagePolicy&&"forbidden"!==c.derivationPolicy&&a5(a,b,{label:c.name,category:c.category,required:e,source:d,fieldId:c.id,queries:a4(c.name,[...c.aliases,...f])})}function a7(a){let b=new Set;return a.filter(a=>{let c=`${a.sourceFile}:${a.key}:${a.value}`;return!b.has(c)&&(b.add(c),!0)})}function a8(a){let b=a.profile||l,c=a7([...a.factsModel.factIndex.parameterFacts,...a.factsModel.factIndex.tableFacts,...a.factsModel.factIndex.drawingFacts,...a.factsModel.factIndex.billFacts,...a.factsModel.factIndex.reliableFacts]);return a.needs.map(d=>{let e=a7(c.filter(a=>(function(a,b,c){let d=a0(a);if(a2(a)||o(c,d)||p(c,d))return!1;if(b.fieldId&&a.fieldId===b.fieldId||n(c,a.fieldName||a.key)?.id===b.fieldId||b.queries.filter(a=>a.length>=2).some(a=>d.includes(a)))return!0;let e=n(c,b.label);return!!(e&&[e.name,...e.aliases].some(a=>a.length>=2&&d.includes(a)))})(a,d,b))).sort((a,b)=>(b.confidence||0)-(a.confidence||0)),f=(a.evidence||[]).filter(a=>(function(a,b,c){let d=`${a.filePath} ${a.roleId||""} ${a.processingType||""} ${a.sectionTitle||""} ${a.content}`;return!(o(c,d)||p(c,d))&&b.queries.some(a=>a.length>=2&&d.includes(a))})(a,d,b)),g=Math.max(0,...e.map(a=>a.confidence||0)),h=0===e.length&&0===f.length?"missing":g>0&&g<.58?"low_confidence":"satisfied";return{need:d,facts:e,evidence:f,status:h}})}function a9(a){return aD(a).replace(/\s+/gu," ").trim().slice(0,220)}function ba(a,b=[],c=[],d,e=l){let f=b=>a.filter(a=>b.some(b=>`${a.key} ${a.fieldName||""}`.includes(b))),g=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),h=a.filter(a=>{let b=`${a.key} ${a.fieldName||""} ${a.value}`;return/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|ISO|IEC|IEEE|RFC|API|台|套|个|项|批|次|份|人|㎡/iu.test(b)&&(!o(e,b)||a1(b))&&!p(e,b)}),i=a.filter(a=>"table"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/u.test(`${a.roleId} ${a.sourceFile}`)),j=function(a,b,c,d){let e=a.filter(a=>p(d,a0(a))||q(d,a0(a))),f=a.filter(a=>{let b=a0(a);return a.confidence>=.58&&!a2(a)&&!o(d,b)&&!p(d,b)&&!q(d,b)}),g=[...b.filter(a=>!a2(a)),...f.filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|IEC|台|套|个|项|批|次|份|人|㎡|型号|规格|数量|单位/iu.test(a0(a)))].filter((a,b,c)=>c.findIndex(b=>b.sourceFile===a.sourceFile&&b.value===a.value&&b.key===a.key)===b).slice(0,360),h=f.filter(a=>"table"===a.processingType||/table|sheet|表格|清单|明细|数据|参数行摘要/u.test(a0(a))),i=f.filter(a=>"drawing"===a.processingType||/drawing|draw|dwg|图纸|设计|尺寸|标高|管径|做法/u.test(a0(a)));return{reliableFacts:f.slice(0,500),parameterFacts:g,tableFacts:h.slice(0,240),drawingFacts:i.slice(0,240),billFacts:c.slice(0,240),diagnostics:e.slice(0,120)}}(a,h,i,e);return{project:a,schedule:f(["工期","开工","竣工","节点","周期"]),quality:f(["质量","验收"]),safety:f(["安全","风险"]),resources:f(["劳动力","材料","机械","设备","资源"]),tables:b,drawings:g("drawing"),bills:i,preciseFacts:h,rules:g("rule"),specifications:g("specification"),schemaFacts:function(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}(a,d),factIndex:j,missing:[...new Set(c)],conflicts:function(a,b,c=l){let d=(b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.fieldName||a.key))]).filter(a=>(function(a,b){let c=n(b,a);return c?"single"===c.cardinality&&"ignore"!==c.conflictPolicy&&"allow_multiple"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)})(a,c)),e=[];for(let b of d){let d=a.filter(a=>a.key===b||a.fieldName===b||n(c,a.fieldName||a.key)?.name===b),f=new Map;for(let a of d){let b=function(a,b){let c=aD(a).trim();if(p(b,c)||o(b,c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c))return"";let d=aD(c).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();return d&&!(d.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(c)?d:""}(a.value,c);b&&f.set(b,[...f.get(b)||[],a])}if(f.size>1){let a=[...f.values()].slice(0,4).map(a=>`${aD(a[0].value).slice(0,120)}(${[...new Set(a.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");e.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return e.slice(0,8)}(a,d,e)}}let bb=[{key:"project_name",label:"项目名称",aliases:["项目名称","工程名称","招标项目名称"],valueType:"text"},{key:"project_code",label:"项目编号",aliases:["项目编号","招标项目编号","工程编号"],valueType:"identifier"},{key:"owner",label:"招标人",aliases:["招标人","项目业主","建设单位","发包人","采购人"],valueType:"organization"},{key:"project_location",label:"建设地点",aliases:["建设地点","实施地点","服务地点","交付地点"],valueType:"location"},{key:"project_scale",label:"建设规模",aliases:["建设规模","工程规模","项目规模"],valueType:"scale"},{key:"schedule_requirement",label:"计划工期",aliases:["计划工期","合同工期","总工期","工期","实施周期","服务期限"],valueType:"duration"},{key:"quality_standard",label:"质量标准",aliases:["质量标准","质量目标","验收标准","服务标准"],valueType:"standard"},{key:"project_investment_estimate",label:"合同估算价",aliases:["合同估算价","合同估算价格","投资估算","估算价格","最高投标限价","招标控制价","预算金额"],valueType:"money"}];function bc(a){return/^(见|详见|参见|按|以).{0,30}(招标公告|招标文件|投标人须知|前附表|合同|附件|图纸|清单|约定|规定|执行)/u.test(a)||/见招标公告|见投标人须知前附表|详见|按.*执行/u.test(a)}function bd(a,b){let c=aX(a.value),d=[],e=30,f=!1;(!c||c.length>260)&&(f=!0,e-=100,d.push("空值或过长")),/###|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应|招标人有权核查/u.test(c)&&(f=!0,e-=100,d.push("大段条款或 Markdown 噪声")),bb.some(a=>a.key!==b.key&&a.aliases.some(a=>c.includes(a)))&&(e-=45,d.push("包含其他字段名,疑似字段串位")),bc(c)&&(e-=35,d.push("引用型弱值"));let g=function(a,b){switch(b.valueType){case"duration":if(!/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(a))return{rejected:!0,score:-80,reason:"缺少明确工期数值和时间单位"};return{rejected:!1,score:45,reason:"包含明确工期数值和时间单位"};case"money":if(!/\d+(?:\.\d+)?\s*(?:万元|元|亿元)/u.test(a))return{rejected:!0,score:-80,reason:"缺少明确金额数值和单位"};if(/综合单价|税率|增值税|利润|报价明细/u.test(a))return{rejected:!0,score:-90,reason:"命中非目标商务明细"};return{rejected:!1,score:45,reason:"包含明确金额数值和单位"};case"standard":if(!/合格|优良|一次性验收|达到|满足|符合/u.test(a))return{rejected:!0,score:-70,reason:"不符合标准类字段表达"};if(/工期|投标|技术标准|有效期/u.test(a))return{rejected:!0,score:-90,reason:"标准字段包含其他字段或投标条款"};return{rejected:!1,score:40,reason:"符合标准类字段表达"};case"location":if(bc(a))return{rejected:!1,score:-40,reason:"引用型地点弱值"};if(!/(省|市|区|县|镇|街道|路|园区|大道|巷|内|号)/u.test(a))return{rejected:!1,score:-10,reason:"地点具体性不足"};return{rejected:!1,score:35,reason:"包含具体地址特征"};case"organization":if(/监督管理部门|投标人|中标候选人|评标委员会/u.test(a))return{rejected:!0,score:-90,reason:"组织字段角色串位"};if(/(公司|集团|单位|委员会|机关|中心|局|院|所|政府|运营管理)/u.test(a))return{rejected:!1,score:35,reason:"包含组织名称特征"};return{rejected:!1,score:5,reason:"组织名称特征较弱"};case"identifier":if(!/^[A-Za-z0-9\-_.()()]+$/u.test(a))return{rejected:!0,score:-70,reason:"编号格式不合法"};return{rejected:!1,score:35,reason:"符合编号格式"};case"scale":if(/\d+(?:\.\d+)?\s*(?:㎡|平方米|m²|米|m|层|栋|座|万元|元)/iu.test(a))return{rejected:!1,score:30,reason:"包含规模数值或单位"};return{rejected:!1,score:5,reason:"规模字段为文本描述"};default:return{rejected:!1,score:a.length>=2?10:-20,reason:"文本字段"}}}(c,b);return e+=g.score,d.push(g.reason),g.rejected&&(f=!0),"evidence"===a.sourceType&&(e+=20,d.push("来源为证据原文")),a.sourceName&&/招标文件|招标公告|前附表|合同|需求书|正文/u.test(a.sourceName)&&(e+=15,d.push("来源文件可信")),"generated_markdown"===a.sourceType&&(e-=10),{...a,value:c,confidence:e,rejected:f,reasons:d}}function be(a){return function(a,b=bb){let c=new Map;for(let d of b){let b=a.filter(a=>a.fieldKey===d.key).sort((a,b)=>b.confidence-a.confidence),e=b.find(a=>!a.rejected&&a.confidence>0);e&&c.set(d.key,{fieldKey:d.key,label:d.label,value:e.value,source:e.sourceName||e.sourceType,confidence:e.confidence,candidates:b,selectedReason:e.reasons.join(";")})}return c}([...function(a){let b=[];for(let c of a){let a=function(a){let b=`${a.fieldId||""}${a.key||""}${a.fieldName||""}`;return bb.find(c=>c.key===a.fieldId||c.aliases.some(a=>b.includes(a)))}(c);if(!a)continue;let d=aD(c.value);b.push(bd({fieldKey:a.key,label:a.label,value:d,sourceType:"structured_fact",sourceName:c.sourceFile||c.sourceRef?.sectionTitle||"structured_fact"},a))}return b}(a.facts),...function(a,b="generated_markdown"){let c=[];for(let d of a.split(/\r?\n/u)){if(!/^\|.*\|\s*$/u.test(d)||/^\|\s*:?-{3,}:?/u.test(d))continue;let a=d.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.replace(/\*\*/gu,"").trim());if(a.length<2)continue;let e="序号"===a[0]&&a.length>=3?a[1]:a[0],f="序号"===a[0]&&a.length>=3?a[2]:a[1],g="序号"===a[0]&&a.length>=4?a[3]:a[2],h=bb.find(a=>a.aliases.some(a=>e.includes(a))||a.label===e);!h||!f||/内容|参数|资料未明确/u.test(f)||c.push(bd({fieldKey:h.key,label:h.label,value:f,sourceType:"generated_markdown",sourceName:g||b},h))}return c}(a.markdown||"")])}function bf(a){return a?({"knowledge-base":"知识库","document-readiness":"生成准备度检查","quality-repair":"质量补写","export-gate":"导出门禁","final-format":"正式排版","multimodal-files":"多模态文件理解","llm-json":"LLM 事实抽取","llm-review":"LLM 审查","document-workflow":"最终规范校验"})[a]:void 0}function bg(a,b={}){let c={executionVersion:2,title:{role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",file_understanding:"文件角色读取",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",asset_generation:"生成资源处理",llm_review:"LLM 审查优化",validation:"内容优化与质量校验",formatting:"正式排版整理",export_ready:"导出就绪检查",reference:"资料增强"}[a.type],group:a.type,...a,...b};return{...c,roleName:c.roleName||bf(c.roleId),subtitle:c.subtitle||c.roleName||bf(c.roleId)}}function bh(a,b){let c=a.findIndex(a=>a.type===b.type&&a.roleId===b.roleId&&a.promptId===b.promptId);return c>=0?(a[c]={...b,order:a[c]?.order??b.order},c):(a.push(b),a.length-1)}function bi(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}var bj=c(74329);async function bk(a,b,c,d){let e=Date.now();try{return await c()}finally{let c=Date.now();a.metrics.push({name:b,startedAt:e,endedAt:c,durationMs:c-e,meta:d})}}function bl(a){return a.toLowerCase()}function bm(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}function bn(a){let b=[];for(let c of a)bj.ee.lastIndex=0,bj.ee.test(c)&&b.push(c);return b}function bo(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function bp(a,b,c,e){let f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=O({chapterId:b.id,textEvidence:c,resources:[],byKind:{map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]},summary:""},{maxChars:L(1800,8e3,Math.max(14e3,3500*aL()))}),h=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
53
53
  节点类型:${b.outputType}
54
54
  文件角色:${b.fileRoleName}(${b.fileRoleId})
55
55
  要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。提示词角色只提供规则和格式约束,其中的示例、样例、占位项目名、编号、日期、数量和示例正文不得作为事实抽取来源。
@@ -57,58 +57,58 @@ ${k}`,{signal:e});return(aB(e),n?.facts?.length)?{facts:n.facts.filter(a=>a.key&
57
57
  请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 必须只来自下面的绑定文件片段,优先抽取对象、范围、区域、阶段、数量、日期、周期、规格、单位、资源数量、检查频次和来源口径;同类对象不得合并丢失,计量单位保持原文含义,必要时使用导出友好的正式写法。
58
58
 
59
59
  绑定文件片段:
60
- ${g}`,i=[];aB(e);let j=g.trim()?await aP(f,h,{signal:e}):void 0;if(aB(e),bl(j)){i.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await aP("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
60
+ ${g}`,i=[];aE(e);let j=g.trim()?await aS(f,h,{signal:e}):void 0;if(aE(e),bo(j)){i.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await aS("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
61
61
 
62
62
  原始 JSON:
63
- ${JSON.stringify(j)}`,{signal:e});a&&!bl(a)?j=a:i.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let k=ay(j?.chapters),l=ay(j?.facts),m=[];k.forEach((b,c)=>{let e="string"==typeof b.title?(0,P.YZ)(b.title):"";!e||!(0,P.bE)(b.title||e)||(0,d.DX)(e,a)||m.push({id:az(e,`chapter-${c+1}`),title:e,order:c,sourceRequirement:b.sourceRequirement||e,requiredContents:ax(b.requiredContents),writingRules:ax(b.writingRules),evidenceNeeds:ax(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:ay(b.requirements).map((a,b)=>({id:az(`${e}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:ax(a.requiredContents),writingRules:ax(a.writingRules),evidenceNeeds:ax(a.evidenceNeeds),preferredSourceRoleIds:ax(a.preferredSourceRoleIds)}))})});let n=[],o=new Set(c.map(a=>a.filePath));l.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&o.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&o.has(e)&&n.push({key:d,value:F(aA(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:ax(a.relatedChapterHints)})});let p=m.length>0?[]:function(a,b,c){if("template_requirements"!==b.outputType)return[];let e=[],f=new Set;for(let b of c)for(let c of b.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!RegExp(`^(?:第(?:\\d{1,3}|${C.$m})[章节]|[((]?(?:\\d{1,3}|${C.$m})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let g=(0,P.YZ)(c);!(0,P.bE)(c)||f.has(g)||(0,d.DX)(g,a)||(f.add(g),e.push({id:az(g,`chapter-${e.length+1}`),title:g,order:e.length,sourceRequirement:b.content.replace(/\s+/gu," "),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}))}return e}(a,b,c),q=n.length>0?[]:function(a,b){let c=[];for(let d of b){let b=d.content.replace(/\s+/gu," ");b.length<=20||c.push({key:`${a.fileRoleName}事实${c.length+1}`,value:b,sourceFile:d.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:d.sectionTitle?[d.sectionTitle]:[]})}return c}(b,c);return 0===m.length&&p.length>0&&i.push(`${b.fileRoleName} 结构化章节读取不足,已补充使用证据标题兜底。`),0===n.length&&q.length>0&&i.push(`${b.fileRoleName} 结构化事实读取不足,已补充使用证据片段兜底。`),{node:b,evidence:H(c,void 0),chapters:m.length>0?m:p,facts:n.length>0?n:q,outputRequirements:ax(j?.outputRequirements),warnings:[...i,...ax(j?.warnings)],forbidImageInsertion:j?.forbidImageInsertion??"drawing_facts"===b.outputType}}function bn(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}function bo(a,b,c){let d=function(a,b){let c=[a.title];for(let b of a.requiredFacts||[])b&&c.push(b);for(let a of b?.requiredContents||[])a&&c.push(a);for(let a of b?.evidenceNeeds||[])a&&c.push(a);for(let a of b?.requirements||[]){for(let b of(a.title&&c.push(a.title),a.requiredContents))b&&c.push(b);for(let b of a.evidenceNeeds)b&&c.push(b)}return c}(b,c),e=[],f=Math.max(40,Math.min(120,Number(process.env.DOCUMENT_ROLE_FACTS_PER_CHAPTER??80)));for(let b of a)for(let a of b.facts)if(function(a,b){if(0===b.length)return!0;let c=`${a.key}
64
- ${aA(a.value)}
65
- ${a.relatedChapterHints.join("\n")}`;for(let d of b)if(c.includes(d)||d.includes(a.key))return!0;return!1}(a,d)&&(e.push({artifact:b,fact:a}),e.length>=f))return e;return e}function bp(a,b,c){let d=bo(a,b,c),e=c?[`章节来源要求:${c.sourceRequirement}`,c.requiredContents.length?`必须包含:${c.requiredContents.join("、")}`:"",c.writingRules.length?`写作规范:${c.writingRules.join("、")}`:"",c.evidenceNeeds.length?`需要证据:${c.evidenceNeeds.join("、")}`:"",c.requirements.length?`要求项:
66
- ${c.requirements.map(a=>`- ${a.title}:${a.requirementText||a.requiredContents.join("、")}`).join("\n")}`:""].filter(Boolean).join("\n"):"",f=new Map;for(let{artifact:a,fact:b}of d){let c=`${a.node.fileRoleName}(${a.node.outputType})`;f.set(c,[...f.get(c)||[],`- ${b.key}:${F(aA(b.value))}`])}let g=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_FACT_LINES_PER_GROUP??18))),h=[...f.entries()].map(([a,b])=>`### ${a}
63
+ ${JSON.stringify(j)}`,{signal:e});a&&!bo(a)?j=a:i.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let k=aB(j?.chapters),l=aB(j?.facts),m=[];k.forEach((b,c)=>{let e="string"==typeof b.title?(0,P.YZ)(b.title):"";!e||!(0,P.bE)(b.title||e)||(0,d.DX)(e,a)||m.push({id:aC(e,`chapter-${c+1}`),title:e,order:c,sourceRequirement:b.sourceRequirement||e,requiredContents:aA(b.requiredContents),writingRules:aA(b.writingRules),evidenceNeeds:aA(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:aB(b.requirements).map((a,b)=>({id:aC(`${e}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:aA(a.requiredContents),writingRules:aA(a.writingRules),evidenceNeeds:aA(a.evidenceNeeds),preferredSourceRoleIds:aA(a.preferredSourceRoleIds)}))})});let n=[],o=new Set(c.map(a=>a.filePath));l.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&o.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&o.has(e)&&n.push({key:d,value:F(aD(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:aA(a.relatedChapterHints)})});let p=m.length>0?[]:function(a,b,c){if("template_requirements"!==b.outputType)return[];let e=[],f=new Set;for(let b of c)for(let c of b.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!RegExp(`^(?:第(?:\\d{1,3}|${C.$m})[章节]|[((]?(?:\\d{1,3}|${C.$m})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let g=(0,P.YZ)(c);!(0,P.bE)(c)||f.has(g)||(0,d.DX)(g,a)||(f.add(g),e.push({id:aC(g,`chapter-${e.length+1}`),title:g,order:e.length,sourceRequirement:b.content.replace(/\s+/gu," "),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}))}return e}(a,b,c),q=n.length>0?[]:function(a,b){let c=[];for(let d of b){let b=d.content.replace(/\s+/gu," ");b.length<=20||c.push({key:`${a.fileRoleName}事实${c.length+1}`,value:b,sourceFile:d.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:d.sectionTitle?[d.sectionTitle]:[]})}return c}(b,c);return 0===m.length&&p.length>0&&i.push(`${b.fileRoleName} 结构化章节读取不足,已补充使用证据标题兜底。`),0===n.length&&q.length>0&&i.push(`${b.fileRoleName} 结构化事实读取不足,已补充使用证据片段兜底。`),{node:b,evidence:H(c,void 0),chapters:m.length>0?m:p,facts:n.length>0?n:q,outputRequirements:aA(j?.outputRequirements),warnings:[...i,...aA(j?.warnings)],forbidImageInsertion:j?.forbidImageInsertion??"drawing_facts"===b.outputType}}function bq(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}function br(a,b,c){let d=function(a,b){let c=[a.title];for(let b of a.requiredFacts||[])b&&c.push(b);for(let a of b?.requiredContents||[])a&&c.push(a);for(let a of b?.evidenceNeeds||[])a&&c.push(a);for(let a of b?.requirements||[]){for(let b of(a.title&&c.push(a.title),a.requiredContents))b&&c.push(b);for(let b of a.evidenceNeeds)b&&c.push(b)}return c}(b,c),e=[],f=Math.max(40,Math.min(120,Number(process.env.DOCUMENT_ROLE_FACTS_PER_CHAPTER??80)));for(let b of a)for(let a of b.facts)if(function(a,b){if(0===b.length)return!0;let c=`${a.key}
64
+ ${aD(a.value)}
65
+ ${a.relatedChapterHints.join("\n")}`;for(let d of b)if(c.includes(d)||d.includes(a.key))return!0;return!1}(a,d)&&(e.push({artifact:b,fact:a}),e.length>=f))return e;return e}function bs(a,b,c){let d=br(a,b,c),e=c?[`章节来源要求:${c.sourceRequirement}`,c.requiredContents.length?`必须包含:${c.requiredContents.join("、")}`:"",c.writingRules.length?`写作规范:${c.writingRules.join("、")}`:"",c.evidenceNeeds.length?`需要证据:${c.evidenceNeeds.join("、")}`:"",c.requirements.length?`要求项:
66
+ ${c.requirements.map(a=>`- ${a.title}:${a.requirementText||a.requiredContents.join("、")}`).join("\n")}`:""].filter(Boolean).join("\n"):"",f=new Map;for(let{artifact:a,fact:b}of d){let c=`${a.node.fileRoleName}(${a.node.outputType})`;f.set(c,[...f.get(c)||[],`- ${b.key}:${F(aD(b.value))}`])}let g=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_FACT_LINES_PER_GROUP??18))),h=[...f.entries()].map(([a,b])=>`### ${a}
67
67
  ${b.slice(0,g).map(a=>a.replace(C.tK,"").replace(C.VX,"").slice(0,320)).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
68
68
  ${e}`:"",h?`【角色节点结构化产物】
69
- ${h}`:""].filter(Boolean).join("\n\n")}function bq(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function br(a){return bg.MG.lastIndex=0,bg.MG.test(a)}function bs(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),(0,ar.AC)(a.content,[{id:a.chapter.id,title:a.chapter.title,content:a.content,evidence:[],sections:a.chapter.sections||[],missingFacts:[]}])))b.push(c.message);for(let c of a.chapter.sections||[]){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*[..、]?\\s+)?${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|^##\\s+|$)`,"mu"));e?180>(0,aq.V7)(e[1])&&b.push(`规划小节正文过短:${c}`):b.push(`缺少规划小节:${c}`)}for(let c of((0,aq.V7)(a.content)<Math.floor(.85*a.targetWords)&&b.push("正文篇幅明显低于目标"),R.lastIndex=0,(R.test(a.content)||/知识库|检索|角色节点|事实字段|校验结果/u.test(a.content))&&b.push("正文包含后台流程话术"),/资料未提供|满足相关要求|结合实际情况|根据实际情况|视情况|待明确|待确认/u.test(a.content)&&b.push("正文存在空泛占位表达"),a.missingFacts.slice(0,8)))c&&!a.content.includes(c)&&b.push(`requiredFacts 未明显覆盖:${c}`);return[...new Set(b)].slice(0,12)}async function bt(a){aB(a.signal);let b=a.repairType||function(a){let b=a.join("\n");for(let a of bg.NP)if(a.pattern.lastIndex=0,a.pattern.test(b))return a.type;return"generic"}(a.issues),c=await aP(["你是章节局部修复专家。只返回 JSON patch,不返回完整章节,不重写无问题内容。",bg._$[b]||bg._$.generic,W,a.forbidDrawingImages?"图片类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","每个 patch 必须能通过 originalText 或 targetStart/targetEnd 在原章节中唯一定位;replacement 只替换该局部片段。","只修复列出的问题,不得整章重写,不得删除无问题小节,不得改变一级/二级章节结构。","如问题涉及缺少正式表格,replacement 必须包含 Markdown 表名、表头、分隔线和至少一行数据;不得只写“见下表”或空表。","如问题涉及提示词要求的关键词或禁用内容,只在相关段落自然补齐或替换,不得堆砌关键词。","禁止新增证据摘要中没有的信息;无法安全定位的问题不要生成 patch。",'返回 JSON:{"patches":[{"originalText":"原局部文本","targetStart":"定位起始文本","targetEnd":"定位结束文本","replacement":"替换后的局部文本","reason":"修复原因"}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
69
+ ${h}`:""].filter(Boolean).join("\n\n")}function bt(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function bu(a){return bj.MG.lastIndex=0,bj.MG.test(a)}function bv(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),(0,au.AC)(a.content,[{id:a.chapter.id,title:a.chapter.title,content:a.content,evidence:[],sections:a.chapter.sections||[],missingFacts:[]}])))b.push(c.message);for(let c of a.chapter.sections||[]){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*[..、]?\\s+)?${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|^##\\s+|$)`,"mu"));e?180>(0,at.V7)(e[1])&&b.push(`规划小节正文过短:${c}`):b.push(`缺少规划小节:${c}`)}for(let c of((0,at.V7)(a.content)<Math.floor(.85*a.targetWords)&&b.push("正文篇幅明显低于目标"),R.lastIndex=0,(R.test(a.content)||/知识库|检索|角色节点|事实字段|校验结果/u.test(a.content))&&b.push("正文包含后台流程话术"),/资料未提供|满足相关要求|结合实际情况|根据实际情况|视情况|待明确|待确认/u.test(a.content)&&b.push("正文存在空泛占位表达"),a.missingFacts.slice(0,8)))c&&!a.content.includes(c)&&b.push(`requiredFacts 未明显覆盖:${c}`);return[...new Set(b)].slice(0,12)}async function bw(a){aE(a.signal);let b=a.repairType||function(a){let b=a.join("\n");for(let a of bj.NP)if(a.pattern.lastIndex=0,a.pattern.test(b))return a.type;return"generic"}(a.issues),c=await aS(["你是章节局部修复专家。只返回 JSON patch,不返回完整章节,不重写无问题内容。",bj._$[b]||bj._$.generic,Y,a.forbidDrawingImages?"图片类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","每个 patch 必须能通过 originalText 或 targetStart/targetEnd 在原章节中唯一定位;replacement 只替换该局部片段。","只修复列出的问题,不得整章重写,不得删除无问题小节,不得改变一级/二级章节结构。","如问题涉及缺少正式表格,replacement 必须包含 Markdown 表名、表头、分隔线和至少一行数据;不得只写“见下表”或空表。","如问题涉及提示词要求的关键词或禁用内容,只在相关段落自然补齐或替换,不得堆砌关键词。","禁止新增证据摘要中没有的信息;无法安全定位的问题不要生成 patch。",'返回 JSON:{"patches":[{"originalText":"原局部文本","targetStart":"定位起始文本","targetEnd":"定位结束文本","replacement":"替换后的局部文本","reason":"修复原因"}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
70
70
  ${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
71
- ${O(K({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence),{maxChars:L((0,aq.V7)(a.chapter.content),5e3,14e3)})}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});aB(a.signal);let d=a.chapter.content,e=0;for(let b of Array.isArray(c?.patches)?c.patches:[]){let c=function(a){var b;let c=a.patch.replacement?.trim(),d=(b=a.content,Math.max(2600,Math.min(16e3,Math.ceil(.45*(0,aq.V7)(b)))));if(!c||c.length>d||a.forbidDrawingImages&&/!\[[^\]]*\]\([^)]*\)/iu.test(c))return{content:a.content,applied:!1};let e=function(a,b){let c=b.originalText?.trim();if(c&&a.indexOf(c)===a.lastIndexOf(c))return c;let d=b.targetStart?.trim(),e=b.targetEnd?.trim();if(!d||!e)return;let f=a.indexOf(d),g=a.indexOf(e,f+d.length);if(f<0||g<0)return;let h=g+e.length,i=a.slice(f,h);return a.indexOf(i)===a.lastIndexOf(i)?i:void 0}(a.content,a.patch);if(!e||e.length>d)return{content:a.content,applied:!1};let f=V(Q(a.content.replace(e,c),a.forbidDrawingImages));return!function(a,b){let c=(a.match(/```/gu)||[]).length,d=b.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").trim();return c%2==0&&(!d||a.includes(d))&&!/^\s*$/u.test(a)}(f,a.title)||(0,aq.V7)(f)<Math.floor(.65*(0,aq.V7)(a.content))?{content:a.content,applied:!1}:{content:f,applied:f!==a.content}}({content:d,patch:b,title:a.chapter.title,forbidDrawingImages:a.forbidDrawingImages});d=c.content,c.applied&&(e+=1)}return{content:d,appliedCount:e,repairType:b}}async function bu(a){let b=a.issues.filter(a=>"minor"!==(0,ar.z0)(a)).filter(br);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=a.chapters.map(a=>({chapter:a,issues:function(a,b){let c=b.filter(br),d=new Set(a.sections||[]),e=`${a.title}
71
+ ${O(K({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence),{maxChars:L((0,at.V7)(a.chapter.content),5e3,14e3)})}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});aE(a.signal);let d=a.chapter.content,e=0;for(let b of Array.isArray(c?.patches)?c.patches:[]){let c=function(a){var b;let c=a.patch.replacement?.trim(),d=(b=a.content,Math.max(2600,Math.min(16e3,Math.ceil(.45*(0,at.V7)(b)))));if(!c||c.length>d||a.forbidDrawingImages&&/!\[[^\]]*\]\([^)]*\)/iu.test(c))return{content:a.content,applied:!1};let e=function(a,b){let c=b.originalText?.trim();if(c&&a.indexOf(c)===a.lastIndexOf(c))return c;let d=b.targetStart?.trim(),e=b.targetEnd?.trim();if(!d||!e)return;let f=a.indexOf(d),g=a.indexOf(e,f+d.length);if(f<0||g<0)return;let h=g+e.length,i=a.slice(f,h);return a.indexOf(i)===a.lastIndexOf(i)?i:void 0}(a.content,a.patch);if(!e||e.length>d)return{content:a.content,applied:!1};let f=X(Q(a.content.replace(e,c),a.forbidDrawingImages));return!function(a,b){let c=(a.match(/```/gu)||[]).length,d=b.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").trim();return c%2==0&&(!d||a.includes(d))&&!/^\s*$/u.test(a)}(f,a.title)||(0,at.V7)(f)<Math.floor(.65*(0,at.V7)(a.content))?{content:a.content,applied:!1}:{content:f,applied:f!==a.content}}({content:d,patch:b,title:a.chapter.title,forbidDrawingImages:a.forbidDrawingImages});d=c.content,c.applied&&(e+=1)}return{content:d,appliedCount:e,repairType:b}}async function bx(a){let b=a.issues.filter(a=>"minor"!==(0,au.z0)(a)).filter(bu);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=a.chapters.map(a=>({chapter:a,issues:function(a,b){let c=b.filter(bu),d=new Set(a.sections||[]),e=`${a.title}
72
72
  ${a.sections?.join("\n")||""}
73
- ${a.content.slice(0,8e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||m\s*[²2]|mm2|cm2|km2/u.test(e)).slice(0,6)}(a,b)})).filter(a=>a.issues.length>0);if(0===c.length)return{markdown:a.markdown,chapters:a.chapters,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已完成质量检查,未定位到可安全局部修复的阻断问题:共 ${b.length} 个;${b.slice(0,8).join(";")}`}};let d=Number(process.env.DOCUMENT_REPAIR_CONCURRENCY??a.strategy?.maxChapterReviewConcurrency??c.length),e=Math.max(1,Math.min((a.strategy?.maxChapterReviewConcurrency??c.length)||1,Number.isFinite(d)?Math.floor(d):c.length||1)),f=new Map,g=0;for(let b=0;b<c.length;b+=e){aB(a.signal);let d=c.slice(b,b+e);(await Promise.all(d.map(async b=>bt({template:a.template,chapter:b.chapter,issues:b.issues,promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,diagnostics:a.diagnostics,signal:a.signal})))).forEach((a,b)=>{f.set(d[b].chapter.id,a.content),g+=a.appliedCount})}let h=0,i=a.chapters.map(a=>{let b=f.get(a.id);return b&&b!==a.content?(h+=1,{...a,content:b}):a}),j=h>0?`已应用 ${g} 个局部质量 patch,修复 ${h} 个章节;未进行整章或全文重写`:`已完成质量检查,未生成可唯一定位且通过校验的局部 patch:共 ${b.length} 个;${b.slice(0,8).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function bv(a,b){let c=e.isAbsolute(b)?b:e.join(a,b),d=e.isAbsolute(b)?e.relative(a,b):b;return[b,c,d,e.join(a,d)]}function bw(a,b,c){return function(a,b){let c=e.resolve(a),d=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let d=e.resolve(c,"knowledgeBase",b);return as.existsSync(d)?d:e.resolve(c,b)}(c,b);return d===c||d.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&bv(a,b).some(a=>c.has(a))}function bx(a,b){return new Set(b.flatMap(b=>bv(a,b.filePath)))}function by(a){let b=a.replace(/```([\s\S]*?)```/gu,(a,b)=>/<OUTLINE>|\|\s*[^\n]+\s*\||#{1,6}\s+|必须|禁止|不得|应当|要求|规则|格式|输出|表格|章节|小节|正文/u.test(b)?`
73
+ ${a.content.slice(0,8e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||m\s*[²2]|mm2|cm2|km2/u.test(e)).slice(0,6)}(a,b)})).filter(a=>a.issues.length>0);if(0===c.length)return{markdown:a.markdown,chapters:a.chapters,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已完成质量检查,未定位到可安全局部修复的阻断问题:共 ${b.length} 个;${b.slice(0,8).join(";")}`}};let d=Number(process.env.DOCUMENT_REPAIR_CONCURRENCY??a.strategy?.maxChapterReviewConcurrency??c.length),e=Math.max(1,Math.min((a.strategy?.maxChapterReviewConcurrency??c.length)||1,Number.isFinite(d)?Math.floor(d):c.length||1)),f=new Map,g=0;for(let b=0;b<c.length;b+=e){aE(a.signal);let d=c.slice(b,b+e);(await Promise.all(d.map(async b=>bw({template:a.template,chapter:b.chapter,issues:b.issues,promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,diagnostics:a.diagnostics,signal:a.signal})))).forEach((a,b)=>{f.set(d[b].chapter.id,a.content),g+=a.appliedCount})}let h=0,i=a.chapters.map(a=>{let b=f.get(a.id);return b&&b!==a.content?(h+=1,{...a,content:b}):a}),j=h>0?`已应用 ${g} 个局部质量 patch,修复 ${h} 个章节;未进行整章或全文重写`:`已完成质量检查,未生成可唯一定位且通过校验的局部 patch:共 ${b.length} 个;${b.slice(0,8).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function by(a,b){let c=e.isAbsolute(b)?b:e.join(a,b),d=e.isAbsolute(b)?e.relative(a,b):b;return[b,c,d,e.join(a,d)]}function bz(a,b,c){return function(a,b){let c=e.resolve(a),d=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let d=e.resolve(c,"knowledgeBase",b);return av.existsSync(d)?d:e.resolve(c,b)}(c,b);return d===c||d.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&by(a,b).some(a=>c.has(a))}function bA(a,b){return new Set(b.flatMap(b=>by(a,b.filePath)))}function bB(a){let b=a.replace(/```([\s\S]*?)```/gu,(a,b)=>/<OUTLINE>|\|\s*[^\n]+\s*\||#{1,6}\s+|必须|禁止|不得|应当|要求|规则|格式|输出|表格|章节|小节|正文/u.test(b)?`
74
74
  ${b.trim()}
75
- `:"\n【示例代码块已省略:仅作为格式参考,不作为当前文档事实】\n").split(/\r?\n/u),c=[],d=!1,e=!1;for(let a of b){let b=a.trim();if((0,P.bl)(b)&&(e=!0),e){c.push(a),(0,P.Ui)(b)&&(e=!1);continue}let f=/^(?:#+\s*)?(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?/iu.test(b),g=/(?:不得|禁止|必须|应当|要求|规则|格式|输出|保留|只返回|不要|表格|章节|小节|正文|目录|封面)/u.test(b);if(f&&!g){c.at(-1)?.includes("示例内容已省略")||c.push("【示例内容已省略:仅作为格式参考,不作为当前文档事实】"),d=!0;continue}if(d){if(!b){d=!1;continue}if(!(/^(?:#+\s*)?(?:规则|要求|输出|格式|禁止|注意|正文|章节|小节|表格|风格|校验)/u.test(b)||/\|\s*[^\n]+\s*\|/u.test(b)))continue;d=!1}c.push(a)}return c.join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function bz(a){return a.map(a=>`## [${a.roleId}/${a.category}] ${a.name}
76
- ${by(a.content)}`).join("\n\n")}function bA(a,b){let c=a.trim();if(!c)return[];let d=Math.max(1e3,Math.ceil(b)),e=[];for(let a=0;a<c.length;a+=d)e.push(c.slice(a,a+d));return e}function bB(a,b,c){return c<=1?a:`【片段 ${b+1}/${c}】
77
- ${a}`}function bC(a,b=1800){let c=(a.sections||[]).filter(Boolean).join("、")||"未规划小节",d=a.content.replace(/```[\s\S]*?```/gu," ").replace(/[#>*_`\-|]+/gu," ").replace(/\s+/gu," ").trim(),e=Math.max(800,b-500),f=Math.max(600,Math.floor(.7*e)),g=Math.max(200,e-f),h=d.slice(0,f),i=d.length>f+g?d.slice(-g):"",j=Math.max(120,Math.floor((b-h.length-i.length)/4)),k=a.evidence.slice(0,4).map(a=>`${a.filePath||a.roleId||"证据"}: ${F(a.content||"").slice(0,j)}`).join("\n"),l=a.missingFacts.length?`未覆盖事实:${a.missingFacts.slice(0,12).join("、")}`:"未覆盖事实:无";return[`章节:${a.title}`,`字数:${(0,aq.V7)(a.content)}`,`小节:${c}`,l,k?`证据摘要:
75
+ `:"\n【示例代码块已省略:仅作为格式参考,不作为当前文档事实】\n").split(/\r?\n/u),c=[],d=!1,e=!1;for(let a of b){let b=a.trim();if((0,P.bl)(b)&&(e=!0),e){c.push(a),(0,P.Ui)(b)&&(e=!1);continue}let f=/^(?:#+\s*)?(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?/iu.test(b),g=/(?:不得|禁止|必须|应当|要求|规则|格式|输出|保留|只返回|不要|表格|章节|小节|正文|目录|封面)/u.test(b);if(f&&!g){c.at(-1)?.includes("示例内容已省略")||c.push("【示例内容已省略:仅作为格式参考,不作为当前文档事实】"),d=!0;continue}if(d){if(!b){d=!1;continue}if(!(/^(?:#+\s*)?(?:规则|要求|输出|格式|禁止|注意|正文|章节|小节|表格|风格|校验)/u.test(b)||/\|\s*[^\n]+\s*\|/u.test(b)))continue;d=!1}c.push(a)}return c.join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function bC(a){return a.map(a=>`## [${a.roleId}/${a.category}] ${a.name}
76
+ ${bB(a.content)}`).join("\n\n")}function bD(a,b){let c=a.trim();if(!c)return[];let d=Math.max(1e3,Math.ceil(b)),e=[];for(let a=0;a<c.length;a+=d)e.push(c.slice(a,a+d));return e}function bE(a,b,c){return c<=1?a:`【片段 ${b+1}/${c}】
77
+ ${a}`}function bF(a,b=1800){let c=(a.sections||[]).filter(Boolean).join("、")||"未规划小节",d=a.content.replace(/```[\s\S]*?```/gu," ").replace(/[#>*_`\-|]+/gu," ").replace(/\s+/gu," ").trim(),e=Math.max(800,b-500),f=Math.max(600,Math.floor(.7*e)),g=Math.max(200,e-f),h=d.slice(0,f),i=d.length>f+g?d.slice(-g):"",j=Math.max(120,Math.floor((b-h.length-i.length)/4)),k=a.evidence.slice(0,4).map(a=>`${a.filePath||a.roleId||"证据"}: ${F(a.content||"").slice(0,j)}`).join("\n"),l=a.missingFacts.length?`未覆盖事实:${a.missingFacts.slice(0,12).join("、")}`:"未覆盖事实:无";return[`章节:${a.title}`,`字数:${(0,at.V7)(a.content)}`,`小节:${c}`,l,k?`证据摘要:
78
78
  ${k}`:"",`正文摘要:${h}${i?`
79
- 尾部摘要:${i}`:""}`].filter(Boolean).join("\n").slice(0,b)}function bD(a){if(!a)return;let b=a.replace(/^```(?:json)?\s*/u,"").replace(/```$/u,"").trim();try{return JSON.parse(b)}catch{let a=b.match(/\{[\s\S]*\}/u);if(!a)return;try{return JSON.parse(a[0])}catch{return}}}function bE(a){if("string"==typeof a)return a.trim();if(!a||"object"!=typeof a)return"";let b="string"==typeof a.message?a.message.trim():"",c="string"==typeof a.suggestion?a.suggestion.trim():"",d="string"==typeof a.location?a.location.trim():"",e="string"==typeof a.type?a.type.trim():"";return["string"==typeof a.severity?a.severity.trim():"",d||e,b,c].filter(Boolean).join(":").trim()}function bF(a){return[...new Set(a.map(bE).filter(Boolean))]}function bG(a){let b=Number(process.env[a]);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}function bH(a){let b=Math.max(1,Math.ceil(Math.max(0,a.totalChars)/Math.max(1e3,a.chunkChars))),c=Math.max(1,a.chapterCount),d=Math.max(1,Math.ceil(a.totalChars/24e3));return"chapter"===a.phase?{chunks:bG("DOCUMENT_CHAPTER_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(2,Math.ceil(.75*b))),issues:bG("DOCUMENT_CHAPTER_REVIEW_MAX_ISSUES")??Math.max(8,Math.ceil(8*d)),ms:Math.max(6e4,Number(process.env.DOCUMENT_CHAPTER_REVIEW_MAX_MS??Math.min(72e4,Math.max(18e4,9e4*d))))}:"global"===a.phase?{chunks:bG("DOCUMENT_GLOBAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.65*b))),issues:bG("DOCUMENT_GLOBAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(120,8*c+10*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_GLOBAL_REVIEW_MAX_MS??Math.min(108e4,Math.max(24e4,12e4*d))))}:{chunks:bG("DOCUMENT_FINAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.8*b))),issues:bG("DOCUMENT_FINAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(140,10*c+12*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_FINAL_REVIEW_MAX_MS??Math.min(12e5,Math.max(3e5,15e4*d))))}}async function bI(a,b,c){let d=aK();if(!d?.provider.capabilities?.fileUnderstanding&&!d?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};aB(c);let f=(0,au.createProvider)(aJ(d.model.provider,d.provider),{baseUrl:d.provider.baseUrl,apiKey:d.provider.apiKey,modelName:d.model.name,directEndpoint:d.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=Math.max(1,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_FILES??4))),h=Math.max(131072,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_BYTES??8388608))),i=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,g),j=[],k=i.map(b=>{let c=e.join(a,"knowledgeBase",b);return as.existsSync(c)?as.statSync(c).size>h?void j.push(e.basename(b)):{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();if(".png"===b)return"image/png";if(".jpg"===b||".jpeg"===b)return"image/jpeg";if(".webp"===b)return"image/webp";if(".pdf"===b)return"application/pdf";let c="application/vnd.openxmlformats-officedocument.";return".docx"===b?`${c}wordprocessingml.document`:".xlsx"===b?`${c}spreadsheetml.sheet`:"application/octet-stream"}(b),data:as.readFileSync(c)}:void 0}).filter(Boolean);if(0===k.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:j.length?`参考文件过大,已跳过 ${j.length} 个多模态文件理解`:"没有可发送给多模态模型的参考文件"}};try{aB(c);let a=await aO(a=>f.understandFiles(k,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:a}),Math.max(3e4,Math.min(9e4,Number(process.env.DOCUMENT_FILE_UNDERSTANDING_TIMEOUT_MS??6e4))),c);aB(c);let b=a?.content.trim()||"";return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${k.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bJ(a,b,c,d,e,f,g,h="",i={}){let j=O(K(b,c),{maxChars:L(i.targetWords||i.minWords)});if(!j.trim()&&!h.trim())return;let k=b.sections?.length?`本章小节由生成前规划得到,请完整包含并展开以下小节:
80
- ${b.sections.map(a=>`- ${a}`).join("\n")}`:"本章没有预设小节;请按用户提示词、模板章节、角色要求和绑定材料自然组织正文。",l=function(a,b){let c=bK(a,b);return 0===c.length?"":["本章小节篇幅计划(首轮生成应尽量一次达成,避免后续补写):",...c.map(a=>`- ${a.title}:约 ${a.targetWords} 字,至少达到 ${Math.floor(.8*a.targetWords)} 字,并写入与该小节相关的材料事实、适用边界和必要说明。`)].join("\n")}(b,i.targetWords||i.minWords||0),m=[W,i.forbidDrawingImages?"图片类材料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"",e].filter(Boolean).join("\n\n"),n=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,k,l,g?`用户要求:${g}`:"",f?`上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
81
- ${f}`:"",h||"",i.factCoverageContext||"",d.length?`需要特别补足的信息:${d.join("、")}`:"","请生成可直接导出的 Markdown 章节,要求:",`- 保留章节标题;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}${i.maxWords?`,最多不超过 ${i.maxWords} 字`:""}。`,b.sections?.length?"- 必须完整包含已规划小节;不要新增未规划的二级小节。":"- 未预设小节时,不要为了凑结构强行新增小节。",b.tableSections?.length?`- 以下小节可使用表格辅助表达:${b.tableSections.join("、")}。`:"","- 内容必须遵循用户提示词、模板章节、提示词角色、文件角色和绑定材料;不得编造材料未提供的事实。","- 将材料要点自然融入正文;不要输出系统证据清单、中间分析过程或后台流程话术。",X,"",j?"绑定材料:":"",j].filter(Boolean).join("\n"),o=await aN(m,n,!1,{maxTokens:i.maxTokens,signal:i.signal});if(o&&!(o.length<120))return V(Q(o.startsWith("## ")?o:`## ${b.title}
79
+ 尾部摘要:${i}`:""}`].filter(Boolean).join("\n").slice(0,b)}function bG(a){if(!a)return;let b=a.replace(/^```(?:json)?\s*/u,"").replace(/```$/u,"").trim();try{return JSON.parse(b)}catch{let a=b.match(/\{[\s\S]*\}/u);if(!a)return;try{return JSON.parse(a[0])}catch{return}}}function bH(a){if("string"==typeof a)return a.trim();if(!a||"object"!=typeof a)return"";let b="string"==typeof a.message?a.message.trim():"",c="string"==typeof a.suggestion?a.suggestion.trim():"",d="string"==typeof a.location?a.location.trim():"",e="string"==typeof a.type?a.type.trim():"";return["string"==typeof a.severity?a.severity.trim():"",d||e,b,c].filter(Boolean).join(":").trim()}function bI(a){return[...new Set(a.map(bH).filter(Boolean))]}function bJ(a){let b=Number(process.env[a]);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}function bK(a){let b=Math.max(1,Math.ceil(Math.max(0,a.totalChars)/Math.max(1e3,a.chunkChars))),c=Math.max(1,a.chapterCount),d=Math.max(1,Math.ceil(a.totalChars/24e3));return"chapter"===a.phase?{chunks:bJ("DOCUMENT_CHAPTER_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(2,Math.ceil(.75*b))),issues:bJ("DOCUMENT_CHAPTER_REVIEW_MAX_ISSUES")??Math.max(8,Math.ceil(8*d)),ms:Math.max(6e4,Number(process.env.DOCUMENT_CHAPTER_REVIEW_MAX_MS??Math.min(72e4,Math.max(18e4,9e4*d))))}:"global"===a.phase?{chunks:bJ("DOCUMENT_GLOBAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.65*b))),issues:bJ("DOCUMENT_GLOBAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(120,8*c+10*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_GLOBAL_REVIEW_MAX_MS??Math.min(108e4,Math.max(24e4,12e4*d))))}:{chunks:bJ("DOCUMENT_FINAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.8*b))),issues:bJ("DOCUMENT_FINAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(140,10*c+12*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_FINAL_REVIEW_MAX_MS??Math.min(12e5,Math.max(3e5,15e4*d))))}}async function bL(a,b,c){let d=aN();if(!d?.provider.capabilities?.fileUnderstanding&&!d?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};aE(c);let f=(0,ax.createProvider)(aM(d.model.provider,d.provider),{baseUrl:d.provider.baseUrl,apiKey:d.provider.apiKey,modelName:d.model.name,directEndpoint:d.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=Math.max(1,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_FILES??4))),h=Math.max(131072,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_BYTES??8388608))),i=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,g),j=[],k=i.map(b=>{let c=e.join(a,"knowledgeBase",b);return av.existsSync(c)?av.statSync(c).size>h?void j.push(e.basename(b)):{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();if(".png"===b)return"image/png";if(".jpg"===b||".jpeg"===b)return"image/jpeg";if(".webp"===b)return"image/webp";if(".pdf"===b)return"application/pdf";let c="application/vnd.openxmlformats-officedocument.";return".docx"===b?`${c}wordprocessingml.document`:".xlsx"===b?`${c}spreadsheetml.sheet`:"application/octet-stream"}(b),data:av.readFileSync(c)}:void 0}).filter(Boolean);if(0===k.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:j.length?`参考文件过大,已跳过 ${j.length} 个多模态文件理解`:"没有可发送给多模态模型的参考文件"}};try{aE(c);let a=await aR(a=>f.understandFiles(k,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:a}),Math.max(3e4,Math.min(9e4,Number(process.env.DOCUMENT_FILE_UNDERSTANDING_TIMEOUT_MS??6e4))),c);aE(c);let b=a?.content.trim()||"";return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${k.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bM(a,b,c,d,e,f,g,h="",i={}){let j=O(K(b,c),{maxChars:L(i.targetWords||i.minWords)});if(!j.trim()&&!h.trim())return;let k=b.sections?.length?`本章小节由生成前规划得到,请完整包含并展开以下小节:
80
+ ${b.sections.map(a=>`- ${a}`).join("\n")}`:"本章没有预设小节;请按用户提示词、模板章节、角色要求和绑定材料自然组织正文。",l=function(a,b){let c=bN(a,b);return 0===c.length?"":["本章小节篇幅计划(首轮生成应尽量一次达成,避免后续补写):",...c.map(a=>`- ${a.title}:约 ${a.targetWords} 字,至少达到 ${Math.floor(.8*a.targetWords)} 字,并写入与该小节相关的材料事实、适用边界和必要说明。`)].join("\n")}(b,i.targetWords||i.minWords||0),m=[Y,i.forbidDrawingImages?"图片类材料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"",e].filter(Boolean).join("\n\n"),n=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,k,l,g?`用户要求:${g}`:"",f?`上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
81
+ ${f}`:"",h||"",i.factCoverageContext||"",d.length?`需要特别补足的信息:${d.join("、")}`:"","请生成可直接导出的 Markdown 章节,要求:",`- 保留章节标题;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}${i.maxWords?`,最多不超过 ${i.maxWords} 字`:""}。`,b.sections?.length?"- 必须完整包含已规划小节;不要新增未规划的二级小节。":"- 未预设小节时,不要为了凑结构强行新增小节。",b.tableSections?.length?`- 以下小节可使用表格辅助表达:${b.tableSections.join("、")}。`:"","- 内容必须遵循用户提示词、模板章节、提示词角色、文件角色和绑定材料;不得编造材料未提供的事实。","- 将材料要点自然融入正文;不要输出系统证据清单、中间分析过程或后台流程话术。",Z,"",j?"绑定材料:":"",j].filter(Boolean).join("\n"),o=await aQ(m,n,!1,{maxTokens:i.maxTokens,signal:i.signal});if(o&&!(o.length<120))return X(Q(o.startsWith("## ")?o:`## ${b.title}
82
82
 
83
- ${o}`,!!i.forbidDrawingImages))}function bK(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.floor(b/c.length),e=Math.max(b>=900*c.length?900:Math.max(520,Math.floor(.9*d)),d);return c.map(a=>({title:a,targetWords:e}))}function bL(a,b,c){let d=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))],e=/项目概况|工程概况|总体|部署|施工方案|工期|进度|质量|安全|资源|材料|设备/u.test(a),f=c.map((b,c)=>{let f=`${b.filePath}
83
+ ${o}`,!!i.forbidDrawingImages))}function bN(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.floor(b/c.length),e=Math.max(b>=900*c.length?900:Math.max(520,Math.floor(.9*d)),d);return c.map(a=>({title:a,targetWords:e}))}function bO(a,b,c){let d=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))],e=/项目概况|工程概况|总体|部署|施工方案|工期|进度|质量|安全|资源|材料|设备/u.test(a),f=c.map((b,c)=>{let f=`${b.filePath}
84
84
  ${b.sectionTitle||""}
85
85
  ${b.content}`.toLowerCase(),g=`${b.filePath}
86
86
  ${b.sectionTitle||""}
87
- ${b.content}`,h=d.reduce((a,b)=>a+ +!!f.includes(b),0),i=b.sectionTitle&&(a.includes(b.sectionTitle)||b.sectionTitle.includes(a))?4:0,j=1.5*!!/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元|规格|型号|数量|合同估算价|合同估算价格|计划工期/iu.test(g),k=e&&/计划工期|合同工期|合同估算价|合同估算价格|投资估算|建设地点|建设规模|质量标准|招标范围/u.test(g)?5:0,l=.8*!!/table|sheet|bill|data|drawing|图纸|表格|清单|参数|数据|说明/u.test(`${b.roleId||""} ${b.processingType||""} ${b.filePath}`);return{item:b,score:h+i+j+k+l+.1*b.score-.001*c}}).sort((a,b)=>b.score-a.score).filter(a=>a.score>0).map(a=>a.item);return f.length>0?f:c}function bM(a){return(0,P.GQ)(a).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分、..\s-]*/u,"").replace(/^\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/[<>]/gu,"").replace(/[::。;;,.,]+$/gu,"").trim()}function bN(a){let b=bM(a).replace(/\s+/gu,"");return!!(!b||/^(?:目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位|提示)$/u.test(b))||/^(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用)|^(?:如|若|如果)(?:涉及|不涉及|适用|不适用)|(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成)|按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项/u.test(b)}function bO(a,b){let c=bM(a),d=bM(b);if(c.length<4||c.length>60||c===d||bN(c)||/^(?:目标与范围|资料依据|实施内容|质量控制|概述|总体要求)$/u.test(c)||/如需|应由|大模型|提示词|上下文|动态规划|OUTLINE|章节生成|按照.*明确指定|需求和资料|JSON|小节标题/u.test(c)||/(.)\1/u.test(c))return!0;let e=d.match(/[\p{L}\p{N}]{2,6}$/u)?.[0]||"";return!(!(e.length>=2&&/^.{2,8}\p{L}$/u.test(c)&&c.endsWith(e.slice(-1)))||c.includes(e))}function bP(a,b){let c=bM(a).replace(/[\s()()::.。;;,,、-]/gu,""),d=bM(b).replace(/[\s()()::.。;;,,、-]/gu,"");return!!c&&!!d&&(c===d||c.includes(d)||d.includes(c))}function bQ(a){return Array.from(new Set(a.map(bM).filter(a=>a.length>=2&&a.length<=30&&!bN(a)&&!/必须|强制|排序|设置|输出|独立|之后|之前|小节|其他必要/u.test(a))))}function bR(a){let b=new Set;for(let c of[/(?:必须|应当|需要|全文必须)包含[::]\s*([^。;;\n]+)/gu,/(?:必须|应当|需要|全文必须)体现[::]\s*([^。;;\n]+)/gu,/(?:关键词|核心要点)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=a.trim().replace(/["“”'‘’《》<>]/gu,"");c.length>=2&&c.length<=24&&!/表格|章节|小节|正文|目录|封面/u.test(c)&&b.add(c)}return[...b].slice(0,24)}function bS(a){let b=new Set;for(let c of[/(?:禁止|不得|严禁|杜绝)出现[::]\s*([^。;;\n]+)/gu,/(?:禁用词|禁止词|不得使用)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=a.trim().replace(/["“”'‘’《》<>]/gu,"");c.length>=2&&c.length<=24&&b.add(c)}return[...b].slice(0,40)}function bT(a,b){return a.split(/[。;;\n]/u).map(a=>a.trim()).filter(a=>a.length>=4&&b.test(a)).slice(0,24)}function bU(a,b){let c=RegExp(`(?:生成|包含|输出|需要|保留|设置|编制|制作)[^。;;\\n]{0,12}${b}|${b}[^。;;\\n]{0,12}(?:必须|应当|需要|保留|生成|输出|包含)`,"u").test(a);return RegExp(`(?:不要|不需要|不允许|不得|禁止|严禁|不输出|不生成|无需)[^。;;\\n]{0,12}${b}|${b}[^。;;\\n]{0,12}(?:不要|不需要|不允许|不得|禁止|严禁|不输出|不生成|无需)`,"u").test(a)?"forbidden":c?"required":"unspecified"}async function bV(a){var b,c,d,e;let f=O(K(a.chapter,a.evidence),{maxChars:L(a.targetWords,5e3,12e3)}),g=(b=a.structuralRules,c=a.chapter,d=a.chapterIndex,(b||[]).filter(a=>!!(void 0!==a.chapterIndex&&void 0!==d&&a.chapterIndex===d||a.chapterTitle&&bP(a.chapterTitle,c.title)))),h=g.flatMap(a=>a.requiredSections).sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title),i=function(a,b,c,d){let e=a.title,f=/质量|安全|工期|进度|物资|材料|机械|设备|劳动力|危大|专项|文明|总平面|施工方法|施工方案/u.test(e),g=b>=14e3?8:b>=8e3?6:b>=5e3?5:b>=3e3?4:3;f&&(g=Math.max(g,4));let h=new Set((c.map(a=>`${a.sectionTitle||""}
88
- ${a.content}`).join("\n").slice(0,3e4).match(/\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)|DN\s*\d+|Φ\s*\d+|φ\s*\d+|C\d{2,}|HRB\d+|GB\/?T?\s*[\w.-]+|JGJ\s*[\w.-]+/giu)||[]).map(a=>a.replace(/\s+/gu,""))).size;return h>=20?g=Math.max(g,6):h>=10&&(g=Math.max(g,5)),Math.max(g,d)}(a.chapter,a.targetWords,a.evidence,h.length),j=Math.max(i+2,a.targetWords>=14e3?10:a.targetWords>=8e3?8:7),k=await aP("你是专业文档结构规划专家。\n只根据用户提示词、章节标题和真实绑定资料规划本章二级小节;不得使用“目标与范围、资料依据、实施内容、质量控制”等通用占位小节凑数。\n施工组织、技术措施、资源配置、质量、安全、工期、材料、设备、劳动力、危大工程等核心章节必须拆成足够的专业工作面,不得只输出两个泛化小节。\n只返回 JSON。",[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.chapter.purpose&&!bO(a.chapter.purpose,a.chapter.title)?`章节目的:${a.chapter.purpose}`:"",a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
87
+ ${b.content}`,h=d.reduce((a,b)=>a+ +!!f.includes(b),0),i=b.sectionTitle&&(a.includes(b.sectionTitle)||b.sectionTitle.includes(a))?4:0,j=1.5*!!/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元|规格|型号|数量|合同估算价|合同估算价格|计划工期/iu.test(g),k=e&&/计划工期|合同工期|合同估算价|合同估算价格|投资估算|建设地点|建设规模|质量标准|招标范围/u.test(g)?5:0,l=.8*!!/table|sheet|bill|data|drawing|图纸|表格|清单|参数|数据|说明/u.test(`${b.roleId||""} ${b.processingType||""} ${b.filePath}`);return{item:b,score:h+i+j+k+l+.1*b.score-.001*c}}).sort((a,b)=>b.score-a.score).filter(a=>a.score>0).map(a=>a.item);return f.length>0?f:c}function bP(a){return(0,P.GQ)(a).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分、..\s-]*/u,"").replace(/^\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/[<>]/gu,"").replace(/[::。;;,.,]+$/gu,"").trim()}function bQ(a){let b=bP(a).replace(/\s+/gu,"");return!!(!b||/^(?:目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位|提示)$/u.test(b))||/^(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用)|^(?:如|若|如果)(?:涉及|不涉及|适用|不适用)|(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成)|按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项/u.test(b)}function bR(a,b){let c=bP(a),d=bP(b);if(c.length<4||c.length>60||c===d||bQ(c)||/^(?:目标与范围|资料依据|实施内容|质量控制|概述|总体要求)$/u.test(c)||/如需|应由|大模型|提示词|上下文|动态规划|OUTLINE|章节生成|按照.*明确指定|需求和资料|JSON|小节标题/u.test(c)||/(.)\1/u.test(c))return!0;let e=d.match(/[\p{L}\p{N}]{2,6}$/u)?.[0]||"";return!(!(e.length>=2&&/^.{2,8}\p{L}$/u.test(c)&&c.endsWith(e.slice(-1)))||c.includes(e))}function bS(a,b){let c=bP(a).replace(/[\s()()::.。;;,,、-]/gu,""),d=bP(b).replace(/[\s()()::.。;;,,、-]/gu,"");return!!c&&!!d&&(c===d||c.includes(d)||d.includes(c))}function bT(a){return Array.from(new Set(a.map(bP).filter(a=>a.length>=2&&a.length<=30&&!bQ(a)&&!/必须|强制|排序|设置|输出|独立|之后|之前|小节|其他必要/u.test(a))))}function bU(a){let b=new Set;for(let c of[/(?:必须|应当|需要|全文必须)包含[::]\s*([^。;;\n]+)/gu,/(?:必须|应当|需要|全文必须)体现[::]\s*([^。;;\n]+)/gu,/(?:关键词|核心要点)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=a.trim().replace(/["“”'‘’《》<>]/gu,"");c.length>=2&&c.length<=24&&!/表格|章节|小节|正文|目录|封面/u.test(c)&&b.add(c)}return[...b].slice(0,24)}function bV(a){let b=new Set;for(let c of[/(?:禁止|不得|严禁|杜绝)出现[::]\s*([^。;;\n]+)/gu,/(?:禁用词|禁止词|不得使用)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=a.trim().replace(/["“”'‘’《》<>]/gu,"");c.length>=2&&c.length<=24&&b.add(c)}return[...b].slice(0,40)}function bW(a,b){return a.split(/[。;;\n]/u).map(a=>a.trim()).filter(a=>a.length>=4&&b.test(a)).slice(0,24)}function bX(a,b){let c=RegExp(`(?:生成|包含|输出|需要|保留|设置|编制|制作)[^。;;\\n]{0,12}${b}|${b}[^。;;\\n]{0,12}(?:必须|应当|需要|保留|生成|输出|包含)`,"u").test(a);return RegExp(`(?:不要|不需要|不允许|不得|禁止|严禁|不输出|不生成|无需)[^。;;\\n]{0,12}${b}|${b}[^。;;\\n]{0,12}(?:不要|不需要|不允许|不得|禁止|严禁|不输出|不生成|无需)`,"u").test(a)?"forbidden":c?"required":"unspecified"}async function bY(a){var b,c,d,e;let f=O(K(a.chapter,a.evidence),{maxChars:L(a.targetWords,5e3,12e3)}),g=(b=a.structuralRules,c=a.chapter,d=a.chapterIndex,(b||[]).filter(a=>!!(void 0!==a.chapterIndex&&void 0!==d&&a.chapterIndex===d||a.chapterTitle&&bS(a.chapterTitle,c.title)))),h=g.flatMap(a=>a.requiredSections).sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title),i=function(a,b,c,d){let e=a.title,f=/质量|安全|工期|进度|物资|材料|机械|设备|劳动力|危大|专项|文明|总平面|施工方法|施工方案/u.test(e),g=b>=14e3?8:b>=8e3?6:b>=5e3?5:b>=3e3?4:3;f&&(g=Math.max(g,4));let h=new Set((c.map(a=>`${a.sectionTitle||""}
88
+ ${a.content}`).join("\n").slice(0,3e4).match(/\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)|DN\s*\d+|Φ\s*\d+|φ\s*\d+|C\d{2,}|HRB\d+|GB\/?T?\s*[\w.-]+|JGJ\s*[\w.-]+/giu)||[]).map(a=>a.replace(/\s+/gu,""))).size;return h>=20?g=Math.max(g,6):h>=10&&(g=Math.max(g,5)),Math.max(g,d)}(a.chapter,a.targetWords,a.evidence,h.length),j=Math.max(i+2,a.targetWords>=14e3?10:a.targetWords>=8e3?8:7),k=await aS("你是专业文档结构规划专家。\n只根据用户提示词、章节标题和真实绑定资料规划本章二级小节;不得使用“目标与范围、资料依据、实施内容、质量控制”等通用占位小节凑数。\n施工组织、技术措施、资源配置、质量、安全、工期、材料、设备、劳动力、危大工程等核心章节必须拆成足够的专业工作面,不得只输出两个泛化小节。\n只返回 JSON。",[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.chapter.purpose&&!bR(a.chapter.purpose,a.chapter.title)?`章节目的:${a.chapter.purpose}`:"",a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
89
89
  ${a.projectContext}`:"",a.roleContext,a.promptTexts?`配置写作主控提示词:
90
90
  ${a.promptTexts}`:"",h.length?`系统已从提示词解析出本章强制二级小节,必须按此顺序置于本章小节最前,不得删除、改名或重排:${h.join("、")}`:"",f?`真实绑定资料:
91
- ${f}`:"",`请输出 ${i}-${j} 个适合直接成稿的二级小节标题。标题必须具体、业务相关、能承载真实资料;每个小节应对应不同工作面、技术点、管理点或资料类别,避免多个小节表达同一内容。核心章节不得只输出“总体部署与责任分工、实施流程与关键控制”两个泛化小节。`,'JSON 格式:{"sections":["小节标题1","小节标题2"]}'].filter(Boolean).join("\n\n"),{maxTokens:1600,temperature:.1,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:12e4}),l=Array.from(new Set(function(a){let b=bM(a),c=[],d=/体系|措施|管理|保障|方案|要求|计划|控制|配置/u,e=a=>{let b=/^(.*?)([^与和及、,,;;]+(?:[与和及][^与和及、,,;;]+)+)(的.+)$/u.exec(a);if(!b)return!1;let d=b[1]||"",e=b[3]||"";for(let a of b[2].split(/[与和及]/u))c.push(bM(`${d}${a}${e}`));return!0},f=a=>{let b=a.split(/[、,,]/u).map(bM).filter(Boolean);if(b.length>1&&b.every(a=>a.length>=4&&d.test(a))){for(let a of b)e(a)||c.push(a);return!0}let f=/^(.*?)([^、,,;;]+(?:[、,,][^、,,;;]+)+)(的.+)$/u.exec(a);if(!f)return!1;let g=f[1]||"",h=f[3]||"";for(let a of f[2].split(/[、,,]/u))c.push(bM(`${g}${a}${h}`));return!0};for(let a of b.split(/[;;]/u)){if(f(a)||e(a))continue;let d=bM(a);d&&d!==b&&c.push(d)}return Array.from(new Set(c)).filter(c=>c.length>=4&&c.length<=60&&c!==b&&!bO(c,a))}(a.chapter.title)));for(let b of(k?.sections||[]).map(bM).filter(b=>!bO(b,a.chapter.title)))l.some(a=>a.includes(b)||b.includes(a))||l.push(b);for(let b of[...[a.chapter.title,...a.chapter.requiredFacts||[],...a.chapter.queries||[]].flatMap(a=>String(a||"").split(/[;;。\n]/u)).map(bM).filter(b=>!bO(b,a.chapter.title)),...(e=a.chapter.title,/质量/u.test(e)?["质量目标与质量管理体系","关键工序质量控制措施","材料设备进场验收与检验","质量检查试验与验收程序","质量通病防治与整改闭环","成品保护与资料管理"]:/安全/u.test(e)?["安全生产管理体系","危险源辨识与分级管控","现场安全防护措施","临时用电与机械设备安全管理","应急处置与安全检查整改","安全教育培训与交底"]:/工期|进度/u.test(e)?["总工期目标与节点安排","施工进度计划编制原则","关键线路与工序穿插安排","资源投入与工期保障措施","进度偏差纠偏与动态调整","工期风险识别与应对措施"]:/物资|材料/u.test(e)?["主要材料设备需求分析","材料采购与进场计划","材料验收复试与保管","周转材料配置与使用管理","材料供应风险与保障措施"]:/机械|设备/u.test(e)?["主要机械设备配置原则","机械设备进退场计划","机械设备调度与运行管理","机械设备维护保养与安全检查","关键设备保障措施"]:/劳动力/u.test(e)?["劳动力配置原则","各阶段劳动力投入计划","专业工种与特种作业人员配置","劳动力动态调配措施","劳务管理与教育交底"]:/文明|环保/u.test(e)?["现场封闭与场容场貌管理","环境保护与污染防治措施","材料设备定置化管理","职业健康与消防文明管理","文明施工检查与整改"]:/总平面|平面布置/u.test(e)?["施工总平面布置原则","临时道路与材料堆场布置","临时用水用电及排水布置","办公生活与加工区域布置","总平面动态调整与管理"]:/危大|专项/u.test(e)?["危大工程识别与清单管理","专项施工方案编制与审批","专家论证与技术交底","现场实施监测与旁站管理","应急处置与验收销项"]:/施工方法|施工方案|主要/u.test(e)?["总体施工部署与流程安排","主要分部分项施工方法","关键工序技术控制要点","资源配置与穿插组织","质量安全与成品保护措施"]:["总体部署与责任分工","实施流程与关键控制","资源配置与资料依据","质量安全与风险控制","检查验收与闭环管理","资料记录与成果移交"]).filter(b=>!bO(b,a.chapter.title))]){if(l.length>=i)break;l.some(a=>a.includes(b)||b.includes(a))||l.push(b)}return function(a,b,c){let d=c.flatMap(a=>a.requiredSections).sort((a,b)=>(a.order||0)-(b.order||0));if(0===d.length)return a;let e=[];for(let a of d){let b=bM(a.title);b&&b.length>=2&&b.length<=60&&!e.some(a=>bP(a,b))&&e.push(b)}for(let c of a){let a=bM(c);!(!a||bO(a,b))&&(e.some(b=>bP(b,a))||e.push(a))}return e}(l,a.chapter.title,g)}async function bW(a){let b=bL(a.sectionTitle,a.chapter,a.evidence),c=function(a,b){let c=[],d=new Set,e=/计划工期|合同工期|合同估算价|合同估算价格|投资估算|估算价格|工程估算价|最高投标限价|招标控制价|建设地点|建设规模|质量标准|招标范围|\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年)/iu;for(let a of b){for(let b of aA(a.content).split(/\r?\n/u)){let a=b.replace(/\s+/gu," ").trim();if(a.length<4||a.length>260||!e.test(a)||/报价明细|综合单价|税率|增值税|利润|结算/u.test(a)&&!/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))continue;let f=a.replace(/[\s,。,.;;::]/gu,"");if(!d.has(f)&&(d.add(f),c.push(`- ${a}`),c.length>=12))break}if(c.length>=12)break}return c.length?`【当前小节可直接落位的资料事实】
91
+ ${f}`:"",`请输出 ${i}-${j} 个适合直接成稿的二级小节标题。标题必须具体、业务相关、能承载真实资料;每个小节应对应不同工作面、技术点、管理点或资料类别,避免多个小节表达同一内容。核心章节不得只输出“总体部署与责任分工、实施流程与关键控制”两个泛化小节。`,'JSON 格式:{"sections":["小节标题1","小节标题2"]}'].filter(Boolean).join("\n\n"),{maxTokens:1600,temperature:.1,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:12e4}),l=Array.from(new Set(function(a){let b=bP(a),c=[],d=/体系|措施|管理|保障|方案|要求|计划|控制|配置/u,e=a=>{let b=/^(.*?)([^与和及、,,;;]+(?:[与和及][^与和及、,,;;]+)+)(的.+)$/u.exec(a);if(!b)return!1;let d=b[1]||"",e=b[3]||"";for(let a of b[2].split(/[与和及]/u))c.push(bP(`${d}${a}${e}`));return!0},f=a=>{let b=a.split(/[、,,]/u).map(bP).filter(Boolean);if(b.length>1&&b.every(a=>a.length>=4&&d.test(a))){for(let a of b)e(a)||c.push(a);return!0}let f=/^(.*?)([^、,,;;]+(?:[、,,][^、,,;;]+)+)(的.+)$/u.exec(a);if(!f)return!1;let g=f[1]||"",h=f[3]||"";for(let a of f[2].split(/[、,,]/u))c.push(bP(`${g}${a}${h}`));return!0};for(let a of b.split(/[;;]/u)){if(f(a)||e(a))continue;let d=bP(a);d&&d!==b&&c.push(d)}return Array.from(new Set(c)).filter(c=>c.length>=4&&c.length<=60&&c!==b&&!bR(c,a))}(a.chapter.title)));for(let b of(k?.sections||[]).map(bP).filter(b=>!bR(b,a.chapter.title)))l.some(a=>a.includes(b)||b.includes(a))||l.push(b);for(let b of[...[a.chapter.title,...a.chapter.requiredFacts||[],...a.chapter.queries||[]].flatMap(a=>String(a||"").split(/[;;。\n]/u)).map(bP).filter(b=>!bR(b,a.chapter.title)),...(e=a.chapter.title,/质量/u.test(e)?["质量目标与质量管理体系","关键工序质量控制措施","材料设备进场验收与检验","质量检查试验与验收程序","质量通病防治与整改闭环","成品保护与资料管理"]:/安全/u.test(e)?["安全生产管理体系","危险源辨识与分级管控","现场安全防护措施","临时用电与机械设备安全管理","应急处置与安全检查整改","安全教育培训与交底"]:/工期|进度/u.test(e)?["总工期目标与节点安排","施工进度计划编制原则","关键线路与工序穿插安排","资源投入与工期保障措施","进度偏差纠偏与动态调整","工期风险识别与应对措施"]:/物资|材料/u.test(e)?["主要材料设备需求分析","材料采购与进场计划","材料验收复试与保管","周转材料配置与使用管理","材料供应风险与保障措施"]:/机械|设备/u.test(e)?["主要机械设备配置原则","机械设备进退场计划","机械设备调度与运行管理","机械设备维护保养与安全检查","关键设备保障措施"]:/劳动力/u.test(e)?["劳动力配置原则","各阶段劳动力投入计划","专业工种与特种作业人员配置","劳动力动态调配措施","劳务管理与教育交底"]:/文明|环保/u.test(e)?["现场封闭与场容场貌管理","环境保护与污染防治措施","材料设备定置化管理","职业健康与消防文明管理","文明施工检查与整改"]:/总平面|平面布置/u.test(e)?["施工总平面布置原则","临时道路与材料堆场布置","临时用水用电及排水布置","办公生活与加工区域布置","总平面动态调整与管理"]:/危大|专项/u.test(e)?["危大工程识别与清单管理","专项施工方案编制与审批","专家论证与技术交底","现场实施监测与旁站管理","应急处置与验收销项"]:/施工方法|施工方案|主要/u.test(e)?["总体施工部署与流程安排","主要分部分项施工方法","关键工序技术控制要点","资源配置与穿插组织","质量安全与成品保护措施"]:["总体部署与责任分工","实施流程与关键控制","资源配置与资料依据","质量安全与风险控制","检查验收与闭环管理","资料记录与成果移交"]).filter(b=>!bR(b,a.chapter.title))]){if(l.length>=i)break;l.some(a=>a.includes(b)||b.includes(a))||l.push(b)}return function(a,b,c){let d=c.flatMap(a=>a.requiredSections).sort((a,b)=>(a.order||0)-(b.order||0));if(0===d.length)return a;let e=[];for(let a of d){let b=bP(a.title);b&&b.length>=2&&b.length<=60&&!e.some(a=>bS(a,b))&&e.push(b)}for(let c of a){let a=bP(c);!(!a||bR(a,b))&&(e.some(b=>bS(b,a))||e.push(a))}return e}(l,a.chapter.title,g)}async function bZ(a){let b=bO(a.sectionTitle,a.chapter,a.evidence),c=function(a,b){let c=[],d=new Set,e=/计划工期|合同工期|合同估算价|合同估算价格|投资估算|估算价格|工程估算价|最高投标限价|招标控制价|建设地点|建设规模|质量标准|招标范围|\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年)/iu;for(let a of b){for(let b of aD(a.content).split(/\r?\n/u)){let a=b.replace(/\s+/gu," ").trim();if(a.length<4||a.length>260||!e.test(a)||/报价明细|综合单价|税率|增值税|利润|结算/u.test(a)&&!/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))continue;let f=a.replace(/[\s,。,.;;::]/gu,"");if(!d.has(f)&&(d.add(f),c.push(`- ${a}`),c.length>=12))break}if(c.length>=12)break}return c.length?`【当前小节可直接落位的资料事实】
92
92
  ${c.join("\n")}
93
93
  上述事实均来自本小节相关绑定资料;与“${a}”相关时必须自然写入正文,不得改写数值。`:""}(a.sectionTitle,b),d=O(K(a.chapter,b),{maxChars:L(a.targetWords,3500,9e3)}),e=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
94
- ${a.projectContext}`:"",a.factCoverageContext||"",c,a.roleContext,a.missingFacts.length?`需要特别补足的信息:${a.missingFacts.join("、")}`:"",a.qualityFeedback?`上轮小节未通过质量检查,必须修正:${a.qualityFeedback}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,"本章二级小节结构已由系统按模板和提示词锁定;不得删除、重命名、合并或重排当前小节标题。",X,d?`绑定材料:
95
- ${d}`:""].filter(Boolean).join("\n\n"),f=()=>aN(["你是专业文档的小节生成专家。",W,a.promptTexts].filter(Boolean).join("\n\n"),e,!1,{maxTokens:b0(a.targetWords),temperature:.25,signal:a.signal}),g=()=>aO(f,a.timeoutMs,a.signal),h=a.timeoutMs?await (a.diagnostics?bh(a.diagnostics,`section-draft:${a.chapter.id}:${a.sectionTitle}`,g):g()):await f();if(h&&!(h.length<80))return V(Q(h.startsWith("### ")?h:`### ${a.sectionTitle}
94
+ ${a.projectContext}`:"",a.factCoverageContext||"",c,a.roleContext,a.missingFacts.length?`需要特别补足的信息:${a.missingFacts.join("、")}`:"",a.qualityFeedback?`上轮小节未通过质量检查,必须修正:${a.qualityFeedback}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,"本章二级小节结构已由系统按模板和提示词锁定;不得删除、重命名、合并或重排当前小节标题。",Z,d?`绑定材料:
95
+ ${d}`:""].filter(Boolean).join("\n\n"),f=()=>aQ(["你是专业文档的小节生成专家。",Y,a.promptTexts].filter(Boolean).join("\n\n"),e,!1,{maxTokens:b3(a.targetWords),temperature:.25,signal:a.signal}),g=()=>aR(f,a.timeoutMs,a.signal),h=a.timeoutMs?await (a.diagnostics?bk(a.diagnostics,`section-draft:${a.chapter.id}:${a.sectionTitle}`,g):g()):await f();if(h&&!(h.length<80))return X(Q(h.startsWith("### ")?h:`### ${a.sectionTitle}
96
96
 
97
- ${h}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}function bX(a){return a.replace(/^#{3,4}\s+.*\n+/u,"").trim()}async function bY(a){let b=(0,aq.V7)(a.currentContent),c=a.targetWords-b;if(c<=Math.max(260,Math.floor(.12*a.targetWords)))return a.currentContent;let d=bL(a.sectionTitle,a.chapter,a.evidence),e=O(K(a.chapter,d),{maxChars:L(Math.min(a.targetWords,2600),3500,9e3)}),f=Math.min(Math.max(500,c),Math.max(900,Math.floor(.45*a.targetWords))),g=V(Q(await aO(c=>aN(["你是专业文档小节补写专家。只做补写,不重写全文。",W,"必须保留已有正文中的事实、参数、编号和结构;只补充缺口段落,不删除、不压缩已有内容。",X,a.promptTexts].filter(Boolean).join("\n\n"),[`章节标题:${a.chapter.title}`,`当前小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.factCoverageContext||"",`当前小节约 ${b} 字,目标约 ${a.targetWords} 字,本轮补充约 ${f} 字。`,"请输出可直接追加或插入到本小节的补充段落;不要重复小节标题,不要解释生成过程。",e?`绑定材料:
97
+ ${h}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}function b$(a){return a.replace(/^#{3,4}\s+.*\n+/u,"").trim()}async function b_(a){let b=(0,at.V7)(a.currentContent),c=a.targetWords-b;if(c<=Math.max(260,Math.floor(.12*a.targetWords)))return a.currentContent;let d=bO(a.sectionTitle,a.chapter,a.evidence),e=O(K(a.chapter,d),{maxChars:L(Math.min(a.targetWords,2600),3500,9e3)}),f=Math.min(Math.max(500,c),Math.max(900,Math.floor(.45*a.targetWords))),g=X(Q(await aR(c=>aQ(["你是专业文档小节补写专家。只做补写,不重写全文。",Y,"必须保留已有正文中的事实、参数、编号和结构;只补充缺口段落,不删除、不压缩已有内容。",Z,a.promptTexts].filter(Boolean).join("\n\n"),[`章节标题:${a.chapter.title}`,`当前小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.factCoverageContext||"",`当前小节约 ${b} 字,目标约 ${a.targetWords} 字,本轮补充约 ${f} 字。`,"请输出可直接追加或插入到本小节的补充段落;不要重复小节标题,不要解释生成过程。",e?`绑定材料:
98
98
  ${e}`:"",`已有小节正文:
99
- ${bX(a.currentContent).slice(0,12e3)}`].filter(Boolean).join("\n\n"),!1,{maxTokens:b0(f),temperature:.25,signal:c}),Math.max(9e4,Math.min(18e4,b1(f))),a.signal)||"",a.forbidDrawingImages)).replace(/^#{3,4}\s+.*\n+/u,"").trim();return g?`${a.currentContent.trim()}
99
+ ${b$(a.currentContent).slice(0,12e3)}`].filter(Boolean).join("\n\n"),!1,{maxTokens:b3(f),temperature:.25,signal:c}),Math.max(9e4,Math.min(18e4,b4(f))),a.signal)||"",a.forbidDrawingImages)).replace(/^#{3,4}\s+.*\n+/u,"").trim();return g?`${a.currentContent.trim()}
100
100
 
101
- ${g}`:a.currentContent}function bZ(a){return`### ${a}
101
+ ${g}`:a.currentContent}function b0(a){return`### ${a}
102
102
 
103
- ${a}应作为本章首轮成稿的独立控制单元组织实施。编制和执行过程中,应围绕已确认的项目资料、设计文件、清单信息、技术标准、施工边界、资源配置、质量安全要求和验收记录形成闭环;资料中已经明确的规格、数量、标准编号、工艺参数、检查频次和验收指标应在对应工作面中直接采用,资料未明确的工程实体参数不得擅自确定,应按审批程序复核确认后实施。`}async function b$(a){let b=function(a,b){let c=Math.max(900,Math.floor(Number(process.env.DOCUMENT_WRITING_TASK_MAX_WORDS??1800))),d=b>=1400?Math.max(2,Math.ceil(b/c)):b>1.2*c?Math.ceil(b/c):1,e=Math.max(650,Math.ceil(b/d));return d<=1?[{sectionTitle:a,taskTitle:a,targetWords:b,index:1,total:1}]:Array.from({length:d},(b,c)=>({sectionTitle:a,taskTitle:function(a,b,c){let d=a.toLowerCase(),e=/资源|材料|设备|人材机/u.test(a)?["资源配置依据","材料设备规格与数量","进场组织与保管要求","使用调配与过程核验","验收记录与动态调整"]:/施工|工艺|技术|安装|土建|结构|给排水|电气/u.test(a)||/method|technical/u.test(d)?["施工准备与技术依据","主要工艺流程","材料设备与参数控制","质量验收要点","成品保护与问题处置"]:/安全|文明|危大|风险/u.test(a)?["风险识别与控制边界","防护设施与作业条件","人员设备安全管理","检查频次与整改闭环","应急响应与资料留存"]:/质量|验收|标准/u.test(a)?["质量目标与验收依据","过程控制点","材料设备复核","检验批与验收资料","问题整改与成品保护"]:["资料依据与适用范围","对象范围与关键参数","实施方法与组织安排","质量安全控制要求","检查验收与闭环管理"];return c<=1?a:`${a}:${e[b%e.length]}`}(a,c,d),targetWords:e,index:c+1,total:d}))}(a.sectionTitle,a.targetWords),c=[];for(let d of b){aB(a.signal);let b=await bW({...a,sectionTitle:d.sectionTitle,targetWords:d.targetWords,maxWords:Math.ceil(1.18*d.targetWords),qualityFeedback:d.total>1?`这是首轮生成的主题任务 ${d.index}/${d.total},只聚焦“${d.taskTitle}”。不得重复同小节其他主题的通用表述;优先写入与本主题相关的资料事实、规格、数量、标准、检查要求和执行动作。`:a.qualityFeedback});b&&c.push(bX(b))}if(0===c.length)return;let d=`### ${a.sectionTitle}
103
+ ${a}应作为本章首轮成稿的独立控制单元组织实施。编制和执行过程中,应围绕已确认的项目资料、设计文件、清单信息、技术标准、施工边界、资源配置、质量安全要求和验收记录形成闭环;资料中已经明确的规格、数量、标准编号、工艺参数、检查频次和验收指标应在对应工作面中直接采用,资料未明确的工程实体参数不得擅自确定,应按审批程序复核确认后实施。`}async function b1(a){let b=function(a,b){let c=Math.max(900,Math.floor(Number(process.env.DOCUMENT_WRITING_TASK_MAX_WORDS??1800))),d=b>=1400?Math.max(2,Math.ceil(b/c)):b>1.2*c?Math.ceil(b/c):1,e=Math.max(650,Math.ceil(b/d));return d<=1?[{sectionTitle:a,taskTitle:a,targetWords:b,index:1,total:1}]:Array.from({length:d},(b,c)=>({sectionTitle:a,taskTitle:function(a,b,c){let d=a.toLowerCase(),e=/资源|材料|设备|人材机/u.test(a)?["资源配置依据","材料设备规格与数量","进场组织与保管要求","使用调配与过程核验","验收记录与动态调整"]:/施工|工艺|技术|安装|土建|结构|给排水|电气/u.test(a)||/method|technical/u.test(d)?["施工准备与技术依据","主要工艺流程","材料设备与参数控制","质量验收要点","成品保护与问题处置"]:/安全|文明|危大|风险/u.test(a)?["风险识别与控制边界","防护设施与作业条件","人员设备安全管理","检查频次与整改闭环","应急响应与资料留存"]:/质量|验收|标准/u.test(a)?["质量目标与验收依据","过程控制点","材料设备复核","检验批与验收资料","问题整改与成品保护"]:["资料依据与适用范围","对象范围与关键参数","实施方法与组织安排","质量安全控制要求","检查验收与闭环管理"];return c<=1?a:`${a}:${e[b%e.length]}`}(a,c,d),targetWords:e,index:c+1,total:d}))}(a.sectionTitle,a.targetWords),c=[];for(let d of b){aE(a.signal);let b=await bZ({...a,sectionTitle:d.sectionTitle,targetWords:d.targetWords,maxWords:Math.ceil(1.18*d.targetWords),qualityFeedback:d.total>1?`这是首轮生成的主题任务 ${d.index}/${d.total},只聚焦“${d.taskTitle}”。不得重复同小节其他主题的通用表述;优先写入与本主题相关的资料事实、规格、数量、标准、检查要求和执行动作。`:a.qualityFeedback});b&&c.push(b$(b))}if(0===c.length)return;let d=`### ${a.sectionTitle}
104
104
 
105
- ${c.join("\n\n")}`;return V(Q(d=await bY({...a,currentContent:d,targetWords:a.targetWords}),a.forbidDrawingImages))}async function b_(a){let b=bK(a.chapter,a.targetWords);if(b.length<2)return;let c=Number(process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??1),d=Math.max(1,Math.min(b.length,3,Number.isFinite(c)?Math.floor(c):1)),e=Array(b.length),f=0,g=async(c,d=!1)=>{a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:d?"retry":"start"});try{let d=a.sectionEvidenceProvider?await a.sectionEvidenceProvider(c.title):[],e={...a,evidence:d.length?[...a.evidence,...d]:a.evidence,projectContext:a.projectContext,roleContext:a.roleContext||"",factCoverageContext:a.factCoverageContext,sectionTitle:c.title,targetWords:c.targetWords,maxWords:a.maxWords?Math.max(c.targetWords,Math.ceil(a.maxWords/b.length)):Math.ceil(1.12*c.targetWords),timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.55*b1(c.targetWords))))},g=c.targetWords>=1400?await b$(e):await b5(e,b4(b.length));return g&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),g}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}};for(let c=0;c<b.length;c+=d){aB(a.signal);let f=b.slice(c,c+d);(await Promise.all(f.map(a=>g(a)))).forEach((a,b)=>{e[c+b]=a})}let h=e.map((a,b)=>a?-1:b).filter(a=>a>=0);for(let c=0;c<h.length;c+=d){aB(a.signal);let f=h.slice(c,c+d);(await Promise.all(f.map(a=>g(b[a],!0)))).forEach((a,b)=>{a&&(e[f[b]]=a)})}for(let c of h=e.map((a,b)=>a?-1:b).filter(a=>a>=0)){aB(a.signal);let d=b[c],f=await g({...d,targetWords:Math.max(d.targetWords,900)},!0);f&&(e[c]=f)}let i=e.map((a,c)=>(function(a,b){let c=V(a||"").trim(),d=c.replace(/^#{3,4}\s+.+$/gmu,"").trim();return(0,aq.V7)(d)>=80?c:bZ(b)})(a||bZ(b[c].title),b[c].title));return V(Q(`## ${a.chapter.title}
105
+ ${c.join("\n\n")}`;return X(Q(d=await b_({...a,currentContent:d,targetWords:a.targetWords}),a.forbidDrawingImages))}async function b2(a){let b=bN(a.chapter,a.targetWords);if(b.length<2)return;let c=Number(process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??1),d=Math.max(1,Math.min(b.length,3,Number.isFinite(c)?Math.floor(c):1)),e=Array(b.length),f=0,g=async(c,d=!1)=>{a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:d?"retry":"start"});try{let d=a.sectionEvidenceProvider?await a.sectionEvidenceProvider(c.title):[],e={...a,evidence:d.length?[...a.evidence,...d]:a.evidence,projectContext:a.projectContext,roleContext:a.roleContext||"",factCoverageContext:a.factCoverageContext,sectionTitle:c.title,targetWords:c.targetWords,maxWords:a.maxWords?Math.max(c.targetWords,Math.ceil(a.maxWords/b.length)):Math.ceil(1.12*c.targetWords),timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.55*b4(c.targetWords))))},g=c.targetWords>=1400?await b1(e):await b8(e,b7(b.length));return g&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),g}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}};for(let c=0;c<b.length;c+=d){aE(a.signal);let f=b.slice(c,c+d);(await Promise.all(f.map(a=>g(a)))).forEach((a,b)=>{e[c+b]=a})}let h=e.map((a,b)=>a?-1:b).filter(a=>a>=0);for(let c=0;c<h.length;c+=d){aE(a.signal);let f=h.slice(c,c+d);(await Promise.all(f.map(a=>g(b[a],!0)))).forEach((a,b)=>{a&&(e[f[b]]=a)})}for(let c of h=e.map((a,b)=>a?-1:b).filter(a=>a>=0)){aE(a.signal);let d=b[c],f=await g({...d,targetWords:Math.max(d.targetWords,900)},!0);f&&(e[c]=f)}let i=e.map((a,c)=>(function(a,b){let c=X(a||"").trim(),d=c.replace(/^#{3,4}\s+.+$/gmu,"").trim();return(0,at.V7)(d)>=80?c:b0(b)})(a||b0(b[c].title),b[c].title));return X(Q(`## ${a.chapter.title}
106
106
 
107
- ${i.join("\n\n")}`,a.forbidDrawingImages))}function b0(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function b1(a){let b=a||1200;return b>=8e3?36e4:b>=5e3?3e5:b>=3e3?24e4:18e4}function b2(a){return a<=0?0:Math.max(1,Math.ceil(a/4e3))}async function b3(a){let b=(0,aq.V7)(a.currentContent),c=a.maxChars??Math.ceil(1.12*a.targetChars),d=a.targetChars-b;if(b>=c||d<=300)return a.currentContent;let e=O(K(a.chapter,a.evidence),{maxChars:L(Math.ceil(a.targetChars/2),6e3,16e3)}),f=await aN(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",W,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。",X,"不得输出“已满足要求”“由于信息有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,最多不超过 ${c} 字;本轮只补足必要缺口,不要过度展开。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和结果说明补充。材料没有新的精确数值时,可以扩展过程性正文,但不得编造具体数值。",a.roleContext,e?`绑定材料:
108
- ${e}`:"","当前章节 Markdown 分片(必须保留并覆盖全部已有内容,不得只基于末尾扩写):",function(a,b){let c=bA(a,12e3);return 0===c.length?"":1===c.length?c[0]:c.map((a,b)=>`【片段 ${b+1}/${c.length}】
109
- ${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??b0(b,a.targetChars),temperature:.25,signal:a.signal});if(!f||f.length<120)return a.currentContent;let g=V(Q(f.startsWith("## ")?f:`## ${a.chapter.title}
107
+ ${i.join("\n\n")}`,a.forbidDrawingImages))}function b3(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function b4(a){let b=a||1200;return b>=8e3?36e4:b>=5e3?3e5:b>=3e3?24e4:18e4}function b5(a){return a<=0?0:Math.max(1,Math.ceil(a/4e3))}async function b6(a){let b=(0,at.V7)(a.currentContent),c=a.maxChars??Math.ceil(1.12*a.targetChars),d=a.targetChars-b;if(b>=c||d<=300)return a.currentContent;let e=O(K(a.chapter,a.evidence),{maxChars:L(Math.ceil(a.targetChars/2),6e3,16e3)}),f=await aQ(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",Y,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。",Z,"不得输出“已满足要求”“由于信息有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,最多不超过 ${c} 字;本轮只补足必要缺口,不要过度展开。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和结果说明补充。材料没有新的精确数值时,可以扩展过程性正文,但不得编造具体数值。",a.roleContext,e?`绑定材料:
108
+ ${e}`:"","当前章节 Markdown 分片(必须保留并覆盖全部已有内容,不得只基于末尾扩写):",function(a,b){let c=bD(a,12e3);return 0===c.length?"":1===c.length?c[0]:c.map((a,b)=>`【片段 ${b+1}/${c.length}】
109
+ ${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??b3(b,a.targetChars),temperature:.25,signal:a.signal});if(!f||f.length<120)return a.currentContent;let g=X(Q(f.startsWith("## ")?f:`## ${a.chapter.title}
110
110
 
111
- ${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=(0,aq.V7)(a),g=(0,aq.V7)(b),h=(0,P.GQ)(c),i=Math.max(0,d-f),j=Math.min(300,Math.max(80,Math.floor(.2*i)));return!(g>e)&&(!(i>0)||!(g<f+j))&&!(g<.98*f)&&(!h||!!b.includes(h))}(a.currentContent,g,a.chapter.title,a.targetChars,c)?a.currentContent:g}function b4(a){let b=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_ATTEMPTS??1);return Math.max(1,Math.min(2,Number.isFinite(b)?Math.floor(b):1,a))}async function b5(a,b){let c;for(let d=0;d<b;d+=1){let b=await bW({...a,qualityFeedback:c});if(!b){c="上一轮未生成有效正文,请重新生成完整小节正文。";continue}let d=function(a,b){let c=b.replace(/^#{3,4}\s+.*\n+/u,"").split(/\r?\n/u).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*\|?\s*:?-{3,}:?/u.test(a)).join("\n"),d=(0,aq.V7)(c);return d<360?`正文有效内容不足:${a} 当前约 ${d} 字`:/资料未提供|信息有限|无法确定|待补充|建议补充更多资料|以下是|本文档|本小节围绕/u.test(c)?`存在空泛或说明性话术:${a}`:void 0}(a.sectionTitle,b);if(!d)return b;c=d}}async function b6(a){let b=bK(a.chapter,a.targetWords),c=new Map(b.map(a=>[a.title,a])),d=(a.forcedSections||[]).filter(b=>b.chapterTitle===a.chapter.title&&(b.planned||"missing_planned_section"===b.reason||"empty"===b.reason)).map(d=>({title:d.sectionTitle,targetWords:Math.max(420,c.get(d.sectionTitle)?.targetWords||Math.floor(a.targetWords/Math.max(1,b.length||a.forcedSections?.length||1))),forced:!0})),e=[...b];for(let a of d)e.some(b=>b.title===a.title)||e.push(a);if(e.length<1)return a.content;let f=a.content,g=new Set(d.map(a=>a.title)),h=e.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=f.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),d=(0,aq.V7)(c?.[1]||""),e=g.has(a.title);return{...a,currentWords:d,priority:e?0:d<80?1:2,forced:e}}).filter(a=>a.forced||a.currentWords<Math.max(360,Math.floor(.7*a.targetWords))).sort((a,b)=>a.priority-b.priority||a.currentWords-b.currentWords),i=new Map,j=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??2),k=Math.max(1,Math.min(h.length||1,2,Number.isFinite(j)?Math.floor(j):2));for(let b=0;b<h.length;b+=k){let c=h.slice(b,b+k),d=a.maxWords?Math.max(0,a.maxWords-(0,aq.V7)(f)):1/0,e=Number.isFinite(d)&&d>200?Math.max(260,Math.floor(d/c.length)):void 0,g=b4(h.length),j=await Promise.all(c.map(async b=>{try{let c=Math.max(350,Math.min(b.targetWords-b.currentWords,900));return await b5({...a,evidence:a.evidence,sectionTitle:b.title,targetWords:c,maxWords:e?Math.min(e,1200):1200,timeoutMs:Math.max(9e4,Math.min(15e4,Math.ceil(.45*b1(c))))},g)}catch{return}}));c.forEach((a,b)=>{i.set(a.title,j[b])})}for(let a of h){let b=i.get(a.title);b&&(f=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${d}\\s*\\n)([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"),f=c.trim().replace(/^#{3,4}\s+(?:\d+(?:\.\d+)*\s+)?[^\n]+\n+/u,"").trim();return e.test(a)?a.replace(e,(a,b,c)=>{let d=function(a,b){let c=a.trim(),d=b.trim();if(!d)return"";if(!c)return d;if(c.includes(d))return"";if(d.includes(c))return d.slice(d.indexOf(c)+c.length).trim();let e=c.slice(-240),f=e.length>=80?d.indexOf(e):-1;return f>=0?d.slice(f+e.length).trim():d}(c,f);return d?`${b}${c.trim()}
111
+ ${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=(0,at.V7)(a),g=(0,at.V7)(b),h=(0,P.GQ)(c),i=Math.max(0,d-f),j=Math.min(300,Math.max(80,Math.floor(.2*i)));return!(g>e)&&(!(i>0)||!(g<f+j))&&!(g<.98*f)&&(!h||!!b.includes(h))}(a.currentContent,g,a.chapter.title,a.targetChars,c)?a.currentContent:g}function b7(a){let b=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_ATTEMPTS??1);return Math.max(1,Math.min(2,Number.isFinite(b)?Math.floor(b):1,a))}async function b8(a,b){let c;for(let d=0;d<b;d+=1){let b=await bZ({...a,qualityFeedback:c});if(!b){c="上一轮未生成有效正文,请重新生成完整小节正文。";continue}let d=function(a,b){let c=b.replace(/^#{3,4}\s+.*\n+/u,"").split(/\r?\n/u).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*\|?\s*:?-{3,}:?/u.test(a)).join("\n"),d=(0,at.V7)(c);return d<360?`正文有效内容不足:${a} 当前约 ${d} 字`:/资料未提供|信息有限|无法确定|待补充|建议补充更多资料|以下是|本文档|本小节围绕/u.test(c)?`存在空泛或说明性话术:${a}`:void 0}(a.sectionTitle,b);if(!d)return b;c=d}}async function b9(a){let b=bN(a.chapter,a.targetWords),c=new Map(b.map(a=>[a.title,a])),d=(a.forcedSections||[]).filter(b=>b.chapterTitle===a.chapter.title&&(b.planned||"missing_planned_section"===b.reason||"empty"===b.reason)).map(d=>({title:d.sectionTitle,targetWords:Math.max(420,c.get(d.sectionTitle)?.targetWords||Math.floor(a.targetWords/Math.max(1,b.length||a.forcedSections?.length||1))),forced:!0})),e=[...b];for(let a of d)e.some(b=>b.title===a.title)||e.push(a);if(e.length<1)return a.content;let f=a.content,g=new Set(d.map(a=>a.title)),h=e.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=f.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),d=(0,at.V7)(c?.[1]||""),e=g.has(a.title);return{...a,currentWords:d,priority:e?0:d<80?1:2,forced:e}}).filter(a=>a.forced||a.currentWords<Math.max(360,Math.floor(.7*a.targetWords))).sort((a,b)=>a.priority-b.priority||a.currentWords-b.currentWords),i=new Map,j=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??2),k=Math.max(1,Math.min(h.length||1,2,Number.isFinite(j)?Math.floor(j):2));for(let b=0;b<h.length;b+=k){let c=h.slice(b,b+k),d=a.maxWords?Math.max(0,a.maxWords-(0,at.V7)(f)):1/0,e=Number.isFinite(d)&&d>200?Math.max(260,Math.floor(d/c.length)):void 0,g=b7(h.length),j=await Promise.all(c.map(async b=>{try{let c=Math.max(350,Math.min(b.targetWords-b.currentWords,900));return await b8({...a,evidence:a.evidence,sectionTitle:b.title,targetWords:c,maxWords:e?Math.min(e,1200):1200,timeoutMs:Math.max(9e4,Math.min(15e4,Math.ceil(.45*b4(c))))},g)}catch{return}}));c.forEach((a,b)=>{i.set(a.title,j[b])})}for(let a of h){let b=i.get(a.title);b&&(f=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${d}\\s*\\n)([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"),f=c.trim().replace(/^#{3,4}\s+(?:\d+(?:\.\d+)*\s+)?[^\n]+\n+/u,"").trim();return e.test(a)?a.replace(e,(a,b,c)=>{let d=function(a,b){let c=a.trim(),d=b.trim();if(!d)return"";if(!c)return d;if(c.includes(d))return"";if(d.includes(c))return d.slice(d.indexOf(c)+c.length).trim();let e=c.slice(-240),f=e.length>=80?d.indexOf(e):-1;return f>=0?d.slice(f+e.length).trim():d}(c,f);return d?`${b}${c.trim()}
112
112
 
113
113
  ${d}
114
114
 
@@ -118,64 +118,64 @@ ${d}
118
118
 
119
119
  ### ${b}
120
120
 
121
- ${f}`:a}(f,a.title,b))}return V(Q(f,a.forbidDrawingImages))}async function b7(a){let b=a.content,c=0,d=a.strictBudget?b2(a.targetChars-(0,aq.V7)(b)):Math.min(1,b2(a.targetChars-(0,aq.V7)(b))),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&(0,aq.V7)(b)<a.targetChars&&(0,aq.V7)(b)<e;c+=1){aB(a.signal);let c=b;try{let d=(0,aq.V7)(b),f=Math.min(a.targetChars,d+(a.strictBudget?5600:3200)),g=await aO(c=>b3({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:f,maxChars:Math.min(e,d+(a.strictBudget?7e3:4200)),forbidDrawingImages:a.forbidDrawingImages,maxTokens:Math.min(a.maxTokens??b0(d,f),b0(d,f)),signal:c}),12e4,a.signal);if(!g||g===c)break;b=g}catch{break}}return{content:b,rounds:c}}async function b8(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=(0,aq.V7)(b.map(a=>a.content).join("\n\n")),d=Math.min(a.budget.longformStrict?3:1,b2(a.budget.minChars-c)),e=Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??2),f=Math.max(1,Math.min(a.chapters.length||1,a.budget.longformStrict?3:2,Number.isFinite(e)?Math.floor(e):2)),g=new Set,h=a.budget.maxChars;for(let e=0;e<d&&c<a.budget.minChars&&(!h||c<h);e+=1){aB(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=(0,aq.V7)(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500&&!g.has(a.chapter.id)).sort((a,b)=>b.deficit-a.deficit);if(0===e.length)break;for(let d=0;d<e.length&&c<a.budget.minChars&&(!h||c<h);d+=f){aB(a.signal);let i=h?Math.max(0,h-c):1/0;if(i<=300)break;let j=h?Math.max(1,Math.min(f,Math.floor(i/800)||1)):f,k=e.slice(d,d+j),l=Number.isFinite(i)?Math.max(500,Math.floor(i/k.length)):void 0;for(let c of(await Promise.all(k.map(async b=>{try{let c=Math.min(b.target,b.current+Math.max(a.budget.longformStrict?3600:1200,Math.min(b.deficit,a.budget.longformStrict?7600:3200))),d=l?Math.min(Math.ceil(1.12*c),b.current+l):Math.ceil(1.12*c),e=await b7({template:a.template,chapter:{id:b.chapter.id,title:b.chapter.title,purpose:b.chapter.title,queries:[],requiredFacts:[],sections:b.chapter.sections},content:b.chapter.content,evidence:b.chapter.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:c,maxChars:d,forbidDrawingImages:a.forbidDrawingImages,maxTokens:b0(b.current,c),signal:a.signal,strictBudget:a.budget.longformStrict});return{id:b.chapter.id,beforeChars:b.current,content:e.content}}catch{return{id:b.chapter.id,beforeChars:b.current,content:b.chapter.content}}}))))(0,aq.V7)(c.content)<=c.beforeChars+300&&g.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=(0,aq.V7)(b.map(a=>a.content).join("\n\n"))}if(c<=d+(a.budget.longformStrict?80:300))break}return b}async function b9(a){let b=Date.now(),c=Math.max(1,Math.min(a.strategy.maxChapterReviewConcurrency,Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??a.strategy.maxChapterReviewConcurrency))),d=Array(a.chapters.length);for(let e=0;e<a.chapters.length;e+=c){aB(a.signal);let f=a.chapters.slice(e,e+c);(await Promise.all(f.map(async c=>{let d=a.budget.chapterTargets.get(c.id)||1200,e=bs({chapter:a.template.chapters.find(a=>a.id===c.id)||{id:c.id,title:c.title,purpose:"",queries:[],requiredFacts:[],sections:c.sections},content:c.content,missingFacts:c.missingFacts,targetWords:d}),f=bH({totalChars:(0,aq.V7)(c.content),chapterCount:1,chunkChars:12e3,phase:"chapter"}),g=bA(c.content,12e3).slice(0,f.chunks),h=[];for(let i=0;i<g.length&&!(Date.now()-b>f.ms);i+=1){aB(a.signal);let b=g[i]||"",f=await aN(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${c.title}`,`目标深度:约 ${d} 字;当前 ${(0,aq.V7)(c.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",c.missingFacts.length?`未覆盖事实:${c.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"",`章节正文片段 ${i+1}/${g.length}(必须检查该片段,不要假设其他片段已合格):`,bB(b,i,g.length),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))});h.push(bD(f))}let i=bF(h.flatMap(a=>Array.isArray(a?.issues)?a.issues:[])).slice(0,f.issues),j=bF(h.flatMap(a=>Array.isArray(a?.suggestions)?a.suggestions:[])).slice(0,f.issues),k=h.some(a=>a?.status==="fail"),l=h.some(a=>a?.status==="warn"),m=bF([...e,...i]),n=e.some(a=>/缺少规划小节|规划小节正文过短|空小节|只有标题|只有表格|正文篇幅明显低于目标|低于目标|缺失|占位|泄露|不足/u.test(a)),o=k||n?"fail":l||m.length>0?"warn":"pass";return{chapterId:c.id,title:c.title,status:o,issues:m,suggestions:j,chars:(0,aq.V7)(c.content)}}))).forEach((a,b)=>{d[e+b]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:bd({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:bf(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function ca(a){let b=Date.now(),c=bH({totalChars:a.chapters.reduce((a,b)=>a+(0,aq.V7)(b.content),0),chapterCount:a.chapters.length,chunkChars:8e3,phase:"global"}).issues,d=a.chapters.map(b=>{let c=a.chapterReviews.find(a=>a.chapterId===b.id),d=c?.issues||[];return`- ${b.title}:${(0,aq.V7)(b.content)} 字;审查=${c?.status||"unknown"};问题数=${d.length};问题=${d.join(";")||"无"}`}).join("\n"),e=a.chapters.map(bC).join("\n\n---\n\n");aB(a.signal);let f=await aN(["你是长文档全局一致性审查专家。只基于章节摘要检查跨章节一致性,不重写正文。","重点检查:章节之间信息冲突、术语不一致、重复堆砌、目录层级异常、关键要求缺失、前后矛盾、上下文衔接断裂。","摘要不足以判断的问题只能标记为需复核,不得臆测正文问题。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文摘要:
122
- ${a.projectContext}`:"","章节审查摘要:",d,"章节内容摘要(用于全文一致性审查,不是完整正文):",e,`请输出不超过 ${c} 条跨章节问题清单和建议;没有明确问题则返回“无明显跨章节冲突”。不要返回全文。`].filter(Boolean).join("\n"),!1,{maxTokens:Math.max(1400,Math.min(3200,180*c)),temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}),g=bD(f),h=g?bF([...g.issues||[],...g.repairInstructions||[],g.repair].map(bE)):[],i=(h.length?h:bF((f||"").replace(/```(?:json)?[\s\S]*?```/gu,"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6&&!/[{}[\]":,]|无明显|未发现明显|没有明确/u.test(a)))).slice(0,c);return{issues:i,stage:bd({type:"llm_review",roleId:"global-consistency-review",status:i.length>0?"fallback":"success",message:bf(i.length>0?`摘要化全局一致性审查发现 ${i.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function cb(a){aB(a.signal);let b=Date.now(),c=bH({totalChars:(0,aq.V7)(a.markdown),chapterCount:a.template.chapters.length||1,chunkChars:12e3,phase:"final"}),d=c.ms,e=c.issues,f=O(K({id:"review",title:"最终质量审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence),{maxChars:L((0,aq.V7)(a.markdown),8e3,18e3)}),g=a.spec?`结构化检查摘要:${a.spec.name}
121
+ ${f}`:a}(f,a.title,b))}return X(Q(f,a.forbidDrawingImages))}async function ca(a){let b=a.content,c=0,d=a.strictBudget?b5(a.targetChars-(0,at.V7)(b)):Math.min(1,b5(a.targetChars-(0,at.V7)(b))),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&(0,at.V7)(b)<a.targetChars&&(0,at.V7)(b)<e;c+=1){aE(a.signal);let c=b;try{let d=(0,at.V7)(b),f=Math.min(a.targetChars,d+(a.strictBudget?5600:3200)),g=await aR(c=>b6({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:f,maxChars:Math.min(e,d+(a.strictBudget?7e3:4200)),forbidDrawingImages:a.forbidDrawingImages,maxTokens:Math.min(a.maxTokens??b3(d,f),b3(d,f)),signal:c}),12e4,a.signal);if(!g||g===c)break;b=g}catch{break}}return{content:b,rounds:c}}async function cb(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=(0,at.V7)(b.map(a=>a.content).join("\n\n")),d=Math.min(a.budget.longformStrict?3:1,b5(a.budget.minChars-c)),e=Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??2),f=Math.max(1,Math.min(a.chapters.length||1,a.budget.longformStrict?3:2,Number.isFinite(e)?Math.floor(e):2)),g=new Set,h=a.budget.maxChars;for(let e=0;e<d&&c<a.budget.minChars&&(!h||c<h);e+=1){aE(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=(0,at.V7)(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500&&!g.has(a.chapter.id)).sort((a,b)=>b.deficit-a.deficit);if(0===e.length)break;for(let d=0;d<e.length&&c<a.budget.minChars&&(!h||c<h);d+=f){aE(a.signal);let i=h?Math.max(0,h-c):1/0;if(i<=300)break;let j=h?Math.max(1,Math.min(f,Math.floor(i/800)||1)):f,k=e.slice(d,d+j),l=Number.isFinite(i)?Math.max(500,Math.floor(i/k.length)):void 0;for(let c of(await Promise.all(k.map(async b=>{try{let c=Math.min(b.target,b.current+Math.max(a.budget.longformStrict?3600:1200,Math.min(b.deficit,a.budget.longformStrict?7600:3200))),d=l?Math.min(Math.ceil(1.12*c),b.current+l):Math.ceil(1.12*c),e=await ca({template:a.template,chapter:{id:b.chapter.id,title:b.chapter.title,purpose:b.chapter.title,queries:[],requiredFacts:[],sections:b.chapter.sections},content:b.chapter.content,evidence:b.chapter.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:c,maxChars:d,forbidDrawingImages:a.forbidDrawingImages,maxTokens:b3(b.current,c),signal:a.signal,strictBudget:a.budget.longformStrict});return{id:b.chapter.id,beforeChars:b.current,content:e.content}}catch{return{id:b.chapter.id,beforeChars:b.current,content:b.chapter.content}}}))))(0,at.V7)(c.content)<=c.beforeChars+300&&g.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=(0,at.V7)(b.map(a=>a.content).join("\n\n"))}if(c<=d+(a.budget.longformStrict?80:300))break}return b}async function cc(a){let b=Date.now(),c=Math.max(1,Math.min(a.strategy.maxChapterReviewConcurrency,Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??a.strategy.maxChapterReviewConcurrency))),d=Array(a.chapters.length);for(let e=0;e<a.chapters.length;e+=c){aE(a.signal);let f=a.chapters.slice(e,e+c);(await Promise.all(f.map(async c=>{let d=a.budget.chapterTargets.get(c.id)||1200,e=bv({chapter:a.template.chapters.find(a=>a.id===c.id)||{id:c.id,title:c.title,purpose:"",queries:[],requiredFacts:[],sections:c.sections},content:c.content,missingFacts:c.missingFacts,targetWords:d}),f=bK({totalChars:(0,at.V7)(c.content),chapterCount:1,chunkChars:12e3,phase:"chapter"}),g=bD(c.content,12e3).slice(0,f.chunks),h=[];for(let i=0;i<g.length&&!(Date.now()-b>f.ms);i+=1){aE(a.signal);let b=g[i]||"",f=await aQ(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${c.title}`,`目标深度:约 ${d} 字;当前 ${(0,at.V7)(c.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",c.missingFacts.length?`未覆盖事实:${c.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"",`章节正文片段 ${i+1}/${g.length}(必须检查该片段,不要假设其他片段已合格):`,bE(b,i,g.length),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))});h.push(bG(f))}let i=bI(h.flatMap(a=>Array.isArray(a?.issues)?a.issues:[])).slice(0,f.issues),j=bI(h.flatMap(a=>Array.isArray(a?.suggestions)?a.suggestions:[])).slice(0,f.issues),k=h.some(a=>a?.status==="fail"),l=h.some(a=>a?.status==="warn"),m=bI([...e,...i]),n=e.some(a=>/缺少规划小节|规划小节正文过短|空小节|只有标题|只有表格|正文篇幅明显低于目标|低于目标|缺失|占位|泄露|不足/u.test(a)),o=k||n?"fail":l||m.length>0?"warn":"pass";return{chapterId:c.id,title:c.title,status:o,issues:m,suggestions:j,chars:(0,at.V7)(c.content)}}))).forEach((a,b)=>{d[e+b]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:bg({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:bi(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function cd(a){let b=Date.now(),c=bK({totalChars:a.chapters.reduce((a,b)=>a+(0,at.V7)(b.content),0),chapterCount:a.chapters.length,chunkChars:8e3,phase:"global"}).issues,d=a.chapters.map(b=>{let c=a.chapterReviews.find(a=>a.chapterId===b.id),d=c?.issues||[];return`- ${b.title}:${(0,at.V7)(b.content)} 字;审查=${c?.status||"unknown"};问题数=${d.length};问题=${d.join(";")||"无"}`}).join("\n"),e=a.chapters.map(bF).join("\n\n---\n\n");aE(a.signal);let f=await aQ(["你是长文档全局一致性审查专家。只基于章节摘要检查跨章节一致性,不重写正文。","重点检查:章节之间信息冲突、术语不一致、重复堆砌、目录层级异常、关键要求缺失、前后矛盾、上下文衔接断裂。","摘要不足以判断的问题只能标记为需复核,不得臆测正文问题。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文摘要:
122
+ ${a.projectContext}`:"","章节审查摘要:",d,"章节内容摘要(用于全文一致性审查,不是完整正文):",e,`请输出不超过 ${c} 条跨章节问题清单和建议;没有明确问题则返回“无明显跨章节冲突”。不要返回全文。`].filter(Boolean).join("\n"),!1,{maxTokens:Math.max(1400,Math.min(3200,180*c)),temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}),g=bG(f),h=g?bI([...g.issues||[],...g.repairInstructions||[],g.repair].map(bH)):[],i=(h.length?h:bI((f||"").replace(/```(?:json)?[\s\S]*?```/gu,"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6&&!/[{}[\]":,]|无明显|未发现明显|没有明确/u.test(a)))).slice(0,c);return{issues:i,stage:bg({type:"llm_review",roleId:"global-consistency-review",status:i.length>0?"fallback":"success",message:bi(i.length>0?`摘要化全局一致性审查发现 ${i.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function ce(a){aE(a.signal);let b=Date.now(),c=bK({totalChars:(0,at.V7)(a.markdown),chapterCount:a.template.chapters.length||1,chunkChars:12e3,phase:"final"}),d=c.ms,e=c.issues,f=O(K({id:"review",title:"最终质量审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence),{maxChars:L((0,at.V7)(a.markdown),8e3,18e3)}),g=a.spec?`结构化检查摘要:${a.spec.name}
123
123
  关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
124
124
  章节检查项:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
125
125
  通用质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
126
- 约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"未生成结构化检查摘要。",h=bA(a.markdown,12e3).slice(0,c.chunks),i=[];for(let c=0;c<h.length&&(aB(a.signal),!(Date.now()-b>d));c+=1){let b=h[c]||"";i.push(await aP(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构/提示词角色 > 绑定文件证据 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、绑定材料事实使用、参数数字准确性、冲突事实、异常对象名、表格呈现、导出友好性、系统提示泄露。","只返回 JSON 审查结果;不得返回优化后的完整 Markdown。",'返回格式:{"passed":true,"score":90,"issues":[{"type":"...","severity":"low|medium|high","location":"...","message":"..."}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文/历史记忆:
127
- ${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bB(b,c,h.length),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1600,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}))}aB(a.signal);let j=i.flatMap(a=>Array.isArray(a?.issues)?a.issues.filter(a=>a?.message):[]).slice(0,e),k=Date.now()-b>d,l=j.filter(a=>"high"===a.severity).length,m=i.map(a=>Number(a?.score)).filter(Number.isFinite),n=m.length?Math.round(m.reduce((a,b)=>a+b,0)/m.length):void 0,o=function(a,b){if(0===a.length)return b;let c=[],d=0;for(let b of a){if(d+b.length>420&&c.length>0)break;c.push(b),d+=b.length}return c.join(";")}(j.map(a=>`${a.severity||"medium"}:${a.location||a.type||"全文"}-${a.message}`),"未发现明显质量问题");return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:l>0||k?"fallback":i.length>0?"success":"skipped",message:i.length>0?`已完成预算化结构化非重写式质量审查${void 0!==n?`,评分 ${n}`:""}${k?",已达到审查预算":""}:${o}`:"无可用模型或审查结果不可用,保留生成初稿"}}}let cc=/安全|文明|质量|绿色施工|环保|扬尘|消防|应急|危大|风险|规范|标准|管理要求|施工工艺|技术措施|验收/u,cd=/项目名称|工程名称|建设地点|建设单位|招标人|发包人|建设规模|招标范围|合同工期|计划工期|质量标准|危大工程清单|工程量|材料规格|设备型号|图纸参数|报价|单价|利润|税率|合同金额|联系方式|品牌/u,ce=/报价|单价|合价|金额|利润|税率|增值税|招标控制价|最高投标限价|中标价|合同价|暂列金额/u,cf=/联网增强|联网检索|网页资料|搜索结果|根据网页|互联网资料|在线资料|浏览器|搜索引擎/u,cg=["项目名称","工程名称","建设地点","建设单位","招标人","发包人","建设规模","招标范围","合同工期","计划工期","工程量","报价","单价"];function ch(a){return a.replace(/&amp;/gu,"&").replace(/&lt;/gu,"<").replace(/&gt;/gu,">").replace(/&quot;/gu,'"').replace(/&#39;/gu,"'").replace(/<[^>]+>/gu,"").replace(/\s+/gu," ").trim()}async function ci(a,b,c,d,e){let f=`https://duckduckgo.com/html/?q=${encodeURIComponent(a)}`,g=new AbortController,h=setTimeout(()=>g.abort(),8e3),i=()=>g.abort();e?.addEventListener("abort",i,{once:!0});let j=await fetch(f,{headers:{"User-Agent":"Mozilla/5.0 compatible; customize-agent web research"},signal:g.signal}).finally(()=>{clearTimeout(h),e?.removeEventListener("abort",i)});return j.ok?[...(await j.text()).matchAll(/<a[^>]+class="result__a"[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<a[^>]+class="result__snippet"[^>]*>([\s\S]*?)<\/a>/giu)].map(a=>{let b=ch(a[1]||""),c=ch(a[2]||""),d=ch(a[3]||""),e=/uddg=([^&]+)/u.exec(b)?.[1];return{url:e?decodeURIComponent(e):b,title:c,snippet:d}}).filter(a=>{let b=`${a.title} ${a.snippet} ${a.url}`;return!(!a.url||!a.snippet||cd.test(b)||ce.test(b)||cf.test(b)||d.some(a=>a&&b.includes(a)))&&(0===c.length||c.some(b=>a.url.includes(b)))}).slice(0,b):[]}async function cj(a){if(!a.config.enabled||!function(a,b){let c=`${a} ${b.join(" ")}`;return!(!cc.test(c)||/项目概况|工程概况|建设地点|建设规模|招标范围|工程量|报价|造价/u.test(c)&&!/安全|文明|质量|危大|环保|工艺|措施/u.test(c))}(a.chapterTitle,a.sectionTitles))return{evidence:[],queries:[],filtered:0};let b=function(a,b,c){let d=`${a} ${b.join(" ")}`,e=[/危大/u.test(d)?"危大工程 专项施工方案 管理规定 安全措施":"",/安全|文明/u.test(d)?"建筑工程 安全文明施工 管理要求":"",/质量|验收/u.test(d)?"建筑工程 质量控制 质量验收 通用要求":"",/扬尘|环保|绿色/u.test(d)?"施工现场 扬尘治理 绿色施工 环保要求":"",/消防|应急/u.test(d)?"施工现场 消防 应急管理 要求":"",/工艺|技术措施/u.test(d)?"建筑工程 施工工艺 技术措施 通用要求":""].filter(Boolean),f=`${a.replace(cd,"")} 公开规范 通用要求`.trim();return[...new Set(e.length?e:[f])].slice(0,c)}(a.chapterTitle,a.sectionTitles,a.config.maxQueriesPerChapter),c=[],d=0;for(let e of b)try{for(let b of(await ci(e,a.config.maxResultsPerQuery,a.config.trustedDomains,a.runtimeRules.forbiddenTerms||[],a.signal))){let e=function(a,b){let c=a;for(let a of cg)c=c.replace(RegExp(`${a}[^。;;
128
- ]{0,80}`,"gu"),"");for(let a of b.map(a=>{var b;return null==(b=a.value)?"":"string"==typeof b||"number"==typeof b||"boolean"==typeof b?String(b).trim():""}).filter(a=>a.length>=3&&a.length<=80))c=c.replace(RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"gu"),"");return c.replace(ce,"").trim()}(b.snippet,a.localFacts);if(!e||e.length<20){d+=1;continue}c.push({chapterId:a.chapterId,filePath:b.url,score:.42,content:`参考依据:${b.title}
129
- ${e}`,source:function(a){let b=a.toLowerCase();return b.includes(".gov.cn")||b.includes("mohurd")||b.includes("zjt")||a.includes("住建")?"web-policy":"web-evidence"}(b.url),sectionTitle:a.chapterTitle})}}catch{d+=1}return{evidence:c,queries:b,filtered:d}}function ck(a){let b=[];return cf.test(a)&&b.push({level:"warning",message:"正文包含联网增强过程性表述",suggestion:"请删除联网检索、网页资料、搜索结果等过程性话术,改为正式交付语言。"}),b}function cl(a,b){let c=(0,aq.V7)(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}let cm=["项目名称 项目编号 招标人 项目概况与招标范围 建设地点 建设规模 计划工期 质量标准 合同估算价","计划工期 合同工期 总工期 日历天","合同估算价 合同估算价格 投资估算 最高投标限价 招标控制价","质量标准 质量目标 合格","建设地点 建设规模 招标范围"];function cn(a){let b=aU(a),c=0;return/项目名称|工程名称|招标项目名称|项目编号|招标项目编号|招标人|建设单位|发包人/u.test(b)&&(c+=4),/计划工期|合同工期|总工期|\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(b)&&(c+=6),/合同估算价|投资估算|最高投标限价|招标控制价|\d+(?:\.\d+)?\s*(?:万元|元)/u.test(b)&&(c+=5),/质量标准|质量目标|合格|优良/u.test(b)&&(c+=4),/建设地点|建设规模|招标范围|项目概况与招标范围/u.test(b)&&(c+=4),/招标文件|招标公告|投标人须知|前附表|合同协议/u.test(b)&&(c+=2),c}async function co(a){let b=[],c=new Set(a.scopedFilePaths);for(let d of cm){aB(a.signal);let e=await a.manager.search(a.projectRoot,d,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:10,weights:{keyword:.65,vector:.25,rewrite:.8,hybridBonus:.2},generationMode:!1});b.push(...e.results.filter(a=>c.has(a.filePath)&&cn(`${a.sectionTitle||""}
130
- ${a.content}`)>0).map(b=>({chapterId:"project-basic",filePath:b.filePath,score:Math.max(b.score,1)+cn(`${b.sectionTitle||""}
131
- ${b.content}`),content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"pinned-evidence"})))}for(let c of a.scopedFilePaths){aB(a.signal);let d=a.project.getFileDetail?.(c,{maxChunkContentChars:12e3});if(d?.chunks?.length)for(let e of d.chunks){let f=cn(`${e.sectionTitle||""}
132
- ${e.content||""}`);if(f<=0)continue;let g=d.file?.relativePath||c;b.push({chapterId:"project-basic",filePath:g,score:1+f,content:e.content,roleId:a.fileRoleByPath.get(g),processingType:a.fileProcessingByPath.get(g),sectionTitle:e.sectionTitle,source:"pinned-evidence"})}}let d=new Set;return b.sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}|${a.sectionTitle||""}|${aU(a.content).slice(0,180)}`;return!d.has(b)&&(d.add(b),!0)}).slice(0,24)}function cp(a,b){return(0,ar.yw)(a,[{title:b.title,content:a,sections:b.sections||[]}]).filter(a=>a.planned||"missing_planned_section"===a.reason)}function cq(a){return`该小节围绕“${a}”进行补充说明,执行时应结合本章已列明的资料事实、施工对象、控制边界和质量安全要求组织实施。对资料中已经明确的规格、数量、标准编号、工艺参数和验收要求,应在交底、过程检查、复核验收和整改闭环中原样引用;资料未明确的工程实体参数不得擅自确定,可作为施工组织计划值另行报审确认。`}function cr(a,b){let c=cp(a,b).filter(a=>"missing_planned_section"===a.reason);if(0===c.length)return a;let d=c.slice(0,6).map((a,b)=>{let c=/^\d+(?:\.\d+)*/u.test(a.sectionTitle)?"":`${b+1}. `;return`### ${c}${a.sectionTitle}
126
+ 约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"未生成结构化检查摘要。",h=bD(a.markdown,12e3).slice(0,c.chunks),i=[];for(let c=0;c<h.length&&(aE(a.signal),!(Date.now()-b>d));c+=1){let b=h[c]||"";i.push(await aS(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构/提示词角色 > 绑定文件证据 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、绑定材料事实使用、参数数字准确性、冲突事实、异常对象名、表格呈现、导出友好性、系统提示泄露。","只返回 JSON 审查结果;不得返回优化后的完整 Markdown。",'返回格式:{"passed":true,"score":90,"issues":[{"type":"...","severity":"low|medium|high","location":"...","message":"..."}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文/历史记忆:
127
+ ${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bE(b,c,h.length),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1600,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}))}aE(a.signal);let j=i.flatMap(a=>Array.isArray(a?.issues)?a.issues.filter(a=>a?.message):[]).slice(0,e),k=Date.now()-b>d,l=j.filter(a=>"high"===a.severity).length,m=i.map(a=>Number(a?.score)).filter(Number.isFinite),n=m.length?Math.round(m.reduce((a,b)=>a+b,0)/m.length):void 0,o=function(a,b){if(0===a.length)return b;let c=[],d=0;for(let b of a){if(d+b.length>420&&c.length>0)break;c.push(b),d+=b.length}return c.join(";")}(j.map(a=>`${a.severity||"medium"}:${a.location||a.type||"全文"}-${a.message}`),"未发现明显质量问题");return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:l>0||k?"fallback":i.length>0?"success":"skipped",message:i.length>0?`已完成预算化结构化非重写式质量审查${void 0!==n?`,评分 ${n}`:""}${k?",已达到审查预算":""}:${o}`:"无可用模型或审查结果不可用,保留生成初稿"}}}let cf=/安全|文明|质量|绿色施工|环保|扬尘|消防|应急|危大|风险|规范|标准|管理要求|施工工艺|技术措施|验收/u,cg=/项目名称|工程名称|建设地点|建设单位|招标人|发包人|建设规模|招标范围|合同工期|计划工期|质量标准|危大工程清单|工程量|材料规格|设备型号|图纸参数|报价|单价|利润|税率|合同金额|联系方式|品牌/u,ch=/报价|单价|合价|金额|利润|税率|增值税|招标控制价|最高投标限价|中标价|合同价|暂列金额/u,ci=/联网增强|联网检索|网页资料|搜索结果|根据网页|互联网资料|在线资料|浏览器|搜索引擎/u,cj=["项目名称","工程名称","建设地点","建设单位","招标人","发包人","建设规模","招标范围","合同工期","计划工期","工程量","报价","单价"];function ck(a){return a.replace(/&amp;/gu,"&").replace(/&lt;/gu,"<").replace(/&gt;/gu,">").replace(/&quot;/gu,'"').replace(/&#39;/gu,"'").replace(/<[^>]+>/gu,"").replace(/\s+/gu," ").trim()}async function cl(a,b,c,d,e){let f=`https://duckduckgo.com/html/?q=${encodeURIComponent(a)}`,g=new AbortController,h=setTimeout(()=>g.abort(),8e3),i=()=>g.abort();e?.addEventListener("abort",i,{once:!0});let j=await fetch(f,{headers:{"User-Agent":"Mozilla/5.0 compatible; customize-agent web research"},signal:g.signal}).finally(()=>{clearTimeout(h),e?.removeEventListener("abort",i)});return j.ok?[...(await j.text()).matchAll(/<a[^>]+class="result__a"[^>]+href="([^"]+)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<a[^>]+class="result__snippet"[^>]*>([\s\S]*?)<\/a>/giu)].map(a=>{let b=ck(a[1]||""),c=ck(a[2]||""),d=ck(a[3]||""),e=/uddg=([^&]+)/u.exec(b)?.[1];return{url:e?decodeURIComponent(e):b,title:c,snippet:d}}).filter(a=>{let b=`${a.title} ${a.snippet} ${a.url}`;return!(!a.url||!a.snippet||cg.test(b)||ch.test(b)||ci.test(b)||d.some(a=>a&&b.includes(a)))&&(0===c.length||c.some(b=>a.url.includes(b)))}).slice(0,b):[]}async function cm(a){if(!a.config.enabled||!function(a,b){let c=`${a} ${b.join(" ")}`;return!(!cf.test(c)||/项目概况|工程概况|建设地点|建设规模|招标范围|工程量|报价|造价/u.test(c)&&!/安全|文明|质量|危大|环保|工艺|措施/u.test(c))}(a.chapterTitle,a.sectionTitles))return{evidence:[],queries:[],filtered:0};let b=function(a,b,c){let d=`${a} ${b.join(" ")}`,e=[/危大/u.test(d)?"危大工程 专项施工方案 管理规定 安全措施":"",/安全|文明/u.test(d)?"建筑工程 安全文明施工 管理要求":"",/质量|验收/u.test(d)?"建筑工程 质量控制 质量验收 通用要求":"",/扬尘|环保|绿色/u.test(d)?"施工现场 扬尘治理 绿色施工 环保要求":"",/消防|应急/u.test(d)?"施工现场 消防 应急管理 要求":"",/工艺|技术措施/u.test(d)?"建筑工程 施工工艺 技术措施 通用要求":""].filter(Boolean),f=`${a.replace(cg,"")} 公开规范 通用要求`.trim();return[...new Set(e.length?e:[f])].slice(0,c)}(a.chapterTitle,a.sectionTitles,a.config.maxQueriesPerChapter),c=[],d=0;for(let e of b)try{for(let b of(await cl(e,a.config.maxResultsPerQuery,a.config.trustedDomains,a.runtimeRules.forbiddenTerms||[],a.signal))){let e=function(a,b){let c=a;for(let a of cj)c=c.replace(RegExp(`${a}[^。;;
128
+ ]{0,80}`,"gu"),"");for(let a of b.map(a=>{var b;return null==(b=a.value)?"":"string"==typeof b||"number"==typeof b||"boolean"==typeof b?String(b).trim():""}).filter(a=>a.length>=3&&a.length<=80))c=c.replace(RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"gu"),"");return c.replace(ch,"").trim()}(b.snippet,a.localFacts);if(!e||e.length<20){d+=1;continue}c.push({chapterId:a.chapterId,filePath:b.url,score:.42,content:`参考依据:${b.title}
129
+ ${e}`,source:function(a){let b=a.toLowerCase();return b.includes(".gov.cn")||b.includes("mohurd")||b.includes("zjt")||a.includes("住建")?"web-policy":"web-evidence"}(b.url),sectionTitle:a.chapterTitle})}}catch{d+=1}return{evidence:c,queries:b,filtered:d}}function cn(a){let b=[];return ci.test(a)&&b.push({level:"warning",message:"正文包含联网增强过程性表述",suggestion:"请删除联网检索、网页资料、搜索结果等过程性话术,改为正式交付语言。"}),b}function co(a,b){let c=(0,at.V7)(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}let cp=["项目名称 项目编号 招标人 项目概况与招标范围 建设地点 建设规模 计划工期 质量标准 合同估算价","计划工期 合同工期 总工期 日历天","合同估算价 合同估算价格 投资估算 最高投标限价 招标控制价","质量标准 质量目标 合格","建设地点 建设规模 招标范围"];function cq(a){let b=aX(a),c=0;return/项目名称|工程名称|招标项目名称|项目编号|招标项目编号|招标人|建设单位|发包人/u.test(b)&&(c+=4),/计划工期|合同工期|总工期|\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(b)&&(c+=6),/合同估算价|投资估算|最高投标限价|招标控制价|\d+(?:\.\d+)?\s*(?:万元|元)/u.test(b)&&(c+=5),/质量标准|质量目标|合格|优良/u.test(b)&&(c+=4),/建设地点|建设规模|招标范围|项目概况与招标范围/u.test(b)&&(c+=4),/招标文件|招标公告|投标人须知|前附表|合同协议/u.test(b)&&(c+=2),c}async function cr(a){let b=[],c=new Set(a.scopedFilePaths);for(let d of cp){aE(a.signal);let e=await a.manager.search(a.projectRoot,d,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:10,weights:{keyword:.65,vector:.25,rewrite:.8,hybridBonus:.2},generationMode:!1});b.push(...e.results.filter(a=>c.has(a.filePath)&&cq(`${a.sectionTitle||""}
130
+ ${a.content}`)>0).map(b=>({chapterId:"project-basic",filePath:b.filePath,score:Math.max(b.score,1)+cq(`${b.sectionTitle||""}
131
+ ${b.content}`),content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"pinned-evidence"})))}for(let c of a.scopedFilePaths){aE(a.signal);let d=a.project.getFileDetail?.(c,{maxChunkContentChars:12e3});if(d?.chunks?.length)for(let e of d.chunks){let f=cq(`${e.sectionTitle||""}
132
+ ${e.content||""}`);if(f<=0)continue;let g=d.file?.relativePath||c;b.push({chapterId:"project-basic",filePath:g,score:1+f,content:e.content,roleId:a.fileRoleByPath.get(g),processingType:a.fileProcessingByPath.get(g),sectionTitle:e.sectionTitle,source:"pinned-evidence"})}}let d=new Set;return b.sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}|${a.sectionTitle||""}|${aX(a.content).slice(0,180)}`;return!d.has(b)&&(d.add(b),!0)}).slice(0,24)}function cs(a,b){return(0,au.yw)(a,[{title:b.title,content:a,sections:b.sections||[]}]).filter(a=>a.planned||"missing_planned_section"===a.reason)}function ct(a){return`该小节围绕“${a}”进行补充说明,执行时应结合本章已列明的资料事实、施工对象、控制边界和质量安全要求组织实施。对资料中已经明确的规格、数量、标准编号、工艺参数和验收要求,应在交底、过程检查、复核验收和整改闭环中原样引用;资料未明确的工程实体参数不得擅自确定,可作为施工组织计划值另行报审确认。`}function cu(a,b){let c=cs(a,b).filter(a=>"missing_planned_section"===a.reason);if(0===c.length)return a;let d=c.slice(0,6).map((a,b)=>{let c=/^\d+(?:\.\d+)*/u.test(a.sectionTitle)?"":`${b+1}. `;return`### ${c}${a.sectionTitle}
133
133
 
134
- ${cq(a.sectionTitle)}`});return`${a.trim()}
134
+ ${ct(a.sectionTitle)}`});return`${a.trim()}
135
135
 
136
- ${d.join("\n\n")}`}function cs(a){return a.replace(/^#{1,6}\s+.+$/gmu,"").replace(/^\s*\|.*\|\s*$/gmu,"").replace(/^\s*[-:| ]{3,}\s*$/gmu,"").replace(/\s+/gu,"").length}function ct(a){return a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))}function cu(a,b){if(0===ct(b).length)return a;let c=a,d=a=>ct(b).filter(b=>a.some(a=>a.test(`${b.key||""}${b.fieldName||""}${b.fieldId||""}`))).filter(a=>aW(a.fieldId,a.value)).sort((a,b)=>{let c=aA(a.value),d=aA(b.value),e=3*!!a.sourceFile?.includes("招标文件")+(a.sourceRef?.sectionTitle&&/项目概况|招标公告|前附表|招标范围/u.test(a.sourceRef.sectionTitle)?2:0)-Math.floor(c.length/80);return 3*!!b.sourceFile?.includes("招标文件")+(b.sourceRef?.sectionTitle&&/项目概况|招标公告|前附表|招标范围/u.test(b.sourceRef.sectionTitle)?2:0)-Math.floor(d.length/80)-e})[0]?.value;for(let a of[{label:/计划工期|合同工期|周期要求/u,value:d([/计划工期|合同工期|周期要求|schedule_requirement/u])},{label:/质量标准|质量目标/u,value:d([/质量标准|quality_standard/u])},{label:/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u,value:d([/合同估算|投资估算|最高投标限价|招标控制价|project_investment_estimate/u])},{label:/建设地点/u,value:d([/建设地点|project_location/u])},{label:/建设规模/u,value:d([/建设规模|project_scale/u])}]){let b=cv(aA(a.value||""));b&&(c=c.replace(RegExp(`(${a.label.source})(\\s*[|::]\\s*)资料未明确[^|\\n。;;]*`,"gu"),`$1$2${b}`))}return c}function cv(a){return aU(a).replace(/[。;;]$/u,"").trim()}function cw(a,b="",c=b){let d=function(a){let b=new Map;for(let c of a.split(/\r?\n/u)){if(!/^\|.*\|\s*$/u.test(c)||/^\|\s*:?-{3,}:?/u.test(c))continue;let a=c.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.replace(/\*\*/gu,"").trim());if(a.length<2)continue;let d="序号"===a[0]&&a.length>=3?a[1]:a[0],e="序号"===a[0]&&a.length>=3?a[2]:a[1],f="序号"===a[0]&&a.length>=4?a[3]:a[2],g=d.replace(/\/|:|:/gu,"").trim();if(!/项目名称|工程名称|项目编号|招标项目编号|招标人|项目业主|建设单位|发包人|建设地点|建设规模|施工范围|招标范围|计划工期|合同工期|质量标准|合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g))continue;let h=/计划工期|合同工期/u.test(g)?"schedule_requirement":/质量标准/u.test(g)?"quality_standard":/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g)?"project_investment_estimate":/招标人|项目业主|建设单位|发包人/u.test(g)?"owner":/建设地点/u.test(g)?"project_location":/项目编号|招标项目编号/u.test(g)?"project_code":void 0;!(!e||/内容|参数|资料未明确/u.test(e))&&aW(h||"project_name",e)&&b.set(g,[cv(e),cv(f||"项目资料")||"项目资料"])}return b}(b),e=bb({facts:a,markdown:c}),f=(a,b)=>{let c=e.get(a);return c?[c.value,c.source||"项目资料"]:function(a,b){for(let[c,d]of a.entries())if(b.some(a=>a.test(c)))return d}(d,b)||["",""]};return[["项目名称",...f("project_name",[/项目名称|工程名称|project_name/u])],["项目编号",...f("project_code",[/项目编号|招标项目编号|project_code/u])],["招标人",...f("owner",[/招标人|项目业主|建设单位|发包人|owner/u])],["建设地点",...f("project_location",[/建设地点|project_location/u])],["建设规模",...f("project_scale",[/建设规模|project_scale/u])],["计划工期",...f("schedule_requirement",[/计划工期|合同工期|周期要求|schedule_requirement/u])],["质量标准",...f("quality_standard",[/质量标准|quality_standard/u])],["合同估算价",...f("project_investment_estimate",[/合同估算|投资估算|最高投标限价|招标控制价|project_investment_estimate/u])]].map(([a,b,c])=>[a,b||"资料未明确",b?c||"项目资料":"资料未明确"])}function cx(a){return/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a.trim())}function cy(a){let b=a.trim();if(!b||/^#{1,6}\s+/u.test(b)||cx(b))return!1;let c=(b.match(/\|/gu)||[]).length;return c>=2||c>=1&&/^\s*\|/u.test(b)||c>=1&&/\|\s*$/u.test(b)}function cz(a){return a.trim().replace(/^\|/u,"").replace(/\|$/u,"").trim().split("|").map(a=>a.trim())}function cA(a,b){let c=a.slice(0,b);for(;c.length<b;)c.push("");return`| ${c.join(" | ")} |`}function cB(a){let b=a.replace(/\r?\n/gu,"\n").split("\n"),c=[];for(let a=0;a<b.length;){let d=b[a]||"",e=b[a+1]?.trim()===""?a+2:a+1,f=b[e]||"";if(cy(d)&&cx(f)){for(c.push(d),e!==a+1&&c.push(b[a+1]||""),c.push(f),a=e+1;a<b.length&&cy(b[a]||"");)c.push(b[a]||""),a+=1;continue}if(!cy(d)){c.push(d),a+=1;continue}let g=[],h=a;for(;h<b.length&&cy(b[h]||"");)g.push(b[h]||""),h+=1;let i=g.map(a=>cz(a).length),j=i[0]||0;if(g.length<2||j<2||i.some(a=>a!==j)){c.push(d),a+=1;continue}for(let a of(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(cA(function(a){if(2===a)return["信息项","内容"];let b=["项目","内容","备注","说明"];return Array.from({length:a},(a,c)=>b[c]||`列${c+1}`)}(j),j)),c.push(cA(Array.from({length:j},()=>"---"),j)),g))c.push(cA(cz(a),j));(a=h)<b.length&&b[a]?.trim()&&c.push("")}return c.join("\n").replace(/\n{3,}/gu,"\n\n")}function cC(a){let b=a.replace(/\r?\n/gu,"\n").split("\n"),c=[],d=a=>a.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.trim()),e=a=>/^\s*\|.*\|\s*$/u.test(a),f=a=>/^\s*\|\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a),g=a=>`| ${a.join(" | ")} |`;for(let a=0;a<b.length;){let h=b[a]||"",i=b[a+1]||"";if(!e(h)||!f(i)){c.push(h),a+=1;continue}let j=d(h),k=j.map((a,b)=>/^(?:资料来源|资料来源\/(?:说明|证明)|来源|证明)$/u.test(a)?b:-1).filter(a=>a>=0);if(0===k.length){c.push(h),a+=1;continue}let l=a=>a.filter((a,b)=>!k.includes(b));for(c.push(g(l(j))),c.push(g(l(d(i)).map(a=>a||"---"))),a+=2;a<b.length&&e(b[a]||"");)c.push(g(l(d(b[a]||"")))),a+=1}return c.join("\n").replace(/资料来源\/(?:说明|证明)/gu,"")}function cD(a){let b=[/^项目名称$/u,/^工程名称$/u,/^项目编号$/u,/^招标项目编号$/u,/^招标人$/u,/^项目业主$/u,/^建设单位$/u,/^发包人$/u,/^建设地点$/u,/^实施地点$/u,/^建设规模$/u,/^工程规模$/u,/^计划工期$/u,/^合同工期$/u,/^总工期$/u,/^质量标准$/u,/^质量目标$/u,/^合同估算价$/u,/^投资估算$/u,/^最高投标限价$/u,/^招标控制价$/u],c=a.replace(/\r?\n/gu,"\n").split("\n"),d=[],e=!1,f=a=>cz(a).map(a=>a.replace(/\*\*/gu,"").trim()),g=a=>b.some(b=>b.test(a)),h=a=>{let b=a.slice(2).map(f).filter(a=>a.length>=2).map(a=>a[0]||""),c=b.filter(g).length;return c>=3&&c>=Math.ceil(.45*b.length)};for(let a=0;a<c.length;){let b=c[a]||"",f=c[a+1]||"";if(/(?:\*\*[^\n]*项目基本信息表[^\n]*\*\*|####\s+[^\n]*项目基本信息表[^\n]*|###\s+[^\n]*项目基本信息表[^\n]*)/u.test(b)){let f=[b];for(a+=1;a<c.length&&!(cy(c[a]||"")&&cx(c[a+1]||""))&&""===(c[a]||"").trim();)f.push(c[a]||""),a+=1;if(a<c.length&&cy(c[a]||"")&&cx(c[a+1]||""))for(f.push(c[a]||"",c[a+1]||""),a+=2;a<c.length&&cy(c[a]||"");)f.push(c[a]||""),a+=1;e||(e=!0,d.push(...f));continue}if(cy(b)&&cx(f)){let g=[b,f];for(a+=2;a<c.length&&cy(c[a]||"");)g.push(c[a]||""),a+=1;if(h(g)){e||(e=!0,d.push(...g));continue}d.push(...g);continue}d.push(b),a+=1}return d.join("\n").replace(/\n{3,}/gu,"\n\n").replace(/\n{1,2}\|\s*信息项\s*\|\s*内容\s*\|\s*\n+(?:该小节围绕[^\n]*\n+)+\|\s*:?-{3,}:?\s*\|\s*:?-{3,}:?\s*\|\s*/gu,"\n\n")}function cE(a,b){if(!/项目基本信息|项目概况|工程概况|招标范围/u.test(a))return cD(cB(cC(a)));let c=/^(###\s+(?:\d+\.\d+\s+)?[^\n]*(?:项目概况|工程概况|项目基本信息|招标范围)[^\n]*\n)/mu.exec(a);if(!c?.index&&c?.index!==0)return a;let d=c.index,e=d+c[0].length,f=/^###\s+/gmu;f.lastIndex=e;let g=f.exec(a),h=g?.index??a.length,i=a.slice(e,h),j=function(a,b="",c=b){return["**项目基本信息表**","","| 信息项 | 内容 |","|---|---|",...cw(a,b,c).map(a=>`| ${a[0]} | ${a[1]} |`)].join("\n")}(b,i,a);if(!cw(b,i,a).some(a=>"资料未明确"!==a[1]))return a;let k=i.replace(/\*\*项目基本信息表\*\*[\s\S]*?(?=\n\n(?:[^|\n]|$)|$)/u,"").replace(/\|\s*(?:序号\s*\|\s*项目名称\s*\|\s*内容参数|信息项\s*\|\s*内容\s*(?:\|\s*资料来源\/(?:说明|证明))?)\s*\|[\s\S]*?(?=\n\n(?:[^|\n]|$)|$)/u,"").replace(/^\|\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|\s*\n(?:^\|.*\|\s*\n?)*/gmu,"").replace(/该小节围绕“[^”]+”进行补充说明[^\n]*(?:\n\n该小节围绕“[^”]+”进行补充说明[^\n]*)*/gu,"").replace(/\n{3,}/gu,"\n\n").trim(),l=`${c[0].trimEnd()}
136
+ ${d.join("\n\n")}`}function cv(a){return a.replace(/^#{1,6}\s+.+$/gmu,"").replace(/^\s*\|.*\|\s*$/gmu,"").replace(/^\s*[-:| ]{3,}\s*$/gmu,"").replace(/\s+/gu,"").length}function cw(a){return a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))}function cx(a,b){if(0===cw(b).length)return a;let c=a,d=a=>cw(b).filter(b=>a.some(a=>a.test(`${b.key||""}${b.fieldName||""}${b.fieldId||""}`))).filter(a=>aZ(a.fieldId,a.value)).sort((a,b)=>{let c=aD(a.value),d=aD(b.value),e=3*!!a.sourceFile?.includes("招标文件")+(a.sourceRef?.sectionTitle&&/项目概况|招标公告|前附表|招标范围/u.test(a.sourceRef.sectionTitle)?2:0)-Math.floor(c.length/80);return 3*!!b.sourceFile?.includes("招标文件")+(b.sourceRef?.sectionTitle&&/项目概况|招标公告|前附表|招标范围/u.test(b.sourceRef.sectionTitle)?2:0)-Math.floor(d.length/80)-e})[0]?.value;for(let a of[{label:/计划工期|合同工期|周期要求/u,value:d([/计划工期|合同工期|周期要求|schedule_requirement/u])},{label:/质量标准|质量目标/u,value:d([/质量标准|quality_standard/u])},{label:/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u,value:d([/合同估算|投资估算|最高投标限价|招标控制价|project_investment_estimate/u])},{label:/建设地点/u,value:d([/建设地点|project_location/u])},{label:/建设规模/u,value:d([/建设规模|project_scale/u])}]){let b=cy(aD(a.value||""));b&&(c=c.replace(RegExp(`(${a.label.source})(\\s*[|::]\\s*)资料未明确[^|\\n。;;]*`,"gu"),`$1$2${b}`))}return c}function cy(a){return aX(a).replace(/[。;;]$/u,"").trim()}function cz(a,b="",c=b){let d=function(a){let b=new Map;for(let c of a.split(/\r?\n/u)){if(!/^\|.*\|\s*$/u.test(c)||/^\|\s*:?-{3,}:?/u.test(c))continue;let a=c.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.replace(/\*\*/gu,"").trim());if(a.length<2)continue;let d="序号"===a[0]&&a.length>=3?a[1]:a[0],e="序号"===a[0]&&a.length>=3?a[2]:a[1],f="序号"===a[0]&&a.length>=4?a[3]:a[2],g=d.replace(/\/|:|:/gu,"").trim();if(!/项目名称|工程名称|项目编号|招标项目编号|招标人|项目业主|建设单位|发包人|建设地点|建设规模|施工范围|招标范围|计划工期|合同工期|质量标准|合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g))continue;let h=/计划工期|合同工期/u.test(g)?"schedule_requirement":/质量标准/u.test(g)?"quality_standard":/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g)?"project_investment_estimate":/招标人|项目业主|建设单位|发包人/u.test(g)?"owner":/建设地点/u.test(g)?"project_location":/项目编号|招标项目编号/u.test(g)?"project_code":void 0;!(!e||/内容|参数|资料未明确/u.test(e))&&aZ(h||"project_name",e)&&b.set(g,[cy(e),cy(f||"项目资料")||"项目资料"])}return b}(b),e=be({facts:a,markdown:c}),f=(a,b)=>{let c=e.get(a);return c?[c.value,c.source||"项目资料"]:function(a,b){for(let[c,d]of a.entries())if(b.some(a=>a.test(c)))return d}(d,b)||["",""]};return[["项目名称",...f("project_name",[/项目名称|工程名称|project_name/u])],["项目编号",...f("project_code",[/项目编号|招标项目编号|project_code/u])],["招标人",...f("owner",[/招标人|项目业主|建设单位|发包人|owner/u])],["建设地点",...f("project_location",[/建设地点|project_location/u])],["建设规模",...f("project_scale",[/建设规模|project_scale/u])],["计划工期",...f("schedule_requirement",[/计划工期|合同工期|周期要求|schedule_requirement/u])],["质量标准",...f("quality_standard",[/质量标准|quality_standard/u])],["合同估算价",...f("project_investment_estimate",[/合同估算|投资估算|最高投标限价|招标控制价|project_investment_estimate/u])]].map(([a,b,c])=>[a,b||"资料未明确",b?c||"项目资料":"资料未明确"])}function cA(a){return/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a.trim())}function cB(a){let b=a.trim();if(!b||/^#{1,6}\s+/u.test(b)||cA(b))return!1;let c=(b.match(/\|/gu)||[]).length;return c>=2||c>=1&&/^\s*\|/u.test(b)||c>=1&&/\|\s*$/u.test(b)}function cC(a){return a.trim().replace(/^\|/u,"").replace(/\|$/u,"").trim().split("|").map(a=>a.trim())}function cD(a,b){let c=a.slice(0,b);for(;c.length<b;)c.push("");return`| ${c.join(" | ")} |`}function cE(a){let b=a.replace(/\r?\n/gu,"\n").split("\n"),c=[];for(let a=0;a<b.length;){let d=b[a]||"",e=b[a+1]?.trim()===""?a+2:a+1,f=b[e]||"";if(cB(d)&&cA(f)){for(c.push(d),e!==a+1&&c.push(b[a+1]||""),c.push(f),a=e+1;a<b.length&&cB(b[a]||"");)c.push(b[a]||""),a+=1;continue}if(!cB(d)){c.push(d),a+=1;continue}let g=[],h=a;for(;h<b.length&&cB(b[h]||"");)g.push(b[h]||""),h+=1;let i=g.map(a=>cC(a).length),j=i[0]||0;if(g.length<2||j<2||i.some(a=>a!==j)){c.push(d),a+=1;continue}for(let a of(c.length>0&&c[c.length-1]?.trim()&&c.push(""),c.push(cD(function(a){if(2===a)return["信息项","内容"];let b=["项目","内容","备注","说明"];return Array.from({length:a},(a,c)=>b[c]||`列${c+1}`)}(j),j)),c.push(cD(Array.from({length:j},()=>"---"),j)),g))c.push(cD(cC(a),j));(a=h)<b.length&&b[a]?.trim()&&c.push("")}return c.join("\n").replace(/\n{3,}/gu,"\n\n")}function cF(a){let b=a.replace(/\r?\n/gu,"\n").split("\n"),c=[],d=a=>a.trim().replace(/^\|/u,"").replace(/\|$/u,"").split("|").map(a=>a.trim()),e=a=>/^\s*\|.*\|\s*$/u.test(a),f=a=>/^\s*\|\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a),g=a=>`| ${a.join(" | ")} |`;for(let a=0;a<b.length;){let h=b[a]||"",i=b[a+1]||"";if(!e(h)||!f(i)){c.push(h),a+=1;continue}let j=d(h),k=j.map((a,b)=>/^(?:资料来源|资料来源\/(?:说明|证明)|来源|证明)$/u.test(a)?b:-1).filter(a=>a>=0);if(0===k.length){c.push(h),a+=1;continue}let l=a=>a.filter((a,b)=>!k.includes(b));for(c.push(g(l(j))),c.push(g(l(d(i)).map(a=>a||"---"))),a+=2;a<b.length&&e(b[a]||"");)c.push(g(l(d(b[a]||"")))),a+=1}return c.join("\n").replace(/资料来源\/(?:说明|证明)/gu,"")}function cG(a){let b=[/^项目名称$/u,/^工程名称$/u,/^项目编号$/u,/^招标项目编号$/u,/^招标人$/u,/^项目业主$/u,/^建设单位$/u,/^发包人$/u,/^建设地点$/u,/^实施地点$/u,/^建设规模$/u,/^工程规模$/u,/^计划工期$/u,/^合同工期$/u,/^总工期$/u,/^质量标准$/u,/^质量目标$/u,/^合同估算价$/u,/^投资估算$/u,/^最高投标限价$/u,/^招标控制价$/u],c=a.replace(/\r?\n/gu,"\n").split("\n"),d=[],e=!1,f=a=>cC(a).map(a=>a.replace(/\*\*/gu,"").trim()),g=a=>b.some(b=>b.test(a)),h=a=>{let b=a.slice(2).map(f).filter(a=>a.length>=2).map(a=>a[0]||""),c=b.filter(g).length;return c>=3&&c>=Math.ceil(.45*b.length)};for(let a=0;a<c.length;){let b=c[a]||"",f=c[a+1]||"";if(/(?:\*\*[^\n]*项目基本信息表[^\n]*\*\*|####\s+[^\n]*项目基本信息表[^\n]*|###\s+[^\n]*项目基本信息表[^\n]*)/u.test(b)){let f=[b];for(a+=1;a<c.length&&!(cB(c[a]||"")&&cA(c[a+1]||""))&&""===(c[a]||"").trim();)f.push(c[a]||""),a+=1;if(a<c.length&&cB(c[a]||"")&&cA(c[a+1]||""))for(f.push(c[a]||"",c[a+1]||""),a+=2;a<c.length&&cB(c[a]||"");)f.push(c[a]||""),a+=1;e||(e=!0,d.push(...f));continue}if(cB(b)&&cA(f)){let g=[b,f];for(a+=2;a<c.length&&cB(c[a]||"");)g.push(c[a]||""),a+=1;if(h(g)){e||(e=!0,d.push(...g));continue}d.push(...g);continue}d.push(b),a+=1}return d.join("\n").replace(/\n{3,}/gu,"\n\n").replace(/\n{1,2}\|\s*信息项\s*\|\s*内容\s*\|\s*\n+(?:该小节围绕[^\n]*\n+)+\|\s*:?-{3,}:?\s*\|\s*:?-{3,}:?\s*\|\s*/gu,"\n\n")}function cH(a,b){if(!/项目基本信息|项目概况|工程概况|招标范围/u.test(a))return cG(cE(cF(a)));let c=/^(###\s+(?:\d+\.\d+\s+)?[^\n]*(?:项目概况|工程概况|项目基本信息|招标范围)[^\n]*\n)/mu.exec(a);if(!c?.index&&c?.index!==0)return a;let d=c.index,e=d+c[0].length,f=/^###\s+/gmu;f.lastIndex=e;let g=f.exec(a),h=g?.index??a.length,i=a.slice(e,h),j=function(a,b="",c=b){return["**项目基本信息表**","","| 信息项 | 内容 |","|---|---|",...cz(a,b,c).map(a=>`| ${a[0]} | ${a[1]} |`)].join("\n")}(b,i,a);if(!cz(b,i,a).some(a=>"资料未明确"!==a[1]))return a;let k=i.replace(/\*\*项目基本信息表\*\*[\s\S]*?(?=\n\n(?:[^|\n]|$)|$)/u,"").replace(/\|\s*(?:序号\s*\|\s*项目名称\s*\|\s*内容参数|信息项\s*\|\s*内容\s*(?:\|\s*资料来源\/(?:说明|证明))?)\s*\|[\s\S]*?(?=\n\n(?:[^|\n]|$)|$)/u,"").replace(/^\|\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|\s*\n(?:^\|.*\|\s*\n?)*/gmu,"").replace(/该小节围绕“[^”]+”进行补充说明[^\n]*(?:\n\n该小节围绕“[^”]+”进行补充说明[^\n]*)*/gu,"").replace(/\n{3,}/gu,"\n\n").trim(),l=`${c[0].trimEnd()}
137
137
 
138
138
  ${j}${k?`
139
139
 
140
140
  ${k}`:""}
141
141
 
142
- `;return cD(cB(cC(`${a.slice(0,d)}${l}${a.slice(h).trimStart()}`)))}function cF(a,b){return 0!==ct(b).length&&/资料未明确/u.test(a)?["计划工期","合同工期","质量标准","合同估算价","合同估算价格","建设地点","建设规模"].filter(b=>RegExp(`${b}[^
143
- |。;;]{0,40}资料未明确`,"u").test(a)).map(a=>({level:"error",message:`${a} 已抽取到资料事实但正文仍显示资料未明确`,suggestion:"请优先使用项目基础事实卡片中的资料原值,不得用占位表达覆盖已确认事实。"})):[]}function cG(a){return a.replace(/见招标文件/gu,"按本项目招标文件已明确的相应条款执行").replace(/按图纸/gu,"依据经确认的设计文件和图纸内容组织实施").replace(/按设计要求/gu,"依据设计文件明确的构造、材料、尺寸和验收要求执行").replace(/按(?:资料|文件|说明|方案|规范|标准|要求)/gu,"依据本项目已确认资料、技术文件和验收标准").replace(/满足(?:相关|有关)?要求/gu,"满足本项目已明确的质量、安全、技术和验收控制要求").replace(/\b兜底\b|兜底生成|兜底片段/gu,"补充完善").replace(/本节(?:将|主要|重点)?/gu,"").replace(/本章将/gu,"").replace(/根据需要|视情况|结合实际情况/gu,"结合已确认资料、现场条件和审批后的施工组织安排").replace(/相关要求/gu,"本项目已明确的质量、安全、技术和验收要求")}function cH(a,b){return cG((function(a,b){let c=cr(a,{id:"",title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections||[]});for(let a of b.sections||[]){let b=RegExp(`^(#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}\\s*)\\n([\\s\\S]*?)(?=^#{2,4}\\s+|$)`,"mu");c=c.replace(b,(b,c,d)=>cs(d)>=80?b:`${c}
142
+ `;return cG(cE(cF(`${a.slice(0,d)}${l}${a.slice(h).trimStart()}`)))}function cI(a,b){return 0!==cw(b).length&&/资料未明确/u.test(a)?["计划工期","合同工期","质量标准","合同估算价","合同估算价格","建设地点","建设规模"].filter(b=>RegExp(`${b}[^
143
+ |。;;]{0,40}资料未明确`,"u").test(a)).map(a=>({level:"error",message:`${a} 已抽取到资料事实但正文仍显示资料未明确`,suggestion:"请优先使用项目基础事实卡片中的资料原值,不得用占位表达覆盖已确认事实。"})):[]}function cJ(a){return a.replace(/见招标文件/gu,"按本项目招标文件已明确的相应条款执行").replace(/按图纸/gu,"依据经确认的设计文件和图纸内容组织实施").replace(/按设计要求/gu,"依据设计文件明确的构造、材料、尺寸和验收要求执行").replace(/按(?:资料|文件|说明|方案|规范|标准|要求)/gu,"依据本项目已确认资料、技术文件和验收标准").replace(/满足(?:相关|有关)?要求/gu,"满足本项目已明确的质量、安全、技术和验收控制要求").replace(/\b兜底\b|兜底生成|兜底片段/gu,"补充完善").replace(/本节(?:将|主要|重点)?/gu,"").replace(/本章将/gu,"").replace(/根据需要|视情况|结合实际情况/gu,"结合已确认资料、现场条件和审批后的施工组织安排").replace(/相关要求/gu,"本项目已明确的质量、安全、技术和验收要求")}function cK(a,b){return cJ((function(a,b){let c=cu(a,{id:"",title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections||[]});for(let a of b.sections||[]){let b=RegExp(`^(#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}\\s*)\\n([\\s\\S]*?)(?=^#{2,4}\\s+|$)`,"mu");c=c.replace(b,(b,c,d)=>cv(d)>=80?b:`${c}
144
144
  ${d.trim()}
145
145
 
146
- ${cq(a)}
146
+ ${ct(a)}
147
147
 
148
- `)}return c})(a,b).replace(/^(#{3,4}\s+(.+)\s*)\n([\s\S]*?)(?=^#{2,4}\s+|$)/gmu,(a,b,c,d)=>{if(!(/^\s*\|.*\|\s*$/mu.test(d)&&/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/mu.test(d))||cs(d)>=80)return a;let e=c.replace(/^\d+(?:\.\d+)*\s*/u,"").trim();return`${b}
148
+ `)}return c})(a,b).replace(/^(#{3,4}\s+(.+)\s*)\n([\s\S]*?)(?=^#{2,4}\s+|$)/gmu,(a,b,c,d)=>{if(!(/^\s*\|.*\|\s*$/mu.test(d)&&/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/mu.test(d))||cv(d)>=80)return a;let e=c.replace(/^\d+(?:\.\d+)*\s*/u,"").trim();return`${b}
149
149
  ${d.trim()}
150
150
 
151
151
  表中内容用于明确本小节涉及的对象、范围和控制要求,实施前应由项目技术、质量和施工管理人员结合已确认资料进行复核。执行过程中应保留交底、检查、复验和整改记录,确保表格列明事项能够落实到施工组织、资源配置和验收闭环。
152
152
 
153
- ${cq(e)}
153
+ ${ct(e)}
154
154
 
155
- `})).split(/\n{2,}/u).map(a=>{if(/^\s*(#{1,6}\s+|[-*+]\s+|\|)/u.test(a)||a.length<520)return a;let b=a.split(/(?<=[。;])/u).map(a=>a.trim()).filter(Boolean);if(b.length<4)return a;let c=[],d="";for(let a of b)d.length>260&&d.length+a.length>420?(c.push(d),d=a):d+=a;return d&&c.push(d),c.join("\n\n")}).join("\n\n").replace(/\n{3,}/gu,"\n\n").trim()}function cI(a,b){let c=a.chapterPrompts.filter(a=>"writer"===a.category||"chapter"===a.category||"formatting"===a.category),d=[...a.writerPrompts,...c,...a.formattingPrompts],e=a.writerPrompts[0],f=d.map(a=>`${"writer"===a.category?"写作控制提示词":a.category}|${a.roleId}|${a.name}|${a.content.length} 字符`),g=bz(a.writerPrompts),h=bz([...c,...a.formattingPrompts]);return{primaryPromptId:e?.id,primaryWriter:e,prompts:d,promptTexts:[g?`【最高优先级:配置写作主控提示词】
155
+ `})).split(/\n{2,}/u).map(a=>{if(/^\s*(#{1,6}\s+|[-*+]\s+|\|)/u.test(a)||a.length<520)return a;let b=a.split(/(?<=[。;])/u).map(a=>a.trim()).filter(Boolean);if(b.length<4)return a;let c=[],d="";for(let a of b)d.length>260&&d.length+a.length>420?(c.push(d),d=a):d+=a;return d&&c.push(d),c.join("\n\n")}).join("\n\n").replace(/\n{3,}/gu,"\n\n").trim()}function cL(a,b){let c=a.chapterPrompts.filter(a=>"writer"===a.category||"chapter"===a.category||"formatting"===a.category),d=[...a.writerPrompts,...c,...a.formattingPrompts],e=a.writerPrompts[0],f=d.map(a=>`${"writer"===a.category?"写作控制提示词":a.category}|${a.roleId}|${a.name}|${a.content.length} 字符`),g=bC(a.writerPrompts),h=bC([...c,...a.formattingPrompts]);return{primaryPromptId:e?.id,primaryWriter:e,prompts:d,promptTexts:[g?`【最高优先级:配置写作主控提示词】
156
156
  ${g}`:"",h?`【章节/格式提示词】
157
- ${h}`:""].filter(Boolean).join("\n\n"),promptDetails:f}}function cJ(a){return aU(a).replace(/[\s,,.。::;;||()()《》<>【】"“”'‘’]/gu,"").split("[").join("").split("]").join("").toLowerCase()}function cK(a){return/工程造价|造价|报价|投标报价|报价明细|综合单价|单价|合价|金额|税率|增值税|利润|预留金|暂列金额|最高投标限价|招标控制价|合同估算价|合同估算价格|投资估算|估算价/u.test(a)}function cL(a,b){let c=cJ(a),d=cJ(b);if(!d||d.length<2||c.includes(d))return!0;let e=b.match(/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年|万元|元|平方米|㎡|m²|立方米|m³|米|m|mm|cm|台|套|人|项|%|MPa|kPa)?/giu)||[];return e.length>0&&e.some(a=>cJ(a).length>=2&&c.includes(cJ(a)))}function cM(a,b,c={}){let d=b.filter(a=>{let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`;return!cK(`${b}${aA(a.value)}`)&&(/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|质量标准|质量目标|危大|安全|资源|材料|机械|设备/u.test(b)||/\d/u.test(aA(a.value)))}),e=new Set,f=[];for(let b of d){let d=function(a){let b=cv(aA(a));return!b||/资料未明确|未确认|待确认|无|暂无/u.test(b)||cK(b)||b.length>160?"":b}(b.value);if(!d)continue;let g=b.fieldName||b.key||b.fieldId||"资料事实",h=`${g}:${d}`;if(!e.has(h)&&(e.add(h),!cL(a,d)&&(f.push({fact:b,label:g,value:d}),c.maxItems&&f.length>=c.maxItems)))break}return f}function cN(a,b,c){let d=cM(c,b,{maxItems:18});if(0===d.length)return{chapters:a,patchedCount:0,missingCount:0};let e=a.map(a=>({...a})),f=0;for(let a of d){let b=e.find(b=>(function(a,b){let c=`${b.title} ${(b.sections||[]).join(" ")} ${a.key||""} ${a.fieldName||""} ${a.fieldId||""}`;return!!(/概况|工程|项目|总体/u.test(b.title)&&/项目|工程|招标人|建设单位|地点|规模|范围/u.test(c)||/工期|进度/u.test(b.title)&&/工期|进度|节点|开工|竣工/u.test(c)||/质量/u.test(b.title)&&/质量|验收|标准/u.test(c)||/安全|文明|危大|风险/u.test(b.title)&&/安全|文明|危大|风险/u.test(c)||/人|材|机|资源|材料|机械|设备|劳动力/u.test(b.title)&&/人|材|机|资源|材料|机械|设备|劳动力/u.test(c))||(b.sections||[]).some(a=>c.includes(a))})(a.fact,b))||e[0];if(!b||cL(b.content,a.value))continue;let c=`${a.label}按已确认资料执行为${a.value},项目部在施工组织、技术交底、过程检查和验收复核中保持该项事实口径一致,不擅自变更资料已明确的数值、单位和适用范围。`;b.content=`${b.content.trim()}
157
+ ${h}`:""].filter(Boolean).join("\n\n"),promptDetails:f}}function cM(a){return aX(a).replace(/[\s,,.。::;;||()()《》<>【】"“”'‘’]/gu,"").split("[").join("").split("]").join("").toLowerCase()}function cN(a){return/工程造价|造价|报价|投标报价|报价明细|综合单价|单价|合价|金额|税率|增值税|利润|预留金|暂列金额|最高投标限价|招标控制价|合同估算价|合同估算价格|投资估算|估算价/u.test(a)}function cO(a,b){let c=cM(a),d=cM(b);if(!d||d.length<2||c.includes(d))return!0;let e=b.match(/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年|万元|元|平方米|㎡|m²|立方米|m³|米|m|mm|cm|台|套|人|项|%|MPa|kPa)?/giu)||[];return e.length>0&&e.some(a=>cM(a).length>=2&&c.includes(cM(a)))}function cP(a,b,c={}){let d=b.filter(a=>{let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`;return!cN(`${b}${aD(a.value)}`)&&(/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|质量标准|质量目标|危大|安全|资源|材料|机械|设备/u.test(b)||/\d/u.test(aD(a.value)))}),e=new Set,f=[];for(let b of d){let d=function(a){let b=cy(aD(a));return!b||/资料未明确|未确认|待确认|无|暂无/u.test(b)||cN(b)||b.length>160?"":b}(b.value);if(!d)continue;let g=b.fieldName||b.key||b.fieldId||"资料事实",h=`${g}:${d}`;if(!e.has(h)&&(e.add(h),!cO(a,d)&&(f.push({fact:b,label:g,value:d}),c.maxItems&&f.length>=c.maxItems)))break}return f}function cQ(a,b,c){let d=cP(c,b,{maxItems:18});if(0===d.length)return{chapters:a,patchedCount:0,missingCount:0};let e=a.map(a=>({...a})),f=0;for(let a of d){let b=e.find(b=>(function(a,b){let c=`${b.title} ${(b.sections||[]).join(" ")} ${a.key||""} ${a.fieldName||""} ${a.fieldId||""}`;return!!(/概况|工程|项目|总体/u.test(b.title)&&/项目|工程|招标人|建设单位|地点|规模|范围/u.test(c)||/工期|进度/u.test(b.title)&&/工期|进度|节点|开工|竣工/u.test(c)||/质量/u.test(b.title)&&/质量|验收|标准/u.test(c)||/安全|文明|危大|风险/u.test(b.title)&&/安全|文明|危大|风险/u.test(c)||/人|材|机|资源|材料|机械|设备|劳动力/u.test(b.title)&&/人|材|机|资源|材料|机械|设备|劳动力/u.test(c))||(b.sections||[]).some(a=>c.includes(a))})(a.fact,b))||e[0];if(!b||cO(b.content,a.value))continue;let c=`${a.label}按已确认资料执行为${a.value},项目部在施工组织、技术交底、过程检查和验收复核中保持该项事实口径一致,不擅自变更资料已明确的数值、单位和适用范围。`;b.content=`${b.content.trim()}
158
158
 
159
- ${c}`,f+=1}return{chapters:e.map(a=>({...a,sections:a.sections||[]})),patchedCount:f,missingCount:d.length}}function cO(a){return/概况|项目|工程|地点|规模|工期|质量|估算/u.test(a)?{keyword:.65,vector:.25,rewrite:.8,hybridBonus:.2}:/人|材|机|资源|材料|设备|机械|劳动力/u.test(a)?{keyword:.55,vector:.35,rewrite:.75,hybridBonus:.18}:/危大|安全|文明|风险/u.test(a)?{keyword:.5,vector:.4,rewrite:.8,hybridBonus:.2}:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}}function cP(a,b,c,d){return I(b.map(b=>({...b,score:b.score*function(a,b){let c=`${a.title} ${(a.sections||[]).join(" ")} ${a.requiredFacts.join(" ")}`;return"reference"===b?.55:"table"===b?/清单|工程量|数量|材料|设备|资源|费用|造价|范围|统计|表/u.test(c)?1.45:.95:"rule"===b?/要求|规则|招标|评审|响应|质量|安全|验收|标准|工期|进度|风险|约束/u.test(c)?1.35:.95:"drawing"===b?/图纸|设计|布置|位置|平面|剖面|立面|空间|施工方法|做法/u.test(c)?1.35:.85:"specification"===b&&/技术|规范|标准|参数|做法|质量|验收|施工方法/u.test(c)?1.3:1}(a,b.processingType)+function(a,b){let c=`${b.sectionTitle||""}
159
+ ${c}`,f+=1}return{chapters:e.map(a=>({...a,sections:a.sections||[]})),patchedCount:f,missingCount:d.length}}function cR(a){return/概况|项目|工程|地点|规模|工期|质量|估算/u.test(a)?{keyword:.65,vector:.25,rewrite:.8,hybridBonus:.2}:/人|材|机|资源|材料|设备|机械|劳动力/u.test(a)?{keyword:.55,vector:.35,rewrite:.75,hybridBonus:.18}:/危大|安全|文明|风险/u.test(a)?{keyword:.5,vector:.4,rewrite:.8,hybridBonus:.2}:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}}function cS(a,b,c,d){return I(b.map(b=>({...b,score:b.score*function(a,b){let c=`${a.title} ${(a.sections||[]).join(" ")} ${a.requiredFacts.join(" ")}`;return"reference"===b?.55:"table"===b?/清单|工程量|数量|材料|设备|资源|费用|造价|范围|统计|表/u.test(c)?1.45:.95:"rule"===b?/要求|规则|招标|评审|响应|质量|安全|验收|标准|工期|进度|风险|约束/u.test(c)?1.35:.95:"drawing"===b?/图纸|设计|布置|位置|平面|剖面|立面|空间|施工方法|做法/u.test(c)?1.35:.85:"specification"===b&&/技术|规范|标准|参数|做法|质量|验收|施工方法/u.test(c)?1.3:1}(a,b.processingType)+function(a,b){let c=`${b.sectionTitle||""}
160
160
  ${b.filePath}
161
- ${b.content}`;return Math.min(1.8,.16*[...new Set([a.title,...a.sections||[],...a.requiredFacts].flatMap(a=>a.split(/[\s、,,。;;::()()《》【】\-/]+/u)).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,36))].filter(a=>c.includes(a)).length)}(a,b)})),c,d)}function cQ(a,b,c){let d=(a.sections||[]).slice(0,10).join(" "),e=a.requiredFacts.slice(0,10).join(" ");return[...new Set([`${a.title} ${d} ${e}`.trim(),...b,...c].filter(Boolean))]}function cR(a,b){let c=Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER);return Math.max(2,Math.min(9,Math.floor(Number.isFinite(c)&&c>0?c:4)+ +((a.sections||[]).length>=6||a.requiredFacts.length>=8)+Math.min(2,b.length)))}function cS(a,b){return Math.max(12,Math.min(26,a+10+4*((b.sections||[]).length>=6||b.requiredFacts.length>=8)))}async function cT(a){if(aB(a.signal),0===a.scopedFilePaths.length)return[];let b=`${a.chapter.title} ${a.sectionTitle}`.trim();return I((await a.manager.search(a.projectRoot,b,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:5,weights:cO(b),generationMode:!1})).results.filter(b=>a.scopedFilePaths.includes(b.filePath)).map(b=>({chapterId:a.chapter.id,filePath:b.filePath,score:b.score+1.2,content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"section-evidence"})),{maxItems:5,maxChars:9e3,preservePinned:!0})}async function cU(a){let b=[];for(let c of a.needs.slice(0,8)){aB(a.signal);let d=`${a.chapter.title} ${c} ${(a.chapter.sections||[]).join(" ")}`.trim(),e=await a.manager.search(a.projectRoot,d,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:6,weights:cO(`${a.chapter.title} ${c}`),generationMode:!1});b.push(...e.results.filter(b=>a.scopedFilePaths.includes(b.filePath)).map(b=>({chapterId:a.chapter.id,filePath:b.filePath,score:b.score+2,content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"required-fact-evidence"})))}return I(b,{maxItems:Math.max(6,3*a.needs.length),maxChars:18e3,preservePinned:!0})}function cV(a,b,c=12){if(0===b.length)return[];let d=b.slice(0,c).map(a=>e.basename(a)),f=b.length>c?` 等 ${b.length} 个文件`:"";return[`${a}:${d.join("、")}${f}`]}function cW(a,b,c){if(Number.isFinite(c)&&c>0)return Math.ceil(c);let d=new Set(b.filter(Boolean)),e=a.listFiles?.().filter(a=>0===d.size||d.has(a.relativePath)).reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0)??0;return e>0?e:Math.max(1,d.size)}async function cX(a){var b;aB(a.signal);let c=(0,d.QJ)(a.templateId);if(!c)throw Error("Document template not found");let o=e.resolve(a.projectRoot||(0,g.aY)());if(!o)throw Error("No knowledge base project found");let p=(0,f.computeProjectId)(o),q=c,t=(0,g.Qh)(),u=[],v=[],y=(b,c=G)=>{let d=b?[...b].sort((a,b)=>{let c=v.indexOf(a.id),d=v.indexOf(b.id);return(c<0?Number.MAX_SAFE_INTEGER:c)-(d<0?Number.MAX_SAFE_INTEGER:d)}):void 0;a.onProgress?.([...c],d?{chapters:d}:void 0)},z=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),B=async(b,c=G)=>{let d=setInterval(()=>{a.signal?.aborted||y(u,c)},z);try{return await b()}finally{clearInterval(d)}},C=(0,d.N6)(q)||"none",E=(0,i.Mu)(C)?.name||C,G=[bd({type:"role_binding",roleId:C,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${q.name}`,details:[`当前项目:${p}`,`资料目录:${e.join(o,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:E,roleName:E,order:0})];y();let H=(0,d.bj)(q),J=H.bindings,K=(0,d.Vh)(q);if(be(G,bd({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:G.length})),y(),0===K.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let M=bz([...H.writerPrompts,...H.chapterPrompts]),N=(0,P.cs)([{text:a.requirement,source:"用户需求",strict:!0},{text:M,source:"提示词角色",strict:!0}]),O=N.length>=2;O&&(q={...c,chapters:N}),be(G,bd({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${K.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:G.length})),y();let Q=function(a,b){if(0===b.length)return b;let c=(0,g.Yy)(a),d=new Set(c.map(a=>a.relativePath)),e=c.filter(a=>"disk"!==a.status&&"error"!==a.status&&Number(a.indexedAt||0)>0&&Number(a.chunkCount||0)>0),f=[],h=new Set;for(let a of b){let b=a.filePath.replace(/^\/+|\/+$/gu,"");for(let c of d.has(b)?[b]:e.filter(a=>a.relativePath.startsWith(`${b}/`)).map(a=>a.relativePath)){let b=`${a.roleId}
162
- ${c}`;h.has(b)||(h.add(b),f.push({...a,filePath:c}))}}return f}(o,K);if(0===Q.length)throw Error("模板绑定的知识库文件或文件夹不存在,请重新选择项目文件绑定。");let R=await B(()=>Promise.resolve((0,k.P)(o,{requirement:a.requirement,boundFilePaths:Q.map(a=>a.filePath),boundFileRoles:(0,d.wR)(Q)})));be(G,bd({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(R.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:G.length})),y();let S=await B(()=>Promise.resolve((0,j.x)(q,a.requirement||""))),T=S.spec,U=function(a,b=""){let c=`${a?.id||""} ${a?.name||""} ${a?.category||""} ${a?.description||""} ${a?.outputTitle||""} ${b}`;return/施工组织设计|施工方案|危大工程|人、材、机|安全文明施工/u.test(c)?m:l}(q,a.requirement||""),V=(0,r.h)(q,R),W=(0,s.$)({template:q,spec:T,summary:R,resolvedRoles:V});if(!W.ready)throw Error(`生成准备度不足:${W.blockingIssues.join(";")}`);let X=[(0,k.F)(R,{publicSafe:!0}),(0,j.N)(T,S.sourceHash,{publicSafe:!0}),(0,s.R)(W,{publicSafe:!0})].filter(Boolean).join("\n\n"),Y=[(0,k.F)(R),(0,j.N)(T,S.sourceHash),(0,s.R)(W)].filter(Boolean).join("\n\n"),Z=bz([...H.writerPrompts,...H.formattingPrompts]),_=bz([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts]),ab=bz(H.prompts),ac=(0,h.I)().load().webAccess||{enabled:!1,allowProjectFacts:!1,maxQueriesPerChapter:2,maxResultsPerQuery:3,trustedDomains:[]},ad=function(a){let b=[a.promptTexts,a.requirement||""].filter(Boolean).join("\n\n").replace(/\\n/gu,"\n"),c=function(a){let b=a.replace(/\\n/gu,"\n"),c=new Set;for(let a of(/全文必须输出[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||/必须输出(?:的)?表格[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||"").split(/[、,,]/u)){let b=/([\p{Script=Han}A-Za-z0-9()()]{2,30}表)$/u.exec(a.trim())?.[1];b&&b.length>=4&&b.length<=30&&c.add(b)}/项目基本信息表/u.test(b)&&c.add("项目基本信息表");let d=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"];/杜绝|禁止|不得|严禁/u.test(b)&&d.push("施工方","投标人","高度重视","重中之重"),/商务|报价|单价|税率|利润|造价/u.test(b)&&d.push("综合单价","报价明细","单价","税率","增值税","利润","预留金","报价明细表");let e=bU(b,"封面"),f=bU(b,"目录");return{coverPolicy:e,tocPolicy:f,forbidCover:"forbidden"===e,forbidToc:"forbidden"===f,forbiddenTerms:[...new Set(d)],preferredTerms:[{from:"施工方",to:"我公司"},{from:"投标人",to:"我公司"},{from:"高度重视",to:"严格落实"},{from:"重中之重",to:"关键控制事项"}],requiredTables:[...c],requiredKeywords:bR(b),forbiddenPatterns:bS(b)}}(b),d=[...new Set([...c.requiredTables,...function(a){let b=new Set;for(let c of[/(?:必须|应当|需要|全文必须|至少)输出(?:的)?表格[::]\s*([^。;;\n]+)/gu,/(?:必须|应当|需要|全文必须|至少)包含(?:的)?表格[::]\s*([^。;;\n]+)/gu,/(?:表格清单|表格要求)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=/([\p{Script=Han}A-Za-z0-9()()《》<>]{2,40}表)/u.exec(a.trim())?.[1];c&&b.add(c.replace(/[<>《》]/gu,""))}for(let c of a.matchAll(/([\p{Script=Han}A-Za-z0-9()()]{2,40}表)(?:必须|应当|需要|不得缺失|不可缺失)/gu))b.add(c[1]);return/项目基本信息表/u.test(a)&&b.add("项目基本信息表"),[...b]}(b)])],e=bR(b),f=bS(b),g=function(a){let b=[];for(let c of(/<OUTLINE>([\s\S]*?)<\/OUTLINE>/u.exec(a)?.[1]||"").split(/\r?\n/u)){let a=c.replace(/^\s*(?:\d+[.、.]|[-*])\s*/u,"").trim();a.length>=2&&a.length<=80&&!bN(a)&&b.push(a)}return[...new Set(b)]}(b),h=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"],i=["工程造价","报价","投标报价","报价明细","综合单价","单价","合价","金额","税率","增值税","利润","预留金","暂列金额","最高投标限价","招标控制价"],j=[...new Set([...(c.forbiddenTerms||[]).filter(a=>/施工方|投标人/u.test(a)),.../施工方|投标人/u.test(b)?["施工方","投标人"]:[]])],k=function(a){let b=/(?:不少于|至少|最低|必须生成不少于)\s*(\d+(?:\.\d+)?)\s*(万)?\s*字/u.exec(a);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return Math.floor(c*(b[2]?1e4:1))}(b),l=(a.template?.chapters||[]).map(a=>({chapterTitle:a.title,mustInclude:bT(b,RegExp(`${a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}|${a.title.slice(0,6).replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"u")).slice(0,8),mustNotInclude:bT(b,/禁止|不得|严禁|杜绝/u).filter(b=>b.includes(a.title)).slice(0,8)})).filter(a=>a.mustInclude.length>0||a.mustNotInclude.length>0),m=(a.rolePrompts||[]).map(a=>({roleId:a.roleId,focusAreas:bT(a.content,/重点|关注|围绕|响应|体系|措施|质量|安全|工期|资源/u).slice(0,8),mustDo:bT(a.content,/必须|应当|需要|确保|严格/u).slice(0,10),mustNotDo:bT(a.content,/禁止|不得|严禁|杜绝/u).slice(0,10)})).filter(a=>a.focusAreas.length>0||a.mustDo.length>0||a.mustNotDo.length>0),n=[c.coverPolicy&&"unspecified"!==c.coverPolicy?`已识别封面规则:${"required"===c.coverPolicy?"要求生成":"禁止生成"}`:"",c.tocPolicy&&"unspecified"!==c.tocPolicy?`已识别目录规则:${"required"===c.tocPolicy?"要求生成":"禁止生成"}`:"",g.length?`已识别一级章节固定规则 ${g.length} 条`:"",j.length?`已识别禁用主体表达:${j.join("、")}`:"",c.forbiddenTerms.length?`已识别禁用词 ${c.forbiddenTerms.length} 个`:"",d.length?`已识别必需表格:${d.join("、")}`:"",e.length?`已识别必含关键词:${e.join("、")}`:"",f.length?`已识别禁止出现内容:${f.join("、")}`:"",k?`已识别最低字数要求:${k} 字`:"",m.length?`已抽取角色执行规则 ${m.length} 组`:""].filter(Boolean);return{...c,requiredTables:d,requiredKeywords:e,forbiddenPatterns:f,sourceHash:function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c+=1)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(16)}(b),exactHeadings:g,forbidExtraHeadings:/不得合并|不得删除|不得改名|不得新增|严格按.*章节名称|一级章节.*不得/u.test(b)||g.length>0,requiredSubjects:/我公司/u.test(b)?["我公司","项目部"]:[],forbiddenSubjects:j,backendTerms:h,commercialTerms:i,forbiddenTerms:[...new Set([...c.forbiddenTerms,...h,...i,...j])],forbidFabrication:/不得编造|严禁编造|不得擅自|资料未明确|事实真实性/u.test(b),requireEvidenceForQuantities:/量化|参数|数值|工程实体参数|资料中明确/u.test(b),preferProjectFacts:/事实优先|项目事实|真实性高于/u.test(b),minWords:k,minChars:k,chapterRules:l,roleRules:m,executionSummary:n}}({promptTexts:[X,ab].filter(Boolean).join("\n\n"),requirement:a.requirement,template:q,rolePrompts:H.prompts}),ae=[function(a){let b=[`运行时规则版本:${a.sourceHash}`,"required"===a.coverPolicy?"用户要求输出封面时必须保留封面;未要求时不得由系统擅自决定。":"","required"===a.tocPolicy?"用户要求输出目录时必须保留目录,并确保目录只来自最终合法正文标题。":"",a.forbidCover?"用户明确禁止输出封面。":"",a.forbidToc?"用户明确禁止输出目录、目录说明或导航页。":"",a.exactHeadings.length?`一级章节必须严格使用:${a.exactHeadings.join(";")}`:"",a.forbidExtraHeadings?"不得新增、删除、合并或改名一级章节。":"",a.requiredSubjects.length?`正文主体优先使用:${a.requiredSubjects.join("、")}`:"",a.forbiddenSubjects.length?`禁止主体表达:${a.forbiddenSubjects.join("、")}`:"",a.forbidFabrication?"不得编造资料未明确的项目事实、工程实体参数、人名、联系方式或品牌。":"",a.requireEvidenceForQuantities?"涉及数量、工期、质量标准、规格型号等参数时必须以绑定资料中的明确事实为准。":"",a.commercialTerms.length?`禁止输出商务敏感内容:${a.commercialTerms.join("、")}`:"",a.backendTerms.length?`禁止输出系统内部话术:${a.backendTerms.join("、")}`:"",a.requiredTables.length?`必须输出以下正式 Markdown 表格:${a.requiredTables.join("、")}。表格必须包含表名、表头、分隔线和数据行。`:"",a.requiredKeywords?.length?`正文必须覆盖以下关键词或要点:${a.requiredKeywords.join("、")}。`:"",a.forbiddenPatterns?.length?`正文禁止出现以下内容:${a.forbiddenPatterns.join("、")}。`:"",a.minWords?`全文不少于 ${a.minWords} 字。`:""].filter(Boolean);return`以下规则由系统运行时从用户绑定指令中自动抽取,不作为用户可编辑内容。生成、检查和修复必须共同遵守:
163
- ${b.map((a,b)=>`${b+1}. ${a}`).join("\n")}`}(ad),!ac.enabled?"":"公开资料补充使用规则:\n1. 公开资料只可用于补充通用规范、政策、工艺和措施。\n2. 不得使用公开资料新增或修改项目名称、建设地点、建设规模、工期、质量标准、工程量、材料规格、图纸参数、商务数据。\n3. 本地项目资料与公开资料冲突时,必须以本地项目资料为准。\n4. 不得在正文中出现任何检索过程、外部页面、工具调用或系统内部过程性表述。\n5. 不得把公开资料中的其他项目案例参数写入本项目正文。"].filter(Boolean).join("\n\n"),af=[X,ae,`生成前规划章节结构:
164
- ${q.chapters.map(a=>[`- ${a.title}`,a.sections?.length?` 规划小节:${a.sections.join("、")}`:"",a.tableSections?.length?` 表格小节:${a.tableSections.join("、")}`:"",a.tableRequirements?.length?` 表格内容要求:${a.tableRequirements.join(";")}`:""].filter(Boolean).join("\n")).join("\n")}`,Z||_].filter(Boolean).join("\n\n"),ag=[Y,ae,bz([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),ah=[X,ae,bz([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");be(G,bd({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${Q.length} 条文件角色绑定`,details:[`提示词角色:${J.length} 个`,`文件角色:${Q.length} 个`,O?`识别 OUTLINE 章节:${N.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:G.length})),y();let ai=bx(o,Q),aj=(0,i.XB)("file"),ak=new Map(Q.flatMap(a=>bv(o,a.filePath).map(b=>[b,a.roleId]))),an=new Map(Q.flatMap(a=>bv(o,a.filePath).map(b=>[b,aj.find(b=>b.id===a.roleId)?.processingType||"reference"])));be(G,bd({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:G.length})),y();let as=await B(()=>t.getProject(o)),at=function(a,b){let c=new Set(b.filter(Boolean)),d=(a.listFiles?.()||[]).filter(a=>0===c.size||c.has(a.relativePath)),e=new Set(d.map(a=>a.relativePath)),f=[...c].filter(a=>!e.has(a)),g=d.filter(a=>0===Math.max(0,Math.ceil(Number(a.chunkCount)||0))).map(a=>a.relativePath),h=d.filter(a=>"error"===a.status).map(a=>a.relativePath),i="function"==typeof a.countPendingIndexJobs?a.countPendingIndexJobs():0,j="function"==typeof a.getVectorStatus?a.getVectorStatus():void 0,k=d.filter(a=>"error"!==a.status&&Math.max(0,Math.ceil(Number(a.chunkCount)||0))>0),l=k.map(a=>a.relativePath),m=k.reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0),n=[...cV("部分绑定文件未完成索引,已自动跳过",f),...cV("部分绑定文件没有可用切片,已自动跳过",g),...cV("部分绑定文件索引失败,已自动跳过",h)],o=c.size>0&&0===m?["所有绑定文件均无可用切片"]:[],p=[...n,...i>0?[`仍有 ${i} 个待索引任务,建议等待索引完成后生成`]:[],...j&&"ready"!==j.status?[`向量索引状态为 ${j.status},当前召回质量可能下降`]:[]];return{scopedRecords:d,usablePaths:l,missingFiles:f,emptyFiles:g,errorFiles:h,pendingJobs:i,vectorStatus:j,usableChunkCount:m,blockingIssues:o,warnings:p}}(as,[...ai]);if(at.blockingIssues.length>0)throw Error(`生成前知识索引不可用:${at.blockingIssues.join(";")}`);let au=new Set(at.usablePaths.flatMap(a=>bv(o,a))),av=cW(as,[...au],a.maxEvidencePerChapter);be(G,bd({type:"knowledge_retrieval",roleId:"knowledge-index",status:at.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${at.scopedRecords.length} 份,可用切片 ${at.usableChunkCount} 条,开始构建角色资料证据池`,details:[`绑定文件:${ai.size} 份`,`可用证据文件:${au.size} 份`,`向量状态:${at.vectorStatus?.status||"unknown"}`,...at.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),aB(a.signal);let ax=[],ay={enabled:ac.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},az=[],aC=[],aD=[],aE=-1,aG=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(by(c.content)),b.set(c.roleId,a)}return b}(b),j=function(a,b){let c=[];for(let d of a){if(!b.has(d.id))continue;let a=d.executionType||"reference",e=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${d.id} ${d.name} ${d.description||""}`);("fact_extraction"===a||"reference"===a||e)&&c.push(d)}return c}(f,new Set(h.keys())),k=[];for(let a of e){if(!g.has(a.id))continue;let b=function(a){let b=[],c=[],d=[];for(let e of a)for(let a of(b.push(e.promptRole.id),c.push(e.promptRole.name),e.texts))d.push(a);return{promptRoleIds:b,promptRoleNames:c,promptTexts:d}}(function(a,b,c){let d=[];for(let e of b){let b=c.get(e.id)||[];d.push({promptRole:e,texts:b,score:function(a,b,c){let d=bi(`${a} ${c.join(" ")}`),e=bi(`${b.id} ${b.name} ${b.processingType||""}`),f=function(a,b){let c=0;for(let d of[b.id,b.name,b.processingType||""])d&&a.includes(bi(d))&&(c+=4);return c}(d,b);for(let a of bg.Nx)a.promptPattern.lastIndex=0,a.filePattern&&(a.filePattern.lastIndex=0),(!a.filePattern||a.filePattern.test(e))&&a.promptPattern.test(d)&&(f+=a.points);return f}(e.id,a,b)})}d.sort((a,b)=>b.score-a.score);let e=d.filter(a=>a.score>5);if(e.length>0)return e;let f=d.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b});return f?[f]:[]}(a,j,h));k.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=bi(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bg.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,J,Q),aH=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=bj(c,b),j=a.getFileDetail(b,Number.isFinite(d)&&d>0?{maxChunkContentChars:d}:void 0);if(j&&j.chunks.length>0){let a=function(a,b){let c=[],d=0,e=a.chunks||[],f=Number.isFinite(a.totalChunkCount)?Number(a.totalChunkCount):e.length;for(let f of e){let e=F(f.content);if(e){if(Number.isFinite(b)&&b>0&&d+e.length>b&&c.length>0)break;c.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:e,sectionTitle:f.sectionTitle,source:"role-node"}),d+=e.length}}return{evidence:c,totalChunks:f,omittedChunks:Math.max(0,f-e.length)}}(j,d);e.set(f,a.evidence),g+=a.totalChunks,h+=a.evidence.length,i+=a.omittedChunks;continue}e.set(f,[])}return{files:e,uniqueFileCount:e.size,bindingCount:f.bindingCount,totalChunkCount:g,loadedChunkCount:h,omittedChunkCount:i}}(as,aG,o,L(Math.max(1200,900*K.length),12e3,aI())),aJ=bd({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aH.uniqueFileCount} 份,角色绑定 ${aH.bindingCount} 条,加载片段 ${aH.loadedChunkCount}/${aH.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aH.bindingCount-aH.uniqueFileCount)} 条`,`待执行资料理解节点:${aG.length} 个`,aH.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aH.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aH.uniqueFileCount,total:Math.max(1,aH.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});be(G,aJ),y();let aL=await co({manager:t,project:as,projectRoot:o,scopedFilePaths:[...ai].filter(Boolean).sort(),fileRoleByPath:ak,fileProcessingByPath:an,signal:a.signal});aL.length>0&&(ax.push(...aL),be(G,bd({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aL.length} 条`,details:aL.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aM=[],aN=function(a,b,c){let d=new Map(("function"==typeof a.listFiles?a.listFiles():[]).map(a=>[String(a.relativePath||""),a])),e=[];for(let a of[...c].sort()){let c=bj(b,a),f=d.get(a)||d.get(c);if(!f){e.push({filePath:c,missing:!0});continue}e.push({filePath:f.relativePath||c,contentHash:f.contentHash,fileSize:f.fileSize,mtime:f.mtime,chunkCount:f.chunkCount,indexedAt:f.indexedAt})}return aw({type:"project-evidence-version-v2",entries:e})}(as,o,ai),aP=aK()?.model.name,aT=bz([...H.extractionPrompts,...H.referencePrompts]),aU=aw({fileBindings:Q,evidenceScopePaths:[...ai].sort(),activeModelName:aP,projectEvidenceVersion:aN,promptTexts:aT,materialFingerprint:R.fingerprint,materialInventory:Object.fromEntries(Object.entries(R.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),aV=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aG.length>12?1:2)),aW=Math.max(1,Math.min(aG.length||1,3,Number.isFinite(aV)?Math.floor(aV):1));for(let b=0;b<aG.length;b+=aW){aB(a.signal);let c=aG.slice(b,b+aW).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(bj(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return I(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aH,c,o).filter(a=>bw(o,a.filePath,ai)),g=G.length,h=bd({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aG.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bm(q,c,f,a.signal)),j=bd({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bf(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aG.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return G[g]=j,y(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))ax.push(...a.evidence),aM.push(a.artifact);let d=I(ax,{maxItems:Math.max(40,8*aG.length),maxChars:Math.max(45e3,5e3*aG.length),preservePinned:!0});ax.splice(0,ax.length,...d)}let aZ=aR(ax,q,T),a$=aX(ax),a_=aY(ax,U),a8=a7([...aM.flatMap(a=>a.facts.map(a=>({key:a.key,value:aA(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...aZ,...a$,...a_],aQ(ax),az,T,U),a9=function(a,b){let c=[];for(let a of b)if("template_requirements"===a.node.outputType)for(let b of a.chapters)c.push(b);c.sort((a,b)=>a.order-b.order);let e=new Map;for(let b of c){let c=(0,P.YZ)(b.title);!(!(0,P.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(q,aM),ba=(0,P._9)(q,T,{preserveExplicitOutline:O}),bc=function(a){let b=Math.max(4,Math.min(12,Number(process.env.DOCUMENT_ROLE_DIGEST_ARTIFACT_LIMIT??8)));return a.slice(0,b).map(a=>(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_DIGEST_CHAPTER_LIMIT??18))),d=Math.max(16,Math.min(60,Number(process.env.DOCUMENT_ROLE_DIGEST_FACT_LIMIT??30))),e=[];for(let b of a.chapters.slice(0,c))e.push(`- ${b.title}:${(b.requiredContents.join("、")||b.sourceRequirement).slice(0,180)}`);e.length>0&&b.push(`章节/要求:
165
- ${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aA(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
166
- ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aM),bl={...q,chapters:ba},br=function(a,b){let c=a.replace(/\\n/gu,"\n"),d=new Map,e=[...c.matchAll(/第([一二两三四五六七八九十\d]+)章[^\n。;;]{0,80}(?:强制|必须|挂靠|小节|排序|最先|之后|之前)/gu)];for(let a of e){let b=function(a){let b={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if(/^\d+$/u.test(a))return Number(a);if(void 0!==b[a])return b[a];if("十"===a)return 10;let c=/^(?:(一|二|两|三|四|五|六|七|八|九)?)十(?:(一|二|两|三|四|五|六|七|八|九))?$/u.exec(a);if(c)return 10*(c[1]?b[c[1]]:1)+(c[2]?b[c[2]]:0)}(a[1]);if(!b)continue;let f=Math.max(0,a.index||0),g=e.find(a=>(a.index||0)>f)?.index,h=c.slice(f,Math.min(c.length,g??f+1400)),i=function(a){let b=/(?:以下小节设置和排序|强制小节|必须小节)[::]\s*([\s\S]*?)(?:\n\s*#{2,6}\s|\n\s*第[一二两三四五六七八九十\d]+章|$)/u.exec(a)?.[1];if(b){let a=bQ([...b.matchAll(/(?:^|\n)\s*\d+[..、]\s*([^——\-—::。;;\n]{2,30})(?:[——\-—::]|,|,|。|;|;|\n|$)/gu)].map(a=>a[1]));if(a.length>0)return a}let c=[];for(let b of a.matchAll(/第[一二两三四五六七八九十\d]+章[^。;;\n]{0,50}(?:强制)?(?:包含|设置|输出|排序|挂靠)[^::。;;\n]{0,20}[::]\s*([^。;;\n]{2,120})/gu))for(let a of b[1].split(/[、,,//及和与]/u))c.push(a);for(let b of a.matchAll(/[“"]([^”"]{2,30})[”"]\s*(?:二级)?小节/gu))c.push(b[1]);for(let b of a.matchAll(/([\p{Script=Han}A-Za-z0-9()()]{2,30})(?:——|—|-|:|:)\s*(?:独立的)?(?:二级)?小节/gu))c.push(b[1]);for(let b of a.matchAll(/(?:必须|应当|需|需要|包含|设置|输出)[^。;;\n]{0,30}(?:独立的)?(?:二级)?小节[::]\s*([^。;;\n]{2,80})/gu))for(let a of b[1].split(/[、,,//及和与]/u))c.push(a);return bQ(c)}(h);if(0===i.length)continue;let j=d.get(b)||{blocks:[],titles:[]};for(let a of(j.blocks.push(h),i))j.titles.some(b=>bP(b,a))||j.titles.push(a);d.set(b,j)}return[...d.entries()].map(([a,c])=>{let d=b?.[a-1];return{chapterIndex:a-1,chapterTitle:d?.title,source:c.blocks[0]?.split("\n").find(a=>a.trim())?.trim().slice(0,120),requiredSections:c.titles.map((a,b)=>({title:a,order:b+1,required:!0,source:c.blocks[0]?.slice(0,240)}))}})}([af,a.requirement||""].filter(Boolean).join("\n\n"),ba),bA=(0,aq.tF)({requirement:a.requirement,promptTexts:af,template:bl,chapters:ba,spec:T}),bB=0,bC=0;ba=await Promise.all(ba.map(async(b,c)=>{if(b.sections?.length){bB+=1;let a=br.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title));if(0===a.length)return b;let d=[...a];for(let a of b.sections)d.some(b=>(0,P.GQ)(b).replace(/[\s()()::.。;;,,、-]/gu,"")===(0,P.GQ)(a).replace(/[\s()()::.。;;,,、-]/gu,""))||d.push(a);return{...b,sections:d}}bC+=1;let d=I(ax.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(bA.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bp(aM,b,bn(b,a9)),f=cI(H,b),g=await bV({template:bl,chapter:b,chapterIndex:c,evidence:d,promptTexts:f.promptTexts,projectContext:bc,requirement:a.requirement,roleContext:e,targetWords:bA.chapterTargets.get(b.id)||1200,structuralRules:br,signal:a.signal}),h=br.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.map(a=>`强制小节:${a.title}`));return be(G,bd({type:"validation",roleId:"section-planning",promptId:f.primaryPromptId,status:g.length?"success":"fallback",message:`${(0,P.GQ)(b.title)} 小节规划${g.length?`生成 ${g.length} 个小节`:"未生成可用小节"}`,details:[...f.promptDetails,...h,...g.length?g.map(a=>`规划小节:${a}`):["规划结果为空或被污染过滤"]]},{subtitle:"小节规划"})),g.length?{...b,sections:g}:b})),q={...q,chapters:ba};let bD=(0,aq.tF)({requirement:a.requirement,promptTexts:af,template:q,chapters:ba,spec:T});v=ba.map(a=>a.id);let bE=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
161
+ ${b.content}`;return Math.min(1.8,.16*[...new Set([a.title,...a.sections||[],...a.requiredFacts].flatMap(a=>a.split(/[\s、,,。;;::()()《》【】\-/]+/u)).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,36))].filter(a=>c.includes(a)).length)}(a,b)})),c,d)}function cT(a,b,c){let d=(a.sections||[]).slice(0,10).join(" "),e=a.requiredFacts.slice(0,10).join(" ");return[...new Set([`${a.title} ${d} ${e}`.trim(),...b,...c].filter(Boolean))]}function cU(a,b){let c=Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER);return Math.max(2,Math.min(9,Math.floor(Number.isFinite(c)&&c>0?c:4)+ +((a.sections||[]).length>=6||a.requiredFacts.length>=8)+Math.min(2,b.length)))}function cV(a,b){return Math.max(12,Math.min(26,a+10+4*((b.sections||[]).length>=6||b.requiredFacts.length>=8)))}async function cW(a){if(aE(a.signal),0===a.scopedFilePaths.length)return[];let b=`${a.chapter.title} ${a.sectionTitle}`.trim();return I((await a.manager.search(a.projectRoot,b,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:5,weights:cR(b),generationMode:!1})).results.filter(b=>a.scopedFilePaths.includes(b.filePath)).map(b=>({chapterId:a.chapter.id,filePath:b.filePath,score:b.score+1.2,content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"section-evidence"})),{maxItems:5,maxChars:9e3,preservePinned:!0})}async function cX(a){let b=[];for(let c of a.needs.slice(0,8)){aE(a.signal);let d=`${a.chapter.title} ${c} ${(a.chapter.sections||[]).join(" ")}`.trim(),e=await a.manager.search(a.projectRoot,d,{scope:"project",filters:{filePaths:a.scopedFilePaths},limit:6,weights:cR(`${a.chapter.title} ${c}`),generationMode:!1});b.push(...e.results.filter(b=>a.scopedFilePaths.includes(b.filePath)).map(b=>({chapterId:a.chapter.id,filePath:b.filePath,score:b.score+2,content:b.content,roleId:a.fileRoleByPath.get(b.filePath),processingType:a.fileProcessingByPath.get(b.filePath),sectionTitle:b.sectionTitle,source:"required-fact-evidence"})))}return I(b,{maxItems:Math.max(6,3*a.needs.length),maxChars:18e3,preservePinned:!0})}function cY(a,b,c=12){if(0===b.length)return[];let d=b.slice(0,c).map(a=>e.basename(a)),f=b.length>c?` 等 ${b.length} 个文件`:"";return[`${a}:${d.join("、")}${f}`]}function cZ(a,b,c){if(Number.isFinite(c)&&c>0)return Math.ceil(c);let d=new Set(b.filter(Boolean)),e=a.listFiles?.().filter(a=>0===d.size||d.has(a.relativePath)).reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0)??0;return e>0?e:Math.max(1,d.size)}async function c$(a){var b;aE(a.signal);let c=(0,d.QJ)(a.templateId);if(!c)throw Error("Document template not found");let o=e.resolve(a.projectRoot||(0,g.aY)());if(!o)throw Error("No knowledge base project found");let p=(0,f.computeProjectId)(o),q=c,t=(0,g.Qh)(),u=[],v=[],y=(b,c=G)=>{let d=b?[...b].sort((a,b)=>{let c=v.indexOf(a.id),d=v.indexOf(b.id);return(c<0?Number.MAX_SAFE_INTEGER:c)-(d<0?Number.MAX_SAFE_INTEGER:d)}):void 0;a.onProgress?.([...c],d?{chapters:d}:void 0)},z=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),B=async(b,c=G)=>{let d=setInterval(()=>{a.signal?.aborted||y(u,c)},z);try{return await b()}finally{clearInterval(d)}},C=(0,d.N6)(q)||"none",E=(0,i.Mu)(C)?.name||C,G=[bg({type:"role_binding",roleId:C,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${q.name}`,details:[`当前项目:${p}`,`资料目录:${e.join(o,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:E,roleName:E,order:0})];y();let H=(0,d.bj)(q),J=H.bindings,K=(0,d.Vh)(q);if(bh(G,bg({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:G.length})),y(),0===K.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let M=bC([...H.writerPrompts,...H.chapterPrompts]),N=(0,P.cs)([{text:a.requirement,source:"用户需求",strict:!0},{text:M,source:"提示词角色",strict:!0}]),O=N.length>=2;O&&(q={...c,chapters:N}),bh(G,bg({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${K.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:G.length})),y();let Q=function(a,b){if(0===b.length)return b;let c=(0,g.Yy)(a),d=new Set(c.map(a=>a.relativePath)),e=c.filter(a=>"disk"!==a.status&&"error"!==a.status&&Number(a.indexedAt||0)>0&&Number(a.chunkCount||0)>0),f=[],h=new Set;for(let a of b){let b=a.filePath.replace(/^\/+|\/+$/gu,"");for(let c of d.has(b)?[b]:e.filter(a=>a.relativePath.startsWith(`${b}/`)).map(a=>a.relativePath)){let b=`${a.roleId}
162
+ ${c}`;h.has(b)||(h.add(b),f.push({...a,filePath:c}))}}return f}(o,K);if(0===Q.length)throw Error("模板绑定的知识库文件或文件夹不存在,请重新选择项目文件绑定。");let R=await B(()=>Promise.resolve((0,k.P)(o,{requirement:a.requirement,boundFilePaths:Q.map(a=>a.filePath),boundFileRoles:(0,d.wR)(Q)})));bh(G,bg({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(R.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:G.length})),y();let S=await B(()=>Promise.resolve((0,j.x)(q,a.requirement||""))),T=S.spec,U=function(a,b=""){let c=`${a?.id||""} ${a?.name||""} ${a?.category||""} ${a?.description||""} ${a?.outputTitle||""} ${b}`;return/施工组织设计|施工方案|危大工程|人、材、机|安全文明施工/u.test(c)?m:l}(q,a.requirement||""),V=(0,r.h)(q,R),W=(0,s.$)({template:q,spec:T,summary:R,resolvedRoles:V});if(!W.ready)throw Error(`生成准备度不足:${W.blockingIssues.join(";")}`);let X=[(0,k.F)(R,{publicSafe:!0}),(0,j.N)(T,S.sourceHash,{publicSafe:!0}),(0,s.R)(W,{publicSafe:!0})].filter(Boolean).join("\n\n"),Y=[(0,k.F)(R),(0,j.N)(T,S.sourceHash),(0,s.R)(W)].filter(Boolean).join("\n\n"),Z=bC([...H.writerPrompts,...H.formattingPrompts]),$=bC([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts]),_=bC(H.prompts),ab=(0,h.I)().load().webAccess||{enabled:!1,allowProjectFacts:!1,maxQueriesPerChapter:2,maxResultsPerQuery:3,trustedDomains:[]},ad=function(a){let b=[a.promptTexts,a.requirement||""].filter(Boolean).join("\n\n").replace(/\\n/gu,"\n"),c=function(a){let b=a.replace(/\\n/gu,"\n"),c=new Set;for(let a of(/全文必须输出[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||/必须输出(?:的)?表格[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||"").split(/[、,,]/u)){let b=/([\p{Script=Han}A-Za-z0-9()()]{2,30}表)$/u.exec(a.trim())?.[1];b&&b.length>=4&&b.length<=30&&c.add(b)}/项目基本信息表/u.test(b)&&c.add("项目基本信息表");let d=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"];/杜绝|禁止|不得|严禁/u.test(b)&&d.push("施工方","投标人","高度重视","重中之重"),/商务|报价|单价|税率|利润|造价/u.test(b)&&d.push("综合单价","报价明细","单价","税率","增值税","利润","预留金","报价明细表");let e=bX(b,"封面"),f=bX(b,"目录");return{coverPolicy:e,tocPolicy:f,forbidCover:"forbidden"===e,forbidToc:"forbidden"===f,forbiddenTerms:[...new Set(d)],preferredTerms:[{from:"施工方",to:"我公司"},{from:"投标人",to:"我公司"},{from:"高度重视",to:"严格落实"},{from:"重中之重",to:"关键控制事项"}],requiredTables:[...c],requiredKeywords:bU(b),forbiddenPatterns:bV(b)}}(b),d=[...new Set([...c.requiredTables,...function(a){let b=new Set;for(let c of[/(?:必须|应当|需要|全文必须|至少)输出(?:的)?表格[::]\s*([^。;;\n]+)/gu,/(?:必须|应当|需要|全文必须|至少)包含(?:的)?表格[::]\s*([^。;;\n]+)/gu,/(?:表格清单|表格要求)[::]\s*([^。;;\n]+)/gu])for(let d of a.matchAll(c))for(let a of(d[1]||"").split(/[、,,//及和与]/u)){let c=/([\p{Script=Han}A-Za-z0-9()()《》<>]{2,40}表)/u.exec(a.trim())?.[1];c&&b.add(c.replace(/[<>《》]/gu,""))}for(let c of a.matchAll(/([\p{Script=Han}A-Za-z0-9()()]{2,40}表)(?:必须|应当|需要|不得缺失|不可缺失)/gu))b.add(c[1]);return/项目基本信息表/u.test(a)&&b.add("项目基本信息表"),[...b]}(b)])],e=bU(b),f=bV(b),g=function(a){let b=[];for(let c of(/<OUTLINE>([\s\S]*?)<\/OUTLINE>/u.exec(a)?.[1]||"").split(/\r?\n/u)){let a=c.replace(/^\s*(?:\d+[.、.]|[-*])\s*/u,"").trim();a.length>=2&&a.length<=80&&!bQ(a)&&b.push(a)}return[...new Set(b)]}(b),h=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"],i=["工程造价","报价","投标报价","报价明细","综合单价","单价","合价","金额","税率","增值税","利润","预留金","暂列金额","最高投标限价","招标控制价"],j=[...new Set([...(c.forbiddenTerms||[]).filter(a=>/施工方|投标人/u.test(a)),.../施工方|投标人/u.test(b)?["施工方","投标人"]:[]])],k=function(a){let b=/(?:不少于|至少|最低|必须生成不少于)\s*(\d+(?:\.\d+)?)\s*(万)?\s*字/u.exec(a);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return Math.floor(c*(b[2]?1e4:1))}(b),l=(a.template?.chapters||[]).map(a=>({chapterTitle:a.title,mustInclude:bW(b,RegExp(`${a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}|${a.title.slice(0,6).replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"u")).slice(0,8),mustNotInclude:bW(b,/禁止|不得|严禁|杜绝/u).filter(b=>b.includes(a.title)).slice(0,8)})).filter(a=>a.mustInclude.length>0||a.mustNotInclude.length>0),m=(a.rolePrompts||[]).map(a=>({roleId:a.roleId,focusAreas:bW(a.content,/重点|关注|围绕|响应|体系|措施|质量|安全|工期|资源/u).slice(0,8),mustDo:bW(a.content,/必须|应当|需要|确保|严格/u).slice(0,10),mustNotDo:bW(a.content,/禁止|不得|严禁|杜绝/u).slice(0,10)})).filter(a=>a.focusAreas.length>0||a.mustDo.length>0||a.mustNotDo.length>0),n=[c.coverPolicy&&"unspecified"!==c.coverPolicy?`已识别封面规则:${"required"===c.coverPolicy?"要求生成":"禁止生成"}`:"",c.tocPolicy&&"unspecified"!==c.tocPolicy?`已识别目录规则:${"required"===c.tocPolicy?"要求生成":"禁止生成"}`:"",g.length?`已识别一级章节固定规则 ${g.length} 条`:"",j.length?`已识别禁用主体表达:${j.join("、")}`:"",c.forbiddenTerms.length?`已识别禁用词 ${c.forbiddenTerms.length} 个`:"",d.length?`已识别必需表格:${d.join("、")}`:"",e.length?`已识别必含关键词:${e.join("、")}`:"",f.length?`已识别禁止出现内容:${f.join("、")}`:"",k?`已识别最低字数要求:${k} 字`:"",m.length?`已抽取角色执行规则 ${m.length} 组`:""].filter(Boolean);return{...c,requiredTables:d,requiredKeywords:e,forbiddenPatterns:f,sourceHash:function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c+=1)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(16)}(b),exactHeadings:g,forbidExtraHeadings:/不得合并|不得删除|不得改名|不得新增|严格按.*章节名称|一级章节.*不得/u.test(b)||g.length>0,requiredSubjects:/我公司/u.test(b)?["我公司","项目部"]:[],forbiddenSubjects:j,backendTerms:h,commercialTerms:i,forbiddenTerms:[...new Set([...c.forbiddenTerms,...h,...i,...j])],forbidFabrication:/不得编造|严禁编造|不得擅自|资料未明确|事实真实性/u.test(b),requireEvidenceForQuantities:/量化|参数|数值|工程实体参数|资料中明确/u.test(b),preferProjectFacts:/事实优先|项目事实|真实性高于/u.test(b),minWords:k,minChars:k,chapterRules:l,roleRules:m,executionSummary:n}}({promptTexts:[X,_].filter(Boolean).join("\n\n"),requirement:a.requirement,template:q,rolePrompts:H.prompts}),ae=[function(a){let b=[`运行时规则版本:${a.sourceHash}`,"required"===a.coverPolicy?"用户要求输出封面时必须保留封面;未要求时不得由系统擅自决定。":"","required"===a.tocPolicy?"用户要求输出目录时必须保留目录,并确保目录只来自最终合法正文标题。":"",a.forbidCover?"用户明确禁止输出封面。":"",a.forbidToc?"用户明确禁止输出目录、目录说明或导航页。":"",a.exactHeadings.length?`一级章节必须严格使用:${a.exactHeadings.join(";")}`:"",a.forbidExtraHeadings?"不得新增、删除、合并或改名一级章节。":"",a.requiredSubjects.length?`正文主体优先使用:${a.requiredSubjects.join("、")}`:"",a.forbiddenSubjects.length?`禁止主体表达:${a.forbiddenSubjects.join("、")}`:"",a.forbidFabrication?"不得编造资料未明确的项目事实、工程实体参数、人名、联系方式或品牌。":"",a.requireEvidenceForQuantities?"涉及数量、工期、质量标准、规格型号等参数时必须以绑定资料中的明确事实为准。":"",a.commercialTerms.length?`禁止输出商务敏感内容:${a.commercialTerms.join("、")}`:"",a.backendTerms.length?`禁止输出系统内部话术:${a.backendTerms.join("、")}`:"",a.requiredTables.length?`必须输出以下正式 Markdown 表格:${a.requiredTables.join("、")}。表格必须包含表名、表头、分隔线和数据行。`:"",a.requiredKeywords?.length?`正文必须覆盖以下关键词或要点:${a.requiredKeywords.join("、")}。`:"",a.forbiddenPatterns?.length?`正文禁止出现以下内容:${a.forbiddenPatterns.join("、")}。`:"",a.minWords?`全文不少于 ${a.minWords} 字。`:""].filter(Boolean);return`以下规则由系统运行时从用户绑定指令中自动抽取,不作为用户可编辑内容。生成、检查和修复必须共同遵守:
163
+ ${b.map((a,b)=>`${b+1}. ${a}`).join("\n")}`}(ad),!ab.enabled?"":"公开资料补充使用规则:\n1. 公开资料只可用于补充通用规范、政策、工艺和措施。\n2. 不得使用公开资料新增或修改项目名称、建设地点、建设规模、工期、质量标准、工程量、材料规格、图纸参数、商务数据。\n3. 本地项目资料与公开资料冲突时,必须以本地项目资料为准。\n4. 不得在正文中出现任何检索过程、外部页面、工具调用或系统内部过程性表述。\n5. 不得把公开资料中的其他项目案例参数写入本项目正文。"].filter(Boolean).join("\n\n"),af=[X,ae,`生成前规划章节结构:
164
+ ${q.chapters.map(a=>[`- ${a.title}`,a.sections?.length?` 规划小节:${a.sections.join("、")}`:"",a.tableSections?.length?` 表格小节:${a.tableSections.join("、")}`:"",a.tableRequirements?.length?` 表格内容要求:${a.tableRequirements.join(";")}`:""].filter(Boolean).join("\n")).join("\n")}`,Z||$].filter(Boolean).join("\n\n"),ag=[Y,ae,bC([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),ah=[X,ae,bC([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");bh(G,bg({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${Q.length} 条文件角色绑定`,details:[`提示词角色:${J.length} 个`,`文件角色:${Q.length} 个`,O?`识别 OUTLINE 章节:${N.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:G.length})),y();let ai=bA(o,Q),aj=(0,i.XB)("file"),ak=new Map(Q.flatMap(a=>by(o,a.filePath).map(b=>[b,a.roleId]))),al=new Map(Q.flatMap(a=>by(o,a.filePath).map(b=>[b,aj.find(b=>b.id===a.roleId)?.processingType||"reference"])));bh(G,bg({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:G.length})),y();let am=await B(()=>t.getProject(o)),an=function(a,b){let c=new Set(b.filter(Boolean)),d=(a.listFiles?.()||[]).filter(a=>0===c.size||c.has(a.relativePath)),e=new Set(d.map(a=>a.relativePath)),f=[...c].filter(a=>!e.has(a)),g=d.filter(a=>0===Math.max(0,Math.ceil(Number(a.chunkCount)||0))).map(a=>a.relativePath),h=d.filter(a=>"error"===a.status).map(a=>a.relativePath),i="function"==typeof a.countPendingIndexJobs?a.countPendingIndexJobs():0,j="function"==typeof a.getVectorStatus?a.getVectorStatus():void 0,k=d.filter(a=>"error"!==a.status&&Math.max(0,Math.ceil(Number(a.chunkCount)||0))>0),l=k.map(a=>a.relativePath),m=k.reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0),n=[...cY("部分绑定文件未完成索引,已自动跳过",f),...cY("部分绑定文件没有可用切片,已自动跳过",g),...cY("部分绑定文件索引失败,已自动跳过",h)],o=c.size>0&&0===m?["所有绑定文件均无可用切片"]:[],p=[...n,...i>0?[`仍有 ${i} 个待索引任务,建议等待索引完成后生成`]:[],...j&&"ready"!==j.status?[`向量索引状态为 ${j.status},当前召回质量可能下降`]:[]];return{scopedRecords:d,usablePaths:l,missingFiles:f,emptyFiles:g,errorFiles:h,pendingJobs:i,vectorStatus:j,usableChunkCount:m,blockingIssues:o,warnings:p}}(am,[...ai]);if(an.blockingIssues.length>0)throw Error(`生成前知识索引不可用:${an.blockingIssues.join(";")}`);let aq=new Set(an.usablePaths.flatMap(a=>by(o,a))),av=cZ(am,[...aq],a.maxEvidencePerChapter);bh(G,bg({type:"knowledge_retrieval",roleId:"knowledge-index",status:an.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${an.scopedRecords.length} 份,可用切片 ${an.usableChunkCount} 条,开始构建角色资料证据池`,details:[`绑定文件:${ai.size} 份`,`可用证据文件:${aq.size} 份`,`向量状态:${an.vectorStatus?.status||"unknown"}`,...an.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),aE(a.signal);let aw=[],ax={enabled:ab.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},ay=[],aA=[],aB=[],aC=-1,aF=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(bB(c.content)),b.set(c.roleId,a)}return b}(b),j=function(a,b){let c=[];for(let d of a){if(!b.has(d.id))continue;let a=d.executionType||"reference",e=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${d.id} ${d.name} ${d.description||""}`);("fact_extraction"===a||"reference"===a||e)&&c.push(d)}return c}(f,new Set(h.keys())),k=[];for(let a of e){if(!g.has(a.id))continue;let b=function(a){let b=[],c=[],d=[];for(let e of a)for(let a of(b.push(e.promptRole.id),c.push(e.promptRole.name),e.texts))d.push(a);return{promptRoleIds:b,promptRoleNames:c,promptTexts:d}}(function(a,b,c){let d=[];for(let e of b){let b=c.get(e.id)||[];d.push({promptRole:e,texts:b,score:function(a,b,c){let d=bl(`${a} ${c.join(" ")}`),e=bl(`${b.id} ${b.name} ${b.processingType||""}`),f=function(a,b){let c=0;for(let d of[b.id,b.name,b.processingType||""])d&&a.includes(bl(d))&&(c+=4);return c}(d,b);for(let a of bj.Nx)a.promptPattern.lastIndex=0,a.filePattern&&(a.filePattern.lastIndex=0),(!a.filePattern||a.filePattern.test(e))&&a.promptPattern.test(d)&&(f+=a.points);return f}(e.id,a,b)})}d.sort((a,b)=>b.score-a.score);let e=d.filter(a=>a.score>5);if(e.length>0)return e;let f=d.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b});return f?[f]:[]}(a,j,h));k.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=bl(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bj.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,J,Q),aG=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=bm(c,b),j=a.getFileDetail(b,Number.isFinite(d)&&d>0?{maxChunkContentChars:d}:void 0);if(j&&j.chunks.length>0){let a=function(a,b){let c=[],d=0,e=a.chunks||[],f=Number.isFinite(a.totalChunkCount)?Number(a.totalChunkCount):e.length;for(let f of e){let e=F(f.content);if(e){if(Number.isFinite(b)&&b>0&&d+e.length>b&&c.length>0)break;c.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:e,sectionTitle:f.sectionTitle,source:"role-node"}),d+=e.length}}return{evidence:c,totalChunks:f,omittedChunks:Math.max(0,f-e.length)}}(j,d);e.set(f,a.evidence),g+=a.totalChunks,h+=a.evidence.length,i+=a.omittedChunks;continue}e.set(f,[])}return{files:e,uniqueFileCount:e.size,bindingCount:f.bindingCount,totalChunkCount:g,loadedChunkCount:h,omittedChunkCount:i}}(am,aF,o,L(Math.max(1200,900*K.length),12e3,aL())),aH=bg({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aG.uniqueFileCount} 份,角色绑定 ${aG.bindingCount} 条,加载片段 ${aG.loadedChunkCount}/${aG.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aG.bindingCount-aG.uniqueFileCount)} 条`,`待执行资料理解节点:${aF.length} 个`,aG.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aG.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aG.uniqueFileCount,total:Math.max(1,aG.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});bh(G,aH),y();let aJ=await cr({manager:t,project:am,projectRoot:o,scopedFilePaths:[...ai].filter(Boolean).sort(),fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});aJ.length>0&&(aw.push(...aJ),bh(G,bg({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aJ.length} 条`,details:aJ.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aK=[],aM=function(a,b,c){let d=new Map(("function"==typeof a.listFiles?a.listFiles():[]).map(a=>[String(a.relativePath||""),a])),e=[];for(let a of[...c].sort()){let c=bm(b,a),f=d.get(a)||d.get(c);if(!f){e.push({filePath:c,missing:!0});continue}e.push({filePath:f.relativePath||c,contentHash:f.contentHash,fileSize:f.fileSize,mtime:f.mtime,chunkCount:f.chunkCount,indexedAt:f.indexedAt})}return az({type:"project-evidence-version-v2",entries:e})}(am,o,ai),aO=aN()?.model.name,aP=bC([...H.extractionPrompts,...H.referencePrompts]),aQ=az({fileBindings:Q,evidenceScopePaths:[...ai].sort(),activeModelName:aO,projectEvidenceVersion:aM,promptTexts:aP,materialFingerprint:R.fingerprint,materialInventory:Object.fromEntries(Object.entries(R.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),aS=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aF.length>12?1:2)),aW=Math.max(1,Math.min(aF.length||1,3,Number.isFinite(aS)?Math.floor(aS):1));for(let b=0;b<aF.length;b+=aW){aE(a.signal);let c=aF.slice(b,b+aW).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(bm(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return I(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aG,c,o).filter(a=>bz(o,a.filePath,ai)),g=G.length,h=bg({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aF.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bp(q,c,f,a.signal)),j=bg({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bi(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aF.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return G[g]=j,y(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))aw.push(...a.evidence),aK.push(a.artifact);let d=I(aw,{maxItems:Math.max(40,8*aF.length),maxChars:Math.max(45e3,5e3*aF.length),preservePinned:!0});aw.splice(0,aw.length,...d)}let aX=aU(aw,q,T),aY=a$(aw),aZ=a_(aw,U),a0=ba([...aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aD(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...aX,...aY,...aZ],aT(aw),ay,T,U),a1=function(a,b){let c=[];for(let a of b)if("template_requirements"===a.node.outputType)for(let b of a.chapters)c.push(b);c.sort((a,b)=>a.order-b.order);let e=new Map;for(let b of c){let c=(0,P.YZ)(b.title);!(!(0,P.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(q,aK),a2=(0,P._9)(q,T,{preserveExplicitOutline:O}),bb=function(a){let b=Math.max(4,Math.min(12,Number(process.env.DOCUMENT_ROLE_DIGEST_ARTIFACT_LIMIT??8)));return a.slice(0,b).map(a=>(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_DIGEST_CHAPTER_LIMIT??18))),d=Math.max(16,Math.min(60,Number(process.env.DOCUMENT_ROLE_DIGEST_FACT_LIMIT??30))),e=[];for(let b of a.chapters.slice(0,c))e.push(`- ${b.title}:${(b.requiredContents.join("、")||b.sourceRequirement).slice(0,180)}`);e.length>0&&b.push(`章节/要求:
165
+ ${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aD(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
166
+ ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aK),bc={...q,chapters:a2},bd=function(a,b){let c=a.replace(/\\n/gu,"\n"),d=new Map,e=[...c.matchAll(/第([一二两三四五六七八九十\d]+)章[^\n。;;]{0,80}(?:强制|必须|挂靠|小节|排序|最先|之后|之前)/gu)];for(let a of e){let b=function(a){let b={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if(/^\d+$/u.test(a))return Number(a);if(void 0!==b[a])return b[a];if("十"===a)return 10;let c=/^(?:(一|二|两|三|四|五|六|七|八|九)?)十(?:(一|二|两|三|四|五|六|七|八|九))?$/u.exec(a);if(c)return 10*(c[1]?b[c[1]]:1)+(c[2]?b[c[2]]:0)}(a[1]);if(!b)continue;let f=Math.max(0,a.index||0),g=e.find(a=>(a.index||0)>f)?.index,h=c.slice(f,Math.min(c.length,g??f+1400)),i=function(a){let b=/(?:以下小节设置和排序|强制小节|必须小节)[::]\s*([\s\S]*?)(?:\n\s*#{2,6}\s|\n\s*第[一二两三四五六七八九十\d]+章|$)/u.exec(a)?.[1];if(b){let a=bT([...b.matchAll(/(?:^|\n)\s*\d+[..、]\s*([^——\-—::。;;\n]{2,30})(?:[——\-—::]|,|,|。|;|;|\n|$)/gu)].map(a=>a[1]));if(a.length>0)return a}let c=[];for(let b of a.matchAll(/第[一二两三四五六七八九十\d]+章[^。;;\n]{0,50}(?:强制)?(?:包含|设置|输出|排序|挂靠)[^::。;;\n]{0,20}[::]\s*([^。;;\n]{2,120})/gu))for(let a of b[1].split(/[、,,//及和与]/u))c.push(a);for(let b of a.matchAll(/[“"]([^”"]{2,30})[”"]\s*(?:二级)?小节/gu))c.push(b[1]);for(let b of a.matchAll(/([\p{Script=Han}A-Za-z0-9()()]{2,30})(?:——|—|-|:|:)\s*(?:独立的)?(?:二级)?小节/gu))c.push(b[1]);for(let b of a.matchAll(/(?:必须|应当|需|需要|包含|设置|输出)[^。;;\n]{0,30}(?:独立的)?(?:二级)?小节[::]\s*([^。;;\n]{2,80})/gu))for(let a of b[1].split(/[、,,//及和与]/u))c.push(a);return bT(c)}(h);if(0===i.length)continue;let j=d.get(b)||{blocks:[],titles:[]};for(let a of(j.blocks.push(h),i))j.titles.some(b=>bS(b,a))||j.titles.push(a);d.set(b,j)}return[...d.entries()].map(([a,c])=>{let d=b?.[a-1];return{chapterIndex:a-1,chapterTitle:d?.title,source:c.blocks[0]?.split("\n").find(a=>a.trim())?.trim().slice(0,120),requiredSections:c.titles.map((a,b)=>({title:a,order:b+1,required:!0,source:c.blocks[0]?.slice(0,240)}))}})}([af,a.requirement||""].filter(Boolean).join("\n\n"),a2),bf=(0,at.tF)({requirement:a.requirement,promptTexts:af,template:bc,chapters:a2,spec:T}),bo=0,bu=0;a2=await Promise.all(a2.map(async(b,c)=>{if(b.sections?.length){bo+=1;let a=bd.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title));if(0===a.length)return b;let d=[...a];for(let a of b.sections)d.some(b=>(0,P.GQ)(b).replace(/[\s()()::.。;;,,、-]/gu,"")===(0,P.GQ)(a).replace(/[\s()()::.。;;,,、-]/gu,""))||d.push(a);return{...b,sections:d}}bu+=1;let d=I(aw.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(bf.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bs(aK,b,bq(b,a1)),f=cL(H,b),g=await bY({template:bc,chapter:b,chapterIndex:c,evidence:d,promptTexts:f.promptTexts,projectContext:bb,requirement:a.requirement,roleContext:e,targetWords:bf.chapterTargets.get(b.id)||1200,structuralRules:bd,signal:a.signal}),h=bd.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.map(a=>`强制小节:${a.title}`));return bh(G,bg({type:"validation",roleId:"section-planning",promptId:f.primaryPromptId,status:g.length?"success":"fallback",message:`${(0,P.GQ)(b.title)} 小节规划${g.length?`生成 ${g.length} 个小节`:"未生成可用小节"}`,details:[...f.promptDetails,...h,...g.length?g.map(a=>`规划小节:${a}`):["规划结果为空或被污染过滤"]]},{subtitle:"小节规划"})),g.length?{...b,sections:g}:b})),q={...q,chapters:a2};let bD=(0,at.tF)({requirement:a.requirement,promptTexts:af,template:q,chapters:a2,spec:T});v=a2.map(a=>a.id);let bE=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
167
167
  ${a.template.category||""}
168
- ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:q,targetWords:bD.targetChars||[...bD.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bE.targetLlmConcurrency>0&&(b=bE.targetLlmConcurrency,void 0===aF||!Number.isFinite(b)||b<=0||(aF=Math.min(aF,Math.floor(b))),aI());let bF={strategy:bE,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aI(),limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0,searchQueries:0,searchMs:0,contextChars:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0}},bG=bE.targetLlmConcurrency>0?`LLM 并发上限 ${bE.targetLlmConcurrency}`:"LLM 不做本地并发限流";be(G,bd({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bE.mode} 生成策略:章节审查 ${bE.enableChapterReview?"启用":"跳过"}、全局审查 ${bE.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bE.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bE.enableDocumentBudgetExpansion?"启用":"跳过"};${bG}`},{subtitle:"后台自动策略"}));let bH=O?"OUTLINE 章节":"模板章节",bK=bd({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bC} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bB} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bL=O?`;识别到 OUTLINE 章节 ${N.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",bM=[...H.prompts.map(a=>`${a.category}|${a.roleId}|${a.name}|${a.bindingSource}|${a.content.length} 字符`),...H.unresolvedRoles.map(a=>`unresolved|${a}|项目角色配置中的提示词角色不存在`),...H.missingResourceRoles.map(a=>`missingResource|${a}|提示词角色未显式绑定资源`)];be(G,bd({type:"role_binding",roleId:C,status:"success",message:`已绑定 ${Q.length} 个文件角色、${H.prompts.length} 个有效提示词;写作 ${H.writerPrompts.length}、章节 ${H.chapterPrompts.length}、抽取 ${H.extractionPrompts.length};已自动抽取运行时规则 ${ad.executionSummary.length} 条;资料覆盖率 ${Math.round(100*W.materialCoverageRate)}%${bL}`,details:[...bM,...ad.executionSummary.map(a=>`runtimeRule|${a}`)]},{subtitle:E,roleName:E})),be(G,bd({type:"validation",roleId:"runtime-prompt-rules",status:"success",message:`运行时提示词规则已抽取:${ad.executionSummary.length} 条,版本 ${ad.sourceHash}`,details:ad.executionSummary.length?[...ad.executionSummary,`必需表格:${ad.requiredTables.join("、")||"无"}`,`必含关键词:${ad.requiredKeywords?.join("、")||"无"}`,`禁含内容:${ad.forbiddenPatterns?.join("、")||"无"}`]:["未从提示词中识别到额外硬规则,使用系统默认质量规则"]},{subtitle:"提示词规则执行"})),be(G,bd({type:"validation",roleId:"document-readiness",status:W.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*W.materialCoverageRate)}%,资料角色 ${Math.round(100*W.roleSatisfactionRate)}%,优化建议 ${Math.round(100*W.specCompletenessRate)}%;${R.source.selectionReason}`},{subtitle:"生成准备度检查"})),be(G,bK),y();let bO=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bW=Number(bO??bE.maxChapterConcurrency),bX=Math.max(1,Math.min(ba.length||1,bE.maxChapterConcurrency,Number.isFinite(bW)?Math.floor(bW):bE.maxChapterConcurrency));be(G,bd({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bX}/${ba.length} 章并发`,details:[`策略上限:${bE.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bO??"未设置"}`,`有效章节数:${ba.length}`]},{subtitle:"章节并发策略"})),y();for(let b=0;b<ba.length;b+=bX){let c=ba.slice(b,b+bX);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;aB(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(bd({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${ba.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:g+1,total:ba.length,label:"章节生成"}},{subtitle:(0,P.GQ)(c.title),order:g})),y();let b=[],d=bn(c,a9),k=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],m=c.queries.length>0?c.queries:[q.name,q.outputTitle,c.title],p=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?cm:[],r=cQ(c,[...m,...k],p),s=cR(c,p),v=Date.now();G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行质量优先的章节检索`,details:r.slice(0,s).map(a=>`检索:${a.slice(0,42)}`),progress:{current:g+1,total:ba.length,label:"证据检索"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let w=[...au].filter(Boolean).sort(),x=[];for(let b of r.slice(0,s)){if(aB(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(av,12),weights:cO(c.title),generationMode:!1});x.push(d.results)}for(let a of(bF.evidence.searchQueries+=Math.min(r.length,s),bF.evidence.searchMs+=Date.now()-v,x))b.push(...a.filter(a=>bw(o,a.filePath,ai)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:ak.get(a.filePath),processingType:an.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let z=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),A=bo(aM,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bw(o,a.filePath,ai)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aL.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bD.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aI()));for(let a of C){if(!bw(o,a,ai))continue;let d=z.has(a),e=as.getFileDetail(a,{maxChunkContentChars:J});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:ak.get(e.file.relativePath),processingType:an.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let K=b.filter(a=>bw(o,a.filePath,au));if(ac.enabled){let b=await cj({config:ac,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ad,localFacts:[...a8.project,...a8.schedule,...a8.quality,...a8.safety,...a8.resources,...a8.preciseFacts],signal:a.signal});b.evidence.length>0&&(K.push(...b.evidence),ay.chapters.push(c.title),ay.evidenceCount+=b.evidence.length),ay.queries.push(...b.queries),ay.filteredCount+=b.filtered}let M=L(E,7e3,Math.max(14e3,Math.min(26e3,3200*aI()))),N=cP(c,K,{maxItems:cS(av,c),maxChars:M,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a)));for(let a of(0===N.length&&az.push(`${c.title}:未检索到明确资料依据`),O))az.push(`${c.title}:${a} 未检索到明确依据`);let Q=bd({type:"knowledge_retrieval",roleId:"knowledge-base",status:ax.length>0?"success":"fallback",message:`已检索/绑定 ${ax.length} 条证据`});aE<0?aE=be(G,Q):G[aE]={...Q,order:G[aE]?.order??Q.order},y(),aB(a.signal);let R=bq(aM,q),S=bp(aM,c,d),V=cI(H,c);if(H.writerPrompts.length>0&&!V.primaryWriter)throw Error(`${(0,P.GQ)(c.title)} 写作主控提示词未进入章节生成阶段`);let W=[V.promptTexts,X].filter(Boolean).join("\n\n"),Y=V.promptDetails.length?V.promptDetails:["未绑定章节写作提示词"],Z=function(a){let b=a.profile||l,c=[],d=[a.template.name,a.template.outputTitle,a.chapter.title,a.chapter.purpose,...a.chapter.sections||[]].filter(Boolean).join(" "),e=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title);for(let d of a.chapter.requiredFacts||[])a2(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a2(c,b,{label:d,category:"section",required:!1,source:"section",queries:a1(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a2(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a2(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of e?.requiredFactIds||[]){let e=a.spec?.factFields.find(a=>a.id===d);e&&a2(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a1(e.name,[e.extractionHint||"",e.validationHint||""])})}for(let e of a.spec?.factFields||[]){if(!e.required)continue;let f=n(b,e.name),g=`${e.name} ${e.extractionHint||""} ${e.validationHint||""}`;(d.includes(e.name)||a1(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a2(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a1(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a3(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=a0(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a3(c,b,a,"requirement",!0,[f]);let g=a0(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a3(c,b,d,"prompt","must_use"===d.usagePolicy,[a.chapter.title]);return c}({template:q,chapter:c,spec:T,profile:U,promptTexts:W,requirement:a.requirement,plan:d}),_=a5({needs:Z,factsModel:a8,evidence:K,profile:U}),aa=_.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);if(aa.length>0&&w.length>0){let b=await cU({manager:t,projectRoot:o,chapter:c,needs:aa,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:an,signal:a.signal});b.length>0&&(K=cP(c,[...K,...b],{maxItems:cS(av+4,c),maxChars:M+9e3,preservePinned:!0},bF),N=cP(c,K,{maxItems:cS(av+2,c),maxChars:M+7e3,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),aa=(_=a5({needs:Z,factsModel:a8,evidence:K,profile:U})).filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label))}let ab=new Set(N.map(a=>a.filePath)),ae=N.reduce((a,b)=>a+b.content.length,0);G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 已选取 ${N.length} 条高相关证据,正在生成正文`,details:[`使用绑定文件:${ab.size} 份`,`上下文字符:${ae}`,`检索查询:${Math.min(r.length,s)} 组`],progress:{current:g+1,total:ba.length,label:"正文生成"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(),bF.evidence.contextChars+=ae,ax.push(...N);let af=I(ax,{maxChars:Math.max(5e4,9e3*ba.length),preservePinned:!0});ax.splice(0,ax.length,...af);let ag=(j=_,a4(j.flatMap(a=>a.facts))),ah=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?a$:[],aj=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[],...(a.resolvedFactNeeds||[]).filter(a=>a.need.required).map(a=>a.need.label)].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${F(aA(a.value))}`),f=(a.resolvedFactNeeds||[]).flatMap(a=>a.facts),g=f.length>0?[]:(a.indexedFacts||[]).slice(0,40).map(a=>`- ${a.key||a.fieldName||"资料事实"}:${F(aA(a.value)).slice(0,180)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`),h=[...f,...a.indexedFacts||[]].filter(a=>/建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`)).filter((a,b,c)=>c.findIndex(b=>`${b.key||b.fieldName}:${aA(b.value)}`==`${a.key||a.fieldName}:${aA(a.value)}`)===b).slice(0,12),i=[...new Set([...function(a){let b=new Set,c=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;for(let d of a){let a=aA(d.content).replace(/\s+/gu," ");if((!/报价明细|投标报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(a)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))&&!/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂/u.test(a)){for(let d of a.matchAll(c))b.add(d[0].trim());if(b.size>=40)break}}return[...b].slice(0,40)}(a.evidence),...f.map(a=>aA(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元/iu.test(a)).slice(0,80),...(a.indexedFacts||[]).map(a=>aA(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元/iu.test(a)).slice(0,40)])].slice(0,100),j=new Set([...a.evidence.map(a=>a.filePath),...f.map(a=>a.sourceFile),...(a.indexedFacts||[]).map(a=>a.sourceFile)]).size,k=(a.resolvedFactNeeds||[]).filter(a=>"satisfied"!==a.status&&a.need.required).map(a=>a.need.label);return["【本章事实覆盖与参数落位要求】",d.length?`必须优先覆盖的事实/要求:
168
+ ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:q,targetWords:bD.targetChars||[...bD.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bE.targetLlmConcurrency>0&&(b=bE.targetLlmConcurrency,void 0===aI||!Number.isFinite(b)||b<=0||(aI=Math.min(aI,Math.floor(b))),aL());let bF={strategy:bE,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aL(),limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0,searchQueries:0,searchMs:0,contextChars:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0}},bG=bE.targetLlmConcurrency>0?`LLM 并发上限 ${bE.targetLlmConcurrency}`:"LLM 不做本地并发限流";bh(G,bg({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bE.mode} 生成策略:章节审查 ${bE.enableChapterReview?"启用":"跳过"}、全局审查 ${bE.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bE.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bE.enableDocumentBudgetExpansion?"启用":"跳过"};${bG}`},{subtitle:"后台自动策略"}));let bH=O?"OUTLINE 章节":"模板章节",bI=bg({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bu} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bo} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bJ=O?`;识别到 OUTLINE 章节 ${N.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",bK=[...H.prompts.map(a=>`${a.category}|${a.roleId}|${a.id}|${a.name}|${a.bindingSource}|${a.content.length} 字符|hash=${a.contentHash}|${a.contentPreview}`),...H.unresolvedRoles.map(a=>`unresolved|${a}|项目角色配置中的提示词角色不存在`),...H.missingResourceRoles.map(a=>`missingResource|${a}|提示词角色未显式绑定资源`)];bh(G,bg({type:"role_binding",roleId:C,status:"success",message:`已绑定 ${Q.length} 个文件角色、${H.prompts.length} 个有效提示词;写作 ${H.writerPrompts.length}、章节 ${H.chapterPrompts.length}、抽取 ${H.extractionPrompts.length};已自动抽取运行时规则 ${ad.executionSummary.length} 条;资料覆盖率 ${Math.round(100*W.materialCoverageRate)}%${bJ}`,details:[...bK,...ad.executionSummary.map(a=>`runtimeRule|${a}`)]},{subtitle:E,roleName:E})),bh(G,bg({type:"validation",roleId:"runtime-prompt-rules",status:"success",message:`运行时提示词规则已抽取:${ad.executionSummary.length} 条,版本 ${ad.sourceHash}`,details:ad.executionSummary.length?[...ad.executionSummary,`必需表格:${ad.requiredTables.join("、")||"无"}`,`必含关键词:${ad.requiredKeywords?.join("、")||"无"}`,`禁含内容:${ad.forbiddenPatterns?.join("、")||"无"}`]:["未从提示词中识别到额外硬规则,使用系统默认质量规则"]},{subtitle:"提示词规则执行"})),bh(G,bg({type:"validation",roleId:"document-readiness",status:W.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*W.materialCoverageRate)}%,资料角色 ${Math.round(100*W.roleSatisfactionRate)}%,优化建议 ${Math.round(100*W.specCompletenessRate)}%;${R.source.selectionReason}`},{subtitle:"生成准备度检查"})),bh(G,bI),y();let bN=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bO=Number(bN??bE.maxChapterConcurrency),bP=Math.max(1,Math.min(a2.length||1,bE.maxChapterConcurrency,Number.isFinite(bO)?Math.floor(bO):bE.maxChapterConcurrency));bh(G,bg({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bP}/${a2.length} 章并发`,details:[`策略上限:${bE.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bN??"未设置"}`,`有效章节数:${a2.length}`]},{subtitle:"章节并发策略"})),y();for(let b=0;b<a2.length;b+=bP){let c=a2.slice(b,b+bP);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;aE(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(bg({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${a2.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:g+1,total:a2.length,label:"章节生成"}},{subtitle:(0,P.GQ)(c.title),order:g})),y();let b=[],d=bq(c,a1),k=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],m=c.queries.length>0?c.queries:[q.name,q.outputTitle,c.title],p=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?cp:[],r=cT(c,[...m,...k],p),s=cU(c,p),v=Date.now();G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行质量优先的章节检索`,details:r.slice(0,s).map(a=>`检索:${a.slice(0,42)}`),progress:{current:g+1,total:a2.length,label:"证据检索"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let w=[...aq].filter(Boolean).sort(),x=[];for(let b of r.slice(0,s)){if(aE(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(av,12),weights:cR(c.title),generationMode:!1});x.push(d.results)}for(let a of(bF.evidence.searchQueries+=Math.min(r.length,s),bF.evidence.searchMs+=Date.now()-v,x))b.push(...a.filter(a=>bz(o,a.filePath,ai)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:ak.get(a.filePath),processingType:al.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let z=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),A=br(aK,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bz(o,a.filePath,ai)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aJ.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bD.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aL()));for(let a of C){if(!bz(o,a,ai))continue;let d=z.has(a),e=am.getFileDetail(a,{maxChunkContentChars:J});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:ak.get(e.file.relativePath),processingType:al.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let K=b.filter(a=>bz(o,a.filePath,aq));if(ab.enabled){let b=await cm({config:ab,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ad,localFacts:[...a0.project,...a0.schedule,...a0.quality,...a0.safety,...a0.resources,...a0.preciseFacts],signal:a.signal});b.evidence.length>0&&(K.push(...b.evidence),ax.chapters.push(c.title),ax.evidenceCount+=b.evidence.length),ax.queries.push(...b.queries),ax.filteredCount+=b.filtered}let M=L(E,7e3,Math.max(14e3,Math.min(26e3,3200*aL()))),N=cS(c,K,{maxItems:cV(av,c),maxChars:M,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a)));for(let a of(0===N.length&&ay.push(`${c.title}:未检索到明确资料依据`),O))ay.push(`${c.title}:${a} 未检索到明确依据`);let Q=bg({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`});aC<0?aC=bh(G,Q):G[aC]={...Q,order:G[aC]?.order??Q.order},y(),aE(a.signal);let R=bt(aK,q),S=bs(aK,c,d),V=cL(H,c);if(H.writerPrompts.length>0&&!V.primaryWriter)throw Error(`${(0,P.GQ)(c.title)} 写作主控提示词未进入章节生成阶段`);let W=[V.promptTexts,X].filter(Boolean).join("\n\n"),Y=V.promptDetails.length?V.promptDetails:["未绑定章节写作提示词"],Z=function(a){let b=a.profile||l,c=[],d=[a.template.name,a.template.outputTitle,a.chapter.title,a.chapter.purpose,...a.chapter.sections||[]].filter(Boolean).join(" "),e=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title);for(let d of a.chapter.requiredFacts||[])a5(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a5(c,b,{label:d,category:"section",required:!1,source:"section",queries:a4(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a5(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a5(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of e?.requiredFactIds||[]){let e=a.spec?.factFields.find(a=>a.id===d);e&&a5(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a4(e.name,[e.extractionHint||"",e.validationHint||""])})}for(let e of a.spec?.factFields||[]){if(!e.required)continue;let f=n(b,e.name),g=`${e.name} ${e.extractionHint||""} ${e.validationHint||""}`;(d.includes(e.name)||a4(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a5(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a4(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a6(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=a3(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a6(c,b,a,"requirement",!0,[f]);let g=a3(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a6(c,b,d,"prompt","must_use"===d.usagePolicy,[a.chapter.title]);return c}({template:q,chapter:c,spec:T,profile:U,promptTexts:W,requirement:a.requirement,plan:d}),$=a8({needs:Z,factsModel:a0,evidence:K,profile:U}),_=$.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);if(_.length>0&&w.length>0){let b=await cX({manager:t,projectRoot:o,chapter:c,needs:_,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});b.length>0&&(K=cS(c,[...K,...b],{maxItems:cV(av+4,c),maxChars:M+9e3,preservePinned:!0},bF),N=cS(c,K,{maxItems:cV(av+2,c),maxChars:M+7e3,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),_=($=a8({needs:Z,factsModel:a0,evidence:K,profile:U})).filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label))}let ac=new Set(N.map(a=>a.filePath)),ae=N.reduce((a,b)=>a+b.content.length,0);G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 已选取 ${N.length} 条高相关证据,正在生成正文`,details:[`使用绑定文件:${ac.size} 份`,`上下文字符:${ae}`,`检索查询:${Math.min(r.length,s)} 组`],progress:{current:g+1,total:a2.length,label:"正文生成"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(),bF.evidence.contextChars+=ae,aw.push(...N);let af=I(aw,{maxChars:Math.max(5e4,9e3*a2.length),preservePinned:!0});aw.splice(0,aw.length,...af);let ag=(j=$,a7(j.flatMap(a=>a.facts))),ah=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?aY:[],aj=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[],...(a.resolvedFactNeeds||[]).filter(a=>a.need.required).map(a=>a.need.label)].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${F(aD(a.value))}`),f=(a.resolvedFactNeeds||[]).flatMap(a=>a.facts),g=f.length>0?[]:(a.indexedFacts||[]).slice(0,40).map(a=>`- ${a.key||a.fieldName||"资料事实"}:${F(aD(a.value)).slice(0,180)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`),h=[...f,...a.indexedFacts||[]].filter(a=>/建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`)).filter((a,b,c)=>c.findIndex(b=>`${b.key||b.fieldName}:${aD(b.value)}`==`${a.key||a.fieldName}:${aD(a.value)}`)===b).slice(0,12),i=[...new Set([...function(a){let b=new Set,c=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|日历天|天|周|月|年|万元|元)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;for(let d of a){let a=aD(d.content).replace(/\s+/gu," ");if((!/报价明细|投标报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(a)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(a))&&!/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂/u.test(a)){for(let d of a.matchAll(c))b.add(d[0].trim());if(b.size>=40)break}}return[...b].slice(0,40)}(a.evidence),...f.map(a=>aD(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元/iu.test(a)).slice(0,80),...(a.indexedFacts||[]).map(a=>aD(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡|日历天|万元|元/iu.test(a)).slice(0,40)])].slice(0,100),j=new Set([...a.evidence.map(a=>a.filePath),...f.map(a=>a.sourceFile),...(a.indexedFacts||[]).map(a=>a.sourceFile)]).size,k=(a.resolvedFactNeeds||[]).filter(a=>"satisfied"!==a.status&&a.need.required).map(a=>a.need.label);return["【本章事实覆盖与参数落位要求】",d.length?`必须优先覆盖的事实/要求:
169
169
  ${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
170
170
  ${e.join("\n")}`:"",h.length?`项目基础事实卡片(资料已明确,项目概况、项目基本信息表、进度和质量相关内容必须优先使用,不得写“资料未明确”):
171
- ${h.map(a=>`- ${a.key||a.fieldName}:${F(aA(a.value)).slice(0,220)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`).join("\n")}
171
+ ${h.map(a=>`- ${a.key||a.fieldName}:${F(aD(a.value)).slice(0,220)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`).join("\n")}
172
172
  项目基本信息表必须使用固定表头:| 信息项 | 内容 |,不得使用“序号|项目名称|内容参数”表头,不得输出后台溯源列。`:"",a.factNeedsPrompt||"",g.length?`全局资料事实索引匹配到的本章可写事实:
173
- ${g.join("\n")}`:"",i.length?`本章资料中可直接使用的可靠精确参数/编号:${i.join("、")}。这些参数来自绑定资料,不属于编造;涉及对应对象、部位、工序、材料、设备、项目概况、质量验收或安全控制时必须自然写入正文,并保持原样或等价专业表达。项目基础事实中的合同估算价、计划工期可用于项目概况;不得写入报价明细、单价、税率、预留金。`:"",k.length?`当前事实需求仍未充分确认:${k.join("、")}。未确认项不得编造;但已满足事实需求中的资料事实必须写入对应小节。`:"",a.missingFacts.length?`模板显式要求中当前检索未充分命中的项:${a.missingFacts.join("、")}。未命中项不得编造,但不得因此省略上方已经明确的可靠参数。`:"",`本章可用材料来源约 ${j} 个文件,正文必须按事实需求把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:T,roleFacts:A,evidence:N,missingFacts:O,indexedFacts:[...ah,...ag],resolvedFactNeeds:_,factNeedsPrompt:function(a){let b=a.map(a=>{let b=a.facts.slice(0,5).map(b=>`${b.key||b.fieldName||a.need.label}=${a6(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${a6(a.content).slice(0,160)}${a.filePath?`(${e.basename(a.filePath)})`:""}`);return`- ${a.need.required?"必须":"相关"}|${a.need.label}|${a.status}${b.length||c.length?`:${[...b,...c].join(";")}`:":未在已解析资料中确认"}`});return b.length?`事实需求覆盖卡片:
174
- ${b.join("\n")}`:""}(_)}),al={total:_.length,satisfied:_.filter(a=>"satisfied"===a.status).length,missing:_.filter(a=>"missing"===a.status).length,lowConfidence:_.filter(a=>"low_confidence"===a.status).length};for(let a of aa)az.push(`${c.title}:事实需求未确认 ${a}`);let am=T?.chapterRules.find(a=>a.id===c.id||a.title===c.title),ao=bD.chapterTargets.get(c.id)||1200,ap=Math.ceil(ao*(bD.maxChars?1.1:1.18)),at=bD.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*ao))):1200,aw=Math.max(d?.minWords||0,am?.minWords||0,T?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*ao),at),aC=b0(aw,ao),aF=bD.longformStrict?1:.55,aG=bD.longformStrict?ao:2600,aH=Math.max(900,Math.min(ao,Math.ceil(ao*aF),aG)),aJ=Math.max(450,Math.min(aw,Math.floor(.72*aH))),aK=Math.max(aH+300,Math.min(ap,Math.ceil(1.25*aH))),aN=b0(aJ,aH),aQ=Math.min(b1(aH),3e5),aR=c.sections?.filter(Boolean).length||0,aS=/[、,,;;]/u.test(c.title),aT=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aR>=2&&(bD.longformStrict||!aS);G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aT?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aT?[...Y,`有效证据:${N.length} 条`,`事实需求:${al.satisfied}/${al.total} 已满足,缺失 ${al.missing},低置信 ${al.lowConfidence}`,`目标字数:约 ${ao} 字,上限约 ${ap} 字`,`小节并发上限:${bE.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${al.satisfied}/${al.total} 已满足,缺失 ${al.missing},低置信 ${al.lowConfidence}`,`目标字数:约 ${ao} 字,上限约 ${ap} 字`,`章节并发上限:${bX}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:ba.length,label:aT?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aV=Math.ceil((c.sections?.length||2)/Math.max(1,bE.maxSectionConcurrency||1)),aW=Math.max(b1(ao),Math.min(18e5,3e5*aV+18e4)),aX=aT?await B(()=>bh(bF,`chapter-section-draft:${c.id}`,()=>aO(b=>b_({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:W,projectContext:bc,requirement:a.requirement,roleContext:S,targetWords:ao,maxWords:ap,forbidDrawingImages:R,factCoverageContext:aj,projectRoot:o,modelName:aP,fileRolesHash:aU,allowPartialResult:!1,maxSectionConcurrency:bE.maxSectionConcurrency,sectionEvidenceProvider:a=>cT({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:an,signal:b}),diagnostics:bF,signal:b}),aW,a.signal))):await B(()=>bh(bF,`chapter-draft:${c.id}`,()=>aO(b=>bJ(q,c,N,O,W,bc,a.requirement,S,{forbidDrawingImages:R,minWords:aw,targetWords:ao,maxWords:ap,maxTokens:aC,factCoverageContext:aj,signal:b}),b1(ao),a.signal)));if(!aX&&aT?(G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${ao} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:ba.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bh(bF,`chapter-draft-fallback:${c.id}`,()=>aO(b=>bJ(q,c,N,O,W,bc,a.requirement,S,{forbidDrawingImages:R,minWords:aJ,targetWords:aH,maxWords:aK,maxTokens:aN,factCoverageContext:aj,signal:b}),aQ,a.signal)))):aX||(G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${ao} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:ba.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bh(bF,`chapter-draft-fallback:${c.id}`,()=>aO(b=>bJ(q,c,N,O,W,bc,a.requirement,S,{forbidDrawingImages:R,minWords:aJ,targetWords:aH,maxWords:aK,maxTokens:aN,factCoverageContext:aj,signal:b}),aQ,a.signal)))),aB(a.signal),aX||(G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${ao} 字`],progress:{current:g+1,total:ba.length,label:"紧凑兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bh(bF,`chapter-draft-compact-fallback:${c.id}`,()=>aO(b=>bJ(q,c,N,O,W,bc,a.requirement,S,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*aw)),targetWords:ao,maxWords:ap,maxTokens:aC,factCoverageContext:aj,signal:b}),b1(ao),a.signal)))),aB(a.signal),!aX)throw Error(`${c.title} 大模型未返回有效章节正文`);let aY=cp(aX,c);if(aY.length>0){let b=aX;G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿存在 ${aY.length} 个小节缺口,正在定向补写`,details:aY.map(a=>a.message),progress:{current:g+1,total:ba.length,label:"小节补写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bh(bF,`chapter-supplement:${c.id}`,()=>b6({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bc,requirement:a.requirement,roleContext:S,targetWords:ao,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:aY,signal:a.signal})))}if((aY=cp(aX,c)).length>0){G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次生成仍有 ${aY.length} 个小节缺口,正在章节内强制补齐`,details:aY.map(a=>a.message),progress:{current:g+1,total:ba.length,label:"章节内小节补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aX;aX=await B(()=>bh(bF,`chapter-forced-section-supplement:${c.id}`,()=>b6({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bc,requirement:a.requirement,roleContext:S,targetWords:ao,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:aY,signal:a.signal}))),aY=cp(aX,c)}aY.length>0&&(G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:aY.map(a=>a.message),progress:{current:g+1,total:ba.length,label:"保留可用章节"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let aZ=bs({chapter:c,content:aX,missingFacts:O,targetWords:ao}),a_=(0,ar.Ff)(aZ);bF.quality.blockingCount+=a_.blocking,bF.quality.importantCount+=a_.important,bF.quality.minorCount+=a_.minor;let a7=bk(aZ);if(a7.length>0){let b=aX;G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${a7.length} 个阻断问题`,details:a7,progress:{current:g+1,total:ba.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bh(bF,`chapter-repair:${c.id}`,()=>bt({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,...aa.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:a7,promptTexts:W,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bF,signal:a.signal})));aX=d.content,d.appliedCount>0&&(bF.quality.repairedCount+=1),aB(a.signal)}if(!aX?.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bb=cr(aX,c),bg=0;if((0,aq.V7)(bb)<Math.floor(.82*ao)||bk(bs({chapter:c,content:bb,missingFacts:O,targetWords:ao})).length>0){G[i]=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aq.V7)(bb)} 字 / 目标 ${Math.floor(.95*ao)} 字`,`章节并发:${bX}`],progress:{current:g+1,total:ba.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bh(bF,`chapter-expand:${c.id}`,()=>b7({template:q,chapter:c,content:aX,evidence:N,promptTexts:W,requirement:a.requirement,roleContext:S,targetChars:Math.floor(.95*ao),maxChars:ap,forbidDrawingImages:R,maxTokens:Math.min(aC,aN),signal:a.signal})));bb=cr(b.content,c),bg=b.rounds}bb=cH(bb,c);let bi=(0,aq.V7)(bb),bj=c.sections?.length?c.sections:$(bb),bl=(0,ar.qK)(bb,[{title:c.title,content:bb,sections:bj}]).map(a=>a.message),bm=[...bs({chapter:{...c,sections:bj},content:bb,missingFacts:O,targetWords:ao}),...bl],br=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(bi,ao,bm);f=bd({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:br,message:bf(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${bg>0?`并定向扩写 ${bg} 轮`:""}:当前 ${bi} 字 / 目标 ${Math.floor(.95*ao)} 字${"success"!==br?`;风险:${bm.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(bi/Math.max(1,Math.floor(.95*ao))*100)}%`,...Y,`二级小节:${bj.length} 个`,`扩写轮次:${bg}`],progress:{current:g+1,total:ba.length,label:"success"===br?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aD.push(f);let bu={id:c.id,title:c.title,content:bb,evidence:N,missingFacts:O,sections:bj};u.push(bu),y(u);let bv=bs({chapter:c,content:bb,missingFacts:O,targetWords:ao}),bx=(0,ar.Ff)(bv);bF.quality.blockingCount+=bx.blocking,bF.quality.importantCount+=bx.important,bF.quality.minorCount+=bx.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aC.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aD.push(bd({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,P.GQ)(c.title)} 生成失败`},{subtitle:(0,P.GQ)(c.title),order:g}))}f&&(G[i]=f),y(u)}))}if(u.sort((a,b)=>ba.findIndex(b=>b.id===a.id)-ba.findIndex(a=>a.id===b.id)),0===u.length)throw Error(`章节生成未完成:${aC.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<ba.length)throw Error(`OUTLINE 指定 ${ba.length} 章,实际只生成 ${u.length} 章:${aC.join(";")||"部分章节未生成"}`);aB(a.signal),be(G,bd({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bY={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bY=await bI(o,ax,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(be(G,bY.stage),y(u),aB(a.signal),bY.notes))ax.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bZ=I(ax,{maxItems:Math.max(48,10*ba.length),maxChars:Math.max(52e3,9e3*ba.length),preservePinned:!0});ax.splice(0,ax.length,...bZ);let b$=function(a,b,c){let d={};for(let e of(0,D.Uy)(a,c)){let a=b.find(a=>(0,D.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(q,ax,T);for(let a of aM)for(let b of a.facts)b$[b.key]=`${aA(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b2=aR(ax,q,T),b3=aX(ax),b4=aY(ax,U),b5=aM.flatMap(a=>a.facts.map(a=>({key:a.key,value:aA(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cc={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,D.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aA(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aA(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...b5,...b2,...b3,...b4],q,T)){let b=I(ax,{maxItems:48,maxChars:45e3,preservePinned:!0});try{cc=await aS(b,ag,q,T,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aB(a.signal);let cd=function(a,b){let c=b.find(a=>a.filePath)?.filePath||"";return c?a.map(a=>a.sourceFile?a:{...a,sourceFile:c,sourceRef:{filePath:c,roleId:a.sourceRef?.roleId||a.roleId,processingType:a.sourceRef?.processingType||a.processingType,sectionTitle:a.sourceRef?.sectionTitle,chunkIndex:a.sourceRef?.chunkIndex,cellRange:a.sourceRef?.cellRange}}):a}([...b5,...b2,...b3,...b4,...cc.facts],ax);for(let a of(be(G,bY.stage),cc.stages))be(G,a);y();let ce=aQ(ax),cf=ax.filter(a=>"pinned-evidence"===a.source).length,cg=ax.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,ch=bd({type:"reference",roleId:"quality-enhancement",status:ax.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${ax.length} 条,人工确认/固定证据 ${cf} 条,自动检索证据 ${cg} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(ch),y(),cd))b$[a.key]=`${aA(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ci=new Map;for(let a of ax)ci.set(a.filePath,(ci.get(a.filePath)??0)+1);let cn=new Map;for(let a of ax)cn.set(a.source||"unknown",(cn.get(a.source||"unknown")??0)+1);let cq=[...ci.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cs=a7(cd,ce,az,T,U),ct=u.map(a=>{let b=T.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>T.factFields.find(b=>b.id===a)?.name).filter(Boolean),d=[...new Set([...a.missingFacts||[],...c].filter(Boolean))],e=d.filter(b=>!a.missingFacts.includes(b)),f=d.filter(b=>a.missingFacts.includes(b)),g=+(a.evidence.length>0),h=d.length?e.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:d,coveredFacts:e,missingFacts:f,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*h+.3*g)}}),cv=function(a,b=[],c){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&f.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===(0,d.zY)(c).length&&f.push("模板未绑定任何提示词");let g=new Set(b.map(a=>a.roleId));return c?.fileBindings?.some(a=>"rule"===a.roleId)&&!g.has("rule")&&e.push("rule 角色未抽取到结构化事实"),{passed:0===f.length,warnings:e,errors:f}}(u,cd,q);cv.warnings.push(...W.warnings),cv.errors.push(...W.blockingIssues);let cw=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(cv,cs,u);for(let a of(cw.push(...function(a){let b=[];for(let c of a)0===c.evidenceCount?b.push({level:"error",message:`章节缺少证据:${c.title}`,suggestion:"请补充对应绑定材料或调整模板章节检索词。"}):c.readinessRate<.5&&b.push({level:"warning",message:`章节事实覆盖率较低:${c.title} ${Math.round(100*c.readinessRate)}%`,suggestion:"建议补充章节 requiredFacts 或绑定材料证据。"});return b}(ct)),aM))for(let b of a.warnings)cw.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cx=bq(aM,q),cy=Date.now(),cz=(0,aq.V7)(u.map(a=>a.content).join("\n\n"));be(G,bd({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cz} 字`,details:[`章节数:${u.length}`,`目标:${bD.targetChars||bD.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cA=bE.enableDocumentBudgetExpansion?await B(()=>b8({template:q,chapters:u,budget:bD,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cx,signal:a.signal})):u;u.splice(0,u.length,...cA);let cB=u.map(a=>a.content).join("\n\n"),cC=cN(u,cd,cB);cC.patchedCount>0&&(u.splice(0,u.length,...cC.chapters),cw.push({level:"info",message:`已自动补写未落位事实 ${cC.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cD=(0,aq.fW)(bD,u.map(a=>a.content).join("\n\n")),cJ=[bD.targetChars?`目标 ${bD.targetChars} 字${bD.minChars||bD.maxChars?`(区间 ${bD.minChars||0}-${bD.maxChars||"∞"} 字)`:""}`:void 0,bD.targetPages?`目标 ${bD.targetPages} 页${bD.minPages||bD.maxPages?`(区间 ${bD.minPages||0}-${bD.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";be(G,bd({type:"validation",roleId:"document-budget",status:bD.maxChars&&cD.currentChars>bD.maxChars||bD.minChars&&cD.currentChars<bD.minChars?"fallback":"success",message:bf(`文档预算:当前 ${cD.currentChars} 字,新增 ${Math.max(0,cD.currentChars-cz)} 字,预计 ${cD.estimatedPages} 页;${cJ}`,cy)},{subtitle:"文档预算"})),y(u);let cK=aD.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cL=Math.max(0,ba.length-u.length);cK>0&&cw.push({level:"info",message:`章节生成存在补充完善:${cK} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cL>0&&cw.push({level:"error",message:`部分章节生成失败:${cL} 章`,suggestion:aC.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cX=cw.filter(a=>"error"===a.level&&(0,ar.Nz)(a)).length,cY=[...G];be(cY,bd({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${ax.length} 条,来源文件 ${cq.length} 份,结构化事实 ${cd.length} 条`,details:[`证据类型:${[...cn.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${at.usableChunkCount} 条,待索引 ${at.pendingJobs} 个,向量 ${at.vectorStatus?.status||"unknown"}`,cC.patchedCount>0?`自动补写事实:${cC.patchedCount}/${cC.missingCount}`:`事实落位补写:0/${cC.missingCount}`]},{subtitle:"资料使用报告"})),be(cY,bd({type:"reference",roleId:"web-research-report",status:ay.enabled?"success":"skipped",message:ay.enabled?`联网增强:检索章节 ${new Set(ay.chapters).size} 个,查询 ${ay.queries.length} 个,使用公开资料 ${ay.evidenceCount} 条`:"联网增强未开启",details:ay.enabled?[`检索主题:${[...new Set(ay.queries)].join(";")||"无"}`,`过滤结果:${ay.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),be(cY,bd({type:"validation",roleId:"document-workflow",status:cX>0?"failed":"success",message:`阻断 ${cX},错误 ${cv.errors.length},警告 ${cv.warnings.length}`},{subtitle:"最终规范校验"})),be(cY,bd({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),be(cY,bd({type:"export_ready",roleId:"document-workflow",status:cX>0?"failed":"success",message:cX>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cZ={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:b$,structuredFacts:cd,factsModel:cs,chapters:u,sources:cq,missingItems:[...new Set(az)],validation:cv,validationIssues:cw,executionStages:cY,exportGate:{passed:0===cX,blockingIssues:cw.filter(a=>"error"===a.level&&(0,ar.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,aq.V7)(a.content),status:cl(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},c$=ap(cZ,{forbidDrawingImages:cx,promptRules:ad});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b,c=ao(c$,u,{forbidDrawingImages:cx,promptRules:ad}).chapters.map(a=>{let b=ba.find(b=>b.id===a.id)||a;return{...a,content:cH(a.content,b)}}),d=cE(cu(cG(ao(ap({...cZ,chapters:c},{forbidDrawingImages:cx,promptRules:ad}),c,{forbidDrawingImages:cx,promptRules:ad}).markdown),cd),cd),e=(a,b)=>{let c=[...cw];return c.push(...w({markdown:a,spec:T,summary:R})),c.push(...A({markdown:a,facts:cd,summary:R,profile:U})),c.push(...x(a,R)),c.push(...cF(a,cd)),ad.forbidToc||(c.push(...(0,ar.gN)(a)),c.push(...(0,ar.f8)(a))),c.push(...(0,ar.k0)(a)),c.push(...(0,ar.qK)(a,b)),c.push(...(0,ar.iC)(a)),c.push(...(0,ar.BV)(a)),c.push(...aa(a)),c.push(...(0,ar.Ty)(b)),c.push(...(0,ar.N1)(a,cs)),c.push(...ck(a)),c.push(...(0,ar.bM)(a)),c.push(...(0,ar.M$)(a,J)),c.push(...(0,ar.AC)(a,b)),c.push(...(0,ar.mR)(a,q)),c.push(...(0,aq.PE)(q.generationSettings||q.exportSettings,a).filter(a=>!(bD.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,aq.ty)(bD,a)),c.push(...am(a,q)),c.push(...al(a,ad)),c},f=e(d,c),g=f.filter(a=>"error"===a.level||/提示词要求|正式表格|禁止内容|后台|占位|空小节|缺少规划小节|目录|封面/u.test(a.message)).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`).slice(0,24);if(g.length>0){let h=await B(()=>bh(bF,"default-path-quality-repair",()=>bu({markdown:d,template:q,chapters:c,promptTexts:af,requirement:a.requirement,issues:g,forbidDrawingImages:cx,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:g.length}),cY);b=h.stage?{...h.stage,message:`${h.stage.message||"默认路径质量修复完成"};触发问题 ${g.length} 个`}:void 0,h.chapters!==c&&(c=h.chapters.map(a=>{let b=ba.find(b=>b.id===a.id)||a;return{...a,sections:a.sections||[],content:cH(a.content,b)}}),f=e(d=cE(cu(cG(ao(ap({...cZ,chapters:c},{forbidDrawingImages:cx,promptRules:ad}),c,{forbidDrawingImages:cx,promptRules:ad}).markdown),cd),cd),c))}let h=(0,ar.Ai)(f,cs,c),i=cY.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:h.blockingIssues.length>0?"failed":"success",message:`阻断 ${h.blockingIssues.length},问题 ${f.length}`}:"export_ready"===a.type?{...a,status:h.passed?"success":"failed",message:h.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);b&&i.push(b),i.push(bd({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;默认路径已执行本地硬规则校验与必要的精准局部修复;如需开启重型复审请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let j=c.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cZ,chapters:j,validationIssues:f,exportGate:h,executionStages:i,partialChapters:c.map(a=>({id:a.id,title:a.title,chars:(0,aq.V7)(a.content),status:cl(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:j,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bF},markdown:d}}aB(a.signal);let c_=u.map(a=>{let b=bs({chapter:ba.find(b=>b.id===a.id)||{id:a.id,title:a.title,purpose:"",queries:[],requiredFacts:[],sections:a.sections},content:a.content,missingFacts:a.missingFacts,targetWords:bD.chapterTargets.get(a.id)||1200}),c=b.some(a=>/缺少|空小节|只有标题|只有表格|正文篇幅明显低于目标|后台流程话术|占位|requiredFacts/u.test(a));return{chapterId:a.id,title:a.title,status:c?"fail":b.length>0?"warn":"pass",issues:b,suggestions:[],chars:(0,aq.V7)(a.content)}}),c0=c_.filter(a=>"pass"!==a.status).length,c1=bE.enableChapterReview&&c0>0;c1&&(be(cY,bd({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${c0}/${u.length} 章存在本地风险`,details:[`审查并发:${bE.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cY));let c2=c1?await B(()=>bh(bF,"chapter-review",()=>b9({template:q,chapters:u,budget:bD,promptTexts:ah||af,requirement:a.requirement,strategy:bE,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cY):{summaries:c_,stage:bd({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bE.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cY.push(c2.stage);let c3=c2.summaries,c4=c3.filter(a=>"pass"!==a.status&&a.issues.length>0);if(c4.length>0){be(cY,bd({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${c4.length} 章`,details:c4.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:c4.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cY);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bE.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bE.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<c4.length;d+=e){aB(a.signal);let f=c4.slice(d,d+e);for(let d of(await Promise.all(f.map(async b=>{let c=u.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await aO(d=>bt({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:ah||af,requirement:a.requirement,forbidDrawingImages:cx,diagnostics:bF,signal:d}),9e4,a.signal);return{chapterId:b.chapterId,content:d?.content,appliedCount:d?.appliedCount||0}}catch{return{chapterId:b.chapterId,content:void 0,appliedCount:0}}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<u.length;a+=1){let c=b.get(u[a].id);c&&c!==u[a].content&&(u[a]={...u[a],content:c},g.add(u[a].id),f+=1)}f>0&&(c3=c3.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aq.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),c$=ap({...cZ,chapters:u,validationIssues:cw,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad})),cY.push(bd({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cY)}if(c1)for(let a of c3.filter(a=>"pass"!==a.status&&a.issues.length>0))cw.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let c5=bE.enableGlobalReview&&(c1||cw.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));c5&&(be(cY,bd({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cY));let c6=c5?await B(()=>bh(bF,"global-consistency-review",()=>ca({template:q,chapters:u,chapterReviews:c3,promptTexts:ah||af,requirement:a.requirement,projectContext:bc,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cY):{issues:[],stage:bd({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bE.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cY.push(c6.stage),c6.issues))cw.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cY);let c7=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aq.V7)(a.content)<Math.floor(.7*(bD.chapterTargets.get(a.id)||1200))||c3.some(b=>b.chapterId===a.id&&"fail"===b.status)||bs({chapter:ba.find(b=>b.id===a.id)||{id:a.id,title:a.title,purpose:"",queries:[],requiredFacts:[],sections:a.sections},content:a.content,missingFacts:a.missingFacts,targetWords:bD.chapterTargets.get(a.id)||1200}).length>0),c8=cX>0||c6.issues.length>0||c3.some(a=>"fail"===a.status)||cw.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c9=bE.enableFinalQualityReview&&(c8||c7.length>Math.max(3,Math.floor(.35*u.length))),da=Date.now();c9&&(be(cY,bd({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c7.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cY));let db=I(ax,{maxItems:Math.max(32,8*ba.length),maxChars:Math.max(36e3,6e3*ba.length),preservePinned:!0}),dc=c9?await B(()=>cb({template:q,spec:T,markdown:c$,evidence:db,promptTexts:ah||af,projectContext:bc,requirement:a.requirement,diagnostics:bF,signal:a.signal}),cY):{markdown:c$,stage:{type:"llm_review",roleId:"llm-review",status:c7.length>0?"fallback":"success",message:c7.length>0?`本地风险扫描发现 ${c7.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};dc.stage.message=bf(dc.stage.message||"LLM 审查完成",da),aB(a.signal);let dd=ao(dc.markdown===c$?ap({...cZ,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}):dc.markdown,u,{forbidDrawingImages:cx,promptRules:ad}).markdown,de=am(dd,q).map(a=>a.message),df=(0,ar.bM)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dg=(0,ar.mR)(dd,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dh=(0,ar.N1)(dd,cs).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),di=ad.forbidToc?[]:[...(0,ar.gN)(dd),...(0,ar.f8)(dd)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dj=(0,ar.k0)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dk=(0,ar.qK)(dd,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dl=(0,ar.iC)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dm=(0,ar.BV)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dn=[...de,...df,...dg,...dh,...di,...dj,...dk,...dl,...dm,...(0,ar.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...aa(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],dp=new Set(dk),dq=Date.now(),dr=dn.filter(a=>!dp.has(a));be(cY,bd({type:"llm_review",roleId:"quality-repair",status:dr.length>0?"running":"success",message:dr.length>0?`正在进行精准质量修复:${dr.length} 个问题`:"未发现需要精准修复的问题",details:dr,progress:{current:1,total:Math.max(1,dr.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cY);let ds=await B(()=>bh(bF,"local-patch-quality-repair",()=>bu({markdown:dd,template:q,chapters:u,promptTexts:af,requirement:a.requirement,issues:dr,forbidDrawingImages:cx,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:dr.length}),cY);ds.stage&&(ds.stage.message=bf(ds.stage.message||"质量修复完成",dq)),aB(a.signal);let dt=ds.stage?[...cY,dc.stage,ds.stage]:[...cY,dc.stage],du=ds.chapters,dv=ap({...cZ,chapters:du,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),dw=(0,ar.yw)(dv,du).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dw.length>0){let b=Date.now();be(dt,bd({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dw.length} 个问题`,details:dw.map(a=>a.message),progress:{current:1,total:dw.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(du,dt);let c=[...du];for(let b=0;b<du.length;b+=bE.maxChapterConcurrency){aB(a.signal);let d=du.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dw.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=ba.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bD.chapterTargets.get(b.id)||1200,f=bn(d,a9);try{let g=await aO(g=>b6({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bc,requirement:a.requirement,roleContext:bp(aM,d,f),targetWords:e,forbidDrawingImages:cx,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=b.sections?.length?b.sections:$(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}du=c;let d=(0,ar.qK)(ap({...cZ,chapters:du,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),du);be(dt,bd({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bf(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(du,dt)}let dx=(0,aq.fW)(bD,du.map(a=>a.content).join("\n\n"));if(bE.enableDocumentBudgetExpansion&&bD.minChars&&dx.currentChars<Math.floor(.9*bD.minChars)&&(!bD.maxChars||dx.currentChars<bD.maxChars)){let b=Date.now(),c=dx.currentChars;be(dt,bd({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bD.minChars} 字`,`章节数:${du.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(du,dt),du=await B(()=>b8({template:q,chapters:du,budget:bD,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cx,signal:a.signal}),dt);let d=(0,aq.fW)(bD,du.map(a=>a.content).join("\n\n"));be(dt,bd({type:"validation",roleId:"document-budget-repair",status:bD.minChars&&d.currentChars<bD.minChars?"fallback":"success",message:bf(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dy=ao(ap({...cZ,chapters:du,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),du,{forbidDrawingImages:cx,promptRules:ad}),dz=dy.chapters,dA=dy.markdown,dB=dz.map(a=>{let b=du.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dC=(0,ar.yw)(dA,dB).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dC.length>0){let b=Date.now();be(dt,bd({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dC.length} 个问题`,details:dC.map(a=>a.message),progress:{current:1,total:dC.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(dz,dt);let c=[...dz];for(let b=0;b<dz.length;b+=bE.maxChapterConcurrency){aB(a.signal);let d=dz.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dC.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=ba.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bD.chapterTargets.get(b.id)||1200,f=bn(d,a9);try{let g=await aO(g=>b6({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bc,requirement:a.requirement,roleContext:bp(aM,d,f),targetWords:e,forbidDrawingImages:cx,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=b.sections?.length?b.sections:$(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dz=(dy=ao(ap({...cZ,chapters:c,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),c,{forbidDrawingImages:cx,promptRules:ad})).chapters,dA=dy.markdown;let d=(0,ar.qK)(dA,dz);be(dt,bd({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bf(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(dz,dt)}dz=(dy=ao(ap({...cZ,chapters:dz,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),dz,{forbidDrawingImages:cx,promptRules:ad})).chapters,dA=cE(cu(dy.markdown,cd),cd);let dD=bb({facts:cd,markdown:dA});dD.size>0&&cY.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dD.size} 项`,details:[...dD.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dE=[...de];(cw=(0,ar.kQ)(T,[...cw,...dE.map(a=>({level:"warning",message:a}))],cs,dz,dA,Q,J)).push(...w({markdown:dA,spec:T,summary:R})),cw.push(...A({markdown:dA,facts:cd,summary:R,profile:U})),cw.push(...x(dA,R)),cw.push(...cF(dA,cd)),ad.forbidToc||(cw.push(...(0,ar.gN)(dA)),cw.push(...(0,ar.f8)(dA))),cw.push(...(0,ar.k0)(dA)),cw.push(...(0,ar.qK)(dA,dz)),cw.push(...(0,ar.iC)(dA)),cw.push(...(0,ar.BV)(dA)),cw.push(...aa(dA)),cw.push(...(0,ar.Ty)(dz)),cw.push(...(0,ar.N1)(dA,cs)),cw.push(...ck(dA)),cw.push(...(0,ar.bM)(dA)),cw.push(...(0,ar.M$)(dA,J)),cw.push(...(0,ar.AC)(dA,dz)),cw.push(...(0,ar.mR)(dA,q));let dF=cN(dz,cd,dA);dF.patchedCount>0&&(dz=dF.chapters.map(a=>({...a,sections:a.sections||[]})),cw.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dF.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),dA=ao(ap({...cZ,chapters:dz,validationIssues:cw,exportGate:cZ.exportGate,executionStages:cY},{forbidDrawingImages:cx,promptRules:ad}),dz,{forbidDrawingImages:cx,promptRules:ad}).markdown),cw.push(...function(a,b,c={}){return cM(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(dA,[...cd,...cs.preciseFacts],{maxIssues:30})),dA=ao(dA,dz,{forbidDrawingImages:cx,promptRules:ad}).markdown;let dG=(0,aq.ty)(bD,dA),dH=(0,aq.PE)(q.generationSettings||q.exportSettings,dA).filter(a=>!(bD.minPages&&/低于目标页数/u.test(a.message)));cw.push(...dH),cw.push(...dG),cw.push(...am(dA,q)),cw.push(...al(dA,ad));let dI=(0,ar.Ai)(cw,cs,dz),dJ=dI.blockingIssues.length,dK=(0,ar.Ff)(cw);bF.quality.blockingCount+=dK.blocking,bF.quality.importantCount+=dK.important,bF.quality.minorCount+=dK.minor;let dL=dt.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dJ>0?"failed":"success",message:`阻断 ${dJ},问题 ${cw.length}`}:"export_ready"===a.type?{...a,status:dI.passed?"success":"failed",message:dI.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bF.llm.currentLimit=aI();let dM=[...bF.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dL.push(bd({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bF.llm.calls} 次,失败 ${bF.llm.failures} 次,排队 ${bF.llm.throttledWaits} 次/${Math.round(bF.llm.throttledWaitMs/1e3)} 秒,检索 ${bF.evidence.searchQueries} 次/${Math.round(bF.evidence.searchMs/1e3)} 秒,证据上下文 ${bF.evidence.contextChars} 字,噪声过滤 ${bF.evidence.filteredNoise} 条,质量问题 阻断${bF.quality.blockingCount}/重要${bF.quality.importantCount}/轻微${bF.quality.minorCount},自动限流调整 ${bF.llm.limitAdjustments} 次${dM?`,Top耗时:${dM}`:""}`},{subtitle:"后台诊断"}));let dN=dz.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cZ,chapters:dN,validationIssues:cw,exportGate:dI,executionStages:dL,partialChapters:dz.map(a=>({id:a.id,title:a.title,chars:(0,aq.V7)(a.content),status:cl(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dN,reviewMetadata:{chapterSummaries:c3,globalIssues:c6.issues,diagnostics:bF}},markdown:dA}}async function cY(a){let b=(0,d.QJ)(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let f=e.resolve(a.projectRoot||(0,g.aY)());if(!f)throw Error("No knowledge base project found");let h=(0,g.Qh)(),j=(0,d.Vh)(b),k=bx(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>bv(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>bv(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=cW(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=cQ(c,c.queries,[]),s=cR(c,[]);for(let a of r.slice(0,s)){let b=await h.search(f,a,{scope:"project",filters:{filePaths:q},limit:Math.min(o,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});p.push(...b.results.filter(a=>bw(f,a.filePath,k)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:m.get(a.filePath),processingType:n.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let t=cP(c,p.filter(a=>bw(f,a.filePath,k)),{maxItems:cS(o,c),maxChars:16e3,preservePinned:!0}),u=a.currentMarkdown||"",v=new Set(a.existingFacts??[]),w=c.requiredFacts.filter(a=>!v.has(a)&&!t.some(b=>(0,D.Lk)(b,a))),x=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",u?`> 当前文档上下文摘要:${u.replace(/\s+/gu," ")}`:"",t.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",t.length>0?"### 资料依据":"",...t.map(J),"",w.length>0?"### 待确认事项":"",...w.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:x,evidence:t,missingFacts:w}}},44533:(a,b,c)=>{c.d(b,{Qh:()=>l,VS:()=>p,Yy:()=>o,aY:()=>n});var d=c(19898),e=c(87550),f=c.n(e),g=c(33873),h=c(21820),i=c(29021);let j=null;function k(){return g.join(h.homedir(),".customize-agent")}function l(){return j||(j=new d.MultiProjectManager(k())),j}function m(a){let b=g.resolve(a),c=g.resolve(g.join(h.homedir(),".customize-agent"));return!(i.existsSync(g.join(b,"pnpm-workspace.yaml"))&&i.existsSync(g.join(b,"apps","server")))&&(b===c||b.includes(`${g.sep}.customize-agent${g.sep}`)||b.endsWith(`${g.sep}apps${g.sep}server`)||b.endsWith(`${g.sep}apps${g.sep}cli`))}function n(){let a=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(a&&i.existsSync(a)&&!m(a))return g.resolve(a);let b=function(){let a=g.join(k(),"projects","registry.db");if(!i.existsSync(a))return[];let b=new(f())(a,{readonly:!0});try{return b.prepare("SELECT project_root FROM project_registry ORDER BY last_opened_at DESC").all().map(a=>g.resolve(a.project_root)).filter(a=>!m(a))}finally{b.close()}}();return b.length>0?b[0]:process.env.INIT_CWD&&!m(process.env.INIT_CWD)?process.env.INIT_CWD:g.resolve(process.cwd(),"../..")}function o(a,b={}){let c=new Map;for(let b of function(a){let b=g.join(h.homedir(),".customize-agent","projects",(0,d.computeProjectId)(g.resolve(a)),"kb.db");if(!i.existsSync(b))return[];let c=new d.IndexStateStore(b);try{return c.listRecords().map(a=>({...a,matchedBy:"metadata"}))}finally{c.close()}}(a))c.set(b.relativePath,b);for(let b of function(a){let b=g.join(a,"knowledgeBase");if(!i.existsSync(b))return[];let c=[],d=a=>{for(let e of i.readdirSync(a,{withFileTypes:!0})){let f=g.join(a,e.name);if(e.isDirectory()){d(f);continue}if(e.name.endsWith(".source.txt"))continue;let h=i.statSync(f),j=g.relative(b,f).split(g.sep).join("/");c.push({relativePath:j,category:j.includes("表格数据/")?"spreadsheet":j.includes("图片素材/")?"image":j.includes("图纸文件/")?"cad":j.includes("文档资料/")?"document":"other",format:g.extname(j).slice(1).toLowerCase()||"text",contentHash:"",fileSize:h.size,mtime:h.mtimeMs,chunkCount:0,collectionName:"",indexedAt:0,lastVerifiedAt:0,status:"disk",matchedBy:"disk"})}};return d(b),c}(a)){let a=c.get(b.relativePath);c.set(b.relativePath,a?{...a,fileSize:b.fileSize,mtime:b.mtime,matchedBy:"metadata"}:b)}return Array.from(c.values()).filter(a=>!b.category||a.category===b.category).sort((a,b)=>b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN"))}async function p(a,b={}){let c=(b.query||"").trim(),d=Math.max(1,Math.min(500,b.limit??50)),e=new Map,f=o(a,{category:b.category});for(let a of f)(!c||`${a.relativePath}
173
+ ${g.join("\n")}`:"",i.length?`本章资料中可直接使用的可靠精确参数/编号:${i.join("、")}。这些参数来自绑定资料,不属于编造;涉及对应对象、部位、工序、材料、设备、项目概况、质量验收或安全控制时必须自然写入正文,并保持原样或等价专业表达。项目基础事实中的合同估算价、计划工期可用于项目概况;不得写入报价明细、单价、税率、预留金。`:"",k.length?`当前事实需求仍未充分确认:${k.join("、")}。未确认项不得编造;但已满足事实需求中的资料事实必须写入对应小节。`:"",a.missingFacts.length?`模板显式要求中当前检索未充分命中的项:${a.missingFacts.join("、")}。未命中项不得编造,但不得因此省略上方已经明确的可靠参数。`:"",`本章可用材料来源约 ${j} 个文件,正文必须按事实需求把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:T,roleFacts:A,evidence:N,missingFacts:O,indexedFacts:[...ah,...ag],resolvedFactNeeds:$,factNeedsPrompt:function(a){let b=a.map(a=>{let b=a.facts.slice(0,5).map(b=>`${b.key||b.fieldName||a.need.label}=${a9(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${a9(a.content).slice(0,160)}${a.filePath?`(${e.basename(a.filePath)})`:""}`);return`- ${a.need.required?"必须":"相关"}|${a.need.label}|${a.status}${b.length||c.length?`:${[...b,...c].join(";")}`:":未在已解析资料中确认"}`});return b.length?`事实需求覆盖卡片:
174
+ ${b.join("\n")}`:""}($)}),an={total:$.length,satisfied:$.filter(a=>"satisfied"===a.status).length,missing:$.filter(a=>"missing"===a.status).length,lowConfidence:$.filter(a=>"low_confidence"===a.status).length};for(let a of _)ay.push(`${c.title}:事实需求未确认 ${a}`);let ao=T?.chapterRules.find(a=>a.id===c.id||a.title===c.title),ap=bD.chapterTargets.get(c.id)||1200,ar=Math.ceil(ap*(bD.maxChars?1.1:1.18)),as=bD.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*ap))):1200,az=Math.max(d?.minWords||0,ao?.minWords||0,T?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*ap),as),aA=b3(az,ap),aF=bD.longformStrict?1:.55,aG=bD.longformStrict?ap:2600,aH=Math.max(900,Math.min(ap,Math.ceil(ap*aF),aG)),aI=Math.max(450,Math.min(az,Math.floor(.72*aH))),aM=Math.max(aH+300,Math.min(ar,Math.ceil(1.25*aH))),aN=b3(aI,aH),aP=Math.min(b4(aH),3e5),aS=c.sections?.filter(Boolean).length||0,aT=/[、,,;;]/u.test(c.title),aU=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aS>=2&&(bD.longformStrict||!aT);G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aU?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aU?[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`目标字数:约 ${ap} 字,上限约 ${ar} 字`,`小节并发上限:${bE.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`目标字数:约 ${ap} 字,上限约 ${ar} 字`,`章节并发上限:${bP}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:a2.length,label:aU?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aV=Math.ceil((c.sections?.length||2)/Math.max(1,bE.maxSectionConcurrency||1)),aW=Math.max(b4(ap),Math.min(18e5,3e5*aV+18e4)),aX=aU?await B(()=>bk(bF,`chapter-section-draft:${c.id}`,()=>aR(b=>b2({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:W,projectContext:bb,requirement:a.requirement,roleContext:S,targetWords:ap,maxWords:ar,forbidDrawingImages:R,factCoverageContext:aj,projectRoot:o,modelName:aO,fileRolesHash:aQ,allowPartialResult:!1,maxSectionConcurrency:bE.maxSectionConcurrency,sectionEvidenceProvider:a=>cW({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:b}),diagnostics:bF,signal:b}),aW,a.signal))):await B(()=>bk(bF,`chapter-draft:${c.id}`,()=>aR(b=>bM(q,c,N,O,W,bb,a.requirement,S,{forbidDrawingImages:R,minWords:az,targetWords:ap,maxWords:ar,maxTokens:aA,factCoverageContext:aj,signal:b}),b4(ap),a.signal)));if(!aX&&aU?(G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${ap} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bk(bF,`chapter-draft-fallback:${c.id}`,()=>aR(b=>bM(q,c,N,O,W,bb,a.requirement,S,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aM,maxTokens:aN,factCoverageContext:aj,signal:b}),aP,a.signal)))):aX||(G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${ap} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bk(bF,`chapter-draft-fallback:${c.id}`,()=>aR(b=>bM(q,c,N,O,W,bb,a.requirement,S,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aM,maxTokens:aN,factCoverageContext:aj,signal:b}),aP,a.signal)))),aE(a.signal),aX||(G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${ap} 字`],progress:{current:g+1,total:a2.length,label:"紧凑兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bk(bF,`chapter-draft-compact-fallback:${c.id}`,()=>aR(b=>bM(q,c,N,O,W,bb,a.requirement,S,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*az)),targetWords:ap,maxWords:ar,maxTokens:aA,factCoverageContext:aj,signal:b}),b4(ap),a.signal)))),aE(a.signal),!aX)throw Error(`${c.title} 大模型未返回有效章节正文`);let aZ=cs(aX,c);if(aZ.length>0){let b=aX;G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿存在 ${aZ.length} 个小节缺口,正在定向补写`,details:aZ.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"小节补写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aX=await B(()=>bk(bF,`chapter-supplement:${c.id}`,()=>b9({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bb,requirement:a.requirement,roleContext:S,targetWords:ap,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:aZ,signal:a.signal})))}if((aZ=cs(aX,c)).length>0){G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次生成仍有 ${aZ.length} 个小节缺口,正在章节内强制补齐`,details:aZ.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"章节内小节补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aX;aX=await B(()=>bk(bF,`chapter-forced-section-supplement:${c.id}`,()=>b9({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bb,requirement:a.requirement,roleContext:S,targetWords:ap,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:aZ,signal:a.signal}))),aZ=cs(aX,c)}aZ.length>0&&(G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:aZ.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"保留可用章节"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let a$=bv({chapter:c,content:aX,missingFacts:O,targetWords:ap}),a_=(0,au.Ff)(a$);bF.quality.blockingCount+=a_.blocking,bF.quality.importantCount+=a_.important,bF.quality.minorCount+=a_.minor;let ba=bn(a$);if(ba.length>0){let b=aX;G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${ba.length} 个阻断问题`,details:ba,progress:{current:g+1,total:a2.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bk(bF,`chapter-repair:${c.id}`,()=>bw({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,..._.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:ba,promptTexts:W,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bF,signal:a.signal})));aX=d.content,d.appliedCount>0&&(bF.quality.repairedCount+=1),aE(a.signal)}if(!aX?.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bc=cu(aX,c),bd=0;if((0,at.V7)(bc)<Math.floor(.82*ap)||bn(bv({chapter:c,content:bc,missingFacts:O,targetWords:ap})).length>0){G[i]=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,at.V7)(bc)} 字 / 目标 ${Math.floor(.95*ap)} 字`,`章节并发:${bP}`],progress:{current:g+1,total:a2.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bk(bF,`chapter-expand:${c.id}`,()=>ca({template:q,chapter:c,content:aX,evidence:N,promptTexts:W,requirement:a.requirement,roleContext:S,targetChars:Math.floor(.95*ap),maxChars:ar,forbidDrawingImages:R,maxTokens:Math.min(aA,aN),signal:a.signal})));bc=cu(b.content,c),bd=b.rounds}bc=cK(bc,c);let be=(0,at.V7)(bc),bf=c.sections?.length?c.sections:aa(bc),bj=(0,au.qK)(bc,[{title:c.title,content:bc,sections:bf}]).map(a=>a.message),bl=[...bv({chapter:{...c,sections:bf},content:bc,missingFacts:O,targetWords:ap}),...bj],bm=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(be,ap,bl);f=bg({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:bm,message:bi(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${bd>0?`并定向扩写 ${bd} 轮`:""}:当前 ${be} 字 / 目标 ${Math.floor(.95*ap)} 字${"success"!==bm?`;风险:${bl.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(be/Math.max(1,Math.floor(.95*ap))*100)}%`,...Y,`二级小节:${bf.length} 个`,`扩写轮次:${bd}`],progress:{current:g+1,total:a2.length,label:"success"===bm?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aB.push(f);let bo={id:c.id,title:c.title,content:bc,evidence:N,missingFacts:O,sections:bf};u.push(bo),y(u);let bp=bv({chapter:c,content:bc,missingFacts:O,targetWords:ap}),bu=(0,au.Ff)(bp);bF.quality.blockingCount+=bu.blocking,bF.quality.importantCount+=bu.important,bF.quality.minorCount+=bu.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aA.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aB.push(bg({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,P.GQ)(c.title)} 生成失败`},{subtitle:(0,P.GQ)(c.title),order:g}))}f&&(G[i]=f),y(u)}))}if(u.sort((a,b)=>a2.findIndex(b=>b.id===a.id)-a2.findIndex(a=>a.id===b.id)),0===u.length)throw Error(`章节生成未完成:${aA.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<a2.length)throw Error(`OUTLINE 指定 ${a2.length} 章,实际只生成 ${u.length} 章:${aA.join(";")||"部分章节未生成"}`);aE(a.signal),bh(G,bg({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bR={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bR=await bL(o,aw,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bh(G,bR.stage),y(u),aE(a.signal),bR.notes))aw.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bZ=I(aw,{maxItems:Math.max(48,10*a2.length),maxChars:Math.max(52e3,9e3*a2.length),preservePinned:!0});aw.splice(0,aw.length,...bZ);let b$=function(a,b,c){let d={};for(let e of(0,D.Uy)(a,c)){let a=b.find(a=>(0,D.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(q,aw,T);for(let a of aK)for(let b of a.facts)b$[b.key]=`${aD(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b_=aU(aw,q,T),b0=a$(aw),b1=a_(aw,U),b5=aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aD(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b6={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,D.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aD(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aD(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...b5,...b_,...b0,...b1],q,T)){let b=I(aw,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b6=await aV(b,ag,q,T,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aE(a.signal);let b7=function(a,b){let c=b.find(a=>a.filePath)?.filePath||"";return c?a.map(a=>a.sourceFile?a:{...a,sourceFile:c,sourceRef:{filePath:c,roleId:a.sourceRef?.roleId||a.roleId,processingType:a.sourceRef?.processingType||a.processingType,sectionTitle:a.sourceRef?.sectionTitle,chunkIndex:a.sourceRef?.chunkIndex,cellRange:a.sourceRef?.cellRange}}):a}([...b5,...b_,...b0,...b1,...b6.facts],aw);for(let a of(bh(G,bR.stage),b6.stages))bh(G,a);y();let b8=aT(aw),cf=aw.filter(a=>"pinned-evidence"===a.source).length,cg=aw.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,ch=bg({type:"reference",roleId:"quality-enhancement",status:aw.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aw.length} 条,人工确认/固定证据 ${cf} 条,自动检索证据 ${cg} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(ch),y(),b7))b$[a.key]=`${aD(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ci=new Map;for(let a of aw)ci.set(a.filePath,(ci.get(a.filePath)??0)+1);let cj=new Map;for(let a of aw)cj.set(a.source||"unknown",(cj.get(a.source||"unknown")??0)+1);let ck=[...ci.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cl=ba(b7,b8,ay,T,U),cq=u.map(a=>{let b=T.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>T.factFields.find(b=>b.id===a)?.name).filter(Boolean),d=[...new Set([...a.missingFacts||[],...c].filter(Boolean))],e=d.filter(b=>!a.missingFacts.includes(b)),f=d.filter(b=>a.missingFacts.includes(b)),g=+(a.evidence.length>0),h=d.length?e.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:d,coveredFacts:e,missingFacts:f,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*h+.3*g)}}),ct=function(a,b=[],c){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&f.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===(0,d.zY)(c).length&&f.push("模板未绑定任何提示词");let g=new Set(b.map(a=>a.roleId));return c?.fileBindings?.some(a=>"rule"===a.roleId)&&!g.has("rule")&&e.push("rule 角色未抽取到结构化事实"),{passed:0===f.length,warnings:e,errors:f}}(u,b7,q);ct.warnings.push(...W.warnings),ct.errors.push(...W.blockingIssues);let cv=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(ct,cl,u);for(let a of(cv.push(...function(a){let b=[];for(let c of a)0===c.evidenceCount?b.push({level:"error",message:`章节缺少证据:${c.title}`,suggestion:"请补充对应绑定材料或调整模板章节检索词。"}):c.readinessRate<.5&&b.push({level:"warning",message:`章节事实覆盖率较低:${c.title} ${Math.round(100*c.readinessRate)}%`,suggestion:"建议补充章节 requiredFacts 或绑定材料证据。"});return b}(cq)),aK))for(let b of a.warnings)cv.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cw=bt(aK,q),cy=Date.now(),cz=(0,at.V7)(u.map(a=>a.content).join("\n\n"));bh(G,bg({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cz} 字`,details:[`章节数:${u.length}`,`目标:${bD.targetChars||bD.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cA=bE.enableDocumentBudgetExpansion?await B(()=>cb({template:q,chapters:u,budget:bD,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cw,signal:a.signal})):u;u.splice(0,u.length,...cA);let cB=u.map(a=>a.content).join("\n\n"),cC=cQ(u,b7,cB);cC.patchedCount>0&&(u.splice(0,u.length,...cC.chapters),cv.push({level:"info",message:`已自动补写未落位事实 ${cC.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cD=(0,at.fW)(bD,u.map(a=>a.content).join("\n\n")),cE=[bD.targetChars?`目标 ${bD.targetChars} 字${bD.minChars||bD.maxChars?`(区间 ${bD.minChars||0}-${bD.maxChars||"∞"} 字)`:""}`:void 0,bD.targetPages?`目标 ${bD.targetPages} 页${bD.minPages||bD.maxPages?`(区间 ${bD.minPages||0}-${bD.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bh(G,bg({type:"validation",roleId:"document-budget",status:bD.maxChars&&cD.currentChars>bD.maxChars||bD.minChars&&cD.currentChars<bD.minChars?"fallback":"success",message:bi(`文档预算:当前 ${cD.currentChars} 字,新增 ${Math.max(0,cD.currentChars-cz)} 字,预计 ${cD.estimatedPages} 页;${cE}`,cy)},{subtitle:"文档预算"})),y(u);let cF=aB.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cG=Math.max(0,a2.length-u.length);cF>0&&cv.push({level:"info",message:`章节生成存在补充完善:${cF} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cG>0&&cv.push({level:"error",message:`部分章节生成失败:${cG} 章`,suggestion:aA.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cM=cv.filter(a=>"error"===a.level&&(0,au.Nz)(a)).length,cN=[...G];bh(cN,bg({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${aw.length} 条,来源文件 ${ck.length} 份,结构化事实 ${b7.length} 条`,details:[`证据类型:${[...cj.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${an.usableChunkCount} 条,待索引 ${an.pendingJobs} 个,向量 ${an.vectorStatus?.status||"unknown"}`,cC.patchedCount>0?`自动补写事实:${cC.patchedCount}/${cC.missingCount}`:`事实落位补写:0/${cC.missingCount}`]},{subtitle:"资料使用报告"})),bh(cN,bg({type:"reference",roleId:"web-research-report",status:ax.enabled?"success":"skipped",message:ax.enabled?`联网增强:检索章节 ${new Set(ax.chapters).size} 个,查询 ${ax.queries.length} 个,使用公开资料 ${ax.evidenceCount} 条`:"联网增强未开启",details:ax.enabled?[`检索主题:${[...new Set(ax.queries)].join(";")||"无"}`,`过滤结果:${ax.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),bh(cN,bg({type:"validation",roleId:"document-workflow",status:cM>0?"failed":"success",message:`阻断 ${cM},错误 ${ct.errors.length},警告 ${ct.warnings.length}`},{subtitle:"最终规范校验"})),bh(cN,bg({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bh(cN,bg({type:"export_ready",roleId:"document-workflow",status:cM>0?"failed":"success",message:cM>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cO={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:b$,structuredFacts:b7,factsModel:cl,chapters:u,sources:ck,missingItems:[...new Set(ay)],validation:ct,validationIssues:cv,executionStages:cN,exportGate:{passed:0===cM,blockingIssues:cv.filter(a=>"error"===a.level&&(0,au.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,at.V7)(a.content),status:co(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},c$=as(cO,{forbidDrawingImages:cw,promptRules:ad});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b,c=ar(c$,u,{forbidDrawingImages:cw,promptRules:ad}).chapters.map(a=>{let b=a2.find(b=>b.id===a.id)||a;return{...a,content:cK(a.content,b)}}),d=cH(cx(cJ(ar(as({...cO,chapters:c},{forbidDrawingImages:cw,promptRules:ad}),c,{forbidDrawingImages:cw,promptRules:ad}).markdown),b7),b7),e=(a,b)=>{let c=[...cv];return c.push(...w({markdown:a,spec:T,summary:R})),c.push(...A({markdown:a,facts:b7,summary:R,profile:U})),c.push(...x(a,R)),c.push(...cI(a,b7)),ad.forbidToc||(c.push(...(0,au.gN)(a)),c.push(...(0,au.f8)(a))),c.push(...(0,au.K1)(a)),c.push(...(0,au.k0)(a)),c.push(...(0,au.qK)(a,b)),c.push(...(0,au.iC)(a)),c.push(...(0,au.BV)(a)),c.push(...ac(a)),c.push(...(0,au.Ty)(b)),c.push(...(0,au.N1)(a,cl)),c.push(...cn(a)),c.push(...(0,au.bM)(a)),c.push(...(0,au.M$)(a,J)),c.push(...(0,au.AC)(a,b)),c.push(...(0,au.mR)(a,q)),c.push(...(0,at.PE)(q.generationSettings||q.exportSettings,a).filter(a=>!(bD.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,at.ty)(bD,a)),c.push(...ap(a,q)),c.push(...ao(a,ad)),c},f=e(d,c),g=f.filter(a=>"error"===a.level||/提示词要求|正式表格|禁止内容|后台|占位|空小节|缺少规划小节|目录|封面/u.test(a.message)).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`).slice(0,24);if(g.length>0){let h=await B(()=>bk(bF,"default-path-quality-repair",()=>bx({markdown:d,template:q,chapters:c,promptTexts:af,requirement:a.requirement,issues:g,forbidDrawingImages:cw,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:g.length}),cN);b=h.stage?{...h.stage,message:`${h.stage.message||"默认路径质量修复完成"};触发问题 ${g.length} 个`}:void 0,h.chapters!==c&&(c=h.chapters.map(a=>{let b=a2.find(b=>b.id===a.id)||a;return{...a,sections:a.sections||[],content:cK(a.content,b)}}),f=e(d=cH(cx(cJ(ar(as({...cO,chapters:c},{forbidDrawingImages:cw,promptRules:ad}),c,{forbidDrawingImages:cw,promptRules:ad}).markdown),b7),b7),c))}let h=(0,au.Ai)(f,cl,c),i=cN.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:h.blockingIssues.length>0?"failed":"success",message:`阻断 ${h.blockingIssues.length},问题 ${f.length}`}:"export_ready"===a.type?{...a,status:h.passed?"success":"failed",message:h.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);b&&i.push(b),i.push(bg({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;默认路径已执行本地硬规则校验与必要的精准局部修复;如需开启重型复审请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let j=c.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cO,chapters:j,validationIssues:f,exportGate:h,executionStages:i,partialChapters:c.map(a=>({id:a.id,title:a.title,chars:(0,at.V7)(a.content),status:co(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:j,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bF},markdown:d}}aE(a.signal);let c_=u.map(a=>{let b=bv({chapter:a2.find(b=>b.id===a.id)||{id:a.id,title:a.title,purpose:"",queries:[],requiredFacts:[],sections:a.sections},content:a.content,missingFacts:a.missingFacts,targetWords:bD.chapterTargets.get(a.id)||1200}),c=b.some(a=>/缺少|空小节|只有标题|只有表格|正文篇幅明显低于目标|后台流程话术|占位|requiredFacts/u.test(a));return{chapterId:a.id,title:a.title,status:c?"fail":b.length>0?"warn":"pass",issues:b,suggestions:[],chars:(0,at.V7)(a.content)}}),c0=c_.filter(a=>"pass"!==a.status).length,c1=bE.enableChapterReview&&c0>0;c1&&(bh(cN,bg({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${c0}/${u.length} 章存在本地风险`,details:[`审查并发:${bE.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cN));let c2=c1?await B(()=>bk(bF,"chapter-review",()=>cc({template:q,chapters:u,budget:bD,promptTexts:ah||af,requirement:a.requirement,strategy:bE,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cN):{summaries:c_,stage:bg({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bE.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cN.push(c2.stage);let c3=c2.summaries,c4=c3.filter(a=>"pass"!==a.status&&a.issues.length>0);if(c4.length>0){bh(cN,bg({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${c4.length} 章`,details:c4.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:c4.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cN);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bE.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bE.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<c4.length;d+=e){aE(a.signal);let f=c4.slice(d,d+e);for(let d of(await Promise.all(f.map(async b=>{let c=u.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await aR(d=>bw({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:ah||af,requirement:a.requirement,forbidDrawingImages:cw,diagnostics:bF,signal:d}),9e4,a.signal);return{chapterId:b.chapterId,content:d?.content,appliedCount:d?.appliedCount||0}}catch{return{chapterId:b.chapterId,content:void 0,appliedCount:0}}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<u.length;a+=1){let c=b.get(u[a].id);c&&c!==u[a].content&&(u[a]={...u[a],content:c},g.add(u[a].id),f+=1)}f>0&&(c3=c3.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,at.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),c$=as({...cO,chapters:u,validationIssues:cv,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad})),cN.push(bg({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cN)}if(c1)for(let a of c3.filter(a=>"pass"!==a.status&&a.issues.length>0))cv.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let c5=bE.enableGlobalReview&&(c1||cv.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));c5&&(bh(cN,bg({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cN));let c6=c5?await B(()=>bk(bF,"global-consistency-review",()=>cd({template:q,chapters:u,chapterReviews:c3,promptTexts:ah||af,requirement:a.requirement,projectContext:bb,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cN):{issues:[],stage:bg({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bE.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cN.push(c6.stage),c6.issues))cv.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cN);let c7=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,at.V7)(a.content)<Math.floor(.7*(bD.chapterTargets.get(a.id)||1200))||c3.some(b=>b.chapterId===a.id&&"fail"===b.status)||bv({chapter:a2.find(b=>b.id===a.id)||{id:a.id,title:a.title,purpose:"",queries:[],requiredFacts:[],sections:a.sections},content:a.content,missingFacts:a.missingFacts,targetWords:bD.chapterTargets.get(a.id)||1200}).length>0),c8=cM>0||c6.issues.length>0||c3.some(a=>"fail"===a.status)||cv.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c9=bE.enableFinalQualityReview&&(c8||c7.length>Math.max(3,Math.floor(.35*u.length))),da=Date.now();c9&&(bh(cN,bg({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c7.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cN));let db=I(aw,{maxItems:Math.max(32,8*a2.length),maxChars:Math.max(36e3,6e3*a2.length),preservePinned:!0}),dc=c9?await B(()=>ce({template:q,spec:T,markdown:c$,evidence:db,promptTexts:ah||af,projectContext:bb,requirement:a.requirement,diagnostics:bF,signal:a.signal}),cN):{markdown:c$,stage:{type:"llm_review",roleId:"llm-review",status:c7.length>0?"fallback":"success",message:c7.length>0?`本地风险扫描发现 ${c7.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};dc.stage.message=bi(dc.stage.message||"LLM 审查完成",da),aE(a.signal);let dd=ar(dc.markdown===c$?as({...cO,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}):dc.markdown,u,{forbidDrawingImages:cw,promptRules:ad}).markdown,de=ap(dd,q).map(a=>a.message),df=(0,au.bM)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dg=(0,au.mR)(dd,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dh=(0,au.N1)(dd,cl).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),di=ad.forbidToc?[]:[...(0,au.gN)(dd),...(0,au.f8)(dd)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dj=(0,au.k0)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dk=(0,au.qK)(dd,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dl=(0,au.iC)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dm=(0,au.BV)(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dn=[...de,...df,...dg,...dh,...di,...dj,...dk,...dl,...dm,...(0,au.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...ac(dd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],dp=new Set(dk),dq=Date.now(),dr=dn.filter(a=>!dp.has(a));bh(cN,bg({type:"llm_review",roleId:"quality-repair",status:dr.length>0?"running":"success",message:dr.length>0?`正在进行精准质量修复:${dr.length} 个问题`:"未发现需要精准修复的问题",details:dr,progress:{current:1,total:Math.max(1,dr.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cN);let ds=await B(()=>bk(bF,"local-patch-quality-repair",()=>bx({markdown:dd,template:q,chapters:u,promptTexts:af,requirement:a.requirement,issues:dr,forbidDrawingImages:cw,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:dr.length}),cN);ds.stage&&(ds.stage.message=bi(ds.stage.message||"质量修复完成",dq)),aE(a.signal);let dt=ds.stage?[...cN,dc.stage,ds.stage]:[...cN,dc.stage],du=ds.chapters,dv=as({...cO,chapters:du,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),dw=(0,au.yw)(dv,du).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dw.length>0){let b=Date.now();bh(dt,bg({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dw.length} 个问题`,details:dw.map(a=>a.message),progress:{current:1,total:dw.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(du,dt);let c=[...du];for(let b=0;b<du.length;b+=bE.maxChapterConcurrency){aE(a.signal);let d=du.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dw.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=a2.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bD.chapterTargets.get(b.id)||1200,f=bq(d,a1);try{let g=await aR(g=>b9({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bb,requirement:a.requirement,roleContext:bs(aK,d,f),targetWords:e,forbidDrawingImages:cw,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=b.sections?.length?b.sections:aa(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}du=c;let d=(0,au.qK)(as({...cO,chapters:du,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),du);bh(dt,bg({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bi(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(du,dt)}let dx=(0,at.fW)(bD,du.map(a=>a.content).join("\n\n"));if(bE.enableDocumentBudgetExpansion&&bD.minChars&&dx.currentChars<Math.floor(.9*bD.minChars)&&(!bD.maxChars||dx.currentChars<bD.maxChars)){let b=Date.now(),c=dx.currentChars;bh(dt,bg({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bD.minChars} 字`,`章节数:${du.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(du,dt),du=await B(()=>cb({template:q,chapters:du,budget:bD,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cw,signal:a.signal}),dt);let d=(0,at.fW)(bD,du.map(a=>a.content).join("\n\n"));bh(dt,bg({type:"validation",roleId:"document-budget-repair",status:bD.minChars&&d.currentChars<bD.minChars?"fallback":"success",message:bi(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dy=ar(as({...cO,chapters:du,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),du,{forbidDrawingImages:cw,promptRules:ad}),dz=dy.chapters,dA=dy.markdown,dB=dz.map(a=>{let b=du.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dC=(0,au.yw)(dA,dB).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dC.length>0){let b=Date.now();bh(dt,bg({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dC.length} 个问题`,details:dC.map(a=>a.message),progress:{current:1,total:dC.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(dz,dt);let c=[...dz];for(let b=0;b<dz.length;b+=bE.maxChapterConcurrency){aE(a.signal);let d=dz.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dC.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=a2.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bD.chapterTargets.get(b.id)||1200,f=bq(d,a1);try{let g=await aR(g=>b9({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bb,requirement:a.requirement,roleContext:bs(aK,d,f),targetWords:e,forbidDrawingImages:cw,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=b.sections?.length?b.sections:aa(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dz=(dy=ar(as({...cO,chapters:c,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),c,{forbidDrawingImages:cw,promptRules:ad})).chapters,dA=dy.markdown;let d=(0,au.qK)(dA,dz);bh(dt,bg({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bi(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(dz,dt)}dz=(dy=ar(as({...cO,chapters:dz,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),dz,{forbidDrawingImages:cw,promptRules:ad})).chapters,dA=cH(cx(dy.markdown,b7),b7);let dD=be({facts:b7,markdown:dA});dD.size>0&&cN.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dD.size} 项`,details:[...dD.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dE=[...de];(cv=(0,au.kQ)(T,[...cv,...dE.map(a=>({level:"warning",message:a}))],cl,dz,dA,Q,J)).push(...w({markdown:dA,spec:T,summary:R})),cv.push(...A({markdown:dA,facts:b7,summary:R,profile:U})),cv.push(...x(dA,R)),cv.push(...cI(dA,b7)),ad.forbidToc||(cv.push(...(0,au.gN)(dA)),cv.push(...(0,au.f8)(dA))),cv.push(...(0,au.K1)(dA)),cv.push(...(0,au.k0)(dA)),cv.push(...(0,au.qK)(dA,dz)),cv.push(...(0,au.iC)(dA)),cv.push(...(0,au.BV)(dA)),cv.push(...ac(dA)),cv.push(...(0,au.Ty)(dz)),cv.push(...(0,au.N1)(dA,cl)),cv.push(...cn(dA)),cv.push(...(0,au.bM)(dA)),cv.push(...(0,au.M$)(dA,J)),cv.push(...(0,au.AC)(dA,dz)),cv.push(...(0,au.mR)(dA,q));let dF=cQ(dz,b7,dA);dF.patchedCount>0&&(dz=dF.chapters.map(a=>({...a,sections:a.sections||[]})),cv.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dF.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),dA=ar(as({...cO,chapters:dz,validationIssues:cv,exportGate:cO.exportGate,executionStages:cN},{forbidDrawingImages:cw,promptRules:ad}),dz,{forbidDrawingImages:cw,promptRules:ad}).markdown),cv.push(...function(a,b,c={}){return cP(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(dA,[...b7,...cl.preciseFacts],{maxIssues:30})),dA=ar(dA,dz,{forbidDrawingImages:cw,promptRules:ad}).markdown;let dG=(0,at.ty)(bD,dA),dH=(0,at.PE)(q.generationSettings||q.exportSettings,dA).filter(a=>!(bD.minPages&&/低于目标页数/u.test(a.message)));cv.push(...dH),cv.push(...dG),cv.push(...ap(dA,q)),cv.push(...ao(dA,ad));let dI=(0,au.Ai)(cv,cl,dz),dJ=dI.blockingIssues.length,dK=(0,au.Ff)(cv);bF.quality.blockingCount+=dK.blocking,bF.quality.importantCount+=dK.important,bF.quality.minorCount+=dK.minor;let dL=dt.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dJ>0?"failed":"success",message:`阻断 ${dJ},问题 ${cv.length}`}:"export_ready"===a.type?{...a,status:dI.passed?"success":"failed",message:dI.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bF.llm.currentLimit=aL();let dM=[...bF.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dL.push(bg({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bF.llm.calls} 次,失败 ${bF.llm.failures} 次,排队 ${bF.llm.throttledWaits} 次/${Math.round(bF.llm.throttledWaitMs/1e3)} 秒,检索 ${bF.evidence.searchQueries} 次/${Math.round(bF.evidence.searchMs/1e3)} 秒,证据上下文 ${bF.evidence.contextChars} 字,噪声过滤 ${bF.evidence.filteredNoise} 条,质量问题 阻断${bF.quality.blockingCount}/重要${bF.quality.importantCount}/轻微${bF.quality.minorCount},自动限流调整 ${bF.llm.limitAdjustments} 次${dM?`,Top耗时:${dM}`:""}`},{subtitle:"后台诊断"}));let dN=dz.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cO,chapters:dN,validationIssues:cv,exportGate:dI,executionStages:dL,partialChapters:dz.map(a=>({id:a.id,title:a.title,chars:(0,at.V7)(a.content),status:co(a,bD.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dN,reviewMetadata:{chapterSummaries:c3,globalIssues:c6.issues,diagnostics:bF}},markdown:dA}}async function c_(a){let b=(0,d.QJ)(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let f=e.resolve(a.projectRoot||(0,g.aY)());if(!f)throw Error("No knowledge base project found");let h=(0,g.Qh)(),j=(0,d.Vh)(b),k=bA(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>by(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>by(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=cZ(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=cT(c,c.queries,[]),s=cU(c,[]);for(let a of r.slice(0,s)){let b=await h.search(f,a,{scope:"project",filters:{filePaths:q},limit:Math.min(o,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});p.push(...b.results.filter(a=>bz(f,a.filePath,k)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:m.get(a.filePath),processingType:n.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let t=cS(c,p.filter(a=>bz(f,a.filePath,k)),{maxItems:cV(o,c),maxChars:16e3,preservePinned:!0}),u=a.currentMarkdown||"",v=new Set(a.existingFacts??[]),w=c.requiredFacts.filter(a=>!v.has(a)&&!t.some(b=>(0,D.Lk)(b,a))),x=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",u?`> 当前文档上下文摘要:${u.replace(/\s+/gu," ")}`:"",t.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",t.length>0?"### 资料依据":"",...t.map(J),"",w.length>0?"### 待确认事项":"",...w.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:x,evidence:t,missingFacts:w}}},44533:(a,b,c)=>{c.d(b,{Qh:()=>l,VS:()=>p,Yy:()=>o,aY:()=>n});var d=c(19898),e=c(87550),f=c.n(e),g=c(33873),h=c(21820),i=c(29021);let j=null;function k(){return g.join(h.homedir(),".customize-agent")}function l(){return j||(j=new d.MultiProjectManager(k())),j}function m(a){let b=g.resolve(a),c=g.resolve(g.join(h.homedir(),".customize-agent"));return!(i.existsSync(g.join(b,"pnpm-workspace.yaml"))&&i.existsSync(g.join(b,"apps","server")))&&(b===c||b.includes(`${g.sep}.customize-agent${g.sep}`)||b.endsWith(`${g.sep}apps${g.sep}server`)||b.endsWith(`${g.sep}apps${g.sep}cli`))}function n(){let a=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(a&&i.existsSync(a)&&!m(a))return g.resolve(a);let b=function(){let a=g.join(k(),"projects","registry.db");if(!i.existsSync(a))return[];let b=new(f())(a,{readonly:!0});try{return b.prepare("SELECT project_root FROM project_registry ORDER BY last_opened_at DESC").all().map(a=>g.resolve(a.project_root)).filter(a=>!m(a))}finally{b.close()}}();return b.length>0?b[0]:process.env.INIT_CWD&&!m(process.env.INIT_CWD)?process.env.INIT_CWD:g.resolve(process.cwd(),"../..")}function o(a,b={}){let c=new Map;for(let b of function(a){let b=g.join(h.homedir(),".customize-agent","projects",(0,d.computeProjectId)(g.resolve(a)),"kb.db");if(!i.existsSync(b))return[];let c=new d.IndexStateStore(b);try{return c.listRecords().map(a=>({...a,matchedBy:"metadata"}))}finally{c.close()}}(a))c.set(b.relativePath,b);for(let b of function(a){let b=g.join(a,"knowledgeBase");if(!i.existsSync(b))return[];let c=[],d=a=>{for(let e of i.readdirSync(a,{withFileTypes:!0})){let f=g.join(a,e.name);if(e.isDirectory()){d(f);continue}if(e.name.endsWith(".source.txt"))continue;let h=i.statSync(f),j=g.relative(b,f).split(g.sep).join("/");c.push({relativePath:j,category:j.includes("表格数据/")?"spreadsheet":j.includes("图片素材/")?"image":j.includes("图纸文件/")?"cad":j.includes("文档资料/")?"document":"other",format:g.extname(j).slice(1).toLowerCase()||"text",contentHash:"",fileSize:h.size,mtime:h.mtimeMs,chunkCount:0,collectionName:"",indexedAt:0,lastVerifiedAt:0,status:"disk",matchedBy:"disk"})}};return d(b),c}(a)){let a=c.get(b.relativePath);c.set(b.relativePath,a?{...a,fileSize:b.fileSize,mtime:b.mtime,matchedBy:"metadata"}:b)}return Array.from(c.values()).filter(a=>!b.category||a.category===b.category).sort((a,b)=>b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN"))}async function p(a,b={}){let c=(b.query||"").trim(),d=Math.max(1,Math.min(500,b.limit??50)),e=new Map,f=o(a,{category:b.category});for(let a of f)(!c||`${a.relativePath}
175
175
  ${a.category}
176
176
  ${a.format}
177
- ${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},52511:(a,b,c)=>{c.d(b,{Bh:()=>x,C1:()=>D,DX:()=>E,N6:()=>F,QJ:()=>w,Vh:()=>K,bV:()=>A,bj:()=>u,dU:()=>t,h0:()=>z,jG:()=>v,wR:()=>H,xm:()=>y,zY:()=>J});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753),j=c(6444),k=c(85441),l=c(81125),m=c(56942);function n(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function o(){return e.join(n(),"document-templates.json")}function p(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function q(){try{let a=o();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(p)}catch{return[]}}function r(a){d.writeFileSync(o(),JSON.stringify(a.map(p),null,2),"utf-8")}function s(a){let b=function(){try{let a=JSON.parse(d.readFileSync(e.join(n(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")}}}function t(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=s(c.promptId);a&&b.push({...a,roleId:c.roleId})}return b}function u(a){let b=G(a),c=(0,h.XB)("prompt"),d=J(a),e=[],f=[];if(b)for(let a of b.promptRoles){let b=c.find(b=>b.id===a.roleId);if(!b){e.push(a.roleId);continue}0===(b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]).length&&f.push(a.roleId)}let g=I(d),i=[];for(let a of g){let b=s(a.promptId);if(!b)continue;let d=c.find(b=>b.id===a.roleId),e=d?.executionType||function(a){var b;return b=a,/extract|extraction|抽取|清单|图纸|品牌/u.test(b)?"fact_extraction":/validation|校验|审查|审核/u.test(b)?"validation":/format|排版/u.test(b)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(b)?"chapter_generation":"reference"}(a.roleId),f=function(a,b,c=""){let d=`${a} ${b} ${c}`;return/extract|extraction|抽取|清单|图纸|品牌|识别/u.test(d)?"extraction":/format|排版/u.test(d)?"formatting":/总控|writer|施工组织设计总控|写作主控/u.test(d)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(d)?"chapter":"reference"}(a.roleId,e,b.name);i.push({...b,roleId:a.roleId,executionType:e,category:f,bindingSource:"projectRole"})}return{bindings:g,prompts:i,writerPrompts:i.filter(a=>"writer"===a.category),chapterPrompts:i.filter(a=>"chapter"===a.category),extractionPrompts:i.filter(a=>"extraction"===a.category),formattingPrompts:i.filter(a=>"formatting"===a.category),referencePrompts:i.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(e)],missingResourceRoles:[...new Set(f)]}}function v(){let a=(0,i.V)().templates,b=q().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function w(a){return v().find(b=>b.id===a)}function x(a){let b=p(a),c=q().filter(a=>a.id!==b.id);return c.push(b),r(c),b}async function y(a,b=(0,g.aY)()){let c,d=w(a),f=[];if(!d)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let i=(0,h.XB)("prompt"),n=(0,h.XB)("file"),o=F(d),p=G(d);o||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),o&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${o}`}),d.promptIds?.length&&f.push({level:"warning",message:"模板存在旧 promptIds 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.promptBindings?.length&&f.push({level:"warning",message:"模板存在旧 promptBindings 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.boundFilePaths?.length&&f.push({level:"warning",message:"模板存在旧 boundFilePaths 字段残留,生成只使用项目角色配置和显式文件角色绑定。"});let q=J(d),r=K(d);p&&0===p.promptRoles.length&&f.push({level:"error",message:"项目角色配置未配置提示词角色。"}),p&&p.promptRoles.length>0&&0===q.length&&f.push({level:"error",message:"项目角色配置中的提示词角色未绑定任何有效提示词资源。"});let s=e.resolve(b),u=(0,g.Yy)(s),v=function(a,b){if(0===a.length)return a;let c=new Set(b.map(a=>a.relativePath)),d=[],e=new Set;for(let f of a){let a=f.filePath.replace(/^\/+|\/+$/gu,"");for(let g of c.has(a)?[a]:b.filter(b=>{var c;return b.relativePath.startsWith(`${a}/`)&&"disk"!==(c=b).status&&"error"!==c.status&&Number(c.indexedAt||0)>0&&Number(c.chunkCount||0)>0}).map(a=>a.relativePath)){let a=`${f.roleId}
178
- ${g}`;e.has(a)||(e.add(a),d.push({...f,filePath:g}))}}return d}(r,u);0===r.length?f.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"}):0===v.length&&f.push({level:"error",message:"模板绑定的知识库文件或文件夹不存在,请重新选择项目文件绑定。"});let x=new Map(u.map(a=>[a.relativePath,a]));for(let a of p?.fileRoles||[]){let b=n.find(b=>b.id===a.roleId);if(!b){f.push({level:"error",message:`文件角色不存在:${a.roleId}`});continue}r.some(b=>b.roleId===a.roleId)||f.push({level:"warning",message:`项目角色配置包含文件角色但模板未绑定资料:${b.name}`})}let z=v.map(a=>{let b=n.find(b=>b.id===a.roleId),c=x.get(a.filePath);return b||f.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||f.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&f.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&f.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&f.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),A=t(q),B=new Set(p?.promptRoles.map(a=>a.roleId)||[]);for(let a of p?.promptRoles||[]){let b=i.find(b=>b.id===a.roleId);if(!b){f.push({level:"error",message:`提示词角色不存在:${a.roleId}`});continue}0===(b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]).length&&f.push({level:"error",message:`提示词角色未绑定资源:${b.name}`})}let C=q.map(a=>{let b=i.find(b=>b.id===a.roleId),c=A.find(b=>b.id===a.promptId);return b||f.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),B.has(a.roleId)||f.push({level:"error",message:`提示词绑定不属于当前项目角色配置:${a.roleId}`}),c||f.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&f.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});if(d){let a=(0,k.P)(s,{boundFilePaths:v.map(a=>a.filePath),boundFileRoles:H(v)}),b=(0,l.h)(d,a);for(let e of(c=(0,m.$)({template:d,spec:(0,j.x)(d).spec,summary:a,resolvedRoles:b})).blockingIssues)f.push({level:"error",message:`生成准备度不足:${e}`});for(let a of c.warnings)f.push({level:"warning",message:a})}return{templateId:a,projectRoleConfigId:o,fileDiagnostics:z,promptDiagnostics:C,readiness:c,issues:f}}function z(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");r(q().filter(b=>b.id!==a))}function A(a){let b=w(a);if(!b)throw Error("Document template not found");let c=p({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=q();return d.push(c),r(d),c}function B(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function C(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>B(b,a)))}function D(a,b){return C(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>B(a,b)))}function E(a,b){return C(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>B(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>B(a,b)))}function F(a){return a.projectRoleConfigId||void 0}function G(a){let b=F(a);return b?(0,h.Mu)(b):void 0}function H(a){let b=new Map,c=(0,h.XB)("file");for(let d of a){let a=c.find(a=>a.id===d.roleId),e=function(a=""){return"rule"===a?["requirement_document"]:"table"===a?["structured_data"]:"drawing"===a?["design_specification"]:"specification"===a?["technical_specification"]:["project_overview"]}(a?.processingType);b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...e])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function I(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function J(a){let b=G(a);if(!b)return[];let c=(0,h.XB)("prompt"),d=[];for(let a of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=c.find(b=>b.id===a.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[];b&&0!==e.length&&d.push(...e.map(a=>({promptId:a,roleId:b.id})))}return I(d)}function K(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},56942:(a,b,c)=>{c.d(b,{$:()=>h,R:()=>i});var d=c(81125),e=c(92808);function f(a){return[...new Set(a.filter(Boolean))]}function g(a){let b=(0,e.t0)(a,e.hW);return b.length>0?b:["project_overview"]}function h(a){var b,c,e;let h=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),i=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),j=(b=a.template,c=a.spec,e=a.summary,b.chapters.map(a=>{let b=function(a,b){let c=b.chapterRules.find(b=>b.id===a.id||b.title===a.title),d=(c?.requiredFactIds||[]).map(a=>b.factFields.find(b=>b.id===a)?.name).filter(Boolean);return f([...a.requiredFacts||[],...d])}(a,c),d=f([...g([a.title,a.purpose,...a.queries||[],...a.sections||[]].join("\n")),...b.flatMap(a=>g(a))]),h=d.filter(a=>(e.materialInventory[a]||[]).length>0),i=h.reduce((a,b)=>a+(e.materialInventory[b]||[]).length,0),j=b.filter(a=>g(a).some(a=>h.includes(a))),k=b.filter(a=>!j.includes(a)),l=b.length>0?j.length/b.length:1,m=d.length>0?h.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:b,coveredFacts:j,missingFacts:k,requiredRoles:d,satisfiedRoles:h,evidenceCount:i,readinessRate:Math.min(1,.5*l+.3*m+.2*(i>0))}})),k=[],l=[];0===a.template.chapters.length&&l.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&l.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&k.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&l.push("材料指纹置信度较低,建议绑定明确的材料文件"),0===a.summary.source.selectedFiles&&k.push("未绑定可用项目资料文件,无法支撑文档生成"),h.length>0&&0===a.summary.source.selectedFiles&&l.push("模板未绑定可用项目资料文件,请先绑定参与生成的资料"),i.length>0&&0===a.summary.source.selectedFiles&&l.push("绑定资料证据较弱,请确认资料已完成索引");let m=j.filter(a=>a.readinessRate<.5);m.length>0&&l.push(`章节级证据覆盖较弱:${m.slice(0,5).map(a=>`${a.title} ${Math.round(100*a.readinessRate)}%`).join("、")}`);let n=j.filter(a=>a.requiredFacts.length>0&&0===a.evidenceCount);n.length>0&&l.push(`部分章节缺少匹配证据:${n.slice(0,5).map(a=>a.title).join("、")}`);let o=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===k.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(0,d.o)(a.resolvedRoles),specCompletenessRate:o.filter(Boolean).length/o.length,missingRoles:h,weakRoles:i,chapterDiagnostics:j,blockingIssues:k,warnings:l}}function i(a,b={}){let c=a.chapterDiagnostics.filter(a=>a.readinessRate<.7||a.missingFacts.length>0).slice(0,8).map(a=>`${a.title}:${Math.round(100*a.readinessRate)}%,证据 ${a.evidenceCount} 条${a.missingFacts.length?`,缺失 ${a.missingFacts.slice(0,6).join("、")}`:""}`);return b.publicSafe?["## 生成事实使用边界",`资料覆盖程度:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足程度:${Math.round(100*a.roleSatisfactionRate)}%`,c.length?`章节证据风险:
177
+ ${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},52511:(a,b,c)=>{c.d(b,{Bh:()=>A,C1:()=>G,DX:()=>H,N6:()=>I,QJ:()=>z,Vh:()=>N,bV:()=>D,bj:()=>x,dU:()=>w,h0:()=>C,jG:()=>y,wR:()=>K,xm:()=>B,zY:()=>M});var d=c(73024),e=c(76760),f=c(48161),g=c(77598),h=c(44533),i=c(25840),j=c(8753),k=c(6444),l=c(85441),m=c(81125),n=c(56942);function o(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function p(){return e.join(o(),"document-templates.json")}function q(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function r(){try{let a=p();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(q)}catch{return[]}}function s(a){d.writeFileSync(p(),JSON.stringify(a.map(q),null,2),"utf-8")}function t(a){return(0,g.createHash)("sha256").update(a).digest("hex").slice(0,12)}function u(a){return a.replace(/\s+/gu," ").trim().slice(0,160)}function v(a){let b=function(){try{let a=JSON.parse(d.readFileSync(e.join(o(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content,source:"custom"}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8"),source:"file"}}}function w(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=v(c.promptId);a&&b.push({...a,roleId:c.roleId,contentHash:t(a.content),contentPreview:u(a.content)})}return b}function x(a){let b=J(a),c=(0,i.XB)("prompt"),d=M(a),e=[],f=[];if(b)for(let a of b.promptRoles){let b=c.find(b=>b.id===a.roleId);if(!b){e.push(a.roleId);continue}0===(b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]).length&&f.push(a.roleId)}let g=L(d),h=[];for(let a of g){let b=v(a.promptId);if(!b)continue;let d=c.find(b=>b.id===a.roleId),e=d?.executionType||function(a){var b;return b=a,/extract|extraction|抽取|清单|图纸|品牌/u.test(b)?"fact_extraction":/validation|校验|审查|审核/u.test(b)?"validation":/format|排版/u.test(b)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(b)?"chapter_generation":"reference"}(a.roleId),f=function(a,b,c=""){let d=`${a} ${b} ${c}`;return/extract|extraction|抽取|清单|图纸|品牌|识别/u.test(d)?"extraction":/format|排版/u.test(d)?"formatting":/总控|writer|施工组织设计总控|写作主控/u.test(d)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(d)?"chapter":"reference"}(a.roleId,e,b.name);h.push({...b,roleId:a.roleId,contentHash:t(b.content),contentPreview:u(b.content),executionType:e,category:f,bindingSource:"projectRole"})}return{bindings:g,prompts:h,writerPrompts:h.filter(a=>"writer"===a.category),chapterPrompts:h.filter(a=>"chapter"===a.category),extractionPrompts:h.filter(a=>"extraction"===a.category),formattingPrompts:h.filter(a=>"formatting"===a.category),referencePrompts:h.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(e)],missingResourceRoles:[...new Set(f)]}}function y(){let a=(0,j.V)().templates,b=r().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function z(a){return y().find(b=>b.id===a)}function A(a){let b=q(a),c=r().filter(a=>a.id!==b.id);return c.push(b),s(c),b}async function B(a,b=(0,h.aY)()){let c,d=z(a),f=[];if(!d)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let g=(0,i.XB)("prompt"),j=(0,i.XB)("file"),o=I(d),p=J(d);o||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),o&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${o}`}),d.promptIds?.length&&f.push({level:"warning",message:"模板存在旧 promptIds 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.promptBindings?.length&&f.push({level:"warning",message:"模板存在旧 promptBindings 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.boundFilePaths?.length&&f.push({level:"warning",message:"模板存在旧 boundFilePaths 字段残留,生成只使用项目角色配置和显式文件角色绑定。"});let q=M(d),r=N(d);p&&0===p.promptRoles.length&&f.push({level:"error",message:"项目角色配置未配置提示词角色。"}),p&&p.promptRoles.length>0&&0===q.length&&f.push({level:"error",message:"项目角色配置中的提示词角色未绑定任何有效提示词资源。"});let s=e.resolve(b),t=(0,h.Yy)(s),u=function(a,b){if(0===a.length)return a;let c=new Set(b.map(a=>a.relativePath)),d=[],e=new Set;for(let f of a){let a=f.filePath.replace(/^\/+|\/+$/gu,"");for(let g of c.has(a)?[a]:b.filter(b=>{var c;return b.relativePath.startsWith(`${a}/`)&&"disk"!==(c=b).status&&"error"!==c.status&&Number(c.indexedAt||0)>0&&Number(c.chunkCount||0)>0}).map(a=>a.relativePath)){let a=`${f.roleId}
178
+ ${g}`;e.has(a)||(e.add(a),d.push({...f,filePath:g}))}}return d}(r,t);0===r.length?f.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"}):0===u.length&&f.push({level:"error",message:"模板绑定的知识库文件或文件夹不存在,请重新选择项目文件绑定。"});let v=new Map(t.map(a=>[a.relativePath,a]));for(let a of p?.fileRoles||[]){let b=j.find(b=>b.id===a.roleId);if(!b){f.push({level:"error",message:`文件角色不存在:${a.roleId}`});continue}r.some(b=>b.roleId===a.roleId)||f.push({level:"warning",message:`项目角色配置包含文件角色但模板未绑定资料:${b.name}`})}let x=u.map(a=>{let b=j.find(b=>b.id===a.roleId),c=v.get(a.filePath);return b||f.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||f.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&f.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&f.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&f.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),y=w(q),A=new Set(p?.promptRoles.map(a=>a.roleId)||[]);for(let a of p?.promptRoles||[]){let b=g.find(b=>b.id===a.roleId);if(!b){f.push({level:"error",message:`提示词角色不存在:${a.roleId}`});continue}0===(b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]).length&&f.push({level:"error",message:`提示词角色未绑定资源:${b.name}`})}let C=q.map(a=>{let b=g.find(b=>b.id===a.roleId),c=y.find(b=>b.id===a.promptId);return b||f.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),A.has(a.roleId)||f.push({level:"error",message:`提示词绑定不属于当前项目角色配置:${a.roleId}`}),c||f.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&f.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,promptSource:c?.source,contentLength:c?.content.length??0,contentHash:c?.contentHash,contentPreview:c?.contentPreview,exists:!!c}});if(d){let a=(0,l.P)(s,{boundFilePaths:u.map(a=>a.filePath),boundFileRoles:K(u)}),b=(0,m.h)(d,a);for(let e of(c=(0,n.$)({template:d,spec:(0,k.x)(d).spec,summary:a,resolvedRoles:b})).blockingIssues)f.push({level:"error",message:`生成准备度不足:${e}`});for(let a of c.warnings)f.push({level:"warning",message:a})}return{templateId:a,projectRoleConfigId:o,fileDiagnostics:x,promptDiagnostics:C,readiness:c,issues:f}}function C(a){if(new Set((0,j.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");s(r().filter(b=>b.id!==a))}function D(a){let b=z(a);if(!b)throw Error("Document template not found");let c=q({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=r();return d.push(c),s(d),c}function E(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function F(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,j.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>E(b,a)))}function G(a,b){return F(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>E(a,b)))}function H(a,b){return F(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>E(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>E(a,b)))}function I(a){return a.projectRoleConfigId||void 0}function J(a){let b=I(a);return b?(0,i.Mu)(b):void 0}function K(a){let b=new Map,c=(0,i.XB)("file");for(let d of a){let a=c.find(a=>a.id===d.roleId),e=function(a=""){return"rule"===a?["requirement_document"]:"table"===a?["structured_data"]:"drawing"===a?["design_specification"]:"specification"===a?["technical_specification"]:["project_overview"]}(a?.processingType);b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...e])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function L(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function M(a){let b=J(a);if(!b)return[];let c=(0,i.XB)("prompt"),d=[];for(let a of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=c.find(b=>b.id===a.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[];b&&0!==e.length&&d.push(...e.map(a=>({promptId:a,roleId:b.id})))}return L(d)}function N(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},56942:(a,b,c)=>{c.d(b,{$:()=>h,R:()=>i});var d=c(81125),e=c(92808);function f(a){return[...new Set(a.filter(Boolean))]}function g(a){let b=(0,e.t0)(a,e.hW);return b.length>0?b:["project_overview"]}function h(a){var b,c,e;let h=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),i=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),j=(b=a.template,c=a.spec,e=a.summary,b.chapters.map(a=>{let b=function(a,b){let c=b.chapterRules.find(b=>b.id===a.id||b.title===a.title),d=(c?.requiredFactIds||[]).map(a=>b.factFields.find(b=>b.id===a)?.name).filter(Boolean);return f([...a.requiredFacts||[],...d])}(a,c),d=f([...g([a.title,a.purpose,...a.queries||[],...a.sections||[]].join("\n")),...b.flatMap(a=>g(a))]),h=d.filter(a=>(e.materialInventory[a]||[]).length>0),i=h.reduce((a,b)=>a+(e.materialInventory[b]||[]).length,0),j=b.filter(a=>g(a).some(a=>h.includes(a))),k=b.filter(a=>!j.includes(a)),l=b.length>0?j.length/b.length:1,m=d.length>0?h.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:b,coveredFacts:j,missingFacts:k,requiredRoles:d,satisfiedRoles:h,evidenceCount:i,readinessRate:Math.min(1,.5*l+.3*m+.2*(i>0))}})),k=[],l=[];0===a.template.chapters.length&&l.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&l.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&k.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&l.push("材料指纹置信度较低,建议绑定明确的材料文件"),0===a.summary.source.selectedFiles&&k.push("未绑定可用项目资料文件,无法支撑文档生成"),h.length>0&&0===a.summary.source.selectedFiles&&l.push("模板未绑定可用项目资料文件,请先绑定参与生成的资料"),i.length>0&&0===a.summary.source.selectedFiles&&l.push("绑定资料证据较弱,请确认资料已完成索引");let m=j.filter(a=>a.readinessRate<.5);m.length>0&&l.push(`章节级证据覆盖较弱:${m.slice(0,5).map(a=>`${a.title} ${Math.round(100*a.readinessRate)}%`).join("、")}`);let n=j.filter(a=>a.requiredFacts.length>0&&0===a.evidenceCount);n.length>0&&l.push(`部分章节缺少匹配证据:${n.slice(0,5).map(a=>a.title).join("、")}`);let o=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===k.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(0,d.o)(a.resolvedRoles),specCompletenessRate:o.filter(Boolean).length/o.length,missingRoles:h,weakRoles:i,chapterDiagnostics:j,blockingIssues:k,warnings:l}}function i(a,b={}){let c=a.chapterDiagnostics.filter(a=>a.readinessRate<.7||a.missingFacts.length>0).slice(0,8).map(a=>`${a.title}:${Math.round(100*a.readinessRate)}%,证据 ${a.evidenceCount} 条${a.missingFacts.length?`,缺失 ${a.missingFacts.slice(0,6).join("、")}`:""}`);return b.publicSafe?["## 生成事实使用边界",`资料覆盖程度:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足程度:${Math.round(100*a.roleSatisfactionRate)}%`,c.length?`章节证据风险:
179
179
  ${c.join("\n")}`:"","资料不足的事实不得编造;仅施工组织、计划安排、资源配置类数据可在文档要求允许时进行计划推导并标注。"].filter(Boolean).join("\n"):["## 后台生成准备度",`可生成:${a.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*a.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*a.specCompletenessRate)}%`,a.missingRoles.length?`资料诊断:部分模板期望资料类型未从绑定文件中明确识别,生成时仅使用已绑定资料中的事实`:"",a.weakRoles.length?`资料诊断:部分资料类型证据较弱,生成时不得补写资料未明确的事实`:"",c.length?`章节级证据风险:
180
180
  ${c.join("\n")}`:""].filter(Boolean).join("\n")}},58965:(a,b,c)=>{c.d(b,{$m:()=>f,VX:()=>d,tK:()=>e});let d=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,e=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,f="[零〇一二三四五六七八九十百千万两]+"},70208:(a,b,c)=>{c.d(b,{GQ:()=>n,Ui:()=>l,YZ:()=>o,_9:()=>t,bE:()=>p,bl:()=>k,cs:()=>m,tb:()=>q});var d=c(58965),e=c(52511);function f(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${d.$m})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${d.$m})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")}function g(a){let b=f(a).replace(/\s+/gu,"");return!!(!b||/^(?:目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位|提示)$/u.test(b)||/^(?:判断|判定|识别|确认)?是否(?:涉及|涉|需要|适用)|^(?:如|若|如果)(?:涉及|不涉及|适用|不适用)|(?:根据|结合).{0,12}(?:实际情况|项目情况|资料情况).{0,8}(?:判断|确定|编写|生成)|按需(?:生成|编写)|视情况|判断后|生成要求|编写要求|说明要求|注意事项/u.test(b)||/[::]$|[,、;。]$/u.test(b))}function h(a){return 0===a.trim().length||g(a)}let i="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",j=RegExp(`<\\s*${i}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${i}\\s*>`,"giu");function k(a){return RegExp(`^\\s*<\\s*${i}(?:\\s[^>]*)?>`,"iu").test(a)}function l(a){return RegExp(`^\\s*<\\/\\s*${i}\\s*>`,"iu").test(a)}function m(a){for(let b of a){let a=function(a,b,c){let e=[];for(let g of function(a,b){j.lastIndex=0;let c=[...a.matchAll(j)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>|END\s+(?:OUTLINE|CHAPTERS?)|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${d.$m}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],e=a.replace(/\r?\n/gu,"\n");for(let a of c)e=(e=(e=e.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return e.split(/\n|;|;/u).map(a=>f(a)).filter(a=>!h(a))}(g))e.push({id:`explicit-${b}-${e.length+1}`,title:a,purpose:`根据显式大纲章节生成正式正文:${a}`,requiredFacts:[],sections:[],queries:[a]});return e.filter(a=>!h(a.title))}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}function n(a){let b=a.replace(/^#+\s*/u,"").trim(),c="";for(;b&&b!==c;)c=b,b=b.replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]+/u,"").replace(/^[((]?[一二三四五六七八九十]+[))、..\s]+/u,"").trim();return b}function o(a){return n(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function p(a){let b=a.trim(),c=o(b);return!(!c||c.length<2||c.length>50||/^#{3,6}\s*/u.test(b)||/^\|.*\|/u.test(b)||/\|/u.test(c)||/^[,,、;;::。.!!??\-—]/u.test(b)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(c)||/[。;;]$/u.test(c)||/[::]\s*[。;;]?$/u.test(c)||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(c)||g(c)||/(评标委员会|完全满足评审要求|全面梳理与响应|坚实的技术保障)/u.test(c))&&!r(c)}function q(a,b){let c=n(b);return`第${function(a){let b=["零","一","二","三","四","五","六","七","八","九"];if(a<=10)return 10===a?"十":b[a];if(a<20)return`十${b[a%10]}`;if(a<100){let c=Math.floor(a/10),d=a%10;return`${b[c]}十${d?b[d]:""}`}return String(a)}(a+1)}章 ${c}`}function r(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function s(a,b){let c=new Set;return a.filter(a=>{let d=o(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||r(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function t(a,b,c){return!b||c?.preserveExplicitOutline?s([...a.chapters],{...c,template:a}):s([...a.chapters].map(a=>{let c=n(a.title),d=b.chapterRules.find(b=>b.id===a.id||n(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}},78217:(a,b,c)=>{function d(a,b){return Math.ceil(e(a)/f(b))}function e(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function f(a){let b=Number(String(a&&"typography"in a&&a.typography?.bodySize||"").replace(/[^\d.]/gu,""))||14,c=Number(String(a&&"typography"in a&&a.typography?.lineHeight||"").replace(/[^\d.]/gu,""))||22;return b>=14&&c>=22?900:1050}function g(a){let b=a.trim();if(/^\d+(?:\.\d+)?$/u.test(b))return Number(b);let c={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if("十"===b)return 10;let d=/^([一二两三四五六七八九])?十([一二三四五六七八九])?$/u.exec(b);if(d)return(d[1]?c[d[1]]:1)*10+(d[2]?c[d[2]]:0)}function h(a="",b=""){let c=`${a}${b}`;return/不少于|至少|不低于|以上|起码/u.test(c)?"minimum":/约|大概|左右|大约|约为|附近/u.test(c)?"approximate":"exact"}function i(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function j(a){let b=a.template.generationSettings||a.template.exportSettings,c=f(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)\s*(以上|左右|以内|以下)?/gu)],d=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)\s*(以上|左右|以内|以下)?/gu)],e=c.map(a=>{let b=g(a[2]||"");return Number.isFinite(b)?{value:b,mode:h(a[1],a[3])}:void 0}).filter(a=>!!a).at(-1),f=d.map(a=>{let b=g(a[2]||"");return b?{value:Math.round(b*(a[3]?1e4:1)),mode:h(a[1],a[4])}:void 0}).filter(a=>!!a).at(-1);return{targetPages:e?.value,pageMode:e?.mode,targetChars:f?.value,charMode:f?.mode}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),j=e?void 0:b?.targetPages?.target||b?.targetPages?.min,k=d.targetPages?d.targetPages*c:void 0,l=d.targetPages||j,m=e?"explicit":j?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",n=e?Math.max(d.targetChars||0,k||0)||void 0:Math.max((j?j*c:void 0)||0)||void 0,o=d.pageMode||"exact",p=d.charMode||o,q=e&&"approximate"===p,r=e&&"minimum"===p,s=e?l?Math.floor(l*(r?1:.9)):void 0:b?.targetPages?.min||(l?Math.floor(.95*l):void 0),t=e&&l&&!r?Math.ceil(l*(q?1.15:1.08)):b?.targetPages?.max,u=n?Math.floor(n*(r?1:.9)):s?s*c:void 0,v=n&&!r?Math.ceil(n*(q?1.15:1.08)):t?t*c:void 0,w=a.chapters.length>0?a.chapters:a.template.chapters,x=w.reduce((a,b)=>a+i(b),0)||1,y=new Map,z=w.map(a=>({chapter:a,target:n?Math.round(n*i(a)/x):0})),A=w.reduce((b,c)=>b+Math.max(a.spec?.chapterRules.find(a=>a.id===c.id||a.title===c.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200),0),B=n&&A>.92*n?Math.max(.45,.92*n/A):1;for(let{chapter:b,target:c}of z){let d=Math.floor(Math.max(Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0),n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200)*B);y.set(b.id,Math.max(d,c))}let C=!!(e&&(r||"exact"===p)&&(n||u||0)>=4e4);return{targetPages:l,minPages:s,maxPages:t,targetChars:n,minChars:u,maxChars:v,charsPerPage:c,chapterTargets:y,source:m,mode:p,longformStrict:C}}function k(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let e=d(b,a),f=c.min||c.target,g=c.max||c.target,h=[];return f&&e<f&&h.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${e} 页,目标不少于 ${f} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),g&&e>g+4&&h.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${e} 页,目标不超过 ${g} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),h}function l(a,b){let{currentChars:c,estimatedPages:d}=m(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.maxChars&&c>Math.ceil(1.12*a.maxChars)?e.push({level:"error",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"请压缩重复段落、过细小节或过度展开内容后再导出。"}):a.maxChars&&c>a.maxChars&&e.push({level:"warning",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"建议减少重复段落、过细小节或过度展开内容。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),a.maxPages&&d>a.maxPages&&e.push({level:"warning",message:`正文篇幅超过目标页数区间:预计约 ${d} 页,建议不超过 ${a.maxPages} 页`,suggestion:"建议压缩过度展开内容或调整目标页数。"}),e}function m(a,b){let c=e(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}c.d(b,{Cv:()=>d,PE:()=>k,V7:()=>e,fW:()=>m,tF:()=>j,ty:()=>l})},81125:(a,b,c)=>{c.d(b,{h:()=>e,o:()=>f});var d=c(92808);function e(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","scope_description"]);return/需求|规则|响应|方案|实施|专项|安全|质量|进度|合规/iu.test(b)&&["requirement_document","structured_data","schedule_quality_safety"].forEach(a=>c.add(a)),/设计|方案|说明|图像|地图|附件/iu.test(b)&&c.add("design_specification"),c}(a);return(function(a){let b=[a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),c=new Set((0,d.t0)(b,d.hW));return c.add("project_overview"),c.add("scope_description"),[...c]})(a).map(a=>{let d=b.materialInventory[a]||[],e=c.has(a),f=d.length>0,g=f&&d.length<(e?2:1);return{role:a,required:e,satisfied:f,weak:g,evidenceCount:d.length,filePaths:d.map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}function f(a){return a.length?a.filter(a=>a.satisfied).length/a.length:1}},85441:(a,b,c)=>{c.d(b,{F:()=>u,P:()=>s});var d=c(76760),e=c(44533),f=c(92808);let g=["project_overview","requirement_document","addendum","structured_data","design_specification","schedule_quality_safety","scope_description"],h=["project_overview","requirement_document","addendum","structured_data","budget_cost","design_specification","resource_recommendation","schedule_quality_safety","scope_description","technical_specification","risk_constraints"];function i(a){let b=[];for(let c of a)for(let a of c.relativePath.split(/[\\/]/gu))a&&b.push(a);return b}function j(a){return/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(a)}function k(a){return m(a).replace(/^\d+(?:\.\d+)?[-_\s]*/u,"").replace(/^(?:延期到\d+(?:\.\d+)?[-_—–\s]*)+/u,"").trim()}function l(a){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function m(a){return a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()}function n(a){let b=new Set,c=[];for(let d of i(a)){let a=k(d);!(!/项目|任务|文档|合同|计划|方案|工程/iu.test(a)||a.length<6||b.has(a))&&(!j(a)||/\.\w+$/u.test(d))&&(b.add(a),c.push(a))}return c}function o(a,b){return 0===a.length?b:a.map(a=>m(a.fileName)).join("、")}function p(a,b,c){b.lastIndex=0;let d=new Set,e=[];for(let f of a.matchAll(b)){let a=(f[c]||"").trim();!a||d.has(a)||(d.add(a),e.push(a))}return b.lastIndex=0,e}function q(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function r(a){let b=q(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function s(a,b){let c=(0,e.Yy)(a),m=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(q)),e=c.filter(a=>d.has(q(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>r(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板显式绑定文件作为资料范围",ambiguous:!1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=r(b.relativePath);if(!c)continue;let d=function(a,b){let c=0;for(let d of a.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u)){let a=d.trim();a.length>=2&&b.includes(a)&&(c+=1)}return c}(c,f);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>r(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>r(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>r(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),s=m.files,t=function(){let a={};for(let b of h)a[b]=[];return a}(),u=new Map((b?.boundFileRoles||[]).map(a=>[q(a.filePath),a.roles]));for(let a of s){let b=q(a.relativePath),c=[...u.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set((0,f.t0)(a,f.hW));return b.add("project_overview"),[...b]}(a.relativePath),...c])])t[b].push({filePath:a.relativePath,fileName:d.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let v=function(a){let b,c;for(let d of i(a)){let a=k(d);if(/项目|工程/iu.test(a)&&!(a.length<6)){if(/\.\w+$/u.test(d)){b||=a;continue}if(j(a)){c||=a.split(/--/u).filter(a=>/项目|工程/u.test(a)).sort((a,b)=>a.length-b.length)[0]||a;continue}return a}}return b||c||"当前知识库项目"}(s),w=function(a){for(let b of a){let a=b.relativePath.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0];if(a)return a}}(s),x=function(a,b){let c=n(a),d=n(b),e=l(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=l(a.map(a=>r(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,documentNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a))}}(s,c),y=function(a){let b=function(a){let b="";for(let c of a)b+=`${c.relativePath}
181
181
  `;return b}(a);return{ownerNames:p(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:p(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:p(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:p(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(s),z=g.filter(a=>t[a].length>0),A=g.filter(a=>0===t[a].length);return{projectId:v.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:v,generatedAt:Date.now(),fingerprint:x.fingerprint,contaminationCandidates:x.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:s.length,selectionReason:m.reason,ambiguous:m.ambiguous},facts:{projectName:v,documentNo:w,scopeDescriptions:t.scope_description.map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(t.scope_description.concat(t.design_specification,t.structured_data).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:t.schedule_quality_safety.length?"已识别周期、质量、安全或合规相关资料,生成时应以需求文件、变更说明和技术要求为准。":void 0,qualityRequirement:t.schedule_quality_safety.length?"已识别质量或评价相关资料。":void 0,safetyRequirement:t.schedule_quality_safety.length?"已识别安全或合规相关资料。":void 0,materialBrandRequirement:t.resource_recommendation.length?"已识别资源、材料、设备或品牌相关资料。":void 0,ownerNames:y.ownerNames,locationNames:y.locationNames,scheduleValues:y.scheduleValues,qualityTargets:y.qualityTargets},materialInventory:t,extractedSections:{projectOverview:`绑定材料组:${v}${w?`,文档/任务编号:${w}`:""}。`,scopeSummary:`范围资料:${o(t.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${o(t.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${o(t.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${o(t.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${o(t.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:g,satisfiedRoles:z,missingRoles:A,materialCompletenessRate:g.length?z.length/g.length:1}}}function t(a){return a.replace(/OCR|识别错误|乱码/giu,"资料文字不清").replace(/知识库|提示词|后台|绑定片段|兜底/gu,"项目资料").replace(/PDF|DWG|Excel|XLSX?|DOCX?/giu,"资料文件")}function u(a,b={}){return b.publicSafe?["## 项目资料事实边界",t(a.extractedSections.projectOverview),`明确事实:责任主体 ${a.facts.ownerNames?.join("、")||"资料未明确"};地点 ${a.facts.locationNames?.join("、")||"资料未明确"};周期 ${a.facts.scheduleValues?.join("、")||"资料未明确"};质量 ${a.facts.qualityTargets?.join("、")||"资料未明确"}。`,t(a.extractedSections.scopeSummary),t(a.extractedSections.structuredDataSummary),t(a.extractedSections.designSummary),t(a.extractedSections.scheduleQualitySafetySummary),t(a.extractedSections.constraintsAndRisks),"仅使用资料中明确、可信的事实;资料未明确的工程实体事实不得推导,允许推导的计划配置类数据须明确标注为计划配置值。"].filter(Boolean).join("\n"):["## 后台绑定材料摘要",a.extractedSections.projectOverview,`材料指纹:对象名候选 ${a.fingerprint.projectNames.join("、")||"无"};编号 ${a.fingerprint.documentNos.join("、")||"无"};资料组 ${a.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*a.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${a.facts.ownerNames?.join("、")||"无"};地点 ${a.facts.locationNames?.join("、")||"无"};周期 ${a.facts.scheduleValues?.join("、")||"无"};质量 ${a.facts.qualityTargets?.join("、")||"无"}。`,a.extractedSections.scopeSummary,a.extractedSections.structuredDataSummary,a.extractedSections.designSummary,a.extractedSections.scheduleQualitySafetySummary,a.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*a.coverage.materialCompletenessRate)}%`].join("\n")}},91977:(a,b,c)=>{c.d(b,{I2:()=>g,Lk:()=>e,Uy:()=>f});var d=c(70208);function e(a,b){let c=`${a.filePath}