@customize-agent/server 4.0.109 → 4.0.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +27 -27
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/1936.js +4 -4
  5. package/.next/server/chunks/6041.js +10 -8
  6. package/.next/server/chunks/8204.js +1 -1
  7. package/.next/server/chunks/9301.js +3 -3
  8. package/.next/server/middleware-build-manifest.js +1 -1
  9. package/.next/server/pages/404.html +1 -1
  10. package/.next/server/pages/500.html +1 -1
  11. package/.next/server/pages/_error.js +1 -1
  12. package/.next/server/pages/api/kb/files/tree.js +5 -0
  13. package/.next/server/pages/api/kb/files/tree.js.nft.json +1 -0
  14. package/.next/server/pages/asset-library.html +1 -1
  15. package/.next/server/pages/document-roles.html +1 -1
  16. package/.next/server/pages/documents.html +1 -1
  17. package/.next/server/pages/guide.html +1 -1
  18. package/.next/server/pages/index.html +1 -1
  19. package/.next/server/pages/knowledge/file-detail.html +1 -1
  20. package/.next/server/pages/knowledge/files.html +1 -1
  21. package/.next/server/pages/knowledge/manage.html +1 -1
  22. package/.next/server/pages/knowledge.html +1 -1
  23. package/.next/server/pages/models.html +1 -1
  24. package/.next/server/pages/overview.html +1 -1
  25. package/.next/server/pages/prompt.html +1 -1
  26. package/.next/server/pages/settings.html +1 -1
  27. package/.next/server/pages/system/logs.html +1 -1
  28. package/.next/server/pages-manifest.json +30 -29
  29. package/.next/static/WFPMB0O5frURgkh5Qa8-n/_buildManifest.js +1 -0
  30. package/.next/static/chunks/{289-789ef042acd53608.js → 289-39ef5df8097382b4.js} +23 -23
  31. package/.next/static/chunks/478-ac4777b05b3c42e8.js +1 -0
  32. package/.next/static/chunks/497-58fdc9f4b4437f94.js +4 -0
  33. package/.next/static/chunks/713-efe6b531f7a30a5f.js +1 -0
  34. package/.next/static/chunks/788-72bd97a04f2aee27.js +1 -0
  35. package/.next/static/chunks/pages/{_app-b0159557c8407d35.js → _app-45a68e88c43b4f2c.js} +19 -19
  36. package/.next/static/chunks/pages/{asset-library-6d9b11ae4af036cb.js → asset-library-994e1e2977b6cf1b.js} +1 -1
  37. package/.next/static/chunks/pages/{document-roles-aa320afdbc2edc5e.js → document-roles-17247e9639a04648.js} +1 -1
  38. package/.next/static/chunks/pages/documents-e79320e8cb87a955.js +1 -0
  39. package/.next/static/chunks/pages/knowledge/file-detail-73678bce1bb43f02.js +1 -0
  40. package/.next/static/chunks/pages/knowledge/files-f72277ef4a72bff0.js +1 -0
  41. package/.next/static/chunks/pages/knowledge/manage-b07ce5086d63ca67.js +1 -0
  42. package/.next/static/chunks/pages/{models-2cc758fed54c92e2.js → models-ec554ec972763d7b.js} +1 -1
  43. package/.next/static/chunks/pages/prompt-11aab3e22cca2bdd.js +1 -0
  44. package/.next/static/chunks/pages/system/logs-91bfbc6fe9343d2e.js +1 -0
  45. package/.next/static/css/725551a791210988.css +1 -0
  46. package/.next/static/css/ad5a592c79d1448b.css +1 -0
  47. package/package.json +4 -4
  48. package/.next/static/OeaS6h5VJsA7MHq1qOZN_/_buildManifest.js +0 -1
  49. package/.next/static/chunks/375-4a1c73eb22d653d2.js +0 -1
  50. package/.next/static/chunks/478-6a65262872ea0bbc.js +0 -1
  51. package/.next/static/chunks/651-b650f9bca2edf976.js +0 -4
  52. package/.next/static/chunks/788-7f7359a830e3f4fd.js +0 -1
  53. package/.next/static/chunks/pages/documents-e85faaadf4dc6777.js +0 -1
  54. package/.next/static/chunks/pages/knowledge/file-detail-1a82bb3c9b266edc.js +0 -1
  55. package/.next/static/chunks/pages/knowledge/files-8ca2d555a722d8f0.js +0 -1
  56. package/.next/static/chunks/pages/knowledge/manage-e7fbdb89f65913b2.js +0 -1
  57. package/.next/static/chunks/pages/prompt-5e681123122f38a9.js +0 -1
  58. package/.next/static/chunks/pages/system/logs-2126e5cbbce48e88.js +0 -1
  59. package/.next/static/css/029ff7574443cc55.css +0 -1
  60. package/.next/static/css/df824e8d8cadbeb1.css +0 -1
  61. /package/.next/static/{OeaS6h5VJsA7MHq1qOZN_ → WFPMB0O5frURgkh5Qa8-n}/_ssgManifest.js +0 -0
