@customize-agent/server 4.0.85 → 4.0.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +20 -20
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/7899.js +1 -1
- package/.next/server/chunks/8409.js +148 -0
- package/.next/server/chunks/8661.js +2 -2
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/api/assets/generated/preview.js +1 -1
- package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated.js +1 -1
- package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/export.js +1 -1
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate.js +1 -1
- package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id].js +1 -1
- package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated.js +1 -1
- package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
- package/.next/server/pages/api/documents/roles.js +1 -1
- package/.next/server/pages/api/documents/templates.js +1 -1
- package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/context/long-term.html +1 -1
- package/.next/server/pages/context/short-term.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/search.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +30 -30
- package/.next/static/{37XAh0E9YCoej2skkcLoJ → Cv4eSkuLaIwjvrebkUlGv}/_buildManifest.js +1 -1
- package/.next/static/chunks/375-4a1c73eb22d653d2.js +1 -0
- package/.next/static/chunks/466-1cd359f130473697.js +1 -0
- package/.next/static/chunks/63-dd8eeb8edd766bae.js +4 -0
- package/.next/static/chunks/642-708b928fbafc6c20.js +8 -0
- package/.next/static/chunks/694-2d545cfbb9779f2c.js +1 -0
- package/.next/static/chunks/{767-4f3b0ae7bff68fde.js → 767-e97ea5dee1ab87b5.js} +1 -1
- package/.next/static/chunks/788-7f7359a830e3f4fd.js +1 -0
- package/.next/static/chunks/795-d8fb7a0420512701.js +1 -0
- package/.next/static/chunks/pages/document-roles-6134d2d3284a530a.js +1 -0
- package/.next/static/chunks/pages/documents-aa14e6ec02784787.js +1 -0
- package/.next/static/chunks/pages/guide-c00be7803483b703.js +1 -0
- package/package.json +2 -2
- package/.next/server/chunks/4375.js +0 -123
- package/.next/static/chunks/375-f731e5ec66ab942c.js +0 -1
- package/.next/static/chunks/466-a54223cadb7cfad9.js +0 -1
- package/.next/static/chunks/63-47dff441816f712f.js +0 -4
- package/.next/static/chunks/642-b325b80d595ec100.js +0 -8
- package/.next/static/chunks/694-b6ab4967c35bbcee.js +0 -1
- package/.next/static/chunks/788-db05269178a28c20.js +0 -1
- package/.next/static/chunks/795-262a7ef599d655f4.js +0 -1
- package/.next/static/chunks/pages/document-roles-7e5a02b0f03eb951.js +0 -1
- package/.next/static/chunks/pages/documents-e6a276951f092076.js +0 -1
- package/.next/static/chunks/pages/guide-c45dc4e0a02247c9.js +0 -1
- /package/.next/static/{37XAh0E9YCoej2skkcLoJ → Cv4eSkuLaIwjvrebkUlGv}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
"use strict";exports.id=8409,exports.ids=[8409],exports.modules={2894:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>o,PH:()=>u,dg:()=>l,h0:()=>p,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021),i=c(47899);function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"pattern"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i.jt[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a){let b=[];for(let c of a)b.push(k(c));return b}function o(a,b,c){let d=j();if(!d)return[];try{let e=function(a){let b=[];for(let c of a.split(/[\s,,。;;::、/\\|]+/u)){let a=c.trim();a.length<i.Wc||b.push(a)}return[...new Set(b)]}(a),g=c?`%Project: ${f.resolve(c)}%`:void 0,h=Number.isFinite(b)&&b>0?Math.ceil(b):void 0,j=h?"LIMIT ?":"",k=h?[h]:[];if(0===e.length){let a=g?d.prepare(`SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC ${j}`).all(g,...k):d.prepare(`SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC ${j}`).all(...k);return n(a)}let l=function(a){let b=[],c=[];for(let d of a)b.push("(content LIKE ? OR context LIKE ?)"),c.push(`%${d}%`,`%${d}%`);return{clauses:b.join(" OR "),params:c}}(e),m=g?d.prepare(`
|
|
2
|
+
SELECT * FROM memories
|
|
3
|
+
WHERE context LIKE ? AND (${l.clauses})
|
|
4
|
+
ORDER BY access_count DESC, updated_at DESC
|
|
5
|
+
${j}
|
|
6
|
+
`).all(g,...l.params,...k):d.prepare(`
|
|
7
|
+
SELECT * FROM memories
|
|
8
|
+
WHERE ${l.clauses}
|
|
9
|
+
ORDER BY access_count DESC, updated_at DESC
|
|
10
|
+
${j}
|
|
11
|
+
`).all(...l.params,...k);return n(m)}finally{d.close()}}function p(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return!1;let c=new(e())(b);try{return c.prepare("DELETE FROM memories WHERE id = ?").run(a).changes>0}finally{c.close()}}function q(a,b){let c=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(c))return!1;let d=new(e())(c);try{return d.prepare("UPDATE memories SET content = ?, context = ?, updated_at = datetime('now') WHERE id = ?").run(b.content,b.context||"",a).changes>0}finally{d.close()}}function r(a){return"long_term"===a?"access_count >= 2":"access_count < 2"}function s(a){let b=j();if(!b)return{count:0,totalBytes:0};try{let c=b.prepare(`SELECT COUNT(*) as count, COALESCE(SUM(LENGTH(content) + LENGTH(context)), 0) as totalBytes FROM memories WHERE ${r(a)}`).get();return{count:Number(c.count??0),totalBytes:Number(c.totalBytes??0)}}finally{b.close()}}function t(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return 0;let c=new(e())(b);try{let b=c.prepare(`SELECT rowid FROM memories WHERE ${r(a)}`).all();return c.transaction(()=>{c.prepare(`DELETE FROM memories WHERE ${r(a)}`).run()})(),b.length}finally{c.close()}}function u(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return{changed:0,beforeBytes:0,afterBytes:0};let c=new(e())(b);try{let b=c.prepare(`SELECT id, content, context FROM memories WHERE ${r(a)}`).all(),d=0,e=0,f=0,g=a=>{let b=String(a||"").replace(/\s+/gu," ").trim();return b.length>1200?`${b.slice(0,1e3)} … ${b.slice(-160)}`:b},h=c.prepare("UPDATE memories SET content = ?, context = ?, updated_at = datetime('now') WHERE id = ?");return c.transaction(()=>{for(let a of b){e+=Buffer.byteLength(`${a.content}${a.context}`);let b=g(a.content),c=g(a.context);f+=Buffer.byteLength(`${b}${c}`),(b!==a.content||c!==a.context)&&(h.run(b,c,a.id),d++)}})(),{changed:d,beforeBytes:e,afterBytes:f}}finally{c.close()}}},8753:(a,b,c)=>{c.d(b,{V:()=>h});var d=c(73024),e=c(48161),f=c(76760);let g={reviewStandardQueries:[],reviewChapterTemplateMatchers:[],reviewChapterSectionDefaults:{firstChapterSections:[],chapterSections:[],firstChapterTableSections:[],firstChapterTableRequirements:[]},templates:[],roles:[],roleConfigs:[],qualityBenchmarks:[],autoSpecGates:[],chapterTitleFilters:[]};function h(){try{var a;let b=function(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"engineering-document-config.json")}();if(!d.existsSync(b))return g;return a=JSON.parse(d.readFileSync(b,"utf-8")),{reviewStandardQueries:Array.isArray(a.reviewStandardQueries)?a.reviewStandardQueries.filter(Boolean):[],reviewChapterTemplateMatchers:Array.isArray(a.reviewChapterTemplateMatchers)?a.reviewChapterTemplateMatchers.filter(Boolean):[],reviewChapterSectionDefaults:{firstChapterSections:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterSections)?a.reviewChapterSectionDefaults.firstChapterSections.filter(Boolean):[],chapterSections:Array.isArray(a.reviewChapterSectionDefaults?.chapterSections)?a.reviewChapterSectionDefaults.chapterSections.filter(Boolean):[],firstChapterTableSections:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterTableSections)?a.reviewChapterSectionDefaults.firstChapterTableSections.filter(Boolean):[],firstChapterTableRequirements:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterTableRequirements)?a.reviewChapterSectionDefaults.firstChapterTableRequirements.filter(Boolean):[]},templates:Array.isArray(a.templates)?a.templates:[],roles:Array.isArray(a.roles)?a.roles:[],roleConfigs:Array.isArray(a.roleConfigs)?a.roleConfigs:[],qualityBenchmarks:Array.isArray(a.qualityBenchmarks)?a.qualityBenchmarks:[],technicalDetailGate:a.technicalDetailGate,autoSpecGates:Array.isArray(a.autoSpecGates)?a.autoSpecGates:[],chapterTitleFilters:Array.isArray(a.chapterTitleFilters)?a.chapterTitleFilters:[]}}catch{return g}}},23760:(a,b,c)=>{c.d(b,{AC:()=>m,Ai:()=>o,BV:()=>r,Ff:()=>k,M$:()=>G,N1:()=>C,Nz:()=>i,Ty:()=>s,bM:()=>D,f8:()=>v,gN:()=>t,iC:()=>q,k0:()=>w,kQ:()=>F,mR:()=>E,qK:()=>B,yw:()=>A,z0:()=>j});var d=c(8753),e=c(47899),f=c(78217),g=c(91977),h=c(52511);function i(a){return e.hc.test(a.message)}function j(a){let b="string"==typeof a?a:a.message;if("error"===("string"==typeof a?void 0:a.level))return"blocking";for(let a of e.gr)if(a.pattern.test(b))return a.severity;return"minor"}function k(a){let b={blocking:0,important:0,minor:0};for(let c of a)b[j(c)]+=1;return b}function l(a,b){let c=a.replace(/[\][()`*_>#|{},。、“”‘’:;!?,.!?:;-]+/gu," ").replace(e.ug," ").trim();if(c.length<120)return;let d=c.match(/[A-Za-z][A-Za-z-]{2,}|[\p{Script=Han}]{2,}/gu)||[];if(d.length<30)return;let f=1,g=new Map;for(let a=0;a<d.length;a+=1){let c=d[a].toLowerCase();if(g.set(c,(g.get(c)||0)+1),a>0&&c===d[a-1].toLowerCase()?f+=1:f=1,f>=12)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:"请重新生成该小节,禁止保留连续重复的英文单词或无意义片段。"}}let h=[...g.entries()].sort((a,b)=>b[1]-a[1])[0];if(h&&h[1]>=25&&h[1]/d.length>=.42)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:`检测到“${h[0]}”异常高频重复,请重新生成该小节。`}}function m(a,b=[]){let c=[],d=l(a,"全文");for(let a of(d&&c.push(d),b)){let b=l(a.content,`章节“${a.title}”`);for(let d of(b&&c.push(b),a.sections||[])){let b=d.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"));if(!e)continue;let f=l(e[1],`小节“${d}”`);f&&c.push(f)}}return c}function n(a){return!(!i(a)||/章节审查|最终质量审查|规划小节正文过短|正文篇幅明显低于目标|正文缺少规划小节|缺少规划小节|小节内容补写未完成|正文存在空泛占位表达|结构化事实读取不足|正文可能未显式覆盖|仅包含文件类型和占位符|不在本次招标范围内/u.test(a.message)||/小节只有标题|只有标题或表格无正文/u.test(a.message)&&!/全文|整篇|生成未完成|章节生成失败/u.test(a.message))}function o(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&n(a))},{key:"basic_facts",label:"基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"structured_precision",label:"结构化精确参数已使用",passed:b.preciseFacts.length<e.mu||a.every(a=>"error"!==a.level||!e.Ab.test(a.message))},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))},{key:"no_project_contamination",label:"无项目污染和事实一致性阻断",passed:!a.some(a=>"error"===a.level&&e.Uv.test(a.message)&&n(a))}],f=a.filter(a=>"error"===a.level&&n(a));return{passed:0===f.length,blockingIssues:f,checklist:d}}function p(a){let b=[];for(let c of a.split(e.AQ))e.w7.test(c)&&e.N3.test(c)&&b.push(c);return b}function q(a){let b=[...a.matchAll(e.DB)],c=[];for(let d=1;d<b.length;d+=1){let f=b[d].index||0,g=b[d+1]?.index??a.length,h=a.slice(f,g);e.Ks.test(h)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现基础信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(0===b.length)return c;let d=b[0].index||0,f=b[1]?.index??a.length,g=a.slice(d,f),h=g.search(e.jM);if(h<=0)return c;let i=g.slice(0,h).replace(e.Dc,""),j=[];for(let a of e.Y8)RegExp(`${a}\\s*[::]`,"u").test(i)&&j.push(a);return j.length>=3&&c.push({level:"warning",message:`基础信息表前重复叙述字段:${j.join("、")}`,suggestion:"基础信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述名称、编号、范围、周期、质量等字段。"}),c}function r(a){let b=[],c=[];for(let b of e.ZH)a.includes(b)&&c.push(b);c.length>0&&b.push({level:"warning",message:`存在模板化前缀或套话:${c.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入对象、动作、措施、检查和闭环。"});let d=a.match(/OCR|知识库|提示词|绑定片段|兜底|后台|文件路径|PDF|DWG|Excel|识别错误/giu);return d?.length&&b.push({level:"error",message:`正文包含后台或资料处理话术:${[...new Set(d)].join("、")}`,suggestion:"请改为正式文档语言,例如“资料文字不清”“资料口径不一致”“项目资料”,不得暴露后台处理过程。"}),b}function s(a){let b=[];for(let c of a){let a=(c.sections||[]).filter(Boolean),d=a.filter((b,c)=>a.indexOf(b)!==c);d.length>0&&b.push({level:"warning",message:`${c.title} 存在重复小节:${[...new Set(d)].join("、")}`,suggestion:"请保留用户需求、模板或显式大纲中真实需要的小节,删除重复项。"})}return b}function t(a){let b=e.HX.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=0,d=0;for(let a of b[1].split(e.A5))e.ZT.test(a)&&e.EB.test(a)&&(c+=1,e.sr.test(a)&&(d+=1));return c>0&&0===d?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function u(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+章\s*/u,"").replace(/^\d+(?:\.\d+)+(?:[..、]|\s)+/u,"").replace(/^\d+[..、]\s*/u,"").replace(/[\s::.。]+$/gu,"").trim()}function v(a){let b=function(a){let b=e.HX.exec(a);return b?b[1].split(e.A5).map(a=>/^\s*\d+\.\d+\s+(.+)$/u.exec(a.trim())).filter(a=>!!a).map(a=>u(a[1]||"")).filter(Boolean):[]}(a),c=[...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>u(a[1]||"")).filter(Boolean);if(0===b.length||0===c.length)return[];let d=new Set(c),f=new Set(b),g=b.filter(a=>!d.has(a)),h=c.filter(a=>!f.has(a)),i=[];return g.length>0&&i.push({level:"warning",message:`目录小节未在正文中找到:${[...new Set(g)].join("、")}`,suggestion:"请以用户 outline 抽取出的章节为准,修正文目录与正文二级小节编号及标题。"}),h.length>0&&i.push({level:"warning",message:`正文小节未进入目录:${[...new Set(h)].join("、")}`,suggestion:"请重新生成目录,确保只收录正文二级小节,不收录三级小节。"}),i}function w(a){let b=[],c=a.split(e.A5).map(a=>a.trim()).filter(a=>a&&!/^#{1,6}\s+/u.test(a)&&!/^\s*\|/u.test(a)&&!/^<div\b/iu.test(a)),d=c.find(a=>u(a).length<=1);d&&b.push({level:"warning",message:`正文存在孤立字或残缺段落:${d}`,suggestion:"请删除残缺行或重新生成所在小节。"});let f=c.find(a=>/[,、;:和与在为对将]$/u.test(a)||/(通过|包括|如下|主要包括)$/u.test(a));f&&b.push({level:"warning",message:`正文存在疑似截断句:${f}`,suggestion:"请补完整该段落,避免以连接词、逗号或冒号结尾。"});let g=c.find(a=>a.length>380);return g&&b.push({level:"warning",message:`正文存在过长段落:${g}`,suggestion:"请拆分为多段或表格,改善导出版式和可读性。"}),b}function x(a){return a.split(e.A5).filter(a=>!/^#{1,6}\s+/u.test(a.trim())).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*:?-{3,}:?/u.test(a)).filter(a=>!/^<\/?div\b/iu.test(a.trim())).join("\n").replace(/[|*_`<>-]/gu,"").replace(e.ug,"").length}function y(a){let b=[...a.matchAll(/^(#{3,4})\s+(.+)$/gmu)];return b.map((c,d)=>{let e=c[1].length,f=(c.index||0)+c[0].length,g=b.slice(d+1).find(a=>a[1].length<=e),h=g?.index??a.length,i=(c[2]||"").trim();return{rawTitle:i,title:u(i),level:e,body:a.slice(f,h)}}).filter(a=>a.title&&(3===a.level||4===a.level))}function z(a,b,c,d,f){let g=x(d),h=e.w7.test(d)&&e.N3.test(d),i=d.split("\n").filter(a=>!e.w7.test(a)&&!e.N3.test(a)).join("\n"),j=x(i);if(g<80&&/^####\s+/mu.test(i)||h&&j<20)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"table_only",planned:f,message:`${a} 小节只有标题或表格无正文:${b}`};if(!(g>=80)||!(j>=20)){if(0===g)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"empty",planned:f,message:`${a} 空小节:${b}`};if(g<180)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"too_short",planned:f,message:`${a} ${f?"规划小节":"正文小节"}正文过短:${b}`}}}function A(a,b){let c=[],d=new Set;for(let e of b){let b=e.content?.trim()?e.content:a;for(let a of e.sections||[]){let f=u(a),g=function(a,b){return y(a).find(a=>(function(a,b){let c=u(a),d=u(b);return!!(c&&d&&c===d)})(a.rawTitle,b))}(b,a),h=`${e.title}|${f}|planned`;if(!g){c.push({chapterTitle:e.title,sectionTitle:a,level:3,bodyLength:0,reason:"missing_planned_section",planned:!0,message:`${e.title} 缺少规划小节:${a}`}),d.add(h);continue}let i=z(e.title,f||a,g.level,g.body,!0);i&&c.push(i),d.add(h)}for(let a of y(b)){let b=`${e.title}|${a.title}|actual`,f=`${e.title}|${a.title}|planned`;if(d.has(b)||d.has(f))continue;let g=z(e.title,a.title,a.level,a.body,!1);g&&("empty"===g.reason||"table_only"===g.reason)&&c.push(g),d.add(b)}}return c}function B(a,b){return A(a,b).map(a=>({level:"empty"===a.reason?"error":"warning",message:a.message,suggestion:"missing_planned_section"===a.reason?"建议补写该二级小节;如正文已在相邻小节覆盖,可作为质量优化项处理。":"table_only"===a.reason?"请在表格前后补充来源、适用范围、结论和执行要求。":"建议补充与该小节相关的材料事实、适用边界和必要说明。"}))}function C(a,b){let c=[],d=a.replace(e.ug,""),f=function(a){let b=new Set;for(let c of a.preciseFacts){let a=`${c.processingType||""} ${c.roleId} ${c.sourceFile}`;if(!e.FM.test(a)&&"precise_fact"!==c.roleId)continue;let d=`${c.key} ${c.fieldName||""} ${c.value}`;for(let a of d.matchAll(e.No)){let c=a[0].trim();/万元|元|报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算/u.test(`${c} ${d}`)||/OCR|识别错误|乱码|无法确认|疑似|不确定|语义断裂|页码|目录/u.test(d)||/^\d+$/.test(c)&&10>Number(c)||b.add(c)}}return[...b]}(b),g=function(a,b){let c=0;for(let d of a)b.includes(d.replace(e.ug,""))&&(c+=1);return c}(f,d);return f.length>=e.mu&&g/f.length<e.tg&&c.push({level:"warning",message:`可靠精确参数使用不足:${g}/${f.length}`,suggestion:"请将资料中可靠的规格、参数、数量、时间、比例和标准编号写入对应章节;商务金额、单价、税率、预留金不得写入正文。"}),b.bills.length>0&&!e.pP.test(a)&&c.push({level:"error",message:"正文未体现结构化数据资料",suggestion:"请从表格、列表或明细中提取对象、单位、数量、规格和关键参数补入对应章节。"}),b.drawings.length>0&&!e._U.test(a)&&c.push({level:"error",message:"正文未体现设计/方案/说明类资料",suggestion:"请从设计、方案或说明资料中提取对象、流程、节点、做法、配置、规则和标准要求。"}),c}function D(a){let b=[];for(let c of e.IA)c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见资料/按文件”。"});return b}function E(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,f=[];for(let a of(0,d.V)().autoSpecGates)(function(a,b){for(let c of b)try{if(RegExp(c,"iu").test(a))return!0}catch{if(a.includes(c))return!0}return!1})(c,a.templateMatchers)&&f.push(a);if(0===f.length)return[];let g=[],h=p(a).length,i=0;for(let b of f){for(let c of(i=Math.max(i,b.minTables||0),b.requiredTexts))a.includes(c)||g.push({level:"warning",message:`配置要求缺少必要内容:${c}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let c of b.forbiddenTexts)a.includes(c)&&g.push({level:"error",message:`配置要求不得出现:${c}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"})}return e.bu.test(a)&&g.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"}),i&&h<i&&g.push({level:"error",message:`配置要求正式表格不足:${h}/${i}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),g}function F(a,b,c,d,h,i,j){if(!a)return b;let k=[...b],l=function(a){let b=[...a.project,...a.schedule,...a.quality,...a.safety,...a.resources];for(let c of Object.values(a.schemaFacts))b.push(...c);return b}(c),m=function(a,b){let c=new Set;for(let a of b)c.add(a.key),a.fieldName&&c.add(a.fieldName);for(let b of a.tables){for(let a of b.headers)c.add(a);for(let a of b.rows)for(let b of a)c.add(b)}return c}(c,l),n=new Set(d.map(a=>a.title));for(let b of a.factFields){if(!b.required)continue;let a=c.schemaFacts[b.id]||[],e=!1,f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId));for(let a of d){if(e&&f)break;for(let c of a.evidence)!e&&!a.missingFacts.includes(b.name)&&(0,g.I2)(c,b)&&(e=!0),!f&&(0,g.I2)(c,b)&&(f=!0)}0!==a.length||m.has(b.name)||e||k.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||k.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}for(let b of a.chapterRules){let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&k.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let o=p(h),q=function(a){let b=[];for(let c of a.matchAll(e.gW))b.push({alt:c[1]||"",url:c[2]||"",index:c.index??0});return b}(h),r=(0,f.Cv)(h);for(let b of a.gateRules){let a=b.evaluator?b.evaluator:e.cA[b.type]?.(b)??{subject:"document",operator:"contains",value:b.value||b.target},f=a.target||b.target||"",g=a.value||b.value||f,p=d.find(a=>a.title===f),s=function(a){for(let c of e.Lp){let d=c(a);if(d){var b;return{level:a.rule.level,message:(b=a.rule,`${b.name}:${d}`)}}}}({rule:b,evaluator:a,target:f,value:g,min:a.min||Number(b.value)||1,markdown:h,textScope:"chapter"===a.subject&&p?p.content:h,regex:g?function(a){try{return RegExp(a,"iu")}catch{return}}(g):void 0,chapter:p,factNames:m,chapterTitles:n,tableBlocks:o,imageRefs:q,estimatedPages:r,allFacts:l,factsModel:c,fileBindings:i,promptBindings:j});s&&k.push(s)}return k}function G(a,b){let c=function(a){let b="";for(let c of(0,h.dU)(a))c.content&&(b+=`${c.content}
|
|
12
|
+
|
|
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
|
+
${a.category}
|
|
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:()=>s,C1:()=>y,DX:()=>z,N6:()=>A,QJ:()=>r,Vh:()=>E,bV:()=>v,dU:()=>p,h0:()=>u,jG:()=>q,wR:()=>C,xm:()=>t,zY:()=>D});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=[]){if(0===a.length)return[];let b=[],c=o();for(let f of a){let a=f.promptId;if(a.startsWith("custom:")){let d=c.find(b=>b.id===a);d&&b.push({id:a,roleId:f.roleId,name:d.name,content:d.content});continue}if(a.startsWith("file:")){let c=a.slice(5);d.existsSync(c)&&b.push({id:a,roleId:f.roleId,name:e.basename(e.dirname(c))||c,content:d.readFileSync(c,"utf-8")})}}return b}function q(){let a=(0,i.V)().templates,b=m().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function r(a){return q().find(b=>b.id===a)}function s(a){let b=l(a),c=m().filter(a=>a.id!==b.id);return c.push(b),n(c),b}async function t(a,b=(0,g.aY)()){let c=r(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=A(c),k=B(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=D(c),m=E(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 q=new Map(o.map(a=>[a.relativePath,a])),s=m.map(a=>{let b=i.find(b=>b.id===a.roleId),c=q.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)}}),u=p(l);return{templateId:a,projectRoleConfigId:j,fileDiagnostics:s,promptDiagnostics:l.map(a=>{let b=f.find(b=>b.id===a.roleId),c=u.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 u(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 v(a){let b=r(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 w(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function x(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>w(b,a)))}function y(a,b){return x(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>w(a,b)))}function z(a,b){return x(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>w(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>w(a,b)))}function A(a){return a.projectRoleConfigId||void 0}function B(a){let b=A(a);return b?(0,h.Mu)(b):void 0}function C(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 D(a){let b=B(a);if(b){let a=(0,h.XB)("prompt"),d=[];for(let e of[...b.promptRoles].sort((a,b)=>a.order-b.order)){var c;let b=a.find(a=>a.id===e.roleId),f=b?b.resourceIds?.length?b.resourceIds:b.resourceId?[b.resourceId]:[]:[],g=f.length>0?f: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)}(e.roleId,b?.name),h=b?.id||(c=e.roleId,/extract|extraction|抽取|清单|图纸|品牌/u.test(c)?"fact_extraction":/validation|校验|审查|审核/u.test(c)?"validation":/format|排版/u.test(c)?"formatting":/writer|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/u.test(c)?"chapter_generation":"reference");d.push(...g.map(a=>({promptId:a,roleId:h})))}if(d.length>0){let a=new Set,b=[];for(let c of d){let d=`${c.roleId}:${c.promptId}`;!c.promptId||!c.roleId||a.has(d)||(a.add(d),b.push(c))}return b}}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function E(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:()=>m,Ui:()=>k,YZ:()=>n,_9:()=>s,bE:()=>o,bl:()=>j,cs:()=>l,eI:()=>i,tb:()=>p});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 h.lastIndex=0,h.test(a)}function j(a){return RegExp(`^\\s*<\\s*${g}(?:\\s[^>]*)?>`,"iu").test(a)}function k(a){return RegExp(`^\\s*<\\/\\s*${g}\\s*>`,"iu").test(a)}function l(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 m(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 n(a){return m(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function o(a){let b=a.trim(),c=n(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))&&!q(c)}function p(a,b){let c=m(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 q(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function r(a,b){let c=new Set;return a.filter(a=>{let d=n(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||q(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function s(a,b,c){return!b||c?.preserveExplicitOutline?r([...a.chapters],{...c,template:a}):r([...a.chapters].map(a=>{let c=m(a.title),d=b.chapterRules.find(b=>b.id===a.id||m(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:()=>b4,jGg:()=>d.jG,R1O:()=>b5,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
|
+
建议关注事实:${a.factFields.map(a=>a.name).join("、")}
|
|
18
|
+
章节内容要求:${a.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ")}`:""}`).join(";")||"以当前模板章节为准"}
|
|
19
|
+
质量控制点:${a.gateRules.map(a=>a.name).join("、")}`:`## 结构化检查摘要
|
|
20
|
+
摘要名称:${a.name}
|
|
21
|
+
版本标识:${b}
|
|
22
|
+
说明:以下内容仅用于事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
|
|
23
|
+
建议关注事实:${a.factFields.map(a=>a.name).join("、")}
|
|
24
|
+
章节内容建议:${a.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ")}`:""}`).join(";")||"以当前模板章节为准"}
|
|
25
|
+
质量提醒:${a.gateRules.map(a=>a.name).join("、")}`}let v=["project_overview","requirement_document","addendum","structured_data","design_specification","schedule_quality_safety","scope_description"],w=["project_overview","requirement_document","addendum","structured_data","budget_cost","design_specification","resource_recommendation","schedule_quality_safety","scope_description","technical_specification","risk_constraints"];function x(a){let b=[];for(let c of a)for(let a of c.relativePath.split(/[\\/]/gu))a&&b.push(a);return b}function y(a){return/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(a)}function z(a){return B(a).replace(/^\d+(?:\.\d+)?[-_\s]*/u,"").replace(/^(?:延期到\d+(?:\.\d+)?[-_—–\s]*)+/u,"").trim()}function A(a){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function B(a){return a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()}function C(a){let b=new Set,c=[];for(let d of x(a)){let a=z(d);!(!/项目|任务|文档|合同|计划|方案|工程/iu.test(a)||a.length<6||b.has(a))&&(!y(a)||/\.\w+$/u.test(d))&&(b.add(a),c.push(a))}return c}function D(a,b){return 0===a.length?b:a.map(a=>B(a.fileName)).join("、")}function E(a,b,c){b.lastIndex=0;let d=new Set,e=[];for(let f of a.matchAll(b)){let a=(f[c]||"").trim();!a||d.has(a)||(d.add(a),e.push(a))}return b.lastIndex=0,e}function F(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function G(a){let b=F(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function H(a){return a.replace(/OCR|识别错误|乱码/giu,"资料文字不清").replace(/知识库|提示词|后台|绑定片段|兜底/gu,"项目资料").replace(/PDF|DWG|Excel|XLSX?|DOCX?/giu,"资料文件")}function I(a,b={}){return b.publicSafe?["## 项目资料事实边界",H(a.extractedSections.projectOverview),`明确事实:责任主体 ${a.facts.ownerNames?.join("、")||"资料未明确"};地点 ${a.facts.locationNames?.join("、")||"资料未明确"};周期 ${a.facts.scheduleValues?.join("、")||"资料未明确"};质量 ${a.facts.qualityTargets?.join("、")||"资料未明确"}。`,H(a.extractedSections.scopeSummary),H(a.extractedSections.structuredDataSummary),H(a.extractedSections.designSummary),H(a.extractedSections.scheduleQualitySafetySummary),H(a.extractedSections.constraintsAndRisks),"仅使用资料中明确、可信的事实;资料未明确的工程实体事实不得推导,允许推导的计划配置类数据须明确标注为计划配置值。"].filter(Boolean).join("\n"):["## 后台绑定材料摘要",a.extractedSections.projectOverview,`材料指纹:对象名候选 ${a.fingerprint.projectNames.join("、")||"无"};编号 ${a.fingerprint.documentNos.join("、")||"无"};资料组 ${a.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*a.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${a.facts.ownerNames?.join("、")||"无"};地点 ${a.facts.locationNames?.join("、")||"无"};周期 ${a.facts.scheduleValues?.join("、")||"无"};质量 ${a.facts.qualityTargets?.join("、")||"无"}。`,a.extractedSections.scopeSummary,a.extractedSections.structuredDataSummary,a.extractedSections.designSummary,a.extractedSections.scheduleQualitySafetySummary,a.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*a.coverage.materialCompletenessRate)}%`].join("\n")}let J={id:"default_general_document",name:"通用文档",factFields:[{id:"document_identity",name:"对象名称",aliases:["项目名称","工程名称","文档名称","任务名称","招标项目名称","建设项目名称"],category:"identity",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.75,minForValidation:.85,allowPathOnly:!1},conflictPolicy:"strict"},{id:"schedule_requirement",name:"周期要求",aliases:["计划工期","工期","周期要求","进度节点要求","开工日期","竣工日期"],category:"schedule",cardinality:"single",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"strict"},{id:"quality_requirement",name:"质量要求",aliases:["质量要求","质量标准","验收要求","评价标准"],category:"quality",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"safety_requirement",name:"安全合规要求",aliases:["安全要求","安全合规要求","风险控制要求","合规要求"],category:"safety",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.65,minForValidation:.75,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"technical_parameter",name:"技术参数",aliases:["技术参数","参数规格范围","规格","型号","尺寸","标准编号","材料设备"],category:"technical",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"must_use",confidencePolicy:{minForGeneration:.7,minForValidation:.8,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"resource_plan",name:"资源配置",aliases:["劳动力","机械","检测设备","应急物资","资源配置","人员配置"],category:"resource",cardinality:"multiple",derivationPolicy:"plan_inferable",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.45,minForValidation:.55,allowPathOnly:!1},conflictPolicy:"allow_multiple"},{id:"commercial_data",name:"商务数据",aliases:["报价","单价","合价","综合单价","预留金","税率","金额","利润"],category:"commercial",cardinality:"multiple",derivationPolicy:"forbidden",usagePolicy:"do_not_use",confidencePolicy:{minForGeneration:1,minForValidation:1,allowPathOnly:!1},conflictPolicy:"ignore"},{id:"rule_requirement",name:"规则要求",aliases:["规则要求","变更说明","实施范围","对象范围","结构化数据范围"],category:"compliance",cardinality:"multiple",derivationPolicy:"source_only",usagePolicy:"use_if_relevant",confidencePolicy:{minForGeneration:.6,minForValidation:.7,allowPathOnly:!1},conflictPolicy:"allow_multiple"}],forbiddenValuePatterns:[/报价|单价|合价|综合单价|预留金|税率|增值税|利润|结算|金额|万元|元/u],diagnosticValuePatterns:[/OCR|识别错误|乱码|无法确认|疑似|不确定|绑定片段|兜底|知识库|提示词|后台|文件路径|PDF|DWG|Excel/u],lowConfidenceValuePatterns:[/无法确认|疑似|不确定|需复核|文字模糊|语义断裂|识别错误|乱码/u]},K={...J,id:"construction_organization_design",name:"施工组织设计"};function L(a,b){return a.factFields.find(a=>a.name===b||a.aliases.some(a=>b.includes(a)||a.includes(b)))}function M(a,b){return a.forbiddenValuePatterns.some(a=>a.test(b))}function N(a,b){return a.diagnosticValuePatterns.some(a=>a.test(b))}function O(a,b={}){return b.publicSafe?`## 生成事实使用边界
|
|
26
|
+
资料覆盖程度:${Math.round(100*a.materialCoverageRate)}%
|
|
27
|
+
资料角色满足程度:${Math.round(100*a.roleSatisfactionRate)}%
|
|
28
|
+
资料不足的事实不得编造;仅施工组织、计划安排、资源配置类数据可在文档要求允许时进行计划推导并标注。`:["## 后台生成准备度",`可生成:${a.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*a.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*a.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*a.specCompletenessRate)}%`,a.missingRoles.length?`缺失角色:${a.missingRoles.join("、")}`:"",a.weakRoles.length?`较弱角色:${a.weakRoles.join("、")}`:""].filter(Boolean).join("\n")}function P(a){return/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(a)}function Q(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/[\s,。,.;;::《》“”‘’()()_-]+/gu,"").toLowerCase()}function R(a,b){let c=Q(b);if(!c||c.length<4)return!0;let d=Q(a);return!!d.includes(c)||c.length>=12&&d.includes(c.slice(0,Math.max(8,Math.floor(.72*c.length))))}function S(a){let b=[],c=a.markdown||"";for(let e of a.spec.factFields.filter(a=>a.required)){var d;!((d=e.name).length<4||P(d))&&/\d|GB|JGJ|C\d|HRB|DN|mm|MPa|kPa|工期|质量|安全|项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数/u.test(d)&&!R(c,e.name)&&b.push({level:"info",message:`正文可能未显式覆盖“${e.name}”`,suggestion:"建议检查对应章节是否已自然表达该事实。"})}let e=a.summary.facts.projectName;!e||"当前知识库项目"===e||P(e)||R(c,e)||b.push({level:"warning",message:"正文未明显体现关键对象名称",suggestion:"建议在概况、背景或首页标题中体现当前文档的关键对象名称。"});let f=a.summary.facts.documentNo;for(let a of(f&&!c.includes(f)&&b.push({level:"info",message:"正文未体现文档/任务编号",suggestion:"如文档需要编号,请在概况、背景或首页信息中补充。"}),["知识库证据","文件角色","提示词角色","文档规范包","规范包","后台自动规范","后台优化建议","基础事实候选","材料未提供","未检索到"]))c.includes(a)&&b.push({level:"error",message:`正文包含后台流程话术:${a}`,suggestion:"请重新生成或在审查阶段删除后台流程描述。"});return b}function T(a,b){let c=[],d=new Set([b.projectName,...b.fingerprint.projectNames].filter(Boolean));for(let e of b.contaminationCandidates)e.length>=6&&!d.has(e)&&a.replace(/\s+/gu,"").includes(e.replace(/\s+/gu,""))&&c.push({level:"error",message:`正文疑似混入其他对象名称:${e}`,suggestion:"请检查绑定材料选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.documentNos,f=a.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)?.find(a=>!e.includes(a));return f&&e.length>0&&c.push({level:"error",message:`正文疑似混入其他文档编号:${f}`,suggestion:"请重新生成并检查是否召回了其他绑定材料。"}),c}function U(a){return a.replace(/[((]\d+[))]/gu,"").replace(/副本|最终版|扫描件|定稿/gu,"").replace(/\s+/gu,"").replace(/[,。,.;;::《》“”‘’()()_-]/gu,"").toLowerCase()}function V(a,b){let c=a.trim();if(N(b,c)||M(b,c))return"";let d=U(c);return!d||d.length>80?"":d}function W(a){let b=a.profile||J,c=[],d=new Map;for(let c of a.facts){let a=c.fieldName||c.key;a&&function(a,b){let c=L(b,a);return c?"single"===c.cardinality&&"allow_multiple"!==c.conflictPolicy&&"ignore"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)}(a,b)&&V(String(c.value),b)&&d.set(a,[...d.get(a)||[],{value:String(c.value),source:c.sourceFile}])}for(let[a,e]of d){let d=new Map;for(let a of e){let c=V(a.value,b);c&&d.set(c,[...d.get(c)||[],a])}if(d.size>1){let b=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");c.push({level:"error",message:`事实一致性冲突:${a} 存在多个值:${b}`,suggestion:"请确认当前绑定材料组,或在模板绑定中只绑定当前文档所需材料。"})}}let e=a.summary.facts.projectName;if(e&&"当前知识库项目"!==e&&!/--|延期到|资料|附件|扫描|目录|汇总|打包|备份|\d{1,2}\.\d{1,2}/u.test(e)){let b=U(a.markdown);[e,...a.summary.fingerprint.projectNames].flatMap(a=>[a,a.replace(/^\d+(?:\.\d+)?[^\u4e00-\u9fa5]*/u,""),a.replace(/\([^)]*\)|([^)]*)/gu,"")]).map(a=>U(a)).filter(a=>a.length>=8).some(a=>b.includes(a)||a.length>=12&&b.includes(a.slice(0,Math.max(8,Math.floor(.72*a.length)))))||c.push({level:"warning",message:`正文未包含当前对象名称:${e}`,suggestion:"请确认标题、概况或背景信息是否已体现当前对象名称。"})}return c}var X=c(58965),Y=c(91977);function Z(a,b=0){let c="drawing"===a.processingType||a.roleId?.includes("drawing")?"视觉资料":"table"===a.processingType||a.roleId?.includes("bill")?"表格资料":"rule"===a.processingType||a.roleId?.includes("tender")?"规则资料":"文本资料";return`${c}片段${b+1}${a.sectionTitle?`(${a.sectionTitle.replace(X.tK,"")})`:""}`}function $(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(X.VX,"").replace(X.tK,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function _(a){let b=$(a),c=Math.max(1,b.length),d=(b.match(/[\u4e00-\u9fa5]/gu)||[]).length,e=(b.match(/\d/gu)||[]).length,f=(b.match(/项目|任务|质量|安全|周期|验收|材料|设备|表格|数据|参数|规范|标准|流程|资源|风险/gu)||[]).length,g=(b.match(/CAD|AcDb|Polyline|ByLayer|ObjectId|Handle|Model|Layout|图层|页码|第\s*\d+\s*页|打印|版权所有|^[\s\W\d_]+$/gimu)||[]).length,h=(b.match(/(?:序号|项目名称|事项|单位|数量|单价|金额|备注)/gu)||[]).length,i=Math.min(1,d/c*.7+Math.min(.3,(e+3*f)/120)),j=Math.min(1,.18*g+.04*Math.max(0,h-8)+.35*(d/c<.25));return{noiseScore:j,factDensity:i,shouldUse:b.length>=30&&j<.72&&i>.08}}function aa(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=$(b).split("\n").map(a=>a.trim()).filter(a=>a&&!/^(?:序号\s*)?(?:项目名称|单位|数量|综合单价|合价|备注)(?:\s+|$)/u.test(a)).filter(a=>!/^第\s*\d+\s*页\s*(?:共\s*\d+\s*页)?$/u.test(a)).join("\n"),f=_(d);return d.length>20&&f.shouldUse||d.length>80&&f.noiseScore<.9?d:[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d}(a.filePath,a.content),c=_(b);return{item:{...a,content:b,score:a.score*(1+c.factDensity)*(1-.45*c.noiseScore)},quality:c}}),g=f.filter(a=>a.quality.shouldUse||/附件,仅作为内部事实提取依据/u.test(a.item.content)),h=Number.isFinite(b)&&b>0?Math.ceil(b):void 0,i=(g.length>=Math.min(3,a.length)?g:f).sort((a,b)=>b.item.score-a.item.score).filter(a=>{let b=function(a){let b=a.content.replace(/\s+/gu," ").trim();return`${a.filePath}:${a.sectionTitle||""}:${(0,j.createHash)("sha1").update(b).digest("hex")}`}(a.item);return!d.has(b)&&(d.add(b),!0)}),k=h?i.slice(0,h):i;if(c){let b=f.reduce((a,b)=>a+b.quality.noiseScore,0),d=f.reduce((a,b)=>a+b.quality.factDensity,0);c.evidence.raw+=a.length,c.evidence.used+=k.length,c.evidence.filteredNoise+=Math.max(0,f.length-g.length),c.evidence.avgNoiseScore=f.length?Number((b/f.length).toFixed(3)):0,c.evidence.avgFactDensity=f.length?Number((d/f.length).toFixed(3)):0}return k.map(a=>a.item)}function ab(a,b={},c){let d=Number.isFinite(b.maxItems)&&b.maxItems>0?Math.floor(b.maxItems):void 0,e=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.floor(b.maxChars):void 0,f=aa(a,void 0,c),g=b.preservePinned?f.filter(a=>"pinned-evidence"===a.source||"bound-file"===a.source):[],h=f.filter(a=>!g.includes(a)),i=[],j=new Map,k=0,l=(a,b=!1)=>{if(d&&i.length>=d)return;let c=j.get(a.filePath)||0;if(!b&&c>=4)return;let f=$(a.content),g=k+f.length;e&&i.length>0&&g>e||(i.push({...a,content:f}),j.set(a.filePath,c+1),k=g)};for(let a of g)l(a,!0);for(let a of h)l(a);return i}function ac(a,b=0){return`- ${Z(a,b)}:${$(a.content).replace(/\s+/gu," ").slice(0,260)}`}function ad(a,b){let c=new Map;for(let d of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|map|drawing|design/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(d.filePath,d.processingType),f=c.get(d.filePath)||{filePath:d.filePath,kind:b,roleId:d.roleId,processingType:d.processingType,score:d.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图-/u,"").replace(/-完整地图$/u,"完整地图"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(d.filePath,b),contentUse:"map"===b?"作为视觉/地图证据,用于说明空间关系、区域划分、点位、路线或布局。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、明细、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,d.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
29
|
+
${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","基础事实","附件资料","视觉资料","图片资料"].filter(b=>(0,Y.Lk)(a,b)||c.includes(b)))]}(d,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=d.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),c.set(d.filePath,f)}let d=[...c.values()].sort((a,b)=>b.score-a.score),f={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of d)f[a.kind].push(a);let g=[`绑定材料包:文本片段 ${b.length} 条、结构化材料 ${d.length} 个。`,`材料类型分布:文本 ${f.text.length}、文档 ${f.document.length}、表格/数据 ${f.spreadsheet.length+f.table.length}、图片 ${f.image.length}、视觉/地图 ${f.map.length}、其他 ${f.attachment.length}。`,"正文必须只写材料中的事实、参数、数量、做法和要求,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:b,resources:d,byKind:f,summary:g}}function ae(a,b=6e3,c=18e3){return Math.max(b,Math.min(c,Math.ceil(5.5*(Number.isFinite(a)&&a>0?Math.ceil(a):1200))))}function af(a,b,c,d){let e=b.trim();if(e){if(!Number.isFinite(d)||!d||c.chars+e.length<=d){a.push(e),c.chars+=e.length;return}c.omitted+=1}}function ag(a,b,c){let d={chars:0,omitted:0},e=[],f=new Set,g=new Set,h=[...a].sort((a,b)=>b.score-a.score);for(let a of h){if(g.has(a.filePath))continue;let h=e.length;af(e,c(a,e.length),d,b),e.length>h&&(g.add(a.filePath),f.add(a))}for(let a of h)f.has(a)||af(e,c(a,e.length),d,b);return{lines:e,omitted:d.omitted}}function ah(a,b={}){let c=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.ceil(b.maxChars):void 0,d=ag(a.resources,c?Math.floor(.35*c):void 0,(a,b)=>[`- 资料:${Z(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map($).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")),e=ag(a.textEvidence,c?Math.floor(.65*c):void 0,(a,b)=>`${Z(a,b)}
|
|
30
|
+
类型:${a.processingType||"reference"}
|
|
31
|
+
章节/片段:${a.sectionTitle?.replace(X.tK,"")||"资料片段"}
|
|
32
|
+
内容:${$(a.content).replace(/\s+/gu," ")}`),f=d.omitted+e.omitted>0?`提示:完整证据池仍保留 ${a.textEvidence.length} 条文本片段、${a.resources.length} 个结构化材料;为控制单次模型输入,本次只发送预算内高相关且覆盖多来源的证据,未发送片段将在章节/小节相关检索和质量校验中继续参与。`:"";return[a.summary,f,d.lines.length?`结构化资料:
|
|
33
|
+
${d.lines.join("\n")}`:"",e.lines.length?`文本/附件片段:
|
|
34
|
+
${e.lines.join("\n\n---\n\n")}`:""].filter(Boolean).join("\n\n")}var ai=c(70208);function aj(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let ak=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,al=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,am=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function an(a){return(function(a){let b=a.trim(),c=/^```(?:markdown|md)?\s*\n([\s\S]*?)\n```\s*$/iu.exec(b);return c?c[1].trim():a})(a).replace(/\b(m|㎡)\s*2\b/giu,"平方米").replace(/\bm\s*[²2]\b/giu,"平方米").replace(/\b(m|㎥)\s*3\b/giu,"立方米").replace(/\bm\s*[³3]\b/giu,"立方米").replace(/\bmm2\b/giu,"平方毫米").replace(/\bcm2\b/giu,"平方厘米").replace(/\bkm2\b/giu,"平方千米").replace(/\s*×\s*/gu,"\xd7").replace(/\s*≤\s*/gu,"≤").replace(/\s*≥\s*/gu,"≥").replace(/\s*±\s*/gu,"\xb1").replace(ak,"").replace(al,"").replace(am,"").replace(X.tK,"").replace(/^#\s+/gmu,"").replace(X.VX,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").split(/\r?\n/u).filter(a=>{let b=a.trim();if(!b||/^\s*\|/u.test(b)||/^\s*\|?\s*:?-{3,}:?/u.test(b))return!0;let c=(0,ai.GQ)(b.replace(/^#{1,6}\s+/u,""));return!(c.length<=1)&&!(/[,、;:和与在为对将]$/u.test(c)||/(通过|包括|如下|主要包括)$/u.test(c))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}let ao="你正在生成可直接交付的专业文档,不是系统调试报告。\n通用质量约束只用于补充用户要求、模板章节和绑定提示词;除事实安全、结构边界和导出格式要求外,不得覆盖用户明确要求。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n用户提供的信息和绑定材料应内化为正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n正文不得把原始文件条款、说明性附件或系统过程内容误作为章节标题或目录项。\n正文事实必须来自当前模板、用户要求、绑定提示词和绑定材料;信息不足或来源冲突时应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出。",ap="只生成当前小节正文,不生成其他二级小节,不重复章节一级标题。\n优先使用当前模板、用户要求、绑定提示词和绑定材料中的事实;缺少依据时不得编造具体数值、名称、时间、规格或责任。\n小节应有实质正文;除非用户或模板明确要求纯表格,否则表格只能作为辅助表达,不能整节只有表格。\n不得用通用兜底段落、空泛管理话术或后台缺料说明冒充正文;信息不足时只写已有事实、适用边界和待复核口径。";function aq(a){return(0,ai.GQ)(a.replace(/^#+\s*/u,"")).replace(/^(?:第)?[一二三四五六七八九十百千万\d]+章\s*/u,"").trim().replace(/\s+/gu,"")}function ar(a,b){let c=aq(a),d=aq(b);return!!(c&&d&&c===d)}function as(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>(0,ai.GQ)(a[1]||"")).filter(a=>a.length>=2&&a.length<=80).filter(a=>!/^\d+(?:\.\d+){2,}\s+/u.test(a)))]}function at(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;let e=/^(#{4,5})\s+(.+)$/u.exec(a.trim());if(e){if(!c)return"#####"===e[1]?a.replace(/^\s*#####/u,"####"):a;let b=(e[2]||"").trim(),f=(0,ai.GQ)(b.replace(/^\d+\.\d+\.\d+\s+/u,""));return f?(d+=1,`#### ${c}.${d} ${f}`):a}return a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function au(a){let b=[],c="";for(let d of a.split(/\r?\n/u)){let a=d.trim(),e=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a);if(e){c=e[1];continue}if(/^##\s+/u.test(a)&&(c=""),!c)continue;let f=/^####\s+(.+)$/u.exec(a);if(f){let a=(f[1]||"").trim();RegExp(`^${ay(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${(0,ai.GQ)(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}}return b}function av(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[(0,ai.tb)(b,a.title),"",...c.flatMap((a,c)=>[` ${function(a,b,c){let d=(0,ai.GQ)(c);return!function(a){let b=/^\s*(\d+)\.(\d+)[..、]?\s+(.+)$/u.exec(a);return!!b&&(0,ai.GQ)(b[3]||"").trim()===(0,ai.GQ)(a).trim()}(c)?`${a+1}.${b+1} ${d}`:d}(b,c,a)}`,""])]})].join("\n")}function aw(a){let b=!1;return a.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+)/gmu,a=>b?"":(b=!0,a)).replace(/\n{3,}/gu,"\n\n").trim()}function ax(a,b){let c=aw(a);b.forEach((a,b)=>{let d=(0,ai.GQ)(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${ay(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${(0,ai.tb)(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0,g=0,h="",i=new Set,j=a=>{let c=b[e]?.sections||[],d=az(a);return c.findIndex(a=>az(a)===d)},k=(a,c)=>{let d=(0,ai.GQ)(a),k=j(d),l=b[e]?.sections||[];if(l.length>0&&k<0)return f||(f=1,h=`${e+1}.1`),(g+=1)<=4?`#### ${e+1}.${f}.${g} ${d}`:`**${d}**`;let m=k>=0?k+1:f+1,n=k>=0?az(l[k]):az(d);return i.has(n)?(f=m,h=c||`${e+1}.${f}`,g+=1,`#### ${e+1}.${f}.${g} ${d}`):(f=m,g=0,h=c||`${e+1}.${f}`,i.add(n),`### ${e+1}.${f} ${k>=0?(0,ai.GQ)(l[k]):d}`)};return d.map(a=>{let c=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(c))return e+=1,f=0,g=0,h="",i=new Set,a;let d=/^##\s+\d+[..、]\s+(.+)$/u.exec(c);if(e>=0&&d)return k(d[1]||"");let l=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(c);if(e>=0&&l)return k(l[3]||"",`${l[1]}.${l[2]}`);let m=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&m)return k(m[3]||"",m[1]&&m[2]?`${m[1]}.${m[2]}`:void 0);let n=/^####\s+(\d+)\.(\d+)(?!\.)\s+(.+)$/u.exec(c);if(e>=0&&n)return k(n[3]||"",`${n[1]}.${n[2]}`);let o=/^####\s+(?:(\d+)\.(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&o){let a=o[1]&&o[2]?`${o[1]}.${o[2]}`:h,c=(0,ai.GQ)(o[4]||""),d=az(c),l=j(c)>=0&&!i.has(d);return!f||a&&a!==h&&(0===(b[e]?.sections||[]).length||l)?k(c,a):(g+=1)<=4?`#### ${e+1}.${f}.${g} ${c}`:`**${c}**`}return a}).join("\n")}function ay(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function az(a){return(0,ai.GQ)(a.replace(/^\s*\d+(?:\.\d+)*(?:[..、]|\s)+/u,"")).replace(/[\s::.。]+$/gu,"").trim()}function aA(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=(0,ai.YZ)(b),d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>({index:a.index||0,raw:a[0],title:(0,ai.YZ)(a[1]||"")})),e=d.find(a=>a.title===c);if(!e)return;let f=d.find(a=>a.index>e.index&&a.title!==c),g=e.index+e.raw.length,h=f?.index??a.length;return{start:e.index,end:h,heading:e.raw,body:a.slice(g,h)}}(a,d.title);if(!b){c.push({level:"error",message:`${d.title} 正文缺少章节标题`,suggestion:"请重新生成,确保模板章节完整输出。"});continue}let e=b.heading+b.body,f=(d.sections||[]).filter(a=>!function(a,b){let c=az(b);return a.split(/\r?\n/u).some(a=>{let b=/^#{2,4}\s+(.+)$/u.exec(a.trim());return!!b&&az(b[1]||"")===c})}(e,a));f.length>0&&c.push({level:"error",message:`${d.title} 正文缺少规划小节:${f.join("、")}`,suggestion:"请重新生成或检查审查阶段是否删除了二级小节。"}),d.tableSections?.length&&!/\|[^\n]+\|\s*\n\s*\|\s*:?-{3,}:?\s*\|/u.test(e)&&c.push({level:"error",message:`${d.title} 缺少必要的正式表格`,suggestion:"请按模板 tableSections/tableRequirements 在对应小节补充正式 Markdown 表格。"})}return c}function aB(a){let b=[...a.matchAll(/^##\s+.+$/gmu)];if(0===b.length)return a;let c=a.slice(0,b[0].index||0);for(let d=0;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f),h=[...g.matchAll(/^###\s+(\d+)\.(\d+)\s+.+$/gmu)];if(h.length<2){c+=g;continue}let i=h[0].index||0;c+=g.slice(0,i)+h.map((a,b)=>{let c=a.index||0,d=h[b+1]?.index??g.length;return{order:Number(a[2]||b+1),content:g.slice(c,d).trim()}}).sort((a,b)=>a.order-b.order).map(a=>a.content).join("\n\n")+"\n\n"}return c.replace(/\n{3,}/gu,"\n\n").trim()}function aC(a,b,c={}){let d=aB(at(an(aj(a,!!c.forbidDrawingImages)))),e=function(a,b){let c=ax(aw(a),b),d=[...c.matchAll(/^##\s+(.+)$/gmu)];return b.map((a,e)=>{let f=(0,ai.tb)(e,a.title),g=d.find(a=>ar(a[1]||"",f));if(!g||void 0===g.index)return a.sections||[];let h=d.find(a=>(a.index||0)>(g.index||0)&&b.some(b=>ar(a[1]||"",b.title))),i=a.sections||[];if(i.length>0)return i;let j=as(c.slice(g.index,h?.index??c.length));return j.length>0?j.slice(0,6):[]})}(d,b),f=b.map((a,b)=>({...a,sections:e[b]?.length?e[b]:a.sections||[]}));return{markdown:aB(at(an(function(a,b){let c=ax(a,b),d=av(b);if(/^##\s+目录\s*$/mu.test(c))return c.replace(/^##\s+目录\s*$[\s\S]*?(?=\n<div class="page-break"><\/div>|\n##\s+)/mu,d.trim());let e='<div class="page-break"></div>',f=c.indexOf(e);if(f>=0){let a=f+e.length;return`${c.slice(0,a)}
|
|
35
|
+
|
|
36
|
+
${d}
|
|
37
|
+
|
|
38
|
+
${e}
|
|
39
|
+
|
|
40
|
+
${c.slice(a).trimStart()}`}return`${d}
|
|
41
|
+
|
|
42
|
+
<div class="page-break"></div>
|
|
43
|
+
|
|
44
|
+
${c}`}(d,f)))),chapters:f}}function aD(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${(0,ai.tb)(b,a.title)}`,d=an(a.content);var e=/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
|
|
45
|
+
|
|
46
|
+
${d}`,f=a.title;let g=e.split(/\r?\n/u),h=!1;return g.filter((a,b)=>{let d=a.trim(),e=/^##\s+(.+)$/u.exec(a.trim())?.[1]||"";if(e){if(ar(e,c))return!h&&(h=!0,!0);if(b>0&&ar(e,f))return!1}return!(d&&!/^#{1,6}\s+/u.test(d)&&ar(d,f))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()})(a,b)).filter(Boolean).join("\n\n");return aC(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',av(a.chapters),'\n<div class="page-break"></div>\n',b].join("\n"),a.chapters).markdown}var aE=c(78217),aF=c(23760),aG=c(73024),aH=c(15751),aI=c(95393),aJ=c(96770),aK=c(29281);function aL(a){return(0,j.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function aM(a){return Array.isArray(a)?a.map(a=>String(a||"").trim()).filter(Boolean):"string"==typeof a&&a.trim()?[a.trim()]:[]}function aN(a){return Array.isArray(a)?a.filter(a=>a&&"object"==typeof a):a&&"object"==typeof a?[a]:[]}function aO(a,b){return a.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/giu,"-").replace(/^-|-$/gu,"").slice(0,48)||b}function aP(a){if(null==a)return"";if("string"==typeof a)return a;if("number"==typeof a||"boolean"==typeof a)return String(a);try{return JSON.stringify(a)}catch{return String(a)}}function aQ(a){if(a?.aborted)throw Error("用户中止")}let aR=new Map,aS=0;function aT(){let a=process.env.DOCUMENT_LLM_CONCURRENCY;if(!a?.trim())return;let b=Number(a);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}let aU=aT(),aV=0,aW=[];function aX(){return aU??0}function aY(a,b){let c=(0,aJ.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function aZ(){let a=(0,aK.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}function a$(a,b){let c=aT(),d=aU;if(void 0===c||void 0===aU){aV=a?0:aV+1,b&&(b.llm.currentLimit=0);return}a?(aV=0,0===aW.length&&aU<c&&(aU+=1)):(aV+=1)>=2&&(aU=Math.max(1,aU-1)),b&&(b.llm.currentLimit=aU,d!==aU&&(b.llm.limitAdjustments+=1))}async function a_(a,b,c){for(;void 0!==aU&&aS>=aU;){let a=Date.now();if(c&&(c.llm.throttledWaits+=1),b?.aborted)throw Error("用户中止");await new Promise((a,c)=>{let d={resolve:a,reject:c,active:!0,signal:b};d.onAbort=()=>{if(!d.active)return;d.active=!1;let a=aW.indexOf(d);a>=0&&aW.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),aW.push(d)}),c&&(c.llm.throttledWaitMs+=Date.now()-a)}aS+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,aS));try{let b=await a();return a$(!0,c),b}catch(a){throw a$(!1,c),a}finally{for(aS=Math.max(0,aS-1);aW.length>0;){let a=aW.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function a0(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=aZ();if(!e)return;let{model:f,provider:g}=e,h=aL({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?aL(g.apiKey):""}),i=aR.get(h);i||(i=(0,aI.createProvider)(aY(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aR.set(h,i));let j=Math.max(3e4,Number(d.timeoutMs??process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await a_(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),j)}),h=[i.chat([{role:"system",content:c?`${a}
|
|
47
|
+
只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal}),g];return d.signal&&h.push(new Promise((a,b)=>{if(d.signal?.aborted)return void b(Error("用户中止"));f=()=>b(Error("用户中止")),d.signal?.addEventListener("abort",f,{once:!0})})),Promise.race(h).finally(()=>{e&&clearTimeout(e),f&&d.signal?.removeEventListener("abort",f)})},d.signal,d.diagnostics)).content.trim()}catch(a){if(d.diagnostics&&(d.diagnostics.llm.failures+=1),d.signal?.aborted)throw Error("用户中止",{cause:a});return}}async function a1(a,b,c){let d,e=new AbortController;if(c?.aborted)throw Error("用户中止");let f=()=>e.abort();c?.addEventListener("abort",f,{once:!0});let g=new Promise(a=>{d=setTimeout(()=>{e.abort(),a(null)},b)}),h=[Promise.resolve().then(()=>a(e.signal)),g];c&&h.push(new Promise((a,b)=>{e.signal.addEventListener("abort",()=>{c.aborted&&b(Error("用户中止"))},{once:!0})}));try{let a=await Promise.race(h);if(c?.aborted)throw Error("用户中止");return a}finally{d&&clearTimeout(d),c?.removeEventListener("abort",f)}}async function a2(a,b,c={}){let d=await a0(a,b,!0,{maxTokens:c.maxTokens,temperature:c.temperature,signal:c.signal,diagnostics:c.diagnostics,timeoutMs:c.timeoutMs});if(d)try{return JSON.parse(function(a){let b=a.trim(),c=b.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/iu)?.[1]?.trim();if(c)return c;let d=b.indexOf("{"),e=b.lastIndexOf("}"),f=b.indexOf("["),g=b.lastIndexOf("]"),h=d>=0&&e>d?b.slice(d,e+1):"",i=f>=0&&g>f?b.slice(f,g+1):"";return h&&(!i||d<=f)?h:i||b}(d))}catch{return}}async function a3(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_CHARS??45e3))),h=Math.max(8,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_ITEMS??48))),i=0,j=[];for(let b of a.slice(0,h)){let a=aP(b.content).replace(/\s+/gu," ").slice(0,Math.max(800,Math.floor(g/h))),c=`文件:${b.filePath}
|
|
48
|
+
角色:${b.roleId||""}
|
|
49
|
+
处理:${b.processingType||""}
|
|
50
|
+
内容:${a}`;if(j.length>0&&i+c.length>g)break;i+=c.length,j.push(c)}let k=j.join("\n\n---\n\n");if(!k.trim())return{facts:[],stages:f};aQ(e);let l=(0,Y.Uy)(c,d),m=l.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),n=await a2(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
|
|
51
|
+
返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"reference","confidence":0.8}]}。
|
|
52
|
+
|
|
53
|
+
动态事实 schema:
|
|
54
|
+
${m}
|
|
55
|
+
|
|
56
|
+
资料:
|
|
57
|
+
${k}`,{signal:e});return(aQ(e),n?.facts?.length)?{facts:n.facts.filter(a=>a.key&&a.value).map(a=>{let b=l.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:aP(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${n.facts.length} 条事实`}]}:{facts:[],stages:f}}let a4=/(?:\b[A-Z]{1,8}[\w./-]*\d[\w./-]*\b|\b\d+(?:\.\d+)?\s*(?:mm|cm|m|km|㎡|m²|m3|m³|kg|g|t|L|ml|MPa|kPa|℃|%|台|套|个|项|批|次|份|人|小时|分钟|天|周|月|年)\b|\b\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\b|\b(?:GB|GB\/T|ISO|IEC|IEEE|RFC|API|DB\d*|T\/[A-Z]+)\s*[\w.-]+\b)/giu;function a5(a){return a?({"knowledge-base":"知识库","document-readiness":"生成准备度检查","quality-repair":"质量补写","export-gate":"导出门禁","context-memory":"上下文","final-format":"正式排版","multimodal-files":"多模态文件理解","llm-json":"LLM 事实抽取","llm-review":"LLM 审查","document-workflow":"最终规范校验"})[a]:void 0}function a6(a,b={}){let c={executionVersion:2,title:{role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",context_recall:"上下文召回",file_understanding:"文件角色读取",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",asset_generation:"生成资源处理",llm_review:"LLM 审查优化",validation:"内容优化与质量校验",formatting:"正式排版整理",export_ready:"导出就绪检查",reference:"资料增强"}[a.type],group:a.type,...a,...b};return{...c,roleName:c.roleName||a5(c.roleId),subtitle:c.subtitle||c.roleName||a5(c.roleId)}}function a7(a,b){let c=a.findIndex(a=>a.type===b.type&&a.roleId===b.roleId&&a.promptId===b.promptId);return c>=0?(a[c]={...b,order:a[c]?.order??b.order},c):(a.push(b),a.length-1)}function a8(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}var a9=c(47899);async function ba(a,b,c,d){let e=Date.now();try{return await c()}finally{let c=Date.now();a.metrics.push({name:b,startedAt:e,endedAt:c,durationMs:c-e,meta:d})}}function bb(a){return a.toLowerCase()}function bc(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}function bd(a){let b=[];for(let c of a)a9.ee.lastIndex=0,a9.ee.test(c)&&b.push(c);return b}function be(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function bf(a,b,c,e){let f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=ah({chapterId:b.id,textEvidence:c,resources:[],byKind:{map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]},summary:""},{maxChars:ae(1800,8e3,Math.max(14e3,3500*aX()))}),h=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
|
|
58
|
+
节点类型:${b.outputType}
|
|
59
|
+
文件角色:${b.fileRoleName}(${b.fileRoleId})
|
|
60
|
+
要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。提示词角色只提供规则和格式约束,其中的示例、样例、占位项目名、编号、日期、数量和示例正文不得作为事实抽取来源。
|
|
61
|
+
|
|
62
|
+
请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 必须只来自下面的绑定文件片段,优先抽取对象、范围、区域、阶段、数量、日期、周期、规格、单位、资源数量、检查频次和来源口径;同类对象不得合并丢失,计量单位保持原文含义,必要时使用导出友好的正式写法。
|
|
63
|
+
|
|
64
|
+
绑定文件片段:
|
|
65
|
+
${g}`,i=[];aQ(e);let j=g.trim()?await a2(f,h,{signal:e}):void 0;if(aQ(e),be(j)){i.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await a2("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
|
|
66
|
+
|
|
67
|
+
原始 JSON:
|
|
68
|
+
${JSON.stringify(j)}`,{signal:e});a&&!be(a)?j=a:i.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let k=aN(j?.chapters),l=aN(j?.facts),m=[];k.forEach((b,c)=>{let e="string"==typeof b.title?(0,ai.YZ)(b.title):"";!e||!(0,ai.bE)(b.title||e)||(0,d.DX)(e,a)||m.push({id:aO(e,`chapter-${c+1}`),title:e,order:c,sourceRequirement:b.sourceRequirement||e,requiredContents:aM(b.requiredContents),writingRules:aM(b.writingRules),evidenceNeeds:aM(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:aN(b.requirements).map((a,b)=>({id:aO(`${e}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:aM(a.requiredContents),writingRules:aM(a.writingRules),evidenceNeeds:aM(a.evidenceNeeds),preferredSourceRoleIds:aM(a.preferredSourceRoleIds)}))})});let n=[],o=new Set(c.map(a=>a.filePath));l.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&o.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&o.has(e)&&n.push({key:d,value:$(aP(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:aM(a.relatedChapterHints)})});let p=m.length>0?[]:function(a,b,c){if("template_requirements"!==b.outputType)return[];let e=[],f=new Set;for(let b of c)for(let c of b.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!RegExp(`^(?:第(?:\\d{1,3}|${X.$m})[章节]|[((]?(?:\\d{1,3}|${X.$m})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let g=(0,ai.YZ)(c);!(0,ai.bE)(c)||f.has(g)||(0,d.DX)(g,a)||(f.add(g),e.push({id:aO(g,`chapter-${e.length+1}`),title:g,order:e.length,sourceRequirement:b.content.replace(/\s+/gu," "),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}))}return e}(a,b,c),q=n.length>0?[]:function(a,b){let c=[];for(let d of b){let b=d.content.replace(/\s+/gu," ");b.length<=20||c.push({key:`${a.fileRoleName}事实${c.length+1}`,value:b,sourceFile:d.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:d.sectionTitle?[d.sectionTitle]:[]})}return c}(b,c);return 0===m.length&&p.length>0&&i.push(`${b.fileRoleName} 结构化章节读取不足,已补充使用证据标题兜底。`),0===n.length&&q.length>0&&i.push(`${b.fileRoleName} 结构化事实读取不足,已补充使用证据片段兜底。`),{node:b,evidence:aa(c,void 0),chapters:m.length>0?m:p,facts:n.length>0?n:q,outputRequirements:aM(j?.outputRequirements),warnings:[...i,...aM(j?.warnings)],forbidImageInsertion:j?.forbidImageInsertion??"drawing_facts"===b.outputType}}function bg(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}function bh(a,b,c){let d=function(a,b){let c=[a.title];for(let b of a.requiredFacts||[])b&&c.push(b);for(let a of b?.requiredContents||[])a&&c.push(a);for(let a of b?.evidenceNeeds||[])a&&c.push(a);for(let a of b?.requirements||[]){for(let b of(a.title&&c.push(a.title),a.requiredContents))b&&c.push(b);for(let b of a.evidenceNeeds)b&&c.push(b)}return c}(b,c),e=[],f=Math.max(40,Math.min(120,Number(process.env.DOCUMENT_ROLE_FACTS_PER_CHAPTER??80)));for(let b of a)for(let a of b.facts)if(function(a,b){if(0===b.length)return!0;let c=`${a.key}
|
|
69
|
+
${aP(a.value)}
|
|
70
|
+
${a.relatedChapterHints.join("\n")}`;for(let d of b)if(c.includes(d)||d.includes(a.key))return!0;return!1}(a,d)&&(e.push({artifact:b,fact:a}),e.length>=f))return e;return e}function bi(a,b,c){let d=bh(a,b,c),e=c?[`章节来源要求:${c.sourceRequirement}`,c.requiredContents.length?`必须包含:${c.requiredContents.join("、")}`:"",c.writingRules.length?`写作规范:${c.writingRules.join("、")}`:"",c.evidenceNeeds.length?`需要证据:${c.evidenceNeeds.join("、")}`:"",c.requirements.length?`要求项:
|
|
71
|
+
${c.requirements.map(a=>`- ${a.title}:${a.requirementText||a.requiredContents.join("、")}`).join("\n")}`:""].filter(Boolean).join("\n"):"",f=new Map;for(let{artifact:a,fact:b}of d){let c=`${a.node.fileRoleName}(${a.node.outputType})`;f.set(c,[...f.get(c)||[],`- ${b.key}:${$(aP(b.value))}`])}let g=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_FACT_LINES_PER_GROUP??18))),h=[...f.entries()].map(([a,b])=>`### ${a}
|
|
72
|
+
${b.slice(0,g).map(a=>a.replace(X.tK,"").replace(X.VX,"").slice(0,320)).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
|
|
73
|
+
${e}`:"",h?`【角色节点结构化产物】
|
|
74
|
+
${h}`:""].filter(Boolean).join("\n\n")}function bj(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function bk(a){return a9.MG.lastIndex=0,a9.MG.test(a)}function bl(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),(0,aF.AC)(a.content,[{id:a.chapter.id,title:a.chapter.title,content:a.content,evidence:[],sections:a.chapter.sections||[],missingFacts:[]}])))b.push(c.message);for(let c of a.chapter.sections||[]){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*[..、]?\\s+)?${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|^##\\s+|$)`,"mu"));e?180>(0,aE.V7)(e[1])&&b.push(`规划小节正文过短:${c}`):b.push(`缺少规划小节:${c}`)}for(let c of((0,aE.V7)(a.content)<Math.floor(.85*a.targetWords)&&b.push("正文篇幅明显低于目标"),ak.lastIndex=0,(ak.test(a.content)||/知识库|检索|角色节点|事实字段|校验结果/u.test(a.content))&&b.push("正文包含后台流程话术"),/资料未提供|满足相关要求|结合实际情况|根据实际情况|视情况|待明确|待确认/u.test(a.content)&&b.push("正文存在空泛占位表达"),a.missingFacts.slice(0,8)))c&&!a.content.includes(c)&&b.push(`requiredFacts 未明显覆盖:${c}`);return[...new Set(b)].slice(0,12)}async function bm(a){aQ(a.signal);let b=a.repairType||function(a){let b=a.join("\n");for(let a of a9.NP)if(a.pattern.lastIndex=0,a.pattern.test(b))return a.type;return"generic"}(a.issues),c=await a2(["你是章节局部修复专家。只返回 JSON patch,不返回完整章节,不重写无问题内容。",a9._$[b]||a9._$.generic,ao,a.forbidDrawingImages?"图片类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","每个 patch 必须能通过 originalText 或 targetStart/targetEnd 在原章节中唯一定位;replacement 只替换该局部片段。","禁止新增证据摘要中没有的信息;无法安全定位的问题不要生成 patch。",'返回 JSON:{"patches":[{"originalText":"原局部文本","targetStart":"定位起始文本","targetEnd":"定位结束文本","replacement":"替换后的局部文本","reason":"修复原因"}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
|
|
75
|
+
${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
|
|
76
|
+
${ah(ad({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence),{maxChars:ae((0,aE.V7)(a.chapter.content),5e3,14e3)})}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});aQ(a.signal);let d=a.chapter.content,e=0;for(let b of Array.isArray(c?.patches)?c.patches:[]){let c=function(a){var b;let c=a.patch.replacement?.trim(),d=(b=a.content,Math.max(2600,Math.min(16e3,Math.ceil(.45*(0,aE.V7)(b)))));if(!c||c.length>d||a.forbidDrawingImages&&/!\[[^\]]*\]\([^)]*\)/iu.test(c))return{content:a.content,applied:!1};let e=function(a,b){let c=b.originalText?.trim();if(c&&a.indexOf(c)===a.lastIndexOf(c))return c;let d=b.targetStart?.trim(),e=b.targetEnd?.trim();if(!d||!e)return;let f=a.indexOf(d),g=a.indexOf(e,f+d.length);if(f<0||g<0)return;let h=g+e.length,i=a.slice(f,h);return a.indexOf(i)===a.lastIndexOf(i)?i:void 0}(a.content,a.patch);if(!e||e.length>d)return{content:a.content,applied:!1};let f=an(aj(a.content.replace(e,c),a.forbidDrawingImages));return!function(a,b){let c=(a.match(/```/gu)||[]).length,d=b.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").trim();return c%2==0&&(!d||a.includes(d))&&!/^\s*$/u.test(a)}(f,a.title)||(0,aE.V7)(f)<Math.floor(.65*(0,aE.V7)(a.content))?{content:a.content,applied:!1}:{content:f,applied:f!==a.content}}({content:d,patch:b,title:a.chapter.title,forbidDrawingImages:a.forbidDrawingImages});d=c.content,c.applied&&(e+=1)}return{content:d,appliedCount:e,repairType:b}}async function bn(a){let b=a.issues.filter(a=>"minor"!==(0,aF.z0)(a)).filter(bk);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=a.chapters.map(a=>({chapter:a,issues:function(a,b){let c=b.filter(bk),d=new Set(a.sections||[]),e=`${a.title}
|
|
77
|
+
${a.sections?.join("\n")||""}
|
|
78
|
+
${a.content.slice(0,8e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||m\s*[²2]|mm2|cm2|km2/u.test(e)).slice(0,6)}(a,b)})).filter(a=>a.issues.length>0);if(0===c.length)return{markdown:a.markdown,chapters:a.chapters,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已完成质量检查,未定位到可安全局部修复的阻断问题:共 ${b.length} 个;${b.slice(0,8).join(";")}`}};let d=Number(process.env.DOCUMENT_REPAIR_CONCURRENCY??a.strategy?.maxChapterReviewConcurrency??c.length),e=Math.max(1,Math.min((a.strategy?.maxChapterReviewConcurrency??c.length)||1,Number.isFinite(d)?Math.floor(d):c.length||1)),f=new Map,g=0;for(let b=0;b<c.length;b+=e){aQ(a.signal);let d=c.slice(b,b+e);(await Promise.all(d.map(async b=>bm({template:a.template,chapter:b.chapter,issues:b.issues,promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,diagnostics:a.diagnostics,signal:a.signal})))).forEach((a,b)=>{f.set(d[b].chapter.id,a.content),g+=a.appliedCount})}let h=0,i=a.chapters.map(a=>{let b=f.get(a.id);return b&&b!==a.content?(h+=1,{...a,content:b}):a}),j=h>0?`已应用 ${g} 个局部质量 patch,修复 ${h} 个章节;未进行整章或全文重写`:`已完成质量检查,未生成可唯一定位且通过校验的局部 patch:共 ${b.length} 个;${b.slice(0,8).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function bo(a,b){let c=e.isAbsolute(b)?b:e.join(a,b),d=e.isAbsolute(b)?e.relative(a,b):b;return[b,c,d,e.join(a,d)]}function bp(a,b,c){return function(a,b){let c=e.resolve(a),d=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let d=e.resolve(c,"knowledgeBase",b);return aG.existsSync(d)?d:e.resolve(c,b)}(c,b);return d===c||d.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&bo(a,b).some(a=>c.has(a))}function bq(a,b){return new Set(b.flatMap(b=>bo(a,b.filePath)))}function br(a){let b=a.replace(/```[\s\S]*?```/gu,"\n【示例代码块已省略:仅作为格式参考,不作为当前文档事实】\n").split(/\r?\n/u),c=[],d=!1,e=!1;for(let a of b){let b=a.trim();if((0,ai.bl)(b)&&(e=!0),e){c.push(a),(0,ai.Ui)(b)&&(e=!1);continue}let f=/^(?:#+\s*)?(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?/iu.test(b),g=/(?:不得|禁止|必须|应当|要求|规则|格式|输出|保留|只返回|不要)/u.test(b);if(f&&!g){c.at(-1)?.includes("示例内容已省略")||c.push("【示例内容已省略:仅作为格式参考,不作为当前文档事实】"),d=!0;continue}if(d){if(!b){d=!1;continue}if(!/^(?:#+\s*)?(?:规则|要求|输出|格式|禁止|注意|正文|章节|风格|校验)/u.test(b))continue;d=!1}c.push(a)}return c.join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function bs(a,b){let c=function(){let a=new Map;for(let b of["fact_extraction","chapter_generation","llm_review","validation","formatting","reference"])a.set(b,b);for(let b of(0,i.XB)("prompt"))a.set(b.id,b.executionType||"reference");return a}(),e=new Set(b),f=[];for(let b of(0,d.dU)(a))e.has(c.get(b.roleId)||"reference")&&f.push(`## [${b.roleId}] ${b.name}
|
|
79
|
+
${br(b.content)}`);return f.join("\n\n")}function bt(a,b){let c=a.trim();if(!c)return[];let d=Math.max(1e3,Math.ceil(b)),e=[];for(let a=0;a<c.length;a+=d)e.push(c.slice(a,a+d));return e}function bu(a,b,c){return c<=1?a:`【片段 ${b+1}/${c}】
|
|
80
|
+
${a}`}function bv(a,b=1800){let c=(a.sections||[]).filter(Boolean).join("、")||"未规划小节",d=a.content.replace(/```[\s\S]*?```/gu," ").replace(/[#>*_`\-|]+/gu," ").replace(/\s+/gu," ").trim(),e=Math.max(800,b-500),f=Math.max(600,Math.floor(.7*e)),g=Math.max(200,e-f),h=d.slice(0,f),i=d.length>f+g?d.slice(-g):"",j=Math.max(120,Math.floor((b-h.length-i.length)/4)),k=a.evidence.slice(0,4).map(a=>`${a.filePath||a.roleId||"证据"}: ${$(a.content||"").slice(0,j)}`).join("\n"),l=a.missingFacts.length?`未覆盖事实:${a.missingFacts.slice(0,12).join("、")}`:"未覆盖事实:无";return[`章节:${a.title}`,`字数:${(0,aE.V7)(a.content)}`,`小节:${c}`,l,k?`证据摘要:
|
|
81
|
+
${k}`:"",`正文摘要:${h}${i?`
|
|
82
|
+
尾部摘要:${i}`:""}`].filter(Boolean).join("\n").slice(0,b)}function bw(a){if(!a)return;let b=a.replace(/^```(?:json)?\s*/u,"").replace(/```$/u,"").trim();try{return JSON.parse(b)}catch{let a=b.match(/\{[\s\S]*\}/u);if(!a)return;try{return JSON.parse(a[0])}catch{return}}}function bx(a){if("string"==typeof a)return a.trim();if(!a||"object"!=typeof a)return"";let b="string"==typeof a.message?a.message.trim():"",c="string"==typeof a.suggestion?a.suggestion.trim():"",d="string"==typeof a.location?a.location.trim():"",e="string"==typeof a.type?a.type.trim():"";return["string"==typeof a.severity?a.severity.trim():"",d||e,b,c].filter(Boolean).join(":").trim()}function by(a){return[...new Set(a.map(bx).filter(Boolean))]}function bz(a){let b=Number(process.env[a]);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}function bA(a){let b=Math.max(1,Math.ceil(Math.max(0,a.totalChars)/Math.max(1e3,a.chunkChars))),c=Math.max(1,a.chapterCount),d=Math.max(1,Math.ceil(a.totalChars/24e3));return"chapter"===a.phase?{chunks:bz("DOCUMENT_CHAPTER_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(2,Math.ceil(.75*b))),issues:bz("DOCUMENT_CHAPTER_REVIEW_MAX_ISSUES")??Math.max(8,Math.ceil(8*d)),ms:Math.max(6e4,Number(process.env.DOCUMENT_CHAPTER_REVIEW_MAX_MS??Math.min(72e4,Math.max(18e4,9e4*d))))}:"global"===a.phase?{chunks:bz("DOCUMENT_GLOBAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.65*b))),issues:bz("DOCUMENT_GLOBAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(120,8*c+10*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_GLOBAL_REVIEW_MAX_MS??Math.min(108e4,Math.max(24e4,12e4*d))))}:{chunks:bz("DOCUMENT_FINAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.8*b))),issues:bz("DOCUMENT_FINAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(140,10*c+12*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_FINAL_REVIEW_MAX_MS??Math.min(12e5,Math.max(3e5,15e4*d))))}}async function bB(a,b,c){let d=aZ();if(!d?.provider.capabilities?.fileUnderstanding&&!d?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};aQ(c);let f=(0,aI.createProvider)(aY(d.model.provider,d.provider),{baseUrl:d.provider.baseUrl,apiKey:d.provider.apiKey,modelName:d.model.name,directEndpoint:d.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=Math.max(1,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_FILES??4))),h=Math.max(131072,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_BYTES??8388608))),i=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,g),j=[],k=i.map(b=>{let c=e.join(a,"knowledgeBase",b);return aG.existsSync(c)?aG.statSync(c).size>h?void j.push(e.basename(b)):{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:aG.readFileSync(c)}:void 0}).filter(Boolean);if(0===k.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:j.length?`参考文件过大,已跳过 ${j.length} 个多模态文件理解`:"没有可发送给多模态模型的参考文件"}};try{aQ(c);let a=await a1(a=>f.understandFiles(k,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:a}),Math.max(3e4,Math.min(9e4,Number(process.env.DOCUMENT_FILE_UNDERSTANDING_TIMEOUT_MS??6e4))),c);aQ(c);let b=a?.content.trim()||"";return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${k.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bC(a,b,c,d,e,f,g,h="",i={}){let j=ah(ad(b,c),{maxChars:ae(i.targetWords||i.minWords)});if(!j.trim()&&!h.trim())return;let k=b.sections?.length?`本章小节由生成前规划得到,请完整包含并展开以下小节:
|
|
83
|
+
${b.sections.map(a=>`- ${a}`).join("\n")}`:"本章没有预设小节;请按用户提示词、模板章节、角色要求和绑定材料自然组织正文。",l=function(a,b){let c=bD(a,b);return 0===c.length?"":["本章小节篇幅计划(首轮生成应尽量一次达成,避免后续补写):",...c.map(a=>`- ${a.title}:约 ${a.targetWords} 字,至少达到 ${Math.floor(.8*a.targetWords)} 字,并写入与该小节相关的材料事实、适用边界和必要说明。`)].join("\n")}(b,i.targetWords||i.minWords||0),m=[ao,i.forbidDrawingImages?"图片类材料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"",e].filter(Boolean).join("\n\n"),n=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,k,l,g?`用户要求:${g}`:"",f?`上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
84
|
+
${f}`:"",h||"",i.factCoverageContext||"",d.length?`需要特别补足的信息:${d.join("、")}`:"","请生成可直接导出的 Markdown 章节,要求:",`- 保留章节标题;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}${i.maxWords?`,最多不超过 ${i.maxWords} 字`:""}。`,b.sections?.length?"- 必须完整包含已规划小节;不要新增未规划的二级小节。":"- 未预设小节时,不要为了凑结构强行新增小节。",b.tableSections?.length?`- 以下小节可使用表格辅助表达:${b.tableSections.join("、")}。`:"","- 内容必须遵循用户提示词、模板章节、提示词角色、文件角色和绑定材料;不得编造材料未提供的事实。","- 将材料要点自然融入正文;不要输出系统证据清单、中间分析过程或后台流程话术。",ap,"",j?"绑定材料:":"",j].filter(Boolean).join("\n"),o=await a0(m,n,!1,{maxTokens:i.maxTokens,signal:i.signal});if(o&&!(o.length<120))return an(aj(o.startsWith("## ")?o:`## ${b.title}
|
|
85
|
+
|
|
86
|
+
${o}`,!!i.forbidDrawingImages))}function bD(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.floor(b/c.length),e=Math.max(b>=700*c.length?700:Math.max(280,Math.floor(.85*d)),d);return c.map(a=>({title:a,targetWords:e}))}function bE(a,b,c){let d=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))],e=c.map((b,c)=>{let e=`${b.sectionTitle||""}
|
|
87
|
+
${b.content}`.toLowerCase(),f=d.reduce((a,b)=>a+ +!!e.includes(b),0),g=b.sectionTitle&&a.includes(b.sectionTitle)||b.sectionTitle&&b.sectionTitle.includes(a)?4:0;return{item:b,score:f+g+.1*b.score-.001*c}}).sort((a,b)=>b.score-a.score).filter(a=>a.score>0).map(a=>a.item);return e.length>0?e:c}function bF(a){return(0,ai.GQ)(a).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分、..\s-]*/u,"").replace(/^\d+(?:\.\d+)*(?:[..、]|\s)+/u,"").replace(/[::。;;,.,]+$/gu,"").trim()}async function bG(a){let b=ah(ad(a.chapter,a.evidence),{maxChars:ae(a.targetWords,5e3,12e3)}),c=await a2("你是专业文档结构规划专家。\n只根据用户提示词、章节标题和真实绑定资料规划本章二级小节;不得使用“目标与范围、资料依据、实施内容、质量控制”等通用占位小节凑数。\n只返回 JSON。",[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`章节目的:${a.chapter.purpose}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
|
|
88
|
+
${a.projectContext}`:"",a.roleContext,a.promptTexts?`提示词角色要求:
|
|
89
|
+
${a.promptTexts}`:"",b?`真实绑定资料:
|
|
90
|
+
${b}`:"","请输出 2-5 个适合直接成稿的二级小节标题。标题必须具体、业务相关、能承载真实资料;如果章节本身已经是单一主题,只拆成必要工作面/技术点/管理点,不要为了凑结构增加小节。",'JSON 格式:{"sections":["小节标题1","小节标题2"]}'].filter(Boolean).join("\n\n"),{maxTokens:1200,temperature:.1,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:12e4}),d=/^(?:目标与范围|资料依据|实施内容|质量控制|概述|总体要求)$/u;return Array.from(new Set((c?.sections||[]).map(bF).filter(a=>a.length>=4&&a.length<=60).filter(b=>b!==bF(a.chapter.title)).filter(a=>!d.test(a)))).slice(0,5)}async function bH(a){let b=bE(a.sectionTitle,a.chapter,a.evidence),c=ah(ad(a.chapter,b),{maxChars:ae(a.targetWords,3500,9e3)}),d=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
|
|
91
|
+
${a.projectContext}`:"",a.factCoverageContext||"",a.roleContext,a.missingFacts.length?`需要特别补足的信息:${a.missingFacts.join("、")}`:"",a.qualityFeedback?`上轮小节未通过质量检查,必须修正:${a.qualityFeedback}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,ap,c?`绑定材料:
|
|
92
|
+
${c}`:""].filter(Boolean).join("\n\n"),e=()=>a0(["你是专业文档的小节生成专家。",ao,a.promptTexts].filter(Boolean).join("\n\n"),d,!1,{maxTokens:bM(a.targetWords),temperature:.25,signal:a.signal}),f=()=>a1(e,a.timeoutMs,a.signal),g=a.timeoutMs?await (a.diagnostics?ba(a.diagnostics,`section-draft:${a.chapter.id}:${a.sectionTitle}`,f):f()):await e();if(g&&!(g.length<80))return an(aj(g.startsWith("### ")?g:`### ${a.sectionTitle}
|
|
93
|
+
|
|
94
|
+
${g}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}function bI(a){return a.replace(/^#{3,4}\s+.*\n+/u,"").trim()}async function bJ(a){let b=(0,aE.V7)(a.currentContent),c=a.targetWords-b;if(c<=Math.max(260,Math.floor(.12*a.targetWords)))return a.currentContent;let d=bE(a.sectionTitle,a.chapter,a.evidence),e=ah(ad(a.chapter,d),{maxChars:ae(Math.min(a.targetWords,2600),3500,9e3)}),f=Math.min(Math.max(500,c),Math.max(900,Math.floor(.45*a.targetWords))),g=an(aj(await a1(c=>a0(["你是专业文档小节补写专家。只做补写,不重写全文。",ao,"必须保留已有正文中的事实、参数、编号和结构;只补充缺口段落,不删除、不压缩已有内容。",ap,a.promptTexts].filter(Boolean).join("\n\n"),[`章节标题:${a.chapter.title}`,`当前小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.factCoverageContext||"",`当前小节约 ${b} 字,目标约 ${a.targetWords} 字,本轮补充约 ${f} 字。`,"请输出可直接追加或插入到本小节的补充段落;不要重复小节标题,不要解释生成过程。",e?`绑定材料:
|
|
95
|
+
${e}`:"",`已有小节正文:
|
|
96
|
+
${bI(a.currentContent).slice(0,12e3)}`].filter(Boolean).join("\n\n"),!1,{maxTokens:bM(f),temperature:.25,signal:c}),Math.max(9e4,Math.min(18e4,bN(f))),a.signal)||"",a.forbidDrawingImages)).replace(/^#{3,4}\s+.*\n+/u,"").trim();return g?`${a.currentContent.trim()}
|
|
97
|
+
|
|
98
|
+
${g}`:a.currentContent}async function bK(a){let b=function(a,b){let c=Math.max(1200,Math.floor(Number(process.env.DOCUMENT_WRITING_TASK_MAX_WORDS??2200))),d=b>1.15*c?Math.ceil(b/c):1,e=Math.max(650,Math.ceil(b/d));return d<=1?[{sectionTitle:a,taskTitle:a,targetWords:b,index:1,total:1}]:Array.from({length:d},(b,c)=>({sectionTitle:a,taskTitle:`${a}(首轮写作任务 ${c+1}/${d})`,targetWords:e,index:c+1,total:d}))}(a.sectionTitle,a.targetWords),c=[];for(let d of b){aQ(a.signal);let b=await bH({...a,sectionTitle:d.sectionTitle,targetWords:d.targetWords,maxWords:Math.ceil(1.18*d.targetWords),qualityFeedback:d.total>1?`这是首轮生成的第 ${d.index}/${d.total} 个写作任务,聚焦“${d.taskTitle}”。必须与同小节其他任务互补,不要写总结性占位内容。`:a.qualityFeedback});b&&c.push(bI(b))}if(0===c.length)return;let d=`### ${a.sectionTitle}
|
|
99
|
+
|
|
100
|
+
${c.join("\n\n")}`;return an(aj(d=await bJ({...a,currentContent:d,targetWords:a.targetWords}),a.forbidDrawingImages))}async function bL(a){let b=bD(a.chapter,a.targetWords);if(b.length<2)return;let c=Number(process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??1),d=Math.max(1,Math.min(b.length,3,Number.isFinite(c)?Math.floor(c):1)),e=Array(b.length),f=0,g=async(c,d=!1)=>{a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:d?"retry":"start"});try{let d={...a,evidence:a.evidence,projectContext:a.projectContext,roleContext:a.roleContext||"",factCoverageContext:a.factCoverageContext,sectionTitle:c.title,targetWords:c.targetWords,maxWords:a.maxWords?Math.max(c.targetWords,Math.ceil(a.maxWords/b.length)):Math.ceil(1.12*c.targetWords),timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.55*bN(c.targetWords))))},e=c.targetWords>=2600?await bK(d):await bR(d,bQ(b.length));return e&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),e}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}};for(let c=0;c<b.length;c+=d){aQ(a.signal);let f=b.slice(c,c+d);(await Promise.all(f.map(a=>g(a)))).forEach((a,b)=>{e[c+b]=a})}let h=e.map((a,b)=>a?-1:b).filter(a=>a>=0);for(let c=0;c<h.length;c+=d){aQ(a.signal);let f=h.slice(c,c+d);(await Promise.all(f.map(a=>g(b[a],!0)))).forEach((a,b)=>{a&&(e[f[b]]=a)})}if(e.some(a=>!a)&&!a.allowPartialResult)return;let i=e.filter(Boolean);if(0!==i.length)return an(aj(`## ${a.chapter.title}
|
|
101
|
+
|
|
102
|
+
${i.join("\n\n")}`,a.forbidDrawingImages))}function bM(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function bN(a){let b=a||1200;return b>=8e3?36e4:b>=5e3?3e5:b>=3e3?24e4:18e4}function bO(a){return a<=0?0:Math.max(1,Math.ceil(a/4e3))}async function bP(a){let b=(0,aE.V7)(a.currentContent),c=a.maxChars??Math.ceil(1.12*a.targetChars),d=a.targetChars-b;if(b>=c||d<=300)return a.currentContent;let e=ah(ad(a.chapter,a.evidence),{maxChars:ae(Math.ceil(a.targetChars/2),6e3,16e3)}),f=await a0(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",ao,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。",ap,"不得输出“已满足要求”“由于信息有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,最多不超过 ${c} 字;本轮只补足必要缺口,不要过度展开。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和结果说明补充。材料没有新的精确数值时,可以扩展过程性正文,但不得编造具体数值。",a.roleContext,e?`绑定材料:
|
|
103
|
+
${e}`:"","当前章节 Markdown 分片(必须保留并覆盖全部已有内容,不得只基于末尾扩写):",function(a,b){let c=bt(a,12e3);return 0===c.length?"":1===c.length?c[0]:c.map((a,b)=>`【片段 ${b+1}/${c.length}】
|
|
104
|
+
${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??bM(b,a.targetChars),temperature:.25,signal:a.signal});if(!f||f.length<120)return a.currentContent;let g=an(aj(f.startsWith("## ")?f:`## ${a.chapter.title}
|
|
105
|
+
|
|
106
|
+
${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=(0,aE.V7)(a),g=(0,aE.V7)(b),h=(0,ai.GQ)(c),i=Math.max(0,d-f),j=Math.min(300,Math.max(80,Math.floor(.2*i)));return!(g>e)&&(!(i>0)||!(g<f+j))&&!(g<.98*f)&&(!h||!!b.includes(h))}(a.currentContent,g,a.chapter.title,a.targetChars,c)?a.currentContent:g}function bQ(a){let b=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_ATTEMPTS??1);return Math.max(1,Math.min(2,Number.isFinite(b)?Math.floor(b):1,a))}async function bR(a,b){let c;for(let d=0;d<b;d+=1){let b=await bH({...a,qualityFeedback:c});if(!b){c="上一轮未生成有效正文,请重新生成完整小节正文。";continue}let d=function(a,b){let c=b.replace(/^#{3,4}\s+.*\n+/u,"").split(/\r?\n/u).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*\|?\s*:?-{3,}:?/u.test(a)).join("\n"),d=(0,aE.V7)(c);return d<180?`正文有效内容不足:${a} 当前约 ${d} 字`:/资料未提供|信息有限|无法确定|待补充|建议补充更多资料|以下是|本文档|本小节围绕/u.test(c)?`存在空泛或说明性话术:${a}`:void 0}(a.sectionTitle,b);if(!d)return b;c=d}}async function bS(a){let b=bD(a.chapter,a.targetWords),c=new Map(b.map(a=>[a.title,a])),d=(a.forcedSections||[]).filter(b=>b.chapterTitle===a.chapter.title&&(b.planned||"missing_planned_section"===b.reason||"empty"===b.reason)).map(d=>({title:d.sectionTitle,targetWords:Math.max(420,c.get(d.sectionTitle)?.targetWords||Math.floor(a.targetWords/Math.max(1,b.length||a.forcedSections?.length||1))),forced:!0})),e=[...b];for(let a of d)e.some(b=>b.title===a.title)||e.push(a);if(e.length<1)return a.content;let f=a.content,g=new Set(d.map(a=>a.title)),h=e.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=f.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),d=(0,aE.V7)(c?.[1]||""),e=g.has(a.title);return{...a,currentWords:d,priority:e?0:d<80?1:2,forced:e}}).filter(a=>a.forced||a.currentWords<80).sort((a,b)=>a.priority-b.priority||a.currentWords-b.currentWords).slice(0,2),i=new Map,j=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??2),k=Math.max(1,Math.min(h.length||1,2,Number.isFinite(j)?Math.floor(j):2));for(let b=0;b<h.length;b+=k){let c=h.slice(b,b+k),d=a.maxWords?Math.max(0,a.maxWords-(0,aE.V7)(f)):1/0,e=Number.isFinite(d)&&d>200?Math.max(260,Math.floor(d/c.length)):void 0,g=bQ(h.length),j=await Promise.all(c.map(async b=>{try{let c=Math.max(350,Math.min(b.targetWords-b.currentWords,900));return await bR({...a,evidence:a.evidence.slice(0,10),sectionTitle:b.title,targetWords:c,maxWords:e?Math.min(e,1200):1200,timeoutMs:Math.max(9e4,Math.min(15e4,Math.ceil(.45*bN(c))))},g)}catch{return}}));c.forEach((a,b)=>{i.set(a.title,j[b])})}for(let a of h){let b=i.get(a.title);b&&(f=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${d}\\s*\\n)([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"),f=c.trim().replace(/^#{3,4}\s+(?:\d+(?:\.\d+)*\s+)?[^\n]+\n+/u,"").trim();return e.test(a)?a.replace(e,(a,b,c)=>{let d=function(a,b){let c=a.trim(),d=b.trim();if(!d)return"";if(!c)return d;if(c.includes(d))return"";if(d.includes(c))return d.slice(d.indexOf(c)+c.length).trim();let e=c.slice(-240),f=e.length>=80?d.indexOf(e):-1;return f>=0?d.slice(f+e.length).trim():d}(c,f);return d?`${b}${c.trim()}
|
|
107
|
+
|
|
108
|
+
${d}
|
|
109
|
+
|
|
110
|
+
`:`${b}${c.trim()}
|
|
111
|
+
|
|
112
|
+
`}):f?`${a.trim()}
|
|
113
|
+
|
|
114
|
+
### ${b}
|
|
115
|
+
|
|
116
|
+
${f}`:a}(f,a.title,b))}return an(aj(f,a.forbidDrawingImages))}async function bT(a){let b=a.content,c=0,d=Math.min(a.strictBudget?2:1,bO(a.targetChars-(0,aE.V7)(b))),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&(0,aE.V7)(b)<a.targetChars&&(0,aE.V7)(b)<e;c+=1){aQ(a.signal);let c=b;try{let d=(0,aE.V7)(b),f=Math.min(a.targetChars,d+(a.strictBudget?5600:3200)),g=await a1(c=>bP({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence.slice(0,10),promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:f,maxChars:Math.min(e,d+(a.strictBudget?7e3:4200)),forbidDrawingImages:a.forbidDrawingImages,maxTokens:Math.min(a.maxTokens??bM(d,f),bM(d,f)),signal:c}),12e4,a.signal);if(!g||g===c)break;b=g}catch{break}}return{content:b,rounds:c}}async function bU(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=(0,aE.V7)(b.map(a=>a.content).join("\n\n")),d=Math.min(a.budget.longformStrict?2:1,bO(a.budget.minChars-c)),e=Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??2),f=Math.max(1,Math.min(a.chapters.length||1,a.budget.longformStrict?3:2,Number.isFinite(e)?Math.floor(e):2)),g=new Set,h=a.budget.maxChars;for(let e=0;e<d&&c<a.budget.minChars&&(!h||c<h);e+=1){aQ(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=(0,aE.V7)(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500&&!g.has(a.chapter.id)).sort((a,b)=>b.deficit-a.deficit).slice(0,a.budget.longformStrict?5:2);if(0===e.length)break;for(let d=0;d<e.length&&c<a.budget.minChars&&(!h||c<h);d+=f){aQ(a.signal);let i=h?Math.max(0,h-c):1/0;if(i<=300)break;let j=h?Math.max(1,Math.min(f,Math.floor(i/800)||1)):f,k=e.slice(d,d+j),l=Number.isFinite(i)?Math.max(500,Math.floor(i/k.length)):void 0;for(let c of(await Promise.all(k.map(async b=>{try{let c=Math.min(b.target,b.current+Math.max(a.budget.longformStrict?2200:1200,Math.min(b.deficit,a.budget.longformStrict?5600:3200))),d=l?Math.min(Math.ceil(1.12*c),b.current+l):Math.ceil(1.12*c),e=await bT({template:a.template,chapter:{id:b.chapter.id,title:b.chapter.title,purpose:b.chapter.title,queries:[],requiredFacts:[],sections:b.chapter.sections},content:b.chapter.content,evidence:b.chapter.evidence.slice(0,a.budget.longformStrict?14:10),promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:c,maxChars:d,forbidDrawingImages:a.forbidDrawingImages,maxTokens:bM(b.current,c),signal:a.signal,strictBudget:a.budget.longformStrict});return{id:b.chapter.id,beforeChars:b.current,content:e.content}}catch{return{id:b.chapter.id,beforeChars:b.current,content:b.chapter.content}}}))))(0,aE.V7)(c.content)<=c.beforeChars+300&&g.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=(0,aE.V7)(b.map(a=>a.content).join("\n\n"))}if(c<=d+300)break}return b}async function bV(a){let b=Date.now(),c=Math.max(1,Math.min(a.strategy.maxChapterReviewConcurrency,Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??a.strategy.maxChapterReviewConcurrency))),d=Array(a.chapters.length);for(let e=0;e<a.chapters.length;e+=c){aQ(a.signal);let f=a.chapters.slice(e,e+c);(await Promise.all(f.map(async c=>{let d=a.budget.chapterTargets.get(c.id)||1200,e=bl({chapter:a.template.chapters.find(a=>a.id===c.id)||{id:c.id,title:c.title,purpose:"",queries:[],requiredFacts:[],sections:c.sections},content:c.content,missingFacts:c.missingFacts,targetWords:d}),f=bA({totalChars:(0,aE.V7)(c.content),chapterCount:1,chunkChars:12e3,phase:"chapter"}),g=bt(c.content,12e3).slice(0,f.chunks),h=[];for(let i=0;i<g.length&&!(Date.now()-b>f.ms);i+=1){aQ(a.signal);let b=g[i]||"",f=await a0(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${c.title}`,`目标深度:约 ${d} 字;当前 ${(0,aE.V7)(c.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",c.missingFacts.length?`未覆盖事实:${c.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"",`章节正文片段 ${i+1}/${g.length}(必须检查该片段,不要假设其他片段已合格):`,bu(b,i,g.length),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))});h.push(bw(f))}let i=by(h.flatMap(a=>Array.isArray(a?.issues)?a.issues:[])).slice(0,f.issues),j=by(h.flatMap(a=>Array.isArray(a?.suggestions)?a.suggestions:[])).slice(0,f.issues),k=h.some(a=>a?.status==="fail"),l=h.some(a=>a?.status==="warn"),m=by([...e,...i]),n=e.some(a=>/缺少规划小节|规划小节正文过短|空小节|只有标题|只有表格|正文篇幅明显低于目标|低于目标|缺失|占位|泄露|不足/u.test(a)),o=k||n?"fail":l||m.length>0?"warn":"pass";return{chapterId:c.id,title:c.title,status:o,issues:m,suggestions:j,chars:(0,aE.V7)(c.content)}}))).forEach((a,b)=>{d[e+b]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:a6({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:a8(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function bW(a){let b=Date.now(),c=bA({totalChars:a.chapters.reduce((a,b)=>a+(0,aE.V7)(b.content),0),chapterCount:a.chapters.length,chunkChars:8e3,phase:"global"}).issues,d=a.chapters.map(b=>{let c=a.chapterReviews.find(a=>a.chapterId===b.id),d=c?.issues||[];return`- ${b.title}:${(0,aE.V7)(b.content)} 字;审查=${c?.status||"unknown"};问题数=${d.length};问题=${d.join(";")||"无"}`}).join("\n"),e=a.chapters.map(bv).join("\n\n---\n\n");aQ(a.signal);let f=await a0(["你是长文档全局一致性审查专家。只基于章节摘要检查跨章节一致性,不重写正文。","重点检查:章节之间信息冲突、术语不一致、重复堆砌、目录层级异常、关键要求缺失、前后矛盾、上下文衔接断裂。","摘要不足以判断的问题只能标记为需复核,不得臆测正文问题。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文摘要:
|
|
117
|
+
${a.projectContext}`:"","章节审查摘要:",d,"章节内容摘要(用于全文一致性审查,不是完整正文):",e,`请输出不超过 ${c} 条跨章节问题清单和建议;没有明确问题则返回“无明显跨章节冲突”。不要返回全文。`].filter(Boolean).join("\n"),!1,{maxTokens:Math.max(1400,Math.min(3200,180*c)),temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}),g=bw(f),h=g?by([...g.issues||[],...g.repairInstructions||[],g.repair].map(bx)):[],i=(h.length?h:by((f||"").replace(/```(?:json)?[\s\S]*?```/gu,"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6&&!/[{}[\]":,]|无明显|未发现明显|没有明确/u.test(a)))).slice(0,c);return{issues:i,stage:a6({type:"llm_review",roleId:"global-consistency-review",status:i.length>0?"fallback":"success",message:a8(i.length>0?`摘要化全局一致性审查发现 ${i.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function bX(a){aQ(a.signal);let b=Date.now(),c=bA({totalChars:(0,aE.V7)(a.markdown),chapterCount:a.template.chapters.length||1,chunkChars:12e3,phase:"final"}),d=c.ms,e=c.issues,f=ah(ad({id:"review",title:"最终质量审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence),{maxChars:ae((0,aE.V7)(a.markdown),8e3,18e3)}),g=a.spec?`结构化检查摘要:${a.spec.name}
|
|
118
|
+
关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
|
|
119
|
+
章节检查项:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
|
|
120
|
+
通用质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
|
|
121
|
+
约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"未生成结构化检查摘要。",h=bt(a.markdown,12e3).slice(0,c.chunks),i=[];for(let c=0;c<h.length&&(aQ(a.signal),!(Date.now()-b>d));c+=1){let b=h[c]||"";i.push(await a2(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构/提示词角色 > 绑定文件证据 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、绑定材料事实使用、参数数字准确性、冲突事实、异常对象名、表格呈现、导出友好性、系统提示泄露。","只返回 JSON 审查结果;不得返回优化后的完整 Markdown。",'返回格式:{"passed":true,"score":90,"issues":[{"type":"...","severity":"low|medium|high","location":"...","message":"..."}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文/历史记忆:
|
|
122
|
+
${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bu(b,c,h.length),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1600,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}))}aQ(a.signal);let j=i.flatMap(a=>Array.isArray(a?.issues)?a.issues.filter(a=>a?.message):[]).slice(0,e),k=Date.now()-b>d,l=j.filter(a=>"high"===a.severity).length,m=i.map(a=>Number(a?.score)).filter(Number.isFinite),n=m.length?Math.round(m.reduce((a,b)=>a+b,0)/m.length):void 0,o=function(a,b){if(0===a.length)return b;let c=[],d=0;for(let b of a){if(d+b.length>420&&c.length>0)break;c.push(b),d+=b.length}return c.join(";")}(j.map(a=>`${a.severity||"medium"}:${a.location||a.type||"全文"}-${a.message}`),"未发现明显质量问题");return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:l>0||k?"fallback":i.length>0?"success":"skipped",message:i.length>0?`已完成预算化结构化非重写式质量审查${void 0!==n?`,评分 ${n}`:""}${k?",已达到审查预算":""}:${o}`:"无可用模型或审查结果不可用,保留生成初稿"}}}function bY(a,b){let c=(0,aE.V7)(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}function bZ(a,b){return(0,aF.yw)(a,[{title:b.title,content:a,sections:b.sections||[]}]).filter(a=>a.planned||"missing_planned_section"===a.reason)}function b$(a){return`该小节围绕“${a}”进行补充说明,执行时应结合本章已列明的资料事实、施工对象、控制边界和质量安全要求组织实施。对资料中已经明确的规格、数量、标准编号、工艺参数和验收要求,应在交底、过程检查、复核验收和整改闭环中原样引用;资料未明确的工程实体参数不得擅自确定,可作为施工组织计划值另行报审确认。`}function b_(a,b){let c=bZ(a,b).filter(a=>"missing_planned_section"===a.reason);if(0===c.length)return a;let d=c.slice(0,6).map((a,b)=>{let c=/^\d+(?:\.\d+)*/u.test(a.sectionTitle)?"":`${b+1}. `;return`### ${c}${a.sectionTitle}
|
|
123
|
+
|
|
124
|
+
${b$(a.sectionTitle)}`});return`${a.trim()}
|
|
125
|
+
|
|
126
|
+
${d.join("\n\n")}`}function b0(a){return a.replace(/^#{1,6}\s+.+$/gmu,"").replace(/^\s*\|.*\|\s*$/gmu,"").replace(/^\s*[-:| ]{3,}\s*$/gmu,"").replace(/\s+/gu,"").length}function b1(a){return a.replace(/见招标文件/gu,"按本项目招标文件已明确的相应条款执行").replace(/按图纸/gu,"依据经确认的设计文件和图纸内容组织实施").replace(/按设计要求/gu,"依据设计文件明确的构造、材料、尺寸和验收要求执行").replace(/按(?:资料|文件|说明|方案|规范|标准|要求)/gu,"依据本项目已确认资料、技术文件和验收标准").replace(/满足(?:相关|有关)?要求/gu,"满足本项目已明确的质量、安全、技术和验收控制要求").replace(/\b兜底\b|兜底生成|兜底片段/gu,"补充完善").replace(/本节(?:将|主要|重点)?/gu,"").replace(/本章将/gu,"").replace(/根据需要|视情况|结合实际情况/gu,"结合已确认资料、现场条件和审批后的施工组织安排").replace(/相关要求/gu,"本项目已明确的质量、安全、技术和验收要求")}function b2(a,b){return b1((function(a,b){let c=b_(a,{id:"",title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections||[]});for(let a of b.sections||[]){let b=RegExp(`^(#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}\\s*)\\n([\\s\\S]*?)(?=^#{2,4}\\s+|$)`,"mu");c=c.replace(b,(b,c,d)=>b0(d)>=80?b:`${c}
|
|
127
|
+
${d.trim()}
|
|
128
|
+
|
|
129
|
+
${b$(a)}
|
|
130
|
+
|
|
131
|
+
`)}return c})(a,b).replace(/^(#{3,4}\s+(.+)\s*)\n([\s\S]*?)(?=^#{2,4}\s+|$)/gmu,(a,b,c,d)=>{if(!(/^\s*\|.*\|\s*$/mu.test(d)&&/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/mu.test(d))||b0(d)>=80)return a;let e=c.replace(/^\d+(?:\.\d+)*\s*/u,"").trim();return`${b}
|
|
132
|
+
${d.trim()}
|
|
133
|
+
|
|
134
|
+
表中内容用于明确本小节涉及的对象、范围和控制要求,实施前应由项目技术、质量和施工管理人员结合已确认资料进行复核。执行过程中应保留交底、检查、复验和整改记录,确保表格列明事项能够落实到施工组织、资源配置和验收闭环。
|
|
135
|
+
|
|
136
|
+
${b$(e)}
|
|
137
|
+
|
|
138
|
+
`})).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 b3(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 b4(a){var b;aQ(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,P=(0,g.Qh)(),Q=[],R=[],U=(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))),X=async(b,c=aa)=>{let d=setInterval(()=>{a.signal?.aborted||U(Q,c)},V);try{return await b()}finally{clearInterval(d)}},Z=(0,d.N6)(H)||"none",_=(0,i.Mu)(Z)?.name||Z,aa=[a6({type:"role_binding",roleId:Z,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${H.name}`,details:[`当前项目:${B}`,`资料目录:${e.join(k,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:_,roleName:_,order:0})];U();let ac=(0,d.zY)(H),ad=(0,d.Vh)(H);if(a7(aa,a6({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:aa.length})),U(),0===ad.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let af=function(a){let b=[];for(let c of(0,d.dU)(a))(0,ai.eI)(c.content)&&b.push(`## [${c.roleId}] ${c.name}
|
|
139
|
+
${c.content}`);return b.join("\n\n")}(ac),ag=(0,ai.cs)([{text:a.requirement,source:"用户需求"},{text:af,source:"提示词角色",strict:!0}]),ah=ag.length>=2;ah&&(H={...c,chapters:ag}),a7(aa,a6({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${ad.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:aa.length})),U();let aj=await X(()=>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:ad.map(a=>a.filePath),boundFileRoles:(0,d.wR)(ad)})));a7(aa,a6({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(aj.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:aa.length})),U();let ak=await X(()=>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||""))),al=ak.spec,am=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||""),an=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,aj),ao=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:al,summary:aj,resolvedRoles:an});if(!ao.ready)throw Error(`生成准备度不足:${ao.blockingIssues.join(";")}`);let ap=[I(aj,{publicSafe:!0}),u(al,ak.sourceHash,{publicSafe:!0}),O(ao,{publicSafe:!0})].filter(Boolean).join("\n\n"),aq=[I(aj),u(al,ak.sourceHash),O(ao)].filter(Boolean).join("\n\n"),ar=[ap,`生成前规划章节结构:
|
|
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")}`,bs(ac,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),at=[aq,bs(ac,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),av=[ap,bs(ac,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n");a7(aa,a6({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${ad.length} 条文件角色绑定`,details:[`提示词角色:${ac.length} 个`,`文件角色:${ad.length} 个`,ah?`识别 OUTLINE 章节:${ag.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:aa.length})),U();let aw=bq(k,ad),ax=(0,i.XB)("file"),ay=new Map(ad.flatMap(a=>bo(k,a.filePath).map(b=>[b,a.roleId]))),az=new Map(ad.flatMap(a=>bo(k,a.filePath).map(b=>[b,ax.find(b=>b.id===a.roleId)?.processingType||"reference"])));a7(aa,a6({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:aa.length})),U();let aB=await X(()=>P.getProject(k)),aI=b3(aB,[...aw],a.maxEvidencePerChapter);a7(aa,a6({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"已读取知识库索引,开始构建角色资料证据池",details:[`证据范围文件:${aw.size} 份`,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:aa.length})),U(),aQ(a.signal);let aJ=[],aK=[],aM=[],aN=[],aO=-1,aR=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(br(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=bb(`${a} ${c.join(" ")}`),e=bb(`${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(bb(d))&&(c+=4);return c}(d,b);for(let a of a9.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=bb(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of a9.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,ac,ad),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=bc(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}}(aB,aR,k,ae(Math.max(1200,900*ad.length),12e3,aX())),aT=a6({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)} 条`,`待执行资料理解节点:${aR.length} 个`,aS.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aS.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aS.uniqueFileCount,total:Math.max(1,aS.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:aa.length});a7(aa,aT),U();let aV=[],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=bc(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 aL({type:"project-evidence-version-v2",entries:e})}(aB,k,aw),aY=aZ()?.model.name,a$=bs(ac,["fact_extraction","reference","chapter_generation"]),a_=aL({fileBindings:ad,evidenceScopePaths:[...aw].sort(),activeModelName:aY,projectEvidenceVersion:aW,promptTexts:a$,materialFingerprint:aj.fingerprint,materialInventory:Object.fromEntries(Object.entries(aj.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),a0=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aR.length>12?1:2)),a2=Math.max(1,Math.min(aR.length||1,3,Number.isFinite(a0)?Math.floor(a0):1));for(let b=0;b<aR.length;b+=a2){aQ(a.signal);let c=aR.slice(b,b+a2).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(bc(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return ab(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=>bp(k,a.filePath,aw)),g=aa.length,h=a6({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:aR.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});aa.push(h),U();let i=await X(()=>bf(H,c,f,a.signal)),j=a6({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:a8(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aR.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return aa[g]=j,U(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))aJ.push(...a.evidence),aV.push(a.artifact);let d=ab(aJ,{maxItems:Math.max(40,8*aR.length),maxChars:Math.max(45e3,5e3*aR.length),preservePinned:!0});aJ.splice(0,aJ.length,...d)}let a5=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,ai.YZ)(b.title);!(!(0,ai.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(H,aV),be=(0,ai._9)(H,al,{preserveExplicitOutline:ah}),bk=[H.name,H.outputTitle,a.requirement,...be.flatMap(a=>[a.title,a.purpose,...a.sections||[]])].filter(Boolean).join(" "),bt=(0,h.Hh)(bk,void 0,k),bu=[bt.length>0?bt.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
|
+
${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aP(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")}(aV)].filter(Boolean).join("\n\n"),bv={...H,chapters:be},bw=(0,aE.tF)({requirement:a.requirement,promptTexts:ar,template:bv,chapters:be,spec:al}),bx=0,by=0;be=await Promise.all(be.map(async b=>{if(b.sections?.length)return bx+=1,b;by+=1;let c=ab(aJ.filter(a=>a.chapterId===b.id||(0,Y.Lk)(a,b.title)),{maxItems:a.maxEvidencePerChapter||10,maxChars:ae(bw.chapterTargets.get(b.id)||1200),preservePinned:!0}),d=bi(aV,b,bg(b,a5)),e=await bG({template:bv,chapter:b,evidence:c,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:d,targetWords:bw.chapterTargets.get(b.id)||1200,signal:a.signal});return e.length?{...b,sections:e}:b})),H={...H,chapters:be};let bz=(0,aE.tF)({requirement:a.requirement,promptTexts:ar,template:H,chapters:be,spec:al});R=be.map(a=>a.id);let bA=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
|
|
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:bz.targetChars||[...bz.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bA.targetLlmConcurrency>0&&(b=bA.targetLlmConcurrency,void 0===aU||!Number.isFinite(b)||b<=0||(aU=Math.min(aU,Math.floor(b))),aX());let bD={strategy:bA,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aX(),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}},bE=bA.targetLlmConcurrency>0?`LLM 并发上限 ${bA.targetLlmConcurrency}`:"LLM 不做本地并发限流";a7(aa,a6({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bA.mode} 生成策略:章节审查 ${bA.enableChapterReview?"启用":"跳过"}、全局审查 ${bA.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bA.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bA.enableDocumentBudgetExpansion?"启用":"跳过"};${bE}`},{subtitle:"后台自动策略"}));let bF=a6({type:"context_recall",roleId:"project-memory",status:bt.length>0?"success":"skipped",message:bt.length>0?`已注入 ${bt.length} 条短期/长期上下文`:"未召回可用上下文"},{subtitle:"上下文记忆"}),bH=ah?"OUTLINE 章节":"模板章节",bI=a6({type:"validation",roleId:"section-planning",status:"success",message:`小节规划:${by} 章由 LLM 基于${bH}、角色和绑定文件证据规划小节,${bx} 章已由模板显式提供小节并跳过规划`},{subtitle:"小节规划策略"}),bJ=ah?`;识别到 OUTLINE 章节 ${ag.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";a7(aa,a6({type:"role_binding",roleId:Z,status:"success",message:`已绑定 ${ad.length} 个文件角色、${ac.length} 个提示词角色;后台优化建议关注 ${al.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ao.materialCoverageRate)}%${bJ}`},{subtitle:_,roleName:_})),a7(aa,a6({type:"validation",roleId:"document-readiness",status:ao.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ao.materialCoverageRate)}%,资料角色 ${Math.round(100*ao.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ao.specCompletenessRate)}%;${aj.source.selectionReason}`},{subtitle:"生成准备度检查"})),a7(aa,bF),a7(aa,bI),U();let bK=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bO=Number(bK??bA.maxChapterConcurrency),bP=Math.max(1,Math.min(be.length||1,bA.maxChapterConcurrency,Number.isFinite(bO)?Math.floor(bO):bA.maxChapterConcurrency));a7(aa,a6({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bP}/${be.length} 章并发`,details:[`策略上限:${bA.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bK??"未设置"}`,`有效章节数:${be.length}`]},{subtitle:"章节并发策略"})),U();for(let b=0;b<be.length;b+=bP){let c=be.slice(b,b+bP);await Promise.all(c.map(async(c,d)=>{let e,f=b+d;aQ(a.signal);let g=Date.now(),h=aa.length;try{aa.push(a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${f+1}/${be.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:f+1,total:be.length,label:"章节生成"}},{subtitle:(0,ai.GQ)(c.title),order:f})),U();let b=[],d=bg(c,a5),i=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],j=c.queries.length>0?c.queries:[H.name,H.outputTitle,c.title],l=[...new Set([...j,...i])].filter(Boolean),m=Date.now();aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 正在执行 ${l.length} 组知识库检索`,details:l.map(a=>`检索:${a.slice(0,42)}`),progress:{current:f+1,total:be.length,label:"证据检索"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U();let n=[...aw].filter(Boolean).sort(),o=[],p=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let b of l.slice(0,p)){if(aQ(a.signal),0===n.length)break;let c=await P.search(k,b,{scope:"project",filters:{filePaths:n},limit:Math.min(aI,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15},generationMode:!1});o.push(c.results)}for(let a of(bD.evidence.searchQueries+=Math.min(l.length,p),bD.evidence.searchMs+=Date.now()-m,o))b.push(...a.filter(a=>bp(k,a.filePath,aw)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:ay.get(a.filePath),processingType:az.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let q=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),r=bh(aV,c,d);b.push(...r.flatMap(({artifact:a})=>a.evidence.filter(a=>bp(k,a.filePath,aw)).map(a=>({...a,chapterId:c.id,source:"role-node"}))));let s=new Set([...q]),t=bz.chapterTargets.get(c.id)||1200,u=ae(t,6e3,Math.max(12e3,3e3*aX()));for(let a of s){if(!bp(k,a,aw))continue;let d=q.has(a),e=aB.getFileDetail(a,{maxChunkContentChars:u});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:ay.get(e.file.relativePath),processingType:az.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let v=b.filter(a=>bp(k,a.filePath,aw)),w=ae(t,8e3,Math.max(16e3,3500*aX())),x=Math.max(8,Math.min(28,aI*Math.max(1,Math.min(l.length,3)))),y=ab(v,{maxItems:x,maxChars:w,preservePinned:!0},bD);bD.evidence.contextChars+=y.reduce((a,b)=>a+b.content.length,0),aJ.push(...y);let z=ab(aJ,{maxItems:Math.max(40,10*be.length),maxChars:Math.max(5e4,9e3*be.length),preservePinned:!0});aJ.splice(0,aJ.length,...z);let A=c.requiredFacts.filter(a=>!y.some(b=>(0,Y.Lk)(b,a)));for(let a of(0===y.length&&aK.push(`${c.title}:未检索到明确资料依据`),A))aK.push(`${c.title}:${a} 未检索到明确依据`);let B=a6({type:"knowledge_retrieval",roleId:"knowledge-base",status:aJ.length>0?"success":"fallback",message:`已检索/绑定 ${aJ.length} 条证据`});aO<0?aO=a7(aa,B):aa[aO]={...B,order:aa[aO]?.order??B.order},U(),aQ(a.signal);let C=bj(aV,H),D=bi(aV,c,d),E=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||[]].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${$(aP(a.value))}`),f=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=aP(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),g=new Set(a.evidence.map(a=>a.filePath)).size;return["【本章事实覆盖与参数落位要求】",d.length?`必须优先覆盖的事实/要求:
|
|
146
|
+
${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
|
|
147
|
+
${e.join("\n")}`:"",f.length?`本章资料中可直接使用的可靠精确参数/编号:${f.join("、")}。这些参数来自绑定资料,不属于编造;涉及对应对象、部位、工序、材料、设备、质量验收或安全控制时必须自然写入正文,并保持原样或等价专业表达。不得写入商务金额、单价、税率、预留金。`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。未命中项不得编造,但不得因此省略上方已经明确的可靠参数。`:"",`本章可用材料来源约 ${g} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:al,roleFacts:r,evidence:y,missingFacts:A}),F=al?.chapterRules.find(a=>a.id===c.id||a.title===c.title),G=bz.chapterTargets.get(c.id)||1200,I=Math.ceil(G*(bz.maxChars?1.1:1.18)),J=bz.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*G))):1200,K=Math.max(d?.minWords||0,F?.minWords||0,al?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*G),J),L=bM(K,G),M=bz.longformStrict?.82:.55,N=bz.longformStrict?Math.max(5200,Math.ceil(.9*G)):2600,O=Math.max(900,Math.min(G,Math.ceil(G*M),N)),R=Math.max(450,Math.min(K,Math.floor(.72*O))),S=Math.max(O+300,Math.min(I,Math.ceil(1.25*O))),T=bM(R,O),V=Math.min(bN(O),3e5),W=c.sections?.filter(Boolean).length||0,Z=/[、,,;;]/u.test(c.title),_=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&W>=2&&!Z;aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:_?`${(0,ai.GQ)(c.title)} 正在按小节并发成稿`:`${(0,ai.GQ)(c.title)} 正在整章一次成稿`,details:_?[`有效证据:${y.length} 条`,`目标字数:约 ${G} 字,上限约 ${I} 字`,`小节并发上限:${bA.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[`有效证据:${y.length} 条`,`目标字数:约 ${G} 字,上限约 ${I} 字`,`章节并发上限:${bP}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:f+1,total:be.length,label:_?"小节并发":"整章成稿"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U();let ad=_?await X(()=>ba(bD,`chapter-section-draft:${c.id}`,()=>a1(b=>bL({template:H,chapter:c,evidence:y,missingFacts:A,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:D,targetWords:G,maxWords:I,forbidDrawingImages:C,factCoverageContext:E,projectRoot:k,modelName:aY,fileRolesHash:a_,allowPartialResult:!1,maxSectionConcurrency:bA.maxSectionConcurrency,diagnostics:bD,signal:b}),Math.min(bN(G),Math.max(24e4,Math.ceil(15e4*(c.sections?.length||2)/Math.max(1,bA.maxSectionConcurrency||1)))),a.signal))):await X(()=>ba(bD,`chapter-draft:${c.id}`,()=>a1(b=>bC(H,c,y,A,ar,bu,a.requirement,D,{forbidDrawingImages:C,minWords:K,targetWords:G,maxWords:I,maxTokens:L,factCoverageContext:E,signal:b}),bN(G),a.signal)));if(!ad&&_?(aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${G} 字`,`有效证据:${y.length} 条`],progress:{current:f+1,total:be.length,label:"整章兜底"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q),ad=await X(()=>ba(bD,`chapter-draft-fallback:${c.id}`,()=>a1(b=>bC(H,c,y.slice(0,14),A,ar,bu,a.requirement,D,{forbidDrawingImages:C,minWords:R,targetWords:O,maxWords:S,maxTokens:T,factCoverageContext:E,signal:b}),V,a.signal)))):ad||(aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 整章成稿未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${G} 字`,`有效证据:${y.length} 条`],progress:{current:f+1,total:be.length,label:"整章兜底"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q),ad=await X(()=>ba(bD,`chapter-draft-fallback:${c.id}`,()=>a1(b=>bC(H,c,y.slice(0,14),A,ar,bu,a.requirement,D,{forbidDrawingImages:C,minWords:R,targetWords:O,maxWords:S,maxTokens:T,factCoverageContext:E,signal:b}),V,a.signal)))),aQ(a.signal),ad||(aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${G} 字`],progress:{current:f+1,total:be.length,label:"紧凑兜底"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q),ad=await X(()=>ba(bD,`chapter-draft-compact-fallback:${c.id}`,()=>a1(b=>bC(H,c,y,A,ar,bu,a.requirement,D,{forbidDrawingImages:C,minWords:Math.max(450,Math.floor(.75*K)),targetWords:G,maxWords:I,maxTokens:L,factCoverageContext:E,signal:b}),bN(G),a.signal)))),aQ(a.signal),!ad)throw Error(`${c.title} 大模型未返回有效章节正文`);let af=bZ(ad,c);if(af.length>0){let b=ad;aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 首次成稿存在 ${af.length} 个小节缺口,正在定向补写`,details:af.map(a=>a.message),progress:{current:f+1,total:be.length,label:"小节补写"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q),ad=await X(()=>ba(bD,`chapter-supplement:${c.id}`,()=>bS({template:H,chapter:c,content:b,evidence:y,missingFacts:A,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:D,targetWords:G,forbidDrawingImages:C,factCoverageContext:E,maxSectionConcurrency:bA.maxSectionConcurrency,forcedSections:af,signal:a.signal})))}if((af=bZ(ad,c)).length>0){aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 首次生成仍有 ${af.length} 个小节缺口,正在章节内强制补齐`,details:af.map(a=>a.message),progress:{current:f+1,total:be.length,label:"章节内小节补齐"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q);let b=ad;ad=await X(()=>ba(bD,`chapter-forced-section-supplement:${c.id}`,()=>bS({template:H,chapter:c,content:b,evidence:y,missingFacts:A,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:D,targetWords:G,forbidDrawingImages:C,factCoverageContext:E,maxSectionConcurrency:bA.maxSectionConcurrency,forcedSections:af,signal:a.signal}))),af=bZ(ad,c)}af.length>0&&(aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"fallback",message:`${(0,ai.GQ)(c.title)} 小节补齐仍未完全达标,保留当前可用章节继续合并`,details:af.map(a=>a.message),progress:{current:f+1,total:be.length,label:"保留可用章节"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q));let ag=bl({chapter:c,content:ad,missingFacts:A,targetWords:G}),ah=(0,aF.Ff)(ag);bD.quality.blockingCount+=ah.blocking,bD.quality.importantCount+=ah.important,bD.quality.minorCount+=ah.minor;let aj=bd(ag);if(aj.length>0){let b=ad;aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 正在根据质量问题修复章节:${aj.length} 个阻断问题`,details:aj,progress:{current:f+1,total:be.length,label:"章节修复"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q);let d=await X(()=>ba(bD,`chapter-repair:${c.id}`,()=>bm({template:H,chapter:{id:c.id,title:c.title,content:b,evidence:y,missingFacts:A,sections:c.sections||[]},issues:aj,promptTexts:ar,requirement:a.requirement,forbidDrawingImages:C,diagnostics:bD,signal:a.signal})));ad=d.content,d.appliedCount>0&&(bD.quality.repairedCount+=1),aQ(a.signal)}if(!ad?.trim())throw Error(`${(0,ai.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let ak=b_(ad,c),am=0;if((0,aE.V7)(ak)<Math.floor(.82*G)||bd(bl({chapter:c,content:ak,missingFacts:A,targetWords:G})).length>0){aa[h]=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,ai.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,aE.V7)(ak)} 字 / 目标 ${Math.floor(.95*G)} 字`,`章节并发:${bP}`],progress:{current:f+1,total:be.length,label:"章节扩写"}},{subtitle:(0,ai.GQ)(c.title),order:f}),U(Q);let b=await X(()=>ba(bD,`chapter-expand:${c.id}`,()=>bT({template:H,chapter:c,content:ad,evidence:y.slice(0,14),promptTexts:ar,requirement:a.requirement,roleContext:D,targetChars:Math.floor(.95*G),maxChars:I,forbidDrawingImages:C,maxTokens:Math.min(L,T),signal:a.signal})));ak=b_(b.content,c),am=b.rounds}ak=b2(ak,c);let an=(0,aE.V7)(ak),ao=c.sections?.length?c.sections:as(ak),ap=(0,aF.qK)(ak,[{title:c.title,content:ak,sections:ao}]).map(a=>a.message),aq=[...bl({chapter:{...c,sections:ao},content:ak,missingFacts:A,targetWords:G}),...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"}(an,G,aq);e=a6({type:"chapter_generation",roleId:"chapter_generation",promptId:ac.find(a=>"chapter_generation"===a.roleId)?.promptId,status:at,message:a8(`${(0,ai.GQ)(c.title)} 已由大模型首轮成稿${am>0?`并定向扩写 ${am} 轮`:""}:当前 ${an} 字 / 目标 ${Math.floor(.95*G)} 字${"success"!==at?`;风险:${aq.join("、")||"篇幅未达标"}`:""}`,g),details:[`达标率:${Math.round(an/Math.max(1,Math.floor(.95*G))*100)}%`,`二级小节:${ao.length} 个`,`扩写轮次:${am}`],progress:{current:f+1,total:be.length,label:"success"===at?"章节达标":"章节风险"}},{subtitle:(0,ai.GQ)(c.title),order:f}),aN.push(e);let au={id:c.id,title:c.title,content:ak,evidence:y,missingFacts:A,sections:ao};Q.push(au),U(Q);let av=bl({chapter:c,content:ak,missingFacts:A,targetWords:G}),ax=(0,aF.Ff)(av);bD.quality.blockingCount+=ax.blocking,bD.quality.importantCount+=ax.important,bD.quality.minorCount+=ax.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aM.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aN.push(a6({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,ai.GQ)(c.title)} 生成失败`},{subtitle:(0,ai.GQ)(c.title),order:f}))}e&&(aa[h]=e),U(Q)}))}if(Q.sort((a,b)=>be.findIndex(b=>b.id===a.id)-be.findIndex(a=>a.id===b.id)),0===Q.length)throw Error(`章节生成未完成:${aM.join(";")||"没有生成任何有效章节"}`);if(ah&&Q.length<be.length)throw Error(`OUTLINE 指定 ${be.length} 章,实际只生成 ${Q.length} 章:${aM.join(";")||"部分章节未生成"}`);aQ(a.signal),a7(aa,a6({type:"file_understanding",roleId:"multimodal-files",status:"running",message:"正在理解多模态参考文件"},{subtitle:"多模态参考文件"})),U(Q);let bQ={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bQ=await bB(k,aJ,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(a7(aa,bQ.stage),U(Q),aQ(a.signal),bQ.notes))aJ.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bR=ab(aJ,{maxItems:Math.max(48,10*be.length),maxChars:Math.max(52e3,9e3*be.length),preservePinned:!0});aJ.splice(0,aJ.length,...bR);let b$=function(a,b,c){let d={};for(let e of(0,Y.Uy)(a,c)){let a=b.find(a=>(0,Y.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(H,aJ,al);for(let a of aV)for(let b of a.facts)b$[b.key]=`${aP(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b0=function(a,b,c){let d=(0,Y.Uy)(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!(0,Y.I2)(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ")],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(aJ,H,al),b4=function(a,b=J){let c=[],d=new Set;for(let e of a){let a=`${e.roleId||""} ${e.processingType||""} ${e.filePath} ${e.sectionTitle||""}`;if(!/drawing|table|bill|boq|draw|data|sheet|spec|standard|record|report|表格|数据|规格|参数|标准|记录|报告|清单|图纸|说明/u.test(a)&&e.score<.75)continue;let f=aP(e.content).replace(/\s+/gu," ");for(let a of f.matchAll(a4)){let g=a[0].trim();if(!g||M(b,g))continue;let h=Math.max(0,(a.index||0)-40),i=Math.min(f.length,(a.index||0)+g.length+40),j=f.slice(h,i);if(N(b,j)||function(a,b){return a.lowConfidenceValuePatterns.some(a=>a.test(b))}(b,j))continue;let k=`${e.filePath}:${g}`;d.has(k)||(d.add(k),c.push({key:"精确参数",fieldName:"技术参数",fieldId:"technical_parameter",value:g,sourceFile:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",confidence:Math.max(.7,e.score||.7),sourceRef:{filePath:e.filePath,roleId:e.roleId||"precise_fact",processingType:e.processingType||"precise",sectionTitle:e.sectionTitle}}))}}return c.slice(0,240)}(aJ,am),b5=aV.flatMap(a=>a.facts.map(a=>({key:a.key,value:aP(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b6={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,Y.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aP(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aP(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...b5,...b0,...b4],H,al)){let b=ab(aJ,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b6=await a3(b,at,H,al,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aQ(a.signal);let b7=function(a,b){let c=b.find(a=>a.filePath)?.filePath||"";return c?a.map(a=>a.sourceFile?a:{...a,sourceFile:c,sourceRef:{filePath:c,roleId:a.sourceRef?.roleId||a.roleId,processingType:a.sourceRef?.processingType||a.processingType,sectionTitle:a.sourceRef?.sectionTitle,chunkIndex:a.sourceRef?.chunkIndex,cellRange:a.sourceRef?.cellRange}}):a}([...b5,...b0,...b4,...b6.facts],aJ);for(let a of(a7(aa,bQ.stage),b6.stages))a7(aa,a);U();let b8=function(a){let b=[],c=new Set;for(let d of a.filter(a=>"table"===a.processingType)){if(c.has(d.filePath))continue;c.add(d.filePath);let a=(0,g.aY)(),f=e.isAbsolute(d.filePath)?d.filePath:aG.existsSync(e.join(a,"knowledgeBase",d.filePath))?e.join(a,"knowledgeBase",d.filePath):e.join(a,d.filePath),h=e.extname(d.filePath).toLowerCase();if(aG.existsSync(f)&&[".xlsx",".xls",".csv"].includes(h))try{let a=aH.readFile(f,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let e=a.Sheets[c],f=aH.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let g=f.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=f[g].filter(Boolean),i=f.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:d.roleId||"table",sheet:c,headers:h,rows:i,sourceFile:d.filePath,sourceRange:e["!ref"]})}continue}catch{}let i=d.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(i.length<2)continue;let j=i[0].includes("|")?"|":i[0].includes(" ")?" ":",",k=i.map(a=>a.split(j).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);k.length<2||b.push({tableType:d.roleId||"table",headers:k[0],rows:k.slice(1),sourceFile:d.filePath,sourceRange:d.sectionTitle})}return b}(aJ),b9=aJ.filter(a=>"pinned-evidence"===a.source).length,ca=aJ.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cb=a6({type:"reference",roleId:"quality-enhancement",status:aJ.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aJ.length} 条,人工确认/固定证据 ${b9} 条,上下文 ${bt.length} 条,自动检索证据 ${ca} 条`},{subtitle:"证据与上下文增强"});for(let a of(aa.push(cb),U(),b7))b$[a.key]=`${aP(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cc=new Map;for(let a of aJ)cc.set(a.filePath,(cc.get(a.filePath)??0)+1);let cd=[...cc.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ce=function(a,b=[],c=[],d,e=J){let f=b=>a.filter(a=>b.some(b=>`${a.key} ${a.fieldName||""}`.includes(b))),g=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),h=a.filter(a=>{let b=`${a.key} ${a.fieldName||""} ${a.value}`;return/\d|DN|φ|Φ|mm|cm|m²|m3|m³|MPa|kPa|℃|%|GB|ISO|IEC|IEEE|RFC|API|台|套|个|项|批|次|份|人|㎡/iu.test(b)&&!M(e,b)&&!N(e,b)}),i=a.filter(a=>"table"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/u.test(`${a.roleId} ${a.sourceFile}`));return{project:a,schedule:f(["工期","开工","竣工","节点","周期"]),quality:f(["质量","验收"]),safety:f(["安全","风险"]),resources:f(["劳动力","材料","机械","设备","资源"]),tables:b,drawings:g("drawing"),bills:i,preciseFacts:h,rules:g("rule"),specifications:g("specification"),schemaFacts:function(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}(a,d),missing:[...new Set(c)],conflicts:function(a,b,c=J){let d=(b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.fieldName||a.key))]).filter(a=>(function(a,b){let c=L(b,a);return c?"single"===c.cardinality&&"ignore"!==c.conflictPolicy&&"allow_multiple"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期/u.test(a)})(a,c)),e=[];for(let b of d){let d=a.filter(a=>a.key===b||a.fieldName===b||L(c,a.fieldName||a.key)?.name===b),f=new Map;for(let a of d){let b=function(a,b){let c=aP(a).trim();if(N(b,c)||M(b,c))return"";let d=aP(c).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();return d&&!(d.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(c)?d:""}(a.value,c);b&&f.set(b,[...f.get(b)||[],a])}if(f.size>1){let a=[...f.values()].slice(0,4).map(a=>`${aP(a[0].value).slice(0,120)}(${[...new Set(a.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");e.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return e.slice(0,8)}(a,d,e)}}(b7,b8,aK,al,am),cf=Q.map(a=>{let b=al.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=(b?.requiredFactIds||[]).map(a=>al.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)}}),cg=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,b7,H);cg.warnings.push(...ao.warnings),cg.errors.push(...ao.blockingIssues);let ch=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}(cg,ce,Q);for(let a of(ch.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}(cf)),aV))for(let b of a.warnings)ch.push({level:/结构化事实读取不足|结构化章节读取不足|兜底|片段/u.test(b)?"info":"warning",message:b,suggestion:"这是资料抽取诊断,不代表已抽取到的可靠参数不可用;生成时仍应优先使用绑定资料中的可靠参数。"});let ci=bj(aV,H),cj=Date.now(),ck=(0,aE.V7)(Q.map(a=>a.content).join("\n\n"));a7(aa,a6({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${ck} 字`,details:[`章节数:${Q.length}`,`目标:${bz.targetChars||bz.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),U(Q);let cl=bA.enableDocumentBudgetExpansion?await X(()=>bU({template:H,chapters:Q,budget:bz,promptTexts:ar,requirement:a.requirement,forbidDrawingImages:ci,signal:a.signal})):Q;Q.splice(0,Q.length,...cl);let cm=Q.map(a=>a.content).join("\n\n"),cn=(0,aE.fW)(bz,cm),co=[bz.targetChars?`目标 ${bz.targetChars} 字${bz.minChars||bz.maxChars?`(区间 ${bz.minChars||0}-${bz.maxChars||"∞"} 字)`:""}`:void 0,bz.targetPages?`目标 ${bz.targetPages} 页${bz.minPages||bz.maxPages?`(区间 ${bz.minPages||0}-${bz.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";a7(aa,a6({type:"validation",roleId:"document-budget",status:bz.maxChars&&cn.currentChars>bz.maxChars||bz.minChars&&cn.currentChars<bz.minChars?"fallback":"success",message:a8(`文档预算:当前 ${cn.currentChars} 字,新增 ${Math.max(0,cn.currentChars-ck)} 字,预计 ${cn.estimatedPages} 页;${co}`,cj)},{subtitle:"文档预算"})),U(Q);let cp=aN.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cq=Math.max(0,be.length-Q.length);cp>0&&ch.push({level:"info",message:`章节生成存在补充完善:${cp} 章`,suggestion:"已保留章节成果;如需更高质量可复核对应章节,但不阻断导出。"}),cq>0&&ch.push({level:"error",message:`部分章节生成失败:${cq} 章`,suggestion:aM.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cr=ch.filter(a=>"error"===a.level&&(0,aF.Nz)(a)).length,cs=[...aa];a7(cs,a6({type:"validation",roleId:"document-workflow",status:cr>0?"failed":"success",message:`阻断 ${cr},错误 ${cg.errors.length},警告 ${cg.warnings.length}`},{subtitle:"最终规范校验"})),a7(cs,a6({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),a7(cs,a6({type:"export_ready",roleId:"document-workflow",status:cr>0?"failed":"success",message:cr>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let ct={templateId:H.id,templateName:H.name,title:H.outputTitle,requirement:a.requirement||"",projectRoot:k,projectId:B,exportSettings:H.exportSettings,generationSettings:H.generationSettings,facts:b$,structuredFacts:b7,factsModel:ce,chapters:Q,sources:cd,missingItems:[...new Set(aK)],validation:cg,validationIssues:ch,executionStages:cs,exportGate:{passed:0===cr,blockingIssues:ch.filter(a=>"error"===a.level&&(0,aF.Nz)(a)),checklist:[]},assets:[],partialChapters:Q.map(a=>({id:a.id,title:a.title,chars:(0,aE.V7)(a.content),status:bY(a,bz.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:Q,generatedAt:Date.now()},cu=aD(ct);if("1"!==process.env.DOCUMENT_ENABLE_POST_EXPORT_REVIEW){let a=aC(cu,Q,{forbidDrawingImages:ci}).chapters.map(a=>{let b=be.find(b=>b.id===a.id)||a;return{...a,content:b2(a.content,b)}}),b=b1(aC(aD({...ct,chapters:a}),a,{forbidDrawingImages:ci}).markdown),c=[...ch];c.push(...S({markdown:b,spec:al,summary:aj})),c.push(...W({markdown:b,facts:b7,summary:aj,profile:am})),c.push(...T(b,aj)),c.push(...(0,aF.gN)(b)),c.push(...(0,aF.f8)(b)),c.push(...(0,aF.k0)(b)),c.push(...(0,aF.qK)(b,a)),c.push(...(0,aF.iC)(b)),c.push(...(0,aF.BV)(b)),c.push(...au(b)),c.push(...(0,aF.Ty)(a)),c.push(...(0,aF.N1)(b,ce)),c.push(...(0,aF.bM)(b)),c.push(...(0,aF.M$)(b,ac)),c.push(...(0,aF.AC)(b,a)),c.push(...(0,aF.mR)(b,H)),c.push(...(0,aE.PE)(H.generationSettings||H.exportSettings,b).filter(a=>!(bz.minPages&&/低于目标页数/u.test(a.message)))),c.push(...(0,aE.ty)(bz,b)),c.push(...aA(b,H));let d=(0,aF.Ai)(c,ce,a),e=cs.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:d.blockingIssues.length>0?"failed":"success",message:`阻断 ${d.blockingIssues.length},问题 ${c.length}`}:"export_ready"===a.type?{...a,status:d.passed?"success":"failed",message:d.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);e.push(a6({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:ab(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...ct,chapters:f,validationIssues:c,exportGate:d,executionStages:e,partialChapters:a.map(a=>({id:a.id,title:a.title,chars:(0,aE.V7)(a.content),status:bY(a,bz.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:f,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:bD},markdown:b}}aQ(a.signal);let cv=Q.map(a=>{let b=bl({chapter:be.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:bz.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,aE.V7)(a.content)}}),cw=cv.filter(a=>"pass"!==a.status).length,cx=bA.enableChapterReview&&cw>0;cx&&(a7(cs,a6({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${cw}/${Q.length} 章存在本地风险`,details:[`审查并发:${bA.maxChapterReviewConcurrency}`,"仅对本地扫描发现风险的生成结果触发 LLM 审查"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),U(Q,cs));let cy=cx?await X(()=>ba(bD,"chapter-review",()=>bV({template:H,chapters:Q,budget:bz,promptTexts:av||ar,requirement:a.requirement,strategy:bA,diagnostics:bD,signal:a.signal}),{chapters:Q.length}),cs):{summaries:cv,stage:a6({type:"llm_review",roleId:"chapter-review",status:"skipped",message:bA.enableChapterReview?"本地章节扫描未发现需要 LLM 章节审查的问题,已跳过":"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cs.push(cy.stage);let cz=cy.summaries,cA=cz.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cA.length>0){a7(cs,a6({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cA.length} 章`,details:cA.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cA.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),U(Q,cs);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bA.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bA.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<cA.length;d+=e){aQ(a.signal);let f=cA.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 a1(d=>bm({template:H,chapter:c,issues:b.issues.slice(0,4),promptTexts:av||ar,requirement:a.requirement,forbidDrawingImages:ci,diagnostics:bD,signal:d}),9e4,a.signal);return{chapterId:b.chapterId,content:d?.content,appliedCount:d?.appliedCount||0}}catch{return{chapterId:b.chapterId,content:void 0,appliedCount:0}}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<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&&(cz=cz.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,aE.V7)(Q.find(b=>b.id===a.chapterId)?.content||"")}:a),cu=aD({...ct,chapters:Q,validationIssues:ch,executionStages:cs})),cs.push(a6({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),U(Q,cs)}if(cx)for(let a of cz.filter(a=>"pass"!==a.status&&a.issues.length>0))ch.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和角色证据覆盖。"});let cB=bA.enableGlobalReview&&(cx||ch.some(a=>/事实一致性|项目污染|章节缺失|结构/u.test(a.message)));cB&&(a7(cs,a6({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["仅在章节审查或本地校验发现跨章节风险时触发"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),U(Q,cs));let cC=cB?await X(()=>ba(bD,"global-consistency-review",()=>bW({template:H,chapters:Q,chapterReviews:cz,promptTexts:av||ar,requirement:a.requirement,projectContext:bu,diagnostics:bD,signal:a.signal}),{chapters:Q.length}),cs):{issues:[],stage:a6({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:bA.enableGlobalReview?"未发现需要 LLM 全局一致性审查的跨章节风险,已跳过":"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cs.push(cC.stage),cC.issues))ch.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、关键事实、范围边界和上下文一致性。"});U(Q,cs);let cD=Q.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,aE.V7)(a.content)<Math.floor(.7*(bz.chapterTargets.get(a.id)||1200))||cz.some(b=>b.chapterId===a.id&&"fail"===b.status)||bl({chapter:be.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:bz.chapterTargets.get(a.id)||1200}).length>0),cE=cr>0||cC.issues.length>0||cz.some(a=>"fail"===a.status)||ch.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),cF=bA.enableFinalQualityReview&&(cE||cD.length>Math.max(3,Math.floor(.35*Q.length))),cG=Date.now();cF&&(a7(cs,a6({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${cD.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),U(Q,cs));let cH=ab(aJ,{maxItems:Math.max(32,8*be.length),maxChars:Math.max(36e3,6e3*be.length),preservePinned:!0}),cI=cF?await X(()=>bX({template:H,spec:al,markdown:cu,evidence:cH,promptTexts:av||ar,projectContext:bu,requirement:a.requirement,diagnostics:bD,signal:a.signal}),cs):{markdown:cu,stage:{type:"llm_review",roleId:"llm-review",status:cD.length>0?"fallback":"success",message:cD.length>0?`本地风险扫描发现 ${cD.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};cI.stage.message=a8(cI.stage.message||"LLM 审查完成",cG),aQ(a.signal);let cJ=aC(cI.markdown===cu?aD({...ct,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}):cI.markdown,Q,{forbidDrawingImages:ci}).markdown,cK=aA(cJ,H).map(a=>a.message),cL=(0,aF.bM)(cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cM=(0,aF.mR)(cJ,H).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cN=(0,aF.N1)(cJ,ce).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cO=[...(0,aF.gN)(cJ),...(0,aF.f8)(cJ)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cP=(0,aF.k0)(cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cQ=(0,aF.qK)(cJ,Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cR=(0,aF.iC)(cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cS=(0,aF.BV)(cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cT=[...cK,...cL,...cM,...cN,...cO,...cP,...cQ,...cR,...cS,...(0,aF.Ty)(Q).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),...au(cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`)],cU=new Set(cQ),cV=Date.now(),cW=cT.filter(a=>!cU.has(a));a7(cs,a6({type:"llm_review",roleId:"quality-repair",status:cW.length>0?"running":"success",message:cW.length>0?`正在进行精准质量修复:${cW.length} 个问题`:"未发现需要精准修复的问题",details:cW,progress:{current:1,total:Math.max(1,cW.length),label:"质量修复"}},{subtitle:"精准质量修复"})),U(Q,cs);let cX=await X(()=>ba(bD,"local-patch-quality-repair",()=>bn({markdown:cJ,template:H,chapters:Q,promptTexts:ar,requirement:a.requirement,issues:cW,forbidDrawingImages:ci,strategy:bA,diagnostics:bD,signal:a.signal}),{issues:cW.length}),cs);cX.stage&&(cX.stage.message=a8(cX.stage.message||"质量修复完成",cV)),aQ(a.signal);let cY=cX.stage?[...cs,cI.stage,cX.stage]:[...cs,cI.stage],cZ=cX.chapters,c$=aD({...ct,chapters:cZ,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}),c_=(0,aF.yw)(c$,cZ).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(c_.length>0){let b=Date.now();a7(cY,a6({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${c_.length} 个问题`,details:c_.map(a=>a.message),progress:{current:1,total:c_.length,label:"小节补写"}},{subtitle:"小节内容补写"})),U(cZ,cY);let c=[...cZ];for(let b=0;b<cZ.length;b+=bA.maxChapterConcurrency){aQ(a.signal);let d=cZ.slice(b,b+bA.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=c_.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=be.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bz.chapterTargets.get(b.id)||1200,f=bg(d,a5);try{let g=await a1(g=>bS({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:bi(aV,d,f),targetWords:e,forbidDrawingImages:ci,maxSectionConcurrency:bA.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:as(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}cZ=c;let d=(0,aF.qK)(aD({...ct,chapters:cZ,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}),cZ);a7(cY,a6({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:a8(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),U(cZ,cY)}let c0=(0,aE.fW)(bz,cZ.map(a=>a.content).join("\n\n"));if(bA.enableDocumentBudgetExpansion&&bz.minChars&&c0.currentChars<Math.floor(.9*bz.minChars)&&(!bz.maxChars||c0.currentChars<bz.maxChars)){let b=Date.now(),c=c0.currentChars;a7(cY,a6({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bz.minChars} 字`,`章节数:${cZ.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),U(cZ,cY),cZ=await X(()=>bU({template:H,chapters:cZ,budget:bz,promptTexts:ar,requirement:a.requirement,forbidDrawingImages:ci,signal:a.signal}),cY);let d=(0,aE.fW)(bz,cZ.map(a=>a.content).join("\n\n"));a7(cY,a6({type:"validation",roleId:"document-budget-repair",status:bz.minChars&&d.currentChars<bz.minChars?"fallback":"success",message:a8(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let c1=aC(aD({...ct,chapters:cZ,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}),cZ,{forbidDrawingImages:ci}),c2=c1.chapters,c3=c1.markdown,c4=c2.map(a=>{let b=cZ.find(b=>b.id===a.id||b.title===a.title);return{...a,sections:b?.sections||[]}}),c5=(0,aF.yw)(c3,c4).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(c5.length>0){let b=Date.now();a7(cY,a6({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${c5.length} 个问题`,details:c5.map(a=>a.message),progress:{current:1,total:c5.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),U(c2,cY);let c=[...c2];for(let b=0;b<c2.length;b+=bA.maxChapterConcurrency){aQ(a.signal);let d=c2.slice(b,b+bA.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=c5.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=be.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bz.chapterTargets.get(b.id)||1200,f=bg(d,a5);try{let g=await a1(g=>bS({template:H,chapter:d,content:b.content,evidence:b.evidence.slice(0,10),missingFacts:b.missingFacts,promptTexts:ar,projectContext:bu,requirement:a.requirement,roleContext:bi(aV,d,f),targetWords:e,forbidDrawingImages:ci,maxSectionConcurrency:bA.maxSectionConcurrency,forcedSections:c.slice(0,2),signal:g}),6e4,a.signal);if(!g)return b;let h=b.sections?.length?b.sections:as(g);return{...b,content:g,markdown:g,sections:h}}catch{return b}}))).forEach((a,d)=>{c[b+d]=a})}c2=(c1=aC(aD({...ct,chapters:c,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}),c,{forbidDrawingImages:ci})).chapters,c3=c1.markdown;let d=(0,aF.qK)(c3,c2);a7(cY,a6({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:a8(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),U(c2,cY)}c2=(c1=aC(aD({...ct,chapters:c2,validationIssues:ch,exportGate:ct.exportGate,executionStages:cs}),c2,{forbidDrawingImages:ci})).chapters,c3=c1.markdown;let c6=[...cK];(ch=(0,aF.kQ)(al,[...ch,...c6.map(a=>({level:"warning",message:a}))],ce,c2,c3,ad,ac)).push(...S({markdown:c3,spec:al,summary:aj})),ch.push(...W({markdown:c3,facts:b7,summary:aj,profile:am})),ch.push(...T(c3,aj)),ch.push(...(0,aF.gN)(c3)),ch.push(...(0,aF.f8)(c3)),ch.push(...(0,aF.k0)(c3)),ch.push(...(0,aF.qK)(c3,c2)),ch.push(...(0,aF.iC)(c3)),ch.push(...(0,aF.BV)(c3)),ch.push(...au(c3)),ch.push(...(0,aF.Ty)(c2)),ch.push(...(0,aF.N1)(c3,ce)),ch.push(...(0,aF.bM)(c3)),ch.push(...(0,aF.M$)(c3,ac)),ch.push(...(0,aF.AC)(c3,c2)),ch.push(...(0,aF.mR)(c3,H));let c7=(0,aE.ty)(bz,c3),c8=(0,aE.PE)(H.generationSettings||H.exportSettings,c3).filter(a=>!(bz.minPages&&/低于目标页数/u.test(a.message)));ch.push(...c8),ch.push(...c7),ch.push(...aA(c3,H));let c9=(0,aF.Ai)(ch,ce,c2),da=c9.blockingIssues.length,db=(0,aF.Ff)(ch);bD.quality.blockingCount+=db.blocking,bD.quality.importantCount+=db.important,bD.quality.minorCount+=db.minor;let dc=cY.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:da>0?"failed":"success",message:`阻断 ${da},问题 ${ch.length}`}:"export_ready"===a.type?{...a,status:c9.passed?"success":"failed",message:c9.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bD.llm.currentLimit=aX();let dd=[...bD.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");dc.push(a6({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bD.llm.calls} 次,失败 ${bD.llm.failures} 次,排队 ${bD.llm.throttledWaits} 次/${Math.round(bD.llm.throttledWaitMs/1e3)} 秒,检索 ${bD.evidence.searchQueries} 次/${Math.round(bD.evidence.searchMs/1e3)} 秒,证据上下文 ${bD.evidence.contextChars} 字,噪声过滤 ${bD.evidence.filteredNoise} 条,质量问题 阻断${bD.quality.blockingCount}/重要${bD.quality.importantCount}/轻微${bD.quality.minorCount},自动限流调整 ${bD.llm.limitAdjustments} 次${dd?`,Top耗时:${dd}`:""}`},{subtitle:"后台诊断"}));let de=c2.map(a=>({...a,evidence:ab(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...ct,chapters:de,validationIssues:ch,exportGate:c9,executionStages:dc,partialChapters:c2.map(a=>({id:a.id,title:a.title,chars:(0,aE.V7)(a.content),status:bY(a,bz.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:de,reviewMetadata:{chapterSummaries:cz,globalIssues:cC.issues,diagnostics:bD}},markdown:c3}}async function b5(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=bq(f,(0,d.Vh)(b)),j=b3(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=>bp(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=ab(k.filter(a=>bp(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,Y.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(ac),"",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
|
+
${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)}}};
|