@customize-agent/server 4.0.88 → 4.0.89

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.
@@ -13,7 +13,7 @@
13
13
  `);return b}(b);if(!c.trim())return[];let d=a.replace(e.ug," ");for(let a of c.matchAll(e.QX)){let b=(a[1]||"").replace(e.ug," ").trim();if(b&&d.includes(b))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前绑定材料生成的正文。"}]}return[]}},25840:(a,b,c)=>{c.d(b,{DZ:()=>v,FV:()=>u,Mu:()=>w,NR:()=>x,XB:()=>s,dg:()=>t,dw:()=>y,ov:()=>C,tl:()=>B});var d=c(73024),e=c(48161),f=c(76760),g=c(47899),h=c(8753);function i(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function j(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,g.hH)}function k(a=[]){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function l(a){if(!Array.isArray(a))return[];let b=[];for(let c=0;c<a.length;c+=1){let d=a[c];d.roleId&&b.push({roleId:d.roleId,order:Number.isFinite(d.order)?d.order:c})}return function(a=[]){let b=new Set,c=[];for(let d of a)!d.roleId||b.has(d.roleId)||(b.add(d.roleId),c.push(d));return c}(b)}function m(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:j(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,builtIn:!!a.builtIn,resourceId:"prompt"===d&&(a.resourceId||a.resourceIds?.[0])||void 0,resourceIds:"prompt"===d?k(Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds:a.resourceId?[a.resourceId]:[]):[],executionType:"prompt"===d?"string"==typeof(b=a.executionType)&&g.YB.has(b)?b:"reference":void 0,processingType:"file"===d?"string"==typeof(c=a.processingType)&&g.h2.has(c)?c:"reference":void 0}}function n(a){return{id:j(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:l(a.fileRoles),promptRoles:l(a.promptRoles)}}function o(){try{let a=i();if(!d.existsSync(a))return{roles:[],configs:[],deletedRoleIds:[],deletedConfigIds:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(m),configs:[],deletedRoleIds:[],deletedConfigIds:[]};return{roles:Array.isArray(b.roles)?b.roles.map(m):[],configs:Array.isArray(b.configs)?b.configs.map(n):[],deletedRoleIds:k(b.deletedRoleIds||[]),deletedConfigIds:k(b.deletedConfigIds||[])}}catch{return{roles:[],configs:[],deletedRoleIds:[],deletedConfigIds:[]}}}function p(a){d.writeFileSync(i(),JSON.stringify({roles:a.roles.map(m),configs:a.configs.map(n),deletedRoleIds:k(a.deletedRoleIds||[]),deletedConfigIds:k(a.deletedConfigIds||[])},null,2),"utf-8")}function q(){return(0,h.V)().roles.map(a=>m({...a,builtIn:!0}))}function r(){return(0,h.V)().roleConfigs.map(a=>n({...a,builtIn:!0}))}function s(a){let b=o(),c=new Set(b.deletedRoleIds||[]),d=q().filter(a=>!c.has(`${a.type}:${a.id}`)),e=b.roles.filter(a=>!d.some(b=>b.id===a.id&&b.type===a.type)&&!c.has(`${a.type}:${a.id}`)),f=[...d,...e];return a?f.filter(b=>b.type===a):f}function t(a){let b=m(a),c=o();return c.deletedRoleIds=(c.deletedRoleIds||[]).filter(a=>a!==`${b.type}:${b.id}`),c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),p(c),b}function u(a,b){let c=o(),d=`${a}:${b}`;q().some(c=>c.id===b&&c.type===a)&&(c.deletedRoleIds=k([...c.deletedRoleIds||[],d])),c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(c=>({...c,fileRoles:c.fileRoles.filter(c=>"file"!==a||c.roleId!==b),promptRoles:c.promptRoles.filter(c=>"prompt"!==a||c.roleId!==b)})),p(c)}function v(){let a=o(),b=new Set(a.deletedConfigIds||[]),c=new Set(a.deletedRoleIds||[]),d=a.configs.filter(a=>!b.has(a.id)),e=new Set(d.map(a=>a.id));return[...r().filter(a=>!b.has(a.id)&&!e.has(a.id)),...d].map(a=>({...a,fileRoles:a.fileRoles.filter(a=>!c.has(`file:${a.roleId}`)),promptRoles:a.promptRoles.filter(a=>!c.has(`prompt:${a.roleId}`))}))}function w(a){return v().find(b=>b.id===a)}function x(a){let b={...n(a),builtIn:!1},c=o();return c.deletedConfigIds=(c.deletedConfigIds||[]).filter(a=>a!==b.id),c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),p(c),b}function y(a){let b=o();r().some(b=>b.id===a)&&(b.deletedConfigIds=k([...b.deletedConfigIds||[],a])),b.configs=b.configs.filter(b=>b.id!==a),p(b)}function z(a,b){let c=j(a);if(!b.has(c))return b.add(c),c;do c=j(`${a}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`);while(b.has(c));return b.add(c),c}function A(a=[],b){return a.map((a,c)=>({roleId:b.get(a.roleId)||a.roleId,order:Number.isFinite(a.order)?a.order:c}))}function B(a){let b=a?.roleIds?new Set(a.roleIds):null,c=a?.configIds?new Set(a.configIds):null,d=o();return{type:"customize-agent.documentRoles",version:1,exportedAt:new Date().toISOString(),roles:d.roles.filter(a=>!b||b.has(a.id)).map(m),configs:d.configs.filter(a=>!c||c.has(a.id)).map(n)}}function C(a){let b=a&&"object"==typeof a?a:{},c=Array.isArray(b.roles)?b.roles:[],d=Array.isArray(b.configs)?b.configs:[];if(0===c.length&&0===d.length)throw Error("没有可导入的角色配置");let e=o(),f=new Set([...q().map(a=>a.id),...e.roles.map(a=>a.id)]),g=new Set([...r().map(a=>a.id),...e.configs.map(a=>a.id)]),h=new Map,i=[];for(let a of c){let b=m(a),c=z(b.id,f);h.set(b.id,c),i.push({...b,id:c,builtIn:!1})}let j=new Set([...q().map(a=>a.id),...e.roles.map(a=>a.id),...i.map(a=>a.id)]),k=d.map(a=>{let b=n(a),c=z(b.id,g);return n({...b,id:c,builtIn:!1,fileRoles:A(b.fileRoles,h).filter(a=>j.has(a.roleId)),promptRoles:A(b.promptRoles,h).filter(a=>j.has(a.roleId))})});return e.roles.push(...i),e.configs.push(...k),p(e),{importedRoles:i.length,importedConfigs:k.length}}},29281:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},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}
14
14
  ${a.category}
15
15
  ${a.format}
16
- ${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:()=>v,C1:()=>B,DX:()=>C,N6:()=>D,QJ:()=>u,Vh:()=>J,bV:()=>y,bj:()=>s,dU:()=>q,h0:()=>x,jG:()=>t,wR:()=>F,xm:()=>w,zY:()=>I});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753);function j(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function k(){return e.join(j(),"document-templates.json")}function l(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 m(){try{let a=k();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(l)}catch{return[]}}function n(a){d.writeFileSync(k(),JSON.stringify(a.map(l),null,2),"utf-8")}function o(){try{let a=JSON.parse(d.readFileSync(e.join(j(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}function p(a){let b=o();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")}}}function q(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=p(c.promptId);a&&b.push({...a,roleId:c.roleId})}return b}function r(a,b,c=""){let d=`${a} ${b} ${c}`;return/validation|校验|审查|审核|标准/u.test(d)?"validation":/extract|extraction|抽取|清单|图纸|品牌|识别/u.test(d)?"extraction":/format|排版/u.test(d)?"formatting":/总控|writer|写作主控|chapter_generation|正文生成|文档生成|成文/u.test(d)?"writer":"reference"}function s(a){var b;let c=E(a),d=(0,h.XB)("prompt"),e=I(a),f=[],g=[],i=[];if(c)for(let a of c.promptRoles)d.find(b=>b.id===a.roleId)||i.push(a.roleId),e.some(b=>b.roleId===a.roleId||b.roleId===G(a.roleId))||f.push({roleId:a.roleId,promptId:"",reason:"项目角色提示词未解析到可用提示词资源"});let j=[...e];if(/施工组织设计|施工方案|危大工程|安全文明施工/u.test(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`)&&!q(j).some(a=>"writer"===r(a.roleId,d.find(b=>b.id===a.roleId)?.executionType||G(a.roleId),a.name)))for(let a of(b=/施工组织设计总控|总控|施工组织/u,o().filter(a=>b.test(a.name||"")).map(a=>a.id)).slice(0,1))j.push({promptId:a,roleId:"runtime-construction-writer"}),g.push({roleId:"runtime-construction-writer",promptId:a,reason:"施工组织设计运行时必需写作总控提示词"});let k=H(j),l=[];for(let a of k){let b=p(a.promptId);if(!b)continue;let e=d.find(b=>b.id===a.roleId),f=e?.executionType||G(a.roleId),h=r(a.roleId,f,b.name),i=g.some(b=>b.roleId===a.roleId&&b.promptId===a.promptId)?"runtimeRequired":c?"projectRole":"template";l.push({...b,roleId:a.roleId,executionType:f,category:h,bindingSource:i})}return{bindings:k,prompts:l,writerPrompts:l.filter(a=>"writer"===a.category),generationPrompts:l.filter(a=>"writer"===a.category||"formatting"===a.category),extractionPrompts:l.filter(a=>"extraction"===a.category),validationPrompts:l.filter(a=>"validation"===a.category),formattingPrompts:l.filter(a=>"formatting"===a.category),referencePrompts:l.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(i)],fallbackBindings:f,runtimeRequiredBindings:g}}function t(){let a=(0,i.V)().templates,b=m().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function u(a){return t().find(b=>b.id===a)}function v(a){let b=l(a),c=m().filter(a=>a.id!==b.id);return c.push(b),n(c),b}async function w(a,b=(0,g.aY)()){let c=u(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,h.XB)("prompt"),i=(0,h.XB)("file"),j=D(c),k=E(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=I(c),m=J(c);0===l.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=e.resolve(b),o=(0,g.Yy)(n);0===m.length&&d.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let p=new Map(o.map(a=>[a.relativePath,a])),r=m.map(a=>{let b=i.find(b=>b.id===a.roleId),c=p.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),s=q(l);return{templateId:a,projectRoleConfigId:j,fileDiagnostics:r,promptDiagnostics:l.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}}),issues:d}}function x(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");n(m().filter(b=>b.id!==a))}function y(a){let b=u(a);if(!b)throw Error("Document template not found");let c=l({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=m();return d.push(c),n(d),c}function z(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function A(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>z(b,a)))}function B(a,b){return A(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>z(a,b)))}function C(a,b){return A(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>z(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>z(a,b)))}function D(a){return a.projectRoleConfigId||void 0}function E(a){let b=D(a);return b?(0,h.Mu)(b):void 0}function F(a){let b=new Map;for(let d of a){var c;b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...(c=d.roleId,/requirement|response|rule|需求|规则|评审|实质/u.test(c)?["requirement_document","technical_specification","schedule_quality_safety"]:/table|sheet|data|scope|quantity|表格|列表|明细|数量|数据|范围/u.test(c)?["structured_data","scope_description","budget_cost"]:/drawing|drawings|image|map|design|设计|图像|地图/u.test(c)?["design_specification"]:/schedule|quality|safety|progress|周期|进度|质量|安全/u.test(c)?["schedule_quality_safety","technical_specification"]:/risk|constraints|重点|难点|约束/u.test(c)?["risk_constraints","addendum","requirement_document"]:/material|equipment|brand|resource|材料|设备|品牌|资源/u.test(c)?["resource_recommendation","structured_data","technical_specification"]:/enterprise|reference|经验|体系/u.test(c)?["project_overview","technical_specification"]:["project_overview"])])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function G(a){return/extract|extraction|抽取|清单|图纸|品牌/u.test(a)?"fact_extraction":/validation|校验|审查|审核/u.test(a)?"validation":/format|排版/u.test(a)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(a)?"chapter_generation":"reference"}function H(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function I(a){let b=E(a);if(b){let a=(0,h.XB)("prompt"),c=[];for(let d of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=a.find(a=>a.id===d.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[],f=e.length>0?e:function(a,b=""){let c=o(),d=`${a} ${b}`;return c.filter(a=>{let b=a.name||"";return/validation|校验|审查|审核/u.test(d)?/校验|审查|审核|标准/u.test(b):/writer|施工组织|construction-organization/u.test(d)?/施工组织设计总控|总控|施工组织/u.test(b):/method|施工方法/u.test(d)?/施工方法|主要施工/u.test(b):/schedule|quality|进度|工期|质量/u.test(d)?/工期|进度|质量/u.test(b):/resource|人材机|资源/u.test(d)?/人材机|资源|材料|设备/u.test(b):/safety|文明|安全/u.test(d)?/安全|文明/u.test(b):/dangerous|危大/u.test(d)?/危大|危险性/u.test(b):!!/extract|extraction|抽取|清单|图纸|品牌/u.test(d)&&/抽取|识别|清单|图纸|品牌|总控/u.test(b)}).slice(0,2).map(a=>a.id)}(d.roleId,b?.name),g=b?.id||G(d.roleId);c.push(...f.map(a=>({promptId:a,roleId:g})))}if(c.length>0)return H(c)}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function J(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},58965:(a,b,c)=>{c.d(b,{$m:()=>f,VX:()=>d,tK:()=>e});let d=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,e=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,f="[零〇一二三四五六七八九十百千万两]+"},70208:(a,b,c)=>{c.d(b,{GQ:()=>l,Ui:()=>j,YZ:()=>m,_9:()=>r,bE:()=>n,bl:()=>i,cs:()=>k,tb:()=>o});var d=c(58965),e=c(52511);function f(a){return 0===a.trim().length}let g="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",h=RegExp(`<\\s*${g}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${g}\\s*>`,"giu");function i(a){return RegExp(`^\\s*<\\s*${g}(?:\\s[^>]*)?>`,"iu").test(a)}function j(a){return RegExp(`^\\s*<\\/\\s*${g}\\s*>`,"iu").test(a)}function k(a){for(let b of a){let a=function(a,b,c){let e=[];for(let g of function(a,b){h.lastIndex=0;let c=[...a.matchAll(h)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>|END\s+(?:OUTLINE|CHAPTERS?)|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${d.$m}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],e=a.replace(/\r?\n/gu,"\n");for(let a of c)e=(e=(e=e.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return e.split(/\n|;|;/u).map(a=>(function(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${d.$m})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${d.$m})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!f(a))}(g))e.push({id:`explicit-${b}-${e.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a};如需二级小节,应由大模型结合提示词、需求和资料上下文动态规划。`,requiredFacts:[],sections:[],queries:[a]});return e.filter(a=>!f(a.title))}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}function l(a){let b=a.replace(/^#+\s*/u,"").trim(),c="";for(;b&&b!==c;)c=b,b=b.replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]+/u,"").replace(/^[((]?[一二三四五六七八九十]+[))、..\s]+/u,"").trim();return b}function m(a){return l(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function n(a){let b=a.trim(),c=m(b);return!(!c||c.length<2||c.length>50||/^#{3,6}\s*/u.test(b)||/^\|.*\|/u.test(b)||/\|/u.test(c)||/^[,,、;;::。.!!??\-—]/u.test(b)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(c)||/[。;;]$/u.test(c)||/[::]\s*[。;;]?$/u.test(c)||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(c)||/(评标委员会|完全满足评审要求|全面梳理与响应|坚实的技术保障)/u.test(c))&&!p(c)}function o(a,b){let c=l(b);return`第${function(a){let b=["零","一","二","三","四","五","六","七","八","九"];if(a<=10)return 10===a?"十":b[a];if(a<20)return`十${b[a%10]}`;if(a<100){let c=Math.floor(a/10),d=a%10;return`${b[c]}十${d?b[d]:""}`}return String(a)}(a+1)}章 ${c}`}function p(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function q(a,b){let c=new Set;return a.filter(a=>{let d=m(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||p(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function r(a,b,c){return!b||c?.preserveExplicitOutline?q([...a.chapters],{...c,template:a}):q([...a.chapters].map(a=>{let c=l(a.title),d=b.chapterRules.find(b=>b.id===a.id||l(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}},78217:(a,b,c)=>{function d(a,b){return Math.ceil(e(a)/f(b))}function e(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function f(a){let b=Number(String(a&&"typography"in a&&a.typography?.bodySize||"").replace(/[^\d.]/gu,""))||14,c=Number(String(a&&"typography"in a&&a.typography?.lineHeight||"").replace(/[^\d.]/gu,""))||22;return b>=14&&c>=22?900:1050}function g(a){let b=a.trim();if(/^\d+(?:\.\d+)?$/u.test(b))return Number(b);let c={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if("十"===b)return 10;let d=/^([一二两三四五六七八九])?十([一二三四五六七八九])?$/u.exec(b);if(d)return(d[1]?c[d[1]]:1)*10+(d[2]?c[d[2]]:0)}function h(a="",b=""){let c=`${a}${b}`;return/不少于|至少|不低于|以上|起码/u.test(c)?"minimum":/约|大概|左右|大约|约为|附近/u.test(c)?"approximate":"exact"}function i(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function j(a){let b=a.template.generationSettings||a.template.exportSettings,c=f(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)\s*(以上|左右|以内|以下)?/gu)],d=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)\s*(以上|左右|以内|以下)?/gu)],e=c.map(a=>{let b=g(a[2]||"");return Number.isFinite(b)?{value:b,mode:h(a[1],a[3])}:void 0}).filter(a=>!!a).at(-1),f=d.map(a=>{let b=g(a[2]||"");return b?{value:Math.round(b*(a[3]?1e4:1)),mode:h(a[1],a[4])}:void 0}).filter(a=>!!a).at(-1);return{targetPages:e?.value,pageMode:e?.mode,targetChars:f?.value,charMode:f?.mode}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),j=e?void 0:b?.targetPages?.target||b?.targetPages?.min,k=d.targetPages?d.targetPages*c:void 0,l=d.targetPages||j,m=e?"explicit":j?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",n=e?Math.max(d.targetChars||0,k||0)||void 0:Math.max((j?j*c:void 0)||0)||void 0,o=d.pageMode||"exact",p=d.charMode||o,q=e&&"approximate"===p,r=e&&"minimum"===p,s=e?l?Math.floor(l*(r?1:.9)):void 0:b?.targetPages?.min||(l?Math.floor(.95*l):void 0),t=e&&l&&!r?Math.ceil(l*(q?1.15:1.08)):b?.targetPages?.max,u=n?Math.floor(n*(r?1:.9)):s?s*c:void 0,v=n&&!r?Math.ceil(n*(q?1.15:1.08)):t?t*c:void 0,w=a.chapters.length>0?a.chapters:a.template.chapters,x=w.reduce((a,b)=>a+i(b),0)||1,y=new Map,z=w.map(a=>({chapter:a,target:n?Math.round(n*i(a)/x):0})),A=w.reduce((b,c)=>b+Math.max(a.spec?.chapterRules.find(a=>a.id===c.id||a.title===c.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200),0),B=n&&A>.92*n?Math.max(.45,.92*n/A):1;for(let{chapter:b,target:c}of z){let d=Math.floor(Math.max(Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0),n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200)*B);y.set(b.id,Math.max(d,c))}let C=!!(e&&(r||"exact"===p)&&(n||u||0)>=4e4);return{targetPages:l,minPages:s,maxPages:t,targetChars:n,minChars:u,maxChars:v,charsPerPage:c,chapterTargets:y,source:m,mode:p,longformStrict:C}}function k(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let e=d(b,a),f=c.min||c.target,g=c.max||c.target,h=[];return f&&e<f&&h.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${e} 页,目标不少于 ${f} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),g&&e>g+4&&h.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${e} 页,目标不超过 ${g} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),h}function l(a,b){let{currentChars:c,estimatedPages:d}=m(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.maxChars&&c>Math.ceil(1.12*a.maxChars)?e.push({level:"error",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"请压缩重复段落、过细小节或过度展开内容后再导出。"}):a.maxChars&&c>a.maxChars&&e.push({level:"warning",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"建议减少重复段落、过细小节或过度展开内容。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),a.maxPages&&d>a.maxPages&&e.push({level:"warning",message:`正文篇幅超过目标页数区间:预计约 ${d} 页,建议不超过 ${a.maxPages} 页`,suggestion:"建议压缩过度展开内容或调整目标页数。"}),e}function m(a,b){let c=e(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}c.d(b,{Cv:()=>d,PE:()=>k,V7:()=>e,fW:()=>m,tF:()=>j,ty:()=>l})},78409:(a,b,c)=>{c.d(b,{h0x:()=>d.h0,bVF:()=>d.bV,OXS:()=>ch,jGg:()=>d.jG,R1O:()=>ci,Bhi:()=>d.Bh,xmB:()=>d.xm});var d=c(52511),e=c(76760),f=c(19898),g=c(44533),h=c(2894),i=c(25840),j=c(77598),k=c(8753);let l=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],m=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|约束|响应|澄清|变更/iu],output:["需求约束","规则要求","变更说明"]},{id:"scope",label:"范围资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["实施范围","对象范围"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["结构化数据范围","参数规格范围"]},{id:"quality",label:"质量评价资料",patterns:[/质量|验收|审核|评审|评价|标准|规范|指标/iu],output:["质量要求","评价标准"]},{id:"schedule",label:"时间进度资料",patterns:[/周期|期限|进度|计划|节点|里程碑|时间|日期/iu],output:["周期要求","进度节点要求"]},{id:"safety",label:"安全合规资料",patterns:[/安全|合规|风险|应急|环保|隐私|审计|控制/iu],output:["安全合规要求","风险控制要求"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议|结论/iu],output:["背景依据","分析结论","风险建议"]}],n=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则|摘要/iu],output:["对象名称","材料范围","实施范围"]},{id:"implementation",label:"实施章节",patterns:[/方法|部署|实施|范围|组织|流程|步骤/iu],output:["实施范围","对象范围","结构化数据范围"]},{id:"controls",label:"控制章节",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价/iu],output:["质量要求","周期要求","安全合规要求"]},{id:"resources",label:"资源章节",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急|合规/iu],output:["风险控制要求","风险建议"]}],o=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|响应|requirement|rule/iu],output:["requirement_document"]},{id:"change",label:"变更澄清资料",patterns:[/补充|澄清|变更|修订|addendum|change/iu],output:["addendum"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["structured_data"]},{id:"budget",label:"预算费用资料",patterns:[/预算|费用|金额|报价|限价|成本|price|cost|budget/iu],output:["budget_cost"]},{id:"design",label:"设计方案资料",patterns:[/设计|方案|说明|图像|地图|附件|drawing|image|map|design/iu],output:["design_specification"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["resource_recommendation"]},{id:"schedule-quality-safety",label:"进度质量合规资料",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围任务资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["scope_description"]},{id:"technical",label:"技术标准资料",patterns:[/技术|规范|标准|规程|指南|手册|参数|spec|standard/iu],output:["technical_specification"]},{id:"risk",label:"风险约束资料",patterns:[/风险|重点|难点|约束|限制|现场|条件|应急/iu],output:["risk_constraints"]}];function p(a,b){let c=new Set;for(let d of b)for(let b of d.patterns)if(b.lastIndex=0,b.test(a)){for(let a of d.output)c.add(a);break}return[...c]}function q(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function r(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function s(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function t(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,k.V)().autoSpecGates.filter(a=>a.templateMatchers.some(a=>(function(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}})(c,a)))}function u(a,b,c={}){return c.publicSafe?`## 文档事实与质量要求
16
+ ${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:()=>v,C1:()=>B,DX:()=>C,N6:()=>D,QJ:()=>u,Vh:()=>J,bV:()=>y,bj:()=>s,dU:()=>q,h0:()=>x,jG:()=>t,wR:()=>F,xm:()=>w,zY:()=>I});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753);function j(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function k(){return e.join(j(),"document-templates.json")}function l(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 m(){try{let a=k();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(l)}catch{return[]}}function n(a){d.writeFileSync(k(),JSON.stringify(a.map(l),null,2),"utf-8")}function o(){try{let a=JSON.parse(d.readFileSync(e.join(j(),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}}function p(a){let b=o();if(a.startsWith("custom:")){let c=b.find(b=>b.id===a);return c?{id:a,name:c.name,content:c.content}:void 0}if(a.startsWith("file:")){let b=a.slice(5);if(d.existsSync(b))return{id:a,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")}}}function q(a=[]){if(0===a.length)return[];let b=[];for(let c of a){let a=p(c.promptId);a&&b.push({...a,roleId:c.roleId})}return b}function r(a,b,c=""){let d=`${a} ${b} ${c}`;return/validation|校验|审查|审核|标准/u.test(d)?"validation":/extract|extraction|抽取|清单|图纸|品牌|识别/u.test(d)?"extraction":/format|排版/u.test(d)?"formatting":/总控|writer|施工组织设计总控|写作主控/u.test(d)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(d)?"chapter":"reference"}function s(a){var b;let c=E(a),d=(0,h.XB)("prompt"),e=I(a),f=[],g=[],i=[];if(c)for(let a of c.promptRoles)d.find(b=>b.id===a.roleId)||i.push(a.roleId),e.some(b=>b.roleId===a.roleId||b.roleId===G(a.roleId))||f.push({roleId:a.roleId,promptId:"",reason:"项目角色提示词未解析到可用提示词资源"});let j=[...e];if(/施工组织设计|施工方案|危大工程|安全文明施工/u.test(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`)&&!q(j).some(a=>"writer"===r(a.roleId,d.find(b=>b.id===a.roleId)?.executionType||G(a.roleId),a.name)))for(let a of(b=/施工组织设计总控|总控|施工组织/u,o().filter(a=>b.test(a.name||"")).map(a=>a.id)).slice(0,1))j.push({promptId:a,roleId:"runtime-construction-writer"}),g.push({roleId:"runtime-construction-writer",promptId:a,reason:"施工组织设计运行时必需写作总控提示词"});let k=H(j),l=[];for(let a of k){let b=p(a.promptId);if(!b)continue;let e=d.find(b=>b.id===a.roleId),f=e?.executionType||G(a.roleId),h=r(a.roleId,f,b.name),i=g.some(b=>b.roleId===a.roleId&&b.promptId===a.promptId)?"runtimeRequired":c?"projectRole":"template";l.push({...b,roleId:a.roleId,executionType:f,category:h,bindingSource:i})}return{bindings:k,prompts:l,writerPrompts:l.filter(a=>"writer"===a.category),chapterPrompts:l.filter(a=>"chapter"===a.category),extractionPrompts:l.filter(a=>"extraction"===a.category),validationPrompts:l.filter(a=>"validation"===a.category),formattingPrompts:l.filter(a=>"formatting"===a.category),referencePrompts:l.filter(a=>"reference"===a.category),unresolvedRoles:[...new Set(i)],fallbackBindings:f,runtimeRequiredBindings:g}}function t(){let a=(0,i.V)().templates,b=m().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function u(a){return t().find(b=>b.id===a)}function v(a){let b=l(a),c=m().filter(a=>a.id!==b.id);return c.push(b),n(c),b}async function w(a,b=(0,g.aY)()){let c=u(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,h.XB)("prompt"),i=(0,h.XB)("file"),j=D(c),k=E(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=I(c),m=J(c);0===l.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=e.resolve(b),o=(0,g.Yy)(n);0===m.length&&d.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let p=new Map(o.map(a=>[a.relativePath,a])),r=m.map(a=>{let b=i.find(b=>b.id===a.roleId),c=p.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),s=q(l);return{templateId:a,projectRoleConfigId:j,fileDiagnostics:r,promptDiagnostics:l.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}}),issues:d}}function x(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");n(m().filter(b=>b.id!==a))}function y(a){let b=u(a);if(!b)throw Error("Document template not found");let c=l({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=m();return d.push(c),n(d),c}function z(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function A(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>z(b,a)))}function B(a,b){return A(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>z(a,b)))}function C(a,b){return A(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>z(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>z(a,b)))}function D(a){return a.projectRoleConfigId||void 0}function E(a){let b=D(a);return b?(0,h.Mu)(b):void 0}function F(a){let b=new Map;for(let d of a){var c;b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...(c=d.roleId,/requirement|response|rule|需求|规则|评审|实质/u.test(c)?["requirement_document","technical_specification","schedule_quality_safety"]:/table|sheet|data|scope|quantity|表格|列表|明细|数量|数据|范围/u.test(c)?["structured_data","scope_description","budget_cost"]:/drawing|drawings|image|map|design|设计|图像|地图/u.test(c)?["design_specification"]:/schedule|quality|safety|progress|周期|进度|质量|安全/u.test(c)?["schedule_quality_safety","technical_specification"]:/risk|constraints|重点|难点|约束/u.test(c)?["risk_constraints","addendum","requirement_document"]:/material|equipment|brand|resource|材料|设备|品牌|资源/u.test(c)?["resource_recommendation","structured_data","technical_specification"]:/enterprise|reference|经验|体系/u.test(c)?["project_overview","technical_specification"]:["project_overview"])])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function G(a){return/extract|extraction|抽取|清单|图纸|品牌/u.test(a)?"fact_extraction":/validation|校验|审查|审核/u.test(a)?"validation":/format|排版/u.test(a)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(a)?"chapter_generation":"reference"}function H(a){let b=new Set,c=[];for(let d of a){let a=`${d.roleId}:${d.promptId}`;!d.promptId||!d.roleId||b.has(a)||(b.add(a),c.push(d))}return c}function I(a){let b=E(a);if(b){let a=(0,h.XB)("prompt"),c=[];for(let d of[...b.promptRoles].sort((a,b)=>a.order-b.order)){let b=a.find(a=>a.id===d.roleId),e=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[],f=e.length>0?e:function(a,b=""){let c=o(),d=`${a} ${b}`;return c.filter(a=>{let b=a.name||"";return/validation|校验|审查|审核/u.test(d)?/校验|审查|审核|标准/u.test(b):/writer|施工组织|construction-organization/u.test(d)?/施工组织设计总控|总控|施工组织/u.test(b):/method|施工方法/u.test(d)?/施工方法|主要施工/u.test(b):/schedule|quality|进度|工期|质量/u.test(d)?/工期|进度|质量/u.test(b):/resource|人材机|资源/u.test(d)?/人材机|资源|材料|设备/u.test(b):/safety|文明|安全/u.test(d)?/安全|文明/u.test(b):/dangerous|危大/u.test(d)?/危大|危险性/u.test(b):!!/extract|extraction|抽取|清单|图纸|品牌/u.test(d)&&/抽取|识别|清单|图纸|品牌|总控/u.test(b)}).slice(0,2).map(a=>a.id)}(d.roleId,b?.name),g=b?.id||G(d.roleId);c.push(...f.map(a=>({promptId:a,roleId:g})))}if(c.length>0)return H(c)}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function J(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},58965:(a,b,c)=>{c.d(b,{$m:()=>f,VX:()=>d,tK:()=>e});let d=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,e=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,f="[零〇一二三四五六七八九十百千万两]+"},70208:(a,b,c)=>{c.d(b,{GQ:()=>l,Ui:()=>j,YZ:()=>m,_9:()=>r,bE:()=>n,bl:()=>i,cs:()=>k,tb:()=>o});var d=c(58965),e=c(52511);function f(a){return 0===a.trim().length}let g="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",h=RegExp(`<\\s*${g}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${g}\\s*>`,"giu");function i(a){return RegExp(`^\\s*<\\s*${g}(?:\\s[^>]*)?>`,"iu").test(a)}function j(a){return RegExp(`^\\s*<\\/\\s*${g}\\s*>`,"iu").test(a)}function k(a){for(let b of a){let a=function(a,b,c){let e=[];for(let g of function(a,b){h.lastIndex=0;let c=[...a.matchAll(h)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>|END\s+(?:OUTLINE|CHAPTERS?)|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${d.$m}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],e=a.replace(/\r?\n/gu,"\n");for(let a of c)e=(e=(e=e.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return e.split(/\n|;|;/u).map(a=>(function(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${d.$m})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${d.$m})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!f(a))}(g))e.push({id:`explicit-${b}-${e.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a};如需二级小节,应由大模型结合提示词、需求和资料上下文动态规划。`,requiredFacts:[],sections:[],queries:[a]});return e.filter(a=>!f(a.title))}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}function l(a){let b=a.replace(/^#+\s*/u,"").trim(),c="";for(;b&&b!==c;)c=b,b=b.replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]+/u,"").replace(/^[((]?[一二三四五六七八九十]+[))、..\s]+/u,"").trim();return b}function m(a){return l(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function n(a){let b=a.trim(),c=m(b);return!(!c||c.length<2||c.length>50||/^#{3,6}\s*/u.test(b)||/^\|.*\|/u.test(b)||/\|/u.test(c)||/^[,,、;;::。.!!??\-—]/u.test(b)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(c)||/[。;;]$/u.test(c)||/[::]\s*[。;;]?$/u.test(c)||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(c)||/(评标委员会|完全满足评审要求|全面梳理与响应|坚实的技术保障)/u.test(c))&&!p(c)}function o(a,b){let c=l(b);return`第${function(a){let b=["零","一","二","三","四","五","六","七","八","九"];if(a<=10)return 10===a?"十":b[a];if(a<20)return`十${b[a%10]}`;if(a<100){let c=Math.floor(a/10),d=a%10;return`${b[c]}十${d?b[d]:""}`}return String(a)}(a+1)}章 ${c}`}function p(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function q(a,b){let c=new Set;return a.filter(a=>{let d=m(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||p(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function r(a,b,c){return!b||c?.preserveExplicitOutline?q([...a.chapters],{...c,template:a}):q([...a.chapters].map(a=>{let c=l(a.title),d=b.chapterRules.find(b=>b.id===a.id||l(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}},78217:(a,b,c)=>{function d(a,b){return Math.ceil(e(a)/f(b))}function e(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function f(a){let b=Number(String(a&&"typography"in a&&a.typography?.bodySize||"").replace(/[^\d.]/gu,""))||14,c=Number(String(a&&"typography"in a&&a.typography?.lineHeight||"").replace(/[^\d.]/gu,""))||22;return b>=14&&c>=22?900:1050}function g(a){let b=a.trim();if(/^\d+(?:\.\d+)?$/u.test(b))return Number(b);let c={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if("十"===b)return 10;let d=/^([一二两三四五六七八九])?十([一二三四五六七八九])?$/u.exec(b);if(d)return(d[1]?c[d[1]]:1)*10+(d[2]?c[d[2]]:0)}function h(a="",b=""){let c=`${a}${b}`;return/不少于|至少|不低于|以上|起码/u.test(c)?"minimum":/约|大概|左右|大约|约为|附近/u.test(c)?"approximate":"exact"}function i(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function j(a){let b=a.template.generationSettings||a.template.exportSettings,c=f(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)\s*(以上|左右|以内|以下)?/gu)],d=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)\s*(以上|左右|以内|以下)?/gu)],e=c.map(a=>{let b=g(a[2]||"");return Number.isFinite(b)?{value:b,mode:h(a[1],a[3])}:void 0}).filter(a=>!!a).at(-1),f=d.map(a=>{let b=g(a[2]||"");return b?{value:Math.round(b*(a[3]?1e4:1)),mode:h(a[1],a[4])}:void 0}).filter(a=>!!a).at(-1);return{targetPages:e?.value,pageMode:e?.mode,targetChars:f?.value,charMode:f?.mode}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),j=e?void 0:b?.targetPages?.target||b?.targetPages?.min,k=d.targetPages?d.targetPages*c:void 0,l=d.targetPages||j,m=e?"explicit":j?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",n=e?Math.max(d.targetChars||0,k||0)||void 0:Math.max((j?j*c:void 0)||0)||void 0,o=d.pageMode||"exact",p=d.charMode||o,q=e&&"approximate"===p,r=e&&"minimum"===p,s=e?l?Math.floor(l*(r?1:.9)):void 0:b?.targetPages?.min||(l?Math.floor(.95*l):void 0),t=e&&l&&!r?Math.ceil(l*(q?1.15:1.08)):b?.targetPages?.max,u=n?Math.floor(n*(r?1:.9)):s?s*c:void 0,v=n&&!r?Math.ceil(n*(q?1.15:1.08)):t?t*c:void 0,w=a.chapters.length>0?a.chapters:a.template.chapters,x=w.reduce((a,b)=>a+i(b),0)||1,y=new Map,z=w.map(a=>({chapter:a,target:n?Math.round(n*i(a)/x):0})),A=w.reduce((b,c)=>b+Math.max(a.spec?.chapterRules.find(a=>a.id===c.id||a.title===c.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200),0),B=n&&A>.92*n?Math.max(.45,.92*n/A):1;for(let{chapter:b,target:c}of z){let d=Math.floor(Math.max(Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0),n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200)*B);y.set(b.id,Math.max(d,c))}let C=!!(e&&(r||"exact"===p)&&(n||u||0)>=4e4);return{targetPages:l,minPages:s,maxPages:t,targetChars:n,minChars:u,maxChars:v,charsPerPage:c,chapterTargets:y,source:m,mode:p,longformStrict:C}}function k(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let e=d(b,a),f=c.min||c.target,g=c.max||c.target,h=[];return f&&e<f&&h.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${e} 页,目标不少于 ${f} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),g&&e>g+4&&h.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${e} 页,目标不超过 ${g} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),h}function l(a,b){let{currentChars:c,estimatedPages:d}=m(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.maxChars&&c>Math.ceil(1.12*a.maxChars)?e.push({level:"error",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"请压缩重复段落、过细小节或过度展开内容后再导出。"}):a.maxChars&&c>a.maxChars&&e.push({level:"warning",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"建议减少重复段落、过细小节或过度展开内容。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),a.maxPages&&d>a.maxPages&&e.push({level:"warning",message:`正文篇幅超过目标页数区间:预计约 ${d} 页,建议不超过 ${a.maxPages} 页`,suggestion:"建议压缩过度展开内容或调整目标页数。"}),e}function m(a,b){let c=e(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}c.d(b,{Cv:()=>d,PE:()=>k,V7:()=>e,fW:()=>m,tF:()=>j,ty:()=>l})},78409:(a,b,c)=>{c.d(b,{h0x:()=>d.h0,bVF:()=>d.bV,OXS:()=>ch,jGg:()=>d.jG,R1O:()=>ci,Bhi:()=>d.Bh,xmB:()=>d.xm});var d=c(52511),e=c(76760),f=c(19898),g=c(44533),h=c(2894),i=c(25840),j=c(77598),k=c(8753);let l=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],m=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|约束|响应|澄清|变更/iu],output:["需求约束","规则要求","变更说明"]},{id:"scope",label:"范围资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["实施范围","对象范围"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["结构化数据范围","参数规格范围"]},{id:"quality",label:"质量评价资料",patterns:[/质量|验收|审核|评审|评价|标准|规范|指标/iu],output:["质量要求","评价标准"]},{id:"schedule",label:"时间进度资料",patterns:[/周期|期限|进度|计划|节点|里程碑|时间|日期/iu],output:["周期要求","进度节点要求"]},{id:"safety",label:"安全合规资料",patterns:[/安全|合规|风险|应急|环保|隐私|审计|控制/iu],output:["安全合规要求","风险控制要求"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议|结论/iu],output:["背景依据","分析结论","风险建议"]}],n=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则|摘要/iu],output:["对象名称","材料范围","实施范围"]},{id:"implementation",label:"实施章节",patterns:[/方法|部署|实施|范围|组织|流程|步骤/iu],output:["实施范围","对象范围","结构化数据范围"]},{id:"controls",label:"控制章节",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价/iu],output:["质量要求","周期要求","安全合规要求"]},{id:"resources",label:"资源章节",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急|合规/iu],output:["风险控制要求","风险建议"]}],o=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|响应|requirement|rule/iu],output:["requirement_document"]},{id:"change",label:"变更澄清资料",patterns:[/补充|澄清|变更|修订|addendum|change/iu],output:["addendum"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["structured_data"]},{id:"budget",label:"预算费用资料",patterns:[/预算|费用|金额|报价|限价|成本|price|cost|budget/iu],output:["budget_cost"]},{id:"design",label:"设计方案资料",patterns:[/设计|方案|说明|图像|地图|附件|drawing|image|map|design/iu],output:["design_specification"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["resource_recommendation"]},{id:"schedule-quality-safety",label:"进度质量合规资料",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围任务资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["scope_description"]},{id:"technical",label:"技术标准资料",patterns:[/技术|规范|标准|规程|指南|手册|参数|spec|standard/iu],output:["technical_specification"]},{id:"risk",label:"风险约束资料",patterns:[/风险|重点|难点|约束|限制|现场|条件|应急/iu],output:["risk_constraints"]}];function p(a,b){let c=new Set;for(let d of b)for(let b of d.patterns)if(b.lastIndex=0,b.test(a)){for(let a of d.output)c.add(a);break}return[...c]}function q(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function r(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function s(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function t(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,k.V)().autoSpecGates.filter(a=>a.templateMatchers.some(a=>(function(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}})(c,a)))}function u(a,b,c={}){return c.publicSafe?`## 文档事实与质量要求
17
17
  建议关注事实:${a.factFields.map(a=>a.name).join("、")}
18
18
  章节内容要求:${a.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ")}`:""}`).join(";")||"以当前模板章节为准"}
19
19
  质量控制点:${a.gateRules.map(a=>a.name).join("、")}`:`## 结构化检查摘要
@@ -136,15 +136,15 @@ ${d.trim()}
136
136
 
137
137
  ${cb(e)}
138
138
 
139
- `})).split(/\n{2,}/u).map(a=>{if(/^\s*(#{1,6}\s+|[-*+]\s+|\|)/u.test(a)||a.length<520)return a;let b=a.split(/(?<=[。;])/u).map(a=>a.trim()).filter(Boolean);if(b.length<4)return a;let c=[],d="";for(let a of b)d.length>260&&d.length+a.length>420?(c.push(d),d=a):d+=a;return d&&c.push(d),c.join("\n\n")}).join("\n\n").replace(/\n{3,}/gu,"\n\n").trim()}function cg(a,b,c){if(Number.isFinite(c)&&c>0)return Math.ceil(c);let d=new Set(b.filter(Boolean)),e=a.listFiles?.().filter(a=>0===d.size||d.has(a.relativePath)).reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0)??0;return e>0?e:Math.max(1,d.size)}async function ch(a){var b;aR(a.signal);let c=(0,d.QJ)(a.templateId);if(!c)throw Error("Document template not found");let k=e.resolve(a.projectRoot||(0,g.aY)());if(!k)throw Error("No knowledge base project found");let B=(0,f.computeProjectId)(k),H=c,O=(0,g.Qh)(),Q=[],R=[],S=(b,c=aa)=>{let d=b?[...b].sort((a,b)=>{let c=R.indexOf(a.id),d=R.indexOf(b.id);return(c<0?Number.MAX_SAFE_INTEGER:c)-(d<0?Number.MAX_SAFE_INTEGER:d)}):void 0;a.onProgress?.([...c],d?{chapters:d}:void 0)},V=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),W=async(b,c=aa)=>{let d=setInterval(()=>{a.signal?.aborted||S(Q,c)},V);try{return await b()}finally{clearInterval(d)}},Y=(0,d.N6)(H)||"none",$=(0,i.Mu)(Y)?.name||Y,aa=[bj({type:"role_binding",roleId:Y,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${H.name}`,details:[`当前项目:${B}`,`资料目录:${e.join(k,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:$,roleName:$,order:0})];S();let ab=(0,d.bj)(H),ad=ab.bindings,ae=(0,d.Vh)(H);if(bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:aa.length})),S(),0===ae.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let ag=bF(ab.generationPrompts),ah=(0,aj.cs)([{text:a.requirement,source:"用户需求"},{text:ag,source:"提示词角色",strict:!0}]),ai=ah.length>=2;ai&&(H={...c,chapters:ah}),bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${ae.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:aa.length})),S();let ak=await W(()=>Promise.resolve(function(a,b){let c=(0,g.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(F)),e=c.filter(a=>d.has(F(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>G(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板显式绑定文件作为资料范围",ambiguous:!1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=G(b.relativePath);if(!c)continue;let d=function(a,b){let c=0;for(let d of a.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u)){let a=d.trim();a.length>=2&&b.includes(a)&&(c+=1)}return c}(c,f);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>G(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>G(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>G(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),f=d.files,h=function(){let a={};for(let b of w)a[b]=[];return a}(),i=new Map((b?.boundFileRoles||[]).map(a=>[F(a.filePath),a.roles]));for(let a of f){let b=F(a.relativePath),c=[...i.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(p(a,o));return b.add("project_overview"),[...b]}(a.relativePath),...c])])h[b].push({filePath:a.relativePath,fileName:e.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let j=function(a){let b,c;for(let d of x(a)){let a=z(d);if(/项目|工程/iu.test(a)&&!(a.length<6)){if(/\.\w+$/u.test(d)){b||=a;continue}if(y(a)){c||=a.split(/--/u).filter(a=>/项目|工程/u.test(a)).sort((a,b)=>a.length-b.length)[0]||a;continue}return a}}return b||c||"当前知识库项目"}(f),k=function(a){for(let b of a){let a=b.relativePath.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0];if(a)return a}}(f),l=function(a,b){let c=C(a),d=C(b),e=A(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=A(a.map(a=>G(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,documentNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a))}}(f,c),m=function(a){let b=function(a){let b="";for(let c of a)b+=`${c.relativePath}
140
- `;return b}(a);return{ownerNames:E(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:E(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:E(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:E(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(f),n=v.filter(a=>h[a].length>0),q=v.filter(a=>0===h[a].length);return{projectId:j.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:j,generatedAt:Date.now(),fingerprint:l.fingerprint,contaminationCandidates:l.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:j,documentNo:k,scopeDescriptions:h.scope_description.map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(h.scope_description.concat(h.design_specification,h.structured_data).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:h.schedule_quality_safety.length?"已识别周期、质量、安全或合规相关资料,生成时应以需求文件、变更说明和技术要求为准。":void 0,qualityRequirement:h.schedule_quality_safety.length?"已识别质量或评价相关资料。":void 0,safetyRequirement:h.schedule_quality_safety.length?"已识别安全或合规相关资料。":void 0,materialBrandRequirement:h.resource_recommendation.length?"已识别资源、材料、设备或品牌相关资料。":void 0,ownerNames:m.ownerNames,locationNames:m.locationNames,scheduleValues:m.scheduleValues,qualityTargets:m.qualityTargets},materialInventory:h,extractedSections:{projectOverview:`绑定材料组:${j}${k?`,文档/任务编号:${k}`:""}。`,scopeSummary:`范围资料:${D(h.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${D(h.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${D(h.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${D(h.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(h.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:v,satisfiedRoles:n,missingRoles:q,materialCompletenessRate:v.length?n.length/v.length:1}}}(k,{requirement:a.requirement,boundFilePaths:ae.map(a=>a.filePath),boundFileRoles:(0,d.wR)(ae)})));bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(ak.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:aa.length})),S();let al=await W(()=>Promise.resolve(function(a,b=""){let c=function(a,b=""){return j.createHash("sha1").update(JSON.stringify({id:a.id,name:a.name,description:a.description,outputTitle:a.outputTitle,chapters:a.chapters,promptBindings:a.promptBindings,fileBindings:a.fileBindings,projectRoleConfigId:a.projectRoleConfigId,requirement:b})).digest("hex").slice(0,12)}(a,b),d=function(a,b){for(let c of b)for(let b of c.patterns)if(b.lastIndex=0,b.test(a))return c.output[0]}(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`,l)||a.category||"文档",e=function(a,b){let c=[a.name,a.category,a.outputTitle,a.description],d=[];for(let b of a.chapters)for(let a of(c.push(b.title,b.purpose,...b.sections||[],...b.requiredFacts||[],...b.queries||[]),b.requiredFacts||[]))d.push(a);let e=c.filter(Boolean).join("\n"),f=new Set(d);for(let a of p(e,m))f.add(a);for(let c of t(a,b))for(let a of c.requiredFacts)f.add(a);return[...f].filter(Boolean)}(a,d),f=function(a=""){let b=new Set;for(let c of[/(?:必须|需要|要求|增加|包含|包括|补充|设置|新增).{0,12}?(?:章节|章|节|小节)[::为是]?\s*([^。;;\n]{2,80})/giu,/(?:章节|目录).{0,8}?(?:包括|包含|为|是)[::]?\s*([^。;;\n]{2,120})/giu])for(let d of a.matchAll(c))for(let a of d[1].split(/[、,,/]/u).map(a=>a.trim()).filter(Boolean))!/不要|禁止|不得|不能/iu.test(a)&&a.length<=40&&b.add(a.replace(/[。;;::]+$/u,""));return[...b]}(b),g=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/必须|一定要|务必|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:输出|写明)\s*([^。;;\n]{2,30})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&a.length<=30&&!/不要|禁止|不得|不能|生成|要求内容|专业|结构完整|直接用于/u.test(a))}(b),h=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:不要|禁止|不得|不能|不允许|严禁)(?:出现|输出|写|包含)?\s*([^。;;\n]{2,40})/iu);a&&b.add(a[1].replace(/^(这些|以下|内容|词语|文字)[::]?/u,"").trim())}return[...b].filter(a=>a&&!/章节|页|表格/u.test(a))}(b),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),k=t(a,d),o=Math.max(0,...k.map(a=>a.minTables||0)),u=Math.max(function(a=""){let b=a.match(/(?:至少|不少于)?\s*(\d{1,2})\s*(?:个|张)?\s*表格/iu);return b?Number(b[1]):/表格化|用表格|表格形式|表格表达/iu.test(a)?1:void 0}(b)||0,o)||void 0,v=a.chapters.map((a,b)=>{let c=[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]].join("\n"),d=new Set(a.requiredFacts||[]);for(let a of e)(c.includes(a)||RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"iu").test(c))&&d.add(a);for(let a of p(c,n))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(q),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),w=f.filter(a=>!v.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${q(a)}`,title:a,required:!0,order:v.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),x=[{id:"auto-source-required",name:"事实必须有来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"auto-min-source",name:"至少使用绑定材料来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"min_count",min:2}},{id:"auto-no-debug-text",name:"不得输出后台流程话术",type:"forbidden_text",level:"error",value:"知识库证据",evaluator:{subject:"document",operator:"not_contains",value:"知识库证据"}},...k.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${q(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...k.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${q(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...o?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${o} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:o}}]:[],...f.map(a=>({id:`user-required-chapter-${q(a)}`,name:`用户提到章节:${a}`,type:"user_required_chapter",level:"warning",target:a,evaluator:{subject:"chapter",operator:"exists",target:a}})),...g.map(a=>({id:`user-required-text-${q(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...h.map(a=>({id:`user-forbidden-text-${q(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...u?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${u}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:u}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],y=[...v,...w];return{sourceHash:c,managedBy:"system",spec:{id:`auto-${a.id}-${c}`.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),name:`后台优化建议 - ${a.name}`,description:`${d}后台优化建议,由模板、提示词、角色绑定和用户临时要求静默生成,仅用于提升内容完整性,不接管章节结构。`,factFields:e.map(a=>({id:q(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/资源|品牌|重点|难点|约束/iu.test(a),extractionHint:`从绑定材料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与绑定材料一致,不得引入无关事实。`})),chapterMode:"fixed",chapterRules:y,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:x,builtIn:!0}}}(H,a.requirement||""))),am=al.spec,an=function(a,b=""){let c=`${a?.id||""} ${a?.name||""} ${a?.category||""} ${a?.description||""} ${a?.outputTitle||""} ${b}`;return/施工组织设计|施工方案|危大工程|人、材、机|安全文明施工/u.test(c)?K:J}(H,a.requirement||""),ao=function(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","scope_description"]);return/需求|规则|响应|方案|实施|专项|安全|质量|进度|合规/iu.test(b)&&["requirement_document","structured_data","schedule_quality_safety"].forEach(a=>c.add(a)),/设计|方案|说明|图像|地图|附件/iu.test(b)&&c.add("design_specification"),c}(a);return(function(a){let b=new Set(p([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),o));return b.add("project_overview"),b.add("scope_description"),[...b]})(a).map(a=>{let d=b.materialInventory[a]||[],e=c.has(a),f=d.length>0,g=f&&d.length<(e?2:1);return{role:a,required:e,satisfied:f,weak:g,evidenceCount:d.length,filePaths:d.map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(H,ak),ap=function(a){var b;let c=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),d=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),e=[],f=[];0===a.template.chapters.length&&f.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&f.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&e.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&f.push("材料指纹置信度较低,建议绑定明确的材料文件"),a.summary.coverage.materialCompletenessRate<.5&&e.push("绑定材料覆盖率过低,无法支撑文档生成"),c.length>0&&f.push(`模板必需材料角色未完全满足:${c.join("、")}`),d.length>0&&f.push(`部分材料角色证据较弱:${d.join("、")}`);let g=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===e.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(b=a.resolvedRoles).length?b.filter(a=>a.satisfied).length/b.length:1,specCompletenessRate:g.filter(Boolean).length/g.length,missingRoles:c,weakRoles:d,blockingIssues:e,warnings:f}}({template:H,spec:am,summary:ak,resolvedRoles:ao});if(!ap.ready)throw Error(`生成准备度不足:${ap.blockingIssues.join(";")}`);let aq=[I(ak,{publicSafe:!0}),u(am,al.sourceHash,{publicSafe:!0}),P(ap,{publicSafe:!0})].filter(Boolean).join("\n\n"),ar=[I(ak),u(am,al.sourceHash),P(ap)].filter(Boolean).join("\n\n"),as=bF(ab.generationPrompts),au=[aq,`生成前规划章节结构:
141
- ${H.chapters.map(a=>[`- ${a.title}`,a.sections?.length?` 规划小节:${a.sections.join("、")}`:"",a.tableSections?.length?` 表格小节:${a.tableSections.join("、")}`:"",a.tableRequirements?.length?` 表格内容要求:${a.tableRequirements.join(";")}`:""].filter(Boolean).join("\n")).join("\n")}`,as].filter(Boolean).join("\n\n"),aw=[ar,bF([...ab.extractionPrompts,...ab.referencePrompts])].filter(Boolean).join("\n\n"),ax=[aq,bF([...ab.validationPrompts,...ab.formattingPrompts])].filter(Boolean).join("\n\n");bk(aa,bj({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${ae.length} 条文件角色绑定`,details:[`提示词角色:${ad.length} 个`,`文件角色:${ae.length} 个`,ai?`识别 OUTLINE 章节:${ah.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:aa.length})),S();let ay=bD(k,ae),az=(0,i.XB)("file"),aA=new Map(ae.flatMap(a=>bB(k,a.filePath).map(b=>[b,a.roleId]))),aC=new Map(ae.flatMap(a=>bB(k,a.filePath).map(b=>[b,az.find(b=>b.id===a.roleId)?.processingType||"reference"])));bk(aa,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:aa.length})),S();let aH=await W(()=>O.getProject(k)),aI=cg(aH,[...ay],a.maxEvidencePerChapter);bk(aa,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"已读取知识库索引,开始构建角色资料证据池",details:[`证据范围文件:${ay.size} 份`,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:aa.length})),S(),aR(a.signal);let aJ=[],aK=[],aL=[],aN=[],aO=-1,aP=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(bE(c.content)),b.set(c.roleId,a)}return b}(b),j=function(a,b){let c=[];for(let d of a){if(!b.has(d.id))continue;let a=d.executionType||"reference",e=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${d.id} ${d.name} ${d.description||""}`);("fact_extraction"===a||"reference"===a||e)&&c.push(d)}return c}(f,new Set(h.keys())),k=[];for(let a of e){if(!g.has(a.id))continue;let b=function(a){let b=[],c=[],d=[];for(let e of a)for(let a of(b.push(e.promptRole.id),c.push(e.promptRole.name),e.texts))d.push(a);return{promptRoleIds:b,promptRoleNames:c,promptTexts:d}}(function(a,b,c){let d=[];for(let e of b){let b=c.get(e.id)||[];d.push({promptRole:e,texts:b,score:function(a,b,c){let d=bo(`${a} ${c.join(" ")}`),e=bo(`${b.id} ${b.name} ${b.processingType||""}`),f=function(a,b){let c=0;for(let d of[b.id,b.name,b.processingType||""])d&&a.includes(bo(d))&&(c+=4);return c}(d,b);for(let a of bm.Nx)a.promptPattern.lastIndex=0,a.filePattern&&(a.filePattern.lastIndex=0),(!a.filePattern||a.filePattern.test(e))&&a.promptPattern.test(d)&&(f+=a.points);return f}(e.id,a,b)})}d.sort((a,b)=>b.score-a.score);let e=d.filter(a=>a.score>5);if(e.length>0)return e;let f=d.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b});return f?[f]:[]}(a,j,h));k.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=bo(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bm.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,ad,ae),aS=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=bp(c,b),j=a.getFileDetail(b,Number.isFinite(d)&&d>0?{maxChunkContentChars:d}:void 0);if(j&&j.chunks.length>0){let a=function(a,b){let c=[],d=0,e=a.chunks||[],f=Number.isFinite(a.totalChunkCount)?Number(a.totalChunkCount):e.length;for(let f of e){let e=_(f.content);if(e){if(Number.isFinite(b)&&b>0&&d+e.length>b&&c.length>0)break;c.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:e,sectionTitle:f.sectionTitle,source:"role-node"}),d+=e.length}}return{evidence:c,totalChunks:f,omittedChunks:Math.max(0,f-e.length)}}(j,d);e.set(f,a.evidence),g+=a.totalChunks,h+=a.evidence.length,i+=a.omittedChunks;continue}e.set(f,[])}return{files:e,uniqueFileCount:e.size,bindingCount:f.bindingCount,totalChunkCount:g,loadedChunkCount:h,omittedChunkCount:i}}(aH,aP,k,af(Math.max(1200,900*ae.length),12e3,aY())),aT=bj({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aS.uniqueFileCount} 份,角色绑定 ${aS.bindingCount} 条,加载片段 ${aS.loadedChunkCount}/${aS.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aS.bindingCount-aS.uniqueFileCount)} 条`,`待执行资料理解节点:${aP.length} 个`,aS.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aS.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aS.uniqueFileCount,total:Math.max(1,aS.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:aa.length});bk(aa,aT),S();let aU=[],aW=function(a,b,c){let d=new Map(("function"==typeof a.listFiles?a.listFiles():[]).map(a=>[String(a.relativePath||""),a])),e=[];for(let a of[...c].sort()){let c=bp(b,a),f=d.get(a)||d.get(c);if(!f){e.push({filePath:c,missing:!0});continue}e.push({filePath:f.relativePath||c,contentHash:f.contentHash,fileSize:f.fileSize,mtime:f.mtime,chunkCount:f.chunkCount,indexedAt:f.indexedAt})}return aM({type:"project-evidence-version-v2",entries:e})}(aH,k,ay),aX=a$()?.model.name,aZ=bF([...ab.extractionPrompts,...ab.referencePrompts]),a_=aM({fileBindings:ae,evidenceScopePaths:[...ay].sort(),activeModelName:aX,projectEvidenceVersion:aW,promptTexts:aZ,materialFingerprint:ak.fingerprint,materialInventory:Object.fromEntries(Object.entries(ak.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),a0=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aP.length>12?1:2)),a1=Math.max(1,Math.min(aP.length||1,3,Number.isFinite(a0)?Math.floor(a0):1));for(let b=0;b<aP.length;b+=a1){aR(a.signal);let c=aP.slice(b,b+a1).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(bp(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return ac(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aS,c,k).filter(a=>bC(k,a.filePath,ay)),g=aa.length,h=bj({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aP.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});aa.push(h),S();let i=await W(()=>bs(H,c,f,a.signal)),j=bj({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bl(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aP.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return aa[g]=j,S(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))aJ.push(...a.evidence),aU.push(a.artifact);let d=ac(aJ,{maxItems:Math.max(40,8*aP.length),maxChars:Math.max(45e3,5e3*aP.length),preservePinned:!0});aJ.splice(0,aJ.length,...d)}let a3=a5(aJ,H,am),a7=a8(aJ,an),bi=bh([...aU.flatMap(a=>a.facts.map(a=>({key:a.key,value:aQ(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...a3,...a7],a4(aJ),aK,am,an),br=function(a,b){let c=[];for(let a of b)if("template_requirements"===a.node.outputType)for(let b of a.chapters)c.push(b);c.sort((a,b)=>a.order-b.order);let e=new Map;for(let b of c){let c=(0,aj.YZ)(b.title);!(!(0,aj.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(H,aU),bx=(0,aj._9)(H,am,{preserveExplicitOutline:ai}),bG=[H.name,H.outputTitle,a.requirement,...bx.flatMap(a=>[a.title,a.purpose,...a.sections||[]])].filter(Boolean).join(" "),bH=(0,h.Hh)(bG,void 0,k),bI=[bH.length>0?bH.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",function(a){let b=Math.max(4,Math.min(12,Number(process.env.DOCUMENT_ROLE_DIGEST_ARTIFACT_LIMIT??8)));return a.slice(0,b).map(a=>(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_DIGEST_CHAPTER_LIMIT??18))),d=Math.max(16,Math.min(60,Number(process.env.DOCUMENT_ROLE_DIGEST_FACT_LIMIT??30))),e=[];for(let b of a.chapters.slice(0,c))e.push(`- ${b.title}:${(b.requiredContents.join("、")||b.sourceRequirement).slice(0,180)}`);e.length>0&&b.push(`章节/要求:
139
+ `})).split(/\n{2,}/u).map(a=>{if(/^\s*(#{1,6}\s+|[-*+]\s+|\|)/u.test(a)||a.length<520)return a;let b=a.split(/(?<=[。;])/u).map(a=>a.trim()).filter(Boolean);if(b.length<4)return a;let c=[],d="";for(let a of b)d.length>260&&d.length+a.length>420?(c.push(d),d=a):d+=a;return d&&c.push(d),c.join("\n\n")}).join("\n\n").replace(/\n{3,}/gu,"\n\n").trim()}function cg(a,b,c){if(Number.isFinite(c)&&c>0)return Math.ceil(c);let d=new Set(b.filter(Boolean)),e=a.listFiles?.().filter(a=>0===d.size||d.has(a.relativePath)).reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0)??0;return e>0?e:Math.max(1,d.size)}async function ch(a){var b;aR(a.signal);let c=(0,d.QJ)(a.templateId);if(!c)throw Error("Document template not found");let k=e.resolve(a.projectRoot||(0,g.aY)());if(!k)throw Error("No knowledge base project found");let B=(0,f.computeProjectId)(k),H=c,O=(0,g.Qh)(),Q=[],R=[],S=(b,c=aa)=>{let d=b?[...b].sort((a,b)=>{let c=R.indexOf(a.id),d=R.indexOf(b.id);return(c<0?Number.MAX_SAFE_INTEGER:c)-(d<0?Number.MAX_SAFE_INTEGER:d)}):void 0;a.onProgress?.([...c],d?{chapters:d}:void 0)},V=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),W=async(b,c=aa)=>{let d=setInterval(()=>{a.signal?.aborted||S(Q,c)},V);try{return await b()}finally{clearInterval(d)}},Y=(0,d.N6)(H)||"none",$=(0,i.Mu)(Y)?.name||Y,aa=[bj({type:"role_binding",roleId:Y,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${H.name}`,details:[`当前项目:${B}`,`资料目录:${e.join(k,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:$,roleName:$,order:0})];S();let ab=(0,d.bj)(H),ad=ab.bindings,ae=(0,d.Vh)(H);if(bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:aa.length})),S(),0===ae.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let ag=bF([...ab.writerPrompts,...ab.chapterPrompts]),ah=(0,aj.cs)([{text:a.requirement,source:"用户需求"},{text:ag,source:"提示词角色",strict:!0}]),ai=ah.length>=2;ai&&(H={...c,chapters:ah}),bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${ae.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:aa.length})),S();let ak=await W(()=>Promise.resolve(function(a,b){let c=(0,g.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(F)),e=c.filter(a=>d.has(F(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>G(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板显式绑定文件作为资料范围",ambiguous:!1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=G(b.relativePath);if(!c)continue;let d=function(a,b){let c=0;for(let d of a.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u)){let a=d.trim();a.length>=2&&b.includes(a)&&(c+=1)}return c}(c,f);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>G(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>G(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>G(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),f=d.files,h=function(){let a={};for(let b of w)a[b]=[];return a}(),i=new Map((b?.boundFileRoles||[]).map(a=>[F(a.filePath),a.roles]));for(let a of f){let b=F(a.relativePath),c=[...i.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(p(a,o));return b.add("project_overview"),[...b]}(a.relativePath),...c])])h[b].push({filePath:a.relativePath,fileName:e.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let j=function(a){let b,c;for(let d of x(a)){let a=z(d);if(/项目|工程/iu.test(a)&&!(a.length<6)){if(/\.\w+$/u.test(d)){b||=a;continue}if(y(a)){c||=a.split(/--/u).filter(a=>/项目|工程/u.test(a)).sort((a,b)=>a.length-b.length)[0]||a;continue}return a}}return b||c||"当前知识库项目"}(f),k=function(a){for(let b of a){let a=b.relativePath.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0];if(a)return a}}(f),l=function(a,b){let c=C(a),d=C(b),e=A(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=A(a.map(a=>G(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,documentNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a))}}(f,c),m=function(a){let b=function(a){let b="";for(let c of a)b+=`${c.relativePath}
140
+ `;return b}(a);return{ownerNames:E(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:E(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:E(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:E(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(f),n=v.filter(a=>h[a].length>0),q=v.filter(a=>0===h[a].length);return{projectId:j.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:j,generatedAt:Date.now(),fingerprint:l.fingerprint,contaminationCandidates:l.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:j,documentNo:k,scopeDescriptions:h.scope_description.map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(h.scope_description.concat(h.design_specification,h.structured_data).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:h.schedule_quality_safety.length?"已识别周期、质量、安全或合规相关资料,生成时应以需求文件、变更说明和技术要求为准。":void 0,qualityRequirement:h.schedule_quality_safety.length?"已识别质量或评价相关资料。":void 0,safetyRequirement:h.schedule_quality_safety.length?"已识别安全或合规相关资料。":void 0,materialBrandRequirement:h.resource_recommendation.length?"已识别资源、材料、设备或品牌相关资料。":void 0,ownerNames:m.ownerNames,locationNames:m.locationNames,scheduleValues:m.scheduleValues,qualityTargets:m.qualityTargets},materialInventory:h,extractedSections:{projectOverview:`绑定材料组:${j}${k?`,文档/任务编号:${k}`:""}。`,scopeSummary:`范围资料:${D(h.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${D(h.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${D(h.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${D(h.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(h.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:v,satisfiedRoles:n,missingRoles:q,materialCompletenessRate:v.length?n.length/v.length:1}}}(k,{requirement:a.requirement,boundFilePaths:ae.map(a=>a.filePath),boundFileRoles:(0,d.wR)(ae)})));bk(aa,bj({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(ak.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:aa.length})),S();let al=await W(()=>Promise.resolve(function(a,b=""){let c=function(a,b=""){return j.createHash("sha1").update(JSON.stringify({id:a.id,name:a.name,description:a.description,outputTitle:a.outputTitle,chapters:a.chapters,promptBindings:a.promptBindings,fileBindings:a.fileBindings,projectRoleConfigId:a.projectRoleConfigId,requirement:b})).digest("hex").slice(0,12)}(a,b),d=function(a,b){for(let c of b)for(let b of c.patterns)if(b.lastIndex=0,b.test(a))return c.output[0]}(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`,l)||a.category||"文档",e=function(a,b){let c=[a.name,a.category,a.outputTitle,a.description],d=[];for(let b of a.chapters)for(let a of(c.push(b.title,b.purpose,...b.sections||[],...b.requiredFacts||[],...b.queries||[]),b.requiredFacts||[]))d.push(a);let e=c.filter(Boolean).join("\n"),f=new Set(d);for(let a of p(e,m))f.add(a);for(let c of t(a,b))for(let a of c.requiredFacts)f.add(a);return[...f].filter(Boolean)}(a,d),f=function(a=""){let b=new Set;for(let c of[/(?:必须|需要|要求|增加|包含|包括|补充|设置|新增).{0,12}?(?:章节|章|节|小节)[::为是]?\s*([^。;;\n]{2,80})/giu,/(?:章节|目录).{0,8}?(?:包括|包含|为|是)[::]?\s*([^。;;\n]{2,120})/giu])for(let d of a.matchAll(c))for(let a of d[1].split(/[、,,/]/u).map(a=>a.trim()).filter(Boolean))!/不要|禁止|不得|不能/iu.test(a)&&a.length<=40&&b.add(a.replace(/[。;;::]+$/u,""));return[...b]}(b),g=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/必须|一定要|务必|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:输出|写明)\s*([^。;;\n]{2,30})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&a.length<=30&&!/不要|禁止|不得|不能|生成|要求内容|专业|结构完整|直接用于/u.test(a))}(b),h=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:不要|禁止|不得|不能|不允许|严禁)(?:出现|输出|写|包含)?\s*([^。;;\n]{2,40})/iu);a&&b.add(a[1].replace(/^(这些|以下|内容|词语|文字)[::]?/u,"").trim())}return[...b].filter(a=>a&&!/章节|页|表格/u.test(a))}(b),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),k=t(a,d),o=Math.max(0,...k.map(a=>a.minTables||0)),u=Math.max(function(a=""){let b=a.match(/(?:至少|不少于)?\s*(\d{1,2})\s*(?:个|张)?\s*表格/iu);return b?Number(b[1]):/表格化|用表格|表格形式|表格表达/iu.test(a)?1:void 0}(b)||0,o)||void 0,v=a.chapters.map((a,b)=>{let c=[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]].join("\n"),d=new Set(a.requiredFacts||[]);for(let a of e)(c.includes(a)||RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"iu").test(c))&&d.add(a);for(let a of p(c,n))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(q),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),w=f.filter(a=>!v.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${q(a)}`,title:a,required:!0,order:v.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),x=[{id:"auto-source-required",name:"事实必须有来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"auto-min-source",name:"至少使用绑定材料来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"min_count",min:2}},{id:"auto-no-debug-text",name:"不得输出后台流程话术",type:"forbidden_text",level:"error",value:"知识库证据",evaluator:{subject:"document",operator:"not_contains",value:"知识库证据"}},...k.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${q(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...k.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${q(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...o?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${o} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:o}}]:[],...f.map(a=>({id:`user-required-chapter-${q(a)}`,name:`用户提到章节:${a}`,type:"user_required_chapter",level:"warning",target:a,evaluator:{subject:"chapter",operator:"exists",target:a}})),...g.map(a=>({id:`user-required-text-${q(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...h.map(a=>({id:`user-forbidden-text-${q(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...u?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${u}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:u}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],y=[...v,...w];return{sourceHash:c,managedBy:"system",spec:{id:`auto-${a.id}-${c}`.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),name:`后台优化建议 - ${a.name}`,description:`${d}后台优化建议,由模板、提示词、角色绑定和用户临时要求静默生成,仅用于提升内容完整性,不接管章节结构。`,factFields:e.map(a=>({id:q(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/资源|品牌|重点|难点|约束/iu.test(a),extractionHint:`从绑定材料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与绑定材料一致,不得引入无关事实。`})),chapterMode:"fixed",chapterRules:y,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:x,builtIn:!0}}}(H,a.requirement||""))),am=al.spec,an=function(a,b=""){let c=`${a?.id||""} ${a?.name||""} ${a?.category||""} ${a?.description||""} ${a?.outputTitle||""} ${b}`;return/施工组织设计|施工方案|危大工程|人、材、机|安全文明施工/u.test(c)?K:J}(H,a.requirement||""),ao=function(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","scope_description"]);return/需求|规则|响应|方案|实施|专项|安全|质量|进度|合规/iu.test(b)&&["requirement_document","structured_data","schedule_quality_safety"].forEach(a=>c.add(a)),/设计|方案|说明|图像|地图|附件/iu.test(b)&&c.add("design_specification"),c}(a);return(function(a){let b=new Set(p([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),o));return b.add("project_overview"),b.add("scope_description"),[...b]})(a).map(a=>{let d=b.materialInventory[a]||[],e=c.has(a),f=d.length>0,g=f&&d.length<(e?2:1);return{role:a,required:e,satisfied:f,weak:g,evidenceCount:d.length,filePaths:d.map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(H,ak),ap=function(a){var b;let c=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),d=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),e=[],f=[];0===a.template.chapters.length&&f.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&f.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&e.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&f.push("材料指纹置信度较低,建议绑定明确的材料文件"),a.summary.coverage.materialCompletenessRate<.5&&e.push("绑定材料覆盖率过低,无法支撑文档生成"),c.length>0&&f.push(`模板必需材料角色未完全满足:${c.join("、")}`),d.length>0&&f.push(`部分材料角色证据较弱:${d.join("、")}`);let g=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===e.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(b=a.resolvedRoles).length?b.filter(a=>a.satisfied).length/b.length:1,specCompletenessRate:g.filter(Boolean).length/g.length,missingRoles:c,weakRoles:d,blockingIssues:e,warnings:f}}({template:H,spec:am,summary:ak,resolvedRoles:ao});if(!ap.ready)throw Error(`生成准备度不足:${ap.blockingIssues.join(";")}`);let aq=[I(ak,{publicSafe:!0}),u(am,al.sourceHash,{publicSafe:!0}),P(ap,{publicSafe:!0})].filter(Boolean).join("\n\n"),ar=[I(ak),u(am,al.sourceHash),P(ap)].filter(Boolean).join("\n\n"),as=bF([...ab.writerPrompts,...ab.formattingPrompts]),au=bF([...ab.writerPrompts,...ab.chapterPrompts,...ab.formattingPrompts]),aw=[aq,`生成前规划章节结构:
141
+ ${H.chapters.map(a=>[`- ${a.title}`,a.sections?.length?` 规划小节:${a.sections.join("、")}`:"",a.tableSections?.length?` 表格小节:${a.tableSections.join("、")}`:"",a.tableRequirements?.length?` 表格内容要求:${a.tableRequirements.join(";")}`:""].filter(Boolean).join("\n")).join("\n")}`,as||au].filter(Boolean).join("\n\n"),ax=[ar,bF([...ab.extractionPrompts,...ab.referencePrompts])].filter(Boolean).join("\n\n"),ay=[aq,bF([...ab.validationPrompts,...ab.formattingPrompts])].filter(Boolean).join("\n\n");bk(aa,bj({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${ae.length} 条文件角色绑定`,details:[`提示词角色:${ad.length} 个`,`文件角色:${ae.length} 个`,ai?`识别 OUTLINE 章节:${ah.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:aa.length})),S();let az=bD(k,ae),aA=(0,i.XB)("file"),aC=new Map(ae.flatMap(a=>bB(k,a.filePath).map(b=>[b,a.roleId]))),aH=new Map(ae.flatMap(a=>bB(k,a.filePath).map(b=>[b,aA.find(b=>b.id===a.roleId)?.processingType||"reference"])));bk(aa,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:aa.length})),S();let aI=await W(()=>O.getProject(k)),aJ=cg(aI,[...az],a.maxEvidencePerChapter);bk(aa,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"已读取知识库索引,开始构建角色资料证据池",details:[`证据范围文件:${az.size} 份`,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:aa.length})),S(),aR(a.signal);let aK=[],aL=[],aN=[],aO=[],aP=-1,aS=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(bE(c.content)),b.set(c.roleId,a)}return b}(b),j=function(a,b){let c=[];for(let d of a){if(!b.has(d.id))continue;let a=d.executionType||"reference",e=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${d.id} ${d.name} ${d.description||""}`);("fact_extraction"===a||"reference"===a||e)&&c.push(d)}return c}(f,new Set(h.keys())),k=[];for(let a of e){if(!g.has(a.id))continue;let b=function(a){let b=[],c=[],d=[];for(let e of a)for(let a of(b.push(e.promptRole.id),c.push(e.promptRole.name),e.texts))d.push(a);return{promptRoleIds:b,promptRoleNames:c,promptTexts:d}}(function(a,b,c){let d=[];for(let e of b){let b=c.get(e.id)||[];d.push({promptRole:e,texts:b,score:function(a,b,c){let d=bo(`${a} ${c.join(" ")}`),e=bo(`${b.id} ${b.name} ${b.processingType||""}`),f=function(a,b){let c=0;for(let d of[b.id,b.name,b.processingType||""])d&&a.includes(bo(d))&&(c+=4);return c}(d,b);for(let a of bm.Nx)a.promptPattern.lastIndex=0,a.filePattern&&(a.filePattern.lastIndex=0),(!a.filePattern||a.filePattern.test(e))&&a.promptPattern.test(d)&&(f+=a.points);return f}(e.id,a,b)})}d.sort((a,b)=>b.score-a.score);let e=d.filter(a=>a.score>5);if(e.length>0)return e;let f=d.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b});return f?[f]:[]}(a,j,h));k.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=bo(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of bm.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,ad,ae),aT=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=bp(c,b),j=a.getFileDetail(b,Number.isFinite(d)&&d>0?{maxChunkContentChars:d}:void 0);if(j&&j.chunks.length>0){let a=function(a,b){let c=[],d=0,e=a.chunks||[],f=Number.isFinite(a.totalChunkCount)?Number(a.totalChunkCount):e.length;for(let f of e){let e=_(f.content);if(e){if(Number.isFinite(b)&&b>0&&d+e.length>b&&c.length>0)break;c.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:e,sectionTitle:f.sectionTitle,source:"role-node"}),d+=e.length}}return{evidence:c,totalChunks:f,omittedChunks:Math.max(0,f-e.length)}}(j,d);e.set(f,a.evidence),g+=a.totalChunks,h+=a.evidence.length,i+=a.omittedChunks;continue}e.set(f,[])}return{files:e,uniqueFileCount:e.size,bindingCount:f.bindingCount,totalChunkCount:g,loadedChunkCount:h,omittedChunkCount:i}}(aI,aS,k,af(Math.max(1200,900*ae.length),12e3,aY())),aU=bj({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aT.uniqueFileCount} 份,角色绑定 ${aT.bindingCount} 条,加载片段 ${aT.loadedChunkCount}/${aT.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aT.bindingCount-aT.uniqueFileCount)} 条`,`待执行资料理解节点:${aS.length} 个`,aT.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aT.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aT.uniqueFileCount,total:Math.max(1,aT.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:aa.length});bk(aa,aU),S();let aW=[],aX=function(a,b,c){let d=new Map(("function"==typeof a.listFiles?a.listFiles():[]).map(a=>[String(a.relativePath||""),a])),e=[];for(let a of[...c].sort()){let c=bp(b,a),f=d.get(a)||d.get(c);if(!f){e.push({filePath:c,missing:!0});continue}e.push({filePath:f.relativePath||c,contentHash:f.contentHash,fileSize:f.fileSize,mtime:f.mtime,chunkCount:f.chunkCount,indexedAt:f.indexedAt})}return aM({type:"project-evidence-version-v2",entries:e})}(aI,k,az),aZ=a$()?.model.name,a_=bF([...ab.extractionPrompts,...ab.referencePrompts]),a0=aM({fileBindings:ae,evidenceScopePaths:[...az].sort(),activeModelName:aZ,projectEvidenceVersion:aX,promptTexts:a_,materialFingerprint:ak.fingerprint,materialInventory:Object.fromEntries(Object.entries(ak.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),a1=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aS.length>12?1:2)),a3=Math.max(1,Math.min(aS.length||1,3,Number.isFinite(a1)?Math.floor(a1):1));for(let b=0;b<aS.length;b+=a3){aR(a.signal);let c=aS.slice(b,b+a3).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(bp(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return ac(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aT,c,k).filter(a=>bC(k,a.filePath,az)),g=aa.length,h=bj({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aS.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});aa.push(h),S();let i=await W(()=>bs(H,c,f,a.signal)),j=bj({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bl(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aS.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return aa[g]=j,S(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))aK.push(...a.evidence),aW.push(a.artifact);let d=ac(aK,{maxItems:Math.max(40,8*aS.length),maxChars:Math.max(45e3,5e3*aS.length),preservePinned:!0});aK.splice(0,aK.length,...d)}let a7=a5(aK,H,am),bi=a8(aK,an),br=bh([...aW.flatMap(a=>a.facts.map(a=>({key:a.key,value:aQ(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...a7,...bi],a4(aK),aL,am,an),bx=function(a,b){let c=[];for(let a of b)if("template_requirements"===a.node.outputType)for(let b of a.chapters)c.push(b);c.sort((a,b)=>a.order-b.order);let e=new Map;for(let b of c){let c=(0,aj.YZ)(b.title);!(!(0,aj.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(H,aW),bG=(0,aj._9)(H,am,{preserveExplicitOutline:ai}),bH=[H.name,H.outputTitle,a.requirement,...bG.flatMap(a=>[a.title,a.purpose,...a.sections||[]])].filter(Boolean).join(" "),bI=(0,h.Hh)(bH,void 0,k),bJ=[bI.length>0?bI.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",function(a){let b=Math.max(4,Math.min(12,Number(process.env.DOCUMENT_ROLE_DIGEST_ARTIFACT_LIMIT??8)));return a.slice(0,b).map(a=>(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_DIGEST_CHAPTER_LIMIT??18))),d=Math.max(16,Math.min(60,Number(process.env.DOCUMENT_ROLE_DIGEST_FACT_LIMIT??30))),e=[];for(let b of a.chapters.slice(0,c))e.push(`- ${b.title}:${(b.requiredContents.join("、")||b.sourceRequirement).slice(0,180)}`);e.length>0&&b.push(`章节/要求:
142
142
  ${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aQ(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
143
- ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aU)].filter(Boolean).join("\n\n"),bJ={...H,chapters:bx},bK=(0,aF.tF)({requirement:a.requirement,promptTexts:au,template:bJ,chapters:bx,spec:am}),bL=0,bM=0;bx=await Promise.all(bx.map(async b=>{if(b.sections?.length)return bL+=1,b;bM+=1;let c=ac(aJ.filter(a=>a.chapterId===b.id||(0,Z.Lk)(a,b.title)),{maxItems:a.maxEvidencePerChapter||10,maxChars:af(bK.chapterTargets.get(b.id)||1200),preservePinned:!0}),d=bv(aU,b,bt(b,br)),e=await bT({template:bJ,chapter:b,evidence:c,promptTexts:au,projectContext:bI,requirement:a.requirement,roleContext:d,targetWords:bK.chapterTargets.get(b.id)||1200,signal:a.signal});return e.length?{...b,sections:e}:b})),H={...H,chapters:bx};let bN=(0,aF.tF)({requirement:a.requirement,promptTexts:au,template:H,chapters:bx,spec:am});R=bx.map(a=>a.id);let bQ=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
143
+ ${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(aW)].filter(Boolean).join("\n\n"),bK={...H,chapters:bG},bL=(0,aF.tF)({requirement:a.requirement,promptTexts:aw,template:bK,chapters:bG,spec:am}),bM=0,bN=0;bG=await Promise.all(bG.map(async b=>{if(b.sections?.length)return bM+=1,b;bN+=1;let c=ac(aK.filter(a=>a.chapterId===b.id||(0,Z.Lk)(a,b.title)),{maxItems:a.maxEvidencePerChapter||10,maxChars:af(bL.chapterTargets.get(b.id)||1200),preservePinned:!0}),d=bv(aW,b,bt(b,bx)),e=await bT({template:bK,chapter:b,evidence:c,promptTexts:aw,projectContext:bJ,requirement:a.requirement,roleContext:d,targetWords:bL.chapterTargets.get(b.id)||1200,signal:a.signal});return e.length?{...b,sections:e}:b})),H={...H,chapters:bG};let bQ=(0,aF.tF)({requirement:a.requirement,promptTexts:aw,template:H,chapters:bG,spec:am});R=bG.map(a=>a.id);let bR=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
144
144
  ${a.template.category||""}
145
- ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:H,targetWords:bN.targetChars||[...bN.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bQ.targetLlmConcurrency>0&&(b=bQ.targetLlmConcurrency,void 0===aV||!Number.isFinite(b)||b<=0||(aV=Math.min(aV,Math.floor(b))),aY());let bR={strategy:bQ,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aY(),limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0,searchQueries:0,searchMs:0,contextChars:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0}},bS=bQ.targetLlmConcurrency>0?`LLM 并发上限 ${bQ.targetLlmConcurrency}`:"LLM 不做本地并发限流";bk(aa,bj({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bQ.mode} 生成策略:章节审查 ${bQ.enableChapterReview?"启用":"跳过"}、全局审查 ${bQ.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bQ.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bQ.enableDocumentBudgetExpansion?"启用":"跳过"};${bS}`},{subtitle:"后台自动策略"}));let bU=bj({type:"context_recall",roleId:"project-memory",status:bH.length>0?"success":"skipped",message:bH.length>0?`已注入 ${bH.length} 条短期/长期上下文`:"未召回可用上下文"},{subtitle:"上下文记忆"}),bV=ai?"OUTLINE 章节":"模板章节",bW=bj({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bM} 章由 LLM 基于${bV}、角色和绑定文件证据规划小节,${bL} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bX=ai?`;识别到 OUTLINE 章节 ${ah.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",b_=[...ab.prompts.map(a=>`${a.category}|${a.roleId}|${a.name}|${a.bindingSource}`),...ab.unresolvedRoles.map(a=>`unresolved|${a}|未解析到提示词资源`),...ab.runtimeRequiredBindings.map(a=>`runtimeRequired|${a.roleId}|${a.promptId}|${a.reason}`)];bk(aa,bj({type:"role_binding",roleId:Y,status:"success",message:`已绑定 ${ae.length} 个文件角色、${ab.prompts.length} 个有效提示词;写作控制 ${ab.generationPrompts.length}、资料抽取 ${ab.extractionPrompts.length}、校验 ${ab.validationPrompts.length}、参考 ${ab.referencePrompts.length};后台优化建议关注 ${am.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ap.materialCoverageRate)}%${bX}`,details:b_},{subtitle:$,roleName:$})),bk(aa,bj({type:"validation",roleId:"document-readiness",status:ap.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ap.materialCoverageRate)}%,资料角色 ${Math.round(100*ap.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ap.specCompletenessRate)}%;${ak.source.selectionReason}`},{subtitle:"生成准备度检查"})),bk(aa,bU),bk(aa,bW),S();let b0=process.env.DOCUMENT_CHAPTER_CONCURRENCY,b1=Number(b0??bQ.maxChapterConcurrency),b2=Math.max(1,Math.min(bx.length||1,bQ.maxChapterConcurrency,Number.isFinite(b1)?Math.floor(b1):bQ.maxChapterConcurrency));bk(aa,bj({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${b2}/${bx.length} 章并发`,details:[`策略上限:${bQ.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${b0??"未设置"}`,`有效章节数:${bx.length}`]},{subtitle:"章节并发策略"})),S();for(let b=0;b<bx.length;b+=b2){let c=bx.slice(b,b+b2);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;aR(a.signal);let h=Date.now(),i=aa.length,j=ab.generationPrompts,l=j[0]?.id,m=j.length?j.map(a=>`${a.category}|${a.roleId}|${a.name}`).slice(0,8):["未加载写作控制提示词"];try{aa.push(bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${bx.length}`,`二级小节:${c.sections?.length||0} 个`,...m.map(a=>`写作控制提示词:${a}`),"正在生成检索查询"],progress:{current:g+1,total:bx.length,label:"章节生成"}},{subtitle:(0,aj.GQ)(c.title),order:g})),S();let b=[],d=bt(c,br),n=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],o=c.queries.length>0?c.queries:[H.name,H.outputTitle,c.title],p=[...new Set([...o,...n])].filter(Boolean),q=Date.now();aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 正在执行 ${p.length} 组知识库检索`,details:p.map(a=>`检索:${a.slice(0,42)}`),progress:{current:g+1,total:bx.length,label:"证据检索"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S();let r=[...ay].filter(Boolean).sort(),s=[],t=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let b of p.slice(0,t)){if(aR(a.signal),0===r.length)break;let c=await O.search(k,b,{scope:"project",filters:{filePaths:r},limit:Math.min(aI,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15},generationMode:!1});s.push(c.results)}for(let a of(bR.evidence.searchQueries+=Math.min(p.length,t),bR.evidence.searchMs+=Date.now()-q,s))b.push(...a.filter(a=>bC(k,a.filePath,ay)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aA.get(a.filePath),processingType:aC.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let u=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),v=bu(aU,c,d);b.push(...v.flatMap(({artifact:a})=>a.evidence.filter(a=>bC(k,a.filePath,ay)).map(a=>({...a,chapterId:c.id,source:"role-node"}))));let w=new Set([...u]),x=bN.chapterTargets.get(c.id)||1200,y=af(x,6e3,Math.max(12e3,3e3*aY()));for(let a of w){if(!bC(k,a,ay))continue;let d=u.has(a),e=aH.getFileDetail(a,{maxChunkContentChars:y});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aA.get(e.file.relativePath),processingType:aC.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let z=b.filter(a=>bC(k,a.filePath,ay)),A=af(x,8e3,Math.max(16e3,3500*aY())),B=ac(z,{maxChars:A,preservePinned:!0},bR);bR.evidence.contextChars+=B.reduce((a,b)=>a+b.content.length,0),aJ.push(...B);let C=ac(aJ,{maxChars:Math.max(5e4,9e3*bx.length),preservePinned:!0});aJ.splice(0,aJ.length,...C);let D=c.requiredFacts.filter(a=>!B.some(b=>(0,Z.Lk)(b,a)));for(let a of(0===B.length&&aK.push(`${c.title}:未检索到明确资料依据`),D))aK.push(`${c.title}:${a} 未检索到明确依据`);let E=bj({type:"knowledge_retrieval",roleId:"knowledge-base",status:aJ.length>0?"success":"fallback",message:`已检索/绑定 ${aJ.length} 条证据`});aO<0?aO=bk(aa,E):aa[aO]={...E,order:aa[aO]?.order??E.order},S(),aR(a.signal);let F=bw(aU,H),G=bv(aU,c,d),I=[aq,bF(j)].filter(Boolean).join("\n\n"),K=function(a){let b=a.profile||J,c=[],d=[a.template.name,a.template.outputTitle,a.chapter.title,a.chapter.purpose,...a.chapter.sections||[]].filter(Boolean).join(" "),e=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title);for(let d of a.chapter.requiredFacts||[])bd(c,b,{label:d,category:L(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])bd(c,b,{label:d,category:"section",required:!1,source:"section",queries:bc(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])bd(c,b,{label:d,category:L(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])bd(c,b,{label:d,category:L(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of e?.requiredFactIds||[]){let e=a.spec?.factFields.find(a=>a.id===d);e&&bd(c,b,{label:e.name,category:L(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:bc(e.name,[e.extractionHint||"",e.validationHint||""])})}for(let e of a.spec?.factFields||[]){if(!e.required)continue;let f=L(b,e.name),g=`${e.name} ${e.extractionHint||""} ${e.validationHint||""}`;(d.includes(e.name)||bc(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&bd(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:bc(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&be(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=bb(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&be(c,b,a,"requirement",!0,[f]);let g=bb(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&be(c,b,d,"prompt","must_use"===d.usagePolicy,[a.chapter.title]);return c}({template:H,chapter:c,spec:am,profile:an,promptTexts:I,requirement:a.requirement,plan:d}),P=function(a){let b=a.profile||J,c=bf([...a.factsModel.factIndex.parameterFacts,...a.factsModel.factIndex.tableFacts,...a.factsModel.factIndex.drawingFacts,...a.factsModel.factIndex.billFacts,...a.factsModel.factIndex.reliableFacts]);return a.needs.map(d=>{let e=bf(c.filter(a=>(function(a,b,c){let d=a9(a);if(ba(a)||M(c,d)||N(c,d))return!1;if(b.fieldId&&a.fieldId===b.fieldId||L(c,a.fieldName||a.key)?.id===b.fieldId||b.queries.filter(a=>a.length>=2).some(a=>d.includes(a)))return!0;let e=L(c,b.label);return!!(e&&[e.name,...e.aliases].some(a=>a.length>=2&&d.includes(a)))})(a,d,b))).sort((a,b)=>(b.confidence||0)-(a.confidence||0)),f=(a.evidence||[]).filter(a=>(function(a,b,c){let d=`${a.filePath} ${a.roleId||""} ${a.processingType||""} ${a.sectionTitle||""} ${a.content}`;return!(M(c,d)||N(c,d))&&b.queries.some(a=>a.length>=2&&d.includes(a))})(a,d,b)),g=Math.max(0,...e.map(a=>a.confidence||0)),h=0===e.length&&0===f.length?"missing":g>0&&g<.58?"low_confidence":"satisfied";return{need:d,facts:e,evidence:f,status:h}})}({needs:K,factsModel:bi,evidence:z,profile:an}),R=bf(P.flatMap(a=>a.facts)),T=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[],...(a.resolvedFactNeeds||[]).filter(a=>a.need.required).map(a=>a.need.label)].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${_(aQ(a.value))}`),f=(a.resolvedFactNeeds||[]).flatMap(a=>a.facts),g=f.length>0?[]:(a.indexedFacts||[]).slice(0,40).map(a=>`- ${a.key||a.fieldName||"资料事实"}:${_(aQ(a.value)).slice(0,180)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`),h=[...new Set([...function(a){let b=new Set,c=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|天|周|月|年)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;for(let d of a){let a=aQ(d.content).replace(/\s+/gu," ");if(!/报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(a)&&!/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂/u.test(a)){for(let d of a.matchAll(c))b.add(d[0].trim());if(b.size>=40)break}}return[...b].slice(0,40)}(a.evidence),...f.map(a=>aQ(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡/iu.test(a)).slice(0,80),...(a.indexedFacts||[]).map(a=>aQ(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡/iu.test(a)).slice(0,40)])].slice(0,100),i=new Set([...a.evidence.map(a=>a.filePath),...f.map(a=>a.sourceFile),...(a.indexedFacts||[]).map(a=>a.sourceFile)]).size,j=(a.resolvedFactNeeds||[]).filter(a=>"satisfied"!==a.status&&a.need.required).map(a=>a.need.label);return["【本章事实覆盖与参数落位要求】",d.length?`必须优先覆盖的事实/要求:
145
+ ${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:H,targetWords:bQ.targetChars||[...bQ.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bR.targetLlmConcurrency>0&&(b=bR.targetLlmConcurrency,void 0===aV||!Number.isFinite(b)||b<=0||(aV=Math.min(aV,Math.floor(b))),aY());let bS={strategy:bR,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aY(),limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0,searchQueries:0,searchMs:0,contextChars:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0}},bU=bR.targetLlmConcurrency>0?`LLM 并发上限 ${bR.targetLlmConcurrency}`:"LLM 不做本地并发限流";bk(aa,bj({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bR.mode} 生成策略:章节审查 ${bR.enableChapterReview?"启用":"跳过"}、全局审查 ${bR.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bR.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bR.enableDocumentBudgetExpansion?"启用":"跳过"};${bU}`},{subtitle:"后台自动策略"}));let bV=bj({type:"context_recall",roleId:"project-memory",status:bI.length>0?"success":"skipped",message:bI.length>0?`已注入 ${bI.length} 条短期/长期上下文`:"未召回可用上下文"},{subtitle:"上下文记忆"}),bW=ai?"OUTLINE 章节":"模板章节",bX=bj({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${bN} 章由 LLM 基于${bW}、角色和绑定文件证据规划小节,${bM} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),b_=ai?`;识别到 OUTLINE 章节 ${ah.length} 个`:";未识别到有效 OUTLINE,将使用模板章节",b0=[...ab.prompts.map(a=>`${a.category}|${a.roleId}|${a.name}|${a.bindingSource}`),...ab.unresolvedRoles.map(a=>`unresolved|${a}|未解析到提示词资源`),...ab.runtimeRequiredBindings.map(a=>`runtimeRequired|${a.roleId}|${a.promptId}|${a.reason}`)];bk(aa,bj({type:"role_binding",roleId:Y,status:"success",message:`已绑定 ${ae.length} 个文件角色、${ab.prompts.length} 个有效提示词;写作 ${ab.writerPrompts.length}、章节 ${ab.chapterPrompts.length}、抽取 ${ab.extractionPrompts.length}、校验 ${ab.validationPrompts.length};后台优化建议关注 ${am.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ap.materialCoverageRate)}%${b_}`,details:b0},{subtitle:$,roleName:$})),bk(aa,bj({type:"validation",roleId:"document-readiness",status:ap.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ap.materialCoverageRate)}%,资料角色 ${Math.round(100*ap.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ap.specCompletenessRate)}%;${ak.source.selectionReason}`},{subtitle:"生成准备度检查"})),bk(aa,bV),bk(aa,bX),S();let b1=process.env.DOCUMENT_CHAPTER_CONCURRENCY,b2=Number(b1??bR.maxChapterConcurrency),cb=Math.max(1,Math.min(bG.length||1,bR.maxChapterConcurrency,Number.isFinite(b2)?Math.floor(b2):bR.maxChapterConcurrency));bk(aa,bj({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${cb}/${bG.length} 章并发`,details:[`策略上限:${bR.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${b1??"未设置"}`,`有效章节数:${bG.length}`]},{subtitle:"章节并发策略"})),S();for(let b=0;b<bG.length;b+=cb){let c=bG.slice(b,b+cb);await Promise.all(c.map(async(c,d)=>{let f,g=b+d;aR(a.signal);let h=Date.now(),i=aa.length;try{aa.push(bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${g+1}/${bG.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:g+1,total:bG.length,label:"章节生成"}},{subtitle:(0,aj.GQ)(c.title),order:g})),S();let b=[],d=bt(c,bx),j=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],l=c.queries.length>0?c.queries:[H.name,H.outputTitle,c.title],m=[...new Set([...l,...j])].filter(Boolean),n=Date.now();aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 正在执行 ${m.length} 组知识库检索`,details:m.map(a=>`检索:${a.slice(0,42)}`),progress:{current:g+1,total:bG.length,label:"证据检索"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S();let o=[...az].filter(Boolean).sort(),p=[],q=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let b of m.slice(0,q)){if(aR(a.signal),0===o.length)break;let c=await O.search(k,b,{scope:"project",filters:{filePaths:o},limit:Math.min(aJ,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15},generationMode:!1});p.push(c.results)}for(let a of(bS.evidence.searchQueries+=Math.min(m.length,q),bS.evidence.searchMs+=Date.now()-n,p))b.push(...a.filter(a=>bC(k,a.filePath,az)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aC.get(a.filePath),processingType:aH.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let r=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),s=bu(aW,c,d);b.push(...s.flatMap(({artifact:a})=>a.evidence.filter(a=>bC(k,a.filePath,az)).map(a=>({...a,chapterId:c.id,source:"role-node"}))));let t=new Set([...r]),u=bQ.chapterTargets.get(c.id)||1200,v=af(u,6e3,Math.max(12e3,3e3*aY()));for(let a of t){if(!bC(k,a,az))continue;let d=r.has(a),e=aI.getFileDetail(a,{maxChunkContentChars:v});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aC.get(e.file.relativePath),processingType:aH.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let w=b.filter(a=>bC(k,a.filePath,az)),x=af(u,8e3,Math.max(16e3,3500*aY())),y=ac(w,{maxChars:x,preservePinned:!0},bS);bS.evidence.contextChars+=y.reduce((a,b)=>a+b.content.length,0),aK.push(...y);let z=ac(aK,{maxChars:Math.max(5e4,9e3*bG.length),preservePinned:!0});aK.splice(0,aK.length,...z);let A=c.requiredFacts.filter(a=>!y.some(b=>(0,Z.Lk)(b,a)));for(let a of(0===y.length&&aL.push(`${c.title}:未检索到明确资料依据`),A))aL.push(`${c.title}:${a} 未检索到明确依据`);let B=bj({type:"knowledge_retrieval",roleId:"knowledge-base",status:aK.length>0?"success":"fallback",message:`已检索/绑定 ${aK.length} 条证据`});aP<0?aP=bk(aa,B):aa[aP]={...B,order:aa[aP]?.order??B.order},S(),aR(a.signal);let C=bw(aW,H),D=bv(aW,c,d),E=[aq,function(a,b){return bF(a.filter(a=>(function(a,b){let c=`${a.roleId} ${a.name} ${b.title} ${(b.sections||[]).join(" ")}`;return"writer"===a.category||"formatting"===a.category||"chapter"===a.category&&!!(/资源|材料|设备|劳动力|人材机/u.test(c)&&/资源|材料|设备|劳动力|人材机/u.test(`${a.roleId} ${a.name}`)||/安全|文明|危大|风险/u.test(c)&&/安全|文明|危大|风险/u.test(`${a.roleId} ${a.name}`)||/进度|工期|质量|验收/u.test(c)&&/进度|工期|质量|验收/u.test(`${a.roleId} ${a.name}`)||/施工|方法|工艺|技术|土建|结构|安装|给排水|电气/u.test(c)&&/施工|方法|工艺|技术/u.test(`${a.roleId} ${a.name}`))})(a,b)))}([...ab.writerPrompts,...ab.chapterPrompts,...ab.formattingPrompts],c)].filter(Boolean).join("\n\n"),F=function(a){let b=a.profile||J,c=[],d=[a.template.name,a.template.outputTitle,a.chapter.title,a.chapter.purpose,...a.chapter.sections||[]].filter(Boolean).join(" "),e=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title);for(let d of a.chapter.requiredFacts||[])bd(c,b,{label:d,category:L(b,d)?.category||"required",required:!0,source:"template"});for(let d of a.chapter.sections||[])bd(c,b,{label:d,category:"section",required:!1,source:"section",queries:bc(d,[a.chapter.title])});for(let d of a.plan?.requiredContents||[])bd(c,b,{label:d,category:L(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of a.plan?.evidenceNeeds||[])bd(c,b,{label:d,category:L(b,d)?.category||"plan",required:!0,source:"plan"});for(let d of e?.requiredFactIds||[]){let e=a.spec?.factFields.find(a=>a.id===d);e&&bd(c,b,{label:e.name,category:L(b,e.name)?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:bc(e.name,[e.extractionHint||"",e.validationHint||""])})}for(let e of a.spec?.factFields||[]){if(!e.required)continue;let f=L(b,e.name),g=`${e.name} ${e.extractionHint||""} ${e.validationHint||""}`;(d.includes(e.name)||bc(e.name,f?.aliases||[]).some(a=>d.includes(a))||a.chapter.requiredFacts.some(a=>a.includes(e.name)||e.name.includes(a)))&&bd(c,b,{label:e.name,category:f?.category||"spec",required:!0,source:"spec",fieldId:e.id,queries:bc(e.name,[g])})}for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&d.includes(a))&&be(c,b,a,"profile","must_use"===a.usagePolicy,[d]);let f=bb(a.requirement||"");if(f)for(let a of b.factFields)[a.name,...a.aliases].some(a=>a.length>=2&&f.includes(a))&&be(c,b,a,"requirement",!0,[f]);let g=bb(a.promptTexts||"");if(g)for(let d of b.factFields)[d.name,...d.aliases].some(a=>a.length>=2&&g.includes(a))&&be(c,b,d,"prompt","must_use"===d.usagePolicy,[a.chapter.title]);return c}({template:H,chapter:c,spec:am,profile:an,promptTexts:E,requirement:a.requirement,plan:d}),G=function(a){let b=a.profile||J,c=bf([...a.factsModel.factIndex.parameterFacts,...a.factsModel.factIndex.tableFacts,...a.factsModel.factIndex.drawingFacts,...a.factsModel.factIndex.billFacts,...a.factsModel.factIndex.reliableFacts]);return a.needs.map(d=>{let e=bf(c.filter(a=>(function(a,b,c){let d=a9(a);if(ba(a)||M(c,d)||N(c,d))return!1;if(b.fieldId&&a.fieldId===b.fieldId||L(c,a.fieldName||a.key)?.id===b.fieldId||b.queries.filter(a=>a.length>=2).some(a=>d.includes(a)))return!0;let e=L(c,b.label);return!!(e&&[e.name,...e.aliases].some(a=>a.length>=2&&d.includes(a)))})(a,d,b))).sort((a,b)=>(b.confidence||0)-(a.confidence||0)),f=(a.evidence||[]).filter(a=>(function(a,b,c){let d=`${a.filePath} ${a.roleId||""} ${a.processingType||""} ${a.sectionTitle||""} ${a.content}`;return!(M(c,d)||N(c,d))&&b.queries.some(a=>a.length>=2&&d.includes(a))})(a,d,b)),g=Math.max(0,...e.map(a=>a.confidence||0)),h=0===e.length&&0===f.length?"missing":g>0&&g<.58?"low_confidence":"satisfied";return{need:d,facts:e,evidence:f,status:h}})}({needs:F,factsModel:br,evidence:w,profile:an}),I=bf(G.flatMap(a=>a.facts)),K=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[],...(a.resolvedFactNeeds||[]).filter(a=>a.need.required).map(a=>a.need.label)].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${_(aQ(a.value))}`),f=(a.resolvedFactNeeds||[]).flatMap(a=>a.facts),g=f.length>0?[]:(a.indexedFacts||[]).slice(0,40).map(a=>`- ${a.key||a.fieldName||"资料事实"}:${_(aQ(a.value)).slice(0,180)}${a.sourceFile?`(来源:${a.sourceFile.split("/").pop()})`:""}`),h=[...new Set([...function(a){let b=new Set,c=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|天|周|月|年)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;for(let d of a){let a=aQ(d.content).replace(/\s+/gu," ");if(!/报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(a)&&!/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂/u.test(a)){for(let d of a.matchAll(c))b.add(d[0].trim());if(b.size>=40)break}}return[...b].slice(0,40)}(a.evidence),...f.map(a=>aQ(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡/iu.test(a)).slice(0,80),...(a.indexedFacts||[]).map(a=>aQ(a.value)).filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|JGJ|ISO|台|套|个|项|批|次|份|人|㎡/iu.test(a)).slice(0,40)])].slice(0,100),i=new Set([...a.evidence.map(a=>a.filePath),...f.map(a=>a.sourceFile),...(a.indexedFacts||[]).map(a=>a.sourceFile)]).size,j=(a.resolvedFactNeeds||[]).filter(a=>"satisfied"!==a.status&&a.need.required).map(a=>a.need.label);return["【本章事实覆盖与参数落位要求】",d.length?`必须优先覆盖的事实/要求:
146
146
  ${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
147
147
  ${e.join("\n")}`:"",a.factNeedsPrompt||"",g.length?`全局资料事实索引匹配到的本章可写事实:
148
- ${g.join("\n")}`:"",h.length?`本章资料中可直接使用的可靠精确参数/编号:${h.join("、")}。这些参数来自绑定资料,不属于编造;涉及对应对象、部位、工序、材料、设备、质量验收或安全控制时必须自然写入正文,并保持原样或等价专业表达。不得写入商务金额、单价、税率、预留金。`:"",j.length?`当前事实需求仍未充分确认:${j.join("、")}。未确认项不得编造;但已满足事实需求中的资料事实必须写入对应小节。`:"",a.missingFacts.length?`模板显式要求中当前检索未充分命中的项:${a.missingFacts.join("、")}。未命中项不得编造,但不得因此省略上方已经明确的可靠参数。`:"",`本章可用材料来源约 ${i} 个文件,正文必须按事实需求把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:am,roleFacts:v,evidence:B,missingFacts:D,indexedFacts:R,resolvedFactNeeds:P,factNeedsPrompt:function(a){let b=a.map(a=>{let b=a.facts.slice(0,5).map(b=>`${b.key||b.fieldName||a.need.label}=${bg(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${bg(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?`事实需求覆盖卡片:
149
- ${b.join("\n")}`:""}(P)}),U={total:P.length,satisfied:P.filter(a=>"satisfied"===a.status).length,missing:P.filter(a=>"missing"===a.status).length,lowConfidence:P.filter(a=>"low_confidence"===a.status).length},V=P.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);for(let a of V)aK.push(`${c.title}:事实需求未确认 ${a}`);let X=am?.chapterRules.find(a=>a.id===c.id||a.title===c.title),Y=bN.chapterTargets.get(c.id)||1200,$=Math.ceil(Y*(bN.maxChars?1.1:1.18)),ab=bN.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*Y))):1200,ad=Math.max(d?.minWords||0,X?.minWords||0,am?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*Y),ab),ae=bZ(ad,Y),ag=bN.longformStrict?.82:.55,ah=bN.longformStrict?Math.max(5200,Math.ceil(.9*Y)):2600,ai=Math.max(900,Math.min(Y,Math.ceil(Y*ag),ah)),ak=Math.max(450,Math.min(ad,Math.floor(.72*ai))),al=Math.max(ai+300,Math.min($,Math.ceil(1.25*ai))),ao=bZ(ak,ai),ap=Math.min(b$(ai),3e5),ar=c.sections?.filter(Boolean).length||0,as=/[、,,;;]/u.test(c.title),au=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&ar>=2&&!as;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:au?`${(0,aj.GQ)(c.title)} 正在按小节并发成稿`:`${(0,aj.GQ)(c.title)} 正在整章一次成稿`,details:au?[`有效证据:${B.length} 条`,...m.map(a=>`写作控制提示词:${a}`),`事实需求:${U.satisfied}/${U.total} 已满足,缺失 ${U.missing},低置信 ${U.lowConfidence}`,`目标字数:约 ${Y} 字,上限约 ${$} 字`,`小节并发上限:${bQ.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[`有效证据:${B.length} 条`,...m.map(a=>`写作控制提示词:${a}`),`事实需求:${U.satisfied}/${U.total} 已满足,缺失 ${U.missing},低置信 ${U.lowConfidence}`,`目标字数:约 ${Y} 字,上限约 ${$} 字`,`章节并发上限:${b2}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:bx.length,label:au?"小节并发":"整章成稿"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S();let av=au?await W(()=>bn(bR,`chapter-section-draft:${c.id}`,()=>a2(b=>bY({template:H,chapter:c,evidence:B,missingFacts:D,promptTexts:I,projectContext:bI,requirement:a.requirement,roleContext:G,targetWords:Y,maxWords:$,forbidDrawingImages:F,factCoverageContext:T,projectRoot:k,modelName:aX,fileRolesHash:a_,allowPartialResult:!1,maxSectionConcurrency:bQ.maxSectionConcurrency,diagnostics:bR,signal:b}),Math.min(b$(Y),Math.max(24e4,Math.ceil(15e4*(c.sections?.length||2)/Math.max(1,bQ.maxSectionConcurrency||1)))),a.signal))):await W(()=>bn(bR,`chapter-draft:${c.id}`,()=>a2(b=>bP(H,c,B,D,I,bI,a.requirement,G,{forbidDrawingImages:F,minWords:ad,targetWords:Y,maxWords:$,maxTokens:ae,factCoverageContext:T,signal:b}),b$(Y),a.signal)));if(!av&&au?(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${Y} 字`,`有效证据:${B.length} 条`],progress:{current:g+1,total:bx.length,label:"整章兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),av=await W(()=>bn(bR,`chapter-draft-fallback:${c.id}`,()=>a2(b=>bP(H,c,B,D,I,bI,a.requirement,G,{forbidDrawingImages:F,minWords:ak,targetWords:ai,maxWords:al,maxTokens:ao,factCoverageContext:T,signal:b}),ap,a.signal)))):av||(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${Y} 字`,`有效证据:${B.length} 条`],progress:{current:g+1,total:bx.length,label:"整章兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),av=await W(()=>bn(bR,`chapter-draft-fallback:${c.id}`,()=>a2(b=>bP(H,c,B,D,I,bI,a.requirement,G,{forbidDrawingImages:F,minWords:ak,targetWords:ai,maxWords:al,maxTokens:ao,factCoverageContext:T,signal:b}),ap,a.signal)))),aR(a.signal),av||(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${Y} 字`],progress:{current:g+1,total:bx.length,label:"紧凑兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),av=await W(()=>bn(bR,`chapter-draft-compact-fallback:${c.id}`,()=>a2(b=>bP(H,c,B,D,I,bI,a.requirement,G,{forbidDrawingImages:F,minWords:Math.max(450,Math.floor(.75*ad)),targetWords:Y,maxWords:$,maxTokens:ae,factCoverageContext:T,signal:b}),b$(Y),a.signal)))),aR(a.signal),!av)throw Error(`${c.title} 大模型未返回有效章节正文`);let aw=ca(av,c);if(aw.length>0){let b=av;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 首次成稿存在 ${aw.length} 个小节缺口,正在定向补写`,details:aw.map(a=>a.message),progress:{current:g+1,total:bx.length,label:"小节补写"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),av=await W(()=>bn(bR,`chapter-supplement:${c.id}`,()=>b3({template:H,chapter:c,content:b,evidence:B,missingFacts:D,promptTexts:I,projectContext:bI,requirement:a.requirement,roleContext:G,targetWords:Y,forbidDrawingImages:F,factCoverageContext:T,maxSectionConcurrency:bQ.maxSectionConcurrency,forcedSections:aw,signal:a.signal})))}if((aw=ca(av,c)).length>0){aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 首次生成仍有 ${aw.length} 个小节缺口,正在章节内强制补齐`,details:aw.map(a=>a.message),progress:{current:g+1,total:bx.length,label:"章节内小节补齐"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let b=av;av=await W(()=>bn(bR,`chapter-forced-section-supplement:${c.id}`,()=>b3({template:H,chapter:c,content:b,evidence:B,missingFacts:D,promptTexts:I,projectContext:bI,requirement:a.requirement,roleContext:G,targetWords:Y,forbidDrawingImages:F,factCoverageContext:T,maxSectionConcurrency:bQ.maxSectionConcurrency,forcedSections:aw,signal:a.signal}))),aw=ca(av,c)}aw.length>0&&(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"fallback",message:`${(0,aj.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:aw.map(a=>a.message),progress:{current:g+1,total:bx.length,label:"保留可用章节"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q));let ax=by({chapter:c,content:av,missingFacts:D,targetWords:Y}),az=(0,aG.Ff)(ax);bR.quality.blockingCount+=az.blocking,bR.quality.importantCount+=az.important,bR.quality.minorCount+=az.minor;let aB=bq(ax);if(aB.length>0){let b=av;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 正在根据质量问题修复章节:${aB.length} 个阻断问题`,details:aB,progress:{current:g+1,total:bx.length,label:"章节修复"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let d=await W(()=>bn(bR,`chapter-repair:${c.id}`,()=>bz({template:H,chapter:{id:c.id,title:c.title,content:b,evidence:B,missingFacts:[...D,...V.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:aB,promptTexts:I,requirement:a.requirement,forbidDrawingImages:F,diagnostics:bR,signal:a.signal})));av=d.content,d.appliedCount>0&&(bR.quality.repairedCount+=1),aR(a.signal)}if(!av?.trim())throw Error(`${(0,aj.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let aD=cc(av,c),aE=0;if((0,aF.V7)(aD)<Math.floor(.82*Y)||bq(by({chapter:c,content:aD,missingFacts:D,targetWords:Y})).length>0){aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:"running",message:`${(0,aj.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aF.V7)(aD)} 字 / 目标 ${Math.floor(.95*Y)} 字`,`章节并发:${b2}`],progress:{current:g+1,total:bx.length,label:"章节扩写"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let b=await W(()=>bn(bR,`chapter-expand:${c.id}`,()=>b4({template:H,chapter:c,content:av,evidence:B,promptTexts:I,requirement:a.requirement,roleContext:G,targetChars:Math.floor(.95*Y),maxChars:$,forbidDrawingImages:F,maxTokens:Math.min(ae,ao),signal:a.signal})));aD=cc(b.content,c),aE=b.rounds}aD=cf(aD,c);let aL=(0,aF.V7)(aD),aM=c.sections?.length?c.sections:at(aD),aP=(0,aG.qK)(aD,[{title:c.title,content:aD,sections:aM}]).map(a=>a.message),aS=[...by({chapter:{...c,sections:aM},content:aD,missingFacts:D,targetWords:Y}),...aP],aT=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(aL,Y,aS);f=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:l,status:aT,message:bl(`${(0,aj.GQ)(c.title)} 已由大模型首轮成稿${aE>0?`并定向扩写 ${aE} 轮`:""}:当前 ${aL} 字 / 目标 ${Math.floor(.95*Y)} 字${"success"!==aT?`;风险:${aS.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(aL/Math.max(1,Math.floor(.95*Y))*100)}%`,...m.map(a=>`写作控制提示词:${a}`),`二级小节:${aM.length} 个`,`扩写轮次:${aE}`],progress:{current:g+1,total:bx.length,label:"success"===aT?"章节达标":"章节风险"}},{subtitle:(0,aj.GQ)(c.title),order:g}),aN.push(f);let aV={id:c.id,title:c.title,content:aD,evidence:B,missingFacts:D,sections:aM};Q.push(aV),S(Q);let aW=by({chapter:c,content:aD,missingFacts:D,targetWords:Y}),aZ=(0,aG.Ff)(aW);bR.quality.blockingCount+=aZ.blocking,bR.quality.importantCount+=aZ.important,bR.quality.minorCount+=aZ.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aL.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aN.push(bj({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,aj.GQ)(c.title)} 生成失败`},{subtitle:(0,aj.GQ)(c.title),order:g}))}f&&(aa[i]=f),S(Q)}))}if(Q.sort((a,b)=>bx.findIndex(b=>b.id===a.id)-bx.findIndex(a=>a.id===b.id)),0===Q.length)throw Error(`章节生成未完成:${aL.join(";")||"没有生成任何有效章节"}`);if(ai&&Q.length<bx.length)throw Error(`OUTLINE 指定 ${bx.length} 章,实际只生成 ${Q.length} 章:${aL.join(";")||"部分章节未生成"}`);aR(a.signal);let cb={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"已跳过多模态参考文件理解;生成阶段仅使用已入库资料的召回片段、结构化事实和角色绑定结果"},notes:[]};if("1"===process.env.DOCUMENT_ENABLE_FILE_UNDERSTANDING){bk(aa,bj({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),S(Q);try{cb=await bO(k,aJ,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}}for(let b of(bk(aa,cb.stage),S(Q),aR(a.signal),cb.notes))aJ.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let cd=ac(aJ,{maxItems:Math.max(48,10*bx.length),maxChars:Math.max(52e3,9e3*bx.length),preservePinned:!0});aJ.splice(0,aJ.length,...cd);let ch=function(a,b,c){let d={};for(let e of(0,Z.Uy)(a,c)){let a=b.find(a=>(0,Z.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(H,aJ,am);for(let a of aU)for(let b of a.facts)ch[b.key]=`${aQ(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let ci=a5(aJ,H,am),cj=a8(aJ,an),ck=aU.flatMap(a=>a.facts.map(a=>({key:a.key,value:aQ(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cl={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,Z.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aQ(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aQ(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}([...ck,...ci,...cj],H,am)){let b=ac(aJ,{maxItems:48,maxChars:45e3,preservePinned:!0});try{cl=await a6(b,aw,H,am,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aR(a.signal);let cm=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}([...ck,...ci,...cj,...cl.facts],aJ);for(let a of(bk(aa,cb.stage),cl.stages))bk(aa,a);S();let cn=a4(aJ),co=aJ.filter(a=>"pinned-evidence"===a.source).length,cp=aJ.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cq=bj({type:"reference",roleId:"quality-enhancement",status:aJ.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aJ.length} 条,人工确认/固定证据 ${co} 条,上下文 ${bH.length} 条,自动检索证据 ${cp} 条`},{subtitle:"证据与上下文增强"});for(let a of(aa.push(cq),S(),cm))ch[a.key]=`${aQ(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cr=new Map;for(let a of aJ)cr.set(a.filePath,(cr.get(a.filePath)??0)+1);let cs=[...cr.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ct=bh(cm,cn,aK,am,an),cu=Q.map(a=>{let b=am.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>am.factFields.find(b=>b.id===a)?.name).filter(Boolean),d=[...new Set([...a.missingFacts||[],...c].filter(Boolean))],e=d.filter(b=>!a.missingFacts.includes(b)),f=d.filter(b=>a.missingFacts.includes(b)),g=+(a.evidence.length>0),h=d.length?e.length/d.length:1;return{chapterId:a.id,title:a.title,requiredFacts:d,coveredFacts:e,missingFacts:f,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*h+.3*g)}}),cv=function(a,b=[],c){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&f.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===(0,d.zY)(c).length&&f.push("模板未绑定任何提示词");let g=new Set(b.map(a=>a.roleId));return c?.fileBindings?.some(a=>"rule"===a.roleId)&&!g.has("rule")&&e.push("rule 角色未抽取到结构化事实"),{passed:0===f.length,warnings:e,errors:f}}(Q,cm,H);cv.warnings.push(...ap.warnings),cv.errors.push(...ap.blockingIssues);let cw=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(cv,ct,Q);for(let a of(cw.push(...function(a){let b=[];for(let c of a)0===c.evidenceCount?b.push({level:"error",message:`章节缺少证据:${c.title}`,suggestion:"请补充对应绑定材料或调整模板章节检索词。"}):c.readinessRate<.5&&b.push({level:"warning",message:`章节事实覆盖率较低:${c.title} ${Math.round(100*c.readinessRate)}%`,suggestion:"建议补充章节 requiredFacts 或绑定材料证据。"});return b}(cu)),aU))for(let b of a.warnings)cw.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cx=bw(aU,H),cy=Date.now(),cz=(0,aF.V7)(Q.map(a=>a.content).join("\n\n"));bk(aa,bj({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cz} 字`,details:[`章节数:${Q.length}`,`目标:${bN.targetChars||bN.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),S(Q);let cA=bQ.enableDocumentBudgetExpansion?await W(()=>b5({template:H,chapters:Q,budget:bN,promptTexts:au,requirement:a.requirement,forbidDrawingImages:cx,signal:a.signal})):Q;Q.splice(0,Q.length,...cA);let cB=Q.map(a=>a.content).join("\n\n"),cC=(0,aF.fW)(bN,cB),cD=[bN.targetChars?`目标 ${bN.targetChars} 字${bN.minChars||bN.maxChars?`(区间 ${bN.minChars||0}-${bN.maxChars||"∞"} 字)`:""}`:void 0,bN.targetPages?`目标 ${bN.targetPages} 页${bN.minPages||bN.maxPages?`(区间 ${bN.minPages||0}-${bN.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bk(aa,bj({type:"validation",roleId:"document-budget",status:bN.maxChars&&cC.currentChars>bN.maxChars||bN.minChars&&cC.currentChars<bN.minChars?"fallback":"success",message:bl(`文档预算:当前 ${cC.currentChars} 字,新增 ${Math.max(0,cC.currentChars-cz)} 字,预计 ${cC.estimatedPages} 页;${cD}`,cy)},{subtitle:"文档预算"})),S(Q);let cE=aN.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cF=Math.max(0,bx.length-Q.length);cE>0&&cw.push({level:"info",message:`章节生成存在补充完善:${cE} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cF>0&&cw.push({level:"error",message:`部分章节生成失败:${cF} 章`,suggestion:aL.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cG=cw.filter(a=>"error"===a.level&&(0,aG.Nz)(a)).length,cH=[...aa];bk(cH,bj({type:"validation",roleId:"document-workflow",status:cG>0?"failed":"success",message:`阻断 ${cG},错误 ${cv.errors.length},警告 ${cv.warnings.length}`},{subtitle:"最终规范校验"})),bk(cH,bj({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bk(cH,bj({type:"export_ready",roleId:"document-workflow",status:cG>0?"failed":"success",message:cG>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cI={templateId:H.id,templateName:H.name,title:H.outputTitle,requirement:a.requirement||"",projectRoot:k,projectId:B,exportSettings:H.exportSettings,generationSettings:H.generationSettings,facts:ch,structuredFacts:cm,factsModel:ct,chapters:Q,sources:cs,missingItems:[...new Set(aK)],validation:cv,validationIssues:cw,executionStages:cH,exportGate:{passed:0===cG,blockingIssues:cw.filter(a=>"error"===a.level&&(0,aG.Nz)(a)),checklist:[]},assets:[],partialChapters:Q.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bN.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:Q,generatedAt:Date.now()},cJ=aE(cI);if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let a=aD(cJ,Q,{forbidDrawingImages:cx}).chapters.map(a=>{let b=bx.find(b=>b.id===a.id)||a;return{...a,content:cf(a.content,b)}}),b=ce(aD(aE({...cI,chapters:a}),a,{forbidDrawingImages:cx}).markdown),c=[...cw];c.push(...T({markdown:b,spec:am,summary:ak})),c.push(...X({markdown:b,facts:cm,summary:ak,profile:an})),c.push(...U(b,ak)),c.push(...(0,aG.gN)(b)),c.push(...(0,aG.f8)(b)),c.push(...(0,aG.k0)(b)),c.push(...(0,aG.qK)(b,a)),c.push(...(0,aG.iC)(b)),c.push(...(0,aG.BV)(b)),c.push(...av(b)),c.push(...(0,aG.Ty)(a)),c.push(...(0,aG.N1)(b,ct)),c.push(...(0,aG.bM)(b)),c.push(...(0,aG.M$)(b,ad)),c.push(...(0,aG.AC)(b,a)),c.push(...(0,aG.mR)(b,H)),c.push(...(0,aF.PE)(H.generationSettings||H.exportSettings,b).filter(a=>!(bN.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,aF.ty)(bN,b)),c.push(...aB(b,H));let d=(0,aG.Ai)(c,ct,a),e=cH.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:d.blockingIssues.length>0?"failed":"success",message:`阻断 ${d.blockingIssues.length},问题 ${c.length}`}:"export_ready"===a.type?{...a,status:d.passed?"success":"failed",message:d.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);e.push(bj({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;如需开启请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let f=a.map(a=>({...a,evidence:ac(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cI,chapters:f,validationIssues:c,exportGate:d,executionStages:e,partialChapters:a.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bN.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:f,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bR},markdown:b}}aR(a.signal);let cK=Q.map(a=>{let b=by({chapter:bx.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:bN.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,aF.V7)(a.content)}}),cL=cK.filter(a=>"pass"!==a.status).length,cM=bQ.enableChapterReview&&cL>0;cM&&(bk(cH,bj({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cL}/${Q.length} 章存在本地风险`,details:[`审查并发:${bQ.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),S(Q,cH));let cN=cM?await W(()=>bn(bR,"chapter-review",()=>b6({template:H,chapters:Q,budget:bN,promptTexts:ax||au,requirement:a.requirement,strategy:bQ,diagnostics:bR,signal:a.signal}),{chapters:Q.length}),cH):{summaries:cK,stage:bj({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bQ.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cH.push(cN.stage);let cO=cN.summaries,cP=cO.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cP.length>0){bk(cH,bj({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cP.length} 章`,details:cP.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cP.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),S(Q,cH);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bQ.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bQ.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<cP.length;d+=e){aR(a.signal);let f=cP.slice(d,d+e);for(let d of(await Promise.all(f.map(async b=>{let c=Q.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await a2(d=>bz({template:H,chapter:c,issues:b.issues.slice(0,4),promptTexts:ax||au,requirement:a.requirement,forbidDrawingImages:cx,diagnostics:bR,signal:d}),9e4,a.signal);return{chapterId:b.chapterId,content:d?.content,appliedCount:d?.appliedCount||0}}catch{return{chapterId:b.chapterId,content:void 0,appliedCount:0}}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<Q.length;a+=1){let c=b.get(Q[a].id);c&&c!==Q[a].content&&(Q[a]={...Q[a],content:c},g.add(Q[a].id),f+=1)}f>0&&(cO=cO.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aF.V7)(Q.find(b=>b.id===a.chapterId)?.content||"")}:a),cJ=aE({...cI,chapters:Q,validationIssues:cw,executionStages:cH})),cH.push(bj({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),S(Q,cH)}if(cM)for(let a of cO.filter(a=>"pass"!==a.status&&a.issues.length>0))cw.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let cQ=bQ.enableGlobalReview&&(cM||cw.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));cQ&&(bk(cH,bj({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),S(Q,cH));let cR=cQ?await W(()=>bn(bR,"global-consistency-review",()=>b7({template:H,chapters:Q,chapterReviews:cO,promptTexts:ax||au,requirement:a.requirement,projectContext:bI,diagnostics:bR,signal:a.signal}),{chapters:Q.length}),cH):{issues:[],stage:bj({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bQ.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cH.push(cR.stage),cR.issues))cw.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});S(Q,cH);let cS=Q.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aF.V7)(a.content)<Math.floor(.7*(bN.chapterTargets.get(a.id)||1200))||cO.some(b=>b.chapterId===a.id&&"fail"===b.status)||by({chapter:bx.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:bN.chapterTargets.get(a.id)||1200}).length>0),cT=cG>0||cR.issues.length>0||cO.some(a=>"fail"===a.status)||cw.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),cU=bQ.enableFinalQualityReview&&(cT||cS.length>Math.max(3,Math.floor(.35*Q.length))),cV=Date.now();cU&&(bk(cH,bj({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${cS.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),S(Q,cH));let cW=ac(aJ,{maxItems:Math.max(32,8*bx.length),maxChars:Math.max(36e3,6e3*bx.length),preservePinned:!0}),cX=cU?await W(()=>b8({template:H,spec:am,markdown:cJ,evidence:cW,promptTexts:ax||au,projectContext:bI,requirement:a.requirement,diagnostics:bR,signal:a.signal}),cH):{markdown:cJ,stage:{type:"llm_review",roleId:"llm-review",status:cS.length>0?"fallback":"success",message:cS.length>0?`本地风险扫描发现 ${cS.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};cX.stage.message=bl(cX.stage.message||"LLM 审查完成",cV),aR(a.signal);let cY=aD(cX.markdown===cJ?aE({...cI,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}):cX.markdown,Q,{forbidDrawingImages:cx}).markdown,cZ=aB(cY,H).map(a=>a.message),c$=(0,aG.bM)(cY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c_=(0,aG.mR)(cY,H).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c0=(0,aG.N1)(cY,ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c1=[...(0,aG.gN)(cY),...(0,aG.f8)(cY)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c2=(0,aG.k0)(cY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c3=(0,aG.qK)(cY,Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c4=(0,aG.iC)(cY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c5=(0,aG.BV)(cY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c6=[...cZ,...c$,...c_,...c0,...c1,...c2,...c3,...c4,...c5,...(0,aG.Ty)(Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...av(cY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],c7=new Set(c3),c8=Date.now(),c9=c6.filter(a=>!c7.has(a));bk(cH,bj({type:"llm_review",roleId:"quality-repair",status:c9.length>0?"running":"success",message:c9.length>0?`正在进行精准质量修复:${c9.length} 个问题`:"未发现需要精准修复的问题",details:c9,progress:{current:1,total:Math.max(1,c9.length),label:"质量修复"}},{subtitle:"精准质量修复"})),S(Q,cH);let da=await W(()=>bn(bR,"local-patch-quality-repair",()=>bA({markdown:cY,template:H,chapters:Q,promptTexts:au,requirement:a.requirement,issues:c9,forbidDrawingImages:cx,strategy:bQ,diagnostics:bR,signal:a.signal}),{issues:c9.length}),cH);da.stage&&(da.stage.message=bl(da.stage.message||"质量修复完成",c8)),aR(a.signal);let db=da.stage?[...cH,cX.stage,da.stage]:[...cH,cX.stage],dc=da.chapters,dd=aE({...cI,chapters:dc,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}),de=(0,aG.yw)(dd,dc).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(de.length>0){let b=Date.now();bk(db,bj({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${de.length} 个问题`,details:de.map(a=>a.message),progress:{current:1,total:de.length,label:"小节补写"}},{subtitle:"小节内容补写"})),S(dc,db);let c=[...dc];for(let b=0;b<dc.length;b+=bQ.maxChapterConcurrency){aR(a.signal);let d=dc.slice(b,b+bQ.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=de.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bx.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bN.chapterTargets.get(b.id)||1200,f=bt(d,br);try{let g=await a2(g=>b3({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:au,projectContext:bI,requirement:a.requirement,roleContext:bv(aU,d,f),targetWords:e,forbidDrawingImages:cx,maxSectionConcurrency:bQ.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:at(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dc=c;let d=(0,aG.qK)(aE({...cI,chapters:dc,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}),dc);bk(db,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:"小节内容补写"})),S(dc,db)}let df=(0,aF.fW)(bN,dc.map(a=>a.content).join("\n\n"));if(bQ.enableDocumentBudgetExpansion&&bN.minChars&&df.currentChars<Math.floor(.9*bN.minChars)&&(!bN.maxChars||df.currentChars<bN.maxChars)){let b=Date.now(),c=df.currentChars;bk(db,bj({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bN.minChars} 字`,`章节数:${dc.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),S(dc,db),dc=await W(()=>b5({template:H,chapters:dc,budget:bN,promptTexts:au,requirement:a.requirement,forbidDrawingImages:cx,signal:a.signal}),db);let d=(0,aF.fW)(bN,dc.map(a=>a.content).join("\n\n"));bk(db,bj({type:"validation",roleId:"document-budget-repair",status:bN.minChars&&d.currentChars<bN.minChars?"fallback":"success",message:bl(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dg=aD(aE({...cI,chapters:dc,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}),dc,{forbidDrawingImages:cx}),dh=dg.chapters,di=dg.markdown,dj=dh.map(a=>{let b=dc.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dk=(0,aG.yw)(di,dj).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dk.length>0){let b=Date.now();bk(db,bj({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dk.length} 个问题`,details:dk.map(a=>a.message),progress:{current:1,total:dk.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),S(dh,db);let c=[...dh];for(let b=0;b<dh.length;b+=bQ.maxChapterConcurrency){aR(a.signal);let d=dh.slice(b,b+bQ.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dk.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bx.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bN.chapterTargets.get(b.id)||1200,f=bt(d,br);try{let g=await a2(g=>b3({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:au,projectContext:bI,requirement:a.requirement,roleContext:bv(aU,d,f),targetWords:e,forbidDrawingImages:cx,maxSectionConcurrency:bQ.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:at(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dh=(dg=aD(aE({...cI,chapters:c,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}),c,{forbidDrawingImages:cx})).chapters,di=dg.markdown;let d=(0,aG.qK)(di,dh);bk(db,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:"最终小节内容补写"})),S(dh,db)}dh=(dg=aD(aE({...cI,chapters:dh,validationIssues:cw,exportGate:cI.exportGate,executionStages:cH}),dh,{forbidDrawingImages:cx})).chapters,di=dg.markdown;let dl=[...cZ];(cw=(0,aG.kQ)(am,[...cw,...dl.map(a=>({level:"warning",message:a}))],ct,dh,di,ae,ad)).push(...T({markdown:di,spec:am,summary:ak})),cw.push(...X({markdown:di,facts:cm,summary:ak,profile:an})),cw.push(...U(di,ak)),cw.push(...(0,aG.gN)(di)),cw.push(...(0,aG.f8)(di)),cw.push(...(0,aG.k0)(di)),cw.push(...(0,aG.qK)(di,dh)),cw.push(...(0,aG.iC)(di)),cw.push(...(0,aG.BV)(di)),cw.push(...av(di)),cw.push(...(0,aG.Ty)(dh)),cw.push(...(0,aG.N1)(di,ct)),cw.push(...(0,aG.bM)(di)),cw.push(...(0,aG.M$)(di,ad)),cw.push(...(0,aG.AC)(di,dh)),cw.push(...(0,aG.mR)(di,H));let dm=(0,aF.ty)(bN,di),dn=(0,aF.PE)(H.generationSettings||H.exportSettings,di).filter(a=>!(bN.minPages&&/低于目标页数/u.test(a.message)));cw.push(...dn),cw.push(...dm),cw.push(...aB(di,H));let dp=(0,aG.Ai)(cw,ct,dh),dq=dp.blockingIssues.length,dr=(0,aG.Ff)(cw);bR.quality.blockingCount+=dr.blocking,bR.quality.importantCount+=dr.important,bR.quality.minorCount+=dr.minor;let ds=db.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dq>0?"failed":"success",message:`阻断 ${dq},问题 ${cw.length}`}:"export_ready"===a.type?{...a,status:dp.passed?"success":"failed",message:dp.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bR.llm.currentLimit=aY();let dt=[...bR.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");ds.push(bj({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bR.llm.calls} 次,失败 ${bR.llm.failures} 次,排队 ${bR.llm.throttledWaits} 次/${Math.round(bR.llm.throttledWaitMs/1e3)} 秒,检索 ${bR.evidence.searchQueries} 次/${Math.round(bR.evidence.searchMs/1e3)} 秒,证据上下文 ${bR.evidence.contextChars} 字,噪声过滤 ${bR.evidence.filteredNoise} 条,质量问题 阻断${bR.quality.blockingCount}/重要${bR.quality.importantCount}/轻微${bR.quality.minorCount},自动限流调整 ${bR.llm.limitAdjustments} 次${dt?`,Top耗时:${dt}`:""}`},{subtitle:"后台诊断"}));let du=dh.map(a=>({...a,evidence:ac(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cI,chapters:du,validationIssues:cw,exportGate:dp,executionStages:ds,partialChapters:dh.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bN.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:du,reviewMetadata:{chapterSummaries:cO,globalIssues:cR.issues,diagnostics:bR}},markdown:di}}async function ci(a){let b=(0,d.QJ)(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let f=e.resolve(a.projectRoot||(0,g.aY)());if(!f)throw Error("No knowledge base project found");let h=(0,g.Qh)(),i=bD(f,(0,d.Vh)(b)),j=cg(await h.getProject(f),[...i],a.maxEvidencePerChapter),k=[],l=[...i].filter(Boolean).sort(),m=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let a of c.queries.slice(0,m)){let b=await h.search(f,a,{scope:"project",filters:{filePaths:l},limit:Math.min(j,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});k.push(...b.results.filter(a=>bC(f,a.filePath,i)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let n=ac(k.filter(a=>bC(f,a.filePath,i)),{maxItems:Math.max(8,Math.min(28,2*j)),maxChars:18e3,preservePinned:!0}),o=a.currentMarkdown||"",p=new Set(a.existingFacts??[]),q=c.requiredFacts.filter(a=>!p.has(a)&&!n.some(b=>(0,Z.Lk)(b,a))),r=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",o?`> 当前文档上下文摘要:${o.replace(/\s+/gu," ")}`:"",n.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",n.length>0?"### 资料依据":"",...n.map(ad),"",q.length>0?"### 待确认事项":"",...q.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:r,evidence:n,missingFacts:q}}},91977:(a,b,c)=>{c.d(b,{I2:()=>g,Lk:()=>e,Uy:()=>f});var d=c(70208);function e(a,b){let c=`${a.filePath}
148
+ ${g.join("\n")}`:"",h.length?`本章资料中可直接使用的可靠精确参数/编号:${h.join("、")}。这些参数来自绑定资料,不属于编造;涉及对应对象、部位、工序、材料、设备、质量验收或安全控制时必须自然写入正文,并保持原样或等价专业表达。不得写入商务金额、单价、税率、预留金。`:"",j.length?`当前事实需求仍未充分确认:${j.join("、")}。未确认项不得编造;但已满足事实需求中的资料事实必须写入对应小节。`:"",a.missingFacts.length?`模板显式要求中当前检索未充分命中的项:${a.missingFacts.join("、")}。未命中项不得编造,但不得因此省略上方已经明确的可靠参数。`:"",`本章可用材料来源约 ${i} 个文件,正文必须按事实需求把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:am,roleFacts:s,evidence:y,missingFacts:A,indexedFacts:I,resolvedFactNeeds:G,factNeedsPrompt:function(a){let b=a.map(a=>{let b=a.facts.slice(0,5).map(b=>`${b.key||b.fieldName||a.need.label}=${bg(b.value)}${b.sourceFile?`(${e.basename(b.sourceFile)})`:""}`),c=a.facts.length?[]:(a.evidence||[]).slice(0,2).map(a=>`证据片段:${bg(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?`事实需求覆盖卡片:
149
+ ${b.join("\n")}`:""}(G)}),P={total:G.length,satisfied:G.filter(a=>"satisfied"===a.status).length,missing:G.filter(a=>"missing"===a.status).length,lowConfidence:G.filter(a=>"low_confidence"===a.status).length},R=G.filter(a=>a.need.required&&"satisfied"!==a.status).map(a=>a.need.label);for(let a of R)aL.push(`${c.title}:事实需求未确认 ${a}`);let T=am?.chapterRules.find(a=>a.id===c.id||a.title===c.title),U=bQ.chapterTargets.get(c.id)||1200,V=Math.ceil(U*(bQ.maxChars?1.1:1.18)),X=bQ.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*U))):1200,Y=Math.max(d?.minWords||0,T?.minWords||0,am?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*U),X),$=bZ(Y,U),ae=bQ.longformStrict?.82:.55,ag=bQ.longformStrict?Math.max(5200,Math.ceil(.9*U)):2600,ah=Math.max(900,Math.min(U,Math.ceil(U*ae),ag)),ai=Math.max(450,Math.min(Y,Math.floor(.72*ah))),ak=Math.max(ah+300,Math.min(V,Math.ceil(1.25*ah))),al=bZ(ai,ah),ao=Math.min(b$(ah),3e5),ap=c.sections?.filter(Boolean).length||0,ar=/[、,,;;]/u.test(c.title),as=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&ap>=2&&!ar;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:as?`${(0,aj.GQ)(c.title)} 正在按小节并发成稿`:`${(0,aj.GQ)(c.title)} 正在整章一次成稿`,details:as?[`有效证据:${y.length} 条`,`事实需求:${P.satisfied}/${P.total} 已满足,缺失 ${P.missing},低置信 ${P.lowConfidence}`,`目标字数:约 ${U} 字,上限约 ${V} 字`,`小节并发上限:${bR.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[`有效证据:${y.length} 条`,`事实需求:${P.satisfied}/${P.total} 已满足,缺失 ${P.missing},低置信 ${P.lowConfidence}`,`目标字数:约 ${U} 字,上限约 ${V} 字`,`章节并发上限:${cb}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:g+1,total:bG.length,label:as?"小节并发":"整章成稿"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S();let au=as?await W(()=>bn(bS,`chapter-section-draft:${c.id}`,()=>a2(b=>bY({template:H,chapter:c,evidence:y,missingFacts:A,promptTexts:E,projectContext:bJ,requirement:a.requirement,roleContext:D,targetWords:U,maxWords:V,forbidDrawingImages:C,factCoverageContext:K,projectRoot:k,modelName:aZ,fileRolesHash:a0,allowPartialResult:!1,maxSectionConcurrency:bR.maxSectionConcurrency,diagnostics:bS,signal:b}),Math.min(b$(U),Math.max(24e4,Math.ceil(15e4*(c.sections?.length||2)/Math.max(1,bR.maxSectionConcurrency||1)))),a.signal))):await W(()=>bn(bS,`chapter-draft:${c.id}`,()=>a2(b=>bP(H,c,y,A,E,bJ,a.requirement,D,{forbidDrawingImages:C,minWords:Y,targetWords:U,maxWords:V,maxTokens:$,factCoverageContext:K,signal:b}),b$(U),a.signal)));if(!au&&as?(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${U} 字`,`有效证据:${y.length} 条`],progress:{current:g+1,total:bG.length,label:"整章兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),au=await W(()=>bn(bS,`chapter-draft-fallback:${c.id}`,()=>a2(b=>bP(H,c,y,A,E,bJ,a.requirement,D,{forbidDrawingImages:C,minWords:ai,targetWords:ah,maxWords:ak,maxTokens:al,factCoverageContext:K,signal:b}),ao,a.signal)))):au||(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${U} 字`,`有效证据:${y.length} 条`],progress:{current:g+1,total:bG.length,label:"整章兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),au=await W(()=>bn(bS,`chapter-draft-fallback:${c.id}`,()=>a2(b=>bP(H,c,y,A,E,bJ,a.requirement,D,{forbidDrawingImages:C,minWords:ai,targetWords:ah,maxWords:ak,maxTokens:al,factCoverageContext:K,signal:b}),ao,a.signal)))),aR(a.signal),au||(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${U} 字`],progress:{current:g+1,total:bG.length,label:"紧凑兜底"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),au=await W(()=>bn(bS,`chapter-draft-compact-fallback:${c.id}`,()=>a2(b=>bP(H,c,y,A,E,bJ,a.requirement,D,{forbidDrawingImages:C,minWords:Math.max(450,Math.floor(.75*Y)),targetWords:U,maxWords:V,maxTokens:$,factCoverageContext:K,signal:b}),b$(U),a.signal)))),aR(a.signal),!au)throw Error(`${c.title} 大模型未返回有效章节正文`);let av=ca(au,c);if(av.length>0){let b=au;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 首次成稿存在 ${av.length} 个小节缺口,正在定向补写`,details:av.map(a=>a.message),progress:{current:g+1,total:bG.length,label:"小节补写"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q),au=await W(()=>bn(bS,`chapter-supplement:${c.id}`,()=>b3({template:H,chapter:c,content:b,evidence:y,missingFacts:A,promptTexts:E,projectContext:bJ,requirement:a.requirement,roleContext:D,targetWords:U,forbidDrawingImages:C,factCoverageContext:K,maxSectionConcurrency:bR.maxSectionConcurrency,forcedSections:av,signal:a.signal})))}if((av=ca(au,c)).length>0){aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 首次生成仍有 ${av.length} 个小节缺口,正在章节内强制补齐`,details:av.map(a=>a.message),progress:{current:g+1,total:bG.length,label:"章节内小节补齐"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let b=au;au=await W(()=>bn(bS,`chapter-forced-section-supplement:${c.id}`,()=>b3({template:H,chapter:c,content:b,evidence:y,missingFacts:A,promptTexts:E,projectContext:bJ,requirement:a.requirement,roleContext:D,targetWords:U,forbidDrawingImages:C,factCoverageContext:K,maxSectionConcurrency:bR.maxSectionConcurrency,forcedSections:av,signal:a.signal}))),av=ca(au,c)}av.length>0&&(aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"fallback",message:`${(0,aj.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:av.map(a=>a.message),progress:{current:g+1,total:bG.length,label:"保留可用章节"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q));let aw=by({chapter:c,content:au,missingFacts:A,targetWords:U}),ax=(0,aG.Ff)(aw);bS.quality.blockingCount+=ax.blocking,bS.quality.importantCount+=ax.important,bS.quality.minorCount+=ax.minor;let ay=bq(aw);if(ay.length>0){let b=au;aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 正在根据质量问题修复章节:${ay.length} 个阻断问题`,details:ay,progress:{current:g+1,total:bG.length,label:"章节修复"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let d=await W(()=>bn(bS,`chapter-repair:${c.id}`,()=>bz({template:H,chapter:{id:c.id,title:c.title,content:b,evidence:y,missingFacts:[...A,...R.map(a=>`事实需求未确认:${a}`)],sections:c.sections||[]},issues:ay,promptTexts:E,requirement:a.requirement,forbidDrawingImages:C,diagnostics:bS,signal:a.signal})));au=d.content,d.appliedCount>0&&(bS.quality.repairedCount+=1),aR(a.signal)}if(!au?.trim())throw Error(`${(0,aj.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let aA=cc(au,c),aB=0;if((0,aF.V7)(aA)<Math.floor(.82*U)||bq(by({chapter:c,content:aA,missingFacts:A,targetWords:U})).length>0){aa[i]=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,aj.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aF.V7)(aA)} 字 / 目标 ${Math.floor(.95*U)} 字`,`章节并发:${cb}`],progress:{current:g+1,total:bG.length,label:"章节扩写"}},{subtitle:(0,aj.GQ)(c.title),order:g}),S(Q);let b=await W(()=>bn(bS,`chapter-expand:${c.id}`,()=>b4({template:H,chapter:c,content:au,evidence:y,promptTexts:E,requirement:a.requirement,roleContext:D,targetChars:Math.floor(.95*U),maxChars:V,forbidDrawingImages:C,maxTokens:Math.min($,al),signal:a.signal})));aA=cc(b.content,c),aB=b.rounds}aA=cf(aA,c);let aD=(0,aF.V7)(aA),aE=c.sections?.length?c.sections:at(aA),aM=(0,aG.qK)(aA,[{title:c.title,content:aA,sections:aE}]).map(a=>a.message),aN=[...by({chapter:{...c,sections:aE},content:aA,missingFacts:A,targetWords:U}),...aM],aS=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(aD,U,aN);f=bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ad.find(a=>"chapter_generation"===a.roleId)?.promptId,status:aS,message:bl(`${(0,aj.GQ)(c.title)} 已由大模型首轮成稿${aB>0?`并定向扩写 ${aB} 轮`:""}:当前 ${aD} 字 / 目标 ${Math.floor(.95*U)} 字${"success"!==aS?`;风险:${aN.join("、")||"篇幅未达标"}`:""}`,h),details:[`达标率:${Math.round(aD/Math.max(1,Math.floor(.95*U))*100)}%`,`二级小节:${aE.length} 个`,`扩写轮次:${aB}`],progress:{current:g+1,total:bG.length,label:"success"===aS?"章节达标":"章节风险"}},{subtitle:(0,aj.GQ)(c.title),order:g}),aO.push(f);let aT={id:c.id,title:c.title,content:aA,evidence:y,missingFacts:A,sections:aE};Q.push(aT),S(Q);let aU=by({chapter:c,content:aA,missingFacts:A,targetWords:U}),aV=(0,aG.Ff)(aU);bS.quality.blockingCount+=aV.blocking,bS.quality.importantCount+=aV.important,bS.quality.minorCount+=aV.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aN.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aO.push(bj({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,aj.GQ)(c.title)} 生成失败`},{subtitle:(0,aj.GQ)(c.title),order:g}))}f&&(aa[i]=f),S(Q)}))}if(Q.sort((a,b)=>bG.findIndex(b=>b.id===a.id)-bG.findIndex(a=>a.id===b.id)),0===Q.length)throw Error(`章节生成未完成:${aN.join(";")||"没有生成任何有效章节"}`);if(ai&&Q.length<bG.length)throw Error(`OUTLINE 指定 ${bG.length} 章,实际只生成 ${Q.length} 章:${aN.join(";")||"部分章节未生成"}`);aR(a.signal),bk(aa,bj({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),S(Q);let cd={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{cd=await bO(k,aK,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bk(aa,cd.stage),S(Q),aR(a.signal),cd.notes))aK.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let ch=ac(aK,{maxItems:Math.max(48,10*bG.length),maxChars:Math.max(52e3,9e3*bG.length),preservePinned:!0});aK.splice(0,aK.length,...ch);let ci=function(a,b,c){let d={};for(let e of(0,Z.Uy)(a,c)){let a=b.find(a=>(0,Z.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(H,aK,am);for(let a of aW)for(let b of a.facts)ci[b.key]=`${aQ(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cj=a5(aK,H,am),ck=a8(aK,an),cl=aW.flatMap(a=>a.facts.map(a=>({key:a.key,value:aQ(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cm={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,Z.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aQ(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aQ(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}([...cl,...cj,...ck],H,am)){let b=ac(aK,{maxItems:48,maxChars:45e3,preservePinned:!0});try{cm=await a6(b,ax,H,am,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aR(a.signal);let cn=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}([...cl,...cj,...ck,...cm.facts],aK);for(let a of(bk(aa,cd.stage),cm.stages))bk(aa,a);S();let co=a4(aK),cp=aK.filter(a=>"pinned-evidence"===a.source).length,cq=aK.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cr=bj({type:"reference",roleId:"quality-enhancement",status:aK.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aK.length} 条,人工确认/固定证据 ${cp} 条,上下文 ${bI.length} 条,自动检索证据 ${cq} 条`},{subtitle:"证据与上下文增强"});for(let a of(aa.push(cr),S(),cn))ci[a.key]=`${aQ(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cs=new Map;for(let a of aK)cs.set(a.filePath,(cs.get(a.filePath)??0)+1);let ct=[...cs.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cu=bh(cn,co,aL,am,an),cv=Q.map(a=>{let b=am.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>am.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)}}),cw=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}}(Q,cn,H);cw.warnings.push(...ap.warnings),cw.errors.push(...ap.blockingIssues);let cx=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请根据当前模板绑定的角色、文件证据和用户要求复核取值口径。"}))),d}(cw,cu,Q);for(let a of(cx.push(...function(a){let b=[];for(let c of a)0===c.evidenceCount?b.push({level:"error",message:`章节缺少证据:${c.title}`,suggestion:"请补充对应绑定材料或调整模板章节检索词。"}):c.readinessRate<.5&&b.push({level:"warning",message:`章节事实覆盖率较低:${c.title} ${Math.round(100*c.readinessRate)}%`,suggestion:"建议补充章节 requiredFacts 或绑定材料证据。"});return b}(cv)),aW))for(let b of a.warnings)cx.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let cy=bw(aW,H),cz=Date.now(),cA=(0,aF.V7)(Q.map(a=>a.content).join("\n\n"));bk(aa,bj({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cA} 字`,details:[`章节数:${Q.length}`,`目标:${bQ.targetChars||bQ.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),S(Q);let cB=bR.enableDocumentBudgetExpansion?await W(()=>b5({template:H,chapters:Q,budget:bQ,promptTexts:aw,requirement:a.requirement,forbidDrawingImages:cy,signal:a.signal})):Q;Q.splice(0,Q.length,...cB);let cC=Q.map(a=>a.content).join("\n\n"),cD=(0,aF.fW)(bQ,cC),cE=[bQ.targetChars?`目标 ${bQ.targetChars} 字${bQ.minChars||bQ.maxChars?`(区间 ${bQ.minChars||0}-${bQ.maxChars||"∞"} 字)`:""}`:void 0,bQ.targetPages?`目标 ${bQ.targetPages} 页${bQ.minPages||bQ.maxPages?`(区间 ${bQ.minPages||0}-${bQ.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bk(aa,bj({type:"validation",roleId:"document-budget",status:bQ.maxChars&&cD.currentChars>bQ.maxChars||bQ.minChars&&cD.currentChars<bQ.minChars?"fallback":"success",message:bl(`文档预算:当前 ${cD.currentChars} 字,新增 ${Math.max(0,cD.currentChars-cA)} 字,预计 ${cD.estimatedPages} 页;${cE}`,cz)},{subtitle:"文档预算"})),S(Q);let cF=aO.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cG=Math.max(0,bG.length-Q.length);cF>0&&cx.push({level:"info",message:`章节生成存在补充完善:${cF} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cG>0&&cx.push({level:"error",message:`部分章节生成失败:${cG} 章`,suggestion:aN.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cH=cx.filter(a=>"error"===a.level&&(0,aG.Nz)(a)).length,cI=[...aa];bk(cI,bj({type:"validation",roleId:"document-workflow",status:cH>0?"failed":"success",message:`阻断 ${cH},错误 ${cw.errors.length},警告 ${cw.warnings.length}`},{subtitle:"最终规范校验"})),bk(cI,bj({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bk(cI,bj({type:"export_ready",roleId:"document-workflow",status:cH>0?"failed":"success",message:cH>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cJ={templateId:H.id,templateName:H.name,title:H.outputTitle,requirement:a.requirement||"",projectRoot:k,projectId:B,exportSettings:H.exportSettings,generationSettings:H.generationSettings,facts:ci,structuredFacts:cn,factsModel:cu,chapters:Q,sources:ct,missingItems:[...new Set(aL)],validation:cw,validationIssues:cx,executionStages:cI,exportGate:{passed:0===cH,blockingIssues:cx.filter(a=>"error"===a.level&&(0,aG.Nz)(a)),checklist:[]},assets:[],partialChapters:Q.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bQ.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:Q,generatedAt:Date.now()},cK=aE(cJ);if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let a=aD(cK,Q,{forbidDrawingImages:cy}).chapters.map(a=>{let b=bG.find(b=>b.id===a.id)||a;return{...a,content:cf(a.content,b)}}),b=ce(aD(aE({...cJ,chapters:a}),a,{forbidDrawingImages:cy}).markdown),c=[...cx];c.push(...T({markdown:b,spec:am,summary:ak})),c.push(...X({markdown:b,facts:cn,summary:ak,profile:an})),c.push(...U(b,ak)),c.push(...(0,aG.gN)(b)),c.push(...(0,aG.f8)(b)),c.push(...(0,aG.k0)(b)),c.push(...(0,aG.qK)(b,a)),c.push(...(0,aG.iC)(b)),c.push(...(0,aG.BV)(b)),c.push(...av(b)),c.push(...(0,aG.Ty)(a)),c.push(...(0,aG.N1)(b,cu)),c.push(...(0,aG.bM)(b)),c.push(...(0,aG.M$)(b,ad)),c.push(...(0,aG.AC)(b,a)),c.push(...(0,aG.mR)(b,H)),c.push(...(0,aF.PE)(H.generationSettings||H.exportSettings,b).filter(a=>!(bQ.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,aF.ty)(bQ,b)),c.push(...aB(b,H));let d=(0,aG.Ai)(c,cu,a),e=cI.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:d.blockingIssues.length>0?"failed":"success",message:`阻断 ${d.blockingIssues.length},问题 ${c.length}`}:"export_ready"===a.type?{...a,status:d.passed?"success":"failed",message:d.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);e.push(bj({type:"llm_review",roleId:"post-export-review",status:"skipped",message:"已跳过导出后的重型 LLM 复审;如需开启请设置 DOCUMENT_ENABLE_POST_EXPORT_REVIEW=1"},{subtitle:"导出后复审"}));let f=a.map(a=>({...a,evidence:ac(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...cJ,chapters:f,validationIssues:c,exportGate:d,executionStages:e,partialChapters:a.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bQ.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:f,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bS},markdown:b}}aR(a.signal);let cL=Q.map(a=>{let b=by({chapter:bG.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:bQ.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,aF.V7)(a.content)}}),cM=cL.filter(a=>"pass"!==a.status).length,cN=bR.enableChapterReview&&cM>0;cN&&(bk(cI,bj({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cM}/${Q.length} 章存在本地风险`,details:[`审查并发:${bR.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),S(Q,cI));let cO=cN?await W(()=>bn(bS,"chapter-review",()=>b6({template:H,chapters:Q,budget:bQ,promptTexts:ay||aw,requirement:a.requirement,strategy:bR,diagnostics:bS,signal:a.signal}),{chapters:Q.length}),cI):{summaries:cL,stage:bj({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bR.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cI.push(cO.stage);let cP=cO.summaries,cQ=cP.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cQ.length>0){bk(cI,bj({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cQ.length} 章`,details:cQ.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cQ.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),S(Q,cI);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bR.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bR.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<cQ.length;d+=e){aR(a.signal);let f=cQ.slice(d,d+e);for(let d of(await Promise.all(f.map(async b=>{let c=Q.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};try{let d=await a2(d=>bz({template:H,chapter:c,issues:b.issues.slice(0,4),promptTexts:ay||aw,requirement:a.requirement,forbidDrawingImages:cy,diagnostics:bS,signal:d}),9e4,a.signal);return{chapterId:b.chapterId,content:d?.content,appliedCount:d?.appliedCount||0}}catch{return{chapterId:b.chapterId,content:void 0,appliedCount:0}}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<Q.length;a+=1){let c=b.get(Q[a].id);c&&c!==Q[a].content&&(Q[a]={...Q[a],content:c},g.add(Q[a].id),f+=1)}f>0&&(cP=cP.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aF.V7)(Q.find(b=>b.id===a.chapterId)?.content||"")}:a),cK=aE({...cJ,chapters:Q,validationIssues:cx,executionStages:cI})),cI.push(bj({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),S(Q,cI)}if(cN)for(let a of cP.filter(a=>"pass"!==a.status&&a.issues.length>0))cx.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let cR=bR.enableGlobalReview&&(cN||cx.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));cR&&(bk(cI,bj({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),S(Q,cI));let cS=cR?await W(()=>bn(bS,"global-consistency-review",()=>b7({template:H,chapters:Q,chapterReviews:cP,promptTexts:ay||aw,requirement:a.requirement,projectContext:bJ,diagnostics:bS,signal:a.signal}),{chapters:Q.length}),cI):{issues:[],stage:bj({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bR.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cI.push(cS.stage),cS.issues))cx.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});S(Q,cI);let cT=Q.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aF.V7)(a.content)<Math.floor(.7*(bQ.chapterTargets.get(a.id)||1200))||cP.some(b=>b.chapterId===a.id&&"fail"===b.status)||by({chapter:bG.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:bQ.chapterTargets.get(a.id)||1200}).length>0),cU=cH>0||cS.issues.length>0||cP.some(a=>"fail"===a.status)||cx.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),cV=bR.enableFinalQualityReview&&(cU||cT.length>Math.max(3,Math.floor(.35*Q.length))),cW=Date.now();cV&&(bk(cI,bj({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${cT.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),S(Q,cI));let cX=ac(aK,{maxItems:Math.max(32,8*bG.length),maxChars:Math.max(36e3,6e3*bG.length),preservePinned:!0}),cY=cV?await W(()=>b8({template:H,spec:am,markdown:cK,evidence:cX,promptTexts:ay||aw,projectContext:bJ,requirement:a.requirement,diagnostics:bS,signal:a.signal}),cI):{markdown:cK,stage:{type:"llm_review",roleId:"llm-review",status:cT.length>0?"fallback":"success",message:cT.length>0?`本地风险扫描发现 ${cT.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};cY.stage.message=bl(cY.stage.message||"LLM 审查完成",cW),aR(a.signal);let cZ=aD(cY.markdown===cK?aE({...cJ,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}):cY.markdown,Q,{forbidDrawingImages:cy}).markdown,c$=aB(cZ,H).map(a=>a.message),c_=(0,aG.bM)(cZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c0=(0,aG.mR)(cZ,H).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c1=(0,aG.N1)(cZ,cu).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c2=[...(0,aG.gN)(cZ),...(0,aG.f8)(cZ)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c3=(0,aG.k0)(cZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c4=(0,aG.qK)(cZ,Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c5=(0,aG.iC)(cZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c6=(0,aG.BV)(cZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c7=[...c$,...c_,...c0,...c1,...c2,...c3,...c4,...c5,...c6,...(0,aG.Ty)(Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...av(cZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],c8=new Set(c4),c9=Date.now(),da=c7.filter(a=>!c8.has(a));bk(cI,bj({type:"llm_review",roleId:"quality-repair",status:da.length>0?"running":"success",message:da.length>0?`正在进行精准质量修复:${da.length} 个问题`:"未发现需要精准修复的问题",details:da,progress:{current:1,total:Math.max(1,da.length),label:"质量修复"}},{subtitle:"精准质量修复"})),S(Q,cI);let db=await W(()=>bn(bS,"local-patch-quality-repair",()=>bA({markdown:cZ,template:H,chapters:Q,promptTexts:aw,requirement:a.requirement,issues:da,forbidDrawingImages:cy,strategy:bR,diagnostics:bS,signal:a.signal}),{issues:da.length}),cI);db.stage&&(db.stage.message=bl(db.stage.message||"质量修复完成",c9)),aR(a.signal);let dc=db.stage?[...cI,cY.stage,db.stage]:[...cI,cY.stage],dd=db.chapters,de=aE({...cJ,chapters:dd,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}),df=(0,aG.yw)(de,dd).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(df.length>0){let b=Date.now();bk(dc,bj({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${df.length} 个问题`,details:df.map(a=>a.message),progress:{current:1,total:df.length,label:"小节补写"}},{subtitle:"小节内容补写"})),S(dd,dc);let c=[...dd];for(let b=0;b<dd.length;b+=bR.maxChapterConcurrency){aR(a.signal);let d=dd.slice(b,b+bR.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=df.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bG.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bQ.chapterTargets.get(b.id)||1200,f=bt(d,bx);try{let g=await a2(g=>b3({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:aw,projectContext:bJ,requirement:a.requirement,roleContext:bv(aW,d,f),targetWords:e,forbidDrawingImages:cy,maxSectionConcurrency:bR.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:at(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}dd=c;let d=(0,aG.qK)(aE({...cJ,chapters:dd,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}),dd);bk(dc,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:"小节内容补写"})),S(dd,dc)}let dg=(0,aF.fW)(bQ,dd.map(a=>a.content).join("\n\n"));if(bR.enableDocumentBudgetExpansion&&bQ.minChars&&dg.currentChars<Math.floor(.9*bQ.minChars)&&(!bQ.maxChars||dg.currentChars<bQ.maxChars)){let b=Date.now(),c=dg.currentChars;bk(dc,bj({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bQ.minChars} 字`,`章节数:${dd.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),S(dd,dc),dd=await W(()=>b5({template:H,chapters:dd,budget:bQ,promptTexts:aw,requirement:a.requirement,forbidDrawingImages:cy,signal:a.signal}),dc);let d=(0,aF.fW)(bQ,dd.map(a=>a.content).join("\n\n"));bk(dc,bj({type:"validation",roleId:"document-budget-repair",status:bQ.minChars&&d.currentChars<bQ.minChars?"fallback":"success",message:bl(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dh=aD(aE({...cJ,chapters:dd,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}),dd,{forbidDrawingImages:cy}),di=dh.chapters,dj=dh.markdown,dk=di.map(a=>{let b=dd.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),dl=(0,aG.yw)(dj,dk).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(dl.length>0){let b=Date.now();bk(dc,bj({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${dl.length} 个问题`,details:dl.map(a=>a.message),progress:{current:1,total:dl.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),S(di,dc);let c=[...di];for(let b=0;b<di.length;b+=bR.maxChapterConcurrency){aR(a.signal);let d=di.slice(b,b+bR.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=dl.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bG.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bQ.chapterTargets.get(b.id)||1200,f=bt(d,bx);try{let g=await a2(g=>b3({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:aw,projectContext:bJ,requirement:a.requirement,roleContext:bv(aW,d,f),targetWords:e,forbidDrawingImages:cy,maxSectionConcurrency:bR.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:at(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}di=(dh=aD(aE({...cJ,chapters:c,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}),c,{forbidDrawingImages:cy})).chapters,dj=dh.markdown;let d=(0,aG.qK)(dj,di);bk(dc,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:"最终小节内容补写"})),S(di,dc)}di=(dh=aD(aE({...cJ,chapters:di,validationIssues:cx,exportGate:cJ.exportGate,executionStages:cI}),di,{forbidDrawingImages:cy})).chapters,dj=dh.markdown;let dm=[...c$];(cx=(0,aG.kQ)(am,[...cx,...dm.map(a=>({level:"warning",message:a}))],cu,di,dj,ae,ad)).push(...T({markdown:dj,spec:am,summary:ak})),cx.push(...X({markdown:dj,facts:cn,summary:ak,profile:an})),cx.push(...U(dj,ak)),cx.push(...(0,aG.gN)(dj)),cx.push(...(0,aG.f8)(dj)),cx.push(...(0,aG.k0)(dj)),cx.push(...(0,aG.qK)(dj,di)),cx.push(...(0,aG.iC)(dj)),cx.push(...(0,aG.BV)(dj)),cx.push(...av(dj)),cx.push(...(0,aG.Ty)(di)),cx.push(...(0,aG.N1)(dj,cu)),cx.push(...(0,aG.bM)(dj)),cx.push(...(0,aG.M$)(dj,ad)),cx.push(...(0,aG.AC)(dj,di)),cx.push(...(0,aG.mR)(dj,H));let dn=(0,aF.ty)(bQ,dj),dp=(0,aF.PE)(H.generationSettings||H.exportSettings,dj).filter(a=>!(bQ.minPages&&/低于目标页数/u.test(a.message)));cx.push(...dp),cx.push(...dn),cx.push(...aB(dj,H));let dq=(0,aG.Ai)(cx,cu,di),dr=dq.blockingIssues.length,ds=(0,aG.Ff)(cx);bS.quality.blockingCount+=ds.blocking,bS.quality.importantCount+=ds.important,bS.quality.minorCount+=ds.minor;let dt=dc.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:dr>0?"failed":"success",message:`阻断 ${dr},问题 ${cx.length}`}:"export_ready"===a.type?{...a,status:dq.passed?"success":"failed",message:dq.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bS.llm.currentLimit=aY();let du=[...bS.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dt.push(bj({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bS.llm.calls} 次,失败 ${bS.llm.failures} 次,排队 ${bS.llm.throttledWaits} 次/${Math.round(bS.llm.throttledWaitMs/1e3)} 秒,检索 ${bS.evidence.searchQueries} 次/${Math.round(bS.evidence.searchMs/1e3)} 秒,证据上下文 ${bS.evidence.contextChars} 字,噪声过滤 ${bS.evidence.filteredNoise} 条,质量问题 阻断${bS.quality.blockingCount}/重要${bS.quality.importantCount}/轻微${bS.quality.minorCount},自动限流调整 ${bS.llm.limitAdjustments} 次${du?`,Top耗时:${du}`:""}`},{subtitle:"后台诊断"}));let dv=di.map(a=>({...a,evidence:ac(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cJ,chapters:dv,validationIssues:cx,exportGate:dq,executionStages:dt,partialChapters:di.map(a=>({id:a.id,title:a.title,chars:(0,aF.V7)(a.content),status:b9(a,bQ.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dv,reviewMetadata:{chapterSummaries:cP,globalIssues:cS.issues,diagnostics:bS}},markdown:dj}}async function ci(a){let b=(0,d.QJ)(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let f=e.resolve(a.projectRoot||(0,g.aY)());if(!f)throw Error("No knowledge base project found");let h=(0,g.Qh)(),i=bD(f,(0,d.Vh)(b)),j=cg(await h.getProject(f),[...i],a.maxEvidencePerChapter),k=[],l=[...i].filter(Boolean).sort(),m=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let a of c.queries.slice(0,m)){let b=await h.search(f,a,{scope:"project",filters:{filePaths:l},limit:Math.min(j,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});k.push(...b.results.filter(a=>bC(f,a.filePath,i)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let n=ac(k.filter(a=>bC(f,a.filePath,i)),{maxItems:Math.max(8,Math.min(28,2*j)),maxChars:18e3,preservePinned:!0}),o=a.currentMarkdown||"",p=new Set(a.existingFacts??[]),q=c.requiredFacts.filter(a=>!p.has(a)&&!n.some(b=>(0,Z.Lk)(b,a))),r=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",o?`> 当前文档上下文摘要:${o.replace(/\s+/gu," ")}`:"",n.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",n.length>0?"### 资料依据":"",...n.map(ad),"",q.length>0?"### 待确认事项":"",...q.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:r,evidence:n,missingFacts:q}}},91977:(a,b,c)=>{c.d(b,{I2:()=>g,Lk:()=>e,Uy:()=>f});var d=c(70208);function e(a,b){let c=`${a.filePath}
150
150
  ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function f(a,b){let c=(0,d._9)(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),e=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],f=new Map;for(let a of[...c,...e])f.set(a.id,{...f.get(a.id)||a,...a,required:a.required||f.get(a.id)?.required||!1});return[...f.values()]}function g(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&e(a,b.name)}}};