@customize-agent/server 4.0.120 → 4.0.122
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.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +4 -4
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/6041.js +38 -52
- package/.next/server/chunks/8661.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +21 -21
- package/.next/static/chunks/pages/{documents-00c3141dc75a0187.js → documents-0b6dad727c4dfd9b.js} +1 -1
- package/.next/static/css/{6b48c108e9522e06.css → 9daa4d0938f1a323.css} +1 -1
- package/.next/static/{WY056Im8sR0Ppk124MSM_ → m8qnV2-RFXCUnM7-Rz-Op}/_buildManifest.js +1 -1
- package/package.json +3 -3
- /package/.next/static/{WY056Im8sR0Ppk124MSM_ → m8qnV2-RFXCUnM7-Rz-Op}/_ssgManifest.js +0 -0
|
@@ -7,9 +7,9 @@
|
|
|
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:()=>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}
|
|
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)||/规划小节正文过短|正文缺少规划小节|缺少规划小节|小节内容补写未完成|空小节|小节只有标题|只有标题或表格无正文|小节生成未达标|生成未完成/u.test(a.message))||!(!j(a)||/章节审查|最终质量审查|正文篇幅明显低于目标|正文存在空泛占位表达|结构化事实读取不足|正文可能未显式覆盖|仅包含文件类型和占位符|不在本次招标范围内/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(/【本小节生成未达标,需重新生成】/u.test(d))return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"empty",planned:f,message:`${a} 小节生成未达标:${b}`};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:"error",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(/【本小节生成未达标,需重新生成】/u.test(a)&&b.push({level:"error",message:"生成未完成:存在未达标小节,需要重新生成或补写后才能导出",suggestion:"请重新生成未达标小节,禁止将占位内容作为正式正文。"}),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:()=>
|
|
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:()=>c6,jGg:()=>d.jG,R1O:()=>c7,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"}
|
|
@@ -94,27 +94,31 @@ ${b}`:"",`请输出 ${e}-${f} 个适合直接成稿的二级小节标题。标
|
|
|
94
94
|
${g.join("\n")}
|
|
95
95
|
成稿要求:1)至少自然写入其中 2 条资料事实;2)如存在数字、规格、标准编号、数量、工期,必须至少原样写入 1 条;3)围绕“资料依据—对象范围—实施做法—检查验收/闭环”展开,不得写成“结合实际、按规范执行”的泛化空话;4)不得改写、换算或编造资料未提供的参数。`:""}}async function b8(a){let b=bQ(a.sectionTitle,a.chapter,a.evidence),c=b7(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?`上下文:
|
|
96
96
|
${a.projectContext}`:"",a.factCoverageContext||"",c.prompt,a.roleContext,a.missingFacts.length?`需要特别补足的信息:${a.missingFacts.join("、")}`:"",a.qualityFeedback?`上轮小节未通过质量检查,必须修正:${a.qualityFeedback}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,"本章二级小节结构已由系统按模板和提示词锁定;不得删除、重命名、合并或重排当前小节标题。",Z,d?`绑定材料:
|
|
97
|
-
${d}`:""].filter(Boolean).join("\n\n"),f=(b=a.signal)=>aR(["你是专业文档的小节生成专家。",Y,a.promptTexts].filter(Boolean).join("\n\n"),e,!1,{maxTokens:Math.min(
|
|
97
|
+
${d}`:""].filter(Boolean).join("\n\n"),f=(b=a.signal)=>aR(["你是专业文档的小节生成专家。",Y,a.promptTexts].filter(Boolean).join("\n\n"),e,!1,{maxTokens:Math.min(ce(a.targetWords),Math.max(1800,Math.ceil(1.8*a.targetWords))),temperature:.25,signal:b,timeoutMs:a.timeoutMs}),g=()=>aS(a=>f(a),a.timeoutMs,a.signal),h=a.timeoutMs?await (a.diagnostics?bl(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}
|
|
98
98
|
|
|
99
|
-
${h}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}function b9(a){return a.replace(/^#{3,4}\s+.*\n+/u,"").trim()}async function ca(a){let b=(0,au.V7)(a.currentContent),c=a.targetWords-b,d=bQ(a.sectionTitle,a.chapter,a.evidence),e=b7(a.sectionTitle,d);if(c<=Math.max(260,Math.floor(.12*a.targetWords)))return a.currentContent;let f=O(K(a.chapter,d),{maxChars:L(Math.min(a.targetWords,2600),3500,9e3)}),g=Math.
|
|
99
|
+
${h}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}function b9(a){return a.replace(/^#{3,4}\s+.*\n+/u,"").trim()}async function ca(a){let b=(0,au.V7)(a.currentContent),c=a.targetWords-b,d=bQ(a.sectionTitle,a.chapter,a.evidence),e=b7(a.sectionTitle,d);if(c<=Math.max(260,Math.floor(.12*a.targetWords)))return a.currentContent;let f=O(K(a.chapter,d),{maxChars:L(Math.min(a.targetWords,2600),3500,9e3)}),g=Math.max(500,c),h=X(Q(await aS(c=>aR(["你是专业文档小节补写专家。只做补写,不重写全文。",Y,"必须保留已有正文中的事实、参数、编号和结构;只补充缺口段落,不删除、不压缩已有内容。",Z,a.promptTexts].filter(Boolean).join("\n\n"),[`章节标题:${a.chapter.title}`,`当前小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.factCoverageContext||"",e.prompt,`当前小节约 ${b} 字,目标约 ${a.targetWords} 字,本轮补充约 ${g} 字。`,"请输出可直接追加或插入到本小节的补充段落;不要重复小节标题,不要解释生成过程;优先使用绑定资料中的事实和量化参数,不得输出“该小节围绕”等模板化占位句。",f?`绑定材料:
|
|
100
100
|
${f}`:"",`已有小节正文:
|
|
101
|
-
${b9(a.currentContent).slice(0,12e3)}`].filter(Boolean).join("\n\n"),!1,{maxTokens:
|
|
101
|
+
${b9(a.currentContent).slice(0,12e3)}`].filter(Boolean).join("\n\n"),!1,{maxTokens:ce(g),temperature:.25,signal:c}),Math.max(12e4,Math.min(3e5,cf(g))),a.signal)||"",a.forbidDrawingImages)).replace(/^#{3,4}\s+.*\n+/u,"").trim();return h?`${a.currentContent.trim()}
|
|
102
102
|
|
|
103
|
-
${h}`:a.currentContent}function cb(a){return bO(a.chapter,Math.max(1e3,(0,au.V7)(a.content))).flatMap(b=>{let c=b.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),d=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${c}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),e=d?.[1]||"",f=b7(b.title,bQ(b.title,a.chapter,a.evidence)),g=function(a,b,c){if(0===c.items.length)return;let d=c.items.filter(a=>b6(a.text,b)>=(a.quantified?1:2)),e=c.items.filter(a=>a.quantified&&b6(a.text,b)>=1),f=Math.min(c.items.length,/概况|范围|清单|图纸|设计|材料|设备|工期|质量|安全|危大|资源/u.test(a)?3:2),g=+(c.quantifiedCount>0);if(d.length>=f&&e.length>=g)return;let h=c.items.filter(a=>!d.includes(a)).slice(0,6).map(a=>a.text);return`资料事实落位不足:当前小节已落位 ${d.length}/${c.items.length} 条资料事实、${e.length}/${c.quantifiedCount} 条量化事实;必须补入:${h.join(";")}`}(b.title,e,f);return g?[`${b.title}:${g}`]:[]})}function cc(a,b
|
|
103
|
+
${h}`:a.currentContent}function cb(a){return bO(a.chapter,Math.max(1e3,(0,au.V7)(a.content))).flatMap(b=>{let c=b.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),d=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${c}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),e=d?.[1]||"",f=b7(b.title,bQ(b.title,a.chapter,a.evidence)),g=function(a,b,c){if(0===c.items.length)return;let d=c.items.filter(a=>b6(a.text,b)>=(a.quantified?1:2)),e=c.items.filter(a=>a.quantified&&b6(a.text,b)>=1),f=Math.min(c.items.length,/概况|范围|清单|图纸|设计|材料|设备|工期|质量|安全|危大|资源/u.test(a)?3:2),g=+(c.quantifiedCount>0);if(d.length>=f&&e.length>=g)return;let h=c.items.filter(a=>!d.includes(a)).slice(0,6).map(a=>a.text);return`资料事实落位不足:当前小节已落位 ${d.length}/${c.items.length} 条资料事实、${e.length}/${c.quantifiedCount} 条量化事实;必须补入:${h.join(";")}`}(b.title,e,f);return g?[`${b.title}:${g}`]:[]})}async function cc(a){let b=function(a,b){let c=Math.max(1200,Math.floor(Number(process.env.DOCUMENT_WRITING_TASK_MAX_WORDS??2200))),d=b>1.25*c?Math.ceil(b/c):1,e=Math.max(800,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){aF(a.signal);let b=await b8({...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(b9(b))}if(0===c.length)return;let d=`### ${a.sectionTitle}
|
|
104
104
|
|
|
105
|
-
${d}
|
|
105
|
+
${c.join("\n\n")}`;return X(Q(d=await ca({...a,currentContent:d,targetWords:a.targetWords}),a.forbidDrawingImages))}async function cd(a){let b=bO(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 e=d?9e4:Math.max(9e4,Math.min(15e4,Math.ceil(.45*cf(c.targetWords)))),g=a.sectionEvidenceProvider&&await aS(()=>a.sectionEvidenceProvider(c.title),Math.min(25e3,Math.floor(.25*e)),a.signal)||[],h={...a,evidence:g.length?[...a.evidence,...g]: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:e},i=await aS(a=>c.targetWords>=1400?cc({...h,signal:a}):cj({...h,signal:a},ci(b.length)),e,a.signal)||void 0;return i&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),i}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}},h=b.length;for(let c=0;c<h;c+=d){aF(a.signal);let f=b.slice(c,Math.min(h,c+d));(await Promise.all(f.map(a=>g(a)))).forEach((a,b)=>{e[c+b]=a})}let i=e.map((a,b)=>a?-1:b).filter(a=>a>=0),j=i;if(j.length>0){for(let c=0;c<j.length;c+=d){aF(a.signal);let f=j.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(i=e.map((a,b)=>a?-1:b).filter(a=>a>=0)).slice(0,d)){aF(a.signal);let d=b[c],f=await g({...d,targetWords:Math.max(d.targetWords,900)},!0);f&&(e[c]=f)}}let k=e.map((c,d)=>(function(a,b,c=[]){let d=X(a||"").trim(),e=d.replace(/^#{3,4}\s+.+$/gmu,"").trim();if((0,au.V7)(e)>=180)return d;let f=b7(b,bQ(b,{id:"",title:b,purpose:"",queries:[],requiredFacts:[],sections:[b]},c)).items.slice(0,3).map(a=>a.text);return X(`### ${b}
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
【本小节生成未达标,需重新生成】
|
|
108
108
|
|
|
109
|
-
|
|
109
|
+
原因:大模型未返回有效正文或正文篇幅不足,系统未将兜底模板伪装为正式内容。${f.length?`
|
|
110
110
|
|
|
111
|
-
|
|
111
|
+
已匹配资料:${f.join(";")}。`:""}`)})(c||"",b[d].title,a.evidence));return X(Q(`## ${a.chapter.title}
|
|
112
112
|
|
|
113
|
-
${
|
|
113
|
+
${k.join("\n\n")}`,a.forbidDrawingImages))}function ce(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function cf(a){let b=a||1200;return b>=8e3?36e4:b>=5e3?3e5:b>=3e3?24e4:18e4}function cg(a){return a<=0?0:Math.max(1,Math.ceil(a/4e3))}async function ch(a){let b=(0,au.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 aR(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",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?`绑定材料:
|
|
114
114
|
${e}`:"","当前章节 Markdown 分片(必须保留并覆盖全部已有内容,不得只基于末尾扩写):",function(a,b){let c=bE(a,12e3);return 0===c.length?"":1===c.length?c[0]:c.map((a,b)=>`【片段 ${b+1}/${c.length}】
|
|
115
|
-
${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??
|
|
115
|
+
${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??ce(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}
|
|
116
|
+
|
|
117
|
+
${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=(0,au.V7)(a),g=(0,au.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 ci(a){let b=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_ATTEMPTS??2);return Math.max(1,Math.min(3,Number.isFinite(b)?Math.floor(b):2,a))}async function cj(a,b){let c;for(let d=0;d<b;d+=1){let b=await b8({...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,au.V7)(c);return d<360?`正文有效内容不足:${a} 当前约 ${d} 字`:/资料未提供|信息有限|无法确定|待补充|建议补充更多资料|以下是|本文档|本小节围绕/u.test(c)?`存在空泛或说明性话术:${a}`:void 0}(a.sectionTitle,b);if(!d)return b;c=d}}async function ck(a){let b=bO(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","empty","too_short","table_only"].includes(b.reason))).map(d=>({title:d.sectionTitle,targetWords:Math.max(c.get(d.sectionTitle)?.targetWords||0,Math.floor(a.targetWords/Math.max(1,b.length||a.forcedSections?.length||1))),forced:!0,reason:d.reason})),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,au.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=ci(h.length),e=await Promise.all(c.map(async b=>{try{let c=Math.max(0,b.targetWords-b.currentWords),e=Math.max(c,b.forced?Math.ceil(.85*b.targetWords):Math.ceil(.35*b.targetWords));return await cj({...a,evidence:a.evidence,sectionTitle:b.title,targetWords:e,maxWords:Math.ceil(1.25*e),timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.7*cf(e))))},d)}catch{return}}));c.forEach((a,b)=>{i.set(a.title,e[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(/【本小节生成未达标,需重新生成】/u.test(c)||!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/【本小节生成未达标,需重新生成】/u.test(c)?d?`${b}${d}
|
|
118
|
+
|
|
119
|
+
`:`${b}${c.trim()}
|
|
116
120
|
|
|
117
|
-
|
|
121
|
+
`:d?`${b}${c.trim()}
|
|
118
122
|
|
|
119
123
|
${d}
|
|
120
124
|
|
|
@@ -124,67 +128,49 @@ ${d}
|
|
|
124
128
|
|
|
125
129
|
### ${b}
|
|
126
130
|
|
|
127
|
-
${f}`:a}(f,a.title,b))}return X(Q(f,a.forbidDrawingImages))}async function
|
|
128
|
-
${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=bH(f),h=g?bJ([...g.issues||[],...g.repairInstructions||[],g.repair].map(bI)):[],i=(h.length?h:bJ((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:bh({type:"llm_review",roleId:"global-consistency-review",status:i.length>0?"fallback":"success",message:bj(i.length>0?`摘要化全局一致性审查发现 ${i.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function
|
|
131
|
+
${f}`:a}(f,a.title,b))}return X(Q(f,a.forbidDrawingImages))}async function cl(a){let b=a.content,c=0,d=a.strictBudget?cg(a.targetChars-(0,au.V7)(b)):Math.min(1,cg(a.targetChars-(0,au.V7)(b))),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&(0,au.V7)(b)<a.targetChars&&(0,au.V7)(b)<e;c+=1){aF(a.signal);let c=b;try{let d=(0,au.V7)(b),f=Math.min(a.targetChars,d+(a.strictBudget?5600:3200)),g=await aS(c=>ch({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??ce(d,f),ce(d,f)),signal:c}),12e4,a.signal);if(!g||g===c)break;b=g}catch{break}}return{content:b,rounds:c}}async function cm(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=(0,au.V7)(b.map(a=>a.content).join("\n\n")),d=Math.min(a.budget.longformStrict?3:1,cg(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){aF(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=(0,au.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){aF(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 cl({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:ce(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,au.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,au.V7)(b.map(a=>a.content).join("\n\n"))}if(c<=d+(a.budget.longformStrict?80:300))break}return b}async function cn(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){aF(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=bw({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=bL({totalChars:(0,au.V7)(c.content),chapterCount:1,chunkChars:12e3,phase:"chapter"}),g=bE(c.content,12e3).slice(0,f.chunks),h=[];for(let i=0;i<g.length&&!(Date.now()-b>f.ms);i+=1){aF(a.signal);let b=g[i]||"",f=await aR(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${c.title}`,`目标深度:约 ${d} 字;当前 ${(0,au.V7)(c.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",c.missingFacts.length?`未覆盖事实:${c.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"",`章节正文片段 ${i+1}/${g.length}(必须检查该片段,不要假设其他片段已合格):`,bF(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(bH(f))}let i=bJ(h.flatMap(a=>Array.isArray(a?.issues)?a.issues:[])).slice(0,f.issues),j=bJ(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=bJ([...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,au.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:bh({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:bj(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function co(a){let b=Date.now(),c=bL({totalChars:a.chapters.reduce((a,b)=>a+(0,au.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,au.V7)(b.content)} 字;审查=${c?.status||"unknown"};问题数=${d.length};问题=${d.join(";")||"无"}`}).join("\n"),e=a.chapters.map(bG).join("\n\n---\n\n");aF(a.signal);let f=await aR(["你是长文档全局一致性审查专家。只基于章节摘要检查跨章节一致性,不重写正文。","重点检查:章节之间信息冲突、术语不一致、重复堆砌、目录层级异常、关键要求缺失、前后矛盾、上下文衔接断裂。","摘要不足以判断的问题只能标记为需复核,不得臆测正文问题。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文摘要:
|
|
132
|
+
${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=bH(f),h=g?bJ([...g.issues||[],...g.repairInstructions||[],g.repair].map(bI)):[],i=(h.length?h:bJ((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:bh({type:"llm_review",roleId:"global-consistency-review",status:i.length>0?"fallback":"success",message:bj(i.length>0?`摘要化全局一致性审查发现 ${i.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function cp(a){aF(a.signal);let b=Date.now(),c=bL({totalChars:(0,au.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,au.V7)(a.markdown),8e3,18e3)}),g=a.spec?`结构化检查摘要:${a.spec.name}
|
|
129
133
|
关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
|
|
130
134
|
章节检查项:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
|
|
131
135
|
通用质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
|
|
132
136
|
约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"未生成结构化检查摘要。",h=bE(a.markdown,12e3).slice(0,c.chunks),i=[];for(let c=0;c<h.length&&(aF(a.signal),!(Date.now()-b>d));c+=1){let b=h[c]||"";i.push(await aT(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构/提示词角色 > 绑定文件证据 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、绑定材料事实使用、参数数字准确性、冲突事实、异常对象名、表格呈现、导出友好性、系统提示泄露。","只返回 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?`上下文/历史记忆:
|
|
133
|
-
${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bF(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))}))}aF(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
|
|
134
|
-
]{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(
|
|
135
|
-
${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
|
|
136
|
-
${a.content}`)>0).map(b=>({chapterId:"project-basic",filePath:b.filePath,score:Math.max(b.score,1)+
|
|
137
|
-
${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){aF(a.signal);let d=a.project.getFileDetail?.(c,{maxChunkContentChars:12e3});if(d?.chunks?.length)for(let e of d.chunks){let f=
|
|
138
|
-
${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||""}|${aY(a.content).slice(0,180)}`;return!d.has(b)&&(d.add(b),!0)}).slice(0,24)}function
|
|
139
|
-
|
|
140
|
-
实施过程中按“资料复核—方案交底—样板确认—过程检查—验收整改—资料归档”形成闭环。专业工程师负责将检查结果、整改责任人、复验结论和影像资料同步归档;发现图纸、清单、现场条件不一致时,及时提交建设单位、监理单位和设计单位确认,确认前不擅自扩大施工范围或改变技术参数。`}function cG(a,b){let c=cE(a,b).filter(a=>"missing_planned_section"===a.reason);if(0===c.length)return a;let d=c.map((a,b)=>{let c=/^\d+(?:\.\d+)*/u.test(a.sectionTitle)?"":`${b+1}. `;return`### ${c}${a.sectionTitle}
|
|
141
|
-
|
|
142
|
-
${cF(a.sectionTitle)}`});return`${a.trim()}
|
|
143
|
-
|
|
144
|
-
${d.join("\n\n")}`}function cH(a){return a.replace(/^#{1,6}\s+.+$/gmu,"").replace(/^\s*\|.*\|\s*$/gmu,"").replace(/^\s*[-:| ]{3,}\s*$/gmu,"").replace(/\s+/gu,"").length}function cI(a){return a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))}function cJ(a,b){if(0===cI(b).length)return a;let c=a,d=a=>cI(b).filter(b=>a.some(a=>a.test(`${b.key||""}${b.fieldName||""}${b.fieldId||""}`))).filter(a=>a$(a.fieldId,a.value)).sort((a,b)=>{let c=aE(a.value),d=aE(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=cK(aE(a.value||""));b&&(c=c.replace(RegExp(`(${a.label.source})(\\s*[|::]\\s*)资料未明确[^|\\n。;;]*`,"gu"),`$1$2${b}`))}return c}function cK(a){return aY(a).replace(/[。;;]$/u,"").trim()}function cL(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))&&a$(h||"project_name",e)&&b.set(g,[cK(e),cK(f||"项目资料")||"项目资料"])}return b}(b),e=bf({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 cM(a){return/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a.trim())}function cN(a){let b=a.trim();if(!b||/^#{1,6}\s+/u.test(b)||cM(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 cO(a){return a.trim().replace(/^\|/u,"").replace(/\|$/u,"").trim().split("|").map(a=>a.trim())}function cP(a,b){let c=a.slice(0,b);for(;c.length<b;)c.push("");return`| ${c.join(" | ")} |`}function cQ(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(cN(d)&&cM(f)){for(c.push(d),e!==a+1&&c.push(b[a+1]||""),c.push(f),a=e+1;a<b.length&&cN(b[a]||"");)c.push(b[a]||""),a+=1;continue}if(!cN(d)){c.push(d),a+=1;continue}let g=[],h=a;for(;h<b.length&&cN(b[h]||"");)g.push(b[h]||""),h+=1;let i=g.map(a=>cO(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(cP(function(a){if(2===a)return["信息项","内容"];let b=["项目","内容","备注","说明"];return Array.from({length:a},(a,c)=>b[c]||`列${c+1}`)}(j),j)),c.push(cP(Array.from({length:j},()=>"---"),j)),g))c.push(cP(cO(a),j));(a=h)<b.length&&b[a]?.trim()&&c.push("")}return c.join("\n").replace(/\n{3,}/gu,"\n\n")}function cR(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 cS(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=>cO(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&&!(cN(c[a]||"")&&cM(c[a+1]||""))&&""===(c[a]||"").trim();)f.push(c[a]||""),a+=1;if(a<c.length&&cN(c[a]||"")&&cM(c[a+1]||""))for(f.push(c[a]||"",c[a+1]||""),a+=2;a<c.length&&cN(c[a]||"");)f.push(c[a]||""),a+=1;e||(e=!0,d.push(...f));continue}if(cN(b)&&cM(f)){let g=[b,f];for(a+=2;a<c.length&&cN(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 cT(a,b){if(!/项目基本信息|项目概况|工程概况|招标范围/u.test(a))return cS(cQ(cR(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["**项目基本信息表**","","| 信息项 | 内容 |","|---|---|",...cL(a,b,c).map(a=>`| ${a[0]} | ${a[1]} |`)].join("\n")}(b,i,a);if(!cL(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
|
+
${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bF(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))}))}aF(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 cq=/安全|文明|质量|绿色施工|环保|扬尘|消防|应急|危大|风险|规范|标准|管理要求|施工工艺|技术措施|验收/u,cr=/项目名称|工程名称|建设地点|建设单位|招标人|发包人|建设规模|招标范围|合同工期|计划工期|质量标准|危大工程清单|工程量|材料规格|设备型号|图纸参数|报价|单价|利润|税率|合同金额|联系方式|品牌/u,cs=/报价|单价|合价|金额|利润|税率|增值税|招标控制价|最高投标限价|中标价|合同价|暂列金额/u,ct=/联网增强|联网检索|网页资料|搜索结果|根据网页|互联网资料|在线资料|浏览器|搜索引擎/u,cu=["项目名称","工程名称","建设地点","建设单位","招标人","发包人","建设规模","招标范围","合同工期","计划工期","工程量","报价","单价"];function cv(a){return a.replace(/&/gu,"&").replace(/</gu,"<").replace(/>/gu,">").replace(/"/gu,'"').replace(/'/gu,"'").replace(/<[^>]+>/gu,"").replace(/\s+/gu," ").trim()}async function cw(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=cv(a[1]||""),c=cv(a[2]||""),d=cv(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||cr.test(b)||cs.test(b)||ct.test(b)||d.some(a=>a&&b.includes(a)))&&(0===c.length||c.some(b=>a.url.includes(b)))}).slice(0,b):[]}async function cx(a){if(!a.config.enabled||!function(a,b){let c=`${a} ${b.join(" ")}`;return!(!cq.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(cr,"")} 公开规范 通用要求`.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 cw(e,a.config.maxResultsPerQuery,a.config.trustedDomains,a.runtimeRules.forbiddenTerms||[],a.signal))){let e=function(a,b){let c=a;for(let a of cu)c=c.replace(RegExp(`${a}[^。;;
|
|
138
|
+
]{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(cs,"").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}
|
|
139
|
+
${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 cy(a){let b=[];return ct.test(a)&&b.push({level:"warning",message:"正文包含联网增强过程性表述",suggestion:"请删除联网检索、网页资料、搜索结果等过程性话术,改为正式交付语言。"}),b}function cz(a,b){let c=(0,au.V7)(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}let cA=["项目名称 项目编号 招标人 项目概况与招标范围 建设地点 建设规模 计划工期 质量标准 合同估算价","计划工期 合同工期 总工期 日历天","合同估算价 合同估算价格 投资估算 最高投标限价 招标控制价","质量标准 质量目标 合格","建设地点 建设规模 招标范围"];function cB(a){let b=aY(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 cC(a){let b=[],c=new Set(a.scopedFilePaths);for(let d of cA){aF(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)&&cB(`${a.sectionTitle||""}
|
|
140
|
+
${a.content}`)>0).map(b=>({chapterId:"project-basic",filePath:b.filePath,score:Math.max(b.score,1)+cB(`${b.sectionTitle||""}
|
|
141
|
+
${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){aF(a.signal);let d=a.project.getFileDetail?.(c,{maxChunkContentChars:12e3});if(d?.chunks?.length)for(let e of d.chunks){let f=cB(`${e.sectionTitle||""}
|
|
142
|
+
${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||""}|${aY(a.content).slice(0,180)}`;return!d.has(b)&&(d.add(b),!0)}).slice(0,24)}function cD(a,b){return(0,av.yw)(a,[{title:b.title,content:a,sections:b.sections||[]}]).filter(a=>a.planned||"missing_planned_section"===a.reason)}function cE(a){return a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))}function cF(a,b){if(0===cE(b).length)return a;let c=a,d=a=>cE(b).filter(b=>a.some(a=>a.test(`${b.key||""}${b.fieldName||""}${b.fieldId||""}`))).filter(a=>a$(a.fieldId,a.value)).sort((a,b)=>{let c=aE(a.value),d=aE(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=cG(aE(a.value||""));b&&(c=c.replace(RegExp(`(${a.label.source})(\\s*[|::]\\s*)资料未明确[^|\\n。;;]*`,"gu"),`$1$2${b}`))}return c}function cG(a){return aY(a).replace(/[。;;]$/u,"").trim()}function cH(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))&&a$(h||"project_name",e)&&b.set(g,[cG(e),cG(f||"项目资料")||"项目资料"])}return b}(b),e=bf({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 cI(a){return/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u.test(a.trim())}function cJ(a){let b=a.trim();if(!b||/^#{1,6}\s+/u.test(b)||cI(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 cK(a){return a.trim().replace(/^\|/u,"").replace(/\|$/u,"").trim().split("|").map(a=>a.trim())}function cL(a,b){let c=a.slice(0,b);for(;c.length<b;)c.push("");return`| ${c.join(" | ")} |`}function cM(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(cJ(d)&&cI(f)){for(c.push(d),e!==a+1&&c.push(b[a+1]||""),c.push(f),a=e+1;a<b.length&&cJ(b[a]||"");)c.push(b[a]||""),a+=1;continue}if(!cJ(d)){c.push(d),a+=1;continue}let g=[],h=a;for(;h<b.length&&cJ(b[h]||"");)g.push(b[h]||""),h+=1;let i=g.map(a=>cK(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(cL(function(a){if(2===a)return["信息项","内容"];let b=["项目","内容","备注","说明"];return Array.from({length:a},(a,c)=>b[c]||`列${c+1}`)}(j),j)),c.push(cL(Array.from({length:j},()=>"---"),j)),g))c.push(cL(cK(a),j));(a=h)<b.length&&b[a]?.trim()&&c.push("")}return c.join("\n").replace(/\n{3,}/gu,"\n\n")}function cN(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 cO(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=>cK(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&&!(cJ(c[a]||"")&&cI(c[a+1]||""))&&""===(c[a]||"").trim();)f.push(c[a]||""),a+=1;if(a<c.length&&cJ(c[a]||"")&&cI(c[a+1]||""))for(f.push(c[a]||"",c[a+1]||""),a+=2;a<c.length&&cJ(c[a]||"");)f.push(c[a]||""),a+=1;e||(e=!0,d.push(...f));continue}if(cJ(b)&&cI(f)){let g=[b,f];for(a+=2;a<c.length&&cJ(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 cP(a,b){if(!/项目基本信息|项目概况|工程概况|招标范围/u.test(a))return cO(cM(cN(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["**项目基本信息表**","","| 信息项 | 内容 |","|---|---|",...cH(a,b,c).map(a=>`| ${a[0]} | ${a[1]} |`)].join("\n")}(b,i,a);if(!cH(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()}
|
|
145
143
|
|
|
146
144
|
${j}${k?`
|
|
147
145
|
|
|
148
146
|
${k}`:""}
|
|
149
147
|
|
|
150
|
-
`;return
|
|
151
|
-
|。;;]{0,40}资料未明确`,"u").test(a)).map(a=>({level:"error",message:`${a} 已抽取到资料事实但正文仍显示资料未明确`,suggestion:"请优先使用项目基础事实卡片中的资料原值,不得用占位表达覆盖已确认事实。"})):[]}function
|
|
152
|
-
${d.trim()}
|
|
153
|
-
|
|
154
|
-
${cF(a)}
|
|
155
|
-
|
|
156
|
-
`)}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))||cH(d)>=80)return a;let e=c.replace(/^\d+(?:\.\d+)*\s*/u,"").trim();return`${b}
|
|
157
|
-
${d.trim()}
|
|
158
|
-
|
|
159
|
-
表中内容用于明确本小节涉及的对象、范围和控制要求,实施前应由项目技术、质量和施工管理人员结合已确认资料进行复核。执行过程中应保留交底、检查、复验和整改记录,确保表格列明事项能够落实到施工组织、资源配置和验收闭环。
|
|
160
|
-
|
|
161
|
-
${cF(e)}
|
|
162
|
-
|
|
163
|
-
`})).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 cX(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=bD(a.writerPrompts),h=bD([...c,...a.formattingPrompts]);return{primaryPromptId:e?.id,primaryWriter:e,prompts:d,promptTexts:[g?`【最高优先级:配置写作主控提示词】
|
|
148
|
+
`;return cO(cM(cN(`${a.slice(0,d)}${l}${a.slice(h).trimStart()}`)))}function cQ(a,b){return 0!==cE(b).length&&/资料未明确/u.test(a)?["计划工期","合同工期","质量标准","合同估算价","合同估算价格","建设地点","建设规模"].filter(b=>RegExp(`${b}[^
|
|
149
|
+
|。;;]{0,40}资料未明确`,"u").test(a)).map(a=>({level:"error",message:`${a} 已抽取到资料事实但正文仍显示资料未明确`,suggestion:"请优先使用项目基础事实卡片中的资料原值,不得用占位表达覆盖已确认事实。"})):[]}function cR(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 cS(a,b){return cR(a).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 cT(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=bD(a.writerPrompts),h=bD([...c,...a.formattingPrompts]);return{primaryPromptId:e?.id,primaryWriter:e,prompts:d,promptTexts:[g?`【最高优先级:配置写作主控提示词】
|
|
164
150
|
${g}`:"",h?`【章节/格式提示词】
|
|
165
|
-
${h}`:""].filter(Boolean).join("\n\n"),promptDetails:f}}function
|
|
151
|
+
${h}`:""].filter(Boolean).join("\n\n"),promptDetails:f}}function cU(a){return aY(a).replace(/[\s,,.。::;;||()()《》<>【】"“”'‘’]/gu,"").split("[").join("").split("]").join("").toLowerCase()}function cV(a){return/工程造价|造价|报价|投标报价|报价明细|综合单价|单价|合价|金额|税率|增值税|利润|预留金|暂列金额|最高投标限价|招标控制价|合同估算价|合同估算价格|投资估算|估算价/u.test(a)}function cW(a,b){let c=cU(a),d=cU(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=>cU(a).length>=2&&c.includes(cU(a)))}function cX(a,b,c={}){let d=b.filter(a=>{let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`;return!cV(`${b}${aE(a.value)}`)&&(/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|质量标准|质量目标|危大|安全|资源|材料|机械|设备/u.test(b)||/\d/u.test(aE(a.value)))}),e=new Set,f=[];for(let b of d){let d=function(a){let b=cG(aE(a));return!b||/资料未明确|未确认|待确认|无|暂无/u.test(b)||cV(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),!cW(a,d)&&(f.push({fact:b,label:g,value:d}),c.maxItems&&f.length>=c.maxItems)))break}return f}function cY(a,b,c){let d=cX(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||cW(b.content,a.value))continue;let c=`${a.label}按已确认资料执行为${a.value},项目部在施工组织、技术交底、过程检查和验收复核中保持该项事实口径一致,不擅自变更资料已明确的数值、单位和适用范围。`;b.content=`${b.content.trim()}
|
|
166
152
|
|
|
167
|
-
${c}`,f+=1}return{chapters:e.map(a=>({...a,sections:a.sections||[]})),patchedCount:f,missingCount:d.length}}function
|
|
153
|
+
${c}`,f+=1}return{chapters:e.map(a=>({...a,sections:a.sections||[]})),patchedCount:f,missingCount:d.length}}function cZ(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 c$(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||""}
|
|
168
154
|
${b.filePath}
|
|
169
|
-
${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
|
|
155
|
+
${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 c_(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 c0(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 c1(a,b){return Math.max(12,Math.min(26,a+10+4*((b.sections||[]).length>=6||b.requiredFacts.length>=8)))}async function c2(a){if(aF(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:cZ(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 c3(a){let b=[];for(let c of a.needs.slice(0,8)){aF(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:cZ(`${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 c4(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 c5(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 c6(a){var b;aF(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=[bh({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(bi(G,bh({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=bD([...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}),bi(G,bh({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}
|
|
170
156
|
${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)})));bi(G,bh({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=bD([...H.writerPrompts,...H.formattingPrompts]),$=bD([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts]),_=bD(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=bZ(b,"封面"),f=bZ(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:bW(b),forbiddenPatterns:bX(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=bW(b),f=bX(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&&!bS(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:bY(b,RegExp(`${a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}|${a.title.slice(0,6).replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"u")).slice(0,8),mustNotInclude:bY(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:bY(a.content,/重点|关注|围绕|响应|体系|措施|质量|安全|工期|资源/u).slice(0,8),mustDo:bY(a.content,/必须|应当|需要|确保|严格/u).slice(0,10),mustNotDo:bY(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`以下规则由系统运行时从用户绑定指令中自动抽取,不作为用户可编辑内容。生成、检查和修复必须共同遵守:
|
|
171
157
|
${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,`生成前规划章节结构:
|
|
172
|
-
${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,bD([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),ah=[X,ae,bD([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");bi(G,bh({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=bB(o,Q),aj=(0,i.XB)("file"),ak=new Map(Q.flatMap(a=>bz(o,a.filePath).map(b=>[b,a.roleId]))),al=new Map(Q.flatMap(a=>bz(o,a.filePath).map(b=>[b,aj.find(b=>b.id===a.roleId)?.processingType||"reference"])));bi(G,bh({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=[...c8("部分绑定文件未完成索引,已自动跳过",f),...c8("部分绑定文件没有可用切片,已自动跳过",g),...c8("部分绑定文件索引失败,已自动跳过",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 ao=new Set(an.usablePaths.flatMap(a=>bz(o,a))),ar=c9(am,[...ao],a.maxEvidencePerChapter);bi(G,bh({type:"knowledge_retrieval",roleId:"knowledge-index",status:an.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${an.scopedRecords.length} 份,可用切片 ${an.usableChunkCount} 条,开始构建角色资料证据池`,details:[`绑定文件:${ai.size} 份`,`可用证据文件:${ao.size} 份`,`向量状态:${an.vectorStatus?.status||"unknown"}`,...an.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),aF(a.signal);let aw=[],ax={enabled:ab.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},ay=[],az=[],aB=[],aC=-1,aD=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(bC(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=bm(`${a} ${c.join(" ")}`),e=bm(`${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(bm(d))&&(c+=4);return c}(d,b);for(let a of bk.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=bm(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bk.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=bn(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,aD,o,L(Math.max(1200,900*K.length),12e3,aM())),aH=bh({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)} 条`,`待执行资料理解节点:${aD.length} 个`,aG.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aG.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aG.uniqueFileCount,total:Math.max(1,aG.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});bi(G,aH),y();let aI=await cD({manager:t,project:am,projectRoot:o,scopedFilePaths:[...ai].filter(Boolean).sort(),fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});aI.length>0&&(aw.push(...aI),bi(G,bh({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aI.length} 条`,details:aI.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aK=[],aL=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=bn(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 aA({type:"project-evidence-version-v2",entries:e})}(am,o,ai),aN=aO()?.model.name,aP=bD([...H.extractionPrompts,...H.referencePrompts]),aQ=aA({fileBindings:Q,evidenceScopePaths:[...ai].sort(),activeModelName:aN,projectEvidenceVersion:aL,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}))]))}),aR=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aD.length>12?1:2)),aT=Math.max(1,Math.min(aD.length||1,3,Number.isFinite(aR)?Math.floor(aR):1));for(let b=0;b<aD.length;b+=aT){aF(a.signal);let c=aD.slice(b,b+aT).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(bn(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=>bA(o,a.filePath,ai)),g=G.length,h=bh({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:aD.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bq(q,c,f,a.signal)),j=bh({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bj(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aD.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*aD.length),maxChars:Math.max(45e3,5e3*aD.length),preservePinned:!0});aw.splice(0,aw.length,...d)}let aX=aV(aw,q,T),aY=a_(aw),aZ=a0(aw,U),a$=bb([...aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aE(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...aX,...aY,...aZ],aU(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}),a3=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(`章节/要求:
|
|
158
|
+
${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,bD([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),ah=[X,ae,bD([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");bi(G,bh({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=bB(o,Q),aj=(0,i.XB)("file"),ak=new Map(Q.flatMap(a=>bz(o,a.filePath).map(b=>[b,a.roleId]))),al=new Map(Q.flatMap(a=>bz(o,a.filePath).map(b=>[b,aj.find(b=>b.id===a.roleId)?.processingType||"reference"])));bi(G,bh({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=[...c4("部分绑定文件未完成索引,已自动跳过",f),...c4("部分绑定文件没有可用切片,已自动跳过",g),...c4("部分绑定文件索引失败,已自动跳过",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 ao=new Set(an.usablePaths.flatMap(a=>bz(o,a))),ar=c5(am,[...ao],a.maxEvidencePerChapter);bi(G,bh({type:"knowledge_retrieval",roleId:"knowledge-index",status:an.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${an.scopedRecords.length} 份,可用切片 ${an.usableChunkCount} 条,开始构建角色资料证据池`,details:[`绑定文件:${ai.size} 份`,`可用证据文件:${ao.size} 份`,`向量状态:${an.vectorStatus?.status||"unknown"}`,...an.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),aF(a.signal);let aw=[],ax={enabled:ab.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},ay=[],az=[],aB=[],aC=-1,aD=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(bC(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=bm(`${a} ${c.join(" ")}`),e=bm(`${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(bm(d))&&(c+=4);return c}(d,b);for(let a of bk.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=bm(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bk.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=bn(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,aD,o,L(Math.max(1200,900*K.length),12e3,aM())),aH=bh({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)} 条`,`待执行资料理解节点:${aD.length} 个`,aG.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aG.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aG.uniqueFileCount,total:Math.max(1,aG.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});bi(G,aH),y();let aI=await cC({manager:t,project:am,projectRoot:o,scopedFilePaths:[...ai].filter(Boolean).sort(),fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});aI.length>0&&(aw.push(...aI),bi(G,bh({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aI.length} 条`,details:aI.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aK=[],aL=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=bn(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 aA({type:"project-evidence-version-v2",entries:e})}(am,o,ai),aN=aO()?.model.name,aP=bD([...H.extractionPrompts,...H.referencePrompts]),aQ=aA({fileBindings:Q,evidenceScopePaths:[...ai].sort(),activeModelName:aN,projectEvidenceVersion:aL,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}))]))}),aR=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aD.length>12?1:2)),aT=Math.max(1,Math.min(aD.length||1,3,Number.isFinite(aR)?Math.floor(aR):1));for(let b=0;b<aD.length;b+=aT){aF(a.signal);let c=aD.slice(b,b+aT).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(bn(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=>bA(o,a.filePath,ai)),g=G.length,h=bh({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:aD.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bq(q,c,f,a.signal)),j=bh({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bj(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aD.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*aD.length),maxChars:Math.max(45e3,5e3*aD.length),preservePinned:!0});aw.splice(0,aw.length,...d)}let aX=aV(aw,q,T),aY=a_(aw),aZ=a0(aw,U),a$=bb([...aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aE(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...aX,...aY,...aZ],aU(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}),a3=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(`章节/要求:
|
|
173
159
|
${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aE(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
|
|
174
|
-
${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=bV([...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 bV(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=>bU(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),be=(0,au.tF)({requirement:a.requirement,promptTexts:af,template:bc,chapters:a2,spec:T}),bg=0,bp=0;a2=await Promise.all(a2.map(async(b,c)=>{if(b.sections?.length){bg+=1;let a=b$([...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)),...b.sections],b.title);return{...b,sections:a.length?a:b$(b.sections,b.title)}}bp+=1;let d=I(aw.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(be.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bt(aK,b,br(b,a1)),f=
|
|
160
|
+
${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=bV([...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 bV(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=>bU(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),be=(0,au.tF)({requirement:a.requirement,promptTexts:af,template:bc,chapters:a2,spec:T}),bg=0,bp=0;a2=await Promise.all(a2.map(async(b,c)=>{if(b.sections?.length){bg+=1;let a=b$([...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)),...b.sections],b.title);return{...b,sections:a.length?a:b$(b.sections,b.title)}}bp+=1;let d=I(aw.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(be.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bt(aK,b,br(b,a1)),f=cT(H,b),g=await b_({template:bc,chapter:b,chapterIndex:c,evidence:d,promptTexts:f.promptTexts,projectContext:a3,requirement:a.requirement,roleContext:e,targetWords:be.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 bi(G,bh({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 bv=(0,au.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}
|
|
175
161
|
${a.template.category||""}
|
|
176
|
-
${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=a.targetWords>=3e4&&c>=8e3,i=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??2*!!h),j=h?1:Math.max(1,b),k=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??j)))),l=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:k,maxSectionConcurrency:l,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??j)))),targetLlmConcurrency:i}}({template:q,targetWords:bv.targetChars||[...bv.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bE.targetLlmConcurrency>0&&(b=bE.targetLlmConcurrency,void 0===aJ||!Number.isFinite(b)||b<=0||(aJ=Math.min(aJ,Math.floor(b))),aM());let bF={strategy:bE,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aM(),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 不做本地并发限流";bi(G,bh({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=bh({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bp} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bg} 章已由模板显式提供小节并跳过规划`},{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}|提示词角色未显式绑定资源`)];bi(G,bh({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})),bi(G,bh({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:"提示词规则执行"})),bi(G,bh({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:"生成准备度检查"})),bi(G,bI),y();let bL=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bO=Number(bL??bE.maxChapterConcurrency),bP=Math.max(1,Math.min(a2.length||1,bE.maxChapterConcurrency,Number.isFinite(bO)?Math.floor(bO):bE.maxChapterConcurrency));bi(G,bh({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bP}/${a2.length} 章并发`,details:[`策略上限:${bE.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bL??"未设置"}`,`有效章节数:${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;aF(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(bh({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=br(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)?cB:[],r=c3(c,[...m,...k],p),s=c4(c,p),v=Date.now();G[i]=bh({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=[...ao].filter(Boolean).sort(),x=[];for(let b of r.slice(0,s)){if(aF(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(ar,12),weights:c1(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=>bA(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=bs(aK,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bA(o,a.filePath,ai)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aI.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bv.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aM()));for(let a of C){if(!bA(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=>bA(o,a.filePath,ao));if(ab.enabled){let b=await cy({config:ab,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ad,localFacts:[...a$.project,...a$.schedule,...a$.quality,...a$.safety,...a$.resources,...a$.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*aM()))),N=c2(c,K,{maxItems:c5(ar,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=bh({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`});aC<0?aC=bi(G,Q):G[aC]={...Q,order:G[aC]?.order??Q.order},y(),aF(a.signal);let R=bu(aK,q),S=bt(aK,c,d),V=cX(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||[])a6(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a6(c,b,{label:d,category:"section",required:!1,source:"section",queries:a5(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a6(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a6(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&&a6(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a5(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)||a5(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a6(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a5(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a7(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=a4(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a7(c,b,a,"requirement",!0,[f]);let g=a4(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a7(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}),$=a9({needs:Z,factsModel:a$,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 c7({manager:t,projectRoot:o,chapter:c,needs:_,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});b.length>0&&(K=c2(c,[...K,...b],{maxItems:c5(ar+4,c),maxChars:M+9e3,preservePinned:!0},bF),N=c2(c,K,{maxItems:c5(ar+2,c),maxChars:M+7e3,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),_=($=a9({needs:Z,factsModel:a$,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]=bh({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=$,a8(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(aE(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(aE(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}:${aE(b.value)}`==`${a.key||a.fieldName}:${aE(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=aE(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=>aE(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=>aE(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?`必须优先覆盖的事实/要求:
|
|
162
|
+
${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=a.targetWords>=3e4&&c>=8e3,i=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??2*!!h),j=h?1:Math.max(1,b),k=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??j)))),l=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:k,maxSectionConcurrency:l,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??j)))),targetLlmConcurrency:i}}({template:q,targetWords:bv.targetChars||[...bv.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bE.targetLlmConcurrency>0&&(b=bE.targetLlmConcurrency,void 0===aJ||!Number.isFinite(b)||b<=0||(aJ=Math.min(aJ,Math.floor(b))),aM());let bF={strategy:bE,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aM(),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 不做本地并发限流";bi(G,bh({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=bh({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bp} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bg} 章已由模板显式提供小节并跳过规划`},{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}|提示词角色未显式绑定资源`)];bi(G,bh({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})),bi(G,bh({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:"提示词规则执行"})),bi(G,bh({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)}%`,details:W.diagnostics},{subtitle:"生成准备度检查"})),bi(G,bI),y();let bL=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bO=Number(bL??bE.maxChapterConcurrency),bP=Math.max(1,Math.min(a2.length||1,bE.maxChapterConcurrency,Number.isFinite(bO)?Math.floor(bO):bE.maxChapterConcurrency));bi(G,bh({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bP}/${a2.length} 章并发`,details:[`策略上限:${bE.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bL??"未设置"}`,`有效章节数:${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;aF(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(bh({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=br(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)?cA:[],r=c_(c,[...m,...k],p),s=c0(c,p),v=Date.now();G[i]=bh({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=[...ao].filter(Boolean).sort(),x=[];for(let b of r.slice(0,s)){if(aF(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(ar,12),weights:cZ(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=>bA(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=bs(aK,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bA(o,a.filePath,ai)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aI.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bv.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aM()));for(let a of C){if(!bA(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=>bA(o,a.filePath,ao));if(ab.enabled){let b=await cx({config:ab,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ad,localFacts:[...a$.project,...a$.schedule,...a$.quality,...a$.safety,...a$.resources,...a$.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*aM()))),N=c$(c,K,{maxItems:c1(ar,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=bh({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`});aC<0?aC=bi(G,Q):G[aC]={...Q,order:G[aC]?.order??Q.order},y(),aF(a.signal);let R=bu(aK,q),S=bt(aK,c,d),V=cT(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||[])a6(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a6(c,b,{label:d,category:"section",required:!1,source:"section",queries:a5(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a6(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a6(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&&a6(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a5(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)||a5(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a6(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:a5(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a7(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=a4(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a7(c,b,a,"requirement",!0,[f]);let g=a4(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a7(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}),$=a9({needs:Z,factsModel:a$,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 c3({manager:t,projectRoot:o,chapter:c,needs:_,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:a.signal});b.length>0&&(K=c$(c,[...K,...b],{maxItems:c1(ar+4,c),maxChars:M+9e3,preservePinned:!0},bF),N=c$(c,K,{maxItems:c1(ar+2,c),maxChars:M+7e3,preservePinned:!0},bF),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),_=($=a9({needs:Z,factsModel:a$,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]=bh({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=$,a8(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(aE(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(aE(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}:${aE(b.value)}`==`${a.key||a.fieldName}:${aE(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=aE(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=>aE(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=>aE(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?`必须优先覆盖的事实/要求:
|
|
177
163
|
${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
|
|
178
164
|
${e.join("\n")}`:"",h.length?`项目基础事实卡片(资料已明确,项目概况、项目基本信息表、进度和质量相关内容必须优先使用,不得写“资料未明确”):
|
|
179
165
|
${h.map(a=>`- ${a.key||a.fieldName}:${F(aE(a.value)).slice(0,220)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`).join("\n")}
|
|
180
166
|
项目基本信息表必须使用固定表头:| 信息项 | 内容 |,不得使用“序号|项目名称|内容参数”表头,不得输出后台溯源列。`:"",a.factNeedsPrompt||"",g.length?`全局资料事实索引匹配到的本章可写事实:
|
|
181
167
|
${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}=${ba(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${ba(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?`事实需求覆盖卡片:
|
|
182
|
-
${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 ap=T?.chapterRules.find(a=>a.id===c.id||a.title===c.title),aq=bv.chapterTargets.get(c.id)||1200,as=bv.longformStrict?Math.max(4200,Math.min(6800,Math.ceil(.42*aq))):aq,at=Math.ceil((bv.longformStrict?as:aq)*(bv.maxChars?1.1:1.18)),az=bv.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*as))):1200,aA=Math.max(Math.min(d?.minWords||0,as),Math.min(ap?.minWords||0,as),Math.min(T?.dynamicChapterRule.minWordsPerChapter||0,as),Math.floor(.78*as),az),aD=cf(aA,as),aG=bv.longformStrict?1:.55,aH=bv.longformStrict?as:2600,aJ=Math.max(900,Math.min(as,Math.ceil(as*aG),aH)),aL=Math.max(450,Math.min(aA,Math.floor(.72*aJ))),aO=Math.max(aJ+300,Math.min(at,Math.ceil(1.25*aJ))),aP=cf(aL,aJ),aR=Math.min(cg(aJ),3e5),aT=c.sections?.filter(Boolean).length||0,aU=/[、,,;;]/u.test(c.title),aV=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aT>=2&&(bv.longformStrict||!aU);G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aV?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aV?[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`首轮质量目标:约 ${as} 字${aq!==as?`,总预算分配约 ${aq} 字`:""},上限约 ${at} 字`,`小节并发上限:${bE.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`目标字数:约 ${as} 字,上限约 ${at} 字`,`章节并发上限:${bP}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:a2.length,label:aV?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aW=Math.ceil((c.sections?.length||2)/Math.max(1,bE.maxSectionConcurrency||1)),aX=Math.max(cg(as),Math.min(18e5,3e5*aW+18e4)),aZ=aV?await B(()=>bl(bF,`chapter-section-draft:${c.id}`,()=>aS(b=>ce({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:W,projectContext:a3,requirement:a.requirement,roleContext:S,targetWords:as,maxWords:at,forbidDrawingImages:R,factCoverageContext:aj,projectRoot:o,modelName:aN,fileRolesHash:aQ,allowPartialResult:!1,maxSectionConcurrency:bE.maxSectionConcurrency,sectionEvidenceProvider:a=>c6({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:b}),diagnostics:bF,signal:b}),aX,a.signal))):await B(()=>bl(bF,`chapter-draft:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:aA,targetWords:as,maxWords:at,maxTokens:aD,factCoverageContext:aj,signal:b}),cg(as),a.signal)));if(!aZ&&aV?(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${as} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aZ=await B(()=>bl(bF,`chapter-draft-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:aL,targetWords:aJ,maxWords:aO,maxTokens:aP,factCoverageContext:aj,signal:b}),aR,a.signal)))):aZ||(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${as} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aZ=await B(()=>bl(bF,`chapter-draft-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:aL,targetWords:aJ,maxWords:aO,maxTokens:aP,factCoverageContext:aj,signal:b}),aR,a.signal)))),aF(a.signal),aZ||(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${as} 字`],progress:{current:g+1,total:a2.length,label:"紧凑兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aZ=await B(()=>bl(bF,`chapter-draft-compact-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*aA)),targetWords:as,maxWords:at,maxTokens:aD,factCoverageContext:aj,signal:b}),cg(as),a.signal)))),aF(a.signal),!aZ)throw Error(`${c.title} 大模型未返回有效章节正文`);let a_=cE(aZ,c);if(a_.length>Math.max(4,Math.floor(.45*(c.sections?.length||0))))G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 首次成稿小节缺口较多,已使用确定性骨架补齐并继续`,details:a_.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"确定性补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aZ=cG(aZ,c);else if(a_.length>0){let b=aZ;G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿存在 ${a_.length} 个小节缺口,正在定向补写`,details:a_.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"小节补写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aZ=await B(()=>bl(bF,`chapter-supplement:${c.id}`,()=>cl({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:a3,requirement:a.requirement,roleContext:S,targetWords:as,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:a_,signal:a.signal})))}if((a_=cE(aZ,c)).length>0){G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次生成仍有 ${a_.length} 个小节缺口,正在章节内强制补齐`,details:a_.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"章节内小节补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aZ;aZ=await B(()=>bl(bF,`chapter-forced-section-supplement:${c.id}`,()=>cl({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:a3,requirement:a.requirement,roleContext:S,targetWords:as,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:a_,signal:a.signal}))),a_=cE(aZ,c)}a_.length>0&&(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:a_.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"保留可用章节"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let a0=bw({chapter:c,content:aZ,missingFacts:O,targetWords:as}),bb=(0,av.Ff)(a0);bF.quality.blockingCount+=bb.blocking,bF.quality.importantCount+=bb.important,bF.quality.minorCount+=bb.minor;let bc=bo(a0);if(bc.length>0){let b=aZ;G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${bc.length} 个阻断问题`,details:bc,progress:{current:g+1,total:a2.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bl(bF,`chapter-repair:${c.id}`,()=>bx({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,..._.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:bc,promptTexts:W,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bF,signal:a.signal})));aZ=d.content,d.appliedCount>0&&(bF.quality.repairedCount+=1),aF(a.signal)}if(!aZ?.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bd=cG(aZ,c),be=0;if(!bv.longformStrict&&((0,au.V7)(bd)<Math.floor(.82*as)||bo(bw({chapter:c,content:bd,missingFacts:O,targetWords:as})).length>0)){G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,au.V7)(bd)} 字 / 目标 ${Math.floor(.95*as)} 字`,`章节并发:${bP}`],progress:{current:g+1,total:a2.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bl(bF,`chapter-expand:${c.id}`,()=>cm({template:q,chapter:c,content:aZ,evidence:N,promptTexts:W,requirement:a.requirement,roleContext:S,targetChars:Math.floor(.95*as),maxChars:at,forbidDrawingImages:R,maxTokens:Math.min(aD,aP),signal:a.signal})));bd=cG(b.content,c),be=b.rounds}bd=cW(bd,c);let bf=cb({chapter:c,content:bd,evidence:N}),bg=(0,au.V7)(bd),bk=c.sections?.length?c.sections:aa(bd),bm=(0,av.qK)(bd,[{title:c.title,content:bd,sections:bk}]).map(a=>a.message),bn=[...bw({chapter:{...c,sections:bk},content:bd,missingFacts:O,targetWords:as}),...bm,...bf.map(a=>`小节事实密度不足:${a}`)],bp=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"}(bg,as,bn);f=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:bp,message:bj(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${be>0?`并定向扩写 ${be} 轮`:""}:当前 ${bg} 字 / 目标 ${Math.floor(.95*as)} 字${"success"!==bp?`;风险:${bn.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(bg/Math.max(1,Math.floor(.95*as))*100)}%`,...Y,`二级小节:${bk.length} 个`,`扩写轮次:${be}`],progress:{current:g+1,total:a2.length,label:"success"===bp?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aB.push(f);let bq={id:c.id,title:c.title,content:bd,evidence:N,missingFacts:O,sections:bk};u.push(bq),y(u);let by=bw({chapter:c,content:bd,missingFacts:O,targetWords:as}),bz=(0,av.Ff)(by);bF.quality.blockingCount+=bz.blocking,bF.quality.importantCount+=bz.important,bF.quality.minorCount+=bz.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),az.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aB.push(bh({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(`章节生成未完成:${az.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<a2.length)throw Error(`OUTLINE 指定 ${a2.length} 章,实际只生成 ${u.length} 章:${az.join(";")||"部分章节未生成"}`);aF(a.signal),bi(G,bh({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bQ={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bQ=await bM(o,aw,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bi(G,bQ.stage),y(u),aF(a.signal),bQ.notes))aw.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bR=I(aw,{maxItems:Math.max(48,10*a2.length),maxChars:Math.max(52e3,9e3*a2.length),preservePinned:!0});aw.splice(0,aw.length,...bR);let bT=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)bT[b.key]=`${aE(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b0=aV(aw,q,T),b1=a_(aw),b2=a0(aw,U),b3=aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aE(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b4={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&&aE(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aE(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}([...b3,...b0,...b1,...b2],q,T)){let b=I(aw,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b4=await aW(b,ag,q,T,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aF(a.signal);let b5=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}([...b3,...b0,...b1,...b2,...b4.facts],aw);for(let a of(bi(G,bQ.stage),b4.stages))bi(G,a);y();let b6=aU(aw),b7=aw.filter(a=>"pinned-evidence"===a.source).length,b8=aw.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,b9=bh({type:"reference",roleId:"quality-enhancement",status:aw.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aw.length} 条,人工确认/固定证据 ${b7} 条,自动检索证据 ${b8} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(b9),y(),b5))bT[a.key]=`${aE(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ca=new Map;for(let a of aw)ca.set(a.filePath,(ca.get(a.filePath)??0)+1);let cc=new Map;for(let a of aw)cc.set(a.source||"unknown",(cc.get(a.source||"unknown")??0)+1);let cd=[...ca.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ch=bb(b5,b6,ay,T,U),ci=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)}}),cj=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,b5,q);cj.warnings.push(...W.warnings),cj.errors.push(...W.blockingIssues);let ck=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}(cj,ch,u);for(let a of(ck.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}(ci)),aK))for(let b of a.warnings)ck.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cr=bu(aK,q),cs=Date.now(),ct=(0,au.V7)(u.map(a=>a.content).join("\n\n"));bi(G,bh({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${ct} 字`,details:[`章节数:${u.length}`,`目标:${bv.targetChars||bv.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cu=bE.enableDocumentBudgetExpansion&&!bv.longformStrict?await B(()=>cn({template:q,chapters:u,budget:bv,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cr,signal:a.signal})):u;u.splice(0,u.length,...cu);let cv=u.map(a=>a.content).join("\n\n"),cw=c0(u,b5,cv);cw.patchedCount>0&&(u.splice(0,u.length,...cw.chapters),ck.push({level:"info",message:`已自动补写未落位事实 ${cw.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cx=(0,au.fW)(bv,u.map(a=>a.content).join("\n\n")),cC=[bv.targetChars?`目标 ${bv.targetChars} 字${bv.minChars||bv.maxChars?`(区间 ${bv.minChars||0}-${bv.maxChars||"∞"} 字)`:""}`:void 0,bv.targetPages?`目标 ${bv.targetPages} 页${bv.minPages||bv.maxPages?`(区间 ${bv.minPages||0}-${bv.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bi(G,bh({type:"validation",roleId:"document-budget",status:bv.maxChars&&cx.currentChars>bv.maxChars||bv.minChars&&cx.currentChars<bv.minChars?"fallback":"success",message:bj(`文档预算:当前 ${cx.currentChars} 字,新增 ${Math.max(0,cx.currentChars-ct)} 字,预计 ${cx.estimatedPages} 页;${cC}`,cs)},{subtitle:"文档预算"})),y(u);let cF=aB.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cH=Math.max(0,a2.length-u.length);for(let a of(cF>0&&ck.push({level:"info",message:`章节生成存在补充完善:${cF} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cH>0&&ck.push({level:"error",message:`部分章节生成失败:${cH} 章`,suggestion:az.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"}),u)){let b=a2.find(b=>b.id===a.id);if(!b)continue;let c=cb({chapter:b,content:a.content,evidence:a.evidence||[]});c.length>0&&ck.push({level:"error",message:`${(0,P.GQ)(a.title)} 小节资料事实或量化参数落位不足:${c.slice(0,5).join(";")}`,suggestion:"请根据绑定资料定向补写对应小节,优先使用清单、图纸、招标要求中的原始事实、规格、数量、标准和工期参数。"})}let cI=ck.filter(a=>"error"===a.level&&(0,av.Nz)(a)).length,cK=[...G];bi(cK,bh({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${aw.length} 条,来源文件 ${cd.length} 份,结构化事实 ${b5.length} 条`,details:[`证据类型:${[...cc.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${an.usableChunkCount} 条,待索引 ${an.pendingJobs} 个,向量 ${an.vectorStatus?.status||"unknown"}`,cw.patchedCount>0?`自动补写事实:${cw.patchedCount}/${cw.missingCount}`:`事实落位补写:0/${cw.missingCount}`]},{subtitle:"资料使用报告"})),bi(cK,bh({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:"联网增强报告"})),bi(cK,bh({type:"validation",roleId:"document-workflow",status:cI>0?"failed":"success",message:`阻断 ${cI},错误 ${cj.errors.length},警告 ${cj.warnings.length}`},{subtitle:"最终规范校验"})),bi(cK,bh({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bi(cK,bh({type:"export_ready",roleId:"document-workflow",status:cI>0?"failed":"success",message:cI>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cL={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:bT,structuredFacts:b5,factsModel:ch,chapters:u,sources:cd,missingItems:[...new Set(ay)],validation:cj,validationIssues:ck,executionStages:cK,exportGate:{passed:0===cI,blockingIssues:ck.filter(a=>"error"===a.level&&(0,av.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cA(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},cM=at(cL,{forbidDrawingImages:cr,promptRules:ad});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b,c=as(cM,u,{forbidDrawingImages:cr,promptRules:ad}).chapters.map(a=>{let b=a2.find(b=>b.id===a.id)||a;return{...a,content:cW(a.content,b)}}),d=cT(cJ(cV(as(at({...cL,chapters:c},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad}).markdown),b5),b5),e=(a,b)=>{let c=[...ck];return c.push(...w({markdown:a,spec:T,summary:R})),c.push(...A({markdown:a,facts:b5,summary:R,profile:U})),c.push(...x(a,R)),c.push(...cU(a,b5)),ad.forbidToc||(c.push(...(0,av.gN)(a)),c.push(...(0,av.f8)(a))),c.push(...(0,av.K1)(a)),c.push(...(0,av.k0)(a)),c.push(...(0,av.qK)(a,b)),c.push(...(0,av.iC)(a)),c.push(...(0,av.BV)(a)),c.push(...ac(a)),c.push(...(0,av.Ty)(b)),c.push(...(0,av.N1)(a,ch)),c.push(...cz(a)),c.push(...(0,av.bM)(a)),c.push(...(0,av.M$)(a,J)),c.push(...(0,av.AC)(a,b)),c.push(...(0,av.mR)(a,q)),c.push(...(0,au.PE)(q.generationSettings||q.exportSettings,a).filter(a=>!(bv.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,au.ty)(bv,a)),c.push(...aq(a,q)),c.push(...ap(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(()=>bl(bF,"default-path-quality-repair",()=>by({markdown:d,template:q,chapters:c,promptTexts:af,requirement:a.requirement,issues:g,forbidDrawingImages:cr,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:g.length}),cK);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:cW(a.content,b)}}),f=e(d=cT(cJ(cV(as(at({...cL,chapters:c},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad}).markdown),b5),b5),c))}let h=(0,av.Ai)(f,ch,c),i=cK.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(bh({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{...cL,chapters:j,validationIssues:f,exportGate:h,executionStages:i,partialChapters:c.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cA(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:j,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bF},markdown:d}}aF(a.signal);let cN=u.map(a=>{let b=bw({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:bv.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,au.V7)(a.content)}}),cO=cN.filter(a=>"pass"!==a.status).length,cP=bE.enableChapterReview&&cO>0;cP&&(bi(cK,bh({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cO}/${u.length} 章存在本地风险`,details:[`审查并发:${bE.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cK));let cQ=cP?await B(()=>bl(bF,"chapter-review",()=>co({template:q,chapters:u,budget:bv,promptTexts:ah||af,requirement:a.requirement,strategy:bE,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cK):{summaries:cN,stage:bh({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bE.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cK.push(cQ.stage);let cR=cQ.summaries,cS=cR.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cS.length>0){bi(cK,bh({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cS.length} 章`,details:cS.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cS.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cK);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<cS.length;d+=e){aF(a.signal);let f=cS.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 aS(d=>bx({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:ah||af,requirement:a.requirement,forbidDrawingImages:cr,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&&(cR=cR.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,au.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),cM=at({...cL,chapters:u,validationIssues:ck,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad})),cK.push(bh({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cK)}if(cP)for(let a of cR.filter(a=>"pass"!==a.status&&a.issues.length>0))ck.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let cY=bE.enableGlobalReview&&(cP||ck.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));cY&&(bi(cK,bh({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cK));let cZ=cY?await B(()=>bl(bF,"global-consistency-review",()=>cp({template:q,chapters:u,chapterReviews:cR,promptTexts:ah||af,requirement:a.requirement,projectContext:a3,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cK):{issues:[],stage:bh({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bE.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cK.push(cZ.stage),cZ.issues))ck.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cK);let c$=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,au.V7)(a.content)<Math.floor(.7*(bv.chapterTargets.get(a.id)||1200))||cR.some(b=>b.chapterId===a.id&&"fail"===b.status)||bw({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:bv.chapterTargets.get(a.id)||1200}).length>0),da=cI>0||cZ.issues.length>0||cR.some(a=>"fail"===a.status)||ck.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),db=bE.enableFinalQualityReview&&(da||c$.length>Math.max(3,Math.floor(.35*u.length))),dc=Date.now();db&&(bi(cK,bh({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c$.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cK));let dd=I(aw,{maxItems:Math.max(32,8*a2.length),maxChars:Math.max(36e3,6e3*a2.length),preservePinned:!0}),de=db?await B(()=>cq({template:q,spec:T,markdown:cM,evidence:dd,promptTexts:ah||af,projectContext:a3,requirement:a.requirement,diagnostics:bF,signal:a.signal}),cK):{markdown:cM,stage:{type:"llm_review",roleId:"llm-review",status:c$.length>0?"fallback":"success",message:c$.length>0?`本地风险扫描发现 ${c$.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};de.stage.message=bj(de.stage.message||"LLM 审查完成",dc),aF(a.signal);let df=as(de.markdown===cM?at({...cL,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}):de.markdown,u,{forbidDrawingImages:cr,promptRules:ad}).markdown,dg=aq(df,q).map(a=>a.message),dh=(0,av.bM)(df).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),di=(0,av.mR)(df,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dj=(0,av.N1)(df,ch).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dk=ad.forbidToc?[]:[...(0,av.gN)(df),...(0,av.f8)(df)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dl=(0,av.k0)(df).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dm=(0,av.qK)(df,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dn=(0,av.iC)(df).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dp=(0,av.BV)(df).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dq=[...dg,...dh,...di,...dj,...dk,...dl,...dm,...dn,...dp,...(0,av.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...ac(df).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],dr=new Set(dm),ds=Date.now(),dt=dq.filter(a=>!dr.has(a));bi(cK,bh({type:"llm_review",roleId:"quality-repair",status:dt.length>0?"running":"success",message:dt.length>0?`正在进行精准质量修复:${dt.length} 个问题`:"未发现需要精准修复的问题",details:dt,progress:{current:1,total:Math.max(1,dt.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cK);let du=await B(()=>bl(bF,"local-patch-quality-repair",()=>by({markdown:df,template:q,chapters:u,promptTexts:af,requirement:a.requirement,issues:dt,forbidDrawingImages:cr,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:dt.length}),cK);du.stage&&(du.stage.message=bj(du.stage.message||"质量修复完成",ds)),aF(a.signal);let dv=du.stage?[...cK,de.stage,du.stage]:[...cK,de.stage],dw=du.chapters,dx=at({...cL,chapters:dw,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),dy=(0,av.yw)(dx,dw).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dy.length>0){let b=Date.now();bi(dv,bh({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dy.length} 个问题`,details:dy.map(a=>a.message),progress:{current:1,total:dy.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(dw,dv);let c=[...dw];for(let b=0;b<dw.length;b+=bE.maxChapterConcurrency){aF(a.signal);let d=dw.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dy.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=bv.chapterTargets.get(b.id)||1200,f=br(d,a1);try{let g=await aS(g=>cl({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:a3,requirement:a.requirement,roleContext:bt(aK,d,f),targetWords:e,forbidDrawingImages:cr,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})}dw=c;let d=(0,av.qK)(at({...cL,chapters:dw,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),dw);bi(dv,bh({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bj(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(dw,dv)}let dz=(0,au.fW)(bv,dw.map(a=>a.content).join("\n\n"));if(bE.enableDocumentBudgetExpansion&&!bv.longformStrict&&bv.minChars&&dz.currentChars<Math.floor(.9*bv.minChars)&&(!bv.maxChars||dz.currentChars<bv.maxChars)){let b=Date.now(),c=dz.currentChars;bi(dv,bh({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bv.minChars} 字`,`章节数:${dw.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(dw,dv),dw=await B(()=>cn({template:q,chapters:dw,budget:bv,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cr,signal:a.signal}),dv);let d=(0,au.fW)(bv,dw.map(a=>a.content).join("\n\n"));bi(dv,bh({type:"validation",roleId:"document-budget-repair",status:bv.minChars&&d.currentChars<bv.minChars?"fallback":"success",message:bj(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dA=as(at({...cL,chapters:dw,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),dw,{forbidDrawingImages:cr,promptRules:ad}),dB=dA.chapters,dC=dA.markdown,dD=dB.map(a=>{let b=dw.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dE=(0,av.yw)(dC,dD).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dE.length>0){let b=Date.now();bi(dv,bh({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dE.length} 个问题`,details:dE.map(a=>a.message),progress:{current:1,total:dE.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(dB,dv);let c=[...dB];for(let b=0;b<dB.length;b+=bE.maxChapterConcurrency){aF(a.signal);let d=dB.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dE.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=bv.chapterTargets.get(b.id)||1200,f=br(d,a1);try{let g=await aS(g=>cl({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:a3,requirement:a.requirement,roleContext:bt(aK,d,f),targetWords:e,forbidDrawingImages:cr,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})}dB=(dA=as(at({...cL,chapters:c,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad})).chapters,dC=dA.markdown;let d=(0,av.qK)(dC,dB);bi(dv,bh({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bj(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(dB,dv)}dB=(dA=as(at({...cL,chapters:dB,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),dB,{forbidDrawingImages:cr,promptRules:ad})).chapters,dC=cT(cJ(dA.markdown,b5),b5);let dF=bf({facts:b5,markdown:dC});dF.size>0&&cK.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dF.size} 项`,details:[...dF.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dG=[...dg];(ck=(0,av.kQ)(T,[...ck,...dG.map(a=>({level:"warning",message:a}))],ch,dB,dC,Q,J)).push(...w({markdown:dC,spec:T,summary:R})),ck.push(...A({markdown:dC,facts:b5,summary:R,profile:U})),ck.push(...x(dC,R)),ck.push(...cU(dC,b5)),ad.forbidToc||(ck.push(...(0,av.gN)(dC)),ck.push(...(0,av.f8)(dC))),ck.push(...(0,av.K1)(dC)),ck.push(...(0,av.k0)(dC)),ck.push(...(0,av.qK)(dC,dB)),ck.push(...(0,av.iC)(dC)),ck.push(...(0,av.BV)(dC)),ck.push(...ac(dC)),ck.push(...(0,av.Ty)(dB)),ck.push(...(0,av.N1)(dC,ch)),ck.push(...cz(dC)),ck.push(...(0,av.bM)(dC)),ck.push(...(0,av.M$)(dC,J)),ck.push(...(0,av.AC)(dC,dB)),ck.push(...(0,av.mR)(dC,q));let dH=c0(dB,b5,dC);dH.patchedCount>0&&(dB=dH.chapters.map(a=>({...a,sections:a.sections||[]})),ck.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dH.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),dC=as(at({...cL,chapters:dB,validationIssues:ck,exportGate:cL.exportGate,executionStages:cK},{forbidDrawingImages:cr,promptRules:ad}),dB,{forbidDrawingImages:cr,promptRules:ad}).markdown),ck.push(...function(a,b,c={}){return c_(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(dC,[...b5,...ch.preciseFacts],{maxIssues:30})),dC=as(dC,dB,{forbidDrawingImages:cr,promptRules:ad}).markdown;let dI=(0,au.ty)(bv,dC),dJ=(0,au.PE)(q.generationSettings||q.exportSettings,dC).filter(a=>!(bv.minPages&&/低于目标页数/u.test(a.message)));ck.push(...dJ),ck.push(...dI),ck.push(...aq(dC,q)),ck.push(...ap(dC,ad));let dK=(0,av.Ai)(ck,ch,dB),dL=dK.blockingIssues.length,dM=(0,av.Ff)(ck);bF.quality.blockingCount+=dM.blocking,bF.quality.importantCount+=dM.important,bF.quality.minorCount+=dM.minor;let dN=dv.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dL>0?"failed":"success",message:`阻断 ${dL},问题 ${ck.length}`}:"export_ready"===a.type?{...a,status:dK.passed?"success":"failed",message:dK.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bF.llm.currentLimit=aM();let dO=[...bF.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dN.push(bh({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} 次${dO?`,Top耗时:${dO}`:""}`},{subtitle:"后台诊断"}));let dP=dB.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cL,chapters:dP,validationIssues:ck,exportGate:dK,executionStages:dN,partialChapters:dB.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cA(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dP,reviewMetadata:{chapterSummaries:cR,globalIssues:cZ.issues,diagnostics:bF}},markdown:dC}}async function db(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=bB(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>bz(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>bz(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=c9(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=c3(c,c.queries,[]),s=c4(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=>bA(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=c2(c,p.filter(a=>bA(f,a.filePath,k)),{maxItems:c5(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}
|
|
168
|
+
${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 ap=T?.chapterRules.find(a=>a.id===c.id||a.title===c.title),aq=bv.chapterTargets.get(c.id)||1200,as=Math.ceil(aq*(bv.maxChars?1.1:1.18)),at=bv.targetChars?Math.min(1800,Math.max(600,Math.floor(.5*aq))):1200,az=Math.max(Math.min(d?.minWords||0,aq),Math.min(ap?.minWords||0,aq),Math.min(T?.dynamicChapterRule.minWordsPerChapter||0,aq),Math.floor(.78*aq),at),aA=ce(az,aq),aD=Math.max(900,Math.min(aq,Math.ceil(.75*aq),aq)),aG=Math.max(450,Math.min(az,Math.floor(.72*aD))),aH=Math.max(aD+300,Math.min(as,Math.ceil(1.25*aD))),aJ=ce(aG,aD),aL=Math.min(cf(aD),3e5),aO=c.sections?.filter(Boolean).length||0,aP=/[、,,;;]/u.test(c.title),aR=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aO>=2&&(bv.longformStrict||!aP);G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aR?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aR?[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`首轮质量目标:约 ${aq} 字${aq!=aq?`,总预算分配约 ${aq} 字`:""},上限约 ${as} 字`,`小节并发上限:${bE.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${an.satisfied}/${an.total} 已满足,缺失 ${an.missing},低置信 ${an.lowConfidence}`,`目标字数:约 ${aq} 字,上限约 ${as} 字`,`章节并发上限:${bP}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:a2.length,label:aR?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aT=Math.ceil((c.sections?.length||2)/Math.max(1,bE.maxSectionConcurrency||1)),aU=Math.max(cf(aq),Math.min(18e5,3e5*aT+18e4)),aV=aR?await B(()=>bl(bF,`chapter-section-draft:${c.id}`,()=>aS(b=>cd({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:W,projectContext:a3,requirement:a.requirement,roleContext:S,targetWords:aq,maxWords:as,forbidDrawingImages:R,factCoverageContext:aj,projectRoot:o,modelName:aN,fileRolesHash:aQ,allowPartialResult:!1,maxSectionConcurrency:bE.maxSectionConcurrency,sectionEvidenceProvider:a=>c2({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:ak,fileProcessingByPath:al,signal:b}),diagnostics:bF,signal:b}),aU,a.signal))):await B(()=>bl(bF,`chapter-draft:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:az,targetWords:aq,maxWords:as,maxTokens:aA,factCoverageContext:aj,signal:b}),cf(aq),a.signal)));if(!aV&&aR?(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${aq} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aV=await B(()=>bl(bF,`chapter-draft-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:aG,targetWords:aD,maxWords:aH,maxTokens:aJ,factCoverageContext:aj,signal:b}),aL,a.signal)))):aV||(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${aq} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:a2.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aV=await B(()=>bl(bF,`chapter-draft-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:aG,targetWords:aD,maxWords:aH,maxTokens:aJ,factCoverageContext:aj,signal:b}),aL,a.signal)))),aF(a.signal),aV||(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在压缩上下文后重试生成`,details:["已压缩证据与上下文后重新请求模型生成",`目标字数:约 ${aq} 字`],progress:{current:g+1,total:a2.length,label:"紧凑重试"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aV=await B(()=>bl(bF,`chapter-draft-compact-fallback:${c.id}`,()=>aS(b=>bN(q,c,N,O,W,a3,a.requirement,S,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*az)),targetWords:aq,maxWords:as,maxTokens:aA,factCoverageContext:aj,signal:b}),cf(aq),a.signal)))),aF(a.signal),!aV)throw Error(`${c.title} 大模型未返回有效章节正文`);let aW=aV,aX=cD(aW,c),aZ=0,a_=aX.map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|");for(;aX.length>0;){aZ+=1,G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 存在 ${aX.length} 个小节缺口,正在按目标缺口强制补写`,details:aX.map(a=>a.message),progress:{current:g+1,total:a2.length,label:`小节补写第 ${aZ} 轮`}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aW,d=await B(()=>bl(bF,`chapter-section-repair:${c.id}:${aZ}`,()=>ck({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:a3,requirement:a.requirement,roleContext:S,targetWords:aq,maxWords:as,forbidDrawingImages:R,factCoverageContext:aj,maxSectionConcurrency:bE.maxSectionConcurrency,forcedSections:aX,signal:a.signal})));d?.trim()&&(aW=d);let e=(aX=cD(aW,c)).map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|"),f=e!==a_;if(0===aX.length||!f)break;a_=e}aX.length>0&&(G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"failed",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,已标记为阻断问题`,details:aX.map(a=>a.message),progress:{current:g+1,total:a2.length,label:"小节未达标"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let a0=bw({chapter:c,content:aW,missingFacts:O,targetWords:aq}),bb=(0,av.Ff)(a0);bF.quality.blockingCount+=bb.blocking,bF.quality.importantCount+=bb.important,bF.quality.minorCount+=bb.minor;let bc=bo(a0);if(bc.length>0){let b=aW;G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${bc.length} 个阻断问题`,details:bc,progress:{current:g+1,total:a2.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bl(bF,`chapter-repair:${c.id}`,()=>bx({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,..._.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:bc,promptTexts:W,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bF,signal:a.signal})));aW=d.content,d.appliedCount>0&&(bF.quality.repairedCount+=1),aF(a.signal)}if(!aW.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bd=aW,be=0;if((0,au.V7)(bd)<Math.floor(.82*aq)||bo(bw({chapter:c,content:bd,missingFacts:O,targetWords:aq})).length>0){G[i]=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,au.V7)(bd)} 字 / 目标 ${Math.floor(.95*aq)} 字`,`章节并发:${bP}`],progress:{current:g+1,total:a2.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bl(bF,`chapter-expand:${c.id}`,()=>cl({template:q,chapter:c,content:aW,evidence:N,promptTexts:W,requirement:a.requirement,roleContext:S,targetChars:Math.floor(.95*aq),maxChars:as,forbidDrawingImages:R,maxTokens:Math.min(aA,aJ),signal:a.signal})));bd=b.content,be=b.rounds}bd=cS(bd,c);let bf=cb({chapter:c,content:bd,evidence:N}),bg=(0,au.V7)(bd),bk=c.sections?.length?c.sections:aa(bd),bm=(0,av.qK)(bd,[{title:c.title,content:bd,sections:bk}]).map(a=>a.message),bn=[...bw({chapter:{...c,sections:bk},content:bd,missingFacts:O,targetWords:aq}),...bm,...bf.map(a=>`小节事实密度不足:${a}`)],bp=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"}(bg,aq,bn);f=bh({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:bp,message:bj(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${be>0?`并定向扩写 ${be} 轮`:""}:当前 ${bg} 字 / 目标 ${Math.floor(.95*aq)} 字${"success"!==bp?`;风险:${bn.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(bg/Math.max(1,Math.floor(.95*aq))*100)}%`,...Y,`二级小节:${bk.length} 个`,`扩写轮次:${be}`],progress:{current:g+1,total:a2.length,label:"success"===bp?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aB.push(f);let bq={id:c.id,title:c.title,content:bd,evidence:N,missingFacts:O,sections:bk};u.push(bq),y(u);let by=bw({chapter:c,content:bd,missingFacts:O,targetWords:aq}),bz=(0,av.Ff)(by);bF.quality.blockingCount+=bz.blocking,bF.quality.importantCount+=bz.important,bF.quality.minorCount+=bz.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),az.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aB.push(bh({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(`章节生成未完成:${az.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<a2.length)throw Error(`OUTLINE 指定 ${a2.length} 章,实际只生成 ${u.length} 章:${az.join(";")||"部分章节未生成"}`);aF(a.signal),bi(G,bh({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bQ={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bQ=await bM(o,aw,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bi(G,bQ.stage),y(u),aF(a.signal),bQ.notes))aw.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bR=I(aw,{maxItems:Math.max(48,10*a2.length),maxChars:Math.max(52e3,9e3*a2.length),preservePinned:!0});aw.splice(0,aw.length,...bR);let bT=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)bT[b.key]=`${aE(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b0=aV(aw,q,T),b1=a_(aw),b2=a0(aw,U),b3=aK.flatMap(a=>a.facts.map(a=>({key:a.key,value:aE(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b4={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&&aE(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aE(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}([...b3,...b0,...b1,...b2],q,T)){let b=I(aw,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b4=await aW(b,ag,q,T,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aF(a.signal);let b5=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}([...b3,...b0,...b1,...b2,...b4.facts],aw);for(let a of(bi(G,bQ.stage),b4.stages))bi(G,a);y();let b6=aU(aw),b7=aw.filter(a=>"pinned-evidence"===a.source).length,b8=aw.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,b9=bh({type:"reference",roleId:"quality-enhancement",status:aw.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aw.length} 条,人工确认/固定证据 ${b7} 条,自动检索证据 ${b8} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(b9),y(),b5))bT[a.key]=`${aE(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ca=new Map;for(let a of aw)ca.set(a.filePath,(ca.get(a.filePath)??0)+1);let cc=new Map;for(let a of aw)cc.set(a.source||"unknown",(cc.get(a.source||"unknown")??0)+1);let cg=[...ca.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ch=bb(b5,b6,ay,T,U),ci=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)}}),cj=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,b5,q);cj.warnings.push(...W.warnings),cj.errors.push(...W.blockingIssues);let cq=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}(cj,ch,u);for(let a of(cq.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}(ci)),aK))for(let b of a.warnings)cq.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cr=bu(aK,q),cs=Date.now(),ct=(0,au.V7)(u.map(a=>a.content).join("\n\n"));bi(G,bh({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${ct} 字`,details:[`章节数:${u.length}`,`目标:${bv.targetChars||bv.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cu=bE.enableDocumentBudgetExpansion?await B(()=>cm({template:q,chapters:u,budget:bv,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cr,signal:a.signal})):u;u.splice(0,u.length,...cu);let cv=u.map(a=>a.content).join("\n\n"),cw=cY(u,b5,cv);cw.patchedCount>0&&(u.splice(0,u.length,...cw.chapters),cq.push({level:"info",message:`已自动补写未落位事实 ${cw.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cB=(0,au.fW)(bv,u.map(a=>a.content).join("\n\n")),cE=[bv.targetChars?`目标 ${bv.targetChars} 字${bv.minChars||bv.maxChars?`(区间 ${bv.minChars||0}-${bv.maxChars||"∞"} 字)`:""}`:void 0,bv.targetPages?`目标 ${bv.targetPages} 页${bv.minPages||bv.maxPages?`(区间 ${bv.minPages||0}-${bv.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bi(G,bh({type:"validation",roleId:"document-budget",status:bv.maxChars&&cB.currentChars>bv.maxChars||bv.minChars&&cB.currentChars<bv.minChars?"fallback":"success",message:bj(`文档预算:当前 ${cB.currentChars} 字,新增 ${Math.max(0,cB.currentChars-ct)} 字,预计 ${cB.estimatedPages} 页;${cE}`,cs)},{subtitle:"文档预算"})),y(u);let cG=aB.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cH=Math.max(0,a2.length-u.length);for(let a of(cG>0&&cq.push({level:"info",message:`章节生成存在补充完善:${cG} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cH>0&&cq.push({level:"error",message:`部分章节生成失败:${cH} 章`,suggestion:az.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"}),u)){let b=a2.find(b=>b.id===a.id);if(!b)continue;let c=cb({chapter:b,content:a.content,evidence:a.evidence||[]});c.length>0&&cq.push({level:"error",message:`${(0,P.GQ)(a.title)} 小节资料事实或量化参数落位不足:${c.slice(0,5).join(";")}`,suggestion:"请根据绑定资料定向补写对应小节,优先使用清单、图纸、招标要求中的原始事实、规格、数量、标准和工期参数。"})}let cI=cq.filter(a=>"error"===a.level&&(0,av.Nz)(a)).length,cJ=[...G];bi(cJ,bh({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${aw.length} 条,来源文件 ${cg.length} 份,结构化事实 ${b5.length} 条`,details:[`证据类型:${[...cc.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${an.usableChunkCount} 条,待索引 ${an.pendingJobs} 个,向量 ${an.vectorStatus?.status||"unknown"}`,cw.patchedCount>0?`自动补写事实:${cw.patchedCount}/${cw.missingCount}`:`事实落位补写:0/${cw.missingCount}`]},{subtitle:"资料使用报告"})),bi(cJ,bh({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:"联网增强报告"})),bi(cJ,bh({type:"validation",roleId:"document-workflow",status:cI>0?"failed":"success",message:`阻断 ${cI},错误 ${cj.errors.length},警告 ${cj.warnings.length}`},{subtitle:"最终规范校验"})),bi(cJ,bh({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bi(cJ,bh({type:"export_ready",roleId:"document-workflow",status:cI>0?"failed":"success",message:cI>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cK={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:bT,structuredFacts:b5,factsModel:ch,chapters:u,sources:cg,missingItems:[...new Set(ay)],validation:cj,validationIssues:cq,executionStages:cJ,exportGate:{passed:0===cI,blockingIssues:cq.filter(a=>"error"===a.level&&(0,av.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cz(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},cL=at(cK,{forbidDrawingImages:cr,promptRules:ad});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b,c=as(cL,u,{forbidDrawingImages:cr,promptRules:ad}).chapters.map(a=>{let b=a2.find(b=>b.id===a.id)||a;return{...a,content:cS(a.content,b)}}),d=cP(cF(cR(as(at({...cK,chapters:c},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad}).markdown),b5),b5),e=(a,b)=>{let c=[...cq];return c.push(...w({markdown:a,spec:T,summary:R})),c.push(...A({markdown:a,facts:b5,summary:R,profile:U})),c.push(...x(a,R)),c.push(...cQ(a,b5)),ad.forbidToc||(c.push(...(0,av.gN)(a)),c.push(...(0,av.f8)(a))),c.push(...(0,av.K1)(a)),c.push(...(0,av.k0)(a)),c.push(...(0,av.qK)(a,b)),c.push(...(0,av.iC)(a)),c.push(...(0,av.BV)(a)),c.push(...ac(a)),c.push(...(0,av.Ty)(b)),c.push(...(0,av.N1)(a,ch)),c.push(...cy(a)),c.push(...(0,av.bM)(a)),c.push(...(0,av.M$)(a,J)),c.push(...(0,av.AC)(a,b)),c.push(...(0,av.mR)(a,q)),c.push(...(0,au.PE)(q.generationSettings||q.exportSettings,a).filter(a=>!(bv.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,au.ty)(bv,a)),c.push(...aq(a,q)),c.push(...ap(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(()=>bl(bF,"default-path-quality-repair",()=>by({markdown:d,template:q,chapters:c,promptTexts:af,requirement:a.requirement,issues:g,forbidDrawingImages:cr,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:g.length}),cJ);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:cS(a.content,b)}}),f=e(d=cP(cF(cR(as(at({...cK,chapters:c},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad}).markdown),b5),b5),c))}let h=(0,av.Ai)(f,ch,c),i=cJ.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(bh({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{...cK,chapters:j,validationIssues:f,exportGate:h,executionStages:i,partialChapters:c.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cz(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:j,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bF},markdown:d}}aF(a.signal);let cM=u.map(a=>{let b=bw({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:bv.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,au.V7)(a.content)}}),cN=cM.filter(a=>"pass"!==a.status).length,cO=bE.enableChapterReview&&cN>0;cO&&(bi(cJ,bh({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cN}/${u.length} 章存在本地风险`,details:[`审查并发:${bE.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cJ));let cU=cO?await B(()=>bl(bF,"chapter-review",()=>cn({template:q,chapters:u,budget:bv,promptTexts:ah||af,requirement:a.requirement,strategy:bE,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cJ):{summaries:cM,stage:bh({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bE.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cJ.push(cU.stage);let cV=cU.summaries,cW=cV.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cW.length>0){bi(cJ,bh({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cW.length} 章`,details:cW.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cW.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cJ);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<cW.length;d+=e){aF(a.signal);let f=cW.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 aS(d=>bx({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:ah||af,requirement:a.requirement,forbidDrawingImages:cr,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&&(cV=cV.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,au.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),cL=at({...cK,chapters:u,validationIssues:cq,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad})),cJ.push(bh({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cJ)}if(cO)for(let a of cV.filter(a=>"pass"!==a.status&&a.issues.length>0))cq.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let c6=bE.enableGlobalReview&&(cO||cq.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));c6&&(bi(cJ,bh({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cJ));let c7=c6?await B(()=>bl(bF,"global-consistency-review",()=>co({template:q,chapters:u,chapterReviews:cV,promptTexts:ah||af,requirement:a.requirement,projectContext:a3,diagnostics:bF,signal:a.signal}),{chapters:u.length}),cJ):{issues:[],stage:bh({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bE.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cJ.push(c7.stage),c7.issues))cq.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cJ);let c8=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,au.V7)(a.content)<Math.floor(.7*(bv.chapterTargets.get(a.id)||1200))||cV.some(b=>b.chapterId===a.id&&"fail"===b.status)||bw({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:bv.chapterTargets.get(a.id)||1200}).length>0),c9=cI>0||c7.issues.length>0||cV.some(a=>"fail"===a.status)||cq.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),da=bE.enableFinalQualityReview&&(c9||c8.length>Math.max(3,Math.floor(.35*u.length))),db=Date.now();da&&(bi(cJ,bh({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c8.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cJ));let dc=I(aw,{maxItems:Math.max(32,8*a2.length),maxChars:Math.max(36e3,6e3*a2.length),preservePinned:!0}),dd=da?await B(()=>cp({template:q,spec:T,markdown:cL,evidence:dc,promptTexts:ah||af,projectContext:a3,requirement:a.requirement,diagnostics:bF,signal:a.signal}),cJ):{markdown:cL,stage:{type:"llm_review",roleId:"llm-review",status:c8.length>0?"fallback":"success",message:c8.length>0?`本地风险扫描发现 ${c8.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};dd.stage.message=bj(dd.stage.message||"LLM 审查完成",db),aF(a.signal);let de=as(dd.markdown===cL?at({...cK,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}):dd.markdown,u,{forbidDrawingImages:cr,promptRules:ad}).markdown,df=aq(de,q).map(a=>a.message),dg=(0,av.bM)(de).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dh=(0,av.mR)(de,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),di=(0,av.N1)(de,ch).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dj=ad.forbidToc?[]:[...(0,av.gN)(de),...(0,av.f8)(de)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dk=(0,av.k0)(de).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dl=(0,av.qK)(de,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dm=(0,av.iC)(de).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dn=(0,av.BV)(de).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dp=[...df,...dg,...dh,...di,...dj,...dk,...dl,...dm,...dn,...(0,av.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...ac(de).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],dq=new Set(dl),dr=Date.now(),ds=dp.filter(a=>!dq.has(a));bi(cJ,bh({type:"llm_review",roleId:"quality-repair",status:ds.length>0?"running":"success",message:ds.length>0?`正在进行精准质量修复:${ds.length} 个问题`:"未发现需要精准修复的问题",details:ds,progress:{current:1,total:Math.max(1,ds.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cJ);let dt=await B(()=>bl(bF,"local-patch-quality-repair",()=>by({markdown:de,template:q,chapters:u,promptTexts:af,requirement:a.requirement,issues:ds,forbidDrawingImages:cr,strategy:bE,diagnostics:bF,signal:a.signal}),{issues:ds.length}),cJ);dt.stage&&(dt.stage.message=bj(dt.stage.message||"质量修复完成",dr)),aF(a.signal);let du=dt.stage?[...cJ,dd.stage,dt.stage]:[...cJ,dd.stage],dv=dt.chapters,dw=at({...cK,chapters:dv,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),dx=(0,av.yw)(dw,dv).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dx.length>0){let b=Date.now();bi(du,bh({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dx.length} 个问题`,details:dx.map(a=>a.message),progress:{current:1,total:dx.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(dv,du);let c=[...dv];for(let b=0;b<dv.length;b+=bE.maxChapterConcurrency){aF(a.signal);let d=dv.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dx.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=bv.chapterTargets.get(b.id)||1200,f=br(d,a1);try{let g=await aS(g=>ck({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:a3,requirement:a.requirement,roleContext:bt(aK,d,f),targetWords:e,forbidDrawingImages:cr,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})}dv=c;let d=(0,av.qK)(at({...cK,chapters:dv,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),dv);bi(du,bh({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bj(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(dv,du)}let dy=(0,au.fW)(bv,dv.map(a=>a.content).join("\n\n"));if(bE.enableDocumentBudgetExpansion&&bv.minChars&&dy.currentChars<Math.floor(.9*bv.minChars)&&(!bv.maxChars||dy.currentChars<bv.maxChars)){let b=Date.now(),c=dy.currentChars;bi(du,bh({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bv.minChars} 字`,`章节数:${dv.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(dv,du),dv=await B(()=>cm({template:q,chapters:dv,budget:bv,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cr,signal:a.signal}),du);let d=(0,au.fW)(bv,dv.map(a=>a.content).join("\n\n"));bi(du,bh({type:"validation",roleId:"document-budget-repair",status:bv.minChars&&d.currentChars<bv.minChars?"fallback":"success",message:bj(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dz=as(at({...cK,chapters:dv,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),dv,{forbidDrawingImages:cr,promptRules:ad}),dA=dz.chapters,dB=dz.markdown,dC=dA.map(a=>{let b=dv.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dD=(0,av.yw)(dB,dC).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dD.length>0){let b=Date.now();bi(du,bh({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dD.length} 个问题`,details:dD.map(a=>a.message),progress:{current:1,total:dD.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(dA,du);let c=[...dA];for(let b=0;b<dA.length;b+=bE.maxChapterConcurrency){aF(a.signal);let d=dA.slice(b,b+bE.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dD.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=bv.chapterTargets.get(b.id)||1200,f=br(d,a1);try{let g=await aS(g=>ck({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:a3,requirement:a.requirement,roleContext:bt(aK,d,f),targetWords:e,forbidDrawingImages:cr,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})}dA=(dz=as(at({...cK,chapters:c,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),c,{forbidDrawingImages:cr,promptRules:ad})).chapters,dB=dz.markdown;let d=(0,av.qK)(dB,dA);bi(du,bh({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bj(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(dA,du)}dA=(dz=as(at({...cK,chapters:dA,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),dA,{forbidDrawingImages:cr,promptRules:ad})).chapters,dB=cP(cF(dz.markdown,b5),b5);let dE=bf({facts:b5,markdown:dB});dE.size>0&&cJ.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dE.size} 项`,details:[...dE.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dF=[...df];(cq=(0,av.kQ)(T,[...cq,...dF.map(a=>({level:"warning",message:a}))],ch,dA,dB,Q,J)).push(...w({markdown:dB,spec:T,summary:R})),cq.push(...A({markdown:dB,facts:b5,summary:R,profile:U})),cq.push(...x(dB,R)),cq.push(...cQ(dB,b5)),ad.forbidToc||(cq.push(...(0,av.gN)(dB)),cq.push(...(0,av.f8)(dB))),cq.push(...(0,av.K1)(dB)),cq.push(...(0,av.k0)(dB)),cq.push(...(0,av.qK)(dB,dA)),cq.push(...(0,av.iC)(dB)),cq.push(...(0,av.BV)(dB)),cq.push(...ac(dB)),cq.push(...(0,av.Ty)(dA)),cq.push(...(0,av.N1)(dB,ch)),cq.push(...cy(dB)),cq.push(...(0,av.bM)(dB)),cq.push(...(0,av.M$)(dB,J)),cq.push(...(0,av.AC)(dB,dA)),cq.push(...(0,av.mR)(dB,q));let dG=cY(dA,b5,dB);dG.patchedCount>0&&(dA=dG.chapters.map(a=>({...a,sections:a.sections||[]})),cq.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dG.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),dB=as(at({...cK,chapters:dA,validationIssues:cq,exportGate:cK.exportGate,executionStages:cJ},{forbidDrawingImages:cr,promptRules:ad}),dA,{forbidDrawingImages:cr,promptRules:ad}).markdown),cq.push(...function(a,b,c={}){return cX(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(dB,[...b5,...ch.preciseFacts],{maxIssues:30})),dB=as(dB,dA,{forbidDrawingImages:cr,promptRules:ad}).markdown;let dH=(0,au.ty)(bv,dB),dI=(0,au.PE)(q.generationSettings||q.exportSettings,dB).filter(a=>!(bv.minPages&&/低于目标页数/u.test(a.message)));cq.push(...dI),cq.push(...dH),cq.push(...aq(dB,q)),cq.push(...ap(dB,ad));let dJ=(0,av.Ai)(cq,ch,dA),dK=dJ.blockingIssues.length,dL=(0,av.Ff)(cq);bF.quality.blockingCount+=dL.blocking,bF.quality.importantCount+=dL.important,bF.quality.minorCount+=dL.minor;let dM=du.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dK>0?"failed":"success",message:`阻断 ${dK},问题 ${cq.length}`}:"export_ready"===a.type?{...a,status:dJ.passed?"success":"failed",message:dJ.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bF.llm.currentLimit=aM();let dN=[...bF.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dM.push(bh({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} 次${dN?`,Top耗时:${dN}`:""}`},{subtitle:"后台诊断"}));let dO=dA.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cK,chapters:dO,validationIssues:cq,exportGate:dJ,executionStages:dM,partialChapters:dA.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:cz(a,bv.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dO,reviewMetadata:{chapterSummaries:cV,globalIssues:c7.issues,diagnostics:bF}},markdown:dB}}async function c7(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=bB(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>bz(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>bz(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=c5(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=c_(c,c.queries,[]),s=c0(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=>bA(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=c$(c,p.filter(a=>bA(f,a.filePath,k)),{maxItems:c1(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}
|
|
183
169
|
${a.category}
|
|
184
170
|
${a.format}
|
|
185
|
-
${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:()=>
|
|
186
|
-
${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
|
|
171
|
+
${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:()=>B,C1:()=>H,DX:()=>I,N6:()=>J,QJ:()=>A,Vh:()=>O,bV:()=>E,bj:()=>y,dU:()=>x,h0:()=>D,jG:()=>z,wR:()=>L,xm:()=>C,zY:()=>N});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(92808),n=c(81125),o=c(56942);function p(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function q(){return e.join(p(),"document-templates.json")}function r(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 s(){try{let a=q();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(q(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(a){return(0,g.createHash)("sha256").update(a).digest("hex").slice(0,12)}function v(a){return a.replace(/\s+/gu," ").trim().slice(0,160)}function w(a){let b=function(){try{let a=JSON.parse(d.readFileSync(e.join(p(),"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 x(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=w(c.promptId);a&&b.push({...a,roleId:c.roleId,contentHash:u(a.content),contentPreview:v(a.content)})}return b}function y(a){let b=K(a),c=(0,i.XB)("prompt"),d=N(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=M(d),h=[];for(let a of g){let b=w(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:u(b.content),contentPreview:v(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 z(){let a=(0,j.V)().templates,b=s().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function A(a){return z().find(b=>b.id===a)}function B(a){let b=r(a),c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}async function C(a,b=(0,h.aY)()){let c,d=A(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"),m=J(d),p=K(d);m||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),m&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${m}`}),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=N(d),r=O(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}
|
|
172
|
+
${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 w=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=x(q),z=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 B=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}`}),z.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:L(u)}),b=(0,n.h)(d,a);for(let e of(c=(0,o.$)({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:m,fileDiagnostics:w,promptDiagnostics:B,readiness:c,issues:f}}function D(a){if(new Set((0,j.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");t(s().filter(b=>b.id!==a))}function E(a){let b=A(a);if(!b)throw Error("Document template not found");let c=r({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=s();return d.push(c),t(d),c}function F(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function G(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,j.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>F(b,a)))}function H(a,b){return G(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>F(a,b)))}function I(a,b){return G(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>F(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>F(a,b)))}function J(a){return a.projectRoleConfigId||void 0}function K(a){let b=J(a);return b?(0,i.Mu)(b):void 0}function L(a){let b=new Map,c=(0,i.XB)("file");for(let d of a){let a=function(a){let b=new Set(["project_overview"]),c=a?.processingType||"";"rule"===c&&b.add("requirement_document"),"table"===c&&b.add("structured_data"),"drawing"===c&&b.add("design_specification"),"specification"===c&&b.add("technical_specification");let d=`${a?.id||""} ${a?.name||""} ${a?.description||""} ${c}`;for(let a of(0,m.t0)(d,m.hW))b.add(a);return/清单|工程量|范围|施工范围|工作内容|boq|scope/iu.test(d)&&b.add("scope_description"),/工期|进度|质量|安全|文明|环保|验收|schedule|quality|safety/iu.test(d)&&b.add("schedule_quality_safety"),/重点|难点|风险|约束|现场|限制|管线|危大|risk|constraint/iu.test(d)&&b.add("risk_constraints"),/材料|设备|品牌|资源|人员|机械|采购|resource|brand|equipment/iu.test(d)&&b.add("resource_recommendation"),/招标|响应|实质性|评审|废标|条款|要求|tender|requirement/iu.test(d)&&b.add("requirement_document"),/图纸|设计|说明|drawing|design/iu.test(d)&&b.add("design_specification"),[...b]}(c.find(a=>a.id===d.roleId));b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...a])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function M(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 N(a){let b=K(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 M(d)}function O(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.summary.coverage.satisfiedRoles,p=a.resolvedRoles.filter(a=>!a.required&&!a.satisfied).map(a=>a.role),q=[`资料范围:${a.summary.source.selectionReason},可用文件 ${a.summary.source.selectedFiles}/${a.summary.source.totalFiles} 份`,`已识别资料类型:${o.join("、")||"无"}`,a.summary.coverage.missingRoles.length?`待补充必需资料类型:${a.summary.coverage.missingRoles.join("、")}`:"必需资料类型已满足",h.length?`模板强相关资料角色缺失:${h.join("、")}`:"模板强相关资料角色已满足",p.length?`可选资料角色未识别:${p.join("、")}`:"",i.length?`证据较弱资料角色:${i.join("、")}`:""].filter(Boolean),r=[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:r.filter(Boolean).length/r.length,missingRoles:h,weakRoles:i,diagnostics:q,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?`章节证据风险:
|
|
187
173
|
${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?`章节级证据风险:
|
|
188
|
-
${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}
|
|
189
|
-
`;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),
|
|
174
|
+
${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,b){let c=[a.name,a.category,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose])].join("\n"),d=new Set(["project_overview","scope_description"]);return/需求|规则|响应|方案|实施|专项|安全|质量|进度|合规|施工组织|技术标/iu.test(c)&&["requirement_document","structured_data"].forEach(a=>d.add(a)),(/安全|质量|进度|工期|文明|环保|验收/iu.test(c)||b.materialInventory.schedule_quality_safety.length>0)&&d.add("schedule_quality_safety"),(/设计|图纸|平面|立面|剖面|做法/iu.test(c)||b.materialInventory.design_specification.length>0)&&d.add("design_specification"),(/风险|重点|难点|约束|现场|危大/iu.test(c)||b.materialInventory.risk_constraints.length>0)&&d.add("risk_constraints"),d}(a,b);return[...new Set([...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),...c])].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){if(0===a.length)return 1;let b=a.filter(a=>a.required),c=a.filter(a=>!a.required),d=b.length?b.filter(a=>a.satisfied).length/b.length:1;return Math.max(0,Math.min(1,.75*d+.2*(c.length?c.filter(a=>a.satisfied).length/c.length:1)+.05-.05*!!b.some(a=>a.weak)))}},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","structured_data","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}
|
|
175
|
+
`;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=function(a){let b=new Set(g);for(let c of["design_specification","schedule_quality_safety","risk_constraints","resource_recommendation","technical_specification","budget_cost","addendum"])a[c].length>0&&b.add(c);return[...b]}(t),A=z.filter(a=>t[a].length>0),B=z.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:z,satisfiedRoles:A,missingRoles:B,materialCompletenessRate:z.length?A.length/z.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}
|
|
190
176
|
${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function f(a,b){let c=(0,d._9)(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),e=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],f=new Map;for(let a of[...c,...e])f.set(a.id,{...f.get(a.id)||a,...a,required:a.required||f.get(a.id)?.required||!1});return[...f.values()]}function g(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&e(a,b.name)}},92808:(a,b,c)=>{c.d(b,{NT:()=>e,Ny:()=>f,hW:()=>g,nt:()=>d,rs:()=>i,t0:()=>h});let d=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],e=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|约束|响应|澄清|变更/iu],output:["需求约束","规则要求","变更说明"]},{id:"scope",label:"范围资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["实施范围","对象范围"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["结构化数据范围","参数规格范围"]},{id:"quality",label:"质量评价资料",patterns:[/质量|验收|审核|评审|评价|标准|规范|指标/iu],output:["质量要求","评价标准"]},{id:"schedule",label:"时间进度资料",patterns:[/周期|期限|进度|计划|节点|里程碑|时间|日期/iu],output:["周期要求","进度节点要求"]},{id:"safety",label:"安全合规资料",patterns:[/安全|合规|风险|应急|环保|隐私|审计|控制/iu],output:["安全合规要求","风险控制要求"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议|结论/iu],output:["背景依据","分析结论","风险建议"]}],f=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则|摘要/iu],output:["对象名称","材料范围","实施范围"]},{id:"implementation",label:"实施章节",patterns:[/方法|部署|实施|范围|组织|流程|步骤/iu],output:["实施范围","对象范围","结构化数据范围"]},{id:"controls",label:"控制章节",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价/iu],output:["质量要求","周期要求","安全合规要求"]},{id:"resources",label:"资源章节",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急|合规/iu],output:["风险控制要求","风险建议"]}],g=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|响应|requirement|rule/iu],output:["requirement_document"]},{id:"change",label:"变更澄清资料",patterns:[/补充|澄清|变更|修订|addendum|change/iu],output:["addendum"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["structured_data"]},{id:"budget",label:"预算费用资料",patterns:[/预算|费用|金额|报价|限价|成本|price|cost|budget/iu],output:["budget_cost"]},{id:"design",label:"设计方案资料",patterns:[/设计|方案|说明|图像|地图|附件|drawing|image|map|design/iu],output:["design_specification"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["resource_recommendation"]},{id:"schedule-quality-safety",label:"进度质量合规资料",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围任务资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["scope_description"]},{id:"technical",label:"技术标准资料",patterns:[/技术|规范|标准|规程|指南|手册|参数|spec|standard/iu],output:["technical_specification"]},{id:"risk",label:"风险约束资料",patterns:[/风险|重点|难点|约束|限制|现场|条件|应急/iu],output:["risk_constraints"]}];function h(a,b){let c=new Set;for(let d of b)for(let b of d.patterns)if(b.lastIndex=0,b.test(a)){for(let a of d.output)c.add(a);break}return[...c]}function i(a,b){for(let c of b)for(let b of c.patterns)if(b.lastIndex=0,b.test(a))return c.output[0]}}};
|