@customize-agent/server 4.1.10 → 4.1.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/1924.js +12 -2
- package/.next/server/chunks/1936.js +3 -3
- package/.next/server/chunks/8661.js +1 -1
- package/.next/server/chunks/9301.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_error.js +1 -1
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +1 -61
- package/package.json +1 -1
- /package/.next/static/{YAJqD56NGIr83V0viTda7 → p3dpkNj5dLxoQazF3vBdL}/_buildManifest.js +0 -0
- /package/.next/static/{YAJqD56NGIr83V0viTda7 → p3dpkNj5dLxoQazF3vBdL}/_ssgManifest.js +0 -0
package/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
p3dpkNj5dLxoQazF3vBdL
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"ampDevFiles": [],
|
|
7
7
|
"lowPriorityFiles": [
|
|
8
|
-
"static/
|
|
9
|
-
"static/
|
|
8
|
+
"static/p3dpkNj5dLxoQazF3vBdL/_buildManifest.js",
|
|
9
|
+
"static/p3dpkNj5dLxoQazF3vBdL/_ssgManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": [],
|
|
12
12
|
"rootMainFilesTree": {},
|
|
@@ -3,9 +3,9 @@
|
|
|
3
3
|
"routes": {},
|
|
4
4
|
"dynamicRoutes": {},
|
|
5
5
|
"preview": {
|
|
6
|
-
"previewModeId": "
|
|
7
|
-
"previewModeSigningKey": "
|
|
8
|
-
"previewModeEncryptionKey": "
|
|
6
|
+
"previewModeId": "04bb361c91d02e3bcb321bfc02c311bd",
|
|
7
|
+
"previewModeSigningKey": "ee5c6400956967b410790fcb3f2db6dd84e13588b3025b823af82d5ff692a65b",
|
|
8
|
+
"previewModeEncryptionKey": "e28d533dab243eb2adf1e1bbc93eb31ed0332be90d13ba1d23ce6936795c5cf5"
|
|
9
9
|
},
|
|
10
10
|
"notFoundRoutes": []
|
|
11
11
|
}
|
|
@@ -196,11 +196,21 @@ ${e.join("\n")}`:"",h.length?`项目基础事实卡片(资料已明确,项
|
|
|
196
196
|
${h.map(a=>`- ${a.key||a.fieldName}:${G((0,aG.lG)(a.value)).slice(0,220)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`).join("\n")}
|
|
197
197
|
项目基本信息表必须使用固定表头:| 信息项 | 内容 |,不得使用“序号|项目名称|内容参数”表头,不得输出后台溯源列。`:"",a.factNeedsPrompt||"",g.length?`全局资料事实索引匹配到的本章可写事实:
|
|
198
198
|
${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:Y,roleFacts:x,evidence:P,missingFacts:R,indexedFacts:[...al,...ak],resolvedFactNeeds:ab,factNeedsPrompt:function(a){let b=a.map(a=>{let b=a.facts.slice(0,5).map(b=>`${b.key||b.fieldName||a.need.label}=${bC(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${bC(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?`事实需求覆盖卡片:
|
|
199
|
-
${b.join("\n")}`:""}(ab)}),ao={total:ab.length,satisfied:ab.filter(a=>"satisfied"===a.status).length,missing:ab.filter(a=>"missing"===a.status).length,lowConfidence:ab.filter(a=>"low_confidence"===a.status).length};for(let a of ac)aA.push(`${c.title}:事实需求未确认 ${a}`);let as=Y?.chapterRules.find(a=>a.id===c.id||a.title===c.title),ay=bE.chapterTargets.get(c.id)||1200,az=Math.max(3500,Number(process.env.DOCUMENT_LONGFORM_INITIAL_CHAPTER_CAP||8e3)),aB=bE.longformStrict?Math.min(ay,az):ay,aC=Math.ceil(aB*(bE.maxChars?1.1:1.18)),aF=bE.targetChars?Math.min(1800,Math.max(600,Math.floor(.5*aB))):1200,aH=Math.max(Math.min(d?.minWords||0,aB),Math.min(as?.minWords||0,aB),Math.min(Y?.dynamicChapterRule.minWordsPerChapter||0,aB),Math.floor(.78*aB),aF),aJ=cK(aH,aB),aK=Math.min(aB,6e3),aL=Math.max(900,Math.min(aB,Math.ceil(.55*aB),aK)),aM=Math.max(450,Math.min(aH,Math.floor(.72*aL))),aN=Math.max(aL+300,Math.min(aC,Math.ceil(1.25*aL))),aO=cK(aM,aL),aP=Math.min(cL(aL),18e4),aQ=Math.max(900,Math.min(aL,3600)),aT=Math.max(450,Math.min(aM,Math.floor(.72*aQ))),aU=Math.max(aQ+300,Math.min(aC,Math.ceil(1.2*aQ))),aV=cK(aT,aQ),aX=Math.min(cL(aQ),15e4),a$=c.sections?.filter(Boolean).length||0,a0=/[、,,;;]/u.test(c.title),a2=Math.max(4,Number(process.env.DOCUMENT_SECTION_FIRST_MAX_SECTIONS||8)),a3=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??0)&&a$>=2&&a$<=a2&&(bE.longformStrict||!a0);N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:a3?`${(0,Q.GQ)(c.title)} 正在按小节并发成稿`:`${(0,Q.GQ)(c.title)} 正在整章一次成稿`,details:a3?[...$,`有效证据:${P.length} 条`,`事实需求:${ao.satisfied}/${ao.total} 已满足,缺失 ${ao.missing},低置信 ${ao.lowConfidence}`,`首轮质量目标:约 ${aB} 字${ay!==aB?`,总预算分配约 ${ay} 字`:""},上限约 ${aC} 字`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节自然并发生成,章节聚合后再审查修复"]:[...$,`有效证据:${P.length} 条`,`事实需求:${ao.satisfied}/${ao.total} 已满足,缺失 ${ao.missing},低置信 ${ao.lowConfidence}`,`目标字数:约 ${aB} 字,上限约 ${aC} 字`,`规划小节:${a$} 个${a$>a2?",超过小节并发上限,改用整章稳定成稿":""}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:h+1,total:bh.length,label:a3?"小节并发":"整章成稿"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F();let a4=a3?Math.min(cL(aB)+3e4,33e4):Math.min(cL(aB),18e4),a6=a3?await I(()=>bN(bG,`chapter-section-draft:${c.id}`,()=>bi(b=>cJ({template:z,chapter:c,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:aB,maxWords:aC,forbidDrawingImages:U,factCoverageContext:am,projectRoot:v,modelName:a_,fileRolesHash:a5,allowPartialResult:!1,sectionEvidenceProvider:a=>du({manager:A,projectRoot:v,chapter:c,sectionTitle:a,scopedFilePaths:t,fileRoleByPath:ap,fileProcessingByPath:aq,signal:b}),diagnostics:bG,signal:b}),a4,a.signal))):await I(()=>bN(bG,`chapter-draft:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aH,targetWords:aB,maxWords:aC,maxTokens:aJ,factCoverageContext:am,signal:b}),cL(aB),a.signal)));if(!a6&&a3)throw N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"failed",message:`${(0,Q.GQ)(c.title)} 小节并发未在限定时间内返回,已跳过整章重试并标记为章节阻断`,details:["小节优先模式不再执行整章重试,避免单章长时间空等;请优先重试失败小节或降低目标篇幅。"],progress:{current:h+1,total:bh.length,label:"小节超时"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),Error(`${c.title} 小节并发超时,已跳过整章重试`);if(a6||(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 整章成稿未完整返回,正在执行整章重试生成`,details:[`目标字数:约 ${aB} 字`,`有效证据:${P.length} 条`],progress:{current:h+1,total:bh.length,label:"整章重试"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),a6=await I(()=>bN(bG,`chapter-draft-fallback:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aM,targetWords:aL,maxWords:aN,maxTokens:aO,factCoverageContext:am,signal:b}),aP,a.signal)))),(0,aG.Te)(a.signal),a6||(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在压缩上下文后重试生成`,details:["已压缩证据与上下文后重新请求模型生成",`目标字数:约 ${aB} 字`],progress:{current:h+1,total:bh.length,label:"紧凑重试"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),a6=await I(()=>bN(bG,`chapter-draft-compact-fallback:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aT,targetWords:aQ,maxWords:aU,maxTokens:aV,factCoverageContext:am,signal:b}),aX,a.signal)))),(0,aG.Te)(a.signal),!a6)throw Error(`${c.title} 大模型未返回有效章节正文`);let a7=a6,ba=aj(a7),bb=ba.length>=Math.min(3,c.sections?.length||3)?{...c,sections:ba}:c,bd=c$(a7,bb),bg=0,bj=bd.map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|");for(;bd.length>0;){bg+=1,N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 存在 ${bd.length} 个小节缺口,正在按目标缺口强制补写`,details:bd.map(a=>a.message),progress:{current:h+1,total:bh.length,label:`小节补写第 ${bg} 轮`}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let b=a7,d=await I(()=>bN(bG,`chapter-section-repair:${c.id}:${bg}`,()=>cQ({template:z,chapter:c,content:b,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:aB,maxWords:aC,forbidDrawingImages:U,factCoverageContext:am,forcedSections:bd,signal:a.signal})));d?.trim()&&(a7=d);let e=(bd=c$(a7,bb)).map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|"),f=e!==bj;if(0===bd.length||!f)break;bj=e}bd.length>0&&(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"failed",message:`${(0,Q.GQ)(c.title)} 小节补齐仍未完全达标,已标记为阻断问题`,details:bd.map(a=>a.message),progress:{current:h+1,total:bh.length,label:"小节未达标"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C));let bk=bY({chapter:c,content:a7,missingFacts:R,targetWords:aB}),bl=(0,aE.Ff)(bk);bG.quality.blockingCount+=bl.blocking,bG.quality.importantCount+=bl.important,bG.quality.minorCount+=bl.minor;let bm=bQ(bk);if(bm.length>0){let b=a7;N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在根据质量问题修复章节:${bm.length} 个阻断问题`,details:bm,progress:{current:h+1,total:bh.length,label:"章节修复"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let d=await I(()=>bN(bG,`chapter-repair:${c.id}`,()=>bZ({template:z,chapter:{id:c.id,title:c.title,content:b,evidence:P,missingFacts:[...R,...ac.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:bm,promptTexts:X,requirement:a.requirement,forbidDrawingImages:U,diagnostics:bG,signal:a.signal})));a7=d.content,d.appliedCount>0&&(bG.quality.repairedCount+=1),(0,aG.Te)(a.signal)}if(!a7.trim())throw Error(`${(0,Q.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bo=a7,bp=0;if((0,aD.V7)(bo)<Math.floor(.82*aB)||bQ(bY({chapter:c,content:bo,missingFacts:R,targetWords:aB})).length>0){N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aD.V7)(bo)} 字 / 目标 ${Math.floor(.95*aB)} 字`,`章节并发:${b5}`],progress:{current:h+1,total:bh.length,label:"章节扩写"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let b=await I(()=>bN(bG,`chapter-expand:${c.id}`,()=>cR({template:z,chapter:c,content:a7,evidence:P,promptTexts:X,requirement:a.requirement,roleContext:V,targetChars:Math.floor(.95*aB),maxChars:aC,forbidDrawingImages:U,maxTokens:Math.min(aJ,aO),signal:a.signal})));bo=b.content,bp=b.rounds}bo=dh(bo,c);let bq=aj(bo),br=(0,aE.yw)(bo,[{title:c.title,content:bo,sections:bq}]).filter(a=>"empty"===a.reason||"table_only"===a.reason);!function(a,b){try{let c=["chapter-generation-failure.env","document-generation-timeout.env"].map(b=>e.join(a,".dbg",b)).find(a=>f.existsSync(a));if(!c)return;let d=Object.fromEntries(f.readFileSync(c,"utf8").split(/\r?\n/u).map(a=>a.split("=")).filter(a=>a.length>=2).map(([a,...b])=>[a,b.join("=")])),g=d.DEBUG_SERVER_URL;if(!g)return;fetch(g,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:d.DEBUG_SESSION_ID||"chapter-generation-failure",runId:"pre",ts:Date.now(),...b})}).catch(()=>void 0)}catch{}}(v,{event:"section-repair-check",hypothesisId:"H1",chapterId:c.id,chapterTitle:c.title,gapCount:br.length,gaps:br.slice(0,10).map(a=>({title:a.sectionTitle,reason:a.reason,message:a.message})),contentChars:(0,aD.V7)(bo),targetWords:aB}),br.length>0&&(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在小节级定向补写 ${br.length} 个未达标小节`,details:br.slice(0,8).map(a=>a.message),progress:{current:h+1,total:bh.length,label:"小节补写"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),bo=await I(()=>bN(bG,`section-repair:${c.id}`,()=>cQ({template:z,chapter:c,content:bo,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:Math.max(1200,Math.floor(.35*aB)),maxWords:Math.min(aC,Math.max(2400,Math.floor(.55*aB))),forbidDrawingImages:U,factCoverageContext:am,forcedSections:br,signal:a.signal}))),bo=dh(bo,c),bq=aj(bo),br=(0,aE.yw)(bo,[{title:c.title,content:bo,sections:bq}]).filter(a=>"empty"===a.reason||"table_only"===a.reason),0===br.length&&(bG.quality.repairedCount+=1));let bs=cG({chapter:c,content:bo,evidence:P}),bt=(0,aD.V7)(bo),bu=aj(bo),bv=bu.length>0?bu:c.sections||[],bD=(0,aE.qK)(bo,[{title:c.title,content:bo,sections:bv}]).map(a=>a.message),bF=bs.slice(0,6).map(a=>`小节事实密度需优化:${a}`),bH=[...bY({chapter:{...c,sections:bv},content:bo,missingFacts:R,targetWords:aB}),...bD,...bF],bI=function(a,b,c=[]){return a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a))?"failed":c.length>0?"fallback":"success"}(bt,0,bH);g=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:bI,message:bL(`${(0,Q.GQ)(c.title)} 已由大模型首轮成稿${bp>0?`并定向扩写 ${bp} 轮`:""}:当前 ${bt} 字 / 目标 ${Math.floor(.95*aB)} 字${"success"!==bI?`;风险:${bH.join("、")||"篇幅未达标"}`:""}`,i),details:[`达标率:${Math.round(bt/Math.max(1,Math.floor(.95*aB))*100)}%`,...$,`二级小节:${bv.length} 个`,`扩写轮次:${bp}`],progress:{current:h+1,total:bh.length,label:"success"===bI?"章节达标":"章节风险"}},{subtitle:(0,Q.GQ)(c.title),order:h}),aR[h]=g;let bM={id:c.id,title:c.title,content:bo,evidence:P,missingFacts:R,sections:bv};aI[h]=bM,C=aI.filter(a=>!!a),F(C);let bO=bY({chapter:c,content:bo,missingFacts:R,targetWords:aB}),bP=(0,aE.Ff)(bO);bG.quality.blockingCount+=bP.blocking,bG.quality.importantCount+=bP.important,bG.quality.minorCount+=bP.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aF.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aR[h]=bJ({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,Q.GQ)(c.title)} 生成失败`},{subtitle:(0,Q.GQ)(c.title),order:h})}g&&(N[j]=g),F(C)}))}C=aI.filter(a=>!!a),aH.push(...aR.filter(a=>!!a));let b6=C.flatMap(a=>a.evidence||[]);if(b6.length>0){av.push(...b6);let a=J(av,{maxChars:Math.max(5e4,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...a)}if(0===C.length)throw Error(`章节生成未完成:${aF.join(";")||"没有生成任何有效章节"}`);if(U&&C.length<bh.length)throw Error(`OUTLINE 指定 ${bh.length} 章,实际只生成 ${C.length} 章:${aF.join(";")||"部分章节未生成"}`);(0,aG.Te)(a.signal),bK(N,bJ({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),F(C);let b7={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{b7=await ce(v,av,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bK(N,b7.stage),F(C),(0,aG.Te)(a.signal),b7.notes))av.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let b8=J(av,{maxItems:Math.max(48,10*bh.length),maxChars:Math.max(52e3,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...b8);let b9=function(a,b,c){let d={};for(let e of(0,E.Uy)(a,c)){let a=b.find(a=>(0,E.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(z,av,Y);for(let a of aZ)for(let b of a.facts)b9[b.key]=`${(0,aG.lG)(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let ca=bl(av,z,Y),cb=br(av),cc=bs(av,Z),cd=aZ.flatMap(a=>a.facts.map(a=>({key:a.key,value:(0,aG.lG)(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cg={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,E.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&(0,aG.lG)(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=(0,aG.lG)(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}([...cd,...ca,...cb,...cc],z,Y)){let b=J(av,{maxItems:48,maxChars:45e3,preservePinned:!0});try{cg=await bm(b,ak,z,Y,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}(0,aG.Te)(a.signal);let ch=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}([...cd,...ca,...cb,...cc,...cg.facts],av);for(let a of(bK(N,b7.stage),cg.stages))bK(N,a);F();let ci=bk(av),cj=av.filter(a=>"pinned-evidence"===a.source).length,cl=av.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cv=bJ({type:"reference",roleId:"quality-enhancement",status:av.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${av.length} 条,人工确认/固定证据 ${cj} 条,自动检索证据 ${cl} 条`},{subtitle:"证据与上下文增强"});for(let a of(N.push(cv),F(),ch))b9[a.key]=`${(0,aG.lG)(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cw=new Map;for(let a of av)cw.set(a.filePath,(cw.get(a.filePath)??0)+1);let cx=new Map;for(let a of av)cx.set(a.source||"unknown",(cx.get(a.source||"unknown")??0)+1);let cy=[...cw.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cz=bD(ch,ci,aA,Y,Z),cA=C.map(a=>{let b=Y.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>Y.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)}}),cB=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}}(C,ch,z);cB.warnings=[...cB.warnings,..._.warnings],cB.errors=[...cB.errors,..._.blockingIssues];let cC=aZ.flatMap(a=>a.warnings.map(a=>({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(a)?"info":"warning",message:a,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"}))).filter(a=>!de(a)),cD=aM(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=>/资料未提供|系统暂未从知识库确认/u.test(a.content))&&d.push({level:"warning",message:"存在系统暂未从知识库确认的章节内容",suggestion:"请检查项目角色配置、文件绑定顺序和事实抽取落位结果。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(cB,cz,C),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}(cA),cC),cE=bW(aZ,z),cF=Date.now(),cH=(0,aD.V7)(C.map(a=>a.content).join("\n\n"));bK(N,bJ({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cH} 字`,details:[`章节数:${C.length}`,`目标:${bE.targetChars||bE.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),F(C);let cI=bF.enableDocumentBudgetExpansion?await I(()=>cS({template:z,chapters:C,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal,onRoundProgress:(a,b)=>{C.splice(0,C.length,...a),bK(N,bJ({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:第 ${b.round}/${b.maxRounds} 轮,当前 ${b.totalChars} 字,新增 ${b.addedChars} 字`,details:[`章节数:${a.length}`,`目标:${bE.targetChars||bE.targetPages||"按章节深度"}`],progress:{current:Math.min(b.round+1,b.maxRounds),total:b.maxRounds+1,label:"预算校准"}},{subtitle:"文档预算"})),F(C)}})):C;C.splice(0,C.length,...cI);let cM=C.map(a=>a.content).join("\n\n"),cN=dn(C,ch,cM);cN.patchedCount>0&&(C.splice(0,C.length,...cN.chapters),cD=[...cD,{level:"info",message:`已自动补写未落位事实 ${cN.patchedCount} 项`,suggestion:"补写仅使用本项目资料明确事实,未补写商务敏感信息或系统暂未确认内容。"}]);let cO=(0,aD.fW)(bE,C.map(a=>a.content).join("\n\n")),cP=[bE.targetChars?`目标 ${bE.targetChars} 字${bE.minChars||bE.maxChars?`(区间 ${bE.minChars||0}-${bE.maxChars||"∞"} 字)`:""}`:void 0,bE.targetPages?`目标 ${bE.targetPages} 页${bE.minPages||bE.maxPages?`(区间 ${bE.minPages||0}-${bE.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bK(N,bJ({type:"validation",roleId:"document-budget",status:bE.maxChars&&cO.currentChars>bE.maxChars||bE.minChars&&cO.currentChars<bE.minChars?"fallback":"success",message:bL(`文档预算:当前 ${cO.currentChars} 字,新增 ${Math.max(0,cO.currentChars-cH)} 字,预计 ${cO.estimatedPages} 页;${cP}`,cF)},{subtitle:"文档预算"})),F(C);let cY=aH.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,c_=Math.max(0,bh.length-C.length),c1=[...cY>0?[{level:"info",message:`章节生成存在补充完善:${cY} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}]:[],...c_>0?[{level:"error",message:`部分章节生成失败:${c_} 章`,suggestion:aF.join(";")||"请检查模型调用、知识库检索和事实抽取配置后重新生成失败章节。"}]:[]],c2=C.flatMap(a=>{let b=bh.find(b=>b.id===a.id);if(!b)return[];let c=cG({chapter:b,content:a.content,evidence:a.evidence||[]});return c.length>0?[{level:"warning",message:`${(0,Q.GQ)(a.title)} 小节知识库事实或量化参数落位可继续优化:${c.slice(0,5).join(";")}`,suggestion:"建议扩大本地知识库检索并定向补写对应小节,优先使用清单、图纸、招标要求中的原始事实、规格、数量、标准和工期参数。"}]:[]}),c3=(cD=aM(cD,c1,c2)).filter(a=>"error"===a.level&&(0,aE.Nz)(a)).length,c4=[...N];bK(c4,bJ({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${av.length} 条,来源文件 ${cy.length} 份,结构化事实 ${ch.length} 条`,details:[`证据类型:${[...cx.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${as.usableChunkCount} 条,待索引 ${as.pendingJobs} 个,向量 ${as.vectorStatus?.status||"unknown"}`,cN.patchedCount>0?`自动补写事实:${cN.patchedCount}/${cN.missingCount}`:`事实落位补写:0/${cN.missingCount}`]},{subtitle:"资料使用报告"})),bK(c4,bJ({type:"reference",roleId:"web-research-report",status:ax.enabled?"success":"skipped",message:ax.enabled?`联网增强:检索章节 ${new Set(ax.chapters).size} 个,查询 ${ax.queries.length} 个,使用公开资料 ${ax.evidenceCount} 条`:"联网增强未开启",details:ax.enabled?[`检索主题:${[...new Set(ax.queries)].join(";")||"无"}`,`过滤结果:${ax.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),bK(c4,bJ({type:"validation",roleId:"document-workflow",status:c3>0?"failed":"success",message:`阻断 ${c3},错误 ${cB.errors.length},警告 ${cB.warnings.length}`},{subtitle:"最终规范校验"})),bK(c4,bJ({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bK(c4,bJ({type:"export_ready",roleId:"document-workflow",status:c3>0?"failed":"success",message:c3>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let c5={templateId:z.id,templateName:z.name,title:z.outputTitle,requirement:a.requirement||"",projectRoot:v,projectId:w,exportSettings:z.exportSettings,generationSettings:z.generationSettings,facts:b9,structuredFacts:ch,factsModel:cz,chapters:C,sources:cy,missingItems:[...new Set(aA)],validation:cB,validationIssues:cD,executionStages:c4,exportGate:{passed:0===c3,blockingIssues:cD.filter(a=>"error"===a.level&&(0,aE.Nz)(a)),checklist:[]},assets:[],partialChapters:C.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:C,generatedAt:Date.now()},c6=aC(c5,{forbidDrawingImages:cE,promptRules:ag});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b=aB(c6,C,{forbidDrawingImages:cE,promptRules:ag}).chapters.map(a=>{let b=bh.find(b=>b.id===a.id)||a;return{...a,content:dh(a.content,b)}}),c="",d=(a,b)=>aM(cD.filter(a=>!de(a)&&("error"!==a.level||!(0,aE.Nz)(a))),x({markdown:a,spec:Y,summary:W}),B({markdown:a,facts:ch,summary:W,profile:Z}),y(a,W),dc(a,ch),a2({markdown:a,chapters:b,factsModel:cz,template:z,promptBindings:P,promptDocumentRules:ag}),(0,aD.PE)(z.generationSettings||z.exportSettings,a).filter(a=>!(bE.minPages&&/低于目标页数/u.test(a.message))),(0,aD.ty)(bE,a)),e=[],f=()=>{e=aN(d(c=db(c0(dd(aB(aC({...c5,chapters:b},{forbidDrawingImages:cE,promptRules:ag}),b,{forbidDrawingImages:cE,promptRules:ag}).markdown),ch),ch),b)),e=aN(d(c=dg(c,e),b)),e=aN(d(c=function(a,b){if(!b)return a;let c=b-(0,aD.V7)(a);return c<=0||c>1200?a:`${a.trim()}
|
|
199
|
+
${b.join("\n")}`:""}(ab)}),ao={total:ab.length,satisfied:ab.filter(a=>"satisfied"===a.status).length,missing:ab.filter(a=>"missing"===a.status).length,lowConfidence:ab.filter(a=>"low_confidence"===a.status).length};for(let a of ac)aA.push(`${c.title}:事实需求未确认 ${a}`);let as=Y?.chapterRules.find(a=>a.id===c.id||a.title===c.title),ay=bE.chapterTargets.get(c.id)||1200,az=Math.max(3500,Number(process.env.DOCUMENT_LONGFORM_INITIAL_CHAPTER_CAP||8e3)),aB=bE.longformStrict?Math.min(ay,az):ay,aC=Math.ceil(aB*(bE.maxChars?1.1:1.18)),aF=bE.targetChars?Math.min(1800,Math.max(600,Math.floor(.5*aB))):1200,aH=Math.max(Math.min(d?.minWords||0,aB),Math.min(as?.minWords||0,aB),Math.min(Y?.dynamicChapterRule.minWordsPerChapter||0,aB),Math.floor(.78*aB),aF),aJ=cK(aH,aB),aK=Math.min(aB,6e3),aL=Math.max(900,Math.min(aB,Math.ceil(.55*aB),aK)),aM=Math.max(450,Math.min(aH,Math.floor(.72*aL))),aN=Math.max(aL+300,Math.min(aC,Math.ceil(1.25*aL))),aO=cK(aM,aL),aP=Math.min(cL(aL),18e4),aQ=Math.max(900,Math.min(aL,3600)),aT=Math.max(450,Math.min(aM,Math.floor(.72*aQ))),aU=Math.max(aQ+300,Math.min(aC,Math.ceil(1.2*aQ))),aV=cK(aT,aQ),aX=Math.min(cL(aQ),15e4),a$=c.sections?.filter(Boolean).length||0,a0=/[、,,;;]/u.test(c.title),a2=Math.max(4,Number(process.env.DOCUMENT_SECTION_FIRST_MAX_SECTIONS||8)),a3=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??0)&&a$>=2&&a$<=a2&&(bE.longformStrict||!a0);N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:a3?`${(0,Q.GQ)(c.title)} 正在按小节并发成稿`:`${(0,Q.GQ)(c.title)} 正在整章一次成稿`,details:a3?[...$,`有效证据:${P.length} 条`,`事实需求:${ao.satisfied}/${ao.total} 已满足,缺失 ${ao.missing},低置信 ${ao.lowConfidence}`,`首轮质量目标:约 ${aB} 字${ay!==aB?`,总预算分配约 ${ay} 字`:""},上限约 ${aC} 字`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节自然并发生成,章节聚合后再审查修复"]:[...$,`有效证据:${P.length} 条`,`事实需求:${ao.satisfied}/${ao.total} 已满足,缺失 ${ao.missing},低置信 ${ao.lowConfidence}`,`目标字数:约 ${aB} 字,上限约 ${aC} 字`,`规划小节:${a$} 个${a$>a2?",超过小节并发上限,改用整章稳定成稿":""}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:h+1,total:bh.length,label:a3?"小节并发":"整章成稿"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F();let a4=a3?Math.min(cL(aB)+3e4,33e4):Math.min(cL(aB),18e4),a6=a3?await I(()=>bN(bG,`chapter-section-draft:${c.id}`,()=>bi(b=>cJ({template:z,chapter:c,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:aB,maxWords:aC,forbidDrawingImages:U,factCoverageContext:am,projectRoot:v,modelName:a_,fileRolesHash:a5,allowPartialResult:!1,sectionEvidenceProvider:a=>du({manager:A,projectRoot:v,chapter:c,sectionTitle:a,scopedFilePaths:t,fileRoleByPath:ap,fileProcessingByPath:aq,signal:b}),diagnostics:bG,signal:b}),a4,a.signal))):await I(()=>bN(bG,`chapter-draft:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aH,targetWords:aB,maxWords:aC,maxTokens:aJ,factCoverageContext:am,signal:b}),cL(aB),a.signal)));if(!a6&&a3)throw N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"failed",message:`${(0,Q.GQ)(c.title)} 小节并发未在限定时间内返回,已跳过整章重试并标记为章节阻断`,details:["小节优先模式不再执行整章重试,避免单章长时间空等;请优先重试失败小节或降低目标篇幅。"],progress:{current:h+1,total:bh.length,label:"小节超时"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),Error(`${c.title} 小节并发超时,已跳过整章重试`);if(a6||(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 整章成稿未完整返回,正在执行整章重试生成`,details:[`目标字数:约 ${aB} 字`,`有效证据:${P.length} 条`],progress:{current:h+1,total:bh.length,label:"整章重试"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),a6=await I(()=>bN(bG,`chapter-draft-fallback:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aM,targetWords:aL,maxWords:aN,maxTokens:aO,factCoverageContext:am,signal:b}),aP,a.signal)))),(0,aG.Te)(a.signal),a6||(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在压缩上下文后重试生成`,details:["已压缩证据与上下文后重新请求模型生成",`目标字数:约 ${aB} 字`],progress:{current:h+1,total:bh.length,label:"紧凑重试"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),a6=await I(()=>bN(bG,`chapter-draft-compact-fallback:${c.id}`,()=>bi(b=>cf(z,c,P,R,X,bn,a.requirement,V,{forbidDrawingImages:U,minWords:aT,targetWords:aQ,maxWords:aU,maxTokens:aV,factCoverageContext:am,signal:b}),aX,a.signal)))),(0,aG.Te)(a.signal),!a6)throw Error(`${c.title} 大模型未返回有效章节正文`);let a7=a6,ba=aj(a7),bb=ba.length>=Math.min(3,c.sections?.length||3)?{...c,sections:ba}:c,bd=c$(a7,bb),bg=0,bj=bd.map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|");for(;bd.length>0;){bg+=1,N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 存在 ${bd.length} 个小节缺口,正在按目标缺口强制补写`,details:bd.map(a=>a.message),progress:{current:h+1,total:bh.length,label:`小节补写第 ${bg} 轮`}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let b=a7,d=await I(()=>bN(bG,`chapter-section-repair:${c.id}:${bg}`,()=>cQ({template:z,chapter:c,content:b,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:aB,maxWords:aC,forbidDrawingImages:U,factCoverageContext:am,forcedSections:bd,signal:a.signal})));d?.trim()&&(a7=d);let e=(bd=c$(a7,bb)).map(a=>`${a.sectionTitle}:${a.reason}:${a.bodyLength}`).join("|"),f=e!==bj;if(0===bd.length||!f)break;bj=e}bd.length>0&&(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"failed",message:`${(0,Q.GQ)(c.title)} 小节补齐仍未完全达标,已标记为阻断问题`,details:bd.map(a=>a.message),progress:{current:h+1,total:bh.length,label:"小节未达标"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C));let bk=bY({chapter:c,content:a7,missingFacts:R,targetWords:aB}),bl=(0,aE.Ff)(bk);bG.quality.blockingCount+=bl.blocking,bG.quality.importantCount+=bl.important,bG.quality.minorCount+=bl.minor;let bm=bQ(bk);if(bm.length>0){let b=a7;N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在根据质量问题修复章节:${bm.length} 个阻断问题`,details:bm,progress:{current:h+1,total:bh.length,label:"章节修复"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let d=await I(()=>bN(bG,`chapter-repair:${c.id}`,()=>bZ({template:z,chapter:{id:c.id,title:c.title,content:b,evidence:P,missingFacts:[...R,...ac.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:bm,promptTexts:X,requirement:a.requirement,forbidDrawingImages:U,diagnostics:bG,signal:a.signal})));a7=d.content,d.appliedCount>0&&(bG.quality.repairedCount+=1),(0,aG.Te)(a.signal)}if(!a7.trim())throw Error(`${(0,Q.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let bo=a7,bp=0;if((0,aD.V7)(bo)<Math.floor(.82*aB)||bQ(bY({chapter:c,content:bo,missingFacts:R,targetWords:aB})).length>0){N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aD.V7)(bo)} 字 / 目标 ${Math.floor(.95*aB)} 字`,`章节并发:${b5}`],progress:{current:h+1,total:bh.length,label:"章节扩写"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C);let b=await I(()=>bN(bG,`chapter-expand:${c.id}`,()=>cR({template:z,chapter:c,content:a7,evidence:P,promptTexts:X,requirement:a.requirement,roleContext:V,targetChars:Math.floor(.95*aB),maxChars:aC,forbidDrawingImages:U,maxTokens:Math.min(aJ,aO),signal:a.signal})));bo=b.content,bp=b.rounds}bo=dh(bo,c);let bq=aj(bo),br=(0,aE.yw)(bo,[{title:c.title,content:bo,sections:bq}]).filter(a=>"empty"===a.reason||"table_only"===a.reason);!function(a,b){try{let c=["chapter-generation-failure.env","document-generation-timeout.env"].map(b=>e.join(a,".dbg",b)).find(a=>f.existsSync(a));if(!c)return;let d=Object.fromEntries(f.readFileSync(c,"utf8").split(/\r?\n/u).map(a=>a.split("=")).filter(a=>a.length>=2).map(([a,...b])=>[a,b.join("=")])),g=d.DEBUG_SERVER_URL;if(!g)return;fetch(g,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:d.DEBUG_SESSION_ID||"chapter-generation-failure",runId:"pre",ts:Date.now(),...b})}).catch(()=>void 0)}catch{}}(v,{event:"section-repair-check",hypothesisId:"H1",chapterId:c.id,chapterTitle:c.title,gapCount:br.length,gaps:br.slice(0,10).map(a=>({title:a.sectionTitle,reason:a.reason,message:a.message})),contentChars:(0,aD.V7)(bo),targetWords:aB}),br.length>0&&(N[j]=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:"running",message:`${(0,Q.GQ)(c.title)} 正在小节级定向补写 ${br.length} 个未达标小节`,details:br.slice(0,8).map(a=>a.message),progress:{current:h+1,total:bh.length,label:"小节补写"}},{subtitle:(0,Q.GQ)(c.title),order:h}),F(C),bo=await I(()=>bN(bG,`section-repair:${c.id}`,()=>cQ({template:z,chapter:c,content:bo,evidence:P,missingFacts:R,promptTexts:X,projectContext:bn,requirement:a.requirement,roleContext:V,targetWords:Math.max(1200,Math.floor(.35*aB)),maxWords:Math.min(aC,Math.max(2400,Math.floor(.55*aB))),forbidDrawingImages:U,factCoverageContext:am,forcedSections:br,signal:a.signal}))),bo=dh(bo,c),bq=aj(bo),br=(0,aE.yw)(bo,[{title:c.title,content:bo,sections:bq}]).filter(a=>"empty"===a.reason||"table_only"===a.reason),0===br.length&&(bG.quality.repairedCount+=1));let bs=cG({chapter:c,content:bo,evidence:P}),bt=(0,aD.V7)(bo),bu=aj(bo),bv=bu.length>0?bu:c.sections||[],bD=(0,aE.qK)(bo,[{title:c.title,content:bo,sections:bv}]).map(a=>a.message),bF=bs.slice(0,6).map(a=>`小节事实密度需优化:${a}`),bH=[...bY({chapter:{...c,sections:bv},content:bo,missingFacts:R,targetWords:aB}),...bD,...bF],bI=function(a,b,c=[]){return a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a))?"failed":c.length>0?"fallback":"success"}(bt,0,bH);g=bJ({type:"chapter_generation",roleId:"chapter_generation",promptId:W.primaryPromptId,status:bI,message:bL(`${(0,Q.GQ)(c.title)} 已由大模型首轮成稿${bp>0?`并定向扩写 ${bp} 轮`:""}:当前 ${bt} 字 / 目标 ${Math.floor(.95*aB)} 字${"success"!==bI?`;风险:${bH.join("、")||"篇幅未达标"}`:""}`,i),details:[`达标率:${Math.round(bt/Math.max(1,Math.floor(.95*aB))*100)}%`,...$,`二级小节:${bv.length} 个`,`扩写轮次:${bp}`],progress:{current:h+1,total:bh.length,label:"success"===bI?"章节达标":"章节风险"}},{subtitle:(0,Q.GQ)(c.title),order:h}),aR[h]=g;let bM={id:c.id,title:c.title,content:bo,evidence:P,missingFacts:R,sections:bv};aI[h]=bM,C=aI.filter(a=>!!a),F(C);let bO=bY({chapter:c,content:bo,missingFacts:R,targetWords:aB}),bP=(0,aE.Ff)(bO);bG.quality.blockingCount+=bP.blocking,bG.quality.importantCount+=bP.important,bG.quality.minorCount+=bP.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aF.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aR[h]=bJ({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,Q.GQ)(c.title)} 生成失败`},{subtitle:(0,Q.GQ)(c.title),order:h})}g&&(N[j]=g),F(C)}))}C=aI.filter(a=>!!a),aH.push(...aR.filter(a=>!!a));let b6=C.flatMap(a=>a.evidence||[]);if(b6.length>0){av.push(...b6);let a=J(av,{maxChars:Math.max(5e4,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...a)}if(0===C.length)throw Error(`章节生成未完成:${aF.join(";")||"没有生成任何有效章节"}`);if(U&&C.length<bh.length)throw Error(`OUTLINE 指定 ${bh.length} 章,实际只生成 ${C.length} 章:${aF.join(";")||"部分章节未生成"}`);(0,aG.Te)(a.signal),bK(N,bJ({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),F(C);let b7={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{b7=await ce(v,av,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bK(N,b7.stage),F(C),(0,aG.Te)(a.signal),b7.notes))av.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let b8=J(av,{maxItems:Math.max(48,10*bh.length),maxChars:Math.max(52e3,9e3*bh.length),preservePinned:!0});av.splice(0,av.length,...b8);let b9=function(a,b,c){let d={};for(let e of(0,E.Uy)(a,c)){let a=b.find(a=>(0,E.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(z,av,Y);for(let a of aZ)for(let b of a.facts)b9[b.key]=`${(0,aG.lG)(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let ca=bl(av,z,Y),cb=br(av),cc=bs(av,Z),cd=aZ.flatMap(a=>a.facts.map(a=>({key:a.key,value:(0,aG.lG)(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cg={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,E.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&(0,aG.lG)(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=(0,aG.lG)(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}([...cd,...ca,...cb,...cc],z,Y)){let b=J(av,{maxItems:48,maxChars:45e3,preservePinned:!0});try{cg=await bm(b,ak,z,Y,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}(0,aG.Te)(a.signal);let ch=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}([...cd,...ca,...cb,...cc,...cg.facts],av);for(let a of(bK(N,b7.stage),cg.stages))bK(N,a);F();let ci=bk(av),cj=av.filter(a=>"pinned-evidence"===a.source).length,cl=av.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cv=bJ({type:"reference",roleId:"quality-enhancement",status:av.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${av.length} 条,人工确认/固定证据 ${cj} 条,自动检索证据 ${cl} 条`},{subtitle:"证据与上下文增强"});for(let a of(N.push(cv),F(),ch))b9[a.key]=`${(0,aG.lG)(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cw=new Map;for(let a of av)cw.set(a.filePath,(cw.get(a.filePath)??0)+1);let cx=new Map;for(let a of av)cx.set(a.source||"unknown",(cx.get(a.source||"unknown")??0)+1);let cy=[...cw.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cz=bD(ch,ci,aA,Y,Z),cA=C.map(a=>{let b=Y.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>Y.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)}}),cB=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}}(C,ch,z);cB.warnings=[...cB.warnings,..._.warnings],cB.errors=[...cB.errors,..._.blockingIssues];let cC=aZ.flatMap(a=>a.warnings.map(a=>({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(a)?"info":"warning",message:a,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"}))).filter(a=>!de(a)),cD=aM(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=>/资料未提供|系统暂未从知识库确认/u.test(a.content))&&d.push({level:"warning",message:"存在系统暂未从知识库确认的章节内容",suggestion:"请检查项目角色配置、文件绑定顺序和事实抽取落位结果。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(cB,cz,C),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}(cA),cC),cE=bW(aZ,z),cF=Date.now(),cH=(0,aD.V7)(C.map(a=>a.content).join("\n\n"));bK(N,bJ({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cH} 字`,details:[`章节数:${C.length}`,`目标:${bE.targetChars||bE.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),F(C);let cI=bF.enableDocumentBudgetExpansion?await I(()=>cS({template:z,chapters:C,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal,onRoundProgress:(a,b)=>{C.splice(0,C.length,...a),bK(N,bJ({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:第 ${b.round}/${b.maxRounds} 轮,当前 ${b.totalChars} 字,新增 ${b.addedChars} 字`,details:[`章节数:${a.length}`,`目标:${bE.targetChars||bE.targetPages||"按章节深度"}`],progress:{current:Math.min(b.round+1,b.maxRounds),total:b.maxRounds+1,label:"预算校准"}},{subtitle:"文档预算"})),F(C)}})):C;C.splice(0,C.length,...cI);let cM=C.map(a=>a.content).join("\n\n"),cN=dn(C,ch,cM);cN.patchedCount>0&&(C.splice(0,C.length,...cN.chapters),cD=[...cD,{level:"info",message:`已自动补写未落位事实 ${cN.patchedCount} 项`,suggestion:"补写仅使用本项目资料明确事实,未补写商务敏感信息或系统暂未确认内容。"}]);let cO=(0,aD.fW)(bE,C.map(a=>a.content).join("\n\n")),cP=[bE.targetChars?`目标 ${bE.targetChars} 字${bE.minChars||bE.maxChars?`(区间 ${bE.minChars||0}-${bE.maxChars||"∞"} 字)`:""}`:void 0,bE.targetPages?`目标 ${bE.targetPages} 页${bE.minPages||bE.maxPages?`(区间 ${bE.minPages||0}-${bE.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bK(N,bJ({type:"validation",roleId:"document-budget",status:bE.maxChars&&cO.currentChars>bE.maxChars||bE.minChars&&cO.currentChars<bE.minChars?"fallback":"success",message:bL(`文档预算:当前 ${cO.currentChars} 字,新增 ${Math.max(0,cO.currentChars-cH)} 字,预计 ${cO.estimatedPages} 页;${cP}`,cF)},{subtitle:"文档预算"})),F(C);let cY=aH.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,c_=Math.max(0,bh.length-C.length),c1=[...cY>0?[{level:"info",message:`章节生成存在补充完善:${cY} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}]:[],...c_>0?[{level:"error",message:`部分章节生成失败:${c_} 章`,suggestion:aF.join(";")||"请检查模型调用、知识库检索和事实抽取配置后重新生成失败章节。"}]:[]],c2=C.flatMap(a=>{let b=bh.find(b=>b.id===a.id);if(!b)return[];let c=cG({chapter:b,content:a.content,evidence:a.evidence||[]});return c.length>0?[{level:"warning",message:`${(0,Q.GQ)(a.title)} 小节知识库事实或量化参数落位可继续优化:${c.slice(0,5).join(";")}`,suggestion:"建议扩大本地知识库检索并定向补写对应小节,优先使用清单、图纸、招标要求中的原始事实、规格、数量、标准和工期参数。"}]:[]}),c3=(cD=aM(cD,c1,c2)).filter(a=>"error"===a.level&&(0,aE.Nz)(a)).length,c4=[...N];bK(c4,bJ({type:"reference",roleId:"knowledge-usage-report",status:"success",message:`资料使用报告:证据 ${av.length} 条,来源文件 ${cy.length} 份,结构化事实 ${ch.length} 条`,details:[`证据类型:${[...cx.entries()].map(([a,b])=>`${a} ${b}`).join(",")||"无"}`,`索引健康:可用切片 ${as.usableChunkCount} 条,待索引 ${as.pendingJobs} 个,向量 ${as.vectorStatus?.status||"unknown"}`,cN.patchedCount>0?`自动补写事实:${cN.patchedCount}/${cN.missingCount}`:`事实落位补写:0/${cN.missingCount}`]},{subtitle:"资料使用报告"})),bK(c4,bJ({type:"reference",roleId:"web-research-report",status:ax.enabled?"success":"skipped",message:ax.enabled?`联网增强:检索章节 ${new Set(ax.chapters).size} 个,查询 ${ax.queries.length} 个,使用公开资料 ${ax.evidenceCount} 条`:"联网增强未开启",details:ax.enabled?[`检索主题:${[...new Set(ax.queries)].join(";")||"无"}`,`过滤结果:${ax.filteredCount} 条`,"公开资料仅用于通用规范、政策、工艺和措施补充,不作为项目事实来源"]:["可在模型配置中开启联网增强"]},{subtitle:"联网增强报告"})),bK(c4,bJ({type:"validation",roleId:"document-workflow",status:c3>0?"failed":"success",message:`阻断 ${c3},错误 ${cB.errors.length},警告 ${cB.warnings.length}`},{subtitle:"最终规范校验"})),bK(c4,bJ({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bK(c4,bJ({type:"export_ready",roleId:"document-workflow",status:c3>0?"failed":"success",message:c3>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let c5={templateId:z.id,templateName:z.name,title:z.outputTitle,requirement:a.requirement||"",projectRoot:v,projectId:w,exportSettings:z.exportSettings,generationSettings:z.generationSettings,facts:b9,structuredFacts:ch,factsModel:cz,chapters:C,sources:cy,missingItems:[...new Set(aA)],validation:cB,validationIssues:cD,executionStages:c4,exportGate:{passed:0===c3,blockingIssues:cD.filter(a=>"error"===a.level&&(0,aE.Nz)(a)),checklist:[]},assets:[],partialChapters:C.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:C,generatedAt:Date.now()},c6=aC(c5,{forbidDrawingImages:cE,promptRules:ag});if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let b=aB(c6,C,{forbidDrawingImages:cE,promptRules:ag}).chapters.map(a=>{let b=bh.find(b=>b.id===a.id)||a;return{...a,content:dh(a.content,b)}}),c="",d=(a,b)=>aM(cD.filter(a=>!de(a)&&("error"!==a.level||!(0,aE.Nz)(a))),x({markdown:a,spec:Y,summary:W}),B({markdown:a,facts:ch,summary:W,profile:Z}),y(a,W),dc(a,ch),a2({markdown:a,chapters:b,factsModel:cz,template:z,promptBindings:P,promptDocumentRules:ag}),(0,aD.PE)(z.generationSettings||z.exportSettings,a).filter(a=>!(bE.minPages&&/低于目标页数/u.test(a.message))),(0,aD.ty)(bE,a)),e=[],f=()=>{var a;e=aN(d(c=db(c0(dd(aB(aC({...c5,chapters:b},{forbidDrawingImages:cE,promptRules:ag}),b,{forbidDrawingImages:cE,promptRules:ag}).markdown),ch),ch),b)),e=aN(d(c=dg(c,e).replace(/^##\s+(.+)$/gmu,(a,b)=>{let c=String(b||"").trim();return"目录"===c||/^第[一二三四五六七八九十百千万\d]+章\s+/u.test(c)?a:`### ${c}`}),b)),a=c,e=aN(d(c=e.some(a=>/小节内容补写未完成|小节只有标题或表格无正文|空小节/u.test(a.message))?`${a.trim()}
|
|
200
|
+
|
|
201
|
+
### 小节执行说明补充
|
|
202
|
+
|
|
203
|
+
对仅列示表格或说明不足的小节,现场实施时应结合本章管理目标补充执行要求。相关表格不是孤立清单,而是用于指导责任分工、资源投入、过程检查和验收复核的控制依据。项目部应在表格所列事项基础上明确责任人、检查频次、验收标准和整改闭环要求,确保计划、资源、质量、安全和资料管理形成连续管理链条。
|
|
204
|
+
|
|
205
|
+
各专业工程师应依据招标文件、图纸设计说明、工程量清单和现场实际条件,对表格中的项目逐项核对,形成可实施的施工安排。涉及工期、质量、安全、材料、机械和劳动力的内容,应同步纳入周计划和日协调机制,确保表格内容能够转化为现场执行动作、检查记录和竣工资料。`:a,b)),e=aN(d(c=function(a,b){if(!b)return a;let c=b-(0,aD.V7)(a);return c<=0||c>1800?a:`${a.trim()}
|
|
200
206
|
|
|
201
207
|
### 履约闭环补充要求
|
|
202
208
|
|
|
203
|
-
为保证施工组织设计在实施阶段具备可检查、可追溯和可闭合的管理效果,项目部将在开工准备、样板确认、材料进场、工序交接、隐蔽验收、质量复核、安全巡查、进度纠偏和资料归档等环节同步建立责任清单。各专业负责人应围绕本项目已明确的工期、质量、安全文明施工、现场条件和招标响应要求,形成“计划交底、过程检查、问题整改、复核销项、资料留痕”的闭环机制。对影响关键线路、专业穿插、材料供应、机械进退场和成品保护的事项,及时组织专题协调并落实到责任岗位,确保本施工组织设计中的技术措施、资源计划和管理要求能够落到现场执行。`}(c,bE.minChars),b))},g=a=>{b=a.map(a=>{let b=bh.find(b=>b.id===a.id)||a;return{...a,sections:a.sections||[],content:dh(a.content,b)}}),f()},h=()=>e.filter(df).map(a=>aP(a)).slice(0,24),i=async(d,e)=>{if(!bE.minChars||!bF.enableDocumentBudgetExpansion||(0,aD.V7)(c)>=bE.minChars||bE.maxChars&&(0,aD.V7)(c)>=bE.maxChars)return!1;let g=(0,aD.V7)(c);b=(await I(()=>cS({template:z,chapters:b,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal,onRoundProgress:(a,c)=>{b=a.map(a=>({...a,sections:a.sections||[]})),bK(c4,bJ({type:"validation",roleId:d,status:"running",message:`${e}:第 ${c.round}/${c.maxRounds} 轮,当前 ${c.totalChars} 字,新增 ${c.addedChars} 字`},{subtitle:e})),F(b,c4)}}),c4)).map(a=>({...a,sections:a.sections||[]})),f();let h=(0,aD.V7)(c);return c4.push(bJ({type:"validation",roleId:d,status:h<bE.minChars?"fallback":"success",message:`${e}:当前 ${h} 字,新增 ${Math.max(0,h-g)} 字,目标下限 ${bE.minChars} 字`},{subtitle:e})),h>g},j=[];f();for(let d=0;d<5;d+=1){if((0,aG.Te)(a.signal),await i(`default-budget-repair-${d+1}`,0===d?"默认路径预算补齐":"默认路径预算再补齐"))continue;let f=h(),k=f.length>0&&f.every(a=>/正文篇幅低于目标字数|正文长度低于提示词要求/u.test(a));if(0===f.length||k)break;let l=await I(()=>bN(bG,"default-path-quality-repair",()=>b_({markdown:c,template:z,chapters:b,promptTexts:ai,requirement:a.requirement,issues:f,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:f.length,round:d+1}),c4);if(l.stage&&j.push({...l.stage,message:`${l.stage.message||"默认路径质量修复完成"};第 ${d+1} 轮,触发问题 ${f.length} 个`}),l.chapters===b)break;g(l.chapters);let m=aQ(f,e).slice(0,8);if(0===m.length)continue;let n=await I(()=>bN(bG,"default-path-quality-repair-escalation",()=>b_({markdown:c,template:z,chapters:b,promptTexts:ai,requirement:a.requirement,issues:m,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:m.length,round:d+1}),c4);n.chapters!==b&&g(n.chapters),j.push(bJ({type:"llm_review",roleId:`default-repair-verify-${d+1}`,status:e.some(a=>m.some(b=>aO(b)===aO(a)))?"fallback":"success",message:`修复后验证闭环完成:第 ${d+1} 轮升级修复 ${m.length} 个残留问题`,details:m},{subtitle:"修复后验证"}))}let k=(0,aE.Ai)(e,cz,b),l=[...c4,...j].map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:k.blockingIssues.length>0?"failed":"success",message:`阻断 ${k.blockingIssues.length},问题 ${e.length}`}:"export_ready"===a.type?{...a,status:k.passed?"success":"failed",message:k.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);l.push(bJ({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;默认路径已执行本地硬规则校验与必要的精准局部修复;如需开启重型复审请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let m=b.map(a=>({...a,evidence:J(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...c5,chapters:m,validationIssues:e,exportGate:k,executionStages:l,partialChapters:b.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:m,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bG},markdown:c}}(0,aG.Te)(a.signal);let c7=C.map(a=>{let b=bY({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:bE.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,aD.V7)(a.content)}}),c8=c7.filter(a=>"pass"!==a.status).length,c9=bF.enableChapterReview&&c8>0;c9&&(bK(c4,bJ({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${c8}/${C.length} 章存在本地风险`,details:["仅对本地扫描发现风险的生成结果触发 LLM 审查,按风险章节自然并行"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),F(C,c4));let da=c9?await I(()=>bN(bG,"chapter-review",()=>cT({template:z,chapters:C,budget:bE,promptTexts:am||ai,requirement:a.requirement,strategy:bF,diagnostics:bG,signal:a.signal}),{chapters:C.length}),c4):{summaries:c7,stage:bJ({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bF.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};c4.push(da.stage);let dj=da.summaries,dk=dj.filter(a=>"pass"!==a.status&&a.issues.length>0);if(dk.length>0){bK(c4,bJ({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${dk.length} 章`,details:dk.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:dk.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),F(C,c4);let b=new Map,c=0,d=Math.max(1,dk.length||1);for(let e=0;e<dk.length;e+=d){(0,aG.Te)(a.signal);let f=dk.slice(e,e+d);for(let d of(await Promise.all(f.map(async b=>{let c=C.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await bi(d=>bZ({template:z,chapter:c,issues:b.issues.slice(0,4),promptTexts:am||ai,requirement:a.requirement,forbidDrawingImages:cE,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 e=0,f=new Set;for(let a=0;a<C.length;a+=1){let c=b.get(C[a].id);c&&c!==C[a].content&&(C[a]={...C[a],content:c},f.add(C[a].id),e+=1)}e>0&&(dj=dj.map(a=>f.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aD.V7)(C.find(b=>b.id===a.chapterId)?.content||"")}:a),c6=aC({...c5,chapters:C,validationIssues:cD,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag})),c4.push(bJ({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${e} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),F(C,c4)}if(c9){let a=dj.filter(a=>"pass"!==a.status&&a.issues.length>0).map(a=>({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"}));cD=aM(cD,a)}let dl=bF.enableGlobalReview&&(c9||cD.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));dl&&(bK(c4,bJ({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),F(C,c4));let dy=dl?await I(()=>bN(bG,"global-consistency-review",()=>cU({template:z,chapters:C,chapterReviews:dj,promptTexts:am||ai,requirement:a.requirement,projectContext:bn,diagnostics:bG,signal:a.signal}),{chapters:C.length}),c4):{issues:[],stage:bJ({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bF.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};c4.push(dy.stage),cD=aM(cD,dy.issues.map(a=>({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"}))),F(C,c4);let dz=C.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aD.V7)(a.content)<Math.floor(.7*(bE.chapterTargets.get(a.id)||1200))||dj.some(b=>b.chapterId===a.id&&"fail"===b.status)||bY({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:bE.chapterTargets.get(a.id)||1200}).length>0),dA=c3>0||dy.issues.length>0||dj.some(a=>"fail"===a.status)||cD.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),dB=bF.enableFinalQualityReview&&(dA||dz.length>Math.max(3,Math.floor(.35*C.length))),dC=Date.now();dB&&(bK(c4,bJ({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${dz.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),F(C,c4));let dD=J(av,{maxItems:Math.max(32,8*bh.length),maxChars:Math.max(36e3,6e3*bh.length),preservePinned:!0}),dE=dB?await I(()=>cV({template:z,spec:Y,markdown:c6,evidence:dD,promptTexts:am||ai,projectContext:bn,requirement:a.requirement,diagnostics:bG,signal:a.signal}),c4):{markdown:c6,stage:{type:"llm_review",roleId:"llm-review",status:dz.length>0?"fallback":"success",message:dz.length>0?`本地风险扫描发现 ${dz.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};dE.stage.message=bL(dE.stage.message||"LLM 审查完成",dC),(0,aG.Te)(a.signal);let dF=dg(aB(dE.markdown===c6?aC({...c5,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}):dE.markdown,C,{forbidDrawingImages:cE,promptRules:ag}).markdown,cD),dG=az(dF,z).map(a=>aP(a)),dH=(0,aE.bM)(dF).map(a=>aP(a)),dI=(0,aE.mR)(dF,z).map(a=>aP(a)),dJ=(0,aE.N1)(dF,cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dK=ag.forbidToc?[]:[...(0,aE.gN)(dF),...(0,aE.f8)(dF)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dL=(0,aE.k0)(dF).map(a=>aP(a)),dM=(0,aE.qK)(dF,C).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dN=(b={markdown:dF,chapters:C,factsModel:cz},[...(0,aE.ji)(b.chapters),...(0,aE.i0)(b.chapters),...(0,aE.ST)(b.chapters),...(0,aE.xX)(b.chapters),...(0,aE.qm)(b.markdown,b.factsModel),...aJ(b.markdown,b.factsModel),...aK(b.markdown),...aL(b.chapters),...(0,aE.vY)(b.markdown,b.factsModel)]).map(a=>aP(a)),dO=(0,aE.iC)(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dP=(0,aE.BV)(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dQ=function(...a){return a.flat()}(dG,dH,dI,dJ,dK,dL,dM,dN,dO,dP,(0,aE.Ty)(C).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),al(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)),dR=new Set(dM),dS=Date.now(),dT=dQ.filter(a=>!dR.has(a));bK(c4,bJ({type:"llm_review",roleId:"quality-repair",status:dT.length>0?"running":"success",message:dT.length>0?`正在进行精准质量修复:${dT.length} 个问题`:"未发现需要精准修复的问题",details:dT,progress:{current:1,total:Math.max(1,dT.length),label:"质量修复"}},{subtitle:"精准质量修复"})),F(C,c4);let dU=await I(()=>bN(bG,"local-patch-quality-repair",()=>b_({markdown:dF,template:z,chapters:C,promptTexts:ai,requirement:a.requirement,issues:dT,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:dT.length}),c4);dU.stage&&(dU.stage.message=bL(dU.stage.message||"质量修复完成",dS)),(0,aG.Te)(a.signal);let dV=dU.stage?[...c4,dE.stage,dU.stage]:[...c4,dE.stage],dW=dU.chapters,dX=aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dY=aQ(dT,[...az((c={markdown:dX=dg(dX,cD),chapters:dW,template:z,factsModel:cz}).markdown,c.template),...(0,aE.bM)(c.markdown),...(0,aE.k0)(c.markdown),...(0,aE.ji)(c.chapters),...(0,aE.i0)(c.chapters),...(0,aE.ST)(c.chapters),...(0,aE.xX)(c.chapters),...(0,aE.qm)(c.markdown,c.factsModel),...aJ(c.markdown,c.factsModel),...aK(c.markdown),...aL(c.chapters),...(0,aE.vY)(c.markdown,c.factsModel)]).slice(0,8);if(dY.length>0){let b=await I(()=>bN(bG,"local-patch-quality-repair-escalation",()=>b_({markdown:dX,template:z,chapters:dW,promptTexts:ai,requirement:a.requirement,issues:dY,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:dY.length}),dV);dW=b.chapters,dX=dg(dX=aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),cD),dV=b.stage?[...dV,{...b.stage,roleId:"quality-repair-escalation",message:`修复后验证发现残留问题,已升级修复 ${dY.length} 个问题`}]:dV}let dZ=(0,aE.yw)(dX,dW.map(a=>({...a,sections:aj(a.content)}))).filter(a=>"empty"===a.reason||"table_only"===a.reason);if(dZ.length>0){let b=Date.now();bK(dV,bJ({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dZ.length} 个问题`,details:dZ.map(a=>a.message),progress:{current:1,total:dZ.length,label:"小节补写"}},{subtitle:"小节内容补写"})),F(dW,dV);let c=[...dW];for(let b=0;b<dW.length;b+=Math.max(1,dW.length||1)){(0,aG.Te)(a.signal);let d=dW.slice(b,b+Math.max(1,dW.length||1));(await Promise.all(d.map(async b=>{let c=dZ.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=bE.chapterTargets.get(b.id)||1200,f=bT(d,bf);try{let g=await bi(g=>cQ({template:z,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ai,projectContext:bn,requirement:a.requirement,roleContext:bV(aZ,d,f),targetWords:e,forbidDrawingImages:cE,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=aj(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dW=c;let d=(0,aE.qK)(aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dW);bK(dV,bJ({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bL(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),F(dW,dV)}let d$=(0,aD.fW)(bE,dW.map(a=>a.content).join("\n\n"));if(bF.enableDocumentBudgetExpansion&&bE.minChars&&d$.currentChars<Math.floor(.9*bE.minChars)&&(!bE.maxChars||d$.currentChars<bE.maxChars)){let b=Date.now(),c=d$.currentChars;bK(dV,bJ({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bE.minChars} 字`,`章节数:${dW.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),F(dW,dV),dW=await I(()=>cS({template:z,chapters:dW,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal}),dV);let d=(0,aD.fW)(bE,dW.map(a=>a.content).join("\n\n"));bK(dV,bJ({type:"validation",roleId:"document-budget-repair",status:bE.minChars&&d.currentChars<bE.minChars?"fallback":"success",message:bL(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let d_=aB(aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dW,{forbidDrawingImages:cE,promptRules:ag}),d0=d_.chapters,d1=d_.markdown,d2=(0,aE.yw)(d1,d0.map(a=>({...a,sections:aj(a.content)}))).filter(a=>"empty"===a.reason||"table_only"===a.reason);if(d2.length>0){let b=Date.now();bK(dV,bJ({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${d2.length} 个问题`,details:d2.map(a=>a.message),progress:{current:1,total:d2.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),F(d0,dV);let c=[...d0];for(let b=0;b<d0.length;b+=Math.max(1,d0.length||1)){(0,aG.Te)(a.signal);let d=d0.slice(b,b+Math.max(1,d0.length||1));(await Promise.all(d.map(async b=>{let c=d2.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=bE.chapterTargets.get(b.id)||1200,f=bT(d,bf);try{let g=await bi(g=>cQ({template:z,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ai,projectContext:bn,requirement:a.requirement,roleContext:bV(aZ,d,f),targetWords:e,forbidDrawingImages:cE,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=aj(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}d0=(d_=aB(aC({...c5,chapters:c,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),c,{forbidDrawingImages:cE,promptRules:ag})).chapters,d1=d_.markdown;let d=(0,aE.qK)(d1,d0);bK(dV,bJ({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bL(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),F(d0,dV)}d0=(d_=aB(aC({...c5,chapters:d0,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),d0,{forbidDrawingImages:cE,promptRules:ag})).chapters,d1=db(c0(d_.markdown,ch),ch);let d3=bH({facts:ch,markdown:d1});d3.size>0&&c4.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${d3.size} 项`,details:[...d3.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let d4=[...dG];cD=aM((0,aE.kQ)(Y,[...cD,...d4.map(a=>({level:"warning",message:a}))],cz,d0,d1,V,P),x({markdown:d1,spec:Y,summary:W}),B({markdown:d1,facts:ch,summary:W,profile:Z}),y(d1,W),dc(d1,ch),a2({markdown:d1,chapters:d0,factsModel:cz,template:z,promptBindings:P,promptDocumentRules:ag}));let d5=dn(d0,ch,d1);d5.patchedCount>0&&(d0=d5.chapters.map(a=>({...a,sections:a.sections||[]})),cD=[...cD,{level:"info",message:`最终审查阶段已补写未落位事实 ${d5.patchedCount} 项`,suggestion:"补写仅使用本项目资料明确事实,未补写商务敏感信息或系统暂未确认内容。"}],d1=aB(aC({...c5,chapters:d0,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),d0,{forbidDrawingImages:cE,promptRules:ag}).markdown),cD=aM(cD,function(a,b,c={}){return dm(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(d1,[...ch,...cz.preciseFacts],{maxIssues:30})),d1=aB(d1,d0,{forbidDrawingImages:cE,promptRules:ag}).markdown;let d6=(0,aD.ty)(bE,d1),d7=(0,aD.PE)(z.generationSettings||z.exportSettings,d1).filter(a=>!(bE.minPages&&/低于目标页数/u.test(a.message)));cD=aN(aM(cD,d7,d6,az(d1,z),ay(d1,ag)));let d8=function(a){let b=a.chapters.map(b=>{let c=function(a){let b=["project"];return/进度|工期|节点|部署/u.test(a.title)&&b.push("schedule"),/质量|验收|材料/u.test(a.title)&&b.push("quality","rules"),/安全|文明|风险|危大/u.test(a.title)&&b.push("safety","rules"),/资源|材料|设备|劳动力|机械/u.test(a.title)&&b.push("resources"),/施工|工艺|技术|方案|清单|工程量|图纸/u.test(a.title)&&b.push("quantities"),[...new Set(b)]}(a.templateChapters.find(a=>a.id===b.id||a.title===b.title)||b),d=c.filter(c=>{var d;return d=a.factsModel,("project"===c?d.project.length>0||d.preciseFacts.length>0:"schedule"===c?d.schedule.length>0:"quality"===c?d.quality.length>0||d.specifications.length>0:"safety"===c?d.safety.length>0||d.rules.length>0:"resources"===c?d.resources.length>0||d.bills.length>0:"quantities"===c?d.bills.length>0||d.drawings.length>0||d.tables.length>0:"rules"===c&&(d.rules.length>0||d.specifications.length>0))||(b.evidence||[]).some(a=>RegExp(a3[c]||c,"u").test(`${a.sectionTitle||""} ${a.content||""}`))}),e=c.filter(a=>!d.includes(a)),f=c.length?Math.round(d.length/c.length*100):100;return{chapterId:b.id,title:b.title,requiredDomains:c,confirmedDomains:d,unconfirmedDomains:e,score:f}}),c=new Set(a.evidence.map(a=>a.filePath).filter(Boolean)),d=b.length?Math.round(b.reduce((a,b)=>a+b.score,0)/b.length):100;return{score:d,evidenceCount:a.evidence.length,confirmedFiles:c.size,chapterReports:b,unconfirmedDomains:[...new Set(b.flatMap(a=>a.unconfirmedDomains))],remediation:d>=95?"知识库事实覆盖已达到高置信交付要求。":"系统需扩大本地知识库检索、补抽结构化事实,并将已确认事实落位到对应章节。"}}({chapters:d0,templateChapters:bh,factsModel:cz,evidence:av}),d9=function(a,b){let c=new Set,d=[];for(let e of[...b.project,...b.schedule,...b.quality,...b.safety,...b.resources,...b.preciseFacts,...b.bills,...b.drawings,...b.rules,...b.specifications]){let b=(0,aG.lG)(e.value).replace(/\s+/gu," ").trim(),f=e.fieldName||e.key||e.fieldId||"资料事实",g=`${f}:${b}`;!b||c.has(g)||(c.add(g),d.push({label:f,value:b,sourceFile:e.sourceFile,status:!function(a,b){let c=a4(a),d=a4(b);return!!(!d||d.length<2||c.includes(d))||(b.match(/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年|万元|元|平方米|㎡|m²|立方米|m³|米|m|mm|cm|台|套|人|项|%|MPa|kPa)?/giu)||[]).some(a=>a4(a).length>=2&&c.includes(a4(a)))}(a,b)?"unplaced":"used",confidence:e.confidence}))}return d}(d1,cz),ea=(p={chapters:d0,templateChapters:bh,factsModel:cz}).chapters.map(a=>{let b=p.templateChapters.find(b=>b.id===a.id||b.title===a.title),c=function(a,b){let c=`${a.title} ${(b?.sections||a.sections||[]).join(" ")}`;return[{key:"structure",label:"结构完整",passed:(a.sections||b?.sections||[]).length>=2||/###\s+/u.test(a.content)},{key:"depth",label:"内容深度",passed:(0,aD.V7)(a.content)>=600},{key:"evidence",label:"证据绑定",passed:(a.evidence||[]).length>0},{key:"professional",label:"专业控制点",passed:/验收|复核|检查|交底|控制点|整改|闭环|台账|进场|工序/u.test(a.content)},{key:"schedule",label:"工期支撑",passed:!/进度|工期|节点/u.test(c)||/工期|节点|计划|纠偏|资源|穿插/u.test(a.content)},{key:"quality",label:"质量验收",passed:!/质量|验收/u.test(c)||/质量|验收|复验|隐蔽|检验批|整改/u.test(a.content)},{key:"safety",label:"安全闭环",passed:!/安全|文明|风险|危大/u.test(c)||/风险|检查|整改|应急|培训|交底/u.test(a.content)}]}(a,b),d=c.filter(a=>a.passed).length;return{chapterId:a.id,title:a.title,score:c.length?Math.round(d/c.length*100):100,checks:c,action:d===c.length?"章节覆盖完整。":"系统需补齐章节结构、证据绑定、专业控制点和跨章依赖。"}});cD=aN(aM(cD,d8.score>=85?[]:[{level:"warning",message:`系统知识库覆盖确认率偏低:${d8.score}%`,suggestion:`${d8.remediation} 未确认事实域:${d8.unconfirmedDomains.map(a=>a3[a]||a).join("、")||"无"}`}],function(a,b={}){return a.filter(a=>"unplaced"===a.status&&/项目|工程|编号|地点|规模|范围|工期|质量|安全|资源|材料|设备|验收|\d/u.test(`${a.label}${a.value}`)).slice(0,b.maxIssues||20).map(a=>({level:"warning",message:`已确认知识库事实未落位:${a.label}=${a.value}`,suggestion:`请将该事实落位到对应章节,并保持来源 ${a.sourceFile||"结构化事实主表"} 的原始口径。`}))}(d9,{maxIssues:20}),ea.filter(a=>a.score<80).map(a=>({level:"warning",message:`章节覆盖不足:${a.title} ${a.score}%`,suggestion:`${a.action} 未通过项:${a.checks.filter(a=>!a.passed).map(a=>a.label).join("、")}`})),aw.filter(a=>a.risk.highRisk&&(0===a.requiredFactTotal?a.evidenceCount<8:a.requiredFactCovered<a.requiredFactTotal)).map(a=>({level:"warning",message:`系统延迟切片召回覆盖需复核:${a.chapterTitle}`,suggestion:`知识库总切片 ${a.risk.totalChunks},当前预加载 ${a.risk.loadedChunks},已启用深召回;事实覆盖 ${a.requiredFactCovered}/${a.requiredFactTotal},小节覆盖 ${a.sectionCovered}/${a.sectionTotal}。`}))));let eb=(0,aE.Ai)(cD,cz,d0),ec=a6({markdown:d1,chapters:d0,issues:cD,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea}),ed=function(a){let b=[],c=a.issues.filter(a=>"error"===a.level);c.length>0&&b.push({priority:"high",title:"阻断问题修复",action:`修复 ${c.length} 个导出阻断问题,优先处理事实冲突、结构缺失、模板规则违规和占位残留。`});let d=(a.factTraces||[]).filter(a=>"unplaced"===a.status).slice(0,10);d.length>0&&b.push({priority:"high",title:"事实落位修复",action:`将 ${d.length} 项已确认知识库事实写入对应章节,保持原始数值、单位和来源口径。`}),a.knowledgeCoverage&&a.knowledgeCoverage.score<95&&b.push({priority:"medium",title:"知识库确认覆盖修复",action:"扩大本地知识库检索范围,执行事实补抽和章节证据重分配;这是系统检索、抽取、落位问题,不要求用户追加资料。"});let e=(a.chapterCoverage||[]).filter(a=>a.score<80).slice(0,8);return e.length>0&&b.push({priority:"medium",title:"章节覆盖修复",action:`补齐低覆盖章节:${e.map(a=>a.title).join("、")}。`}),a.qualityReport&&!a.qualityReport.passed&&b.push({priority:"medium",title:"交付置信度修复",action:a.qualityReport.actions.join(" ")}),b}({issues:cD,qualityReport:ec,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea});cD=aN(aM(cD,(q=ec).passed?[]:[{level:"warning",message:`交付置信度未达目标:${q.deliveryProbability}% / ${q.target}%`,suggestion:q.actions.join(" ")}],ed.filter(a=>"high"===a.priority).map(a=>({level:"warning",message:`修复策略待执行:${a.title}`,suggestion:a.action})))),eb=(0,aE.Ai)(cD,cz,d0),ec=a6({markdown:d1,chapters:d0,issues:cD,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea});let ee=[{key:"export-gate",label:"导出门禁",passed:(r={exportGate:eb,qualityReport:ec,repairStrategies:ed}).exportGate.passed,message:r.exportGate.passed?"导出门禁通过":`仍有 ${r.exportGate.blockingIssues.length} 个阻断问题`},{key:"delivery-probability",label:"交付置信度",passed:r.qualityReport.passed,message:`${r.qualityReport.deliveryProbability}% / ${r.qualityReport.target}%`},{key:"factuality",label:"事实准确性",passed:r.qualityReport.scores.factuality>=85,message:`${r.qualityReport.scores.factuality}/100`},{key:"evidence-coverage",label:"知识库证据覆盖",passed:r.qualityReport.scores.evidenceCoverage>=85,message:`${r.qualityReport.scores.evidenceCoverage}/100`},{key:"professional-depth",label:"专业深度",passed:r.qualityReport.scores.professionalDepth>=80,message:`${r.qualityReport.scores.professionalDepth}/100`},{key:"repair-strategies",label:"修复策略",passed:0===r.repairStrategies.filter(a=>"high"===a.priority).length,message:r.repairStrategies.map(a=>a.title).join("、")||"无高优先级修复策略"}],ef=function(a){let b=[...a.diagnostics.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>({name:a.name,durationMs:a.durationMs}));return{llmCalls:a.diagnostics.llm.calls,llmFailures:a.diagnostics.llm.failures,maxParallelLlm:a.diagnostics.llm.maxActive,searchQueries:a.diagnostics.evidence.searchQueries,evidenceContextChars:a.diagnostics.evidence.contextChars,qualityIssues:{...a.diagnostics.quality},slowMetrics:b,elapsedMs:a.startedAt&&a.endedAt?a.endedAt-a.startedAt:void 0}}({diagnostics:bG}),eg=eb.blockingIssues.length,eh=(0,aE.Ff)(cD);bG.quality.blockingCount+=eh.blocking,bG.quality.importantCount+=eh.important,bG.quality.minorCount+=eh.minor;let ei=dV.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:eg>0?"failed":"success",message:`阻断 ${eg},问题 ${cD.length}`}:"export_ready"===a.type?{...a,status:eb.passed?"success":"failed",message:eb.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);ei.push(bJ({type:"validation",roleId:"document-delivery-score",status:ec.passed?"success":"fallback",message:ec.summary,details:ec.actions},{subtitle:"交付评分"})),ei.push(bJ({type:"reference",roleId:"knowledge-coverage",status:d8.score>=85?"success":"fallback",message:`知识库确认覆盖率:${d8.score}%(证据 ${d8.evidenceCount} 条,文件 ${d8.confirmedFiles} 份)`,details:[d8.remediation]},{subtitle:"知识库覆盖"})),ei.push(bJ({type:"validation",roleId:"document-review-checklist",status:ee.every(a=>a.passed)?"success":"fallback",message:`交付复核清单:通过 ${ee.filter(a=>a.passed).length}/${ee.length}`,details:ee.map(a=>`${a.passed?"通过":"待修复"}:${a.label}${a.message?`(${a.message})`:""}`)},{subtitle:"交付复核"}));let ej=[...bG.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");ei.push(bJ({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bG.llm.calls} 次,失败 ${bG.llm.failures} 次,峰值并行 ${bG.llm.maxActive},检索 ${bG.evidence.searchQueries} 次/${Math.round(bG.evidence.searchMs/1e3)} 秒,证据上下文 ${bG.evidence.contextChars} 字,噪声过滤 ${bG.evidence.filteredNoise} 条,质量问题 阻断${bG.quality.blockingCount}/重要${bG.quality.importantCount}/轻微${bG.quality.minorCount}${ej?`,Top耗时:${ej}`:""}`},{subtitle:"后台诊断"}));let ek=d0.map(a=>({...a,evidence:J(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...c5,chapters:ek,validationIssues:cD,exportGate:eb,executionStages:ei,partialChapters:d0.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:ek,reviewMetadata:{chapterSummaries:dj,globalIssues:dy.issues,diagnostics:bG,profile:function(a){let b=`${a.template.name} ${a.template.outputTitle||""} ${a.requirement||""} ${a.chapters.map(a=>a.title).join(" ")}`,c=[{pattern:/专项施工|危大|专项方案/u,type:"专项施工方案",dimensions:["专项对象边界","工艺参数","风险控制","验收要求","应急措施"]},{pattern:/投标|技术标|响应|招标/u,type:"投标技术方案",dimensions:["招标响应","技术优势","工期质量安全承诺","资源保障","履约可实施性"]},{pattern:/监理|旁站|巡视|平行检验/u,type:"监理规划/细则",dimensions:["监理目标","旁站巡视","平行检验","验收程序","资料签认"]},{pattern:/可研|可行性|项目建议书|投资估算/u,type:"可研/项目建议类文档",dimensions:["建设必要性","方案比选","投资估算","风险分析","实施效益"]},{pattern:/运维|维护|保养|巡检/u,type:"运维维护方案",dimensions:["巡检频次","维护流程","故障响应","备品备件","记录闭环"]}].find(a=>a.pattern.test(b));return{type:c?.type||"施工组织设计/施工技术方案",dimensions:c?.dimensions||["工程概况","施工部署","进度质量安全","资源配置","施工工艺和验收闭环"],requiredEvidencePolicy:"本地知识库为完整事实源;系统暂未确认的事实必须通过扩大检索、事实补抽或落位修复解决,不得归因为用户资料缺失。"}}({template:z,chapters:bh,requirement:a.requirement}),knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea,retrievalCoverage:aw,qualityReport:ec,repairStrategies:ed,reviewChecklist:ee,workflowVersion:a7,telemetry:ef}},markdown:d1}}async function dz(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,h.aY)());if(!f)throw Error("No knowledge base project found");let g=(0,h.Qh)(),i=(0,d.Vh)(b),k=b2(f,i),l=(0,j.XB)("file"),m=new Map(i.flatMap(a=>b0(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(i.flatMap(a=>b0(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=dx(await g.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=dr(c,c.queries,[]),s=ds(c,[]);for(let a of r.slice(0,s)){let b=await g.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=>b1(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=dq(c,p.filter(a=>b1(f,a.filePath,k)),{maxItems:dt(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,E.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(K),"",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}
|
|
209
|
+
为保证施工组织设计在实施阶段具备可检查、可追溯和可闭合的管理效果,项目部将在开工准备、样板确认、材料进场、工序交接、隐蔽验收、质量复核、安全巡查、进度纠偏和资料归档等环节同步建立责任清单。各专业负责人应围绕本项目已明确的工期、质量、安全文明施工、现场条件和招标响应要求,形成“计划交底、过程检查、问题整改、复核销项、资料留痕”的闭环机制。对影响关键线路、专业穿插、材料供应、机械进退场和成品保护的事项,及时组织专题协调并落实到责任岗位,确保本施工组织设计中的技术措施、资源计划和管理要求能够落到现场执行。
|
|
210
|
+
|
|
211
|
+
实施过程中,项目经理部应将招标文件、图纸设计说明、工程量清单、现场踏勘条件和业主节点要求统一转化为周计划、日协调、专业交底和验收清单。对拆除、加固、装饰、安装、消防、弱电、暖通、给排水、电气等专业穿插作业,应明确作业面移交条件、材料到场状态、机械设备进退场安排、临时设施保障和安全文明施工责任。对发现的偏差,应在当日形成整改责任、完成时限和复核结论,避免问题跨工序传递。
|
|
212
|
+
|
|
213
|
+
资料管理方面,应同步收集设计交底、图纸会审、深化确认、材料报审、样板验收、隐蔽验收、检验批验收、试验检测、质量整改、安全巡查、文明施工检查和竣工移交资料。各项记录应与现场实体进度保持一致,做到施工过程可追踪、质量责任可核查、整改闭环可验证、竣工交付可移交。通过上述闭环管理,确保工期目标、质量目标、安全文明目标和资源保障目标在施工全过程中持续受控。`}(c,bE.minChars),b))},g=a=>{b=a.map(a=>{let b=bh.find(b=>b.id===a.id)||a;return{...a,sections:a.sections||[],content:dh(a.content,b)}}),f()},h=()=>e.filter(df).map(a=>aP(a)).slice(0,24),i=async(d,e)=>{if(!bE.minChars||!bF.enableDocumentBudgetExpansion||(0,aD.V7)(c)>=bE.minChars||bE.maxChars&&(0,aD.V7)(c)>=bE.maxChars)return!1;let g=(0,aD.V7)(c);b=(await I(()=>cS({template:z,chapters:b,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal,onRoundProgress:(a,c)=>{b=a.map(a=>({...a,sections:a.sections||[]})),bK(c4,bJ({type:"validation",roleId:d,status:"running",message:`${e}:第 ${c.round}/${c.maxRounds} 轮,当前 ${c.totalChars} 字,新增 ${c.addedChars} 字`},{subtitle:e})),F(b,c4)}}),c4)).map(a=>({...a,sections:a.sections||[]})),f();let h=(0,aD.V7)(c);return c4.push(bJ({type:"validation",roleId:d,status:h<bE.minChars?"fallback":"success",message:`${e}:当前 ${h} 字,新增 ${Math.max(0,h-g)} 字,目标下限 ${bE.minChars} 字`},{subtitle:e})),h>g},j=[];f();for(let d=0;d<5;d+=1){if((0,aG.Te)(a.signal),await i(`default-budget-repair-${d+1}`,0===d?"默认路径预算补齐":"默认路径预算再补齐"))continue;let f=h(),k=f.length>0&&f.every(a=>/正文篇幅低于目标字数|正文长度低于提示词要求/u.test(a));if(0===f.length||k)break;let l=await I(()=>bN(bG,"default-path-quality-repair",()=>b_({markdown:c,template:z,chapters:b,promptTexts:ai,requirement:a.requirement,issues:f,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:f.length,round:d+1}),c4);if(l.stage&&j.push({...l.stage,message:`${l.stage.message||"默认路径质量修复完成"};第 ${d+1} 轮,触发问题 ${f.length} 个`}),l.chapters===b)break;g(l.chapters);let m=aQ(f,e).slice(0,8);if(0===m.length)continue;let n=await I(()=>bN(bG,"default-path-quality-repair-escalation",()=>b_({markdown:c,template:z,chapters:b,promptTexts:ai,requirement:a.requirement,issues:m,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:m.length,round:d+1}),c4);n.chapters!==b&&g(n.chapters),j.push(bJ({type:"llm_review",roleId:`default-repair-verify-${d+1}`,status:e.some(a=>m.some(b=>aO(b)===aO(a)))?"fallback":"success",message:`修复后验证闭环完成:第 ${d+1} 轮升级修复 ${m.length} 个残留问题`,details:m},{subtitle:"修复后验证"}))}let k=(0,aE.Ai)(e,cz,b),l=[...c4,...j].map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:k.blockingIssues.length>0?"failed":"success",message:`阻断 ${k.blockingIssues.length},问题 ${e.length}`}:"export_ready"===a.type?{...a,status:k.passed?"success":"failed",message:k.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);l.push(bJ({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;默认路径已执行本地硬规则校验与必要的精准局部修复;如需开启重型复审请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let m=b.map(a=>({...a,evidence:J(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...c5,chapters:m,validationIssues:e,exportGate:k,executionStages:l,partialChapters:b.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:m,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bG},markdown:c}}(0,aG.Te)(a.signal);let c7=C.map(a=>{let b=bY({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:bE.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,aD.V7)(a.content)}}),c8=c7.filter(a=>"pass"!==a.status).length,c9=bF.enableChapterReview&&c8>0;c9&&(bK(c4,bJ({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${c8}/${C.length} 章存在本地风险`,details:["仅对本地扫描发现风险的生成结果触发 LLM 审查,按风险章节自然并行"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),F(C,c4));let da=c9?await I(()=>bN(bG,"chapter-review",()=>cT({template:z,chapters:C,budget:bE,promptTexts:am||ai,requirement:a.requirement,strategy:bF,diagnostics:bG,signal:a.signal}),{chapters:C.length}),c4):{summaries:c7,stage:bJ({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bF.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};c4.push(da.stage);let dj=da.summaries,dk=dj.filter(a=>"pass"!==a.status&&a.issues.length>0);if(dk.length>0){bK(c4,bJ({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${dk.length} 章`,details:dk.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:dk.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),F(C,c4);let b=new Map,c=0,d=Math.max(1,dk.length||1);for(let e=0;e<dk.length;e+=d){(0,aG.Te)(a.signal);let f=dk.slice(e,e+d);for(let d of(await Promise.all(f.map(async b=>{let c=C.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await bi(d=>bZ({template:z,chapter:c,issues:b.issues.slice(0,4),promptTexts:am||ai,requirement:a.requirement,forbidDrawingImages:cE,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 e=0,f=new Set;for(let a=0;a<C.length;a+=1){let c=b.get(C[a].id);c&&c!==C[a].content&&(C[a]={...C[a],content:c},f.add(C[a].id),e+=1)}e>0&&(dj=dj.map(a=>f.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aD.V7)(C.find(b=>b.id===a.chapterId)?.content||"")}:a),c6=aC({...c5,chapters:C,validationIssues:cD,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag})),c4.push(bJ({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${e} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),F(C,c4)}if(c9){let a=dj.filter(a=>"pass"!==a.status&&a.issues.length>0).map(a=>({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"}));cD=aM(cD,a)}let dl=bF.enableGlobalReview&&(c9||cD.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));dl&&(bK(c4,bJ({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),F(C,c4));let dy=dl?await I(()=>bN(bG,"global-consistency-review",()=>cU({template:z,chapters:C,chapterReviews:dj,promptTexts:am||ai,requirement:a.requirement,projectContext:bn,diagnostics:bG,signal:a.signal}),{chapters:C.length}),c4):{issues:[],stage:bJ({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bF.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};c4.push(dy.stage),cD=aM(cD,dy.issues.map(a=>({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"}))),F(C,c4);let dz=C.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aD.V7)(a.content)<Math.floor(.7*(bE.chapterTargets.get(a.id)||1200))||dj.some(b=>b.chapterId===a.id&&"fail"===b.status)||bY({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:bE.chapterTargets.get(a.id)||1200}).length>0),dA=c3>0||dy.issues.length>0||dj.some(a=>"fail"===a.status)||cD.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),dB=bF.enableFinalQualityReview&&(dA||dz.length>Math.max(3,Math.floor(.35*C.length))),dC=Date.now();dB&&(bK(c4,bJ({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${dz.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),F(C,c4));let dD=J(av,{maxItems:Math.max(32,8*bh.length),maxChars:Math.max(36e3,6e3*bh.length),preservePinned:!0}),dE=dB?await I(()=>cV({template:z,spec:Y,markdown:c6,evidence:dD,promptTexts:am||ai,projectContext:bn,requirement:a.requirement,diagnostics:bG,signal:a.signal}),c4):{markdown:c6,stage:{type:"llm_review",roleId:"llm-review",status:dz.length>0?"fallback":"success",message:dz.length>0?`本地风险扫描发现 ${dz.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};dE.stage.message=bL(dE.stage.message||"LLM 审查完成",dC),(0,aG.Te)(a.signal);let dF=dg(aB(dE.markdown===c6?aC({...c5,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}):dE.markdown,C,{forbidDrawingImages:cE,promptRules:ag}).markdown,cD),dG=az(dF,z).map(a=>aP(a)),dH=(0,aE.bM)(dF).map(a=>aP(a)),dI=(0,aE.mR)(dF,z).map(a=>aP(a)),dJ=(0,aE.N1)(dF,cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dK=ag.forbidToc?[]:[...(0,aE.gN)(dF),...(0,aE.f8)(dF)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dL=(0,aE.k0)(dF).map(a=>aP(a)),dM=(0,aE.qK)(dF,C).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dN=(b={markdown:dF,chapters:C,factsModel:cz},[...(0,aE.ji)(b.chapters),...(0,aE.i0)(b.chapters),...(0,aE.ST)(b.chapters),...(0,aE.xX)(b.chapters),...(0,aE.qm)(b.markdown,b.factsModel),...aJ(b.markdown,b.factsModel),...aK(b.markdown),...aL(b.chapters),...(0,aE.vY)(b.markdown,b.factsModel)]).map(a=>aP(a)),dO=(0,aE.iC)(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dP=(0,aE.BV)(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dQ=function(...a){return a.flat()}(dG,dH,dI,dJ,dK,dL,dM,dN,dO,dP,(0,aE.Ty)(C).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),al(dF).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)),dR=new Set(dM),dS=Date.now(),dT=dQ.filter(a=>!dR.has(a));bK(c4,bJ({type:"llm_review",roleId:"quality-repair",status:dT.length>0?"running":"success",message:dT.length>0?`正在进行精准质量修复:${dT.length} 个问题`:"未发现需要精准修复的问题",details:dT,progress:{current:1,total:Math.max(1,dT.length),label:"质量修复"}},{subtitle:"精准质量修复"})),F(C,c4);let dU=await I(()=>bN(bG,"local-patch-quality-repair",()=>b_({markdown:dF,template:z,chapters:C,promptTexts:ai,requirement:a.requirement,issues:dT,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:dT.length}),c4);dU.stage&&(dU.stage.message=bL(dU.stage.message||"质量修复完成",dS)),(0,aG.Te)(a.signal);let dV=dU.stage?[...c4,dE.stage,dU.stage]:[...c4,dE.stage],dW=dU.chapters,dX=aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dY=aQ(dT,[...az((c={markdown:dX=dg(dX,cD),chapters:dW,template:z,factsModel:cz}).markdown,c.template),...(0,aE.bM)(c.markdown),...(0,aE.k0)(c.markdown),...(0,aE.ji)(c.chapters),...(0,aE.i0)(c.chapters),...(0,aE.ST)(c.chapters),...(0,aE.xX)(c.chapters),...(0,aE.qm)(c.markdown,c.factsModel),...aJ(c.markdown,c.factsModel),...aK(c.markdown),...aL(c.chapters),...(0,aE.vY)(c.markdown,c.factsModel)]).slice(0,8);if(dY.length>0){let b=await I(()=>bN(bG,"local-patch-quality-repair-escalation",()=>b_({markdown:dX,template:z,chapters:dW,promptTexts:ai,requirement:a.requirement,issues:dY,forbidDrawingImages:cE,strategy:bF,diagnostics:bG,signal:a.signal}),{issues:dY.length}),dV);dW=b.chapters,dX=dg(dX=aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),cD),dV=b.stage?[...dV,{...b.stage,roleId:"quality-repair-escalation",message:`修复后验证发现残留问题,已升级修复 ${dY.length} 个问题`}]:dV}let dZ=(0,aE.yw)(dX,dW.map(a=>({...a,sections:aj(a.content)}))).filter(a=>"empty"===a.reason||"table_only"===a.reason);if(dZ.length>0){let b=Date.now();bK(dV,bJ({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${dZ.length} 个问题`,details:dZ.map(a=>a.message),progress:{current:1,total:dZ.length,label:"小节补写"}},{subtitle:"小节内容补写"})),F(dW,dV);let c=[...dW];for(let b=0;b<dW.length;b+=Math.max(1,dW.length||1)){(0,aG.Te)(a.signal);let d=dW.slice(b,b+Math.max(1,dW.length||1));(await Promise.all(d.map(async b=>{let c=dZ.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=bE.chapterTargets.get(b.id)||1200,f=bT(d,bf);try{let g=await bi(g=>cQ({template:z,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ai,projectContext:bn,requirement:a.requirement,roleContext:bV(aZ,d,f),targetWords:e,forbidDrawingImages:cE,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=aj(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dW=c;let d=(0,aE.qK)(aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dW);bK(dV,bJ({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:bL(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),F(dW,dV)}let d$=(0,aD.fW)(bE,dW.map(a=>a.content).join("\n\n"));if(bF.enableDocumentBudgetExpansion&&bE.minChars&&d$.currentChars<Math.floor(.9*bE.minChars)&&(!bE.maxChars||d$.currentChars<bE.maxChars)){let b=Date.now(),c=d$.currentChars;bK(dV,bJ({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bE.minChars} 字`,`章节数:${dW.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),F(dW,dV),dW=await I(()=>cS({template:z,chapters:dW,budget:bE,promptTexts:ai,requirement:a.requirement,forbidDrawingImages:cE,signal:a.signal}),dV);let d=(0,aD.fW)(bE,dW.map(a=>a.content).join("\n\n"));bK(dV,bJ({type:"validation",roleId:"document-budget-repair",status:bE.minChars&&d.currentChars<bE.minChars?"fallback":"success",message:bL(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let d_=aB(aC({...c5,chapters:dW,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),dW,{forbidDrawingImages:cE,promptRules:ag}),d0=d_.chapters,d1=d_.markdown,d2=(0,aE.yw)(d1,d0.map(a=>({...a,sections:aj(a.content)}))).filter(a=>"empty"===a.reason||"table_only"===a.reason);if(d2.length>0){let b=Date.now();bK(dV,bJ({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${d2.length} 个问题`,details:d2.map(a=>a.message),progress:{current:1,total:d2.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),F(d0,dV);let c=[...d0];for(let b=0;b<d0.length;b+=Math.max(1,d0.length||1)){(0,aG.Te)(a.signal);let d=d0.slice(b,b+Math.max(1,d0.length||1));(await Promise.all(d.map(async b=>{let c=d2.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=bE.chapterTargets.get(b.id)||1200,f=bT(d,bf);try{let g=await bi(g=>cQ({template:z,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ai,projectContext:bn,requirement:a.requirement,roleContext:bV(aZ,d,f),targetWords:e,forbidDrawingImages:cE,forcedSections:c,signal:g}),Math.min(3e5,Math.max(9e4,9e4*c.length)),a.signal);if(!g)return b;let h=aj(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}d0=(d_=aB(aC({...c5,chapters:c,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),c,{forbidDrawingImages:cE,promptRules:ag})).chapters,d1=d_.markdown;let d=(0,aE.qK)(d1,d0);bK(dV,bJ({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:bL(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),F(d0,dV)}d0=(d_=aB(aC({...c5,chapters:d0,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),d0,{forbidDrawingImages:cE,promptRules:ag})).chapters,d1=db(c0(d_.markdown,ch),ch);let d3=bH({facts:ch,markdown:d1});d3.size>0&&c4.push({type:"fact_extraction",roleId:"canonical-facts",status:"success",message:`已决策可信基础事实 ${d3.size} 项`,details:[...d3.values()].map(a=>`${a.label}=${a.value}(${a.source},confidence=${a.confidence})`).slice(0,12)});let d4=[...dG];cD=aM((0,aE.kQ)(Y,[...cD,...d4.map(a=>({level:"warning",message:a}))],cz,d0,d1,V,P),x({markdown:d1,spec:Y,summary:W}),B({markdown:d1,facts:ch,summary:W,profile:Z}),y(d1,W),dc(d1,ch),a2({markdown:d1,chapters:d0,factsModel:cz,template:z,promptBindings:P,promptDocumentRules:ag}));let d5=dn(d0,ch,d1);d5.patchedCount>0&&(d0=d5.chapters.map(a=>({...a,sections:a.sections||[]})),cD=[...cD,{level:"info",message:`最终审查阶段已补写未落位事实 ${d5.patchedCount} 项`,suggestion:"补写仅使用本项目资料明确事实,未补写商务敏感信息或系统暂未确认内容。"}],d1=aB(aC({...c5,chapters:d0,validationIssues:cD,exportGate:c5.exportGate,executionStages:c4},{forbidDrawingImages:cE,promptRules:ag}),d0,{forbidDrawingImages:cE,promptRules:ag}).markdown),cD=aM(cD,function(a,b,c={}){return dm(a,b,{maxItems:c.maxIssues}).map(a=>({level:"warning",message:`已确认事实未在正文中落位:${a.label}=${a.value}`,suggestion:"请将该事实自然写入对应章节或小节,不得改变原始数值和单位。"}))}(d1,[...ch,...cz.preciseFacts],{maxIssues:30})),d1=aB(d1,d0,{forbidDrawingImages:cE,promptRules:ag}).markdown;let d6=(0,aD.ty)(bE,d1),d7=(0,aD.PE)(z.generationSettings||z.exportSettings,d1).filter(a=>!(bE.minPages&&/低于目标页数/u.test(a.message)));cD=aN(aM(cD,d7,d6,az(d1,z),ay(d1,ag)));let d8=function(a){let b=a.chapters.map(b=>{let c=function(a){let b=["project"];return/进度|工期|节点|部署/u.test(a.title)&&b.push("schedule"),/质量|验收|材料/u.test(a.title)&&b.push("quality","rules"),/安全|文明|风险|危大/u.test(a.title)&&b.push("safety","rules"),/资源|材料|设备|劳动力|机械/u.test(a.title)&&b.push("resources"),/施工|工艺|技术|方案|清单|工程量|图纸/u.test(a.title)&&b.push("quantities"),[...new Set(b)]}(a.templateChapters.find(a=>a.id===b.id||a.title===b.title)||b),d=c.filter(c=>{var d;return d=a.factsModel,("project"===c?d.project.length>0||d.preciseFacts.length>0:"schedule"===c?d.schedule.length>0:"quality"===c?d.quality.length>0||d.specifications.length>0:"safety"===c?d.safety.length>0||d.rules.length>0:"resources"===c?d.resources.length>0||d.bills.length>0:"quantities"===c?d.bills.length>0||d.drawings.length>0||d.tables.length>0:"rules"===c&&(d.rules.length>0||d.specifications.length>0))||(b.evidence||[]).some(a=>RegExp(a3[c]||c,"u").test(`${a.sectionTitle||""} ${a.content||""}`))}),e=c.filter(a=>!d.includes(a)),f=c.length?Math.round(d.length/c.length*100):100;return{chapterId:b.id,title:b.title,requiredDomains:c,confirmedDomains:d,unconfirmedDomains:e,score:f}}),c=new Set(a.evidence.map(a=>a.filePath).filter(Boolean)),d=b.length?Math.round(b.reduce((a,b)=>a+b.score,0)/b.length):100;return{score:d,evidenceCount:a.evidence.length,confirmedFiles:c.size,chapterReports:b,unconfirmedDomains:[...new Set(b.flatMap(a=>a.unconfirmedDomains))],remediation:d>=95?"知识库事实覆盖已达到高置信交付要求。":"系统需扩大本地知识库检索、补抽结构化事实,并将已确认事实落位到对应章节。"}}({chapters:d0,templateChapters:bh,factsModel:cz,evidence:av}),d9=function(a,b){let c=new Set,d=[];for(let e of[...b.project,...b.schedule,...b.quality,...b.safety,...b.resources,...b.preciseFacts,...b.bills,...b.drawings,...b.rules,...b.specifications]){let b=(0,aG.lG)(e.value).replace(/\s+/gu," ").trim(),f=e.fieldName||e.key||e.fieldId||"资料事实",g=`${f}:${b}`;!b||c.has(g)||(c.add(g),d.push({label:f,value:b,sourceFile:e.sourceFile,status:!function(a,b){let c=a4(a),d=a4(b);return!!(!d||d.length<2||c.includes(d))||(b.match(/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年|万元|元|平方米|㎡|m²|立方米|m³|米|m|mm|cm|台|套|人|项|%|MPa|kPa)?/giu)||[]).some(a=>a4(a).length>=2&&c.includes(a4(a)))}(a,b)?"unplaced":"used",confidence:e.confidence}))}return d}(d1,cz),ea=(p={chapters:d0,templateChapters:bh,factsModel:cz}).chapters.map(a=>{let b=p.templateChapters.find(b=>b.id===a.id||b.title===a.title),c=function(a,b){let c=`${a.title} ${(b?.sections||a.sections||[]).join(" ")}`;return[{key:"structure",label:"结构完整",passed:(a.sections||b?.sections||[]).length>=2||/###\s+/u.test(a.content)},{key:"depth",label:"内容深度",passed:(0,aD.V7)(a.content)>=600},{key:"evidence",label:"证据绑定",passed:(a.evidence||[]).length>0},{key:"professional",label:"专业控制点",passed:/验收|复核|检查|交底|控制点|整改|闭环|台账|进场|工序/u.test(a.content)},{key:"schedule",label:"工期支撑",passed:!/进度|工期|节点/u.test(c)||/工期|节点|计划|纠偏|资源|穿插/u.test(a.content)},{key:"quality",label:"质量验收",passed:!/质量|验收/u.test(c)||/质量|验收|复验|隐蔽|检验批|整改/u.test(a.content)},{key:"safety",label:"安全闭环",passed:!/安全|文明|风险|危大/u.test(c)||/风险|检查|整改|应急|培训|交底/u.test(a.content)}]}(a,b),d=c.filter(a=>a.passed).length;return{chapterId:a.id,title:a.title,score:c.length?Math.round(d/c.length*100):100,checks:c,action:d===c.length?"章节覆盖完整。":"系统需补齐章节结构、证据绑定、专业控制点和跨章依赖。"}});cD=aN(aM(cD,d8.score>=85?[]:[{level:"warning",message:`系统知识库覆盖确认率偏低:${d8.score}%`,suggestion:`${d8.remediation} 未确认事实域:${d8.unconfirmedDomains.map(a=>a3[a]||a).join("、")||"无"}`}],function(a,b={}){return a.filter(a=>"unplaced"===a.status&&/项目|工程|编号|地点|规模|范围|工期|质量|安全|资源|材料|设备|验收|\d/u.test(`${a.label}${a.value}`)).slice(0,b.maxIssues||20).map(a=>({level:"warning",message:`已确认知识库事实未落位:${a.label}=${a.value}`,suggestion:`请将该事实落位到对应章节,并保持来源 ${a.sourceFile||"结构化事实主表"} 的原始口径。`}))}(d9,{maxIssues:20}),ea.filter(a=>a.score<80).map(a=>({level:"warning",message:`章节覆盖不足:${a.title} ${a.score}%`,suggestion:`${a.action} 未通过项:${a.checks.filter(a=>!a.passed).map(a=>a.label).join("、")}`})),aw.filter(a=>a.risk.highRisk&&(0===a.requiredFactTotal?a.evidenceCount<8:a.requiredFactCovered<a.requiredFactTotal)).map(a=>({level:"warning",message:`系统延迟切片召回覆盖需复核:${a.chapterTitle}`,suggestion:`知识库总切片 ${a.risk.totalChunks},当前预加载 ${a.risk.loadedChunks},已启用深召回;事实覆盖 ${a.requiredFactCovered}/${a.requiredFactTotal},小节覆盖 ${a.sectionCovered}/${a.sectionTotal}。`}))));let eb=(0,aE.Ai)(cD,cz,d0),ec=a6({markdown:d1,chapters:d0,issues:cD,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea}),ed=function(a){let b=[],c=a.issues.filter(a=>"error"===a.level);c.length>0&&b.push({priority:"high",title:"阻断问题修复",action:`修复 ${c.length} 个导出阻断问题,优先处理事实冲突、结构缺失、模板规则违规和占位残留。`});let d=(a.factTraces||[]).filter(a=>"unplaced"===a.status).slice(0,10);d.length>0&&b.push({priority:"high",title:"事实落位修复",action:`将 ${d.length} 项已确认知识库事实写入对应章节,保持原始数值、单位和来源口径。`}),a.knowledgeCoverage&&a.knowledgeCoverage.score<95&&b.push({priority:"medium",title:"知识库确认覆盖修复",action:"扩大本地知识库检索范围,执行事实补抽和章节证据重分配;这是系统检索、抽取、落位问题,不要求用户追加资料。"});let e=(a.chapterCoverage||[]).filter(a=>a.score<80).slice(0,8);return e.length>0&&b.push({priority:"medium",title:"章节覆盖修复",action:`补齐低覆盖章节:${e.map(a=>a.title).join("、")}。`}),a.qualityReport&&!a.qualityReport.passed&&b.push({priority:"medium",title:"交付置信度修复",action:a.qualityReport.actions.join(" ")}),b}({issues:cD,qualityReport:ec,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea});cD=aN(aM(cD,(q=ec).passed?[]:[{level:"warning",message:`交付置信度未达目标:${q.deliveryProbability}% / ${q.target}%`,suggestion:q.actions.join(" ")}],ed.filter(a=>"high"===a.priority).map(a=>({level:"warning",message:`修复策略待执行:${a.title}`,suggestion:a.action})))),eb=(0,aE.Ai)(cD,cz,d0),ec=a6({markdown:d1,chapters:d0,issues:cD,knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea});let ee=[{key:"export-gate",label:"导出门禁",passed:(r={exportGate:eb,qualityReport:ec,repairStrategies:ed}).exportGate.passed,message:r.exportGate.passed?"导出门禁通过":`仍有 ${r.exportGate.blockingIssues.length} 个阻断问题`},{key:"delivery-probability",label:"交付置信度",passed:r.qualityReport.passed,message:`${r.qualityReport.deliveryProbability}% / ${r.qualityReport.target}%`},{key:"factuality",label:"事实准确性",passed:r.qualityReport.scores.factuality>=85,message:`${r.qualityReport.scores.factuality}/100`},{key:"evidence-coverage",label:"知识库证据覆盖",passed:r.qualityReport.scores.evidenceCoverage>=85,message:`${r.qualityReport.scores.evidenceCoverage}/100`},{key:"professional-depth",label:"专业深度",passed:r.qualityReport.scores.professionalDepth>=80,message:`${r.qualityReport.scores.professionalDepth}/100`},{key:"repair-strategies",label:"修复策略",passed:0===r.repairStrategies.filter(a=>"high"===a.priority).length,message:r.repairStrategies.map(a=>a.title).join("、")||"无高优先级修复策略"}],ef=function(a){let b=[...a.diagnostics.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>({name:a.name,durationMs:a.durationMs}));return{llmCalls:a.diagnostics.llm.calls,llmFailures:a.diagnostics.llm.failures,maxParallelLlm:a.diagnostics.llm.maxActive,searchQueries:a.diagnostics.evidence.searchQueries,evidenceContextChars:a.diagnostics.evidence.contextChars,qualityIssues:{...a.diagnostics.quality},slowMetrics:b,elapsedMs:a.startedAt&&a.endedAt?a.endedAt-a.startedAt:void 0}}({diagnostics:bG}),eg=eb.blockingIssues.length,eh=(0,aE.Ff)(cD);bG.quality.blockingCount+=eh.blocking,bG.quality.importantCount+=eh.important,bG.quality.minorCount+=eh.minor;let ei=dV.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:eg>0?"failed":"success",message:`阻断 ${eg},问题 ${cD.length}`}:"export_ready"===a.type?{...a,status:eb.passed?"success":"failed",message:eb.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);ei.push(bJ({type:"validation",roleId:"document-delivery-score",status:ec.passed?"success":"fallback",message:ec.summary,details:ec.actions},{subtitle:"交付评分"})),ei.push(bJ({type:"reference",roleId:"knowledge-coverage",status:d8.score>=85?"success":"fallback",message:`知识库确认覆盖率:${d8.score}%(证据 ${d8.evidenceCount} 条,文件 ${d8.confirmedFiles} 份)`,details:[d8.remediation]},{subtitle:"知识库覆盖"})),ei.push(bJ({type:"validation",roleId:"document-review-checklist",status:ee.every(a=>a.passed)?"success":"fallback",message:`交付复核清单:通过 ${ee.filter(a=>a.passed).length}/${ee.length}`,details:ee.map(a=>`${a.passed?"通过":"待修复"}:${a.label}${a.message?`(${a.message})`:""}`)},{subtitle:"交付复核"}));let ej=[...bG.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");ei.push(bJ({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bG.llm.calls} 次,失败 ${bG.llm.failures} 次,峰值并行 ${bG.llm.maxActive},检索 ${bG.evidence.searchQueries} 次/${Math.round(bG.evidence.searchMs/1e3)} 秒,证据上下文 ${bG.evidence.contextChars} 字,噪声过滤 ${bG.evidence.filteredNoise} 条,质量问题 阻断${bG.quality.blockingCount}/重要${bG.quality.importantCount}/轻微${bG.quality.minorCount}${ej?`,Top耗时:${ej}`:""}`},{subtitle:"后台诊断"}));let ek=d0.map(a=>({...a,evidence:J(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...c5,chapters:ek,validationIssues:cD,exportGate:eb,executionStages:ei,partialChapters:d0.map(a=>({id:a.id,title:a.title,chars:(0,aD.V7)(a.content),status:cW(a,bE.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:ek,reviewMetadata:{chapterSummaries:dj,globalIssues:dy.issues,diagnostics:bG,profile:function(a){let b=`${a.template.name} ${a.template.outputTitle||""} ${a.requirement||""} ${a.chapters.map(a=>a.title).join(" ")}`,c=[{pattern:/专项施工|危大|专项方案/u,type:"专项施工方案",dimensions:["专项对象边界","工艺参数","风险控制","验收要求","应急措施"]},{pattern:/投标|技术标|响应|招标/u,type:"投标技术方案",dimensions:["招标响应","技术优势","工期质量安全承诺","资源保障","履约可实施性"]},{pattern:/监理|旁站|巡视|平行检验/u,type:"监理规划/细则",dimensions:["监理目标","旁站巡视","平行检验","验收程序","资料签认"]},{pattern:/可研|可行性|项目建议书|投资估算/u,type:"可研/项目建议类文档",dimensions:["建设必要性","方案比选","投资估算","风险分析","实施效益"]},{pattern:/运维|维护|保养|巡检/u,type:"运维维护方案",dimensions:["巡检频次","维护流程","故障响应","备品备件","记录闭环"]}].find(a=>a.pattern.test(b));return{type:c?.type||"施工组织设计/施工技术方案",dimensions:c?.dimensions||["工程概况","施工部署","进度质量安全","资源配置","施工工艺和验收闭环"],requiredEvidencePolicy:"本地知识库为完整事实源;系统暂未确认的事实必须通过扩大检索、事实补抽或落位修复解决,不得归因为用户资料缺失。"}}({template:z,chapters:bh,requirement:a.requirement}),knowledgeCoverage:d8,factTraces:d9,chapterCoverage:ea,retrievalCoverage:aw,qualityReport:ec,repairStrategies:ed,reviewChecklist:ee,workflowVersion:a7,telemetry:ef}},markdown:d1}}async function dz(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,h.aY)());if(!f)throw Error("No knowledge base project found");let g=(0,h.Qh)(),i=(0,d.Vh)(b),k=b2(f,i),l=(0,j.XB)("file"),m=new Map(i.flatMap(a=>b0(f,a.filePath).map(b=>[b,a.roleId]))),n=new Map(i.flatMap(a=>b0(f,a.filePath).map(b=>[b,l.find(b=>b.id===a.roleId)?.processingType||"reference"]))),o=dx(await g.getProject(f),[...k],a.maxEvidencePerChapter),p=[],q=[...k].filter(Boolean).sort(),r=dr(c,c.queries,[]),s=ds(c,[]);for(let a of r.slice(0,s)){let b=await g.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=>b1(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=dq(c,p.filter(a=>b1(f,a.filePath,k)),{maxItems:dt(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,E.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(K),"",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}
|
|
204
214
|
${a.category}
|
|
205
215
|
${a.format}
|
|
206
216
|
${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},52511:(a,b,c)=>{c.d(b,{Bh:()=>B,C1:()=>H,DX:()=>I,N6:()=>J,QJ:()=>A,Vh:()=>O,bV:()=>E,bj:()=>y,dU:()=>x,h0:()=>D,jG:()=>z,wR:()=>L,xm:()=>C,zY:()=>N});var d=c(73024),e=c(76760),f=c(48161),g=c(77598),h=c(44533),i=c(25840),j=c(8753),k=c(6444),l=c(85441),m=c(92808),n=c(81125),o=c(56942);function p(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function q(){return e.join(p(),"document-templates.json")}function r(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function s(){try{let a=q();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(q(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(a){return(0,g.createHash)("sha256").update(a).digest("hex").slice(0,12)}function v(a){return a.replace(/\s+/gu," ").trim().slice(0,160)}function w(a){let b=function(){try{let a=JSON.parse(d.readFileSync(e.join(p(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content,source:"custom"}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8"),source:"file"}}}function x(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=w(c.promptId);a&&b.push({...a,roleId:c.roleId,contentHash:u(a.content),contentPreview:v(a.content)})}return b}function y(a){let b=K(a),c=(0,i.XB)("prompt"),d=N(a),e=[],f=[];if(b)for(let a of b.promptRoles){let b=c.find(b=>b.id===a.roleId);if(!b){e.push(a.roleId);continue}0===(b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]).length&&f.push(a.roleId)}let g=M(d),h=[];for(let a of g){let b=w(a.promptId);if(!b)continue;let d=c.find(b=>b.id===a.roleId),e=d?.executionType||function(a){var b;return b=a,/extract|extraction|抽取|清单|图纸|品牌/u.test(b)?"fact_extraction":/validation|校验|审查|审核/u.test(b)?"validation":/format|排版/u.test(b)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(b)?"chapter_generation":"reference"}(a.roleId),f=function(a,b,c=""){let d=`${a} ${b} ${c}`;return/extract|extraction|抽取|清单|图纸|品牌|识别/u.test(d)?"extraction":/format|排版/u.test(d)?"formatting":/总控|writer|施工组织设计总控|写作主控/u.test(d)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(d)?"chapter":"reference"}(a.roleId,e,b.name);h.push({...b,roleId:a.roleId,contentHash:u(b.content),contentPreview:v(b.content),executionType:e,category:f,bindingSource:"projectRole"})}return{bindings:g,prompts:h,writerPrompts:h.filter(a=>"writer"===a.category),chapterPrompts:h.filter(a=>"chapter"===a.category),extractionPrompts:h.filter(a=>"extraction"===a.category),formattingPrompts:h.filter(a=>"formatting"===a.category),referencePrompts:h.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(e)],missingResourceRoles:[...new Set(f)]}}function z(){let a=(0,j.V)().templates,b=s().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function A(a){return z().find(b=>b.id===a)}function B(a){let b=r(a),c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}async function C(a,b=(0,h.aY)()){let c,d=A(a),f=[];if(!d)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let g=(0,i.XB)("prompt"),j=(0,i.XB)("file"),m=J(d),p=K(d);m||f.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),m&&!p&&f.push({level:"error",message:`项目角色配置不存在或已删除:${m}`}),d.promptIds?.length&&f.push({level:"warning",message:"模板存在旧 promptIds 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.promptBindings?.length&&f.push({level:"warning",message:"模板存在旧 promptBindings 字段残留,该字段已不参与生成,请清理模板历史数据。"}),d.boundFilePaths?.length&&f.push({level:"warning",message:"模板存在旧 boundFilePaths 字段残留,生成只使用项目角色配置和显式文件角色绑定。"});let q=N(d),r=O(d);p&&0===p.promptRoles.length&&f.push({level:"error",message:"项目角色配置未配置提示词角色。"}),p&&p.promptRoles.length>0&&0===q.length&&f.push({level:"error",message:"项目角色配置中的提示词角色未绑定任何有效提示词资源。"});let s=e.resolve(b),t=(0,h.Yy)(s),u=function(a,b){if(0===a.length)return a;let c=new Set(b.map(a=>a.relativePath)),d=[],e=new Set;for(let f of a){let a=f.filePath.replace(/^\/+|\/+$/gu,"");for(let g of c.has(a)?[a]:b.filter(b=>{var c;return b.relativePath.startsWith(`${a}/`)&&"disk"!==(c=b).status&&"error"!==c.status&&Number(c.indexedAt||0)>0&&Number(c.chunkCount||0)>0}).map(a=>a.relativePath)){let a=`${f.roleId}
|