@@ -156,22 +156,24 @@ ${h}`:""].filter(Boolean).join("\n\n"),promptDetails:f}}function cB(a){return aQ
156
156
 
157
157
  ${c}`,f+=1}return{chapters:e.map(a=>({...a,sections:a.sections||[]})),patchedCount:f,missingCount:d.length}}function cG(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 cH(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||""}
158
158
  ${b.filePath}
159
- ${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 cI(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 cJ(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 cK(a,b){return Math.max(12,Math.min(26,a+10+4*((b.sections||[]).length>=6||b.requiredFacts.length>=8)))}async function cL(a){if(ax(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:cG(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 cM(a){let b=[];for(let c of a.needs.slice(0,8)){ax(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:cG(`${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 cN(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 cO(a){var b;ax(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=[a9({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(ba(G,a9({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=bv([...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}),ba(G,a9({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${K.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:G.length})),y();let Q=await B(()=>Promise.resolve((0,k.P)(o,{requirement:a.requirement,boundFilePaths:K.map(a=>a.filePath),boundFileRoles:(0,d.wR)(K)})));ba(G,a9({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(Q.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:G.length})),y();let R=await B(()=>Promise.resolve((0,j.x)(q,a.requirement||""))),S=R.spec,T=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||""),U=(0,r.h)(q,Q),V=(0,s.$)({template:q,spec:S,summary:Q,resolvedRoles:U});if(!V.ready)throw Error(`生成准备度不足:${V.blockingIssues.join(";")}`);let W=[(0,k.F)(Q,{publicSafe:!0}),(0,j.N)(S,R.sourceHash,{publicSafe:!0}),(0,s.R)(V,{publicSafe:!0})].filter(Boolean).join("\n\n"),X=[(0,k.F)(Q),(0,j.N)(S,R.sourceHash),(0,s.R)(V)].filter(Boolean).join("\n\n"),Y=bv([...H.writerPrompts,...H.formattingPrompts]),$=bv([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts]),aa=bv(H.prompts),ab=(0,h.I)().load().webAccess||{enabled:!1,allowProjectFacts:!1,maxQueriesPerChapter:2,maxResultsPerQuery:3,trustedDomains:[]},ac=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","后台","绑定片段","兜底"];return/杜绝|禁止|不得|严禁/u.test(b)&&d.push("施工方","投标人","高度重视","重中之重"),/商务|报价|单价|税率|利润|造价/u.test(b)&&d.push("综合单价","报价明细","单价","税率","增值税","利润","预留金","报价明细表"),{forbidCover:/严禁生成封面|不输出封面|禁止封面/u.test(b),forbidToc:/严禁生成[^\n。;;]*目录|不输出[^\n。;;]*目录|禁止[^\n。;;]*目录/u.test(b),forbiddenTerms:[...new Set(d)],preferredTerms:[{from:"施工方",to:"我公司"},{from:"投标人",to:"我公司"},{from:"高度重视",to:"严格落实"},{from:"重中之重",to:"关键控制事项"}],requiredTables:[...c]}}(b),d=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&&b.push(a)}return[...new Set(b)]}(b),e=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"],f=["工程造价","报价","投标报价","报价明细","综合单价","单价","合价","金额","税率","增值税","利润","预留金","暂列金额","最高投标限价","招标控制价"],g=[...new Set([...(c.forbiddenTerms||[]).filter(a=>/施工方|投标人/u.test(a)),.../施工方|投标人/u.test(b)?["施工方","投标人"]:[]])],h=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),i=(a.template?.chapters||[]).map(a=>({chapterTitle:a.title,mustInclude:bM(b,RegExp(`${a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}|${a.title.slice(0,6).replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"u")).slice(0,8),mustNotInclude:bM(b,/禁止|不得|严禁|杜绝/u).filter(b=>b.includes(a.title)).slice(0,8)})).filter(a=>a.mustInclude.length>0||a.mustNotInclude.length>0),j=(a.rolePrompts||[]).map(a=>({roleId:a.roleId,focusAreas:bM(a.content,/重点|关注|围绕|响应|体系|措施|质量|安全|工期|资源/u).slice(0,8),mustDo:bM(a.content,/必须|应当|需要|确保|严格/u).slice(0,10),mustNotDo:bM(a.content,/禁止|不得|严禁|杜绝/u).slice(0,10)})).filter(a=>a.focusAreas.length>0||a.mustDo.length>0||a.mustNotDo.length>0),k=[c.forbidCover?"已识别禁止封面规则":"",c.forbidToc?"已识别禁止目录规则":"",d.length?`已识别一级章节固定规则 ${d.length} 条`:"",g.length?`已识别禁用主体表达:${g.join("、")}`:"",c.forbiddenTerms.length?`已识别禁用词 ${c.forbiddenTerms.length} 个`:"",h?`已识别最低字数要求:${h} 字`:"",j.length?`已抽取角色执行规则 ${j.length} 组`:""].filter(Boolean);return{...c,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:d,forbidExtraHeadings:/不得合并|不得删除|不得改名|不得新增|严格按.*章节名称|一级章节.*不得/u.test(b)||d.length>0,requiredSubjects:/我公司/u.test(b)?["我公司","项目部"]:[],forbiddenSubjects:g,backendTerms:e,commercialTerms:f,forbiddenTerms:[...new Set([...c.forbiddenTerms,...e,...f,...g])],forbidFabrication:/不得编造|严禁编造|不得擅自|资料未明确|事实真实性/u.test(b),requireEvidenceForQuantities:/量化|参数|数值|工程实体参数|资料中明确/u.test(b),preferProjectFacts:/事实优先|项目事实|真实性高于/u.test(b),minWords:h,minChars:h,chapterRules:i,roleRules:j,executionSummary:k}}({promptTexts:[W,aa].filter(Boolean).join("\n\n"),requirement:a.requirement,template:q,rolePrompts:H.prompts}),ad=[function(a){let b=[`运行时规则版本:${a.sourceHash}`,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.minWords?`全文不少于 ${a.minWords} 字。`:""].filter(Boolean);return`以下规则由系统运行时从用户绑定指令中自动抽取,不作为用户可编辑内容。生成、检查和修复必须共同遵守:
160
- ${b.map((a,b)=>`${b+1}. ${a}`).join("\n")}`}(ac),!ab.enabled?"":"公开资料补充使用规则:\n1. 公开资料只可用于补充通用规范、政策、工艺和措施。\n2. 不得使用公开资料新增或修改项目名称、建设地点、建设规模、工期、质量标准、工程量、材料规格、图纸参数、商务数据。\n3. 本地项目资料与公开资料冲突时,必须以本地项目资料为准。\n4. 不得在正文中出现任何检索过程、外部页面、工具调用或系统内部过程性表述。\n5. 不得把公开资料中的其他项目案例参数写入本项目正文。"].filter(Boolean).join("\n\n"),ae=[W,ad,`生成前规划章节结构:
161
- ${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")}`,Y||$].filter(Boolean).join("\n\n"),af=[X,ad,bv([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),ag=[W,ad,bv([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");ba(G,a9({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${K.length} 条文件角色绑定`,details:[`提示词角色:${J.length} 个`,`文件角色:${K.length} 个`,O?`识别 OUTLINE 章节:${N.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:G.length})),y();let aj=bt(o,K),ao=(0,i.XB)("file"),ap=new Map(K.flatMap(a=>br(o,a.filePath).map(b=>[b,a.roleId]))),aq=new Map(K.flatMap(a=>br(o,a.filePath).map(b=>[b,ao.find(b=>b.id===a.roleId)?.processingType||"reference"])));ba(G,a9({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:G.length})),y();let ar=await B(()=>t.getProject(o)),at=function(a,b){let c=new Set(b.filter(Boolean)),d=(a.listFiles?.()||[]).filter(a=>0===c.size||c.has(a.relativePath)),f=new Set(d.map(a=>a.relativePath)),g=[...c].filter(a=>!f.has(a)),h=d.filter(a=>0===Math.max(0,Math.ceil(Number(a.chunkCount)||0))).map(a=>a.relativePath),i=d.filter(a=>"error"===a.status).map(a=>a.relativePath),j="function"==typeof a.countPendingIndexJobs?a.countPendingIndexJobs():0,k="function"==typeof a.getVectorStatus?a.getVectorStatus():void 0,l=d.reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0),m=[...g.map(a=>`绑定文件未完成索引:${e.basename(a)}`),...h.map(a=>`绑定文件没有可用切片:${e.basename(a)}`),...i.map(a=>`绑定文件索引失败:${e.basename(a)}`)];c.size>0&&0===l&&m.push("所有绑定文件均无可用切片");let n=[...j>0?[`仍有 ${j} 个待索引任务,建议等待索引完成后生成`]:[],...k&&"ready"!==k.status?[`向量索引状态为 ${k.status},当前召回质量可能下降`]:[]];return{scopedRecords:d,missingFiles:g,emptyFiles:h,errorFiles:i,pendingJobs:j,vectorStatus:k,usableChunkCount:l,blockingIssues:m,warnings:n}}(ar,[...aj]);if(at.blockingIssues.length>0)throw Error(`生成前知识索引不可用:${at.blockingIssues.join(";")}`);let au=cN(ar,[...aj],a.maxEvidencePerChapter);ba(G,a9({type:"knowledge_retrieval",roleId:"knowledge-index",status:at.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${at.scopedRecords.length} 份,可用切片 ${at.usableChunkCount} 条,开始构建角色资料证据池`,details:[`证据范围文件:${aj.size} 份`,`向量状态:${at.vectorStatus?.status||"unknown"}`,...at.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),ax(a.signal);let av=[],ay={enabled:ab.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},az=[],aA=[],aC=[],aD=-1,aF=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(bu(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=be(`${a} ${c.join(" ")}`),e=be(`${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(be(d))&&(c+=4);return c}(d,b);for(let a of bc.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=be(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bc.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,J,K),aH=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=bf(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}}(ar,aF,o,L(Math.max(1200,900*K.length),12e3,aE())),aI=a9({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aH.uniqueFileCount} 份,角色绑定 ${aH.bindingCount} 条,加载片段 ${aH.loadedChunkCount}/${aH.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aH.bindingCount-aH.uniqueFileCount)} 条`,`待执行资料理解节点:${aF.length} 个`,aH.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aH.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aH.uniqueFileCount,total:Math.max(1,aH.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});ba(G,aI),y();let aJ=await cg({manager:t,project:ar,projectRoot:o,scopedFilePaths:[...aj].filter(Boolean).sort(),fileRoleByPath:ap,fileProcessingByPath:aq,signal:a.signal});aJ.length>0&&(av.push(...aJ),ba(G,a9({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aJ.length} 条`,details:aJ.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aL=[],aP=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=bf(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 as({type:"project-evidence-version-v2",entries:e})}(ar,o,aj),aQ=aG()?.model.name,aR=bv([...H.extractionPrompts,...H.referencePrompts]),aS=as({fileBindings:K,evidenceScopePaths:[...aj].sort(),activeModelName:aQ,projectEvidenceVersion:aP,promptTexts:aR,materialFingerprint:Q.fingerprint,materialInventory:Object.fromEntries(Object.entries(Q.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),aV=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aF.length>12?1:2)),aW=Math.max(1,Math.min(aF.length||1,3,Number.isFinite(aV)?Math.floor(aV):1));for(let b=0;b<aF.length;b+=aW){ax(a.signal);let c=aF.slice(b,b+aW).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(bf(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return I(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aH,c,o).filter(a=>bs(o,a.filePath,aj)),g=G.length,h=a9({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aF.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bi(q,c,f,a.signal)),j=a9({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bb(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aF.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return G[g]=j,y(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))av.push(...a.evidence),aL.push(a.artifact);let d=I(av,{maxItems:Math.max(40,8*aF.length),maxChars:Math.max(45e3,5e3*aF.length),preservePinned:!0});av.splice(0,av.length,...d)}let aX=aN(av,q,S),a4=aT(av),a5=aU(av,T),a6=a3([...aL.flatMap(a=>a.facts.map(a=>({key:a.key,value:aw(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...aX,...a4,...a5],aM(av),az,S,T),a8=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,aL),bh=(0,P._9)(q,S,{preserveExplicitOutline:O}),bn=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(`章节/要求:
159
+ ${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 cI(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 cJ(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 cK(a,b){return Math.max(12,Math.min(26,a+10+4*((b.sections||[]).length>=6||b.requiredFacts.length>=8)))}async function cL(a){if(ax(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:cG(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 cM(a){let b=[];for(let c of a.needs.slice(0,8)){ax(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:cG(`${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 cN(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 cO(a){var b;ax(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=[a9({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(ba(G,a9({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=bv([...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}),ba(G,a9({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=[],f=new Set;for(let a of b){let b=a.filePath.replace(/^\/+|\/+$/gu,"");for(let g of d.has(b)?[b]:c.filter(a=>a.relativePath.startsWith(`${b}/`)).map(a=>a.relativePath)){let b=`${a.roleId}
160
+ ${g}`;f.has(b)||(f.add(b),e.push({...a,filePath:g}))}}return e}(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)})));ba(G,a9({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"),$=bv([...H.writerPrompts,...H.formattingPrompts]),aa=bv([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts]),ab=bv(H.prompts),ac=(0,h.I)().load().webAccess||{enabled:!1,allowProjectFacts:!1,maxQueriesPerChapter:2,maxResultsPerQuery:3,trustedDomains:[]},ad=function(a){let b=[a.promptTexts,a.requirement||""].filter(Boolean).join("\n\n").replace(/\\n/gu,"\n"),c=function(a){let b=a.replace(/\\n/gu,"\n"),c=new Set;for(let a of(/全文必须输出[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||/必须输出(?:的)?表格[::]\s*([^。;;\n]+)/u.exec(b)?.[1]||"").split(/[、,,]/u)){let b=/([\p{Script=Han}A-Za-z0-9()()]{2,30}表)$/u.exec(a.trim())?.[1];b&&b.length>=4&&b.length<=30&&c.add(b)}/项目基本信息表/u.test(b)&&c.add("项目基本信息表");let d=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"];return/杜绝|禁止|不得|严禁/u.test(b)&&d.push("施工方","投标人","高度重视","重中之重"),/商务|报价|单价|税率|利润|造价/u.test(b)&&d.push("综合单价","报价明细","单价","税率","增值税","利润","预留金","报价明细表"),{forbidCover:/严禁生成封面|不输出封面|禁止封面/u.test(b),forbidToc:/严禁生成[^\n。;;]*目录|不输出[^\n。;;]*目录|禁止[^\n。;;]*目录/u.test(b),forbiddenTerms:[...new Set(d)],preferredTerms:[{from:"施工方",to:"我公司"},{from:"投标人",to:"我公司"},{from:"高度重视",to:"严格落实"},{from:"重中之重",to:"关键控制事项"}],requiredTables:[...c]}}(b),d=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&&b.push(a)}return[...new Set(b)]}(b),e=["知识库","提示词","建议补充","资料库","OCR","后台","绑定片段","兜底"],f=["工程造价","报价","投标报价","报价明细","综合单价","单价","合价","金额","税率","增值税","利润","预留金","暂列金额","最高投标限价","招标控制价"],g=[...new Set([...(c.forbiddenTerms||[]).filter(a=>/施工方|投标人/u.test(a)),.../施工方|投标人/u.test(b)?["施工方","投标人"]:[]])],h=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),i=(a.template?.chapters||[]).map(a=>({chapterTitle:a.title,mustInclude:bM(b,RegExp(`${a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}|${a.title.slice(0,6).replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"u")).slice(0,8),mustNotInclude:bM(b,/禁止|不得|严禁|杜绝/u).filter(b=>b.includes(a.title)).slice(0,8)})).filter(a=>a.mustInclude.length>0||a.mustNotInclude.length>0),j=(a.rolePrompts||[]).map(a=>({roleId:a.roleId,focusAreas:bM(a.content,/重点|关注|围绕|响应|体系|措施|质量|安全|工期|资源/u).slice(0,8),mustDo:bM(a.content,/必须|应当|需要|确保|严格/u).slice(0,10),mustNotDo:bM(a.content,/禁止|不得|严禁|杜绝/u).slice(0,10)})).filter(a=>a.focusAreas.length>0||a.mustDo.length>0||a.mustNotDo.length>0),k=[c.forbidCover?"已识别禁止封面规则":"",c.forbidToc?"已识别禁止目录规则":"",d.length?`已识别一级章节固定规则 ${d.length} 条`:"",g.length?`已识别禁用主体表达:${g.join("、")}`:"",c.forbiddenTerms.length?`已识别禁用词 ${c.forbiddenTerms.length} 个`:"",h?`已识别最低字数要求:${h} 字`:"",j.length?`已抽取角色执行规则 ${j.length} 组`:""].filter(Boolean);return{...c,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:d,forbidExtraHeadings:/不得合并|不得删除|不得改名|不得新增|严格按.*章节名称|一级章节.*不得/u.test(b)||d.length>0,requiredSubjects:/我公司/u.test(b)?["我公司","项目部"]:[],forbiddenSubjects:g,backendTerms:e,commercialTerms:f,forbiddenTerms:[...new Set([...c.forbiddenTerms,...e,...f,...g])],forbidFabrication:/不得编造|严禁编造|不得擅自|资料未明确|事实真实性/u.test(b),requireEvidenceForQuantities:/量化|参数|数值|工程实体参数|资料中明确/u.test(b),preferProjectFacts:/事实优先|项目事实|真实性高于/u.test(b),minWords:h,minChars:h,chapterRules:i,roleRules:j,executionSummary:k}}({promptTexts:[X,ab].filter(Boolean).join("\n\n"),requirement:a.requirement,template:q,rolePrompts:H.prompts}),ae=[function(a){let b=[`运行时规则版本:${a.sourceHash}`,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.minWords?`全文不少于 ${a.minWords} 字。`:""].filter(Boolean);return`以下规则由系统运行时从用户绑定指令中自动抽取,不作为用户可编辑内容。生成、检查和修复必须共同遵守:
161
+ ${b.map((a,b)=>`${b+1}. ${a}`).join("\n")}`}(ad),!ac.enabled?"":"公开资料补充使用规则:\n1. 公开资料只可用于补充通用规范、政策、工艺和措施。\n2. 不得使用公开资料新增或修改项目名称、建设地点、建设规模、工期、质量标准、工程量、材料规格、图纸参数、商务数据。\n3. 本地项目资料与公开资料冲突时,必须以本地项目资料为准。\n4. 不得在正文中出现任何检索过程、外部页面、工具调用或系统内部过程性表述。\n5. 不得把公开资料中的其他项目案例参数写入本项目正文。"].filter(Boolean).join("\n\n"),af=[X,ae,`生成前规划章节结构:
162
+ ${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")}`,$||aa].filter(Boolean).join("\n\n"),ag=[Y,ae,bv([...H.extractionPrompts,...H.referencePrompts])].filter(Boolean).join("\n\n"),aj=[X,ae,bv([...H.writerPrompts,...H.chapterPrompts,...H.formattingPrompts])].filter(Boolean).join("\n\n");ba(G,a9({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 ao=bt(o,Q),ap=(0,i.XB)("file"),aq=new Map(Q.flatMap(a=>br(o,a.filePath).map(b=>[b,a.roleId]))),ar=new Map(Q.flatMap(a=>br(o,a.filePath).map(b=>[b,ap.find(b=>b.id===a.roleId)?.processingType||"reference"])));ba(G,a9({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:G.length})),y();let at=await B(()=>t.getProject(o)),au=function(a,b){let c=new Set(b.filter(Boolean)),d=(a.listFiles?.()||[]).filter(a=>0===c.size||c.has(a.relativePath)),f=new Set(d.map(a=>a.relativePath)),g=[...c].filter(a=>!f.has(a)),h=d.filter(a=>0===Math.max(0,Math.ceil(Number(a.chunkCount)||0))).map(a=>a.relativePath),i=d.filter(a=>"error"===a.status).map(a=>a.relativePath),j="function"==typeof a.countPendingIndexJobs?a.countPendingIndexJobs():0,k="function"==typeof a.getVectorStatus?a.getVectorStatus():void 0,l=d.reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0),m=[...g.map(a=>`绑定文件未完成索引:${e.basename(a)}`),...h.map(a=>`绑定文件没有可用切片:${e.basename(a)}`),...i.map(a=>`绑定文件索引失败:${e.basename(a)}`)];c.size>0&&0===l&&m.push("所有绑定文件均无可用切片");let n=[...j>0?[`仍有 ${j} 个待索引任务,建议等待索引完成后生成`]:[],...k&&"ready"!==k.status?[`向量索引状态为 ${k.status},当前召回质量可能下降`]:[]];return{scopedRecords:d,missingFiles:g,emptyFiles:h,errorFiles:i,pendingJobs:j,vectorStatus:k,usableChunkCount:l,blockingIssues:m,warnings:n}}(at,[...ao]);if(au.blockingIssues.length>0)throw Error(`生成前知识索引不可用:${au.blockingIssues.join(";")}`);let av=cN(at,[...ao],a.maxEvidencePerChapter);ba(G,a9({type:"knowledge_retrieval",roleId:"knowledge-index",status:au.warnings.length>0?"fallback":"success",message:`已读取知识索引:绑定文件 ${au.scopedRecords.length} 份,可用切片 ${au.usableChunkCount} 条,开始构建角色资料证据池`,details:[`证据范围文件:${ao.size} 份`,`向量状态:${au.vectorStatus?.status||"unknown"}`,...au.warnings,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:G.length})),y(),ax(a.signal);let ay=[],az={enabled:ac.enabled,queries:[],evidenceCount:0,filteredCount:0,chapters:[]},aA=[],aC=[],aD=[],aF=-1,aH=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(bu(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=be(`${a} ${c.join(" ")}`),e=be(`${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(be(d))&&(c+=4);return c}(d,b);for(let a of bc.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=be(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bc.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,J,Q),aI=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=bf(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}}(at,aH,o,L(Math.max(1200,900*K.length),12e3,aE())),aJ=a9({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aI.uniqueFileCount} 份,角色绑定 ${aI.bindingCount} 条,加载片段 ${aI.loadedChunkCount}/${aI.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aI.bindingCount-aI.uniqueFileCount)} 条`,`待执行资料理解节点:${aH.length} 个`,aI.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aI.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aI.uniqueFileCount,total:Math.max(1,aI.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:G.length});ba(G,aJ),y();let aL=await cg({manager:t,project:at,projectRoot:o,scopedFilePaths:[...ao].filter(Boolean).sort(),fileRoleByPath:aq,fileProcessingByPath:ar,signal:a.signal});aL.length>0&&(ay.push(...aL),ba(G,a9({type:"knowledge_retrieval",roleId:"project-basic-evidence",status:"success",message:`已锁定项目基础事实证据 ${aL.length} 条`,details:aL.slice(0,8).map(a=>`${e.basename(a.filePath)}|${a.sectionTitle||"正文片段"}|score=${a.score.toFixed(2)}`)},{subtitle:"基础事实召回",order:G.length})),y());let aP=[],aQ=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=bf(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 as({type:"project-evidence-version-v2",entries:e})}(at,o,ao),aR=aG()?.model.name,aS=bv([...H.extractionPrompts,...H.referencePrompts]),aV=as({fileBindings:Q,evidenceScopePaths:[...ao].sort(),activeModelName:aR,projectEvidenceVersion:aQ,promptTexts:aS,materialFingerprint:R.fingerprint,materialInventory:Object.fromEntries(Object.entries(R.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),aW=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aH.length>12?1:2)),aX=Math.max(1,Math.min(aH.length||1,3,Number.isFinite(aW)?Math.floor(aW):1));for(let b=0;b<aH.length;b+=aX){ax(a.signal);let c=aH.slice(b,b+aX).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(bf(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})})(aI,c,o).filter(a=>bs(o,a.filePath,ao)),g=G.length,h=a9({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:aH.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});G.push(h),y();let i=await B(()=>bi(q,c,f,a.signal)),j=a9({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bb(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aH.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)))ay.push(...a.evidence),aP.push(a.artifact);let d=I(ay,{maxItems:Math.max(40,8*aH.length),maxChars:Math.max(45e3,5e3*aH.length),preservePinned:!0});ay.splice(0,ay.length,...d)}let a4=aN(ay,q,T),a5=aT(ay),a6=aU(ay,U),a8=a3([...aP.flatMap(a=>a.facts.map(a=>({key:a.key,value:aw(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...a4,...a5,...a6],aM(ay),aA,T,U),bh=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,aP),bn=(0,P._9)(q,T,{preserveExplicitOutline:O}),bw=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(`章节/要求:
162
163
  ${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aw(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
163
- ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aL),bw={...q,chapters:bh},bx=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=bL([...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 bL(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=>bK(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)}))}})}([ae,a.requirement||""].filter(Boolean).join("\n\n"),bh),by=(0,am.tF)({requirement:a.requirement,promptTexts:ae,template:bw,chapters:bh,spec:S}),bz=0,bA=0;bh=await Promise.all(bh.map(async(b,c)=>{if(b.sections?.length){bz+=1;let a=bx.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title));if(0===a.length)return b;let d=[...a];for(let a of b.sections)d.some(b=>(0,P.GQ)(b).replace(/[\s()()::.。;;,,、-]/gu,"")===(0,P.GQ)(a).replace(/[\s()()::.。;;,,、-]/gu,""))||d.push(a);return{...b,sections:d}}bA+=1;let d=I(av.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(by.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bl(aL,b,bj(b,a8)),f=cA(H,b),g=await bN({template:bw,chapter:b,chapterIndex:c,evidence:d,promptTexts:f.promptTexts,projectContext:bn,requirement:a.requirement,roleContext:e,targetWords:by.chapterTargets.get(b.id)||1200,structuralRules:bx,signal:a.signal}),h=bx.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 ba(G,a9({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:bh};let bB=(0,am.tF)({requirement:a.requirement,promptTexts:ae,template:q,chapters:bh,spec:S});v=bh.map(a=>a.id);let bC=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
164
+ ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aP),bx={...q,chapters:bn},by=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=bL([...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 bL(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=>bK(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"),bn),bz=(0,am.tF)({requirement:a.requirement,promptTexts:af,template:bx,chapters:bn,spec:T}),bA=0,bB=0;bn=await Promise.all(bn.map(async(b,c)=>{if(b.sections?.length){bA+=1;let a=by.filter(a=>a.chapterIndex===c||a.chapterTitle&&(0,P.GQ)(a.chapterTitle)===(0,P.GQ)(b.title)).flatMap(a=>a.requiredSections.sort((a,b)=>(a.order||0)-(b.order||0)).map(a=>a.title));if(0===a.length)return b;let d=[...a];for(let a of b.sections)d.some(b=>(0,P.GQ)(b).replace(/[\s()()::.。;;,,、-]/gu,"")===(0,P.GQ)(a).replace(/[\s()()::.。;;,,、-]/gu,""))||d.push(a);return{...b,sections:d}}bB+=1;let d=I(ay.filter(a=>a.chapterId===b.id||(0,D.Lk)(a,b.title)),{maxChars:L(bz.chapterTargets.get(b.id)||1200),preservePinned:!0}),e=bl(aP,b,bj(b,bh)),f=cA(H,b),g=await bN({template:bx,chapter:b,chapterIndex:c,evidence:d,promptTexts:f.promptTexts,projectContext:bw,requirement:a.requirement,roleContext:e,targetWords:bz.chapterTargets.get(b.id)||1200,structuralRules:by,signal:a.signal}),h=by.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 ba(G,a9({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:bn};let bC=(0,am.tF)({requirement:a.requirement,promptTexts:af,template:q,chapters:bn,spec:T});v=bn.map(a=>a.id);let bD=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
164
165
  ${a.template.category||""}
165
- ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:q,targetWords:bB.targetChars||[...bB.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bC.targetLlmConcurrency>0&&(b=bC.targetLlmConcurrency,void 0===aB||!Number.isFinite(b)||b<=0||(aB=Math.min(aB,Math.floor(b))),aE());let bD={strategy:bC,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aE(),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=bC.targetLlmConcurrency>0?`LLM 并发上限 ${bC.targetLlmConcurrency}`:"LLM 不做本地并发限流";ba(G,a9({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bC.mode} 生成策略:章节审查 ${bC.enableChapterReview?"启用":"跳过"}、全局审查 ${bC.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bC.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bC.enableDocumentBudgetExpansion?"启用":"跳过"};${bG}`},{subtitle:"后台自动策略"}));let bH=O?"OUTLINE 章节":"模板章节",bI=a9({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bA} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bz} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bJ=O?`;识别到 OUTLINE 章节 ${N.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",bO=[...H.prompts.map(a=>`${a.category}|${a.roleId}|${a.name}|${a.bindingSource}`),...H.unresolvedRoles.map(a=>`unresolved|${a}|未解析到提示词资源`),...H.runtimeRequiredBindings.map(a=>`runtimeRequired|${a.roleId}|${a.promptId}|${a.reason}`)];ba(G,a9({type:"role_binding",roleId:C,status:"success",message:`已绑定 ${K.length} 个文件角色、${H.prompts.length} 个有效提示词;写作 ${H.writerPrompts.length}、章节 ${H.chapterPrompts.length}、抽取 ${H.extractionPrompts.length};已自动抽取运行时规则 ${ac.executionSummary.length} 条;资料覆盖率 ${Math.round(100*V.materialCoverageRate)}%${bJ}`,details:[...bO,...ac.executionSummary.map(a=>`runtimeRule|${a}`)]},{subtitle:E,roleName:E})),ba(G,a9({type:"validation",roleId:"runtime-prompt-rules",status:"success",message:`运行时提示词规则已抽取:${ac.executionSummary.length} 条,版本 ${ac.sourceHash}`,details:ac.executionSummary.length?ac.executionSummary:["未从提示词中识别到额外硬规则,使用系统默认质量规则"]},{subtitle:"提示词规则执行"})),ba(G,a9({type:"validation",roleId:"document-readiness",status:V.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*V.materialCoverageRate)}%,资料角色 ${Math.round(100*V.roleSatisfactionRate)}%,优化建议 ${Math.round(100*V.specCompletenessRate)}%;${Q.source.selectionReason}`},{subtitle:"生成准备度检查"})),ba(G,bI),y();let bP=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bQ=Number(bP??bC.maxChapterConcurrency),bR=Math.max(1,Math.min(bh.length||1,bC.maxChapterConcurrency,Number.isFinite(bQ)?Math.floor(bQ):bC.maxChapterConcurrency));ba(G,a9({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bR}/${bh.length} 章并发`,details:[`策略上限:${bC.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bP??"未设置"}`,`有效章节数:${bh.length}`]},{subtitle:"章节并发策略"})),y();for(let b=0;b<bh.length;b+=bR){let c=bh.slice(b,b+bR);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;ax(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(a9({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${bh.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:g+1,total:bh.length,label:"章节生成"}},{subtitle:(0,P.GQ)(c.title),order:g})),y();let b=[],d=bj(c,a8),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)?ce:[],r=cI(c,[...m,...k],p),s=cJ(c,p),v=Date.now();G[i]=a9({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:bh.length,label:"证据检索"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let w=[...aj].filter(Boolean).sort(),x=[];for(let b of r.slice(0,s)){if(ax(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(au,12),weights:cG(c.title),generationMode:!1});x.push(d.results)}for(let a of(bD.evidence.searchQueries+=Math.min(r.length,s),bD.evidence.searchMs+=Date.now()-v,x))b.push(...a.filter(a=>bs(o,a.filePath,aj)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:ap.get(a.filePath),processingType:aq.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let z=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),A=bk(aL,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bs(o,a.filePath,aj)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aJ.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bB.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aE()));for(let a of C){if(!bs(o,a,aj))continue;let d=z.has(a),e=ar.getFileDetail(a,{maxChunkContentChars:J});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:ap.get(e.file.relativePath),processingType:aq.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let K=b.filter(a=>bs(o,a.filePath,aj));if(ab.enabled){let b=await cb({config:ab,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ac,localFacts:[...a6.project,...a6.schedule,...a6.quality,...a6.safety,...a6.resources,...a6.preciseFacts],signal:a.signal});b.evidence.length>0&&(K.push(...b.evidence),ay.chapters.push(c.title),ay.evidenceCount+=b.evidence.length),ay.queries.push(...b.queries),ay.filteredCount+=b.filtered}let M=L(E,7e3,Math.max(14e3,Math.min(26e3,3200*aE()))),N=cH(c,K,{maxItems:cK(au,c),maxChars:M,preservePinned:!0},bD),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a)));for(let a of(0===N.length&&az.push(`${c.title}:未检索到明确资料依据`),O))az.push(`${c.title}:${a} 未检索到明确依据`);let Q=a9({type:"knowledge_retrieval",roleId:"knowledge-base",status:av.length>0?"success":"fallback",message:`已检索/绑定 ${av.length} 条证据`});aD<0?aD=ba(G,Q):G[aD]={...Q,order:G[aD]?.order??Q.order},y(),ax(a.signal);let R=bm(aL,q),U=bl(aL,c,d),V=cA(H,c);if(H.writerPrompts.length>0&&!V.primaryWriter)throw Error(`${(0,P.GQ)(c.title)} 写作主控提示词未进入章节生成阶段`);let X=[V.promptTexts,W].filter(Boolean).join("\n\n"),Y=V.promptDetails.length?V.promptDetails:["未绑定章节写作提示词"],$=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||[])a$(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a$(c,b,{label:d,category:"section",required:!1,source:"section",queries:aZ(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a$(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a$(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&&a$(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:aZ(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)||aZ(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a$(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:aZ(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a_(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=aY(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a_(c,b,a,"requirement",!0,[f]);let g=aY(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a_(c,b,d,"prompt","must_use"===d.usagePolicy,[a.chapter.title]);return c}({template:q,chapter:c,spec:S,profile:T,promptTexts:X,requirement:a.requirement,plan:d}),_=a1({needs:$,factsModel:a6,evidence:K,profile:T}),aa=_.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);if(aa.length>0&&w.length>0){let b=await cM({manager:t,projectRoot:o,chapter:c,needs:aa,scopedFilePaths:w,fileRoleByPath:ap,fileProcessingByPath:aq,signal:a.signal});b.length>0&&(K=cH(c,[...K,...b],{maxItems:cK(au+4,c),maxChars:M+9e3,preservePinned:!0},bD),N=cH(c,K,{maxItems:cK(au+2,c),maxChars:M+7e3,preservePinned:!0},bD),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),aa=(_=a1({needs:$,factsModel:a6,evidence:K,profile:T})).filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label))}let ad=new Set(N.map(a=>a.filePath)),ae=N.reduce((a,b)=>a+b.content.length,0);G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 已选取 ${N.length} 条高相关证据,正在生成正文`,details:[`使用绑定文件:${ad.size} 份`,`上下文字符:${ae}`,`检索查询:${Math.min(r.length,s)} 组`],progress:{current:g+1,total:bh.length,label:"正文生成"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(),bD.evidence.contextChars+=ae,av.push(...N);let af=I(av,{maxChars:Math.max(5e4,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...af);let ag=(j=_,a0(j.flatMap(a=>a.facts))),ah=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?a4:[],ai=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(aw(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(aw(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}:${aw(b.value)}`==`${a.key||a.fieldName}:${aw(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=aw(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=>aw(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=>aw(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?`必须优先覆盖的事实/要求:
166
+ ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:q,targetWords:bC.targetChars||[...bC.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bD.targetLlmConcurrency>0&&(b=bD.targetLlmConcurrency,void 0===aB||!Number.isFinite(b)||b<=0||(aB=Math.min(aB,Math.floor(b))),aE());let bG={strategy:bD,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aE(),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}},bH=bD.targetLlmConcurrency>0?`LLM 并发上限 ${bD.targetLlmConcurrency}`:"LLM 不做本地并发限流";ba(G,a9({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bD.mode} 生成策略:章节审查 ${bD.enableChapterReview?"启用":"跳过"}、全局审查 ${bD.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bD.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bD.enableDocumentBudgetExpansion?"启用":"跳过"};${bH}`},{subtitle:"后台自动策略"}));let bI=O?"OUTLINE 章节":"模板章节",bJ=a9({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bB} 章由 LLM 基于${bI}、角色和绑定文件证据规划小节,${bA} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bO=O?`;识别到 OUTLINE 章节 ${N.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",bP=[...H.prompts.map(a=>`${a.category}|${a.roleId}|${a.name}|${a.bindingSource}`),...H.unresolvedRoles.map(a=>`unresolved|${a}|未解析到提示词资源`),...H.runtimeRequiredBindings.map(a=>`runtimeRequired|${a.roleId}|${a.promptId}|${a.reason}`)];ba(G,a9({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)}%${bO}`,details:[...bP,...ad.executionSummary.map(a=>`runtimeRule|${a}`)]},{subtitle:E,roleName:E})),ba(G,a9({type:"validation",roleId:"runtime-prompt-rules",status:"success",message:`运行时提示词规则已抽取:${ad.executionSummary.length} 条,版本 ${ad.sourceHash}`,details:ad.executionSummary.length?ad.executionSummary:["未从提示词中识别到额外硬规则,使用系统默认质量规则"]},{subtitle:"提示词规则执行"})),ba(G,a9({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:"生成准备度检查"})),ba(G,bJ),y();let bQ=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bR=Number(bQ??bD.maxChapterConcurrency),bS=Math.max(1,Math.min(bn.length||1,bD.maxChapterConcurrency,Number.isFinite(bR)?Math.floor(bR):bD.maxChapterConcurrency));ba(G,a9({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bS}/${bn.length} 章并发`,details:[`策略上限:${bD.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bQ??"未设置"}`,`有效章节数:${bn.length}`]},{subtitle:"章节并发策略"})),y();for(let b=0;b<bn.length;b+=bS){let c=bn.slice(b,b+bS);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;ax(a.signal);let h=Date.now(),i=G.length;try{var j;G.push(a9({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${bn.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:g+1,total:bn.length,label:"章节生成"}},{subtitle:(0,P.GQ)(c.title),order:g})),y();let b=[],d=bj(c,bh),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)?ce:[],r=cI(c,[...m,...k],p),s=cJ(c,p),v=Date.now();G[i]=a9({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:bn.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(ax(a.signal),0===w.length)break;let d=await t.search(o,b,{scope:"project",filters:{filePaths:w},limit:Math.min(av,12),weights:cG(c.title),generationMode:!1});x.push(d.results)}for(let a of(bG.evidence.searchQueries+=Math.min(r.length,s),bG.evidence.searchMs+=Date.now()-v,x))b.push(...a.filter(a=>bs(o,a.filePath,ao)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aq.get(a.filePath),processingType:ar.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let z=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),A=bk(aP,c,d);b.push(...A.flatMap(({artifact:a})=>a.evidence.filter(a=>bs(o,a.filePath,ao)).map(a=>({...a,chapterId:c.id,source:"role-node"})))),/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)&&b.push(...aL.map(a=>({...a,chapterId:c.id,source:"pinned-evidence"})));let C=new Set([...z]),E=bC.chapterTargets.get(c.id)||1200,J=L(E,6e3,Math.max(12e3,3e3*aE()));for(let a of C){if(!bs(o,a,ao))continue;let d=z.has(a),e=at.getFileDetail(a,{maxChunkContentChars:J});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aq.get(e.file.relativePath),processingType:ar.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let K=b.filter(a=>bs(o,a.filePath,ao));if(ac.enabled){let b=await cb({config:ac,chapterId:c.id,chapterTitle:c.title,sectionTitles:c.sections||[],runtimeRules:ad,localFacts:[...a8.project,...a8.schedule,...a8.quality,...a8.safety,...a8.resources,...a8.preciseFacts],signal:a.signal});b.evidence.length>0&&(K.push(...b.evidence),az.chapters.push(c.title),az.evidenceCount+=b.evidence.length),az.queries.push(...b.queries),az.filteredCount+=b.filtered}let M=L(E,7e3,Math.max(14e3,Math.min(26e3,3200*aE()))),N=cH(c,K,{maxItems:cK(av,c),maxChars:M,preservePinned:!0},bG),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a)));for(let a of(0===N.length&&aA.push(`${c.title}:未检索到明确资料依据`),O))aA.push(`${c.title}:${a} 未检索到明确依据`);let Q=a9({type:"knowledge_retrieval",roleId:"knowledge-base",status:ay.length>0?"success":"fallback",message:`已检索/绑定 ${ay.length} 条证据`});aF<0?aF=ba(G,Q):G[aF]={...Q,order:G[aF]?.order??Q.order},y(),ax(a.signal);let R=bm(aP,q),S=bl(aP,c,d),V=cA(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:["未绑定章节写作提示词"],$=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||[])a$(c,b,{label:d,category:n(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])a$(c,b,{label:d,category:"section",required:!1,source:"section",queries:aZ(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])a$(c,b,{label:d,category:n(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])a$(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&&a$(c,b,{label:e.name,category:n(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:aZ(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)||aZ(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&a$(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:aZ(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&a_(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=aY(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&a_(c,b,a,"requirement",!0,[f]);let g=aY(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&a_(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}),_=a1({needs:$,factsModel:a8,evidence:K,profile:U}),aa=_.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);if(aa.length>0&&w.length>0){let b=await cM({manager:t,projectRoot:o,chapter:c,needs:aa,scopedFilePaths:w,fileRoleByPath:aq,fileProcessingByPath:ar,signal:a.signal});b.length>0&&(K=cH(c,[...K,...b],{maxItems:cK(av+4,c),maxChars:M+9e3,preservePinned:!0},bG),N=cH(c,K,{maxItems:cK(av+2,c),maxChars:M+7e3,preservePinned:!0},bG),O=c.requiredFacts.filter(a=>!N.some(b=>(0,D.Lk)(b,a))),aa=(_=a1({needs:$,factsModel:a8,evidence:K,profile:U})).filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label))}let ab=new Set(N.map(a=>a.filePath)),ae=N.reduce((a,b)=>a+b.content.length,0);G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:H.writerPrompts[0]?.id,status:"running",message:`${(0,P.GQ)(c.title)} 已选取 ${N.length} 条高相关证据,正在生成正文`,details:[`使用绑定文件:${ab.size} 份`,`上下文字符:${ae}`,`检索查询:${Math.min(r.length,s)} 组`],progress:{current:g+1,total:bn.length,label:"正文生成"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(),bG.evidence.contextChars+=ae,ay.push(...N);let af=I(ay,{maxChars:Math.max(5e4,9e3*bn.length),preservePinned:!0});ay.splice(0,ay.length,...af);let ag=(j=_,a0(j.flatMap(a=>a.facts))),ah=/概况|工程|项目|总体|部署|进度|工期|质量/u.test(c.title)?a5:[],ai=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(aw(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(aw(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}:${aw(b.value)}`==`${a.key||a.fieldName}:${aw(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=aw(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=>aw(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=>aw(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?`必须优先覆盖的事实/要求:
166
167
  ${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
167
168
  ${e.join("\n")}`:"",h.length?`项目基础事实卡片(资料已明确,项目概况、项目基本信息表、进度和质量相关内容必须优先使用,不得写“资料未明确”):
168
169
  ${h.map(a=>`- ${a.key||a.fieldName}:${F(aw(a.value)).slice(0,220)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`).join("\n")}
169
170
  项目基本信息表必须使用固定表头:| 信息项 | 内容 |,不得使用“序号|项目名称|内容参数”表头,不得输出后台溯源列。`:"",a.factNeedsPrompt||"",g.length?`全局资料事实索引匹配到的本章可写事实:
170
- ${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:S,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}=${a2(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${a2(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?`事实需求覆盖卡片:
171
- ${b.join("\n")}`:""}(_)}),ak={total:_.length,satisfied:_.filter(a=>"satisfied"===a.status).length,missing:_.filter(a=>"missing"===a.status).length,lowConfidence:_.filter(a=>"low_confidence"===a.status).length};for(let a of aa)az.push(`${c.title}:事实需求未确认 ${a}`);let al=S?.chapterRules.find(a=>a.id===c.id||a.title===c.title),ao=bB.chapterTargets.get(c.id)||1200,as=Math.ceil(ao*(bB.maxChars?1.1:1.18)),at=bB.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*ao))):1200,aA=Math.max(d?.minWords||0,al?.minWords||0,S?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*ao),at),aB=bU(aA,ao),aF=bB.longformStrict?1:.55,aG=bB.longformStrict?ao:2600,aH=Math.max(900,Math.min(ao,Math.ceil(ao*aF),aG)),aI=Math.max(450,Math.min(aA,Math.floor(.72*aH))),aM=Math.max(aH+300,Math.min(as,Math.ceil(1.25*aH))),aN=bU(aI,aH),aO=Math.min(bV(aH),3e5),aP=c.sections?.filter(Boolean).length||0,aR=/[、,,;;]/u.test(c.title),aT=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aP>=2&&(bB.longformStrict||!aR);G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aT?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aT?[...Y,`有效证据:${N.length} 条`,`事实需求:${ak.satisfied}/${ak.total} 已满足,缺失 ${ak.missing},低置信 ${ak.lowConfidence}`,`目标字数:约 ${ao} 字,上限约 ${as} 字`,`小节并发上限:${bC.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${ak.satisfied}/${ak.total} 已满足,缺失 ${ak.missing},低置信 ${ak.lowConfidence}`,`目标字数:约 ${ao} 字,上限约 ${as} 字`,`章节并发上限:${bR}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:bh.length,label:aT?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aU=Math.ceil((c.sections?.length||2)/Math.max(1,bC.maxSectionConcurrency||1)),aV=Math.max(bV(ao),Math.min(18e5,3e5*aU+18e4)),aW=aT?await B(()=>bd(bD,`chapter-section-draft:${c.id}`,()=>aK(b=>bT({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:U,targetWords:ao,maxWords:as,forbidDrawingImages:R,factCoverageContext:ai,projectRoot:o,modelName:aQ,fileRolesHash:aS,allowPartialResult:!1,maxSectionConcurrency:bC.maxSectionConcurrency,sectionEvidenceProvider:a=>cL({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:ap,fileProcessingByPath:aq,signal:b}),diagnostics:bD,signal:b}),aV,a.signal))):await B(()=>bd(bD,`chapter-draft:${c.id}`,()=>aK(b=>bF(q,c,N,O,X,bn,a.requirement,U,{forbidDrawingImages:R,minWords:aA,targetWords:ao,maxWords:as,maxTokens:aB,factCoverageContext:ai,signal:b}),bV(ao),a.signal)));if(!aW&&aT?(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${ao} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:bh.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bD,`chapter-draft-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,X,bn,a.requirement,U,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aM,maxTokens:aN,factCoverageContext:ai,signal:b}),aO,a.signal)))):aW||(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${ao} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:bh.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bD,`chapter-draft-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,X,bn,a.requirement,U,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aM,maxTokens:aN,factCoverageContext:ai,signal:b}),aO,a.signal)))),ax(a.signal),aW||(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${ao} 字`],progress:{current:g+1,total:bh.length,label:"紧凑兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bD,`chapter-draft-compact-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,X,bn,a.requirement,U,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*aA)),targetWords:ao,maxWords:as,maxTokens:aB,factCoverageContext:ai,signal:b}),bV(ao),a.signal)))),ax(a.signal),!aW)throw Error(`${c.title} 大模型未返回有效章节正文`);let aX=ch(aW,c);if(aX.length>0){let b=aW;G[i]=a9({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:bh.length,label:"小节补写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bD,`chapter-supplement:${c.id}`,()=>b$({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:U,targetWords:ao,forbidDrawingImages:R,factCoverageContext:ai,maxSectionConcurrency:bC.maxSectionConcurrency,forcedSections:aX,signal:a.signal})))}if((aX=ch(aW,c)).length>0){G[i]=a9({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:bh.length,label:"章节内小节补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aW;aW=await B(()=>bd(bD,`chapter-forced-section-supplement:${c.id}`,()=>b$({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:U,targetWords:ao,forbidDrawingImages:R,factCoverageContext:ai,maxSectionConcurrency:bC.maxSectionConcurrency,forcedSections:aX,signal:a.signal}))),aX=ch(aW,c)}aX.length>0&&(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:aX.map(a=>a.message),progress:{current:g+1,total:bh.length,label:"保留可用章节"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let a3=bo({chapter:c,content:aW,missingFacts:O,targetWords:ao}),a5=(0,an.Ff)(a3);bD.quality.blockingCount+=a5.blocking,bD.quality.importantCount+=a5.important,bD.quality.minorCount+=a5.minor;let a7=bg(a3);if(a7.length>0){let b=aW;G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${a7.length} 个阻断问题`,details:a7,progress:{current:g+1,total:bh.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bd(bD,`chapter-repair:${c.id}`,()=>bp({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,...aa.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:a7,promptTexts:X,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bD,signal:a.signal})));aW=d.content,d.appliedCount>0&&(bD.quality.repairedCount+=1),ax(a.signal)}if(!aW?.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bc=cj(aW,c),be=0;if((0,am.V7)(bc)<Math.floor(.82*ao)||bg(bo({chapter:c,content:bc,missingFacts:O,targetWords:ao})).length>0){G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,am.V7)(bc)} 字 / 目标 ${Math.floor(.95*ao)} 字`,`章节并发:${bR}`],progress:{current:g+1,total:bh.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bd(bD,`chapter-expand:${c.id}`,()=>b_({template:q,chapter:c,content:aW,evidence:N,promptTexts:X,requirement:a.requirement,roleContext:U,targetChars:Math.floor(.95*ao),maxChars:as,forbidDrawingImages:R,maxTokens:Math.min(aB,aN),signal:a.signal})));bc=cj(b.content,c),be=b.rounds}bc=cz(bc,c);let bf=(0,am.V7)(bc),bi=c.sections?.length?c.sections:Z(bc),bq=(0,an.qK)(bc,[{title:c.title,content:bc,sections:bi}]).map(a=>a.message),br=[...bo({chapter:{...c,sections:bi},content:bc,missingFacts:O,targetWords:ao}),...bq],bt=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"}(bf,ao,br);f=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:bt,message:bb(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${be>0?`并定向扩写 ${be} 轮`:""}:当前 ${bf} 字 / 目标 ${Math.floor(.95*ao)} 字${"success"!==bt?`;风险:${br.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(bf/Math.max(1,Math.floor(.95*ao))*100)}%`,...Y,`二级小节:${bi.length} 个`,`扩写轮次:${be}`],progress:{current:g+1,total:bh.length,label:"success"===bt?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aC.push(f);let bu={id:c.id,title:c.title,content:bc,evidence:N,missingFacts:O,sections:bi};u.push(bu),y(u);let bv=bo({chapter:c,content:bc,missingFacts:O,targetWords:ao}),bw=(0,an.Ff)(bv);bD.quality.blockingCount+=bw.blocking,bD.quality.importantCount+=bw.important,bD.quality.minorCount+=bw.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aA.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aC.push(a9({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)=>bh.findIndex(b=>b.id===a.id)-bh.findIndex(a=>a.id===b.id)),0===u.length)throw Error(`章节生成未完成:${aA.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<bh.length)throw Error(`OUTLINE 指定 ${bh.length} 章,实际只生成 ${u.length} 章:${aA.join(";")||"部分章节未生成"}`);ax(a.signal),ba(G,a9({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bS={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bS=await bE(o,av,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(ba(G,bS.stage),y(u),ax(a.signal),bS.notes))av.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bW=I(av,{maxItems:Math.max(48,10*bh.length),maxChars:Math.max(52e3,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...bW);let bX=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,av,S);for(let a of aL)for(let b of a.facts)bX[b.key]=`${aw(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bY=aN(av,q,S),bZ=aT(av),b4=aU(av,T),b5=aL.flatMap(a=>a.facts.map(a=>({key:a.key,value:aw(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b6={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,D.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aw(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aw(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...b5,...bY,...bZ,...b4],q,S)){let b=I(av,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b6=await aO(b,af,q,S,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}ax(a.signal);let b7=function(a,b){let c=b.find(a=>a.filePath)?.filePath||"";return c?a.map(a=>a.sourceFile?a:{...a,sourceFile:c,sourceRef:{filePath:c,roleId:a.sourceRef?.roleId||a.roleId,processingType:a.sourceRef?.processingType||a.processingType,sectionTitle:a.sourceRef?.sectionTitle,chunkIndex:a.sourceRef?.chunkIndex,cellRange:a.sourceRef?.cellRange}}):a}([...b5,...bY,...bZ,...b4,...b6.facts],av);for(let a of(ba(G,bS.stage),b6.stages))ba(G,a);y();let b8=aM(av),b9=av.filter(a=>"pinned-evidence"===a.source).length,ca=av.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cf=a9({type:"reference",roleId:"quality-enhancement",status:av.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${av.length} 条,人工确认/固定证据 ${b9} 条,自动检索证据 ${ca} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(cf),y(),b7))bX[a.key]=`${aw(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ci=new Map;for(let a of av)ci.set(a.filePath,(ci.get(a.filePath)??0)+1);let ck=new Map;for(let a of av)ck.set(a.source||"unknown",(ck.get(a.source||"unknown")??0)+1);let cl=[...ci.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cn=a3(b7,b8,az,S,T),co=u.map(a=>{let b=S.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>S.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)}}),cp=function(a,b=[],c){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&f.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===(0,d.zY)(c).length&&f.push("模板未绑定任何提示词");let g=new Set(b.map(a=>a.roleId));return c?.fileBindings?.some(a=>"rule"===a.roleId)&&!g.has("rule")&&e.push("rule 角色未抽取到结构化事实"),{passed:0===f.length,warnings:e,errors:f}}(u,b7,q);cp.warnings.push(...V.warnings),cp.errors.push(...V.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}(cp,cn,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}(co)),aL))for(let b of a.warnings)cq.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cr=bm(aL,q),cs=Date.now(),ct=(0,am.V7)(u.map(a=>a.content).join("\n\n"));ba(G,a9({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${ct} 字`,details:[`章节数:${u.length}`,`目标:${bB.targetChars||bB.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cu=bC.enableDocumentBudgetExpansion?await B(()=>b0({template:q,chapters:u,budget:bB,promptTexts:ae,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"),cB=cF(u,b7,cv);cB.patchedCount>0&&(u.splice(0,u.length,...cB.chapters),cq.push({level:"info",message:`已自动补写未落位事实 ${cB.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cC=(0,am.fW)(bB,u.map(a=>a.content).join("\n\n")),cD=[bB.targetChars?`目标 ${bB.targetChars} 字${bB.minChars||bB.maxChars?`(区间 ${bB.minChars||0}-${bB.maxChars||"∞"} 字)`:""}`:void 0,bB.targetPages?`目标 ${bB.targetPages} 页${bB.minPages||bB.maxPages?`(区间 ${bB.minPages||0}-${bB.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";ba(G,a9({type:"validation",roleId:"document-budget",status:bB.maxChars&&cC.currentChars>bB.maxChars||bB.minChars&&cC.currentChars<bB.minChars?"fallback":"success",message:bb(`文档预算:当前 ${cC.currentChars} 字,新增 ${Math.max(0,cC.currentChars-ct)} 字,预计 ${cC.estimatedPages} 页;${cD}`,cs)},{subtitle:"文档预算"})),y(u);let cO=aC.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cP=Math.max(0,bh.length-u.length);cO>0&&cq.push({level:"info",message:`章节生成存在补充完善:${cO} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cP>0&&cq.push({level:"error",message:`部分章节生成失败:${cP} 章`,suggestion:aA.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cQ=cq.filter(a=>"error"===a.level&&(0,an.Nz)(a)).length,cR=[...G];ba(cR,a9({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${av.length} 条,来源文件 ${cl.length} 份,结构化事实 ${b7.length} 条`,details:[`证据类型:${[...ck.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${at.usableChunkCount} 条,待索引 ${at.pendingJobs} 个,向量 ${at.vectorStatus?.status||"unknown"}`,cB.patchedCount>0?`自动补写事实:${cB.patchedCount}/${cB.missingCount}`:`事实落位补写:0/${cB.missingCount}`]},{subtitle:"资料使用报告"})),ba(cR,a9({type:"reference",roleId:"web-research-report",status:ay.enabled?"success":"skipped",message:ay.enabled?`联网增强:检索章节 ${new Set(ay.chapters).size} 个,查询 ${ay.queries.length} 个,使用公开资料 ${ay.evidenceCount} 条`:"联网增强未开启",details:ay.enabled?[`检索主题:${[...new Set(ay.queries)].join(";")||"无"}`,`过滤结果:${ay.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),ba(cR,a9({type:"validation",roleId:"document-workflow",status:cQ>0?"failed":"success",message:`阻断 ${cQ},错误 ${cp.errors.length},警告 ${cp.warnings.length}`},{subtitle:"最终规范校验"})),ba(cR,a9({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),ba(cR,a9({type:"export_ready",roleId:"document-workflow",status:cQ>0?"failed":"success",message:cQ>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cS={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:bX,structuredFacts:b7,factsModel:cn,chapters:u,sources:cl,missingItems:[...new Set(az)],validation:cp,validationIssues:cq,executionStages:cR,exportGate:{passed:0===cQ,blockingIssues:cq.filter(a=>"error"===a.level&&(0,an.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bB.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},cT=al(cS);if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let a=ak(cT,u,{forbidDrawingImages:cr,promptRules:ac}).chapters.map(a=>{let b=bh.find(b=>b.id===a.id)||a;return{...a,content:cz(a.content,b)}}),b=cw(cm(cy(ak(al({...cS,chapters:a}),a,{forbidDrawingImages:cr,promptRules:ac}).markdown),b7),b7),c=[...cq];c.push(...w({markdown:b,spec:S,summary:Q})),c.push(...A({markdown:b,facts:b7,summary:Q,profile:T})),c.push(...x(b,Q)),c.push(...cx(b,b7)),ac.forbidToc||(c.push(...(0,an.gN)(b)),c.push(...(0,an.f8)(b))),c.push(...(0,an.k0)(b)),c.push(...(0,an.qK)(b,a)),c.push(...(0,an.iC)(b)),c.push(...(0,an.BV)(b)),c.push(..._(b)),c.push(...(0,an.Ty)(a)),c.push(...(0,an.N1)(b,cn)),c.push(...cc(b)),c.push(...(0,an.bM)(b)),c.push(...(0,an.M$)(b,J)),c.push(...(0,an.AC)(b,a)),c.push(...(0,an.mR)(b,q)),c.push(...(0,am.PE)(q.generationSettings||q.exportSettings,b).filter(a=>!(bB.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,am.ty)(bB,b)),c.push(...ai(b,q)),c.push(...ah(b,ac));let d=(0,an.Ai)(c,cn,a),e=cR.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:d.blockingIssues.length>0?"failed":"success",message:`阻断 ${d.blockingIssues.length},问题 ${c.length}`}:"export_ready"===a.type?{...a,status:d.passed?"success":"failed",message:d.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);e.push(a9({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;如需开启请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let f=a.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cS,chapters:f,validationIssues:c,exportGate:d,executionStages:e,partialChapters:a.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bB.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:f,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bD},markdown:b}}ax(a.signal);let cU=u.map(a=>{let b=bo({chapter:bh.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:bB.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,am.V7)(a.content)}}),cV=cU.filter(a=>"pass"!==a.status).length,cW=bC.enableChapterReview&&cV>0;cW&&(ba(cR,a9({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cV}/${u.length} 章存在本地风险`,details:[`审查并发:${bC.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cR));let cX=cW?await B(()=>bd(bD,"chapter-review",()=>b1({template:q,chapters:u,budget:bB,promptTexts:ag||ae,requirement:a.requirement,strategy:bC,diagnostics:bD,signal:a.signal}),{chapters:u.length}),cR):{summaries:cU,stage:a9({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bC.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cR.push(cX.stage);let cY=cX.summaries,cZ=cY.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cZ.length>0){ba(cR,a9({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cZ.length} 章`,details:cZ.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cZ.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cR);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bC.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bC.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<cZ.length;d+=e){ax(a.signal);let f=cZ.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 aK(d=>bp({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:ag||ae,requirement:a.requirement,forbidDrawingImages:cr,diagnostics:bD,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&&(cY=cY.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,am.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),cT=al({...cS,chapters:u,validationIssues:cq,executionStages:cR})),cR.push(a9({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cR)}if(cW)for(let a of cY.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 c$=bC.enableGlobalReview&&(cW||cq.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));c$&&(ba(cR,a9({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cR));let c_=c$?await B(()=>bd(bD,"global-consistency-review",()=>b2({template:q,chapters:u,chapterReviews:cY,promptTexts:ag||ae,requirement:a.requirement,projectContext:bn,diagnostics:bD,signal:a.signal}),{chapters:u.length}),cR):{issues:[],stage:a9({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bC.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cR.push(c_.stage),c_.issues))cq.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cR);let c0=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,am.V7)(a.content)<Math.floor(.7*(bB.chapterTargets.get(a.id)||1200))||cY.some(b=>b.chapterId===a.id&&"fail"===b.status)||bo({chapter:bh.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:bB.chapterTargets.get(a.id)||1200}).length>0),c1=cQ>0||c_.issues.length>0||cY.some(a=>"fail"===a.status)||cq.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c2=bC.enableFinalQualityReview&&(c1||c0.length>Math.max(3,Math.floor(.35*u.length))),c3=Date.now();c2&&(ba(cR,a9({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c0.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cR));let c4=I(av,{maxItems:Math.max(32,8*bh.length),maxChars:Math.max(36e3,6e3*bh.length),preservePinned:!0}),c5=c2?await B(()=>b3({template:q,spec:S,markdown:cT,evidence:c4,promptTexts:ag||ae,projectContext:bn,requirement:a.requirement,diagnostics:bD,signal:a.signal}),cR):{markdown:cT,stage:{type:"llm_review",roleId:"llm-review",status:c0.length>0?"fallback":"success",message:c0.length>0?`本地风险扫描发现 ${c0.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};c5.stage.message=bb(c5.stage.message||"LLM 审查完成",c3),ax(a.signal);let c6=ak(c5.markdown===cT?al({...cS,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}):c5.markdown,u,{forbidDrawingImages:cr,promptRules:ac}).markdown,c7=ai(c6,q).map(a=>a.message),c8=(0,an.bM)(c6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c9=(0,an.mR)(c6,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),da=(0,an.N1)(c6,cn).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),db=ac.forbidToc?[]:[...(0,an.gN)(c6),...(0,an.f8)(c6)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dc=(0,an.k0)(c6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dd=(0,an.qK)(c6,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),de=(0,an.iC)(c6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),df=(0,an.BV)(c6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dg=[...c7,...c8,...c9,...da,...db,...dc,...dd,...de,...df,...(0,an.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),..._(c6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],dh=new Set(dd),di=Date.now(),dj=dg.filter(a=>!dh.has(a));ba(cR,a9({type:"llm_review",roleId:"quality-repair",status:dj.length>0?"running":"success",message:dj.length>0?`正在进行精准质量修复:${dj.length} 个问题`:"未发现需要精准修复的问题",details:dj,progress:{current:1,total:Math.max(1,dj.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cR);let dk=await B(()=>bd(bD,"local-patch-quality-repair",()=>bq({markdown:c6,template:q,chapters:u,promptTexts:ae,requirement:a.requirement,issues:dj,forbidDrawingImages:cr,strategy:bC,diagnostics:bD,signal:a.signal}),{issues:dj.length}),cR);dk.stage&&(dk.stage.message=bb(dk.stage.message||"质量修复完成",di)),ax(a.signal);let dl=dk.stage?[...cR,c5.stage,dk.stage]:[...cR,c5.stage],dm=dk.chapters,dn=al({...cS,chapters:dm,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),dp=(0,an.yw)(dn,dm).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dp.length>0){let b=Date.now();ba(dl,a9({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dp.length} 个问题`,details:dp.map(a=>a.message),progress:{current:1,total:dp.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(dm,dl);let c=[...dm];for(let b=0;b<dm.length;b+=bC.maxChapterConcurrency){ax(a.signal);let d=dm.slice(b,b+bC.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dp.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bh.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bB.chapterTargets.get(b.id)||1200,f=bj(d,a8);try{let g=await aK(g=>b$({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ae,projectContext:bn,requirement:a.requirement,roleContext:bl(aL,d,f),targetWords:e,forbidDrawingImages:cr,maxSectionConcurrency:bC.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:Z(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dm=c;let d=(0,an.qK)(al({...cS,chapters:dm,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),dm);ba(dl,a9({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bb(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(dm,dl)}let dq=(0,am.fW)(bB,dm.map(a=>a.content).join("\n\n"));if(bC.enableDocumentBudgetExpansion&&bB.minChars&&dq.currentChars<Math.floor(.9*bB.minChars)&&(!bB.maxChars||dq.currentChars<bB.maxChars)){let b=Date.now(),c=dq.currentChars;ba(dl,a9({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bB.minChars} 字`,`章节数:${dm.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(dm,dl),dm=await B(()=>b0({template:q,chapters:dm,budget:bB,promptTexts:ae,requirement:a.requirement,forbidDrawingImages:cr,signal:a.signal}),dl);let d=(0,am.fW)(bB,dm.map(a=>a.content).join("\n\n"));ba(dl,a9({type:"validation",roleId:"document-budget-repair",status:bB.minChars&&d.currentChars<bB.minChars?"fallback":"success",message:bb(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dr=ak(al({...cS,chapters:dm,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),dm,{forbidDrawingImages:cr,promptRules:ac}),ds=dr.chapters,dt=dr.markdown,du=ds.map(a=>{let b=dm.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dv=(0,an.yw)(dt,du).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dv.length>0){let b=Date.now();ba(dl,a9({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dv.length} 个问题`,details:dv.map(a=>a.message),progress:{current:1,total:dv.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(ds,dl);let c=[...ds];for(let b=0;b<ds.length;b+=bC.maxChapterConcurrency){ax(a.signal);let d=ds.slice(b,b+bC.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dv.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bh.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bB.chapterTargets.get(b.id)||1200,f=bj(d,a8);try{let g=await aK(g=>b$({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ae,projectContext:bn,requirement:a.requirement,roleContext:bl(aL,d,f),targetWords:e,forbidDrawingImages:cr,maxSectionConcurrency:bC.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:Z(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}ds=(dr=ak(al({...cS,chapters:c,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),c,{forbidDrawingImages:cr,promptRules:ac})).chapters,dt=dr.markdown;let d=(0,an.qK)(dt,ds);ba(dl,a9({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bb(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(ds,dl)}ds=(dr=ak(al({...cS,chapters:ds,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),ds,{forbidDrawingImages:cr,promptRules:ac})).chapters,dt=cw(cm(dr.markdown,b7),b7);let dw=a7({facts:b7,markdown:dt});dw.size>0&&cR.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dw.size} 项`,details:[...dw.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dx=[...c7];(cq=(0,an.kQ)(S,[...cq,...dx.map(a=>({level:"warning",message:a}))],cn,ds,dt,K,J)).push(...w({markdown:dt,spec:S,summary:Q})),cq.push(...A({markdown:dt,facts:b7,summary:Q,profile:T})),cq.push(...x(dt,Q)),cq.push(...cx(dt,b7)),ac.forbidToc||(cq.push(...(0,an.gN)(dt)),cq.push(...(0,an.f8)(dt))),cq.push(...(0,an.k0)(dt)),cq.push(...(0,an.qK)(dt,ds)),cq.push(...(0,an.iC)(dt)),cq.push(...(0,an.BV)(dt)),cq.push(..._(dt)),cq.push(...(0,an.Ty)(ds)),cq.push(...(0,an.N1)(dt,cn)),cq.push(...cc(dt)),cq.push(...(0,an.bM)(dt)),cq.push(...(0,an.M$)(dt,J)),cq.push(...(0,an.AC)(dt,ds)),cq.push(...(0,an.mR)(dt,q));let dy=cF(ds,b7,dt);dy.patchedCount>0&&(ds=dy.chapters.map(a=>({...a,sections:a.sections||[]})),cq.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dy.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),dt=ak(al({...cS,chapters:ds,validationIssues:cq,exportGate:cS.exportGate,executionStages:cR}),ds,{forbidDrawingImages:cr,promptRules:ac}).markdown),cq.push(...function(a,b,c={}){return cE(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(dt,[...b7,...cn.preciseFacts],{maxIssues:30})),dt=ak(dt,ds,{forbidDrawingImages:cr,promptRules:ac}).markdown;let dz=(0,am.ty)(bB,dt),dA=(0,am.PE)(q.generationSettings||q.exportSettings,dt).filter(a=>!(bB.minPages&&/低于目标页数/u.test(a.message)));cq.push(...dA),cq.push(...dz),cq.push(...ai(dt,q)),cq.push(...ah(dt,ac));let dB=(0,an.Ai)(cq,cn,ds),dC=dB.blockingIssues.length,dD=(0,an.Ff)(cq);bD.quality.blockingCount+=dD.blocking,bD.quality.importantCount+=dD.important,bD.quality.minorCount+=dD.minor;let dE=dl.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dC>0?"failed":"success",message:`阻断 ${dC},问题 ${cq.length}`}:"export_ready"===a.type?{...a,status:dB.passed?"success":"failed",message:dB.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bD.llm.currentLimit=aE();let dF=[...bD.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dE.push(a9({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bD.llm.calls} 次,失败 ${bD.llm.failures} 次,排队 ${bD.llm.throttledWaits} 次/${Math.round(bD.llm.throttledWaitMs/1e3)} 秒,检索 ${bD.evidence.searchQueries} 次/${Math.round(bD.evidence.searchMs/1e3)} 秒,证据上下文 ${bD.evidence.contextChars} 字,噪声过滤 ${bD.evidence.filteredNoise} 条,质量问题 阻断${bD.quality.blockingCount}/重要${bD.quality.importantCount}/轻微${bD.quality.minorCount},自动限流调整 ${bD.llm.limitAdjustments} 次${dF?`,Top耗时:${dF}`:""}`},{subtitle:"后台诊断"}));let dG=ds.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cS,chapters:dG,validationIssues:cq,exportGate:dB,executionStages:dE,partialChapters:ds.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bB.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dG,reviewMetadata:{chapterSummaries:cY,globalIssues:c_.issues,diagnostics:bD}},markdown:dt}}async function cP(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=bt(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>br(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>br(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=cN(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=cI(c,c.queries,[]),s=cJ(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=>bs(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=cH(c,p.filter(a=>bs(f,a.filePath,k)),{maxItems:cK(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}
171
+ ${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}=${a2(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${a2(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?`事实需求覆盖卡片:
172
+ ${b.join("\n")}`:""}(_)}),aj={total:_.length,satisfied:_.filter(a=>"satisfied"===a.status).length,missing:_.filter(a=>"missing"===a.status).length,lowConfidence:_.filter(a=>"low_confidence"===a.status).length};for(let a of aa)aA.push(`${c.title}:事实需求未确认 ${a}`);let ak=T?.chapterRules.find(a=>a.id===c.id||a.title===c.title),al=bC.chapterTargets.get(c.id)||1200,ap=Math.ceil(al*(bC.maxChars?1.1:1.18)),as=bC.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*al))):1200,au=Math.max(d?.minWords||0,ak?.minWords||0,T?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*al),as),aB=bU(au,al),aC=bC.longformStrict?1:.55,aG=bC.longformStrict?al:2600,aH=Math.max(900,Math.min(al,Math.ceil(al*aC),aG)),aI=Math.max(450,Math.min(au,Math.floor(.72*aH))),aJ=Math.max(aH+300,Math.min(ap,Math.ceil(1.25*aH))),aM=bU(aI,aH),aN=Math.min(bV(aH),3e5),aO=c.sections?.filter(Boolean).length||0,aQ=/[、,,;;]/u.test(c.title),aS=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&aO>=2&&(bC.longformStrict||!aQ);G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:aS?`${(0,P.GQ)(c.title)} 正在按小节并发成稿`:`${(0,P.GQ)(c.title)} 正在整章一次成稿`,details:aS?[...Y,`有效证据:${N.length} 条`,`事实需求:${aj.satisfied}/${aj.total} 已满足,缺失 ${aj.missing},低置信 ${aj.lowConfidence}`,`目标字数:约 ${al} 字,上限约 ${ap} 字`,`小节并发上限:${bD.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[...Y,`有效证据:${N.length} 条`,`事实需求:${aj.satisfied}/${aj.total} 已满足,缺失 ${aj.missing},低置信 ${aj.lowConfidence}`,`目标字数:约 ${al} 字,上限约 ${ap} 字`,`章节并发上限:${bS}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:bn.length,label:aS?"小节并发":"整章成稿"}},{subtitle:(0,P.GQ)(c.title),order:g}),y();let aT=Math.ceil((c.sections?.length||2)/Math.max(1,bD.maxSectionConcurrency||1)),aU=Math.max(bV(al),Math.min(18e5,3e5*aT+18e4)),aW=aS?await B(()=>bd(bG,`chapter-section-draft:${c.id}`,()=>aK(b=>bT({template:q,chapter:c,evidence:N,missingFacts:O,promptTexts:W,projectContext:bw,requirement:a.requirement,roleContext:S,targetWords:al,maxWords:ap,forbidDrawingImages:R,factCoverageContext:ai,projectRoot:o,modelName:aR,fileRolesHash:aV,allowPartialResult:!1,maxSectionConcurrency:bD.maxSectionConcurrency,sectionEvidenceProvider:a=>cL({manager:t,projectRoot:o,chapter:c,sectionTitle:a,scopedFilePaths:w,fileRoleByPath:aq,fileProcessingByPath:ar,signal:b}),diagnostics:bG,signal:b}),aU,a.signal))):await B(()=>bd(bG,`chapter-draft:${c.id}`,()=>aK(b=>bF(q,c,N,O,W,bw,a.requirement,S,{forbidDrawingImages:R,minWords:au,targetWords:al,maxWords:ap,maxTokens:aB,factCoverageContext:ai,signal:b}),bV(al),a.signal)));if(!aW&&aS?(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${al} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:bn.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bG,`chapter-draft-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,W,bw,a.requirement,S,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aJ,maxTokens:aM,factCoverageContext:ai,signal:b}),aN,a.signal)))):aW||(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${al} 字`,`有效证据:${N.length} 条`],progress:{current:g+1,total:bn.length,label:"整章兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bG,`chapter-draft-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,W,bw,a.requirement,S,{forbidDrawingImages:R,minWords:aI,targetWords:aH,maxWords:aJ,maxTokens:aM,factCoverageContext:ai,signal:b}),aN,a.signal)))),ax(a.signal),aW||(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${al} 字`],progress:{current:g+1,total:bn.length,label:"紧凑兜底"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bG,`chapter-draft-compact-fallback:${c.id}`,()=>aK(b=>bF(q,c,N,O,W,bw,a.requirement,S,{forbidDrawingImages:R,minWords:Math.max(450,Math.floor(.75*au)),targetWords:al,maxWords:ap,maxTokens:aB,factCoverageContext:ai,signal:b}),bV(al),a.signal)))),ax(a.signal),!aW)throw Error(`${c.title} 大模型未返回有效章节正文`);let aX=ch(aW,c);if(aX.length>0){let b=aW;G[i]=a9({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:bn.length,label:"小节补写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u),aW=await B(()=>bd(bG,`chapter-supplement:${c.id}`,()=>b$({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bw,requirement:a.requirement,roleContext:S,targetWords:al,forbidDrawingImages:R,factCoverageContext:ai,maxSectionConcurrency:bD.maxSectionConcurrency,forcedSections:aX,signal:a.signal})))}if((aX=ch(aW,c)).length>0){G[i]=a9({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:bn.length,label:"章节内小节补齐"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=aW;aW=await B(()=>bd(bG,`chapter-forced-section-supplement:${c.id}`,()=>b$({template:q,chapter:c,content:b,evidence:N,missingFacts:O,promptTexts:W,projectContext:bw,requirement:a.requirement,roleContext:S,targetWords:al,forbidDrawingImages:R,factCoverageContext:ai,maxSectionConcurrency:bD.maxSectionConcurrency,forcedSections:aX,signal:a.signal}))),aX=ch(aW,c)}aX.length>0&&(G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"fallback",message:`${(0,P.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:aX.map(a=>a.message),progress:{current:g+1,total:bn.length,label:"保留可用章节"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u));let a3=bo({chapter:c,content:aW,missingFacts:O,targetWords:al}),a4=(0,an.Ff)(a3);bG.quality.blockingCount+=a4.blocking,bG.quality.importantCount+=a4.important,bG.quality.minorCount+=a4.minor;let a6=bg(a3);if(a6.length>0){let b=aW;G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 正在根据质量问题修复章节:${a6.length} 个阻断问题`,details:a6,progress:{current:g+1,total:bn.length,label:"章节修复"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let d=await B(()=>bd(bG,`chapter-repair:${c.id}`,()=>bp({template:q,chapter:{id:c.id,title:c.title,content:b,evidence:N,missingFacts:[...O,...aa.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:a6,promptTexts:W,requirement:a.requirement,forbidDrawingImages:R,diagnostics:bG,signal:a.signal})));aW=d.content,d.appliedCount>0&&(bG.quality.repairedCount+=1),ax(a.signal)}if(!aW?.trim())throw Error(`${(0,P.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let a7=cj(aW,c),bc=0;if((0,am.V7)(a7)<Math.floor(.82*al)||bg(bo({chapter:c,content:a7,missingFacts:O,targetWords:al})).length>0){G[i]=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:"running",message:`${(0,P.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,am.V7)(a7)} 字 / 目标 ${Math.floor(.95*al)} 字`,`章节并发:${bS}`],progress:{current:g+1,total:bn.length,label:"章节扩写"}},{subtitle:(0,P.GQ)(c.title),order:g}),y(u);let b=await B(()=>bd(bG,`chapter-expand:${c.id}`,()=>b_({template:q,chapter:c,content:aW,evidence:N,promptTexts:W,requirement:a.requirement,roleContext:S,targetChars:Math.floor(.95*al),maxChars:ap,forbidDrawingImages:R,maxTokens:Math.min(aB,aM),signal:a.signal})));a7=cj(b.content,c),bc=b.rounds}a7=cz(a7,c);let be=(0,am.V7)(a7),bf=c.sections?.length?c.sections:Z(a7),bi=(0,an.qK)(a7,[{title:c.title,content:a7,sections:bf}]).map(a=>a.message),bq=[...bo({chapter:{...c,sections:bf},content:a7,missingFacts:O,targetWords:al}),...bi],br=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(be,al,bq);f=a9({type:"chapter_generation",roleId:"chapter_generation",promptId:V.primaryPromptId,status:br,message:bb(`${(0,P.GQ)(c.title)} 已由大模型首轮成稿${bc>0?`并定向扩写 ${bc} 轮`:""}:当前 ${be} 字 / 目标 ${Math.floor(.95*al)} 字${"success"!==br?`;风险:${bq.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(be/Math.max(1,Math.floor(.95*al))*100)}%`,...Y,`二级小节:${bf.length} 个`,`扩写轮次:${bc}`],progress:{current:g+1,total:bn.length,label:"success"===br?"章节达标":"章节风险"}},{subtitle:(0,P.GQ)(c.title),order:g}),aD.push(f);let bt={id:c.id,title:c.title,content:a7,evidence:N,missingFacts:O,sections:bf};u.push(bt),y(u);let bu=bo({chapter:c,content:a7,missingFacts:O,targetWords:al}),bv=(0,an.Ff)(bu);bG.quality.blockingCount+=bv.blocking,bG.quality.importantCount+=bv.important,bG.quality.minorCount+=bv.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aC.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aD.push(a9({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)=>bn.findIndex(b=>b.id===a.id)-bn.findIndex(a=>a.id===b.id)),0===u.length)throw Error(`章节生成未完成:${aC.join(";")||"没有生成任何有效章节"}`);if(O&&u.length<bn.length)throw Error(`OUTLINE 指定 ${bn.length} 章,实际只生成 ${u.length} 章:${aC.join(";")||"部分章节未生成"}`);ax(a.signal),ba(G,a9({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),y(u);let bW={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bW=await bE(o,ay,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(ba(G,bW.stage),y(u),ax(a.signal),bW.notes))ay.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bX=I(ay,{maxItems:Math.max(48,10*bn.length),maxChars:Math.max(52e3,9e3*bn.length),preservePinned:!0});ay.splice(0,ay.length,...bX);let bY=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,ay,T);for(let a of aP)for(let b of a.facts)bY[b.key]=`${aw(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bZ=aN(ay,q,T),b4=aT(ay),b5=aU(ay,U),b6=aP.flatMap(a=>a.facts.map(a=>({key:a.key,value:aw(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b7={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&&aw(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aw(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}([...b6,...bZ,...b4,...b5],q,T)){let b=I(ay,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b7=await aO(b,ag,q,T,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}ax(a.signal);let b8=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}([...b6,...bZ,...b4,...b5,...b7.facts],ay);for(let a of(ba(G,bW.stage),b7.stages))ba(G,a);y();let b9=aM(ay),ca=ay.filter(a=>"pinned-evidence"===a.source).length,cf=ay.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,ci=a9({type:"reference",roleId:"quality-enhancement",status:ay.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${ay.length} 条,人工确认/固定证据 ${ca} 条,自动检索证据 ${cf} 条`},{subtitle:"证据与上下文增强"});for(let a of(G.push(ci),y(),b8))bY[a.key]=`${aw(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let ck=new Map;for(let a of ay)ck.set(a.filePath,(ck.get(a.filePath)??0)+1);let cl=new Map;for(let a of ay)cl.set(a.source||"unknown",(cl.get(a.source||"unknown")??0)+1);let cn=[...ck.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),co=a3(b8,b9,aA,T,U),cp=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)}}),cq=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,b8,q);cq.warnings.push(...W.warnings),cq.errors.push(...W.blockingIssues);let cr=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}(cq,co,u);for(let a of(cr.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}(cp)),aP))for(let b of a.warnings)cr.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cs=bm(aP,q),ct=Date.now(),cu=(0,am.V7)(u.map(a=>a.content).join("\n\n"));ba(G,a9({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cu} 字`,details:[`章节数:${u.length}`,`目标:${bC.targetChars||bC.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),y(u);let cv=bD.enableDocumentBudgetExpansion?await B(()=>b0({template:q,chapters:u,budget:bC,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cs,signal:a.signal})):u;u.splice(0,u.length,...cv);let cB=u.map(a=>a.content).join("\n\n"),cC=cF(u,b8,cB);cC.patchedCount>0&&(u.splice(0,u.length,...cC.chapters),cr.push({level:"info",message:`已自动补写未落位事实 ${cC.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}));let cD=(0,am.fW)(bC,u.map(a=>a.content).join("\n\n")),cO=[bC.targetChars?`目标 ${bC.targetChars} 字${bC.minChars||bC.maxChars?`(区间 ${bC.minChars||0}-${bC.maxChars||"∞"} 字)`:""}`:void 0,bC.targetPages?`目标 ${bC.targetPages} 页${bC.minPages||bC.maxPages?`(区间 ${bC.minPages||0}-${bC.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";ba(G,a9({type:"validation",roleId:"document-budget",status:bC.maxChars&&cD.currentChars>bC.maxChars||bC.minChars&&cD.currentChars<bC.minChars?"fallback":"success",message:bb(`文档预算:当前 ${cD.currentChars} 字,新增 ${Math.max(0,cD.currentChars-cu)} 字,预计 ${cD.estimatedPages} 页;${cO}`,ct)},{subtitle:"文档预算"})),y(u);let cP=aD.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cQ=Math.max(0,bn.length-u.length);cP>0&&cr.push({level:"info",message:`章节生成存在补充完善:${cP} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cQ>0&&cr.push({level:"error",message:`部分章节生成失败:${cQ} 章`,suggestion:aC.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cR=cr.filter(a=>"error"===a.level&&(0,an.Nz)(a)).length,cS=[...G];ba(cS,a9({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${ay.length} 条,来源文件 ${cn.length} 份,结构化事实 ${b8.length} 条`,details:[`证据类型:${[...cl.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${au.usableChunkCount} 条,待索引 ${au.pendingJobs} 个,向量 ${au.vectorStatus?.status||"unknown"}`,cC.patchedCount>0?`自动补写事实:${cC.patchedCount}/${cC.missingCount}`:`事实落位补写:0/${cC.missingCount}`]},{subtitle:"资料使用报告"})),ba(cS,a9({type:"reference",roleId:"web-research-report",status:az.enabled?"success":"skipped",message:az.enabled?`联网增强:检索章节 ${new Set(az.chapters).size} 个,查询 ${az.queries.length} 个,使用公开资料 ${az.evidenceCount} 条`:"联网增强未开启",details:az.enabled?[`检索主题:${[...new Set(az.queries)].join(";")||"无"}`,`过滤结果:${az.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),ba(cS,a9({type:"validation",roleId:"document-workflow",status:cR>0?"failed":"success",message:`阻断 ${cR},错误 ${cq.errors.length},警告 ${cq.warnings.length}`},{subtitle:"最终规范校验"})),ba(cS,a9({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),ba(cS,a9({type:"export_ready",roleId:"document-workflow",status:cR>0?"failed":"success",message:cR>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cT={templateId:q.id,templateName:q.name,title:q.outputTitle,requirement:a.requirement||"",projectRoot:o,projectId:p,exportSettings:q.exportSettings,generationSettings:q.generationSettings,facts:bY,structuredFacts:b8,factsModel:co,chapters:u,sources:cn,missingItems:[...new Set(aA)],validation:cq,validationIssues:cr,executionStages:cS,exportGate:{passed:0===cR,blockingIssues:cr.filter(a=>"error"===a.level&&(0,an.Nz)(a)),checklist:[]},assets:[],partialChapters:u.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bC.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:u,generatedAt:Date.now()},cU=al(cT);if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let a=ak(cU,u,{forbidDrawingImages:cs,promptRules:ad}).chapters.map(a=>{let b=bn.find(b=>b.id===a.id)||a;return{...a,content:cz(a.content,b)}}),b=cw(cm(cy(ak(al({...cT,chapters:a}),a,{forbidDrawingImages:cs,promptRules:ad}).markdown),b8),b8),c=[...cr];c.push(...w({markdown:b,spec:T,summary:R})),c.push(...A({markdown:b,facts:b8,summary:R,profile:U})),c.push(...x(b,R)),c.push(...cx(b,b8)),ad.forbidToc||(c.push(...(0,an.gN)(b)),c.push(...(0,an.f8)(b))),c.push(...(0,an.k0)(b)),c.push(...(0,an.qK)(b,a)),c.push(...(0,an.iC)(b)),c.push(...(0,an.BV)(b)),c.push(..._(b)),c.push(...(0,an.Ty)(a)),c.push(...(0,an.N1)(b,co)),c.push(...cc(b)),c.push(...(0,an.bM)(b)),c.push(...(0,an.M$)(b,J)),c.push(...(0,an.AC)(b,a)),c.push(...(0,an.mR)(b,q)),c.push(...(0,am.PE)(q.generationSettings||q.exportSettings,b).filter(a=>!(bC.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,am.ty)(bC,b)),c.push(...ai(b,q)),c.push(...ah(b,ad));let d=(0,an.Ai)(c,co,a),e=cS.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:d.blockingIssues.length>0?"failed":"success",message:`阻断 ${d.blockingIssues.length},问题 ${c.length}`}:"export_ready"===a.type?{...a,status:d.passed?"success":"failed",message:d.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);e.push(a9({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;如需开启请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let f=a.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cT,chapters:f,validationIssues:c,exportGate:d,executionStages:e,partialChapters:a.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bC.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:f,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bG},markdown:b}}ax(a.signal);let cV=u.map(a=>{let b=bo({chapter:bn.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:bC.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,am.V7)(a.content)}}),cW=cV.filter(a=>"pass"!==a.status).length,cX=bD.enableChapterReview&&cW>0;cX&&(ba(cS,a9({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cW}/${u.length} 章存在本地风险`,details:[`审查并发:${bD.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),y(u,cS));let cY=cX?await B(()=>bd(bG,"chapter-review",()=>b1({template:q,chapters:u,budget:bC,promptTexts:aj||af,requirement:a.requirement,strategy:bD,diagnostics:bG,signal:a.signal}),{chapters:u.length}),cS):{summaries:cV,stage:a9({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bD.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cS.push(cY.stage);let cZ=cY.summaries,c$=cZ.filter(a=>"pass"!==a.status&&a.issues.length>0);if(c$.length>0){ba(cS,a9({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${c$.length} 章`,details:c$.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:c$.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),y(u,cS);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bD.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bD.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<c$.length;d+=e){ax(a.signal);let f=c$.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 aK(d=>bp({template:q,chapter:c,issues:b.issues.slice(0,4),promptTexts:aj||af,requirement:a.requirement,forbidDrawingImages:cs,diagnostics:bG,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&&(cZ=cZ.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,am.V7)(u.find(b=>b.id===a.chapterId)?.content||"")}:a),cU=al({...cT,chapters:u,validationIssues:cr,executionStages:cS})),cS.push(a9({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),y(u,cS)}if(cX)for(let a of cZ.filter(a=>"pass"!==a.status&&a.issues.length>0))cr.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let c_=bD.enableGlobalReview&&(cX||cr.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));c_&&(ba(cS,a9({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),y(u,cS));let c0=c_?await B(()=>bd(bG,"global-consistency-review",()=>b2({template:q,chapters:u,chapterReviews:cZ,promptTexts:aj||af,requirement:a.requirement,projectContext:bw,diagnostics:bG,signal:a.signal}),{chapters:u.length}),cS):{issues:[],stage:a9({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bD.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cS.push(c0.stage),c0.issues))cr.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});y(u,cS);let c1=u.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,am.V7)(a.content)<Math.floor(.7*(bC.chapterTargets.get(a.id)||1200))||cZ.some(b=>b.chapterId===a.id&&"fail"===b.status)||bo({chapter:bn.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:bC.chapterTargets.get(a.id)||1200}).length>0),c2=cR>0||c0.issues.length>0||cZ.some(a=>"fail"===a.status)||cr.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c3=bD.enableFinalQualityReview&&(c2||c1.length>Math.max(3,Math.floor(.35*u.length))),c4=Date.now();c3&&(ba(cS,a9({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${c1.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),y(u,cS));let c5=I(ay,{maxItems:Math.max(32,8*bn.length),maxChars:Math.max(36e3,6e3*bn.length),preservePinned:!0}),c6=c3?await B(()=>b3({template:q,spec:T,markdown:cU,evidence:c5,promptTexts:aj||af,projectContext:bw,requirement:a.requirement,diagnostics:bG,signal:a.signal}),cS):{markdown:cU,stage:{type:"llm_review",roleId:"llm-review",status:c1.length>0?"fallback":"success",message:c1.length>0?`本地风险扫描发现 ${c1.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};c6.stage.message=bb(c6.stage.message||"LLM 审查完成",c4),ax(a.signal);let c7=ak(c6.markdown===cU?al({...cT,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}):c6.markdown,u,{forbidDrawingImages:cs,promptRules:ad}).markdown,c8=ai(c7,q).map(a=>a.message),c9=(0,an.bM)(c7).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),da=(0,an.mR)(c7,q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),db=(0,an.N1)(c7,co).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dc=ad.forbidToc?[]:[...(0,an.gN)(c7),...(0,an.f8)(c7)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dd=(0,an.k0)(c7).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),de=(0,an.qK)(c7,u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),df=(0,an.iC)(c7).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dg=(0,an.BV)(c7).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dh=[...c8,...c9,...da,...db,...dc,...dd,...de,...df,...dg,...(0,an.Ty)(u).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),..._(c7).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],di=new Set(de),dj=Date.now(),dk=dh.filter(a=>!di.has(a));ba(cS,a9({type:"llm_review",roleId:"quality-repair",status:dk.length>0?"running":"success",message:dk.length>0?`正在进行精准质量修复:${dk.length} 个问题`:"未发现需要精准修复的问题",details:dk,progress:{current:1,total:Math.max(1,dk.length),label:"质量修复"}},{subtitle:"精准质量修复"})),y(u,cS);let dl=await B(()=>bd(bG,"local-patch-quality-repair",()=>bq({markdown:c7,template:q,chapters:u,promptTexts:af,requirement:a.requirement,issues:dk,forbidDrawingImages:cs,strategy:bD,diagnostics:bG,signal:a.signal}),{issues:dk.length}),cS);dl.stage&&(dl.stage.message=bb(dl.stage.message||"质量修复完成",dj)),ax(a.signal);let dm=dl.stage?[...cS,c6.stage,dl.stage]:[...cS,c6.stage],dn=dl.chapters,dp=al({...cT,chapters:dn,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),dq=(0,an.yw)(dp,dn).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dq.length>0){let b=Date.now();ba(dm,a9({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dq.length} 个问题`,details:dq.map(a=>a.message),progress:{current:1,total:dq.length,label:"小节补写"}},{subtitle:"小节内容补写"})),y(dn,dm);let c=[...dn];for(let b=0;b<dn.length;b+=bD.maxChapterConcurrency){ax(a.signal);let d=dn.slice(b,b+bD.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dq.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bn.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bC.chapterTargets.get(b.id)||1200,f=bj(d,bh);try{let g=await aK(g=>b$({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bw,requirement:a.requirement,roleContext:bl(aP,d,f),targetWords:e,forbidDrawingImages:cs,maxSectionConcurrency:bD.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:Z(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dn=c;let d=(0,an.qK)(al({...cT,chapters:dn,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),dn);ba(dm,a9({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bb(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),y(dn,dm)}let dr=(0,am.fW)(bC,dn.map(a=>a.content).join("\n\n"));if(bD.enableDocumentBudgetExpansion&&bC.minChars&&dr.currentChars<Math.floor(.9*bC.minChars)&&(!bC.maxChars||dr.currentChars<bC.maxChars)){let b=Date.now(),c=dr.currentChars;ba(dm,a9({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bC.minChars} 字`,`章节数:${dn.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),y(dn,dm),dn=await B(()=>b0({template:q,chapters:dn,budget:bC,promptTexts:af,requirement:a.requirement,forbidDrawingImages:cs,signal:a.signal}),dm);let d=(0,am.fW)(bC,dn.map(a=>a.content).join("\n\n"));ba(dm,a9({type:"validation",roleId:"document-budget-repair",status:bC.minChars&&d.currentChars<bC.minChars?"fallback":"success",message:bb(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let ds=ak(al({...cT,chapters:dn,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),dn,{forbidDrawingImages:cs,promptRules:ad}),dt=ds.chapters,du=ds.markdown,dv=dt.map(a=>{let b=dn.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dw=(0,an.yw)(du,dv).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dw.length>0){let b=Date.now();ba(dm,a9({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dw.length} 个问题`,details:dw.map(a=>a.message),progress:{current:1,total:dw.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),y(dt,dm);let c=[...dt];for(let b=0;b<dt.length;b+=bD.maxChapterConcurrency){ax(a.signal);let d=dt.slice(b,b+bD.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dw.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bn.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bC.chapterTargets.get(b.id)||1200,f=bj(d,bh);try{let g=await aK(g=>b$({template:q,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:af,projectContext:bw,requirement:a.requirement,roleContext:bl(aP,d,f),targetWords:e,forbidDrawingImages:cs,maxSectionConcurrency:bD.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:Z(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dt=(ds=ak(al({...cT,chapters:c,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),c,{forbidDrawingImages:cs,promptRules:ad})).chapters,du=ds.markdown;let d=(0,an.qK)(du,dt);ba(dm,a9({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bb(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),y(dt,dm)}dt=(ds=ak(al({...cT,chapters:dt,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),dt,{forbidDrawingImages:cs,promptRules:ad})).chapters,du=cw(cm(ds.markdown,b8),b8);let dx=a7({facts:b8,markdown:du});dx.size>0&&cS.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${dx.size} 项`,details:[...dx.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let dy=[...c8];(cr=(0,an.kQ)(T,[...cr,...dy.map(a=>({level:"warning",message:a}))],co,dt,du,Q,J)).push(...w({markdown:du,spec:T,summary:R})),cr.push(...A({markdown:du,facts:b8,summary:R,profile:U})),cr.push(...x(du,R)),cr.push(...cx(du,b8)),ad.forbidToc||(cr.push(...(0,an.gN)(du)),cr.push(...(0,an.f8)(du))),cr.push(...(0,an.k0)(du)),cr.push(...(0,an.qK)(du,dt)),cr.push(...(0,an.iC)(du)),cr.push(...(0,an.BV)(du)),cr.push(..._(du)),cr.push(...(0,an.Ty)(dt)),cr.push(...(0,an.N1)(du,co)),cr.push(...cc(du)),cr.push(...(0,an.bM)(du)),cr.push(...(0,an.M$)(du,J)),cr.push(...(0,an.AC)(du,dt)),cr.push(...(0,an.mR)(du,q));let dz=cF(dt,b8,du);dz.patchedCount>0&&(dt=dz.chapters.map(a=>({...a,sections:a.sections||[]})),cr.push({level:"info",message:`最终审查阶段已补写未落位事实 ${dz.patchedCount} 项`,suggestion:"补写仅使用已确认资料事实,未补写商务敏感信息或资料未明确内容。"}),du=ak(al({...cT,chapters:dt,validationIssues:cr,exportGate:cT.exportGate,executionStages:cS}),dt,{forbidDrawingImages:cs,promptRules:ad}).markdown),cr.push(...function(a,b,c={}){return cE(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(du,[...b8,...co.preciseFacts],{maxIssues:30})),du=ak(du,dt,{forbidDrawingImages:cs,promptRules:ad}).markdown;let dA=(0,am.ty)(bC,du),dB=(0,am.PE)(q.generationSettings||q.exportSettings,du).filter(a=>!(bC.minPages&&/低于目标页数/u.test(a.message)));cr.push(...dB),cr.push(...dA),cr.push(...ai(du,q)),cr.push(...ah(du,ad));let dC=(0,an.Ai)(cr,co,dt),dD=dC.blockingIssues.length,dE=(0,an.Ff)(cr);bG.quality.blockingCount+=dE.blocking,bG.quality.importantCount+=dE.important,bG.quality.minorCount+=dE.minor;let dF=dm.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dD>0?"failed":"success",message:`阻断 ${dD},问题 ${cr.length}`}:"export_ready"===a.type?{...a,status:dC.passed?"success":"failed",message:dC.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bG.llm.currentLimit=aE();let dG=[...bG.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dF.push(a9({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bG.llm.calls} 次,失败 ${bG.llm.failures} 次,排队 ${bG.llm.throttledWaits} 次/${Math.round(bG.llm.throttledWaitMs/1e3)} 秒,检索 ${bG.evidence.searchQueries} 次/${Math.round(bG.evidence.searchMs/1e3)} 秒,证据上下文 ${bG.evidence.contextChars} 字,噪声过滤 ${bG.evidence.filteredNoise} 条,质量问题 阻断${bG.quality.blockingCount}/重要${bG.quality.importantCount}/轻微${bG.quality.minorCount},自动限流调整 ${bG.llm.limitAdjustments} 次${dG?`,Top耗时:${dG}`:""}`},{subtitle:"后台诊断"}));let dH=dt.map(a=>({...a,evidence:I(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cT,chapters:dH,validationIssues:cr,exportGate:dC,executionStages:dF,partialChapters:dt.map(a=>({id:a.id,title:a.title,chars:(0,am.V7)(a.content),status:cd(a,bC.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dH,reviewMetadata:{chapterSummaries:cZ,globalIssues:c0.issues,diagnostics:bG}},markdown:du}}async function cP(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=bt(f,j),l=(0,i.XB)("file"),m=new Map(j.flatMap(a=>br(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(j.flatMap(a=>br(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=cN(await h.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=cI(c,c.queries,[]),s=cJ(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=>bs(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=cH(c,p.filter(a=>bs(f,a.filePath,k)),{maxItems:cK(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}
172
173
  ${a.category}
173
174
  ${a.format}
174
- ${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:()=>z,C1:()=>F,DX:()=>G,N6:()=>H,QJ:()=>y,Vh:()=>N,bV:()=>C,bj:()=>w,dU:()=>u,h0:()=>B,jG:()=>x,wR:()=>J,xm:()=>A,zY:()=>M});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753),j=c(6444),k=c(85441),l=c(81125),m=c(56942);function n(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function o(){return e.join(n(),"document-templates.json")}function p(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function q(){try{let a=o();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(p)}catch{return[]}}function r(a){d.writeFileSync(o(),JSON.stringify(a.map(p),null,2),"utf-8")}function s(){try{let a=JSON.parse(d.readFileSync(e.join(n(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}function t(a){let b=s();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")}}}function u(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=t(c.promptId);a&&b.push({...a,roleId:c.roleId})}return b}function v(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"}function w(a){var b;let c=I(a),d=(0,h.XB)("prompt"),e=M(a),f=[],g=[],i=[];if(c)for(let a of c.promptRoles)d.find(b=>b.id===a.roleId)||i.push(a.roleId),e.some(b=>b.roleId===a.roleId||b.roleId===K(a.roleId))||f.push({roleId:a.roleId,promptId:"",reason:"项目角色提示词未解析到可用提示词资源"});let j=[...e];if(/施工组织设计|施工方案|危大工程|安全文明施工/u.test(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`)&&!u(j).some(a=>"writer"===v(a.roleId,d.find(b=>b.id===a.roleId)?.executionType||K(a.roleId),a.name)))for(let a of(b=/施工组织设计总控|总控|施工组织/u,s().filter(a=>b.test(a.name||"")).map(a=>a.id)).slice(0,1))j.push({promptId:a,roleId:"runtime-construction-writer"}),g.push({roleId:"runtime-construction-writer",promptId:a,reason:"施工组织设计运行时必需写作总控提示词"});let k=L(j),l=[];for(let a of k){let b=t(a.promptId);if(!b)continue;let e=d.find(b=>b.id===a.roleId),f=e?.executionType||K(a.roleId),h=v(a.roleId,f,b.name),i=g.some(b=>b.roleId===a.roleId&&b.promptId===a.promptId)?"runtimeRequired":c?"projectRole":"template";l.push({...b,roleId:a.roleId,executionType:f,category:h,bindingSource:i})}return{bindings:k,prompts:l,writerPrompts:l.filter(a=>"writer"===a.category),chapterPrompts:l.filter(a=>"chapter"===a.category),extractionPrompts:l.filter(a=>"extraction"===a.category),formattingPrompts:l.filter(a=>"formatting"===a.category),referencePrompts:l.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(i)],fallbackBindings:f,runtimeRequiredBindings:g}}function x(){let a=(0,i.V)().templates,b=q().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function y(a){return x().find(b=>b.id===a)}function z(a){let b=p(a),c=q().filter(a=>a.id!==b.id);return c.push(b),r(c),b}async function A(a,b=(0,g.aY)()){let c,d=y(a),f=[];if(!d)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let i=(0,h.XB)("prompt"),n=(0,h.XB)("file"),o=H(d),p=I(d);o||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),o&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${o}`});let q=M(d),r=N(d);0===q.length&&f.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let s=e.resolve(b),t=(0,g.Yy)(s);0===r.length&&f.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let v=new Map(t.map(a=>[a.relativePath,a])),w=r.map(a=>{let b=n.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)}}),x=u(q),z=q.map(a=>{let b=i.find(b=>b.id===a.roleId),c=x.find(b=>b.id===a.promptId);return b||f.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||f.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&f.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});if(d){let a=(0,k.P)(s,{boundFilePaths:r.map(a=>a.filePath),boundFileRoles:J(r)}),b=(0,l.h)(d,a);for(let e of(c=(0,m.$)({template:d,spec:(0,j.x)(d).spec,summary:a,resolvedRoles:b})).blockingIssues)f.push({level:"error",message:`生成准备度不足:${e}`});for(let a of c.warnings)f.push({level:"warning",message:a})}return{templateId:a,projectRoleConfigId:o,fileDiagnostics:w,promptDiagnostics:z,readiness:c,issues:f}}function B(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");r(q().filter(b=>b.id!==a))}function C(a){let b=y(a);if(!b)throw Error("Document template not found");let c=p({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=q();return d.push(c),r(d),c}function D(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function E(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>D(b,a)))}function F(a,b){return E(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>D(a,b)))}function G(a,b){return E(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>D(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>D(a,b)))}function H(a){return a.projectRoleConfigId||void 0}function I(a){let b=H(a);return b?(0,h.Mu)(b):void 0}function J(a){let b=new Map,c=(0,h.XB)("file");for(let d of a){let a=c.find(a=>a.id===d.roleId),e=function(a=""){return"rule"===a?["requirement_document"]:"table"===a?["structured_data"]:"drawing"===a?["design_specification"]:"specification"===a?["technical_specification"]:["project_overview"]}(a?.processingType);b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...e])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function K(a){return/extract|extraction|抽取|清单|图纸|品牌/u.test(a)?"fact_extraction":/validation|校验|审查|审核/u.test(a)?"validation":/format|排版/u.test(a)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(a)?"chapter_generation":"reference"}function L(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function M(a){let b=I(a);if(b){let a=(0,h.XB)("prompt"),c=[];for(let d of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=a.find(a=>a.id===d.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[],f=e.length>0?e:function(a,b=""){let c=s(),d=`${a} ${b}`;return c.filter(a=>{let b=a.name||"";return/writer|施工组织|construction-organization/u.test(d)?/施工组织设计总控|总控|施工组织/u.test(b):/method|施工方法/u.test(d)?/施工方法|主要施工/u.test(b):/schedule|quality|进度|工期|质量/u.test(d)?/工期|进度|质量/u.test(b):/resource|人材机|资源/u.test(d)?/人材机|资源|材料|设备/u.test(b):/safety|文明|安全/u.test(d)?/安全|文明/u.test(b):/dangerous|危大/u.test(d)?/危大|危险性/u.test(b):!!/extract|extraction|抽取|清单|图纸|品牌/u.test(d)&&/抽取|识别|清单|图纸|品牌|总控/u.test(b)}).slice(0,2).map(a=>a.id)}(d.roleId,b?.name),g=b?.id||K(d.roleId);c.push(...f.map(a=>({promptId:a,roleId:g})))}if(c.length>0)return L(c)}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function N(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},56942:(a,b,c)=>{c.d(b,{$:()=>h,R:()=>i});var d=c(81125),e=c(92808);function f(a){return[...new Set(a.filter(Boolean))]}function g(a){let b=(0,e.t0)(a,e.hW);return b.length>0?b:["project_overview"]}function h(a){var b,c,e;let h=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),i=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),j=(b=a.template,c=a.spec,e=a.summary,b.chapters.map(a=>{let b=function(a,b){let c=b.chapterRules.find(b=>b.id===a.id||b.title===a.title),d=(c?.requiredFactIds||[]).map(a=>b.factFields.find(b=>b.id===a)?.name).filter(Boolean);return f([...a.requiredFacts||[],...d])}(a,c),d=f([...g([a.title,a.purpose,...a.queries||[],...a.sections||[]].join("\n")),...b.flatMap(a=>g(a))]),h=d.filter(a=>(e.materialInventory[a]||[]).length>0),i=h.reduce((a,b)=>a+(e.materialInventory[b]||[]).length,0),j=b.filter(a=>g(a).some(a=>h.includes(a))),k=b.filter(a=>!j.includes(a)),l=b.length>0?j.length/b.length:1,m=d.length>0?h.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:b,coveredFacts:j,missingFacts:k,requiredRoles:d,satisfiedRoles:h,evidenceCount:i,readinessRate:Math.min(1,.5*l+.3*m+.2*(i>0))}})),k=[],l=[];0===a.template.chapters.length&&l.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&l.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&k.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&l.push("材料指纹置信度较低,建议绑定明确的材料文件"),0===a.summary.source.selectedFiles&&k.push("未绑定可用项目资料文件,无法支撑文档生成"),h.length>0&&0===a.summary.source.selectedFiles&&l.push("模板未绑定可用项目资料文件,请先绑定参与生成的资料"),i.length>0&&0===a.summary.source.selectedFiles&&l.push("绑定资料证据较弱,请确认资料已完成索引");let m=j.filter(a=>a.readinessRate<.5);m.length>0&&l.push(`章节级证据覆盖较弱:${m.slice(0,5).map(a=>`${a.title} ${Math.round(100*a.readinessRate)}%`).join("、")}`);let n=j.filter(a=>a.requiredFacts.length>0&&0===a.evidenceCount);n.length>0&&l.push(`部分章节缺少匹配证据:${n.slice(0,5).map(a=>a.title).join("、")}`);let o=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===k.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(0,d.o)(a.resolvedRoles),specCompletenessRate:o.filter(Boolean).length/o.length,missingRoles:h,weakRoles:i,chapterDiagnostics:j,blockingIssues:k,warnings:l}}function i(a,b={}){let c=a.chapterDiagnostics.filter(a=>a.readinessRate<.7||a.missingFacts.length>0).slice(0,8).map(a=>`${a.title}:${Math.round(100*a.readinessRate)}%,证据 ${a.evidenceCount} 条${a.missingFacts.length?`,缺失 ${a.missingFacts.slice(0,6).join("、")}`:""}`);return b.publicSafe?["## 生成事实使用边界",`资料覆盖程度:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足程度:${Math.round(100*a.roleSatisfactionRate)}%`,c.length?`章节证据风险:
175
+ ${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:()=>z,C1:()=>F,DX:()=>G,N6:()=>H,QJ:()=>y,Vh:()=>N,bV:()=>C,bj:()=>w,dU:()=>u,h0:()=>B,jG:()=>x,wR:()=>J,xm:()=>A,zY:()=>M});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753),j=c(6444),k=c(85441),l=c(81125),m=c(56942);function n(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function o(){return e.join(n(),"document-templates.json")}function p(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function q(){try{let a=o();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(p)}catch{return[]}}function r(a){d.writeFileSync(o(),JSON.stringify(a.map(p),null,2),"utf-8")}function s(){try{let a=JSON.parse(d.readFileSync(e.join(n(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}function t(a){let b=s();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")}}}function u(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=t(c.promptId);a&&b.push({...a,roleId:c.roleId})}return b}function v(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"}function w(a){var b;let c=I(a),d=(0,h.XB)("prompt"),e=M(a),f=[],g=[],i=[];if(c)for(let a of c.promptRoles)d.find(b=>b.id===a.roleId)||i.push(a.roleId),e.some(b=>b.roleId===a.roleId||b.roleId===K(a.roleId))||f.push({roleId:a.roleId,promptId:"",reason:"项目角色提示词未解析到可用提示词资源"});let j=[...e];if(/施工组织设计|施工方案|危大工程|安全文明施工/u.test(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`)&&!u(j).some(a=>"writer"===v(a.roleId,d.find(b=>b.id===a.roleId)?.executionType||K(a.roleId),a.name)))for(let a of(b=/施工组织设计总控|总控|施工组织/u,s().filter(a=>b.test(a.name||"")).map(a=>a.id)).slice(0,1))j.push({promptId:a,roleId:"runtime-construction-writer"}),g.push({roleId:"runtime-construction-writer",promptId:a,reason:"施工组织设计运行时必需写作总控提示词"});let k=L(j),l=[];for(let a of k){let b=t(a.promptId);if(!b)continue;let e=d.find(b=>b.id===a.roleId),f=e?.executionType||K(a.roleId),h=v(a.roleId,f,b.name),i=g.some(b=>b.roleId===a.roleId&&b.promptId===a.promptId)?"runtimeRequired":c?"projectRole":"template";l.push({...b,roleId:a.roleId,executionType:f,category:h,bindingSource:i})}return{bindings:k,prompts:l,writerPrompts:l.filter(a=>"writer"===a.category),chapterPrompts:l.filter(a=>"chapter"===a.category),extractionPrompts:l.filter(a=>"extraction"===a.category),formattingPrompts:l.filter(a=>"formatting"===a.category),referencePrompts:l.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(i)],fallbackBindings:f,runtimeRequiredBindings:g}}function x(){let a=(0,i.V)().templates,b=q().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function y(a){return x().find(b=>b.id===a)}function z(a){let b=p(a),c=q().filter(a=>a.id!==b.id);return c.push(b),r(c),b}async function A(a,b=(0,g.aY)()){let c,d=y(a),f=[];if(!d)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let i=(0,h.XB)("prompt"),n=(0,h.XB)("file"),o=H(d),p=I(d);o||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),o&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${o}`});let q=M(d),r=N(d);0===q.length&&f.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let s=e.resolve(b),t=(0,g.Yy)(s),v=function(a,b){if(0===a.length)return a;let c=new Set(b.map(a=>a.relativePath)),d=[],e=new Set;for(let f of a){let a=f.filePath.replace(/^\/+|\/+$/gu,"");for(let g of c.has(a)?[a]:b.filter(b=>b.relativePath.startsWith(`${a}/`)).map(a=>a.relativePath)){let a=`${f.roleId}
176
+ ${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===v.length&&f.push({level:"error",message:"模板绑定的知识库文件或文件夹不存在,请重新选择项目文件绑定。"});let w=new Map(t.map(a=>[a.relativePath,a])),x=v.map(a=>{let b=n.find(b=>b.id===a.roleId),c=w.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)}}),z=u(q),B=q.map(a=>{let b=i.find(b=>b.id===a.roleId),c=z.find(b=>b.id===a.promptId);return b||f.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||f.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&f.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});if(d){let a=(0,k.P)(s,{boundFilePaths:v.map(a=>a.filePath),boundFileRoles:J(v)}),b=(0,l.h)(d,a);for(let e of(c=(0,m.$)({template:d,spec:(0,j.x)(d).spec,summary:a,resolvedRoles:b})).blockingIssues)f.push({level:"error",message:`生成准备度不足:${e}`});for(let a of c.warnings)f.push({level:"warning",message:a})}return{templateId:a,projectRoleConfigId:o,fileDiagnostics:x,promptDiagnostics:B,readiness:c,issues:f}}function B(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");r(q().filter(b=>b.id!==a))}function C(a){let b=y(a);if(!b)throw Error("Document template not found");let c=p({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=q();return d.push(c),r(d),c}function D(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function E(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>D(b,a)))}function F(a,b){return E(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>D(a,b)))}function G(a,b){return E(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>D(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>D(a,b)))}function H(a){return a.projectRoleConfigId||void 0}function I(a){let b=H(a);return b?(0,h.Mu)(b):void 0}function J(a){let b=new Map,c=(0,h.XB)("file");for(let d of a){let a=c.find(a=>a.id===d.roleId),e=function(a=""){return"rule"===a?["requirement_document"]:"table"===a?["structured_data"]:"drawing"===a?["design_specification"]:"specification"===a?["technical_specification"]:["project_overview"]}(a?.processingType);b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...e])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function K(a){return/extract|extraction|抽取|清单|图纸|品牌/u.test(a)?"fact_extraction":/validation|校验|审查|审核/u.test(a)?"validation":/format|排版/u.test(a)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(a)?"chapter_generation":"reference"}function L(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function M(a){let b=I(a);if(b){let a=(0,h.XB)("prompt"),c=[];for(let d of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=a.find(a=>a.id===d.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[],f=e.length>0?e:function(a,b=""){let c=s(),d=`${a} ${b}`;return c.filter(a=>{let b=a.name||"";return/writer|施工组织|construction-organization/u.test(d)?/施工组织设计总控|总控|施工组织/u.test(b):/method|施工方法/u.test(d)?/施工方法|主要施工/u.test(b):/schedule|quality|进度|工期|质量/u.test(d)?/工期|进度|质量/u.test(b):/resource|人材机|资源/u.test(d)?/人材机|资源|材料|设备/u.test(b):/safety|文明|安全/u.test(d)?/安全|文明/u.test(b):/dangerous|危大/u.test(d)?/危大|危险性/u.test(b):!!/extract|extraction|抽取|清单|图纸|品牌/u.test(d)&&/抽取|识别|清单|图纸|品牌|总控/u.test(b)}).slice(0,2).map(a=>a.id)}(d.roleId,b?.name),g=b?.id||K(d.roleId);c.push(...f.map(a=>({promptId:a,roleId:g})))}if(c.length>0)return L(c)}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function N(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},56942:(a,b,c)=>{c.d(b,{$:()=>h,R:()=>i});var d=c(81125),e=c(92808);function f(a){return[...new Set(a.filter(Boolean))]}function g(a){let b=(0,e.t0)(a,e.hW);return b.length>0?b:["project_overview"]}function h(a){var b,c,e;let h=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),i=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),j=(b=a.template,c=a.spec,e=a.summary,b.chapters.map(a=>{let b=function(a,b){let c=b.chapterRules.find(b=>b.id===a.id||b.title===a.title),d=(c?.requiredFactIds||[]).map(a=>b.factFields.find(b=>b.id===a)?.name).filter(Boolean);return f([...a.requiredFacts||[],...d])}(a,c),d=f([...g([a.title,a.purpose,...a.queries||[],...a.sections||[]].join("\n")),...b.flatMap(a=>g(a))]),h=d.filter(a=>(e.materialInventory[a]||[]).length>0),i=h.reduce((a,b)=>a+(e.materialInventory[b]||[]).length,0),j=b.filter(a=>g(a).some(a=>h.includes(a))),k=b.filter(a=>!j.includes(a)),l=b.length>0?j.length/b.length:1,m=d.length>0?h.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:b,coveredFacts:j,missingFacts:k,requiredRoles:d,satisfiedRoles:h,evidenceCount:i,readinessRate:Math.min(1,.5*l+.3*m+.2*(i>0))}})),k=[],l=[];0===a.template.chapters.length&&l.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&l.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&k.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&l.push("材料指纹置信度较低,建议绑定明确的材料文件"),0===a.summary.source.selectedFiles&&k.push("未绑定可用项目资料文件,无法支撑文档生成"),h.length>0&&0===a.summary.source.selectedFiles&&l.push("模板未绑定可用项目资料文件,请先绑定参与生成的资料"),i.length>0&&0===a.summary.source.selectedFiles&&l.push("绑定资料证据较弱,请确认资料已完成索引");let m=j.filter(a=>a.readinessRate<.5);m.length>0&&l.push(`章节级证据覆盖较弱:${m.slice(0,5).map(a=>`${a.title} ${Math.round(100*a.readinessRate)}%`).join("、")}`);let n=j.filter(a=>a.requiredFacts.length>0&&0===a.evidenceCount);n.length>0&&l.push(`部分章节缺少匹配证据:${n.slice(0,5).map(a=>a.title).join("、")}`);let o=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===k.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(0,d.o)(a.resolvedRoles),specCompletenessRate:o.filter(Boolean).length/o.length,missingRoles:h,weakRoles:i,chapterDiagnostics:j,blockingIssues:k,warnings:l}}function i(a,b={}){let c=a.chapterDiagnostics.filter(a=>a.readinessRate<.7||a.missingFacts.length>0).slice(0,8).map(a=>`${a.title}:${Math.round(100*a.readinessRate)}%,证据 ${a.evidenceCount} 条${a.missingFacts.length?`,缺失 ${a.missingFacts.slice(0,6).join("、")}`:""}`);return b.publicSafe?["## 生成事实使用边界",`资料覆盖程度:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足程度:${Math.round(100*a.roleSatisfactionRate)}%`,c.length?`章节证据风险:
175
177
  ${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?`章节级证据风险:
176
178
  ${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:()=>l,Ui:()=>j,YZ:()=>m,_9:()=>r,bE:()=>n,bl:()=>i,cs:()=>k,tb:()=>o});var d=c(58965),e=c(52511);function f(a){return 0===a.trim().length}let g="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",h=RegExp(`<\\s*${g}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${g}\\s*>`,"giu");function i(a){return RegExp(`^\\s*<\\s*${g}(?:\\s[^>]*)?>`,"iu").test(a)}function j(a){return RegExp(`^\\s*<\\/\\s*${g}\\s*>`,"iu").test(a)}function k(a){for(let b of a){let a=function(a,b,c){let e=[];for(let g of function(a,b){h.lastIndex=0;let c=[...a.matchAll(h)].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=>(function(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," ")})(a)).filter(a=>!f(a))}(g))e.push({id:`explicit-${b}-${e.length+1}`,title:a,purpose:`根据显式大纲章节生成正式正文:${a}`,requiredFacts:[],sections:[],queries:[a]});return e.filter(a=>!f(a.title))}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}function l(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 m(a){return l(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function n(a){let b=a.trim(),c=m(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)||/(评标委员会|完全满足评审要求|全面梳理与响应|坚实的技术保障)/u.test(c))&&!p(c)}function o(a,b){let c=l(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 p(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function q(a,b){let c=new Set;return a.filter(a=>{let d=m(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||p(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function r(a,b,c){return!b||c?.preserveExplicitOutline?q([...a.chapters],{...c,template:a}):q([...a.chapters].map(a=>{let c=l(a.title),d=b.chapterRules.find(b=>b.id===a.id||l(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}
177
179
  `;return b}(a);return{ownerNames:p(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:p(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:p(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:p(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(s),z=g.filter(a=>t[a].length>0),A=g.filter(a=>0===t[a].length);return{projectId:v.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:v,generatedAt:Date.now(),fingerprint:x.fingerprint,contaminationCandidates:x.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:s.length,selectionReason:m.reason,ambiguous:m.ambiguous},facts:{projectName:v,documentNo:w,scopeDescriptions:t.scope_description.map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(t.scope_description.concat(t.design_specification,t.structured_data).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:t.schedule_quality_safety.length?"已识别周期、质量、安全或合规相关资料,生成时应以需求文件、变更说明和技术要求为准。":void 0,qualityRequirement:t.schedule_quality_safety.length?"已识别质量或评价相关资料。":void 0,safetyRequirement:t.schedule_quality_safety.length?"已识别安全或合规相关资料。":void 0,materialBrandRequirement:t.resource_recommendation.length?"已识别资源、材料、设备或品牌相关资料。":void 0,ownerNames:y.ownerNames,locationNames:y.locationNames,scheduleValues:y.scheduleValues,qualityTargets:y.qualityTargets},materialInventory:t,extractedSections:{projectOverview:`绑定材料组:${v}${w?`,文档/任务编号:${w}`:""}。`,scopeSummary:`范围资料:${o(t.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${o(t.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${o(t.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${o(t.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${o(t.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:g,satisfiedRoles:z,missingRoles:A,materialCompletenessRate:g.length?z.length/g.length:1}}}function t(a){return a.replace(/OCR|识别错误|乱码/giu,"资料文字不清").replace(/知识库|提示词|后台|绑定片段|兜底/gu,"项目资料").replace(/PDF|DWG|Excel|XLSX?|DOCX?/giu,"资料文件")}function u(a,b={}){return b.publicSafe?["## 项目资料事实边界",t(a.extractedSections.projectOverview),`明确事实:责任主体 ${a.facts.ownerNames?.join("、")||"资料未明确"};地点 ${a.facts.locationNames?.join("、")||"资料未明确"};周期 ${a.facts.scheduleValues?.join("、")||"资料未明确"};质量 ${a.facts.qualityTargets?.join("、")||"资料未明确"}。`,t(a.extractedSections.scopeSummary),t(a.extractedSections.structuredDataSummary),t(a.extractedSections.designSummary),t(a.extractedSections.scheduleQualitySafetySummary),t(a.extractedSections.constraintsAndRisks),"仅使用资料中明确、可信的事实;资料未明确的工程实体事实不得推导,允许推导的计划配置类数据须明确标注为计划配置值。"].filter(Boolean).join("\n"):["## 后台绑定材料摘要",a.extractedSections.projectOverview,`材料指纹:对象名候选 ${a.fingerprint.projectNames.join("、")||"无"};编号 ${a.fingerprint.documentNos.join("、")||"无"};资料组 ${a.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*a.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${a.facts.ownerNames?.join("、")||"无"};地点 ${a.facts.locationNames?.join("、")||"无"};周期 ${a.facts.scheduleValues?.join("、")||"无"};质量 ${a.facts.qualityTargets?.join("、")||"无"}。`,a.extractedSections.scopeSummary,a.extractedSections.structuredDataSummary,a.extractedSections.designSummary,a.extractedSections.scheduleQualitySafetySummary,a.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*a.coverage.materialCompletenessRate)}%`].join("\n")}},91977:(a,b,c)=>{c.d(b,{I2:()=>g,Lk:()=>e,Uy:()=>f});var d=c(70208);function e(a,b){let c=`${a.filePath}