@customize-agent/server 4.0.67 → 4.0.69

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +8 -10
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/1936.js +3 -3
  5. package/.next/server/chunks/6697.js +57 -53
  6. package/.next/server/chunks/8204.js +1 -1
  7. package/.next/server/chunks/9301.js +3 -3
  8. package/.next/server/middleware-build-manifest.js +1 -1
  9. package/.next/server/pages/404.html +1 -1
  10. package/.next/server/pages/500.html +1 -1
  11. package/.next/server/pages/_error.js +1 -1
  12. package/.next/server/pages/api/assets/generated/preview.js +1 -1
  13. package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
  14. package/.next/server/pages/api/assets/generated.js +1 -1
  15. package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
  16. package/.next/server/pages/api/config/embedding/healthCheck.js.nft.json +1 -1
  17. package/.next/server/pages/api/context.js +2 -16
  18. package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
  19. package/.next/server/pages/api/documents/export.js +1 -1
  20. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  21. package/.next/server/pages/api/documents/generate.js +1 -1
  22. package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
  23. package/.next/server/pages/api/documents/generated/[id].js +1 -1
  24. package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
  25. package/.next/server/pages/api/documents/generated.js +1 -1
  26. package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
  27. package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
  28. package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
  29. package/.next/server/pages/api/jobs.js.nft.json +1 -1
  30. package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
  31. package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
  32. package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
  33. package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
  34. package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
  35. package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
  36. package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
  37. package/.next/server/pages/api/kb/files.js.nft.json +1 -1
  38. package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
  39. package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
  40. package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
  41. package/.next/server/pages/api/kb/search.js.nft.json +1 -1
  42. package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
  43. package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
  44. package/.next/server/pages/api/kb/upload/progress.js.nft.json +1 -1
  45. package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
  46. package/.next/server/pages/asset-library.html +1 -1
  47. package/.next/server/pages/context/long-term.html +1 -1
  48. package/.next/server/pages/context/short-term.html +1 -1
  49. package/.next/server/pages/document-roles.html +1 -1
  50. package/.next/server/pages/documents.html +1 -1
  51. package/.next/server/pages/guide.html +1 -1
  52. package/.next/server/pages/index.html +1 -1
  53. package/.next/server/pages/knowledge/file-detail.html +1 -1
  54. package/.next/server/pages/knowledge/files.html +1 -1
  55. package/.next/server/pages/knowledge/manage.html +1 -1
  56. package/.next/server/pages/knowledge/search.html +1 -1
  57. package/.next/server/pages/knowledge.html +1 -1
  58. package/.next/server/pages/models.html +1 -1
  59. package/.next/server/pages/overview.html +1 -1
  60. package/.next/server/pages/prompt.html +1 -1
  61. package/.next/server/pages/settings.html +1 -1
  62. package/.next/server/pages/system/logs.html +1 -1
  63. package/.next/server/pages-manifest.json +23 -23
  64. package/.next/static/G68XtEOLp5i0eWArclO6w/_buildManifest.js +1 -0
  65. package/.next/static/chunks/63-dd8eeb8edd766bae.js +4 -0
  66. package/.next/static/chunks/642-708b928fbafc6c20.js +8 -0
  67. package/.next/static/chunks/pages/{_app-d1257da7895866ad.js → _app-dd841161c7d0b39e.js} +1 -1
  68. package/.next/static/chunks/pages/asset-library-91bd2baa09727e0a.js +1 -0
  69. package/.next/static/chunks/pages/documents-84fe27cb0fbbb040.js +1 -0
  70. package/.next/static/chunks/pages/{guide-295174493709ecbb.js → guide-61bea94f27710467.js} +1 -1
  71. package/package.json +4 -4
  72. package/.next/static/chunks/20-86ac6910225cce4e.js +0 -8
  73. package/.next/static/chunks/499-d6bcc76195b28550.js +0 -4
  74. package/.next/static/chunks/940-7cb66111eee2f9fb.js +0 -1
  75. package/.next/static/chunks/pages/asset-library-1dc916735fd12e11.js +0 -1
  76. package/.next/static/chunks/pages/documents-8d5b7f1515d9149b.js +0 -1
  77. package/.next/static/gvUbtNR4QcuhHNBdOq2dZ/_buildManifest.js +0 -1
  78. /package/.next/static/{gvUbtNR4QcuhHNBdOq2dZ → G68XtEOLp5i0eWArclO6w}/_ssgManifest.js +0 -0
@@ -1,16 +1,16 @@
1
1
  "use strict";exports.id=6697,exports.ids=[6697],exports.modules={2323:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},23328:(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}
2
2
  ${a.category}
3
3
  ${a.format}
4
- ${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}}},56697:(a,b,c)=>{c.d(b,{h0:()=>al,bV:()=>am,OX:()=>ca,jG:()=>ah,R1:()=>cb,Bh:()=>aj,xm:()=>ak});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(77598),i=c(95393),j=c(19898),k=c(96770),l=c(23328),m=c(99842),n=c(2323),o=c(89952),p=c(79181);let q=[{id:"bid",label:"投标文件",patterns:[/投标|标书|技术标|商务标/iu],output:["投标文件"]},{id:"construction",label:"施工组织设计",patterns:[/施工组织|施工方案|施工部署|施工方法/iu],output:["施工组织设计"]},{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案/iu],output:["实施方案"]}],r=[{id:"tender",label:"招投标资料",patterns:[/招标|投标|标书|补遗|补疑|答疑|澄清/iu],output:["招标编号","招标文件要求","补遗答疑要求"]},{id:"scope",label:"工程范围",patterns:[/施工|工程|改造|建设|装修|安装|专业|范围|工作内容/iu],output:["施工范围","专业工程范围"]},{id:"quantity",label:"清单图纸",patterns:[/清单|工程量|图纸|图号|平面|系统图|设计说明/iu],output:["工程量清单范围","图纸范围"]},{id:"quality",label:"质量验收",patterns:[/质量|验收|合格|标准|规范/iu],output:["质量要求"]},{id:"schedule",label:"工期进度",patterns:[/工期|进度|计划|节点|里程碑/iu],output:["工期要求","进度节点要求"]},{id:"safety",label:"安全环保",patterns:[/安全|文明|环保|绿色|扬尘|消防|应急/iu],output:["安全要求","安全文明要求","环保绿色施工要求"]},{id:"materials",label:"材料设备",patterns:[/材料|设备|品牌|采购|供应|厂家/iu],output:["材料设备要求","推荐品牌要求"]},{id:"risk",label:"风险约束",patterns:[/风险|重点|难点|约束|限制|现场|交通|场地/iu],output:["重点难点约束"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议/iu],output:["背景依据","分析结论","风险建议"]}],s=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则/iu],output:["项目名称","项目资料范围","施工范围"]},{id:"implementation",label:"实施章节",patterns:[/施工|方法|部署|实施|范围|组织/iu],output:["施工范围","专业工程范围","工程量清单范围","图纸范围"]},{id:"controls",label:"控制章节",patterns:[/质量|工期|进度|安全|文明|环保|验收/iu],output:["质量要求","工期要求","安全要求","安全文明要求"]},{id:"materials",label:"材料章节",patterns:[/材料|设备|品牌|采购|供应/iu],output:["材料设备要求","推荐品牌要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急/iu],output:["重点难点约束","风险建议"]}],t=[{id:"tender",label:"招标文件",patterns:[/招标|招标文件|示范文本|tender/iu],output:["tender_document"]},{id:"addendum",label:"补遗答疑",patterns:[/补遗|补疑|答疑|澄清|变更|addendum/iu],output:["addendum"]},{id:"boq",label:"工程量清单",patterns:[/工程量清单|清单|分部分项|boq/iu],output:["bill_of_quantities"]},{id:"control-price",label:"最高限价",patterns:[/最高投标限价|控制价|限价|control\s*price/iu],output:["control_price"]},{id:"drawing",label:"图纸",patterns:[/图纸|图号|平面图|系统图|设计说明|\.dwg$|drawing/iu],output:["drawings"]},{id:"brand",label:"品牌材料",patterns:[/推荐品牌|品牌|材料设备|设备|采购/iu],output:["brand_recommendation"]},{id:"schedule-quality-safety",label:"工期质量安全",patterns:[/质量|工期|安全|文明|验收|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围专业",patterns:[/施工范围|改造|建设|安装|装饰|专业|工作内容/iu],output:["construction_scope"]},{id:"technical",label:"技术规范",patterns:[/技术规范|技术要求|规范|标准|规程/iu],output:["technical_specification"]},{id:"risk",label:"风险约束",patterns:[/风险|重点|难点|约束|限制|现场|交通|场地/iu],output:["risk_constraints"]}];function u(a,b){let c=new Set;for(let d of b)if(d.patterns.some(b=>b.test(a)))for(let a of d.output)c.add(a);return[...c]}function v(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function w(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function x(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function y(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,p.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)))}let z=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],A=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function B(a){return[...new Set(a.filter(Boolean))]}function C(a){return B(a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).map(a=>a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()).filter(a=>/项目|工程|标段|合同段/iu.test(a)&&a.length>=6)).slice(0,12)}function D(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function E(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function F(a){let b=E(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function G(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}let H=[["土建砌筑",/砌筑|砌块|构造柱|混凝土|砂浆|灰缝|钢筋|植筋|墙体|圈梁/u],["防水工程",/防水|闭水|蓄水|JS|涂膜|卷材|阴阳角|管根|上翻/u],["装饰装修",/地砖|墙砖|吊顶|铝扣板|涂料|腻子|乳胶漆|水磨石|面层|基层|抹灰/u],["给排水",/给水|排水|PPR|PVC|管道|阀门|水压|通球|闭水|检查井|隔油池/u],["电气工程",/电气|配电|电缆|桥架|线管|开关|插座|照明|绝缘|接地|通电/u],["消防工程",/消防|消火栓|喷淋|报警|联动|防火|灭火器|水泵接合器/u],["暖通排烟",/暖通|通风|排烟|风管|风机|风口|油烟|净化|排风|防火阀/u],["厨房设备",/厨房|灶具|洗菜池|设备|明厨亮灶|食品|不锈钢|操作台/u],["安全文明",/临时用电|动火|高处|扬尘|噪声|围挡|应急|文明施工|安全教育/u]],I=/(?:[A-Z]{1,4}\d+(?:\.\d+)?|Ma?\d+(?:\.\d+)?|C\d{2,3}|DN\d+|φ\d+|Φ\d+|\d+(?:\.\d+)?\s*(?:mm|cm|m|㎡|m²|m3|MPa|kPa|℃|%|小时|h|日历天|天|台|套|个|根|遍|倍|分钟|min)|\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\s*mm|\d+\s*@\s*\d+)/giu,J=/\d+(?:\.\d+)?\s*(?:㎡|m²|m3|立方米|平方米|米|台|套|个|根|项|批|所|人|班组|工日|学校|校区|片区)/giu,K=/\d+(?:\.\d+)?\s*(?:日历天|工作日|小时内|小时|h|分钟|min|日内|天内|个月|周|天)|(?:每日|每天|每周|每月|每班|日清|周结|旬考核)/giu,L=/\d+(?:\.\d+)?\s*(?:万元|元|%\/天|‰|%|违约金|处罚|合同价|中标价)/giu,M=/(?:每日|每天|每周|每月|每班|每道工序|不少于\d+次|\d+次|\d+%|100%|全数|全部|一次性|每月不少于一次)/giu,N=/\d+(?:\.\d+)?\s*(?:人|班组|台|套|辆|名|个片区|片区)|(?:项目经理|安全员|质量员|施工员|材料员|资料员|专业工程师|专职巡查|应急小组)/giu,O=/\b(?:GB|GB\/T|JGJ|JGJ\/T|CJJ|CJJ\/T|CECS|DB\d*|GA)\s*\d+(?:[-—]\d+)?\b/giu,P=["施工准备","基层处理","测量放线","弹线","样板","复核","安装","连接","热熔","粘结","涂刷","附加层","隐蔽验收","调试","联动","养护","成品保护"],Q=["验收","检测","试验","复试","闭水","蓄水","打压","水压","通球","绝缘","接地","联动","允许偏差","合格"],R=["质量控制","饱满度","平整度","垂直度","偏差","强度","厚度","间距","标高","坡度","密封","防渗","防火"],S=["安全","临电","动火","高处","交叉作业","防护","扬尘","噪声","应急","消防","有限空间"],T=["危大工程","危险性较大","专项施工方案","专家论证","有限空间","高处作业","动火作业","临时用电","拆除工程","起重吊装","脚手架","深基坑","模板支撑"],U=["分部分项","分项工程","拆除","砌筑","防水","装饰","吊顶","涂料","给排水","电气","消防","暖通","排烟","厨房设备","明厨亮灶","隔油池"],V=["严格按照规范","满足设计要求","加强质量控制","做好安全管理","确保施工质量","按要求验收","结合现场情况","加强协调","做好成品保护","相关要求","规范要求"];function W(a){return a.replace(/\s+/gu," ").trim()}function X(a){return[...new Set(a.map(a=>a.trim()).filter(Boolean))]}function Y(a,b){b.lastIndex=0;let c=[...a.matchAll(b)].map(a=>a[0]);return b.lastIndex=0,X(c)}function Z(a,b){return b.filter(b=>a.includes(b))}function $(a){return[a.location,a.workItem,a.material,a.equipment,a.discipline].filter(Boolean).join(" / ")}function _(a){return a.filter(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].length>0)}function aa(a){let b=[],c=a.markdown.replace(/\s+/gu,"");for(let d of a.assignments){let a=_(d.facts);if(a.length<3)continue;let e=X(a.map($).filter(a=>a.length>=2)).slice(0,18),f=X(a.flatMap(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]]).map(a=>a.replace(/\s+/gu,""))).slice(0,30),g=e.filter(a=>c.includes(a.replace(/\s+/gu,""))),h=f.filter(a=>c.includes(a));e.length>=3&&g.length/e.length<.45&&b.push({level:"warning",message:`${d.chapterTitle} 量化对象覆盖不足:${g.length}/${e.length}`,suggestion:"请按施工对象、部位、片区、学校或分项逐项补齐适用范围、工程量、工期/资源和控制要点,避免只写一个笼统数量。"}),f.length>=5&&h.length/f.length<.35&&b.push({level:"warning",message:`${d.chapterTitle} 量化数值使用不足:${h.length}/${f.length}`,suggestion:"请把资料中的日期、数量、单位、规格、工期节点、频次、资源数量写入对应章节;无依据不得编造。"})}return b.slice(0,12)}function ab(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function ac(){return e.join(ab(),"document-templates.json")}function ad(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:"project_fact"})):[],builtIn:!1}}function ae(){try{let a=ac();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(ad)}catch{return[]}}function af(a){d.writeFileSync(ac(),JSON.stringify(a.map(ad),null,2),"utf-8")}function ag(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(ab(),"prompts.json"),"utf-8"));b=Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{b=[]}for(let f of a){let a=f.promptId;if(a.startsWith("custom:")){let d=b.find(b=>b.id===a);d&&c.push({id:a,roleId:f.roleId,name:d.name,content:d.content});continue}if(a.startsWith("file:")){let b=a.slice(5);d.existsSync(b)&&c.push({id:a,roleId:f.roleId,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")})}}return c}function ah(){let a=(0,p.V)().templates,b=ae().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function ai(a){return ah().find(b=>b.id===a)}function aj(a){let b=ad(a),c=ae().filter(a=>a.id!==b.id);return c.push(b),af(c),b}async function ak(a,b=(0,l.aY)()){let c=ai(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,o.XB)("prompt"),g=(0,o.XB)("file"),h=bh(c),i=bi(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let j=bj(c),k=bk(c);0===j.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let m=e.resolve(b),n=await (0,l.Qh)().getProject(m);c.builtIn&&await n.incrementalIndex();let p=(0,l.Yy)(m);0===k.length&&d.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let q=new Map(p.map(a=>[a.relativePath,a])),r=k.map(a=>{let b=g.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)}}),s=ag(j);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:r,promptDiagnostics:j.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}}),issues:d}}function al(a){if(new Set((0,p.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");af(ae().filter(b=>b.id!==a))}function am(a){let b=ai(a);if(!b)throw Error("Document template not found");let c=ad({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=ae();return d.push(c),af(d),c}let an=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ao=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function ap(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(ao,"").slice(0,40)})`:""}`}function aq(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(an,"").replace(ao,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function ar(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase(),d=aq(b);return d.length>20?d.slice(0,4e3):[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d.slice(0,4e3)}(a.filePath,a.content)})).sort((a,b)=>b.score-a.score).filter(a=>{let b=function(a){let b=a.content.replace(/\s+/gu," ").trim();return`${a.filePath}:${a.sectionTitle||""}:${(0,h.createHash)("sha1").update(b).digest("hex")}`}(a);return!c.has(b)&&(c.add(b),!0)}).slice(0,b)}function as(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function at(a,b=0){return`- ${ap(a,b)}:${aq(a.content).replace(/\s+/gu," ").slice(0,260)}`}function au(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/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"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.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}(c.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,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
5
- ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>aF(a,b)||c.includes(b)))]}(c,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),d.set(c.filePath,f)}let f=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of f)g[a.kind].push(a);let h=[`内部资料包:文本片段 ${c.length} 条、结构化资料 ${f.length} 个。`,`资料类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格/清单 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、图纸 ${g.map.length}、其他 ${g.attachment.length}。`,"正文必须只写资料中的工程事实、参数、数量、做法和控制措施,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:f,byKind:g,summary:h}}function av(a){let b=a.resources.slice(0,20).map((a,b)=>[`- 资料:${ap(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(aq).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map((a,b)=>`${ap(a,b)}
4
+ ${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}}},56697:(a,b,c)=>{c.d(b,{h0:()=>al,bV:()=>am,OX:()=>cw,jG:()=>ah,R1:()=>cx,Bh:()=>aj,xm:()=>ak});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(77598),i=c(95393),j=c(19898),k=c(96770),l=c(23328),m=c(99842),n=c(2323),o=c(89952),p=c(79181);let q=[{id:"bid",label:"投标文件",patterns:[/投标|标书|技术标|商务标/iu],output:["投标文件"]},{id:"construction",label:"施工组织设计",patterns:[/施工组织|施工方案|施工部署|施工方法/iu],output:["施工组织设计"]},{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案/iu],output:["实施方案"]}],r=[{id:"tender",label:"招投标资料",patterns:[/招标|投标|标书|补遗|补疑|答疑|澄清/iu],output:["招标编号","招标文件要求","补遗答疑要求"]},{id:"scope",label:"工程范围",patterns:[/施工|工程|改造|建设|装修|安装|专业|范围|工作内容/iu],output:["施工范围","专业工程范围"]},{id:"quantity",label:"清单图纸",patterns:[/清单|工程量|图纸|图号|平面|系统图|设计说明/iu],output:["工程量清单范围","图纸范围"]},{id:"quality",label:"质量验收",patterns:[/质量|验收|合格|标准|规范/iu],output:["质量要求"]},{id:"schedule",label:"工期进度",patterns:[/工期|进度|计划|节点|里程碑/iu],output:["工期要求","进度节点要求"]},{id:"safety",label:"安全环保",patterns:[/安全|文明|环保|绿色|扬尘|消防|应急/iu],output:["安全要求","安全文明要求","环保绿色施工要求"]},{id:"materials",label:"材料设备",patterns:[/材料|设备|品牌|采购|供应|厂家/iu],output:["材料设备要求","推荐品牌要求"]},{id:"risk",label:"风险约束",patterns:[/风险|重点|难点|约束|限制|现场|交通|场地/iu],output:["重点难点约束"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议/iu],output:["背景依据","分析结论","风险建议"]}],s=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则/iu],output:["项目名称","项目资料范围","施工范围"]},{id:"implementation",label:"实施章节",patterns:[/施工|方法|部署|实施|范围|组织/iu],output:["施工范围","专业工程范围","工程量清单范围","图纸范围"]},{id:"controls",label:"控制章节",patterns:[/质量|工期|进度|安全|文明|环保|验收/iu],output:["质量要求","工期要求","安全要求","安全文明要求"]},{id:"materials",label:"材料章节",patterns:[/材料|设备|品牌|采购|供应/iu],output:["材料设备要求","推荐品牌要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急/iu],output:["重点难点约束","风险建议"]}],t=[{id:"tender",label:"招标文件",patterns:[/招标|招标文件|示范文本|tender/iu],output:["tender_document"]},{id:"addendum",label:"补遗答疑",patterns:[/补遗|补疑|答疑|澄清|变更|addendum/iu],output:["addendum"]},{id:"boq",label:"工程量清单",patterns:[/工程量清单|清单|分部分项|boq/iu],output:["bill_of_quantities"]},{id:"control-price",label:"最高限价",patterns:[/最高投标限价|控制价|限价|control\s*price/iu],output:["control_price"]},{id:"drawing",label:"图纸",patterns:[/图纸|图号|平面图|系统图|设计说明|\.dwg$|drawing/iu],output:["drawings"]},{id:"brand",label:"品牌材料",patterns:[/推荐品牌|品牌|材料设备|设备|采购/iu],output:["brand_recommendation"]},{id:"schedule-quality-safety",label:"工期质量安全",patterns:[/质量|工期|安全|文明|验收|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围专业",patterns:[/施工范围|改造|建设|安装|装饰|专业|工作内容/iu],output:["construction_scope"]},{id:"technical",label:"技术规范",patterns:[/技术规范|技术要求|规范|标准|规程/iu],output:["technical_specification"]},{id:"risk",label:"风险约束",patterns:[/风险|重点|难点|约束|限制|现场|交通|场地/iu],output:["risk_constraints"]}];function u(a,b){let c=new Set;for(let d of b)if(d.patterns.some(b=>b.test(a)))for(let a of d.output)c.add(a);return[...c]}function v(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function w(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function x(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function y(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,p.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)))}let z=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],A=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function B(a){return[...new Set(a.filter(Boolean))]}function C(a){return B(a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).map(a=>a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()).filter(a=>/项目|工程|标段|合同段/iu.test(a)&&a.length>=6)).slice(0,12)}function D(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function E(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function F(a){let b=E(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function G(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}let H=[["土建砌筑",/砌筑|砌块|构造柱|混凝土|砂浆|灰缝|钢筋|植筋|墙体|圈梁/u],["防水工程",/防水|闭水|蓄水|JS|涂膜|卷材|阴阳角|管根|上翻/u],["装饰装修",/地砖|墙砖|吊顶|铝扣板|涂料|腻子|乳胶漆|水磨石|面层|基层|抹灰/u],["给排水",/给水|排水|PPR|PVC|管道|阀门|水压|通球|闭水|检查井|隔油池/u],["电气工程",/电气|配电|电缆|桥架|线管|开关|插座|照明|绝缘|接地|通电/u],["消防工程",/消防|消火栓|喷淋|报警|联动|防火|灭火器|水泵接合器/u],["暖通排烟",/暖通|通风|排烟|风管|风机|风口|油烟|净化|排风|防火阀/u],["厨房设备",/厨房|灶具|洗菜池|设备|明厨亮灶|食品|不锈钢|操作台/u],["安全文明",/临时用电|动火|高处|扬尘|噪声|围挡|应急|文明施工|安全教育/u]],I=/(?:[A-Z]{1,4}\d+(?:\.\d+)?|Ma?\d+(?:\.\d+)?|C\d{2,3}|DN\d+|φ\d+|Φ\d+|\d+(?:\.\d+)?\s*(?:mm|cm|m|㎡|m²|m3|MPa|kPa|℃|%|小时|h|日历天|天|台|套|个|根|遍|倍|分钟|min)|\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\s*mm|\d+\s*@\s*\d+)/giu,J=/\d+(?:\.\d+)?\s*(?:㎡|m²|m3|立方米|平方米|米|台|套|个|根|项|批|所|人|班组|工日|学校|校区|片区)/giu,K=/\d+(?:\.\d+)?\s*(?:日历天|工作日|小时内|小时|h|分钟|min|日内|天内|个月|周|天)|(?:每日|每天|每周|每月|每班|日清|周结|旬考核)/giu,L=/\d+(?:\.\d+)?\s*(?:万元|元|%\/天|‰|%|违约金|处罚|合同价|中标价)/giu,M=/(?:每日|每天|每周|每月|每班|每道工序|不少于\d+次|\d+次|\d+%|100%|全数|全部|一次性|每月不少于一次)/giu,N=/\d+(?:\.\d+)?\s*(?:人|班组|台|套|辆|名|个片区|片区)|(?:项目经理|安全员|质量员|施工员|材料员|资料员|专业工程师|专职巡查|应急小组)/giu,O=/\b(?:GB|GB\/T|JGJ|JGJ\/T|CJJ|CJJ\/T|CECS|DB\d*|GA)\s*\d+(?:[-—]\d+)?\b/giu,P=["施工准备","基层处理","测量放线","弹线","样板","复核","安装","连接","热熔","粘结","涂刷","附加层","隐蔽验收","调试","联动","养护","成品保护"],Q=["验收","检测","试验","复试","闭水","蓄水","打压","水压","通球","绝缘","接地","联动","允许偏差","合格"],R=["质量控制","饱满度","平整度","垂直度","偏差","强度","厚度","间距","标高","坡度","密封","防渗","防火"],S=["安全","临电","动火","高处","交叉作业","防护","扬尘","噪声","应急","消防","有限空间"],T=["危大工程","危险性较大","专项施工方案","专家论证","有限空间","高处作业","动火作业","临时用电","拆除工程","起重吊装","脚手架","深基坑","模板支撑"],U=["分部分项","分项工程","拆除","砌筑","防水","装饰","吊顶","涂料","给排水","电气","消防","暖通","排烟","厨房设备","明厨亮灶","隔油池"],V=["严格按照规范","满足设计要求","加强质量控制","做好安全管理","确保施工质量","按要求验收","结合现场情况","加强协调","做好成品保护","相关要求","规范要求"];function W(a){return a.replace(/\s+/gu," ").trim()}function X(a){return[...new Set(a.map(a=>a.trim()).filter(Boolean))]}function Y(a,b){b.lastIndex=0;let c=[...a.matchAll(b)].map(a=>a[0]);return b.lastIndex=0,X(c)}function Z(a,b){return b.filter(b=>a.includes(b))}function $(a){return[a.location,a.workItem,a.material,a.equipment,a.discipline].filter(Boolean).join(" / ")}function _(a){return a.filter(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].length>0)}function aa(a){let b=[],c=a.markdown.replace(/\s+/gu,"");for(let d of a.assignments){let a=_(d.facts);if(a.length<3)continue;let e=X(a.map($).filter(a=>a.length>=2)).slice(0,18),f=X(a.flatMap(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]]).map(a=>a.replace(/\s+/gu,""))).slice(0,30),g=e.filter(a=>c.includes(a.replace(/\s+/gu,""))),h=f.filter(a=>c.includes(a));e.length>=3&&g.length/e.length<.45&&b.push({level:"warning",message:`${d.chapterTitle} 量化对象覆盖不足:${g.length}/${e.length}`,suggestion:"请按施工对象、部位、片区、学校或分项逐项补齐适用范围、工程量、工期/资源和控制要点,避免只写一个笼统数量。"}),f.length>=5&&h.length/f.length<.35&&b.push({level:"warning",message:`${d.chapterTitle} 量化数值使用不足:${h.length}/${f.length}`,suggestion:"请把资料中的日期、数量、单位、规格、工期节点、频次、资源数量写入对应章节;无依据不得编造。"})}return b.slice(0,12)}function ab(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function ac(){return e.join(ab(),"document-templates.json")}function ad(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:"project_fact"})):[],builtIn:!1}}function ae(){try{let a=ac();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(ad)}catch{return[]}}function af(a){d.writeFileSync(ac(),JSON.stringify(a.map(ad),null,2),"utf-8")}function ag(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(ab(),"prompts.json"),"utf-8"));b=Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{b=[]}for(let f of a){let a=f.promptId;if(a.startsWith("custom:")){let d=b.find(b=>b.id===a);d&&c.push({id:a,roleId:f.roleId,name:d.name,content:d.content});continue}if(a.startsWith("file:")){let b=a.slice(5);d.existsSync(b)&&c.push({id:a,roleId:f.roleId,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")})}}return c}function ah(){let a=(0,p.V)().templates,b=ae().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function ai(a){return ah().find(b=>b.id===a)}function aj(a){let b=ad(a),c=ae().filter(a=>a.id!==b.id);return c.push(b),af(c),b}async function ak(a,b=(0,l.aY)()){let c=ai(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,o.XB)("prompt"),g=(0,o.XB)("file"),h=by(c),i=bz(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let j=bA(c),k=bB(c);0===j.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let m=e.resolve(b),n=await (0,l.Qh)().getProject(m);c.builtIn&&await n.incrementalIndex();let p=(0,l.Yy)(m);0===k.length&&d.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let q=new Map(p.map(a=>[a.relativePath,a])),r=k.map(a=>{let b=g.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)}}),s=ag(j);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:r,promptDiagnostics:j.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}}),issues:d}}function al(a){if(new Set((0,p.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");af(ae().filter(b=>b.id!==a))}function am(a){let b=ai(a);if(!b)throw Error("Document template not found");let c=ad({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=ae();return d.push(c),af(d),c}let an=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ao=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function ap(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(ao,"").slice(0,40)})`:""}`}function aq(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(an,"").replace(ao,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function ar(a){let b=aq(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 as(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=aq(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=ar(d);return d.length>20&&f.shouldUse?d.slice(0,4e3):d.length>80&&f.noiseScore<.9?d.slice(0,1600):[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d.slice(0,1200)}(a.filePath,a.content),c=ar(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)),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,h.createHash)("sha1").update(b).digest("hex")}`}(a.item);return!d.has(b)&&(d.add(b),!0)}).slice(0,b);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+=i.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 i.map(a=>a.item)}function at(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function au(a,b=0){return`- ${ap(a,b)}:${aq(a.content).replace(/\s+/gu," ").slice(0,260)}`}function av(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/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"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.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}(c.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,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
5
+ ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>aG(a,b)||c.includes(b)))]}(c,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),d.set(c.filePath,f)}let f=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of f)g[a.kind].push(a);let h=[`内部资料包:文本片段 ${c.length} 条、结构化资料 ${f.length} 个。`,`资料类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格/清单 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、图纸 ${g.map.length}、其他 ${g.attachment.length}。`,"正文必须只写资料中的工程事实、参数、数量、做法和控制措施,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:f,byKind:g,summary:h}}function aw(a){let b=a.resources.slice(0,20).map((a,b)=>[`- 资料:${ap(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(aq).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map((a,b)=>`${ap(a,b)}
6
6
  类型:${a.processingType||"reference"}
7
7
  章节/片段:${a.sectionTitle?.replace(ao,"")||"资料片段"}
8
8
  内容:${aq(a.content).replace(/\s+/gu," ").slice(0,900)}`).join("\n\n---\n\n");return[a.summary,b?`结构化资料:
9
9
  ${b}`:"",c?`文本/附件片段:
10
- ${c}`:""].filter(Boolean).join("\n\n")}let aw="[零〇一二三四五六七八九十百千万两]+";function ax(a){return 0===a.trim().length}function ay(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]*/u,"").trim()}function az(a){return ay(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function aA(a){let b=a.trim(),c=az(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))&&!aC(c)}function aB(a,b){let c=ay(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 aC(a){return/见(?:招标|公告|文件|图纸)|按(?:图纸|设计要求|相关)|质量标准[::]|招标范围[::]|工程量清单.*图纸设计依据/u.test(a)}function aD(a,b){let c=new Set;return a.filter(a=>{var d;let e=az(a.title);if(!e)return!1;return!(!b?.preserveExplicitOutline&&(c.has(e)||aC(e)||b?.template&&(d=e,aV(b.template).some(a=>!!a.minLength&&d.length<a.minLength||!!a.maxLength&&d.length>a.maxLength||a.forbiddenPatterns.some(a=>aU(d,a))))))&&(c.add(e),a.title=e,!0)})}function aE(a,b,c){return!b||c?.preserveExplicitOutline?aD([...a.chapters],{...c,template:a}):aD([...a.chapters].map(a=>{let c=ay(a.title),d=b.chapterRules.find(b=>b.id===a.id||ay(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})}function aF(a,b){let c=`${a.filePath}
11
- ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function aG(a,b){let c=aE(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),d=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],e=new Map;for(let a of[...c,...d])e.set(a.id,{...e.get(a.id)||a,...a,required:a.required||e.get(a.id)?.required||!1});return[...e.values()]}function aH(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&aF(a,b.name)}let aI=new Map,aJ=new Map,aK=new Map;function aL(a){return(0,h.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function aM(a,b,c){a.size>=800&&a.delete(a.keys().next().value),a.set(b,c)}function aN(){return"1"===process.env.DOCUMENT_PERSISTENT_FACT_CACHE}function aO(a,b,c){return e.join(g.homedir(),".customize-agent","document-cache",aL(a),b,`${c}.json`)}function aP(a){return a.toLowerCase()}function aQ(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function aR(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}async function aS(a){let b=aL({type:"role-artifact-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),templateId:a.template.id,templateName:a.template.name,node:{id:a.node.id,fileRoleId:a.node.fileRoleId,promptRoleIds:a.node.promptRoleIds,filePaths:a.node.filePaths,outputType:a.node.outputType},promptTexts:a.promptTexts,modelName:a.modelName,evidence:a.evidence.map(a=>({filePath:a.filePath,sectionTitle:a.sectionTitle,contentHash:aL(a.content)}))}),c=aI.get(b);if(c)return{artifact:c,cached:!0};let d=await a_(a.template,a.node,a.evidence);return aM(aI,b,d),{artifact:d,cached:!1}}async function aT(a){let b=aL({type:"chapter-search-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),query:a.query,maxEvidence:a.maxEvidence,fileRolesHash:a.fileRolesHash,scope:[...a.evidenceScopePaths].sort()}),c=aJ.get(b)||function(a,b,c){if(aN())try{let e=aO(a,b,c);if(!d.existsSync(e))return;return JSON.parse(d.readFileSync(e,"utf8"))}catch{return}}(a.projectRoot,"chapter-search",b);if(c)return aM(aJ,b,c),c;let f=await a.manager.search(a.projectRoot,a.query,{scope:"project",limit:Math.max(a.maxEvidence,a.evidenceScopePaths.size>0?30:a.maxEvidence),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});return aM(aJ,b,f.results),!function(a,b,c,f){if(aN())try{let g=aO(a,b,c);d.mkdirSync(e.dirname(g),{recursive:!0}),d.writeFileSync(g,JSON.stringify(f))}catch{}}(a.projectRoot,"chapter-search",b,f.results),f.results}function aU(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function aV(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,p.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>aU(b,a)))}function aW(a,b){return aV(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>aU(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>aU(a,b)))}function aX(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>aX(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${aX(b)}`).filter(Boolean).join(";"):String(a)}function aY(a){return Array.isArray(a)?a.filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):a&&"object"==typeof a?Object.values(a).filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):[]}function aZ(a){return Array.isArray(a)?a.map(a=>aX(a).trim()).filter(Boolean):"string"==typeof a?a.split(/[;;\n]/u).map(a=>a.trim()).filter(Boolean):[]}function a$(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function a_(a,b,c){let d=c.slice(0,36).map(a=>`文件:${a.filePath}
10
+ ${c}`:""].filter(Boolean).join("\n\n")}let ax="[零〇一二三四五六七八九十百千万两]+";function ay(a){return 0===a.trim().length}function az(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]*/u,"").trim()}function aA(a){return az(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function aB(a){let b=a.trim(),c=aA(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))&&!aD(c)}function aC(a,b){let c=az(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 aD(a){return/见(?:招标|公告|文件|图纸)|按(?:图纸|设计要求|相关)|质量标准[::]|招标范围[::]|工程量清单.*图纸设计依据/u.test(a)}function aE(a,b){let c=new Set;return a.filter(a=>{var d;let e=aA(a.title);if(!e)return!1;return!(!b?.preserveExplicitOutline&&(c.has(e)||aD(e)||b?.template&&(d=e,a9(b.template).some(a=>!!a.minLength&&d.length<a.minLength||!!a.maxLength&&d.length>a.maxLength||a.forbiddenPatterns.some(a=>a8(d,a))))))&&(c.add(e),a.title=e,!0)})}function aF(a,b,c){return!b||c?.preserveExplicitOutline?aE([...a.chapters],{...c,template:a}):aE([...a.chapters].map(a=>{let c=az(a.title),d=b.chapterRules.find(b=>b.id===a.id||az(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})}function aG(a,b){let c=`${a.filePath}
11
+ ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function aH(a,b){let c=aF(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),d=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],e=new Map;for(let a of[...c,...d])e.set(a.id,{...e.get(a.id)||a,...a,required:a.required||e.get(a.id)?.required||!1});return[...e.values()]}function aI(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&aG(a,b.name)}let aJ=new Map,aK=new Map,aL=new Map,aM=new Map,aN=new Map,aO=24*Math.max(1,Number(process.env.DOCUMENT_CACHE_TTL_DAYS??14))*36e5,aP=0,aQ=Math.max(1,Math.min(12,Number(process.env.DOCUMENT_LLM_CONCURRENCY??6))),aR=0,aS=[];function aT(a){return(0,h.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function aU(a,b,c){a.size>=800&&a.delete(a.keys().next().value),a.set(b,c)}async function aV(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 aW(a){let b=Date.now(),c=0;for(let[a,d]of aL.entries())b-d.updatedAt>aO&&(aL.delete(a),c+=1);for(;aL.size>800;){let a=[...aL.entries()].sort((a,b)=>a[1].updatedAt+6e4*a[1].hits-(b[1].updatedAt+6e4*b[1].hits))[0]?.[0];if(!a)break;aL.delete(a),c+=1}a&&(a.cache.prunedItems+=c)}function aX(a,b){let c=Math.max(1,Math.min(12,Number(process.env.DOCUMENT_LLM_CONCURRENCY??6))),d=aQ;a?(aR=0,0===aS.length&&aQ<c&&(aQ+=1)):(aR+=1)>=2&&(aQ=Math.max(1,aQ-1)),b&&(b.llm.currentLimit=aQ,d!==aQ&&(b.llm.limitAdjustments+=1))}function aY(){return"0"!==process.env.DOCUMENT_PERSISTENT_FACT_CACHE}function aZ(a,b,c){return e.join(g.homedir(),".customize-agent","document-cache",aT(a),b,`${c}.json`)}function a$(a,b,c){if(aY())try{let e=aZ(a,b,c);if(!d.existsSync(e))return;return JSON.parse(d.readFileSync(e,"utf8"))}catch{return}}function a_(a,b,c,f){if(aY())try{let g=aZ(a,b,c);d.mkdirSync(e.dirname(g),{recursive:!0}),d.writeFileSync(g,JSON.stringify(f))}catch{}}function a0(a){return a.toLowerCase()}function a1(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function a2(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}async function a3(a){ct(a.signal);let b=aT({type:"role-artifact-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),templateId:a.template.id,templateName:a.template.name,node:{id:a.node.id,fileRoleId:a.node.fileRoleId,promptRoleIds:a.node.promptRoleIds,filePaths:a.node.filePaths,outputType:a.node.outputType},promptTexts:a.promptTexts,modelName:a.modelName,evidence:a.evidence.map(a=>({filePath:a.filePath,sectionTitle:a.sectionTitle,contentHash:aT(a.content)}))}),c=aJ.get(b);if(c)return{artifact:c,cached:!0};let d=await bf(a.template,a.node,a.evidence,a.signal);return ct(a.signal),aU(aJ,b,d),{artifact:d,cached:!1}}async function a4(a){let b=aT({type:"chapter-search-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),query:a.query,maxEvidence:a.maxEvidence,fileRolesHash:a.fileRolesHash,scope:[...a.evidenceScopePaths].sort()}),c=aK.get(b)||a$(a.projectRoot,"chapter-search",b);if(c)return aU(aK,b,c),c;let d=await a.manager.search(a.projectRoot,a.query,{scope:"project",limit:Math.max(a.maxEvidence,a.evidenceScopePaths.size>0?30:a.maxEvidence),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});return aU(aK,b,d.results),a_(a.projectRoot,"chapter-search",b,d.results),d.results}function a5(a){return aT({type:"chapter-draft-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),templateId:a.template.id,chapterId:a.chapter.id,chapterTitle:a.chapter.title,requirement:a.requirement||"",promptTexts:a.promptTexts,modelName:a.modelName||"",targetWords:a.targetWords,fileRolesHash:a.fileRolesHash,missingFacts:a.missingFacts,evidence:a.evidence.map(a=>({filePath:a.filePath,score:Math.round(1e3*a.score)/1e3,roleId:a.roleId,processingType:a.processingType,source:a.source,digest:aT(a.content.slice(0,3e3))}))})}function a6(a){return a.filter(a=>/正文缺少章节标题|缺少配置小节|正文篇幅明显低于目标|后台流程话术/u.test(a))}function a7(a){return aT({type:"section-draft-v1",projectRoot:a.projectRoot,projectId:(0,j.computeProjectId)(a.projectRoot),templateId:a.template.id,chapterId:a.chapter.id,sectionTitle:a.sectionTitle,requirement:a.requirement||"",promptTexts:aT(a.promptTexts.slice(0,12e3)),modelName:a.modelName||"",targetWords:a.targetWords,fileRolesHash:a.fileRolesHash,evidence:a.evidence.map(a=>({filePath:a.filePath,roleId:a.roleId,digest:aT(a.content.slice(0,2e3))}))})}function a8(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function a9(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,p.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>a8(b,a)))}function ba(a,b){return a9(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>a8(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>a8(a,b)))}function bb(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>bb(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${bb(b)}`).filter(Boolean).join(";"):String(a)}function bc(a){return Array.isArray(a)?a.filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):a&&"object"==typeof a?Object.values(a).filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):[]}function bd(a){return Array.isArray(a)?a.map(a=>bb(a).trim()).filter(Boolean):"string"==typeof a?a.split(/[;;\n]/u).map(a=>a.trim()).filter(Boolean):[]}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,d){let e=c.slice(0,36).map(a=>`文件:${a.filePath}
12
12
  片段:${a.sectionTitle||""}
13
- 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),e=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",f=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
13
+ 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
14
14
  节点类型:${b.outputType}
15
15
  文件角色:${b.fileRoleName}(${b.fileRoleId})
16
16
  要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。提示词角色只提供规则和格式约束,其中的示例、样例、占位项目名、编号、日期、数量、清单和示例正文不得作为事实抽取来源。
@@ -18,69 +18,87 @@ ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|
18
18
  请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 必须只来自下面的绑定文件片段,优先抽取施工对象、部位、区域、学校/片区、工程量、日期、工期、规格、单位、资源数量、检测频次和来源口径;同类对象不得合并丢失,计量单位保持原文含义,必要时使用导出友好的正式写法。
19
19
 
20
20
  绑定文件片段:
21
- ${d}`,g=[],h=d.trim()?await bu(e,f):void 0;if(a$(h)){g.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await bu("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
21
+ ${e}`,h=[];ct(d);let i=e.trim()?await bM(f,g,{signal:d}):void 0;if(ct(d),be(i)){h.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await bM("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
22
22
 
23
23
  原始 JSON:
24
- ${JSON.stringify(h).slice(0,12e3)}`);a&&!a$(a)?h=a:g.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let i=aY(h?.chapters),j=aY(h?.facts),k=[];i.forEach((b,c)=>{let d="string"==typeof b.title?az(b.title):"";!d||!aA(b.title||d)||aW(d,a)||k.push({id:aQ(d,`chapter-${c+1}`),title:d,order:c,sourceRequirement:b.sourceRequirement||d,requiredContents:aZ(b.requiredContents),writingRules:aZ(b.writingRules),evidenceNeeds:aZ(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:aY(b.requirements).map((a,b)=>({id:aQ(`${d}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:aZ(a.requiredContents),writingRules:aZ(a.writingRules),evidenceNeeds:aZ(a.evidenceNeeds),preferredSourceRoleIds:aZ(a.preferredSourceRoleIds)}))})});let l=[],m=new Set(c.map(a=>a.filePath));return j.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&m.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&m.has(e)&&l.push({key:d,value:aq(aX(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:aZ(a.relatedChapterHints)})}),(0===k.length||0===l.length)&&g.push(`${b.fileRoleName} 部分结构化结果不足,已补充使用证据片段兜底。`),{node:b,evidence:c,chapters:k.length>0?k:function(a,b,c){if("template_requirements"!==b.outputType)return[];let d=[],e=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}|${aw})[章节]|[((]?(?:\\d{1,3}|${aw})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let f=az(c);if(!(!aA(c)||e.has(f)||aW(f,a))&&(e.add(f),d.push({id:aQ(f,`chapter-${d.length+1}`),title:f,order:d.length,sourceRequirement:b.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),d.length>=40))break}if(d.length>=40)break}return d}(a,b,c),facts:l.length>0?l:c.slice(0,20).map((a,c)=>({key:`${b.fileRoleName}事实${c+1}`,value:a.content.replace(/\s+/gu," ").slice(0,360),sourceFile:a.filePath,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:a.sectionTitle?[a.sectionTitle]:[]})).filter(a=>a.value.length>20),outputRequirements:aZ(h?.outputRequirements),warnings:[...g,...aZ(h?.warnings)],forbidImageInsertion:h?.forbidImageInsertion??"drawing_facts"===b.outputType}}let a0=[{key:"项目名称",patterns:[/(?:项目名称|工程名称|项目简称|标的名称)\s*[::]?\s*([^\n;;。]{3,100})/u],chapterHint:/项目|工程|名称|概况|总述/u},{key:"项目编号",patterns:[/(?:项目编号|工程编号|采购编号|招标编号|标段编号|合同编号)\s*[::]?\s*([^\n;;。]{3,80})/u],chapterHint:/编号|概况|总述/u},{key:"建设单位",patterns:[/(?:建设单位|业主单位|采购人|招标人|委托人|甲方)\s*[::]?\s*([^\n;;。]{2,100})/u],chapterHint:/建设单位|业主|采购人|招标人|甲方|概况/u},{key:"实施地点",patterns:[/(?:建设地点|项目地点|工程地点|实施地点|服务地点|交付地点|项目地址)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/地点|地址|现场|概况|部署/u},{key:"项目规模",patterns:[/(?:建设规模|项目规模|工程规模|服务规模|采购规模)\s*[::]?\s*([^\n;;。]{2,180})/u],chapterHint:/规模|概况|范围|工程量/u},{key:"实施范围",patterns:[/(?:招标范围|工程范围|施工范围|服务范围|采购范围|实施范围|工作范围)\s*[::]?\s*([^\n。]{5,300})/u],chapterHint:/范围|内容|任务|概况|部署/u},{key:"工期周期",patterns:[/(?:计划工期|工期要求|合同履行期限|服务期限|交付周期|实施周期)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/工期|周期|进度|计划|部署/u},{key:"质量标准",patterns:[/(?:质量标准|质量要求|验收标准|验收要求)\s*[::]?\s*([^\n;;。]{2,140})/u],chapterHint:/质量|验收|标准/u},{key:"资金预算",patterns:[/(?:资金来源|资金落实情况|预算金额|最高限价|合同金额|投资金额)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/资金|预算|造价|投资|商务/u},{key:"标段包件",patterns:[/(?:标段划分|标包划分|包件划分|合同包)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/标段|包件|范围|概况/u},{key:"关键日期",patterns:[/(?:开工日期|竣工日期|投标截止|响应截止|交付日期|完成时间)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/日期|时间|进度|计划/u}];function a1(a){let b=a.length>1e4?`${a.slice(0,5e3)}
24
+ ${JSON.stringify(i).slice(0,12e3)}`,{signal:d});a&&!be(a)?i=a:h.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let j=bc(i?.chapters),k=bc(i?.facts),l=[];j.forEach((b,c)=>{let d="string"==typeof b.title?aA(b.title):"";!d||!aB(b.title||d)||ba(d,a)||l.push({id:a1(d,`chapter-${c+1}`),title:d,order:c,sourceRequirement:b.sourceRequirement||d,requiredContents:bd(b.requiredContents),writingRules:bd(b.writingRules),evidenceNeeds:bd(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:bc(b.requirements).map((a,b)=>({id:a1(`${d}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:bd(a.requiredContents),writingRules:bd(a.writingRules),evidenceNeeds:bd(a.evidenceNeeds),preferredSourceRoleIds:bd(a.preferredSourceRoleIds)}))})});let m=[],n=new Set(c.map(a=>a.filePath));return k.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&n.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&n.has(e)&&m.push({key:d,value:aq(bb(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:bd(a.relatedChapterHints)})}),(0===l.length||0===m.length)&&h.push(`${b.fileRoleName} 部分结构化结果不足,已补充使用证据片段兜底。`),{node:b,evidence:c,chapters:l.length>0?l:function(a,b,c){if("template_requirements"!==b.outputType)return[];let d=[],e=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}|${ax})[章节]|[((]?(?:\\d{1,3}|${ax})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let f=aA(c);if(!(!aB(c)||e.has(f)||ba(f,a))&&(e.add(f),d.push({id:a1(f,`chapter-${d.length+1}`),title:f,order:d.length,sourceRequirement:b.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),d.length>=40))break}if(d.length>=40)break}return d}(a,b,c),facts:m.length>0?m:c.slice(0,20).map((a,c)=>({key:`${b.fileRoleName}事实${c+1}`,value:a.content.replace(/\s+/gu," ").slice(0,360),sourceFile:a.filePath,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:a.sectionTitle?[a.sectionTitle]:[]})).filter(a=>a.value.length>20),outputRequirements:bd(i?.outputRequirements),warnings:[...h,...bd(i?.warnings)],forbidImageInsertion:i?.forbidImageInsertion??"drawing_facts"===b.outputType}}let bg=[{key:"项目名称",patterns:[/(?:项目名称|工程名称|项目简称|标的名称)\s*[::]?\s*([^\n;;。]{3,100})/u],chapterHint:/项目|工程|名称|概况|总述/u},{key:"项目编号",patterns:[/(?:项目编号|工程编号|采购编号|招标编号|标段编号|合同编号)\s*[::]?\s*([^\n;;。]{3,80})/u],chapterHint:/编号|概况|总述/u},{key:"建设单位",patterns:[/(?:建设单位|业主单位|采购人|招标人|委托人|甲方)\s*[::]?\s*([^\n;;。]{2,100})/u],chapterHint:/建设单位|业主|采购人|招标人|甲方|概况/u},{key:"实施地点",patterns:[/(?:建设地点|项目地点|工程地点|实施地点|服务地点|交付地点|项目地址)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/地点|地址|现场|概况|部署/u},{key:"项目规模",patterns:[/(?:建设规模|项目规模|工程规模|服务规模|采购规模)\s*[::]?\s*([^\n;;。]{2,180})/u],chapterHint:/规模|概况|范围|工程量/u},{key:"实施范围",patterns:[/(?:招标范围|工程范围|施工范围|服务范围|采购范围|实施范围|工作范围)\s*[::]?\s*([^\n。]{5,300})/u],chapterHint:/范围|内容|任务|概况|部署/u},{key:"工期周期",patterns:[/(?:计划工期|工期要求|合同履行期限|服务期限|交付周期|实施周期)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/工期|周期|进度|计划|部署/u},{key:"质量标准",patterns:[/(?:质量标准|质量要求|验收标准|验收要求)\s*[::]?\s*([^\n;;。]{2,140})/u],chapterHint:/质量|验收|标准/u},{key:"资金预算",patterns:[/(?:资金来源|资金落实情况|预算金额|最高限价|合同金额|投资金额)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/资金|预算|造价|投资|商务/u},{key:"标段包件",patterns:[/(?:标段划分|标包划分|包件划分|合同包)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/标段|包件|范围|概况/u},{key:"关键日期",patterns:[/(?:开工日期|竣工日期|投标截止|响应截止|交付日期|完成时间)\s*[::]?\s*([^\n;;。]{2,120})/u],chapterHint:/日期|时间|进度|计划/u}];function bh(a){let b=a.length>1e4?`${a.slice(0,5e3)}
25
25
 
26
- ${a.slice(-5e3)}`:a,c=b.replace(/\s+/gu," ");return{explicitStructure:/(?:目录|大纲|章节|结构|框架|按以下|如下结构|不要新增|不得新增|只写|仅写)/u.test(c),explicitSections:/(?:小节|二级标题|三级标题|一级标题|##|###|第[一二三四五六七八九十]+章|\d+[.、]\s*[^\s])/u.test(b),lengthLimit:/(?:\d+\s*(?:字|页|段)|控制在|不超过|不少于|篇幅|字数|页数)/u.test(c),wantsConcise:/(?:简洁|精简|简要|不要展开|无需展开|概述|摘要|少写|控制篇幅)/u.test(c),detailedInstructions:c.length>=900||/(?:必须包含|重点写|详细说明|逐项|分别说明|表格|清单|流程|步骤|标准|责任|频次|验收)/u.test(c),explicitFacts:/(?:\d+\s*(?:天|日|个月|万元|元|%|㎡|m2|米|m|人|台|套)|项目名称|工期|质量标准|地点|预算|编号)/u.test(c),styleConstraint:/(?:口吻|语气|风格|措辞|正式|承诺|汇报|方案|不要使用|禁止使用)/u.test(c)}}function a2(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 a3(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||a2(c.roleId),subtitle:c.subtitle||c.roleName||a2(c.roleId)}}function a4(a,b,c){let d=[b.title,...b.requiredFacts||[],...c?.requiredContents||[],...c?.evidenceNeeds||[],...c?.requirements.flatMap(a=>[a.title,...a.requiredContents,...a.evidenceNeeds])||[]].filter(Boolean);return a.flatMap(a=>a.facts.map(b=>({artifact:a,fact:b}))).filter(({fact:a})=>{let b=`${a.key}
27
- ${aX(a.value)}
28
- ${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function a5(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function a6(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let a7=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,a8=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,a9=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function ba(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(a7,"").replace(a8,"").replace(a9,"").replace(ao,"").replace(/^#\s+/gmu,"").replace(an,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\|\s*(?:[/—-]|无|暂无|待定|待补充|N\/?A)\s*(?=\|)/giu,"| 结合项目资料及现场深化确认 ").replace(/见(?:招标文件|招标公告|图纸|设计文件|相关文件)/gu,"依据已提供招标资料和设计资料").replace(/按(?:图纸|设计要求|相关规范|有关规范|文件要求)/gu,"依据已提供设计资料和现行规范").replace(/满足(?:相关|有关)?要求/gu,"满足招标文件、设计文件及现行验收规范要求").replace(/\n{3,}/gu,"\n\n").trim()}let bb="你正在生成可直接交付的正式业务文档,不是分析报告、证据报告或系统调试报告。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、项目基础事实候选、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n文档结构优先遵循用户需求、模板章节和绑定提示词;后台内容优化建议只用于提升事实覆盖和表达质量,不得新增、删除或重排章节。\n资料信息应内化为正式正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n正式正文不得把原始公告、规则条款、说明性附件或系统过程内容误作为章节标题或目录项。\n如绑定资料中存在项目基础事实,应在相关章节自然吸收;如模板或用户要求表格化呈现,表格前只保留必要引导语,不得逐项重复叙述同一批字段。\n正文必须以当前模板、用户要求和绑定资料中的真实对象、范围、数量、时间、规格、标准、责任和约束为依据,不得自由发挥。\n同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项时,必须逐项覆盖适用范围和对应依据,不得只写一个代表性对象后泛化到全部范围。\n不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。\n正文二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;不得用无编号独立加粗行表示三级小节;三级小节不纳入目录。\n资料不足或不同来源数值冲突时,应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出交付。";function bc(a,b,c,d,e){let f=[];for(let b of c)for(let c of(a.includes(b.title)||f.push(`章节计划建议未体现:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&f.push(`${b.title} 未覆盖必写内容:${c}`);for(let d of b){let b=c.find(a=>a.title===d.title),e=b?.minWords||1e3;for(let b of(d.content.length<e&&f.push(`${d.title} 内容深度不足:${d.content.length}/${e}`),(d.sections||[]).length<3&&f.push(`${d.title} 二级小节少于 3 个,必须由模型结合章节主题和项目资料补齐 3-6 个正式二级小节`),d.sections||[]))b&&!a.includes(b)&&f.push(`${d.title} 缺少目录小节:${b}`)}for(let b of d){let c=b.facts.slice(0,5).map(a=>aX(a.value).slice(0,24)).filter(a=>a.length>=6);c.length>0&&!c.some(b=>a.includes(b))&&f.push(`未体现 ${b.node.fileRoleName} 的关键读取结果`)}return e&&/!\[[^\]]*\]\([^)]*\)/iu.test(a)&&f.push("正文包含不应插入的图片"),/\b(?:m\s*[²2]|m\s*[³3]|mm2|cm2|km2)\b/iu.test(a)&&f.push("正文包含导出不友好的计量单位写法"),[...new Set(f)].slice(0,40)}function bd(a){return/阻断|错误|正文缺少|缺少配置小节|缺少必要的正式表格|事实一致性|其他项目|项目编号|项目名称|清单\/图纸精确参数使用不足|正文未体现工程量清单|正文未体现图纸|二级小节少于|三级小节|目录|量化|数值|单位|图片/u.test(a)}function be(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),a.chapter.sections||[])){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^###\\s+${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|$)`,"mu"));e?180>bz(e[1])&&b.push(`配置小节正文过短:${c}`):b.push(`缺少配置小节:${c}`)}for(let c of(bz(a.content)<Math.floor(.65*a.targetWords)&&b.push("正文篇幅明显低于目标"),a7.lastIndex=0,(a7.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,10)}async function bf(a){b7(a.signal);let b=await bs(["你是章节局部修复专家。只修复给定章节中明确存在的问题,不得改写其他章节,不得压缩正文,不得改变用户/模板结构。",bb,a.forbidDrawingImages?"图片/图纸类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","必须保留本章节标题和已有小节;如确需补充,只能在相关小节内追加或替换有问题的局部段落。","不得返回整篇文档;只返回修复后的本章节 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
26
+ ${a.slice(-5e3)}`:a,c=b.replace(/\s+/gu," ");return{explicitStructure:/(?:目录|大纲|章节|结构|框架|按以下|如下结构|不要新增|不得新增|只写|仅写)/u.test(c),explicitSections:/(?:小节|二级标题|三级标题|一级标题|##|###|第[一二三四五六七八九十]+章|\d+[.、]\s*[^\s])/u.test(b),lengthLimit:/(?:\d+\s*(?:字|页|段)|控制在|不超过|不少于|篇幅|字数|页数)/u.test(c),wantsConcise:/(?:简洁|精简|简要|不要展开|无需展开|概述|摘要|少写|控制篇幅)/u.test(c),detailedInstructions:c.length>=900||/(?:必须包含|重点写|详细说明|逐项|分别说明|表格|清单|流程|步骤|标准|责任|频次|验收)/u.test(c),explicitFacts:/(?:\d+\s*(?:天|日|个月|万元|元|%|㎡|m2|米|m|人|台|套)|项目名称|工期|质量标准|地点|预算|编号)/u.test(c),styleConstraint:/(?:口吻|语气|风格|措辞|正式|承诺|汇报|方案|不要使用|禁止使用)/u.test(c)}}function bi(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 bj(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||bi(c.roleId),subtitle:c.subtitle||c.roleName||bi(c.roleId)}}function bk(a,b,c){let d=[b.title,...b.requiredFacts||[],...c?.requiredContents||[],...c?.evidenceNeeds||[],...c?.requirements.flatMap(a=>[a.title,...a.requiredContents,...a.evidenceNeeds])||[]].filter(Boolean);return a.flatMap(a=>a.facts.map(b=>({artifact:a,fact:b}))).filter(({fact:a})=>{let b=`${a.key}
27
+ ${bb(a.value)}
28
+ ${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function bl(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function bm(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let bn=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,bo=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,bp=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function bq(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(bn,"").replace(bo,"").replace(bp,"").replace(ao,"").replace(/^#\s+/gmu,"").replace(an,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\|\s*(?:[/—-]|无|暂无|待定|待补充|N\/?A)\s*(?=\|)/giu,"| 结合项目资料及现场深化确认 ").replace(/见(?:招标文件|招标公告|图纸|设计文件|相关文件)/gu,"依据已提供招标资料和设计资料").replace(/按(?:图纸|设计要求|相关规范|有关规范|文件要求)/gu,"依据已提供设计资料和现行规范").replace(/满足(?:相关|有关)?要求/gu,"满足招标文件、设计文件及现行验收规范要求").replace(/\n{3,}/gu,"\n\n").trim()}let br="你正在生成可直接交付的正式业务文档,不是分析报告、证据报告或系统调试报告。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、项目基础事实候选、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n文档结构优先遵循用户需求、模板章节和绑定提示词;后台内容优化建议只用于提升事实覆盖和表达质量,不得新增、删除或重排章节。\n资料信息应内化为正式正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n正式正文不得把原始公告、规则条款、说明性附件或系统过程内容误作为章节标题或目录项。\n如绑定资料中存在项目基础事实,应在相关章节自然吸收;如模板或用户要求表格化呈现,表格前只保留必要引导语,不得逐项重复叙述同一批字段。\n正文必须以当前模板、用户要求和绑定资料中的真实对象、范围、数量、时间、规格、标准、责任和约束为依据,不得自由发挥。\n同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项时,必须逐项覆盖适用范围和对应依据,不得只写一个代表性对象后泛化到全部范围。\n不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。\n正文二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;不得用无编号独立加粗行表示三级小节;三级小节不纳入目录。\n资料不足或不同来源数值冲突时,应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出交付。";function bs(a,b,c,d,e){let f=[];for(let b of c)for(let c of(a.includes(b.title)||f.push(`章节计划建议未体现:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&f.push(`${b.title} 未覆盖必写内容:${c}`);for(let d of b){let b=c.find(a=>a.title===d.title),e=b?.minWords||1e3;for(let b of(d.content.length<e&&f.push(`${d.title} 内容深度不足:${d.content.length}/${e}`),(d.sections||[]).length<3&&f.push(`${d.title} 二级小节少于 3 个,必须由模型结合章节主题和项目资料补齐 3-6 个正式二级小节`),d.sections||[]))b&&!a.includes(b)&&f.push(`${d.title} 缺少目录小节:${b}`)}for(let b of d){let c=b.facts.slice(0,5).map(a=>bb(a.value).slice(0,24)).filter(a=>a.length>=6);c.length>0&&!c.some(b=>a.includes(b))&&f.push(`未体现 ${b.node.fileRoleName} 的关键读取结果`)}return e&&/!\[[^\]]*\]\([^)]*\)/iu.test(a)&&f.push("正文包含不应插入的图片"),/\b(?:m\s*[²2]|m\s*[³3]|mm2|cm2|km2)\b/iu.test(a)&&f.push("正文包含导出不友好的计量单位写法"),[...new Set(f)].slice(0,40)}function bt(a){return/阻断|错误|正文缺少|缺少配置小节|缺少必要的正式表格|事实一致性|其他项目|项目编号|项目名称|清单\/图纸精确参数使用不足|正文未体现工程量清单|正文未体现图纸|二级小节少于|三级小节|目录|量化|数值|单位|图片/u.test(a)}function bu(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),a.chapter.sections||[])){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^###\\s+${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|$)`,"mu"));e?180>bT(e[1])&&b.push(`配置小节正文过短:${c}`):b.push(`缺少配置小节:${c}`)}for(let c of(bT(a.content)<Math.floor(.65*a.targetWords)&&b.push("正文篇幅明显低于目标"),bn.lastIndex=0,(bn.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,10)}function bv(a){let b=a.join("\n");return/缺少配置小节|二级小节少于|三级小节|目录|章节|结构/u.test(b)?"missing_structure":/闭环|责任|检查|验收|整改|风险|安全|质量|进度/u.test(b)?"loop_closure":/事实一致性|其他项目|项目编号|项目名称|冲突|污染|requiredFacts/u.test(b)?"fact_conflict":/术语|名称不一致|前后不一致/u.test(b)?"terminology":/表格|量化|数值|单位|清单|图纸|参数/u.test(b)?"table_numeric":/占位|空泛|后台流程|提示词|泄露|图片/u.test(b)?"placeholder":"generic"}async function bw(a){ct(a.signal);let b=a.repairType||bv(a.issues),c=await bK(["你是章节局部修复专家。只修复给定章节中明确存在的问题,不得改写其他章节,不得压缩正文,不得改变用户/模板结构。",function(a){switch(a){case"missing_structure":return"修复重点:补齐缺失小节、修正标题层级和目录相关结构;只在相关位置追加必要正文,不重排一级章节。";case"loop_closure":return"修复重点:补齐对象、责任、措施、检查、验收、整改和记录闭环;不得编造具体数据。";case"fact_conflict":return"修复重点:删除或改正与证据冲突的项目名称、编号、范围、参数;不确定内容改为基于资料的表述,不得新增无来源事实。";case"terminology":return"修复重点:统一同一对象的术语、简称和称谓,保持前后一致,不改变事实含义。";case"table_numeric":return"修复重点:补足表格前后说明、单位、参数来源和量化表达;资料不足时不得编造精确数值。";case"placeholder":return"修复重点:移除占位话术、后台流程话术、提示词痕迹和不允许的图片语法,替换为正式业务表述。";default:return"修复重点:仅针对列出问题做最小必要修改,避免全文重写。"}}(b),br,a.forbidDrawingImages?"图片/图纸类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","必须保留本章节标题和已有小节;如确需补充,只能在相关小节内追加或替换有问题的局部段落。","不得返回整篇文档;只返回修复后的本章节 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
29
29
  ${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
30
- ${av(au({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence))}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),!1,{maxTokens:Math.min(12e3,Math.max(4e3,Math.ceil(1.4*bz(a.chapter.content)))),temperature:.2,signal:a.signal});return(b7(a.signal),b&&!(b.length<.75*a.chapter.content.length)&&b.includes(a.chapter.title.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").slice(0,6)))?ba(a6(b,a.forbidDrawingImages)):a.chapter.content}async function bg(a){let b=a.issues.filter(bd);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=0,d=[],e=0;for(let f of a.chapters){b7(a.signal);let g=function(a,b){let c=b.filter(bd),d=new Set(a.sections||[]),e=`${a.title}
30
+ ${aw(av({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence))}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),!1,{maxTokens:Math.min(12e3,Math.max(4e3,Math.ceil(1.4*bT(a.chapter.content)))),temperature:.2,signal:a.signal});return(ct(a.signal),c&&!(c.length<.75*a.chapter.content.length)&&c.includes(a.chapter.title.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").slice(0,6)))?bq(bm(c,a.forbidDrawingImages)):a.chapter.content}async function bx(a){let b=a.issues.filter(a=>"minor"!==bQ(a)).filter(bt);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=Math.max(0,Math.min(5,Number(process.env.DOCUMENT_MAX_REPAIR_CHAPTERS??2))),d=Math.max(1,Math.min(6,Number(process.env.DOCUMENT_MAX_REPAIR_ISSUES_PER_CHAPTER??3))),e=a.chapters.map(a=>({chapter:a,issues:(function(a,b){let c=b.filter(bt),d=new Set(a.sections||[]),e=`${a.title}
31
31
  ${a.sections?.join("\n")||""}
32
- ${a.content.slice(0,4e3)}`;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))}(f,b);if(0===g.length||e>=5){d.push(f);continue}e+=1;let h=await bf({template:a.template,chapter:f,issues:g.slice(0,6),promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,signal:a.signal});h!==f.content&&(c+=1),d.push({...f,content:h})}let f=c>0?`已精准修复 ${c} 个存在阻断/结构/事实问题的章节,未进行全文重写`:`已完成质量检查,未定位到可安全局部修复的阻断问题:${b.slice(0,5).join(";")}`;return{markdown:a.markdown,chapters:d,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:f}}}function bh(a){if(a.projectRoleConfigId)return a.projectRoleConfigId;let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;if(function(a){let b=(0,p.V)().reviewChapterTemplateMatchers;if(0===b.length)return!1;let c=`${a.name} ${a.category} ${a.outputTitle}`;return b.some(a=>RegExp(a,"iu").test(c))}(a)||/施工组织设计|施工方案|技术标.*施工|施工.*技术标/iu.test(b))return"construction-bid-sgzsj-professional"}function bi(a){let b=bh(a);return b?(0,o.Mu)(b):void 0}function bj(a){let b=bi(a);if(b){let a=(0,o.XB)("prompt");return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(b=>a.find(a=>a.id===b.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({promptId:b,roleId:a.id})))}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function bk(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}function bl(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 bm(a,b,c){return function(a,b){let c=e.resolve(a),f=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let f=e.resolve(c,"knowledgeBase",b);return d.existsSync(f)?f:e.resolve(c,b)}(c,b);return f===c||f.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&bl(a,b).some(a=>c.has(a))}function bn(a,b){return new Set(b.flatMap(b=>bl(a,b.filePath)))}function bo(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(/<\s*OUTLINE\s*>/iu.test(b)&&(e=!0),e){c.push(a),/<\/\s*OUTLINE\s*>/iu.test(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 bp(a,b){let c=new Map((0,o.XB)("prompt").map(a=>[a.id,a.executionType||"reference"]));return ag(a).filter(a=>b.includes(c.get(a.roleId)||"reference")).map(a=>`## [${a.roleId}] ${a.name}
33
- ${bo(a.content)}`).join("\n\n")}function bq(a,b){let c=(0,k.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function br(){let a=(0,n.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}}async function bs(a,b,c=!1,d={}){try{let e=br();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):""}),j=aK.get(h);return j||(j=(0,i.createProvider)(bq(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aK.set(h,j)),(await j.chat([{role:"system",content:c?`${a}
34
- 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal})).content.trim()}catch(a){if(d.signal?.aborted)throw Error("用户中止",{cause:a});return}}async function bt(a,b,c){let d=new AbortController,e=!1,f=()=>d.abort();if(c?.aborted)throw Error("用户中止");c?.addEventListener("abort",f,{once:!0});let g=setTimeout(()=>{e=!0,d.abort()},b);try{let b=await a(d.signal);if(c?.aborted)throw Error("用户中止");if(d.signal.aborted&&e)return null;return b}catch(a){if(c?.aborted)throw Error("用户中止",{cause:a});if(d.signal.aborted&&e)return null;throw a}finally{clearTimeout(g),c?.removeEventListener("abort",f)}}async function bu(a,b,c={}){let d=await bs(a,b,!0,{signal:c.signal});if(d)try{let a=d.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function bv(a,b,c){let f=br();if(!f?.provider.capabilities?.fileUnderstanding&&!f?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};b7(c);let g=(0,i.createProvider)(bq(f.model.provider,f.provider),{baseUrl:f.provider.baseUrl,apiKey:f.provider.apiKey,modelName:f.model.name,directEndpoint:f.provider.directEndpoint});if(!g.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let h=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{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:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===h.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{b7(c);let a=await g.understandFiles(h,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:c});b7(c);let b=a.content.trim();return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${h.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bw(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=a.slice(0,24).map(a=>`文件:${a.filePath}
32
+ ${a.content.slice(0,4e3)}`;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))})(a,b).slice(0,d)})).filter(a=>a.issues.length>0).slice(0,c);if(0===e.length)return{markdown:a.markdown,chapters:a.chapters,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已完成质量检查,未定位到可安全局部修复的阻断问题:${b.slice(0,5).join(";")}`}};let f=Math.max(1,Math.min(3,Number(process.env.DOCUMENT_REPAIR_CONCURRENCY??2))),g=new Map;for(let b=0;b<e.length;b+=f){ct(a.signal);let c=e.slice(b,b+f);for(let b of(await Promise.all(c.map(async b=>{let c=a.strategy?.enableTypedRepair===!1?"generic":bv(b.issues),d=await bw({template:a.template,chapter:b.chapter,issues:b.issues,promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,repairType:c,signal:a.signal});return{id:b.chapter.id,content:d,repairType:c}}))))g.set(b.id,b.content)}let h=0,i=a.chapters.map(a=>{let b=g.get(a.id);return b&&b!==a.content?(h+=1,{...a,content:b}):a}),j=h>0?`已并发精准修复 ${h} 个存在阻断/结构/事实问题的章节,未进行全文重写`:`已完成质量检查,未定位到可安全局部修复的阻断问题:${b.slice(0,5).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function by(a){if(a.projectRoleConfigId)return a.projectRoleConfigId;let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;if(function(a){let b=(0,p.V)().reviewChapterTemplateMatchers;if(0===b.length)return!1;let c=`${a.name} ${a.category} ${a.outputTitle}`;return b.some(a=>RegExp(a,"iu").test(c))}(a)||/施工组织设计|施工方案|技术标.*施工|施工.*技术标/iu.test(b))return"construction-bid-sgzsj-professional"}function bz(a){let b=by(a);return b?(0,o.Mu)(b):void 0}function bA(a){let b=bz(a);if(b){let a=(0,o.XB)("prompt");return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(b=>a.find(a=>a.id===b.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({promptId:b,roleId:a.id})))}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function bB(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}function bC(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 bD(a,b,c){return function(a,b){let c=e.resolve(a),f=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let f=e.resolve(c,"knowledgeBase",b);return d.existsSync(f)?f:e.resolve(c,b)}(c,b);return f===c||f.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&bC(a,b).some(a=>c.has(a))}function bE(a,b){return new Set(b.flatMap(b=>bC(a,b.filePath)))}function bF(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(/<\s*OUTLINE\s*>/iu.test(b)&&(e=!0),e){c.push(a),/<\/\s*OUTLINE\s*>/iu.test(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 bG(a,b){let c=new Map((0,o.XB)("prompt").map(a=>[a.id,a.executionType||"reference"]));return ag(a).filter(a=>b.includes(c.get(a.roleId)||"reference")).map(a=>`## [${a.roleId}] ${a.name}
33
+ ${bF(a.content)}`).join("\n\n")}function bH(a,b){let c=(0,k.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function bI(){let a=(0,n.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}}async function bJ(a,b,c){for(;aP>=Math.max(1,Math.min(12,aQ));){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=aS.indexOf(d);a>=0&&aS.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),aS.push(d)})}aP+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,aP));try{let b=await a();return aX(!0,c),b}catch(a){throw aX(!1,c),a}finally{for(aP=Math.max(0,aP-1);aS.length>0;){let a=aS.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function bK(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=bI();if(!e)return;let{model:f,provider:g}=e,h=aT({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?aT(g.apiKey):""}),j=aN.get(h);j||(j=(0,i.createProvider)(bH(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aN.set(h,j));let k=Math.max(3e4,Number(process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await bJ(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),k)}),h=[j.chat([{role:"system",content:c?`${a}
34
+ 只返回 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 bL(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 bM(a,b,c={}){let d=await bK(a,b,!0,{signal:c.signal});if(d)try{let a=d.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function bN(a,b,c){let f=bI();if(!f?.provider.capabilities?.fileUnderstanding&&!f?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};ct(c);let g=(0,i.createProvider)(bH(f.model.provider,f.provider),{baseUrl:f.provider.baseUrl,apiKey:f.provider.apiKey,modelName:f.model.name,directEndpoint:f.provider.directEndpoint});if(!g.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let h=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{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:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===h.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{ct(c);let a=await g.understandFiles(h,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:c});ct(c);let b=a.content.trim();return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${h.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bO(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=a.slice(0,24).map(a=>`文件:${a.filePath}
35
35
  角色:${a.roleId||""}
36
36
  处理:${a.processingType||""}
37
- 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!g.trim())return{facts:[],stages:f};b7(e);let h=aG(c,d),i=h.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),j=await bu(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
37
+ 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!g.trim())return{facts:[],stages:f};ct(e);let h=aH(c,d),i=h.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),j=await bM(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
38
38
  返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
39
39
 
40
40
  动态事实 schema:
41
41
  ${i}
42
42
 
43
43
  资料:
44
- ${g}`,{signal:e});return(b7(e),j?.facts?.length)?{facts:j.facts.filter(a=>a.key&&a.value).map(a=>{let b=h.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:aX(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 抽取 ${j.facts.length} 条事实`}]}:{facts:[],stages:f}}function bx(a){return/用户要求|出现禁用文本|资料未提供|导出|临时|无效|占位|示例|样例|生成未完成|低于目标页数|低于目标字数|文档预算未达成|正文篇幅低于目标|兜底|章节生成失败|大模型未能|重新生成|缺少配置小节|缺少必要的正式表格|正文缺少章节标题|其他项目|项目编号|项目名称|事实一致性冲突|工程专项资料角色缺失|章节缺少证据|文档质量基准评分未达标/iu.test(a.message)}function by(a,b){return Math.ceil(bz(a)/bA(b))}function bz(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function bA(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 bB(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 bC(a){let b=a.title+a.purpose;return/方法|施工|技术|质量|安全|进度|资源|保障|措施|部署|方案/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function bD(a){return a.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a))}function bE(a,b){return`${a.name}:${b}`}function bF(a){let b=[...a.matchAll(/^##\s+第[一二三四五六七八九十百]+章\s+.+$/gmu)],c=[];for(let d=1;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f);/项目基本信息表|招标公告项目基本信息|^###\s*项目基本信息\s*$/mu.test(g)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现项目基本信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(b.length>0){let d=b[0].index||0,e=b[1]?.index??a.length,f=a.slice(d,e),g=f.search(/项目基本信息表|招标公告项目基本信息|\|\s*(?:字段|项目|内容)\s*\|/u);if(g>0){let a=f.slice(0,g).replace(/^##\s+.+$/gmu,"").replace(/^###\s+.+$/gmu,""),b=["项目名称","项目编号","实施地点","建设地点","建设单位","招标人","实施范围","招标范围","工期周期","计划工期","质量标准"].filter(b=>RegExp(`${b}\\s*[::]`,"u").test(a));b.length>=3&&c.push({level:"warning",message:`项目基本信息表前重复叙述字段:${b.join("、")}`,suggestion:"项目基本信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述项目名称、编号、地点、工期、质量等字段。"})}}return c}function bG(a){let b=[],c=["本节","本章将","以下从","以下内容","综上所述"].filter(b=>a.includes(b));return c.length>0&&b.push({level:"warning",message:`存在模板化前缀或套话:${c.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入施工对象、工艺动作、控制措施、检查验收和责任闭环。"}),b}function bH(a){return a.filter(a=>(a.sections||[]).length<3).map(a=>({level:"error",message:`${a.title} 二级小节少于 3 个`,suggestion:"请由模型结合章节主题、项目资料和专业写作需要补齐 3-6 个正式二级小节,不得使用代码默认小节。"}))}function bI(a){let b=/^##\s+目录\s*$([\s\S]*?)(?=\n<div class="page-break"><\/div>|\n##\s+)/mu.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=b[1].split(/\r?\n/u).filter(a=>a.trim()).filter(a=>/^\s*\d+\.\d+\s+\S/u.test(a));return c.length>0&&c.every(a=>!/^\s{2,}\d+\.\d+\s+\S/u.test(a))?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function bJ(a,b){let c=[],d=a.replace(/\s+/gu,""),e=[...new Set(b.preciseFacts.filter(a=>/drawing|table|bill|boq|清单|工程量|图纸|draw/u.test(`${a.processingType||""} ${a.roleId} ${a.sourceFile}`)).flatMap(a=>`${a.key} ${a.value}`.match(/(?:DN\d+|φ\d+|Φ\d+|\d+(?:\.\d+)?\s*(?:mm|cm|m|㎡|m²|m3|MPa|kPa|℃|%|台|套|个|项|日历天|天)|\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\s*mm|GB\/?T?\s*\d+(?:[-—]\d+)?|JGJ\/?T?\s*\d+(?:[-—]\d+)?|CJJ\/?T?\s*\d+(?:[-—]\d+)?)/giu)||[]))].slice(0,160),f=e.filter(a=>d.includes(a.replace(/\s+/gu,"")));return e.length>=20&&f.length/e.length<.28&&c.push({level:"error",message:`清单/图纸精确参数使用不足:${f.length}/${e.length}`,suggestion:"请把清单和图纸中的规格、管径、尺寸、厚度、强度、工程量、设备数量和规范编号写入对应分项章节,禁止泛化概括。"}),b.bills.length>0&&!/(清单|工程量|项目特征|分部分项|分项工程)/u.test(a)&&c.push({level:"error",message:"正文未体现工程量清单项目特征或分部分项信息",suggestion:"请从清单中提取分部分项、项目特征、单位、工程量和材料设备参数补入施工范围和施工方法。"}),b.drawings.length>0&&!/(图纸|设计说明|系统图|节点|平面|立面|管径|标高|尺寸|做法)/u.test(a)&&c.push({level:"error",message:"正文未体现图纸/设计说明参数",suggestion:"请从图纸和设计说明中提取系统、节点、构造做法、规格尺寸、管径标高和试验验收要求。"}),c}function bK(a){let b=[];for(let c of[/见(?:招标文件|招标公告|图纸|设计文件|相关文件)/u,/按(?:图纸|设计要求|相关规范|有关规范|文件要求)/u,/满足(?:相关|有关)?要求/u,/\|\s*(?:[/—-]|无|暂无|待定|待补充|N\/?A)\s*\|/iu])c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见文件/按图纸”。"});return b}function bL(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,d=(0,p.V)().autoSpecGates.filter(a=>a.templateMatchers.some(a=>{try{return RegExp(a,"iu").test(c)}catch{return c.includes(a)}}));if(0===d.length)return[];let e=[],f=bD(a).length;for(let b of d.flatMap(a=>a.requiredTexts))a.includes(b)||e.push({level:"error",message:`配置要求缺少必要内容:${b}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let b of d.flatMap(a=>a.forbiddenTexts))a.includes(b)&&e.push({level:"error",message:`配置要求不得出现:${b}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"});/^#\s+/mu.test(a)&&e.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"});let g=Math.max(0,...d.map(a=>a.minTables||0));return g&&f<g&&e.push({level:"error",message:`配置要求正式表格不足:${f}/${g}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),e}async function bM(a,b,c,d,e,f,g,h="",i={}){let j=av(au(b,c));if(!j.trim()&&!h.trim())return;let k=a1([e,g||""].filter(Boolean).join("\n\n")),l=b.sections?.length?`本章必须完整包含以下二级小节,且每个小节都要有实质正文:
45
- ${b.sections.map(a=>`- ${a}`).join("\n")}`:k.explicitStructure||k.explicitSections||k.lengthLimit||k.wantsConcise?"本章未预设二级小节;请优先遵循用户提示词和模板结构组织内容,不得因系统增强自行扩展小节。":"本章未预设二级小节;必须根据章节主题、项目资料和专业写作需要生成 3-6 个正式二级小节,不得新增、删除或重排一级章节。",m=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",bb,"准确性优先级:用户需求/模板章节 > 绑定提示词与角色节点结构化事实 > 知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。","提示词角色只提供规则和格式约束;其中的示例、样例、占位项目名、编号、日期、数量、清单和示例正文不得作为当前项目事实,不得写入正文。",i.forbidDrawingImages?"图片/图纸类资料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),n=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,l,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
46
- ${f}`:"",i.projectBasicFactContext||"",h||"",i.factCoverageContext||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:",`- 首轮生成必须尽量达到目标篇幅的 85%-95%;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""},不得依赖后续扩写补救。`,"- 保留章节标题;如模板配置了小节,必须按配置完整生成;如未配置小节且用户未限制结构,必须生成 3-6 个正式二级小节;每个二级小节必须有实质正文,不能只有标题或表格。",b.tableSections?.length?`- 本章以下小节适合使用正式表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴资料摘录。`:"","- 表格只用于模板、用户要求或资料内容适合结构化表达的位置;表格前必须说明数据来源和适用范围,表格后必须说明控制措施、结论或执行要求,不能整节只有表格。","- 不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。","- 每个核心小节必须形成“对象/范围 → 依据/关键事实 → 执行或说明动作 → 控制要求 → 结果/责任闭环”的完整表达链条;具体术语以模板、用户要求和资料内容为准。","- 二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;三级小节不纳入目录;不得使用无编号独立加粗行表示三级小节。","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、标准要求、约束条件等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 日期、数量、数值、规格、周期、资源、范围、对象等量化内容必须来自资料或明确推导;无依据时不得编造具体值。","- 如果同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项,必须逐项覆盖适用范围和对应依据,不得只写其中一个。","- 对模板和资料中已经明确给出的关键事实、数量、时间、规格、标准、范围、对象、责任或约束,必须写入对应小节,不能只写原则性要求。","- 严禁使用空泛占位表达替代资料事实;确实缺少资料时,只能写成待复核事项、约束条件或控制措施,不得编造具体数值。","- 正文不得出现“知识库”“证据”“检索”“角色节点”“事实字段”“校验结果”等后台系统话术。","- 存在事实冲突时,优先遵循用户要求、模板结构、绑定文件证据和提示词角色;后台内容优化建议仅作质量参考;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",i.targetWords&&i.targetWords>=3500?"- 用户已提出较高篇幅目标,本章必须围绕每个二级小节充分展开对象范围、资料依据、关键事实、执行要求、风险约束、检查确认和责任闭环;不得用摘要式段落替代正文。":"","",j?"内部资料:":"",j].filter(Boolean).join("\n"),o=await bs(m,n,!1,{maxTokens:i.maxTokens,signal:i.signal});if(o&&!(o.length<120))return ba(a6(o.startsWith("## ")?o:`## ${b.title}
44
+ ${g}`,{signal:e});return(ct(e),j?.facts?.length)?{facts:j.facts.filter(a=>a.key&&a.value).map(a=>{let b=h.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:bb(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 抽取 ${j.facts.length} 条事实`}]}:{facts:[],stages:f}}function bP(a){return/用户要求|出现禁用文本|资料未提供|导出|临时|无效|占位|示例|样例|生成未完成|低于目标页数|低于目标字数|文档预算未达成|正文篇幅低于目标|兜底|章节生成失败|大模型未能|重新生成|缺少配置小节|缺少必要的正式表格|正文缺少章节标题|其他项目|项目编号|项目名称|事实一致性冲突|工程专项资料角色缺失|章节缺少证据|文档质量基准评分未达标/iu.test(a.message)}function bQ(a){let b="string"==typeof a?a:a.message;return"error"===("string"==typeof a?void 0:a.level)||/阻断|缺少配置小节|缺少必要的正式表格|正文缺少章节标题|正文篇幅低于目标|低于目标字数|低于目标页数|章节生成失败|兜底|事实一致性冲突|其他项目|项目编号|项目名称|后台流程|提示词|资料未提供|占位|文档质量基准评分未达标/iu.test(b)?"blocking":/量化|数值|单位|清单|图纸|事实|requiredFacts|专业闭环|安全|质量|工期|表格|三级小节|目录|术语|不一致/iu.test(b)?"important":"minor"}function bR(a){return a.reduce((a,b)=>(a[bQ(b)]+=1,a),{blocking:0,important:0,minor:0})}function bS(a,b){return Math.ceil(bT(a)/bU(b))}function bT(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function bU(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 bV(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 bW(a){let b=a.title+a.purpose;return/方法|施工|技术|质量|安全|进度|资源|保障|措施|部署|方案/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function bX(a){return a.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a))}function bY(a,b){return`${a.name}:${b}`}function bZ(a){let b=[...a.matchAll(/^##\s+第[一二三四五六七八九十百]+章\s+.+$/gmu)],c=[];for(let d=1;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f);/项目基本信息表|招标公告项目基本信息|^###\s*项目基本信息\s*$/mu.test(g)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现项目基本信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(b.length>0){let d=b[0].index||0,e=b[1]?.index??a.length,f=a.slice(d,e),g=f.search(/项目基本信息表|招标公告项目基本信息|\|\s*(?:字段|项目|内容)\s*\|/u);if(g>0){let a=f.slice(0,g).replace(/^##\s+.+$/gmu,"").replace(/^###\s+.+$/gmu,""),b=["项目名称","项目编号","实施地点","建设地点","建设单位","招标人","实施范围","招标范围","工期周期","计划工期","质量标准"].filter(b=>RegExp(`${b}\\s*[::]`,"u").test(a));b.length>=3&&c.push({level:"warning",message:`项目基本信息表前重复叙述字段:${b.join("、")}`,suggestion:"项目基本信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述项目名称、编号、地点、工期、质量等字段。"})}}return c}function b$(a){let b=[],c=["本节","本章将","以下从","以下内容","综上所述"].filter(b=>a.includes(b));return c.length>0&&b.push({level:"warning",message:`存在模板化前缀或套话:${c.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入施工对象、工艺动作、控制措施、检查验收和责任闭环。"}),b}function b_(a){return a.filter(a=>(a.sections||[]).length<3).map(a=>({level:"error",message:`${a.title} 二级小节少于 3 个`,suggestion:"请由模型结合章节主题、项目资料和专业写作需要补齐 3-6 个正式二级小节,不得使用代码默认小节。"}))}function b0(a){let b=/^##\s+目录\s*$([\s\S]*?)(?=\n<div class="page-break"><\/div>|\n##\s+)/mu.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=b[1].split(/\r?\n/u).filter(a=>a.trim()).filter(a=>/^\s*\d+\.\d+\s+\S/u.test(a));return c.length>0&&c.every(a=>!/^\s{2,}\d+\.\d+\s+\S/u.test(a))?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function b1(a,b){let c=[],d=a.replace(/\s+/gu,""),e=[...new Set(b.preciseFacts.filter(a=>/drawing|table|bill|boq|清单|工程量|图纸|draw/u.test(`${a.processingType||""} ${a.roleId} ${a.sourceFile}`)).flatMap(a=>`${a.key} ${a.value}`.match(/(?:DN\d+|φ\d+|Φ\d+|\d+(?:\.\d+)?\s*(?:mm|cm|m|㎡|m²|m3|MPa|kPa|℃|%|台|套|个|项|日历天|天)|\d+\s*[×xX]\s*\d+(?:\s*[×xX]\s*\d+)?\s*mm|GB\/?T?\s*\d+(?:[-—]\d+)?|JGJ\/?T?\s*\d+(?:[-—]\d+)?|CJJ\/?T?\s*\d+(?:[-—]\d+)?)/giu)||[]))].slice(0,160),f=e.filter(a=>d.includes(a.replace(/\s+/gu,"")));return e.length>=20&&f.length/e.length<.28&&c.push({level:"error",message:`清单/图纸精确参数使用不足:${f.length}/${e.length}`,suggestion:"请把清单和图纸中的规格、管径、尺寸、厚度、强度、工程量、设备数量和规范编号写入对应分项章节,禁止泛化概括。"}),b.bills.length>0&&!/(清单|工程量|项目特征|分部分项|分项工程)/u.test(a)&&c.push({level:"error",message:"正文未体现工程量清单项目特征或分部分项信息",suggestion:"请从清单中提取分部分项、项目特征、单位、工程量和材料设备参数补入施工范围和施工方法。"}),b.drawings.length>0&&!/(图纸|设计说明|系统图|节点|平面|立面|管径|标高|尺寸|做法)/u.test(a)&&c.push({level:"error",message:"正文未体现图纸/设计说明参数",suggestion:"请从图纸和设计说明中提取系统、节点、构造做法、规格尺寸、管径标高和试验验收要求。"}),c}function b2(a){let b=[];for(let c of[/见(?:招标文件|招标公告|图纸|设计文件|相关文件)/u,/按(?:图纸|设计要求|相关规范|有关规范|文件要求)/u,/满足(?:相关|有关)?要求/u,/\|\s*(?:[/—-]|无|暂无|待定|待补充|N\/?A)\s*\|/iu])c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见文件/按图纸”。"});return b}function b3(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,d=(0,p.V)().autoSpecGates.filter(a=>a.templateMatchers.some(a=>{try{return RegExp(a,"iu").test(c)}catch{return c.includes(a)}}));if(0===d.length)return[];let e=[],f=bX(a).length;for(let b of d.flatMap(a=>a.requiredTexts))a.includes(b)||e.push({level:"error",message:`配置要求缺少必要内容:${b}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let b of d.flatMap(a=>a.forbiddenTexts))a.includes(b)&&e.push({level:"error",message:`配置要求不得出现:${b}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"});/^#\s+/mu.test(a)&&e.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"});let g=Math.max(0,...d.map(a=>a.minTables||0));return g&&f<g&&e.push({level:"error",message:`配置要求正式表格不足:${f}/${g}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),e}async function b4(a,b,c,d,e,f,g,h="",i={}){let j=aw(av(b,c));if(!j.trim()&&!h.trim())return;let k=bh([e,g||""].filter(Boolean).join("\n\n")),l=b.sections?.length?`本章必须完整包含以下二级小节,且每个小节都要有实质正文:
45
+ ${b.sections.map(a=>`- ${a}`).join("\n")}`:k.explicitStructure||k.explicitSections||k.lengthLimit||k.wantsConcise?"本章未预设二级小节;请优先遵循用户提示词和模板结构组织内容,不得因系统增强自行扩展小节。":"本章未预设二级小节;必须根据章节主题、项目资料和专业写作需要生成 3-6 个正式二级小节,不得新增、删除或重排一级章节。",m=function(a,b){let c=b5(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),n=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",br,"准确性优先级:用户需求/模板章节 > 绑定提示词与角色节点结构化事实 > 知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。","提示词角色只提供规则和格式约束;其中的示例、样例、占位项目名、编号、日期、数量、清单和示例正文不得作为当前项目事实,不得写入正文。",i.forbidDrawingImages?"图片/图纸类资料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),o=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,l,m,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
46
+ ${f}`:"",i.projectBasicFactContext||"",h||"",i.factCoverageContext||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:",`- 首轮生成必须尽量达到目标篇幅的 85%-95%;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""},不得依赖后续扩写补救。`,"- 保留章节标题;如模板配置了小节,必须按配置完整生成;如未配置小节且用户未限制结构,必须生成 3-6 个正式二级小节;每个二级小节必须有实质正文,不能只有标题或表格。",b.tableSections?.length?`- 本章以下小节适合使用正式表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴资料摘录。`:"","- 表格只用于模板、用户要求或资料内容适合结构化表达的位置;表格前必须说明数据来源和适用范围,表格后必须说明控制措施、结论或执行要求,不能整节只有表格。","- 不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。","- 每个核心小节必须形成“对象/范围 → 依据/关键事实 → 执行或说明动作 → 控制要求 → 结果/责任闭环”的完整表达链条;具体术语以模板、用户要求和资料内容为准。","- 二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;三级小节不纳入目录;不得使用无编号独立加粗行表示三级小节。","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、标准要求、约束条件等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 日期、数量、数值、规格、周期、资源、范围、对象等量化内容必须来自资料或明确推导;无依据时不得编造具体值。","- 如果同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项,必须逐项覆盖适用范围和对应依据,不得只写其中一个。","- 对模板和资料中已经明确给出的关键事实、数量、时间、规格、标准、范围、对象、责任或约束,必须写入对应小节,不能只写原则性要求。","- 严禁使用空泛占位表达替代资料事实;确实缺少资料时,只能写成待复核事项、约束条件或控制措施,不得编造具体数值。","- 正文不得出现“知识库”“证据”“检索”“角色节点”“事实字段”“校验结果”等后台系统话术。","- 存在事实冲突时,优先遵循用户要求、模板结构、绑定文件证据和提示词角色;后台内容优化建议仅作质量参考;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",i.targetWords&&i.targetWords>=3500?"- 用户已提出较高篇幅目标,本章必须围绕每个二级小节充分展开对象范围、资料依据、关键事实、执行要求、风险约束、检查确认和责任闭环;不得用摘要式段落替代正文。":"","",j?"内部资料:":"",j].filter(Boolean).join("\n"),p=await bK(n,o,!1,{maxTokens:i.maxTokens,signal:i.signal});if(p&&!(p.length<120))return bq(bm(p.startsWith("## ")?p:`## ${b.title}
47
47
 
48
- ${o}`,!!i.forbidDrawingImages))}function bN(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.max(700,Math.floor(b/c.length));return c.map(a=>({title:a,targetWords:d}))}async function bO(a){let b=function(a,b,c,d=45){let e=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))].slice(0,40),f=c.map((b,c)=>{let d=`${b.sectionTitle||""}
49
- ${b.content}`.toLowerCase(),f=e.reduce((a,b)=>a+ +!!d.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).slice(0,d).map(a=>a.item);return f.length>=Math.min(12,c.length)?f:c.slice(0,d)}(a.sectionTitle,a.chapter,a.evidence),c=av(au(a.chapter,b)),d=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文:
48
+ ${p}`,!!i.forbidDrawingImages))}function b5(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.max(700,Math.floor(b/c.length));return c.map(a=>({title:a,targetWords:d}))}async function b6(a){let b=function(a,b,c,d=45){let e=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))].slice(0,40),f=c.map((b,c)=>{let d=`${b.sectionTitle||""}
49
+ ${b.content}`.toLowerCase(),f=e.reduce((a,b)=>a+ +!!d.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).slice(0,d).map(a=>a.item);return f.length>=Math.min(12,c.length)?f:c.slice(0,d)}(a.sectionTitle,a.chapter,a.evidence),c=aw(av(a.chapter,b)),d=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文:
50
50
  ${a.projectContext}`:"",a.factCoverageContext||"",a.roleContext,a.missingFacts.length?`需要特别补足的事实:${a.missingFacts.join("、")}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字。`,"- 内容必须围绕当前小节,不得生成其他二级小节,不得重复章节一级标题。","- 必须把资料中的关键事实、数量、时间、规格、标准、范围、对象、责任或约束写入正文;缺少依据时不得编造。","- 每个小节必须包含对象/范围、依据/关键事实、处理要求、控制措施和结果闭环;具体术语以模板、用户要求和资料为准。","- 表格只能作为辅助表达,表格前后必须有正文说明,不能整节只有表格。",c?`内部资料:
51
- ${c}`:""].filter(Boolean).join("\n\n"),e=await bs(["你是正式业务文档的小节生成专家。",bb,a.promptTexts].filter(Boolean).join("\n\n"),d,!1,{maxTokens:bQ(a.targetWords),temperature:.25,signal:a.signal});if(e&&!(e.length<80))return ba(a6(e.startsWith("### ")?e:`### ${a.sectionTitle}
51
+ ${c}`:""].filter(Boolean).join("\n\n"),e=await bK(["你是正式业务文档的小节生成专家。",br,a.promptTexts].filter(Boolean).join("\n\n"),d,!1,{maxTokens:b8(a.targetWords),temperature:.25,signal:a.signal});if(e&&!(e.length<80))return bq(bm(e.startsWith("### ")?e:`### ${a.sectionTitle}
52
52
 
53
- ${e}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}async function bP(a){let b=bN(a.chapter,a.targetWords);if(b.length<2||a.targetWords<6e3)return;let c=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_SECTION_CONCURRENCY??4))),d=Array(b.length);for(let e=0;e<b.length;e+=c){let f=b.slice(e,e+c);(await Promise.all(f.map(b=>bO({...a,sectionTitle:b.title,targetWords:b.targetWords})))).forEach((a,b)=>{d[e+b]=a})}if(!d.some(a=>!a))return ba(a6(`## ${a.chapter.title}
53
+ ${e}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}async function b7(a){let b=b5(a.chapter,a.targetWords);if(b.length<2||a.targetWords<6e3)return;let c=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_SECTION_CONCURRENCY??4))),d=Array(b.length),e=async(b,c=!1)=>{let d=a.projectRoot&&a.fileRolesHash?{template:a.template,chapter:a.chapter,sectionTitle:b.title,evidence:c?a.evidence.slice(0,80):a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,projectRoot:a.projectRoot,modelName:a.modelName,targetWords:b.targetWords,fileRolesHash:a.fileRolesHash}:void 0;if(!c&&d){let b=function(a,b){let c=a7(a),d=aM.get(c),e=d?.value||a$(a.projectRoot,"section-draft",c);if(!e?.trim()){b&&(b.cache.sectionMisses+=1);return}if(/后台流程话术|提示词|占位|TODO|待补充/iu.test(e)||bT(e)<Math.max(120,Math.floor(.45*a.targetWords))){b&&(b.cache.rejectedHits+=1);return}return aU(aM,c,{value:e,updatedAt:Date.now(),hits:(d?.hits||0)+1}),b&&(b.cache.sectionHits+=1,b.quality.reusedSectionCount+=1),e}(d,a.diagnostics);if(b)return b}try{let e=await b6({...a,evidence:c?a.evidence.slice(0,80):a.evidence,projectContext:c?a.projectContext.slice(0,8e3):a.projectContext,roleContext:c?a.roleContext.slice(0,12e3):a.roleContext,factCoverageContext:c?a.factCoverageContext?.slice(0,8e3):a.factCoverageContext,sectionTitle:b.title,targetWords:b.targetWords});return e&&d&&function(a,b,c){if(!b.trim()||/后台流程话术|提示词|占位|TODO|待补充/iu.test(b))return;let d=a7(a);aU(aM,d,{value:b,updatedAt:Date.now(),hits:0}),a_(a.projectRoot,"section-draft",d,b),c&&(c.cache.sectionWrites+=1)}(d,e,a.diagnostics),e}catch(c){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${b.title}`,c);return}};for(let f=0;f<b.length;f+=c){ct(a.signal);let g=b.slice(f,f+c);(await Promise.all(g.map(a=>e(a)))).forEach((a,b)=>{d[f+b]=a})}let f=Math.max(0,Math.min(b.length,Number(process.env.DOCUMENT_SECTION_RETRY_LIMIT??4))),g=d.map((a,b)=>a?-1:b).filter(a=>a>=0).slice(0,f);for(let f=0;f<g.length;f+=c){ct(a.signal);let h=g.slice(f,f+c);(await Promise.all(h.map(a=>e(b[a],!0)))).forEach((a,b)=>{a&&(d[h[b]]=a)})}if(!d.some(a=>!a))return bq(bm(`## ${a.chapter.title}
54
54
 
55
- ${d.filter(Boolean).join("\n\n")}`,a.forbidDrawingImages))}function bQ(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function bR(a){let b=a||1200;return b>=8e3?9e5:b>=5e3?6e5:b>=3e3?42e4:3e5}function bS(a){return a<=0?0:Math.min(3,Math.max(1,Math.ceil(a/4e3)))}async function bT(a){let b=bz(a.currentContent);if(a.targetChars-b<=300)return a.currentContent;let c=av(au(a.chapter,a.evidence)),d=await bs(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",bb,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。","不得输出“已满足要求”“由于资料有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,本轮应尽量扩展到接近目标。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和责任闭环补充。资料没有新的精确数值时,可以扩展过程性或管理性正文,但不得编造具体数值。",a.roleContext,c?`内部资料:
56
- ${c}`:"","当前章节 Markdown:",a.currentContent.slice(-24e3)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??bQ(b,a.targetChars),temperature:.25,signal:a.signal});if(!d||d.length<120)return a.currentContent;let e=ba(a6(d.startsWith("## ")?d:`## ${a.chapter.title}
55
+ ${d.filter(Boolean).join("\n\n")}`,a.forbidDrawingImages))}function b8(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function b9(a){let b=a||1200;return b>=8e3?9e5:b>=5e3?6e5:b>=3e3?42e4:3e5}function ca(a){return a<=0?0:Math.min(3,Math.max(1,Math.ceil(a/4e3)))}async function cb(a){let b=bT(a.currentContent);if(a.targetChars-b<=300)return a.currentContent;let c=aw(av(a.chapter,a.evidence)),d=await bK(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",br,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。","不得输出“已满足要求”“由于资料有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,本轮应尽量扩展到接近目标。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和责任闭环补充。资料没有新的精确数值时,可以扩展过程性或管理性正文,但不得编造具体数值。",a.roleContext,c?`内部资料:
56
+ ${c}`:"","当前章节 Markdown:",a.currentContent.slice(-24e3)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??b8(b,a.targetChars),temperature:.25,signal:a.signal});if(!d||d.length<120)return a.currentContent;let e=bq(bm(d.startsWith("## ")?d:`## ${a.chapter.title}
57
57
 
58
- ${d}`,a.forbidDrawingImages));return!function(a,b,c,d){let e=bz(a),f=bz(b),g=ay(c).slice(0,6),h=Math.min(300,Math.max(80,Math.floor(.2*Math.max(0,d-e))));return!(f<e+h&&f<Math.floor(.92*d))&&!(f<.98*e)&&(!g||!!b.includes(g))}(a.currentContent,e,a.chapter.title,a.targetChars)?a.currentContent:e}async function bU(a){let b=bN(a.chapter,a.targetWords);if(b.length<2||a.targetWords<3e3)return a.content;let c=a.content,d=b.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),d=c.match(RegExp(`^###\\s+${b}\\s*\\n([\\s\\S]*?)(?=^###\\s+|$)`,"mu")),e=bz(d?.[1]||"");return{...a,currentWords:e}}).filter(a=>a.currentWords<Math.floor(.55*a.targetWords)).slice(0,4),e=Array(b.length),f=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??4)));for(let c=0;c<d.length;c+=f){let g=d.slice(c,c+f),h=await Promise.all(g.map(b=>bO({...a,sectionTitle:b.title,targetWords:Math.max(700,b.targetWords-b.currentWords)})));g.forEach((a,c)=>{e[b.findIndex(b=>b.title===a.title)]=h[c]})}return e.forEach((a,d)=>{a&&(c=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^###\\s+${d}\\s*\\n)([\\s\\S]*?)(?=^###\\s+|$)`,"mu");return e.test(a)?a.replace(e,c.trim()+"\n\n"):`${a.trim()}
58
+ ${d}`,a.forbidDrawingImages));return!function(a,b,c,d){let e=bT(a),f=bT(b),g=az(c).slice(0,6),h=Math.max(0,d-e),i=Math.min(300,Math.max(80,Math.floor(.2*h)));return(!(h>0)||!(f<e+i))&&!(f<.98*e)&&(!g||!!b.includes(g))}(a.currentContent,e,a.chapter.title,a.targetChars)?a.currentContent:e}async function cc(a){let b=b5(a.chapter,a.targetWords);if(b.length<2||a.targetWords<3e3)return a.content;let c=a.content,d=b.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),d=c.match(RegExp(`^###\\s+${b}\\s*\\n([\\s\\S]*?)(?=^###\\s+|$)`,"mu")),e=bT(d?.[1]||"");return{...a,currentWords:e}}).filter(a=>a.currentWords<Math.floor(.55*a.targetWords)).slice(0,4),e=Array(b.length),f=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??4)));for(let c=0;c<d.length;c+=f){let g=d.slice(c,c+f),h=await Promise.all(g.map(b=>b6({...a,sectionTitle:b.title,targetWords:Math.max(700,b.targetWords-b.currentWords)})));g.forEach((a,c)=>{e[b.findIndex(b=>b.title===a.title)]=h[c]})}return e.forEach((a,d)=>{a&&(c=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^###\\s+${d}\\s*\\n)([\\s\\S]*?)(?=^###\\s+|$)`,"mu"),f=c.trim().replace(/^###\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()}
59
59
 
60
- ${c.trim()}`}(c,b[d].title,a))}),ba(a6(c,a.forbidDrawingImages))}async function bV(a){let b=a.content,c=bS(a.targetChars-bz(b)),d=0;for(;d<c&&bz(b)<Math.floor(.92*a.targetChars);d+=1){b7(a.signal);let c=b,d=await bt(c=>bT({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:a.targetChars,forbidDrawingImages:a.forbidDrawingImages,maxTokens:a.maxTokens,signal:c}),bR(a.targetChars),a.signal);if(!d||d===c)break;b=d}return{content:b,rounds:d}}function bW(a,b){let c=bz(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}async function bX(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=bz(b.map(a=>a.content).join("\n\n")),d=Math.min(2,bS(a.budget.minChars-c));for(let e=0;e<d&&c<a.budget.minChars;e+=1){b7(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=bz(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500).sort((a,b)=>b.deficit-a.deficit);if(0===e.length)break;for(let d of e){let e=await bV({template:a.template,chapter:{id:d.chapter.id,title:d.chapter.title,purpose:d.chapter.title,queries:[],requiredFacts:[],sections:d.chapter.sections},content:d.chapter.content,evidence:d.chapter.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:d.target,forbidDrawingImages:a.forbidDrawingImages,maxTokens:bQ(d.current,d.target),signal:a.signal});if((c=bz((b=b.map(a=>a.id===d.chapter.id?{...a,content:e.content}:a)).map(a=>a.content).join("\n\n")))>=a.budget.minChars)break}if(c<=d+200)break}return b}async function bY(a){b7(a.signal);let b=av(au({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?`优化建议包:${a.spec.name}
60
+ ${d}
61
+
62
+ `:`${b}${c.trim()}
63
+
64
+ `}):f?`${a.trim()}
65
+
66
+ ### ${b}
67
+
68
+ ${f}`:a}(c,b[d].title,a))}),bq(bm(c,a.forbidDrawingImages))}async function cd(a){let b=a.content,c=0,d=ca(a.targetChars-bT(b));for(;c<d&&bT(b)<a.targetChars;c+=1){ct(a.signal);let c=b,d=await bL(c=>cb({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:a.targetChars,forbidDrawingImages:a.forbidDrawingImages,maxTokens:a.maxTokens,signal:c}),b9(a.targetChars),a.signal);if(!d||d===c)break;b=d}return{content:b,rounds:c}}function ce(a,b){let c=bT(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}async function cf(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=bT(b.map(a=>a.content).join("\n\n")),d=Math.min(2,ca(a.budget.minChars-c)),e=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??2))),f=new Set;for(let g=0;g<d&&c<a.budget.minChars;g+=1){ct(a.signal);let d=c,g=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=bT(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500&&!f.has(a.chapter.id)).sort((a,b)=>b.deficit-a.deficit);if(0===g.length)break;for(let d=0;d<g.length&&c<a.budget.minChars;d+=e){ct(a.signal);let h=g.slice(d,d+e);for(let c of(await Promise.all(h.map(async b=>{let c=await cd({template:a.template,chapter:{id:b.chapter.id,title:b.chapter.title,purpose:b.chapter.title,queries:[],requiredFacts:[],sections:b.chapter.sections},content:b.chapter.content,evidence:b.chapter.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:b.target,forbidDrawingImages:a.forbidDrawingImages,maxTokens:b8(b.current,b.target),signal:a.signal});return{id:b.chapter.id,beforeChars:b.current,content:c.content}}))))bT(c.content)<=c.beforeChars+300&&f.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=bT(b.map(a=>a.content).join("\n\n"))}if(c<=d+300)break}return b}async function cg(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 b=0;b<a.chapters.length;b+=c){ct(a.signal);let e=a.chapters.slice(b,b+c);(await Promise.all(e.map(async b=>{let c,d=a.budget.chapterTargets.get(b.id)||1200,e=bu({chapter:a.template.chapters.find(a=>a.id===b.id)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},content:b.content,missingFacts:b.missingFacts,targetWords:d}),f=await bK(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${b.title}`,`目标深度:约 ${d} 字;当前 ${bT(b.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",b.missingFacts.length?`未覆盖事实:${b.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"","章节正文:",b.content.slice(0,18e3),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});try{c=f?JSON.parse(f.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim()):void 0}catch{c=void 0}let g=[...e,...Array.isArray(c?.issues)?c.issues.filter(Boolean).slice(0,6):[]],h=c?.status==="fail"||e.some(a=>/缺失|占位|泄露|不足/u.test(a))?"fail":c?.status==="warn"||g.length>0?"warn":"pass";return{chapterId:b.id,title:b.title,status:h,issues:[...new Set(g)].slice(0,8),suggestions:Array.isArray(c?.suggestions)?c.suggestions.filter(Boolean).slice(0,5):[],chars:bT(b.content)}}))).forEach((a,c)=>{d[b+c]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:bj({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:cv(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function ch(a){let b=Date.now(),c=a.chapters.map(b=>`- ${b.title}:${bT(b.content)} 字;审查=${a.chapterReviews.find(a=>a.chapterId===b.id)?.status||"unknown"};问题=${(a.chapterReviews.find(a=>a.chapterId===b.id)?.issues||[]).slice(0,3).join(";")||"无"}`).join("\n"),d=(await bK(["你是长文档全局一致性审查专家。只检查跨章节问题,不重写正文。","重点检查:章节之间项目信息冲突、术语不一致、重复堆砌、目录层级异常、风险/质量/安全/进度闭环缺失、前后矛盾。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文摘要:
69
+ ${a.projectContext.slice(0,8e3)}`:"","章节审查摘要:",c,"章节摘录:",a.chapters.map(a=>`## ${a.title}
70
+ ${a.content.slice(0,2500)}
71
+ ...
72
+ ${a.content.slice(-1200)}`).join("\n\n---\n\n"),"请只返回跨章节问题清单和建议,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:1800,temperature:0,signal:a.signal,diagnostics:a.diagnostics})||"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6).slice(0,10);return{issues:d,stage:bj({type:"llm_review",roleId:"global-consistency-review",status:d.length>0?"fallback":"success",message:cv(d.length>0?`全局一致性审查发现 ${d.length} 个需关注问题`:"全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function ci(a){ct(a.signal);let b=aw(av({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?`优化建议包:${a.spec.name}
61
73
  建议关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
62
74
  章节内容建议:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
63
75
  质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
64
- 约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",d=await bs(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、资料事实内化使用、参数数字准确性、冲突事实、解析器内部对象名、表格呈现、表达专业性、导出友好性、系统提示泄露。","只返回简短审查结论和问题清单;不得返回优化后的完整 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆:
65
- ${a.projectContext}`:"",c,"知识库证据摘要:",b,"待审查初稿:",a.markdown.slice(0,24e3),"请只返回审查问题清单,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:2e3,temperature:0,signal:a.signal});return b7(a.signal),{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:d?"success":"skipped",message:d?`已完成非重写式质量审查:${d.slice(0,180)}`:"无可用模型或审查结果不可用,保留生成初稿"}}}function bZ(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>ay(a[1]||"")).filter(a=>a.length>=2&&a.length<=80))].slice(0,12)}function b$(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=ay(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function b_(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;if(!c)return a;let e=/^####\s+(.+)$/u.exec(a.trim());if(e){let b=(e[1]||"").trim();if(/^\d+\.\d+\.\d+\s+\S/u.test(b))return a;let f=ay(b);return d+=1,`#### ${c}.${d} ${f}`}let f=b$(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function b0(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(`^${b4(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${ay(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}let g=b$(a);g&&b.push({level:"warning",message:`独立加粗行疑似未编号三级小节:${g}`,suggestion:"请改为“#### 章号.节号.序号 标题”,不要用无编号加粗行表示三级小节。"})}return b.slice(0,20)}function b1(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[aB(b,a.title),"",...c.flatMap((a,c)=>[` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`,""])]})].join("\n")}function b2(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 b3(a,b){let c=b2(a);b.forEach((a,b)=>{let d=ay(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${b4(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${aB(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0;return d.map(a=>{let b=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(b))return e+=1,f=0,a;let c=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(b);if(e>=0&&c)return f=Number(c[2])||f+1,`### ${e+1}.${f} ${ay(c[3]||"")}`;let d=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(b);return e>=0&&d?(f+=1,`### ${e+1}.${f} ${ay(d[3]||"")}`):a}).join("\n")}function b4(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function b5(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=ay(b),d=RegExp(`(^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${b4(c)}\\s*$)([\\s\\S]*?)(?=\\n##\\s+|(?![\\s\\S]))`,"mu").exec(a);if(d&&void 0!==d.index)return{start:d.index,end:d.index+d[0].length,heading:d[1]||`## ${b}`,body:d[2]||""}}(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){let b=a.replace(/^\s*\d+(?:\.\d+)+\s+/u,"").trim();return RegExp(`^###\\s+(?:${b4(a)}|(?:\\d+(?:\\.\\d+)+\\s+)?${b4(b)})\\s*$`,"mu")})(a).test(e));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 b6(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${aB(b,a.title)}`,d=ba(a.content);return/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
76
+ 约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",d=await bK(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、资料事实内化使用、参数数字准确性、冲突事实、解析器内部对象名、表格呈现、表达专业性、导出友好性、系统提示泄露。","只返回简短审查结论和问题清单;不得返回优化后的完整 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆:
77
+ ${a.projectContext}`:"",c,"知识库证据摘要:",b,"待审查初稿:",a.markdown.slice(0,24e3),"请只返回审查问题清单,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:2e3,temperature:0,signal:a.signal});return ct(a.signal),{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:d?"success":"skipped",message:d?`已完成非重写式质量审查:${d.slice(0,180)}`:"无可用模型或审查结果不可用,保留生成初稿"}}}function cj(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>az(a[1]||"")).filter(a=>a.length>=2&&a.length<=80))].slice(0,12)}function ck(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=az(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function cl(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;if(!c)return a;let e=/^####\s+(.+)$/u.exec(a.trim());if(e){let b=(e[1]||"").trim();if(/^\d+\.\d+\.\d+\s+\S/u.test(b))return a;let f=az(b);return d+=1,`#### ${c}.${d} ${f}`}let f=ck(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function cm(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(`^${cq(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${az(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}let g=ck(a);g&&b.push({level:"warning",message:`独立加粗行疑似未编号三级小节:${g}`,suggestion:"请改为“#### 章号.节号.序号 标题”,不要用无编号加粗行表示三级小节。"})}return b.slice(0,20)}function cn(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[aC(b,a.title),"",...c.flatMap((a,c)=>[` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`,""])]})].join("\n")}function co(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 cp(a,b){let c=co(a);b.forEach((a,b)=>{let d=az(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${cq(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${aC(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0;return d.map(a=>{let b=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(b))return e+=1,f=0,a;let c=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(b);if(e>=0&&c)return f=Number(c[2])||f+1,`### ${e+1}.${f} ${az(c[3]||"")}`;let d=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(b);return e>=0&&d?(f+=1,`### ${e+1}.${f} ${az(d[3]||"")}`):a}).join("\n")}function cq(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function cr(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=az(b),d=RegExp(`(^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${cq(c)}\\s*$)([\\s\\S]*?)(?=\\n##\\s+|(?![\\s\\S]))`,"mu").exec(a);if(d&&void 0!==d.index)return{start:d.index,end:d.index+d[0].length,heading:d[1]||`## ${b}`,body:d[2]||""}}(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){let b=a.replace(/^\s*\d+(?:\.\d+)+\s+/u,"").trim();return RegExp(`^###\\s+(?:${cq(a)}|(?:\\d+(?:\\.\\d+)+\\s+)?${cq(b)})\\s*$`,"mu")})(a).test(e));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 cs(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${aC(b,a.title)}`,d=bq(a.content);return/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
66
78
 
67
- ${d}`})(a,b)).filter(Boolean).join("\n\n"),c=b1(a.chapters);return ba(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',c,'\n<div class="page-break"></div>\n',b].join("\n"))}function b7(a){if(a?.aborted)throw Error("用户中止")}function b8(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 b9(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}async function ca(a){var b,c;b7(a.signal);let g=ai(a.templateId);if(!g)throw Error("Document template not found");let i=e.resolve(a.projectRoot||(0,l.aY)());if(!i)throw Error("No knowledge base project found");let k=(0,j.computeProjectId)(i),n=g,ab=(0,l.Qh)(),ac=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),ad=bh(n)||"none",ae=(0,o.Mu)(ad)?.name||ad,af=[a3({type:"role_binding",roleId:ad,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${n.name};当前项目 ${k};资料目录 ${e.join(i,"knowledgeBase")}`},{subtitle:ae,roleName:ae,order:0})];a.onProgress?.([...af]);let ah=bj(n),aj=bk(n);if(b8(af,a3({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与项目资料摘要"},{subtitle:"生成准备",order:af.length})),a.onProgress?.([...af]),0===aj.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let ak=ag(ah).filter(a=>/<\s*OUTLINE\s*>[\s\S]*?<\/\s*OUTLINE\s*>/iu.test(a.content)).map(a=>`## [${a.roleId}] ${a.name}
68
- ${a.content}`).join("\n\n"),al=function(a){for(let b of a){let a=function(a,b,c){let d=[];for(let e of function(a,b){let c=[...a.matchAll(/<\s*OUTLINE\s*>([\s\S]*?)<\/\s*OUTLINE\s*>/giu)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?OUTLINE\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*OUTLINE\s*>|END\s+OUTLINE|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${aw}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],d=a.replace(/\r?\n/gu,"\n");for(let a of c)d=(d=(d=d.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return d.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}|${aw})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${aw})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!ax(a))}(e))d.push({id:`explicit-${b}-${d.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return d.filter(a=>!ax(a.title)).slice(0,80)}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}([{text:a.requirement,source:"用户需求"},{text:ak,source:"提示词角色",strict:!0}]),am=al.length>=2;am&&(n={...g,chapters:al});let ap=function(a,b){let c=(0,l.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(E)),e=c.filter(a=>d.has(E(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>F(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=F(b.relativePath);if(!c)continue;let d=c.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u).map(a=>a.trim()).filter(a=>a.length>=2).reduce((a,b)=>a+ +!!f.includes(b),0);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=>F(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>F(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>F(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,g=function(){let a={};for(let b of A)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[E(a.filePath),a.roles]));for(let a of f){let b=E(a.relativePath),c=[...h.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(u(a,t));return b.add("project_overview"),[...b]}(a.relativePath),...c])])g[b].push({filePath:a.relativePath,fileName:e.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let i=function(a){let b=a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).filter(Boolean),c=b.find(a=>/项目/iu.test(a)&&a.length>=6&&!/\.\w+$/u.test(a));if(c)return c;let d=b.find(a=>/项目/iu.test(a)&&a.length>=6);return d?.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")||"当前知识库项目"}(f),j=function(a){let b=a.map(a=>a.relativePath).join("\n");return b.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0]}(f),k=function(a,b){let c=C(a),d=C(b),e=B(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=B(a.map(a=>F(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,tenderNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a)).slice(0,20)}}(f,c),m=function(a){let b=a.map(a=>a.relativePath).join("\n");return{ownerNames:B([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:B([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:B([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:B([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=z.filter(a=>g[a].length>0),o=z.filter(a=>0===g[a].length);return{projectId:i.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:i,generatedAt:Date.now(),fingerprint:k.fingerprint,contaminationCandidates:k.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:i,tenderNo:j,constructionScope:g.construction_scope.slice(0,12).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(g.construction_scope.concat(g.drawings,g.bill_of_quantities).slice(0,16).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:g.schedule_quality_safety.length?"已识别工期/质量/安全文明相关资料,生成时应以招标文件、补遗和技术要求为准。":void 0,qualityRequirement:g.schedule_quality_safety.length?"已识别质量验收相关资料。":void 0,safetyRequirement:g.schedule_quality_safety.length?"已识别安全文明相关资料。":void 0,materialBrandRequirement:g.brand_recommendation.length?"已识别推荐品牌或材料设备相关资料。":void 0,ownerNames:m.ownerNames,locationNames:m.locationNames,scheduleValues:m.scheduleValues,qualityTargets:m.qualityTargets},materialInventory:g,extractedSections:{projectOverview:`项目资料组:${i}${j?`,招标/项目编号:${j}`:""}。`,scopeSummary:`施工范围资料:${D(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${D(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${D(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${D(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:z,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:z.length?n.length/z.length:1}}}(i,{requirement:a.requirement,boundFilePaths:aj.map(a=>a.filePath),boundFileRoles:function(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,/tender|response|requirements|招标|评审|实质/u.test(c)?["tender_document","technical_specification","schedule_quality_safety"]:/boq|清单|scope|工程量/u.test(c)?["bill_of_quantities","construction_scope","control_price"]:/drawing|drawings|图纸|design/u.test(c)?["drawings"]:/schedule|quality|safety|工期|质量|安全/u.test(c)?["schedule_quality_safety","technical_specification"]:/risk|constraints|现场|重点|难点/u.test(c)?["risk_constraints","addendum","tender_document"]:/material|equipment|brand|材料|设备|品牌/u.test(c)?["brand_recommendation","bill_of_quantities","technical_specification"]:/enterprise|reference|经验|体系/u.test(c)?["project_overview","technical_specification"]:["project_overview"])])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}(aj)}),at=function(a,b=""){let c=function(a,b=""){return h.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)if(c.patterns.some(b=>b.test(a)))return c.output[0]}(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`,q)||a.category||"业务文档",e=function(a,b){let c=[a.name,a.category,a.outputTitle,a.description,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]])].filter(Boolean).join("\n"),d=new Set([...a.chapters.flatMap(a=>a.requiredFacts||[]),"项目名称","项目资料范围"]);for(let a of u(c,r))d.add(a);let e=y(a,b);if("施工组织设计"===b||e.length>0){for(let a of u("招标 施工 工程 清单 图纸 质量 工期 安全 文明 材料 重点 难点",r))d.add(a);for(let a of e.flatMap(a=>a.requiredFacts))d.add(a)}return[...d].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 x(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of w(c))b.add(a);let a=c.match(/(?:必须|需要|要求|一定要|务必|包含|包括|输出|写明)\s*([^。;;\n]{2,60})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&!/不要|禁止|不得|不能/u.test(a)).slice(0,30)}(b),i=function(a=""){let b=new Set;for(let c of x(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of w(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)).slice(0,30)}(b),j=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=y(a,d),l=Math.max(0,...k.map(a=>a.minTables||0)),m=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,l)||void 0,n=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 u(c,s))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(v),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),o=f.filter(a=>!n.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${v(a)}`,title:a,required:!0,order:n.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),p=[{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-${v(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-${v(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...l?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${l} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...f.map(a=>({id:`user-required-chapter-${v(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-${v(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...i.map(a=>({id:`user-forbidden-text-${v(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...m?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${m}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:m}}]:[],...j?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${j.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:j.min}}]:[],...j?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${j.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:j.max}}]:[]],t=[...n,...o];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:v(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/材料|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:t,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:p,builtIn:!0}}}(n,a.requirement||""),au=at.spec,av=function(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","construction_scope"]);return/投标|招标|施工|工程|建设|改造/iu.test(b)&&["tender_document","bill_of_quantities","schedule_quality_safety"].forEach(a=>c.add(a)),/图纸|施工|工程|建设|改造/iu.test(b)&&c.add("drawings"),c}(a);return(function(a){let b=new Set(u([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),t));return b.add("project_overview"),b.add("construction_scope"),[...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.slice(0,20).map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(n,ap),aC=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:n,spec:au,summary:ap,resolvedRoles:av});if(!aC.ready)throw Error(`生成准备度不足:${aC.blockingIssues.join(";")}`);let aD=[["## 后台项目资料摘要",ap.extractedSections.projectOverview,`项目指纹:项目名候选 ${ap.fingerprint.projectNames.join("、")||"无"};编号 ${ap.fingerprint.tenderNos.join("、")||"无"};资料组 ${ap.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*ap.fingerprint.confidence)}%。`,`内容级事实候选:建设/招标单位 ${ap.facts.ownerNames?.join("、")||"无"};地点 ${ap.facts.locationNames?.join("、")||"无"};工期 ${ap.facts.scheduleValues?.join("、")||"无"};质量 ${ap.facts.qualityTargets?.join("、")||"无"}。`,ap.extractedSections.scopeSummary,ap.extractedSections.boqSummary,ap.extractedSections.drawingSummary,ap.extractedSections.scheduleQualitySafetySummary,ap.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*ap.coverage.materialCompletenessRate)}%`].join("\n"),(b=at.sourceHash,`## 后台内容优化建议
79
+ ${d}`})(a,b)).filter(Boolean).join("\n\n"),c=cn(a.chapters);return bq(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',c,'\n<div class="page-break"></div>\n',b].join("\n"))}function ct(a){if(a?.aborted)throw Error("用户中止")}function cu(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 cv(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}async function cw(a){var b,c;ct(a.signal);let g=ai(a.templateId);if(!g)throw Error("Document template not found");let i=e.resolve(a.projectRoot||(0,l.aY)());if(!i)throw Error("No knowledge base project found");let k=(0,j.computeProjectId)(i),n=g,ab=(0,l.Qh)(),ac=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),ad=by(n)||"none",ae=(0,o.Mu)(ad)?.name||ad,af=[bj({type:"role_binding",roleId:ad,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${n.name};当前项目 ${k};资料目录 ${e.join(i,"knowledgeBase")}`},{subtitle:ae,roleName:ae,order:0})];a.onProgress?.([...af]);let ah=bA(n),aj=bB(n);if(cu(af,bj({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与项目资料摘要"},{subtitle:"生成准备",order:af.length})),a.onProgress?.([...af]),0===aj.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let ak=ag(ah).filter(a=>/<\s*OUTLINE\s*>[\s\S]*?<\/\s*OUTLINE\s*>/iu.test(a.content)).map(a=>`## [${a.roleId}] ${a.name}
80
+ ${a.content}`).join("\n\n"),al=function(a){for(let b of a){let a=function(a,b,c){let d=[];for(let e of function(a,b){let c=[...a.matchAll(/<\s*OUTLINE\s*>([\s\S]*?)<\/\s*OUTLINE\s*>/giu)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?OUTLINE\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*OUTLINE\s*>|END\s+OUTLINE|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${ax}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],d=a.replace(/\r?\n/gu,"\n");for(let a of c)d=(d=(d=d.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return d.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}|${ax})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${ax})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!ay(a))}(e))d.push({id:`explicit-${b}-${d.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return d.filter(a=>!ay(a.title)).slice(0,80)}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}([{text:a.requirement,source:"用户需求"},{text:ak,source:"提示词角色",strict:!0}]),am=al.length>=2;am&&(n={...g,chapters:al});let ap=function(a,b){let c=(0,l.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(E)),e=c.filter(a=>d.has(E(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>F(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=F(b.relativePath);if(!c)continue;let d=c.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u).map(a=>a.trim()).filter(a=>a.length>=2).reduce((a,b)=>a+ +!!f.includes(b),0);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=>F(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>F(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>F(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,g=function(){let a={};for(let b of A)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[E(a.filePath),a.roles]));for(let a of f){let b=E(a.relativePath),c=[...h.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(u(a,t));return b.add("project_overview"),[...b]}(a.relativePath),...c])])g[b].push({filePath:a.relativePath,fileName:e.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let i=function(a){let b=a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).filter(Boolean),c=b.find(a=>/项目/iu.test(a)&&a.length>=6&&!/\.\w+$/u.test(a));if(c)return c;let d=b.find(a=>/项目/iu.test(a)&&a.length>=6);return d?.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")||"当前知识库项目"}(f),j=function(a){let b=a.map(a=>a.relativePath).join("\n");return b.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0]}(f),k=function(a,b){let c=C(a),d=C(b),e=B(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=B(a.map(a=>F(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,tenderNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a)).slice(0,20)}}(f,c),m=function(a){let b=a.map(a=>a.relativePath).join("\n");return{ownerNames:B([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:B([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:B([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:B([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=z.filter(a=>g[a].length>0),o=z.filter(a=>0===g[a].length);return{projectId:i.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:i,generatedAt:Date.now(),fingerprint:k.fingerprint,contaminationCandidates:k.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:i,tenderNo:j,constructionScope:g.construction_scope.slice(0,12).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(g.construction_scope.concat(g.drawings,g.bill_of_quantities).slice(0,16).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:g.schedule_quality_safety.length?"已识别工期/质量/安全文明相关资料,生成时应以招标文件、补遗和技术要求为准。":void 0,qualityRequirement:g.schedule_quality_safety.length?"已识别质量验收相关资料。":void 0,safetyRequirement:g.schedule_quality_safety.length?"已识别安全文明相关资料。":void 0,materialBrandRequirement:g.brand_recommendation.length?"已识别推荐品牌或材料设备相关资料。":void 0,ownerNames:m.ownerNames,locationNames:m.locationNames,scheduleValues:m.scheduleValues,qualityTargets:m.qualityTargets},materialInventory:g,extractedSections:{projectOverview:`项目资料组:${i}${j?`,招标/项目编号:${j}`:""}。`,scopeSummary:`施工范围资料:${D(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${D(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${D(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${D(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:z,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:z.length?n.length/z.length:1}}}(i,{requirement:a.requirement,boundFilePaths:aj.map(a=>a.filePath),boundFileRoles:function(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,/tender|response|requirements|招标|评审|实质/u.test(c)?["tender_document","technical_specification","schedule_quality_safety"]:/boq|清单|scope|工程量/u.test(c)?["bill_of_quantities","construction_scope","control_price"]:/drawing|drawings|图纸|design/u.test(c)?["drawings"]:/schedule|quality|safety|工期|质量|安全/u.test(c)?["schedule_quality_safety","technical_specification"]:/risk|constraints|现场|重点|难点/u.test(c)?["risk_constraints","addendum","tender_document"]:/material|equipment|brand|材料|设备|品牌/u.test(c)?["brand_recommendation","bill_of_quantities","technical_specification"]:/enterprise|reference|经验|体系/u.test(c)?["project_overview","technical_specification"]:["project_overview"])])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}(aj)}),ar=function(a,b=""){let c=function(a,b=""){return h.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)if(c.patterns.some(b=>b.test(a)))return c.output[0]}(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`,q)||a.category||"业务文档",e=function(a,b){let c=[a.name,a.category,a.outputTitle,a.description,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]])].filter(Boolean).join("\n"),d=new Set([...a.chapters.flatMap(a=>a.requiredFacts||[]),"项目名称","项目资料范围"]);for(let a of u(c,r))d.add(a);let e=y(a,b);if("施工组织设计"===b||e.length>0){for(let a of u("招标 施工 工程 清单 图纸 质量 工期 安全 文明 材料 重点 难点",r))d.add(a);for(let a of e.flatMap(a=>a.requiredFacts))d.add(a)}return[...d].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 x(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of w(c))b.add(a);let a=c.match(/(?:必须|需要|要求|一定要|务必|包含|包括|输出|写明)\s*([^。;;\n]{2,60})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&!/不要|禁止|不得|不能/u.test(a)).slice(0,30)}(b),i=function(a=""){let b=new Set;for(let c of x(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of w(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)).slice(0,30)}(b),j=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=y(a,d),l=Math.max(0,...k.map(a=>a.minTables||0)),m=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,l)||void 0,n=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 u(c,s))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(v),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),o=f.filter(a=>!n.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${v(a)}`,title:a,required:!0,order:n.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),p=[{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-${v(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-${v(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...l?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${l} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...f.map(a=>({id:`user-required-chapter-${v(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-${v(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...i.map(a=>({id:`user-forbidden-text-${v(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...m?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${m}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:m}}]:[],...j?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${j.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:j.min}}]:[],...j?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${j.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:j.max}}]:[]],t=[...n,...o];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:v(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/材料|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:t,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:p,builtIn:!0}}}(n,a.requirement||""),au=ar.spec,av=function(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","construction_scope"]);return/投标|招标|施工|工程|建设|改造/iu.test(b)&&["tender_document","bill_of_quantities","schedule_quality_safety"].forEach(a=>c.add(a)),/图纸|施工|工程|建设|改造/iu.test(b)&&c.add("drawings"),c}(a);return(function(a){let b=new Set(u([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),t));return b.add("project_overview"),b.add("construction_scope"),[...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.slice(0,20).map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(n,ap),aw=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:n,spec:au,summary:ap,resolvedRoles:av});if(!aw.ready)throw Error(`生成准备度不足:${aw.blockingIssues.join(";")}`);let aD=[["## 后台项目资料摘要",ap.extractedSections.projectOverview,`项目指纹:项目名候选 ${ap.fingerprint.projectNames.join("、")||"无"};编号 ${ap.fingerprint.tenderNos.join("、")||"无"};资料组 ${ap.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*ap.fingerprint.confidence)}%。`,`内容级事实候选:建设/招标单位 ${ap.facts.ownerNames?.join("、")||"无"};地点 ${ap.facts.locationNames?.join("、")||"无"};工期 ${ap.facts.scheduleValues?.join("、")||"无"};质量 ${ap.facts.qualityTargets?.join("、")||"无"}。`,ap.extractedSections.scopeSummary,ap.extractedSections.boqSummary,ap.extractedSections.drawingSummary,ap.extractedSections.scheduleQualitySafetySummary,ap.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*ap.coverage.materialCompletenessRate)}%`].join("\n"),(b=ar.sourceHash,`## 后台内容优化建议
69
81
  建议包:${au.name}
70
82
  版本标识:${b}
71
83
  说明:以下内容仅用于提升事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
72
84
  建议关注事实:${au.factFields.map(a=>a.name).join("、")}
73
85
  章节内容建议:${au.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ").slice(0,120)}`:""}`).join(";")||"以当前模板章节为准"}
74
- 质量提醒:${au.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${aC.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*aC.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*aC.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*aC.specCompletenessRate)}%`,aC.missingRoles.length?`缺失角色:${aC.missingRoles.join("、")}`:"",aC.weakRoles.length?`较弱角色:${aC.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),aI=[aD,bp(ah,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),aJ=a1([aI,a.requirement||""].filter(Boolean).join("\n\n")),aK=[aD,bp(ah,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),aM=[aD,bp(ah,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n");b8(af,a3({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${aj.length} 条文件角色绑定`},{subtitle:"生成准备",order:af.length})),a.onProgress?.([...af]);let aN=bn(i,aj),aO=(0,o.XB)("file"),aQ=new Map(aj.flatMap(a=>bl(i,a.filePath).map(b=>[b,a.roleId]))),aU=new Map(aj.flatMap(a=>bl(i,a.filePath).map(b=>[b,aO.find(b=>b.id===a.roleId)?.processingType||"reference"])));b8(af,a3({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在检查知识库增量索引状态"},{subtitle:"知识库索引",order:af.length})),a.onProgress?.([...af]);let aV=await ab.getProject(i);await aV.incrementalIndex(),b8(af,a3({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"知识库增量索引检查完成,开始构建角色资料证据池"},{subtitle:"知识库索引",order:af.length})),a.onProgress?.([...af]),b7(a.signal);let aY=[],aZ=[],a$=[],a_=[],a2=[],a7=[],a8=-1,a9=function(a,b,c){let d=(0,o.XB)("file"),e=(0,o.XB)("prompt"),f=ag(b),g=new Map;for(let a of c)g.set(a.roleId,[...g.get(a.roleId)||[],a.filePath]);let h=d.filter(a=>g.has(a.id)),i=e.filter(a=>{let b=a.executionType||"reference",c=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${a.id} ${a.name} ${a.description||""}`);return f.some(b=>b.roleId===a.id)&&(["fact_extraction","reference"].includes(b)||c)});return h.map(a=>{let b=i.map(b=>{let c=f.filter(a=>a.roleId===b.id).map(a=>bo(a.content));return{promptRole:b,texts:c,score:function(a,b,c){let d=aP(`${a} ${c.join(" ")}`),e=aP(`${b.id} ${b.name} ${b.processingType||""}`),f=0;for(let a of(/fact|抽取|读取|提取|理解|reference/u.test(d)&&(f+=5),/chapter_generation|章节生成|正文生成/u.test(d)&&(f+=1),[b.id,b.name,b.processingType||""].filter(Boolean)))d.includes(aP(a))&&(f+=4);return/tender|招标|投标|评审|响应|rule/u.test(e)&&/tender|招标|投标|评审|响应|示范文本|章节|目录|输出要求|编制要求/u.test(d)&&(f+=6),/bill|boq|quantity|清单|工程量/u.test(e)&&/bill|boq|quantity|清单|工程量|项目特征/u.test(d)&&(f+=6),/drawing|cad|图纸|设计/u.test(e)&&/drawing|cad|图纸|设计|文本|标注/u.test(d)&&(f+=6),/material|equipment|brand|材料|设备|品牌/u.test(e)&&/material|equipment|brand|材料|设备|品牌|推荐/u.test(d)&&(f+=6),/schedule|quality|safety|工期|质量|安全|文明/u.test(e)&&/schedule|quality|safety|工期|质量|安全|文明/u.test(d)&&(f+=6),/risk|constraint|重点|难点|约束|风险/u.test(e)&&/risk|constraint|重点|难点|约束|风险/u.test(d)&&(f+=6),f}(b.id,a,c)}}).sort((a,b)=>b.score-a.score),c=b.filter(a=>a.score>5).slice(0,2),d=b.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b}),e=c.length>0?c:d?[d]:[],h=e.map(a=>a.promptRole.id),j=e.map(a=>a.promptRole.name),k=e.flatMap(a=>a.texts);return{id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:h,promptRoleNames:j,promptTexts:k,outputType:function(a,b=[]){let c=aP(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);return/示范文本|招标文件|章节|目录|输出要求|编制要求|template|tender/u.test(c)?"template_requirements":/清单|工程量|bill|boq|quantity/u.test(c)?"bill_facts":/图纸|drawing|cad|设计图|图纸解析/u.test(c)?"drawing_facts":/规范|标准|spec|technical/u.test(c)?"technical_facts":/项目|工程概况|事实|fact/u.test(c)?"project_facts":"reference_facts"}(a,k)}})}(0,ah,aj),bb=function(a,b,c){let d=new Map,e=0;for(let f of[...new Set(b.flatMap(a=>a.filePaths))]){let b=aR(c,f),g=a.getFileDetail(f);if(g&&g.chunks.length>0){d.set(b,g.chunks.slice(0,120).map(a=>({chapterId:"role-evidence-pool",filePath:g.file.relativePath,score:1,content:a.content,sectionTitle:a.sectionTitle,source:"role-node"})));continue}let h=as(f,void 0,void 0,"role-evidence-pool",c);h.length>0&&(e+=1),d.set(b,h)}return{files:d,uniqueFileCount:d.size,bindingCount:b.reduce((a,b)=>a+b.filePaths.length,0),fallbackFileCount:e}}(aV,a9,i),bd=a3({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${bb.uniqueFileCount} 份,角色绑定 ${bb.bindingCount} 条,复用 ${Math.max(0,bb.bindingCount-bb.uniqueFileCount)} 条;${bb.fallbackFileCount} 份使用文件级兜底证据`},{subtitle:"共享资料池",order:af.length});b8(af,bd),a.onProgress?.([...af]);let bi=[],bq=function(a,b,c){let d=[...c].sort().map(c=>{let d=a.getFileDetail(c)||a.getFileDetail(e.join(b,c));if(!d)return{filePath:c,missing:!0};let f=(d.chunks||[]).slice(0,200).map(a=>aL(`${a.sectionTitle||""}
75
- ${a.content}`));return{filePath:d.file?.relativePath||c,chunkCount:d.chunks?.length||0,chunks:f}});return aL({type:"project-evidence-version-v1",entries:d})}(aV,i,aN),bs=br()?.model.name,bu=bp(ah,["fact_extraction","reference","chapter_generation"]),bN=aL({fileBindings:aj,evidenceScopePaths:[...aN].sort(),activeModelName:bs,projectEvidenceVersion:bq,promptTexts:bu,materialFingerprint:ap.fingerprint,materialInventory:Object.fromEntries(Object.entries(ap.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),bO=Math.max(1,Math.min(3,Number(process.env.DOCUMENT_ROLE_CONCURRENCY??3)));for(let b=0;b<a9.length;b+=bO){b7(a.signal);let c=a9.slice(b,b+bO).map(async b=>{let c=Date.now(),d=(function(a,b,c){return ar(b.filePaths.flatMap(d=>(a.files.get(aR(c,d))||[]).map(a=>({...a,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType}))),120)})(bb,b,i).filter(a=>bm(i,a.filePath,aN)),e=af.length,f=a3({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:"running",message:`${b.fileRoleName} 正在复用共享资料池读取 ${b.filePaths.length} 条绑定,候选证据 ${d.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:e});af.push(f),a.onProgress?.([...af]);let{artifact:g,cached:h}=await aS({template:n,node:b,evidence:d,promptTexts:bu,projectRoot:i,modelName:bs}),j=a3({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:d.length>0?"success":"fallback",message:b9(`${b.fileRoleName} 节点已${h?"复用缓存":"完成"},产出章节建议 ${g.chapters.length} 个、事实 ${g.facts.length} 条`,c)},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:e});return af[e]=j,a.onProgress?.([...af]),{artifact:g,evidence:d}});for(let a of(await Promise.all(c)))a$.push(...a.evidence),bi.push(a.artifact)}let bS=function(a,b){let c=b.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),d=new Map;for(let b of c.sort((a,b)=>a.order-b.order)){let c=az(b.title);!(!aA(b.title)||aW(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(n,bi),bT=aE(n,au,{preserveExplicitOutline:am}),b$=[n.name,n.outputTitle,a.requirement,...bT.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),ca=(0,m.Hh)(b$,8,i),cb=ca.length>0?ca.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",cc=function(a){let b=[],c=new Set;for(let d of a)for(let{key:a,patterns:e}of a0)if(!b.some(b=>b.key===a))for(let f of e){let e=f.exec(d.content)?.[1]?.replace(/\s+/gu," ").trim();if(!e||/见(?:招标|公告|文件|附件)|详见|按.*要求/u.test(e))continue;let g=`${a}:${e}`;if(!c.has(g)){c.add(g),b.push({key:a,value:e.slice(0,300),sourceFile:d.filePath});break}}return b}(bi.flatMap(a=>a.evidence)),cd=function(a){let b=a.template.generationSettings||a.template.exportSettings,c=bA(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(?:不少于|至少|约|大概|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)/gu)],d=[...b.matchAll(/(?:不少于|至少|约|大概|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)/gu)];return{targetPages:c.map(a=>bB(a[1]||"")).filter(a=>Number.isFinite(a)).at(-1),targetChars:d.map(a=>{let b=bB(a[1]||"");return b?Math.round(b*(a[2]?1e4:1)):void 0}).filter(a=>Number.isFinite(a)).at(-1)}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),f=e?void 0:b?.targetPages?.target||b?.targetPages?.min,g=d.targetPages?d.targetPages*c:void 0,h=d.targetPages||f,i=e?"explicit":f?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",j=e?Math.max(d.targetChars||0,g||0)||void 0:Math.max((f?f*c:void 0)||0)||void 0,k=e?h?Math.floor(.95*h):void 0:b?.targetPages?.min||(h?Math.floor(.95*h):void 0),l=j?Math.floor(.95*j):k?k*c:void 0,m=a.chapters.length>0?a.chapters:a.template.chapters,n=m.reduce((a,b)=>a+bC(b),0)||1,o=new Map;for(let b of m){let c=Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,1200),d=j?Math.round(j*bC(b)/n):0;o.set(b.id,Math.max(c,d))}return{targetPages:h,minPages:k,targetChars:j,minChars:l,charsPerPage:c,chapterTargets:o,source:i}}({requirement:a.requirement,promptTexts:aI,template:n,chapters:bT,spec:au}),ce=a3({type:"context_recall",roleId:"project-memory",status:ca.length>0?"success":"skipped",message:ca.length>0?`已注入 ${ca.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),cf=am?`;识别到 OUTLINE 章节 ${al.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";b8(af,a3({type:"role_binding",roleId:ad,status:"success",message:`已绑定 ${aj.length} 个文件角色、${ah.length} 个提示词角色;后台优化建议关注 ${au.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*aC.materialCoverageRate)}%${cf}`},{subtitle:ae,roleName:ae})),b8(af,a3({type:"validation",roleId:"document-readiness",status:aC.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*aC.materialCoverageRate)}%,资料角色 ${Math.round(100*aC.roleSatisfactionRate)}%,优化建议 ${Math.round(100*aC.specCompletenessRate)}%;${ap.source.selectionReason}`},{subtitle:"生成准备度检查"})),b8(af,ce),a.onProgress?.([...af]);let cg=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??4)));for(let b=0;b<bT.length;b+=cg){let c=bT.slice(b,b+cg);await Promise.all(c.map(async(c,d)=>{let e=b+d;b7(a.signal);try{let b=Date.now(),d=[],f=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(c,bS),g=f?[f.title,...f.requiredContents,...f.evidenceNeeds,...f.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],h=c.queries.length>0?c.queries:[n.name,n.outputTitle,c.title],j=[...new Set([...h,...g])].filter(Boolean).slice(0,4);for(let a of(await Promise.all(j.map(a=>aT({manager:ab,projectRoot:i,query:a,evidenceScopePaths:aN,maxEvidence:ac,fileRolesHash:bN})))))d.push(...a.filter(a=>bm(i,a.filePath,aN)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aQ.get(a.filePath),processingType:aU.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let k=new Set(c.pinnedEvidenceFilePaths||[]),l=a4(bi,c,f);for(let a of(d.push(...l.flatMap(({artifact:a})=>a.evidence.filter(a=>bm(i,a.filePath,aN)).slice(0,8).map(a=>({...a,chapterId:c.id,source:"role-node"})))),new Set([...k]))){if(!bm(i,a,aN))continue;let b=k.has(a),e=aV.getFileDetail(a);if(!e){d.push(...as(a,aQ.get(a),aU.get(a),c.id,i).map(a=>({...a,source:b?"pinned-evidence":a.source})));continue}d.push(...e.chunks.slice(0,Math.max(ac,20)).map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aQ.get(e.file.relativePath),processingType:aU.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:b?"pinned-evidence":"bound-file"})))}let m=d.filter(a=>bm(i,a.filePath,aN)),o=ar(m,ac),p=ar(m,120);a$.push(...o);let q=function(a,b=220){let c=[],d=new Set;for(let e of a)for(let a of function(a){let b=W(a),c=b.split(/[。;;\n]/u).map(a=>a.trim()).filter(a=>a.length>=12);return c.length?c:b?[b]:[]}(e.content)){if(!function(a){return[I,J,K,L,M,N,O].some(b=>(function(a,b){b.lastIndex=0;let c=b.test(a);return b.lastIndex=0,c})(a,b))||[...P,...Q,...R,...S,...T,...U].some(b=>a.includes(b))}(a))continue;let f=W(a).slice(0,420),g=f.replace(/\d+/gu,"#").slice(0,180);if(d.has(g))continue;d.add(g);let h=function(a){return H.find(([,b])=>b.test(a))?.[0]||"通用工程"}(f),i=Y(f,I).slice(0,8),j=Y(f,J).slice(0,8),k=Y(f,K).slice(0,8),l=Y(f,L).slice(0,6),m=Y(f,M).slice(0,8),n=Y(f,N).slice(0,8),o=Y(f,O).slice(0,5),p=Z(f,P),q=Z(f,Q),r=Z(f,R),s=Z(f,S),t=function(a){return T.some(b=>a.text.includes(b))?"dangerous_work":U.some(b=>a.text.includes(b))?"subdivision_work":a.costValues.length?"cost_commitment":a.scheduleValues.length?a.riskControl.length?"risk_response":"schedule_milestone":a.frequencyValues.length?a.inspection.length?"inspection_ratio":"management_frequency":a.resourceValues.length?"resource_allocation":a.quantities.length?"engineering_quantity":a.standards.length?"standard_requirement":"technical_parameter"}({text:f,parameters:i,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,standards:o,inspection:q,riskControl:s});if(c.push({id:`tech-${c.length+1}`,category:t,discipline:h,workItem:function(a,b){return["砌筑","构造柱","防水","闭水试验","地砖","墙砖","吊顶","涂料","给水","排水","消防水","消防电","电气","风管","排烟","油烟净化","厨房设备","明厨亮灶","隔油池","临时用电","动火作业"].find(b=>a.includes(b))||b}(f,h),specification:i.join("、")||void 0,parameter:i.join("、")||void 0,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,commitmentValues:[...k,...l,...m].slice(0,10),process:p,qualityControl:r,inspection:q,standard:o,riskControl:s,sourceRole:e.roleId,sourceFile:e.filePath,text:f,confidence:Math.min(1,.42+.06*i.length+.05*j.length+.05*k.length+.05*l.length+.05*m.length+.07*o.length+.04*p.length+.04*q.length)}),c.length>=b)return c}return c}(p,160),r=function(a,b,c=24){let d=b.filter(b=>(function(a,b){let c=`${b.title} ${b.purpose} ${(b.sections||[]).join(" ")} ${(b.requiredFacts||[]).join(" ")} ${(b.queries||[]).join(" ")}`;return/施工方法|主要.*方法|工艺|分项|分部分项/u.test(c)?/土建|砌筑|防水|装饰|给排水|电气|消防|暖通|厨房|设备|排烟/u.test(a.discipline+a.workItem)||["technical_parameter","subdivision_work","dangerous_work"].includes(a.category):/质量|工期|进度/u.test(c)?a.qualityControl?.length||a.inspection?.length||a.standard?.length||["schedule_milestone","inspection_ratio","management_frequency","cost_commitment"].includes(a.category):/人.*材.*机|资源|材料|机械/u.test(c)?["resource_allocation","engineering_quantity"].includes(a.category)||/材料|设备|机械|厨房设备|暖通|电气|给排水/u.test(a.discipline+a.workItem+a.text):/安全|文明|应急|危大|危险性较大|专项/u.test(c)?a.riskControl?.length||["risk_response","management_frequency","cost_commitment","dangerous_work"].includes(a.category)||/临时用电|动火|高处|消防|应急|扬尘|有限空间|拆除/u.test(a.text):/重点|难点/u.test(c)?a.confidence>=.65:[a.discipline,a.workItem].some(a=>c.includes(a))})(b,a)).sort((a,b)=>b.confidence-a.confidence).slice(0,c);return{chapterId:a.id,chapterTitle:a.title,facts:d}}(c,q);aZ.push(r);let s=0===r.facts.length?"":["本章必须优先落位以下工程量化事实和技术事实。不得用“按设计要求、按规范要求、加强管理”等空泛表述替代已列出的工程量、工期节点、频次、人员资源、金额承诺、参数、工艺、试验和验收指标。","","| 序号 | 类型 | 专业 | 分项 | 参数/规格 | 工程量/工期/频次/资源/金额 | 工艺动作 | 试验验收 | 规范标准 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...r.facts.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.costValues||[],...a.frequencyValues||[],...a.resourceValues||[]].join("、");return`| ${b+1} | ${a.category} | ${a.discipline} | ${a.workItem} | ${a.parameter||a.specification||""} | ${c} | ${(a.process||[]).join("、")} | ${(a.inspection||[]).join("、")} | ${(a.standard||[]).join("、")} | ${a.text.replace(/\|/gu,",").slice(0,220)} |`}),"","强制写作要求:","- 主要施工方法类章节按“适用部位/材料参数/工艺流程/操作要点/质量验收/安全与成品保护”展开。","- 本章事实表中出现的工程数量、涉及学校数量、工期节点、检查频次、人员资源、设备数量、金额/违约承诺、数字、单位、强度、厚度、管径、试验时间、验收指标和规范编号,应自然写入正文。","- 如果资料中已有具体参数,禁止只写“满足设计要求”“按规范施工”。","- 每个主要分项至少写出施工动作、检查动作和验收动作。","- 识别到分部分项、危大工程、危险性较大工程、有限空间、动火、高处、临电、拆除等风险线索时,必须写入对应章节的风险识别、专项方案、交底、旁站检查、验收放行和应急闭环。"].join("\n"),t=function(a){let b=_(a.facts).slice(0,18);return 0===b.length?"":["## 本章量化事实覆盖矩阵","以下对象、部位、工程量、工期、频次、资源或金额来自项目资料。正文必须逐项覆盖;同一施工方案涉及多处对象时,不得只写其中一处或把多个工程量合并成一个笼统数量。","| 序号 | 施工对象/部位/分项 | 量化值 | 参数/规格 | 来源角色 | 来源文件 | 原始事实 |","|---|---|---|---|---|---|---|",...b.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].join("、");return`| ${b+1} | ${$(a)} | ${c} | ${a.parameter||a.specification||""} | ${a.sourceRole||""} | ${a.sourceFile||""} | ${a.text.replace(/\|/gu,",").slice(0,180)} |`}),"","覆盖要求:","- 日期、数量、规格、工程量、资源数量和工期节点只能使用资料中的值或由资料明确推导的值;没有依据时不得编造。","- 如果同一工艺适用于多个部位、区域、学校、片区或分项,应使用表格或分项段落分别说明适用范围、工程量和控制要点。","- 资料中存在多个来源值或口径不一致时,应保持审慎表述并提示需按招标文件、答疑、图纸或清单优先级复核,不得随意选择一个数值。"].join("\n")}(r),u=c.requiredFacts.filter(a=>!o.some(b=>aF(b,a)));for(let a of(0===o.length&&a_.push(`${c.title}:未检索到明确资料依据`),u))a_.push(`${c.title}:${a} 未检索到明确依据`);let v=a3({type:"knowledge_retrieval",roleId:"knowledge-base",status:a$.length>0?"success":"fallback",message:`已检索/绑定 ${a$.length} 条证据`});a8<0?a8=b8(af,v):af[a8]={...v,order:af[a8]?.order??v.order},a.onProgress?.([...af]),b7(a.signal);let w=a5(bi,n),x=function(a,b,c){let d=a4(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?`要求项:
76
- ${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}:${aq(aX(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
86
+ 质量提醒:${au.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${aw.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*aw.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*aw.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*aw.specCompletenessRate)}%`,aw.missingRoles.length?`缺失角色:${aw.missingRoles.join("、")}`:"",aw.weakRoles.length?`较弱角色:${aw.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),aE=[aD,`模板配置章节结构:
87
+ ${n.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")}`,bG(ah,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),aJ=bh([aE,a.requirement||""].filter(Boolean).join("\n\n")),aK=[aD,bG(ah,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),aM=[aD,bG(ah,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n");cu(af,bj({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${aj.length} 条文件角色绑定`},{subtitle:"生成准备",order:af.length})),a.onProgress?.([...af]);let aN=bE(i,aj),aO=(0,o.XB)("file"),aP=new Map(aj.flatMap(a=>bC(i,a.filePath).map(b=>[b,a.roleId]))),aR=new Map(aj.flatMap(a=>bC(i,a.filePath).map(b=>[b,aO.find(b=>b.id===a.roleId)?.processingType||"reference"])));cu(af,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在检查知识库增量索引状态"},{subtitle:"知识库索引",order:af.length})),a.onProgress?.([...af]);let aS=await ab.getProject(i);await aS.incrementalIndex(),cu(af,bj({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"知识库增量索引检查完成,开始构建角色资料证据池"},{subtitle:"知识库索引",order:af.length})),a.onProgress?.([...af]),ct(a.signal);let aX=[],aY=[],aZ=[],a1=[],a7=[],a8=[],a9=-1,bc=function(a,b,c){let d=(0,o.XB)("file"),e=(0,o.XB)("prompt"),f=ag(b),g=new Map;for(let a of c)g.set(a.roleId,[...g.get(a.roleId)||[],a.filePath]);let h=d.filter(a=>g.has(a.id)),i=e.filter(a=>{let b=a.executionType||"reference",c=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${a.id} ${a.name} ${a.description||""}`);return f.some(b=>b.roleId===a.id)&&(["fact_extraction","reference"].includes(b)||c)});return h.map(a=>{let b=i.map(b=>{let c=f.filter(a=>a.roleId===b.id).map(a=>bF(a.content));return{promptRole:b,texts:c,score:function(a,b,c){let d=a0(`${a} ${c.join(" ")}`),e=a0(`${b.id} ${b.name} ${b.processingType||""}`),f=0;for(let a of(/fact|抽取|读取|提取|理解|reference/u.test(d)&&(f+=5),/chapter_generation|章节生成|正文生成/u.test(d)&&(f+=1),[b.id,b.name,b.processingType||""].filter(Boolean)))d.includes(a0(a))&&(f+=4);return/tender|招标|投标|评审|响应|rule/u.test(e)&&/tender|招标|投标|评审|响应|示范文本|章节|目录|输出要求|编制要求/u.test(d)&&(f+=6),/bill|boq|quantity|清单|工程量/u.test(e)&&/bill|boq|quantity|清单|工程量|项目特征/u.test(d)&&(f+=6),/drawing|cad|图纸|设计/u.test(e)&&/drawing|cad|图纸|设计|文本|标注/u.test(d)&&(f+=6),/material|equipment|brand|材料|设备|品牌/u.test(e)&&/material|equipment|brand|材料|设备|品牌|推荐/u.test(d)&&(f+=6),/schedule|quality|safety|工期|质量|安全|文明/u.test(e)&&/schedule|quality|safety|工期|质量|安全|文明/u.test(d)&&(f+=6),/risk|constraint|重点|难点|约束|风险/u.test(e)&&/risk|constraint|重点|难点|约束|风险/u.test(d)&&(f+=6),f}(b.id,a,c)}}).sort((a,b)=>b.score-a.score),c=b.filter(a=>a.score>5).slice(0,2),d=b.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b}),e=c.length>0?c:d?[d]:[],h=e.map(a=>a.promptRole.id),j=e.map(a=>a.promptRole.name),k=e.flatMap(a=>a.texts);return{id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:h,promptRoleNames:j,promptTexts:k,outputType:function(a,b=[]){let c=a0(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);return/示范文本|招标文件|章节|目录|输出要求|编制要求|template|tender/u.test(c)?"template_requirements":/清单|工程量|bill|boq|quantity/u.test(c)?"bill_facts":/图纸|drawing|cad|设计图|图纸解析/u.test(c)?"drawing_facts":/规范|标准|spec|technical/u.test(c)?"technical_facts":/项目|工程概况|事实|fact/u.test(c)?"project_facts":"reference_facts"}(a,k)}})}(0,ah,aj),bd=function(a,b,c){let d=new Map,e=0;for(let f of[...new Set(b.flatMap(a=>a.filePaths))]){let b=a2(c,f),g=a.getFileDetail(f);if(g&&g.chunks.length>0){d.set(b,g.chunks.slice(0,120).map(a=>({chapterId:"role-evidence-pool",filePath:g.file.relativePath,score:1,content:a.content,sectionTitle:a.sectionTitle,source:"role-node"})));continue}let h=at(f,void 0,void 0,"role-evidence-pool",c);h.length>0&&(e+=1),d.set(b,h)}return{files:d,uniqueFileCount:d.size,bindingCount:b.reduce((a,b)=>a+b.filePaths.length,0),fallbackFileCount:e}}(aS,bc,i),be=bj({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${bd.uniqueFileCount} 份,角色绑定 ${bd.bindingCount} 条,复用 ${Math.max(0,bd.bindingCount-bd.uniqueFileCount)} 条;${bd.fallbackFileCount} 份使用文件级兜底证据`},{subtitle:"共享资料池",order:af.length});cu(af,be),a.onProgress?.([...af]);let bf=[],bi=function(a,b,c){let d=[...c].sort().map(c=>{let d=a.getFileDetail(c)||a.getFileDetail(e.join(b,c));if(!d)return{filePath:c,missing:!0};let f=(d.chunks||[]).slice(0,200).map(a=>aT(`${a.sectionTitle||""}
88
+ ${a.content}`));return{filePath:d.file?.relativePath||c,chunkCount:d.chunks?.length||0,chunks:f}});return aT({type:"project-evidence-version-v1",entries:d})}(aS,i,aN),bn=bI()?.model.name,bo=bG(ah,["fact_extraction","reference","chapter_generation"]),bp=aT({fileBindings:aj,evidenceScopePaths:[...aN].sort(),activeModelName:bn,projectEvidenceVersion:bi,promptTexts:bo,materialFingerprint:ap.fingerprint,materialInventory:Object.fromEntries(Object.entries(ap.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),br=Math.max(1,Math.min(3,Number(process.env.DOCUMENT_ROLE_CONCURRENCY??3)));for(let b=0;b<bc.length;b+=br){ct(a.signal);let c=bc.slice(b,b+br).map(async b=>{let c=Date.now(),d=(function(a,b,c){return as(b.filePaths.flatMap(d=>(a.files.get(a2(c,d))||[]).map(a=>({...a,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType}))),120)})(bd,b,i).filter(a=>bD(i,a.filePath,aN)),e=af.length,f=bj({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:"running",message:`${b.fileRoleName} 正在复用共享资料池读取 ${b.filePaths.length} 条绑定,候选证据 ${d.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:e});af.push(f),a.onProgress?.([...af]);let{artifact:g,cached:h}=await a3({template:n,node:b,evidence:d,promptTexts:bo,projectRoot:i,modelName:bn,signal:a.signal}),j=bj({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:d.length>0?"success":"fallback",message:cv(`${b.fileRoleName} 节点已${h?"复用缓存":"完成"},产出章节建议 ${g.chapters.length} 个、事实 ${g.facts.length} 条`,c)},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("")||void 0,order:e});return af[e]=j,a.onProgress?.([...af]),{artifact:g,evidence:d}});for(let a of(await Promise.all(c)))aZ.push(...a.evidence),bf.push(a.artifact)}let bt=function(a,b){let c=b.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),d=new Map;for(let b of c.sort((a,b)=>a.order-b.order)){let c=aA(b.title);!(!aB(b.title)||ba(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(n,bf),bv=aF(n,au,{preserveExplicitOutline:am}),bz=[n.name,n.outputTitle,a.requirement,...bv.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bH=(0,m.Hh)(bz,8,i),bJ=function(a){let b=[],c=new Set;for(let d of a)for(let{key:a,patterns:e}of bg)if(!b.some(b=>b.key===a))for(let f of e){let e=f.exec(d.content)?.[1]?.replace(/\s+/gu," ").trim();if(!e||/见(?:招标|公告|文件|附件)|详见|按.*要求/u.test(e))continue;let g=`${a}:${e}`;if(!c.has(g)){c.add(g),b.push({key:a,value:e.slice(0,300),sourceFile:d.filePath});break}}return b}(bf.flatMap(a=>a.evidence)),bK=[bH.length>0?bH.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",function(a,b=[]){return[b.length?`## 项目基础事实候选
89
+ ${b.map(a=>`- ${a.key}:${a.value}`).join("\n")}`:"",a.map(a=>{let b=a.chapters.slice(0,18).map(a=>`- ${a.title}:${a.requiredContents.join("、")||a.sourceRequirement.slice(0,120)}`).join("\n"),c=a.facts.slice(0,30).map(a=>`- ${a.key}:${bb(a.value).slice(0,220)}(来源:${a.sourceFile},角色:${a.roleId})`).join("\n");return[`## ${a.node.fileRoleName} / ${a.node.outputType}`,b?`章节/要求:
90
+ ${b}`:"",c?`事实:
91
+ ${c}`:"",a.outputRequirements.length?`输出要求:${a.outputRequirements.join(";")}`:""].filter(Boolean).join("\n")}).join("\n\n")].filter(Boolean).join("\n\n")}(bf,bJ)].filter(Boolean).join("\n\n").slice(0,24e3),bM=function(a){let b=a.template.generationSettings||a.template.exportSettings,c=bU(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(?:不少于|至少|约|大概|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)/gu)],d=[...b.matchAll(/(?:不少于|至少|约|大概|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)/gu)];return{targetPages:c.map(a=>bV(a[1]||"")).filter(a=>Number.isFinite(a)).at(-1),targetChars:d.map(a=>{let b=bV(a[1]||"");return b?Math.round(b*(a[2]?1e4:1)):void 0}).filter(a=>Number.isFinite(a)).at(-1)}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),f=e?void 0:b?.targetPages?.target||b?.targetPages?.min,g=d.targetPages?d.targetPages*c:void 0,h=d.targetPages||f,i=e?"explicit":f?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",j=e?Math.max(d.targetChars||0,g||0)||void 0:Math.max((f?f*c:void 0)||0)||void 0,k=e?h?Math.floor(.95*h):void 0:b?.targetPages?.min||(h?Math.floor(.95*h):void 0),l=j?Math.floor(.95*j):k?k*c:void 0,m=a.chapters.length>0?a.chapters:a.template.chapters,n=m.reduce((a,b)=>a+bW(b),0)||1,o=new Map;for(let b of m){let c=Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,1200),d=j?Math.round(j*bW(b)/n):0;o.set(b.id,Math.max(c,d))}return{targetPages:h,minPages:k,targetChars:j,minChars:l,charsPerPage:c,chapterTargets:o,source:i}}({requirement:a.requirement,promptTexts:aE,template:n,chapters:bv,spec:au}),bQ=new Map((a.resumeChapters||[]).filter(a=>a.id&&a.content?.trim()).map(a=>[a.id,a])),b5=function(a){let b=a.template.chapters.length,c=`${a.template.name}
92
+ ${a.template.category||""}
93
+ ${a.requirement||""}`,d=/投标|招标|施工|专项|安全|质量|验收|监理|合同|合规/u.test(c),e=a.targetWords>=3e4||b>=10,f=a.targetWords<=6e3&&b<=4&&!d,g=d?"strict":e?"longform":f?"fast":"balanced";return{mode:g,enableChapterCache:!f,enableChapterReview:!f,enableGlobalReview:d||e,enableTypedRepair:!0,maxChapterReviewConcurrency:"strict"===g?2:"longform"===g?3:2,targetLlmConcurrency:"strict"===g?4:"longform"===g?6:f?3:5}}({template:n,targetWords:bM.targetChars||[...bM.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});aQ=Math.min(aQ,b5.targetLlmConcurrency);let b6={strategy:b5,metrics:[],cache:{chapterHits:0,chapterMisses:0,chapterWrites:0,sectionHits:0,sectionMisses:0,sectionWrites:0,prunedItems:0,rejectedHits:0},llm:{calls:0,failures:0,throttledWaits:0,maxActive:0,currentLimit:aQ,limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0,reusedChapterCount:0,reusedSectionCount:0}};aW(b6),cu(af,bj({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${b5.mode} 生成策略:章节缓存 ${b5.enableChapterCache?"启用":"跳过"}、章节审查 ${b5.enableChapterReview?"启用":"跳过"}、全局审查 ${b5.enableGlobalReview?"启用":"跳过"};LLM 并发上限 ${b5.targetLlmConcurrency}`},{subtitle:"后台自动策略"}));let ca=bj({type:"context_recall",roleId:"project-memory",status:bH.length>0?"success":"skipped",message:bH.length>0?`已注入 ${bH.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),cb=am?`;识别到 OUTLINE 章节 ${al.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";cu(af,bj({type:"role_binding",roleId:ad,status:"success",message:`已绑定 ${aj.length} 个文件角色、${ah.length} 个提示词角色;后台优化建议关注 ${au.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*aw.materialCoverageRate)}%${cb}`},{subtitle:ae,roleName:ae})),cu(af,bj({type:"validation",roleId:"document-readiness",status:aw.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*aw.materialCoverageRate)}%,资料角色 ${Math.round(100*aw.roleSatisfactionRate)}%,优化建议 ${Math.round(100*aw.specCompletenessRate)}%;${ap.source.selectionReason}`},{subtitle:"生成准备度检查"})),cu(af,ca),a.onProgress?.([...af]);let ck=Math.max(1,Math.min(4,Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??4)));for(let b=0;b<bv.length;b+=ck){let c=bv.slice(b,b+ck);await Promise.all(c.map(async(c,d)=>{let e=b+d;ct(a.signal);try{let b=Date.now(),d=[],f=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(c,bt),g=f?[f.title,...f.requiredContents,...f.evidenceNeeds,...f.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],h=c.queries.length>0?c.queries:[n.name,n.outputTitle,c.title],j=[...new Set([...h,...g])].filter(Boolean).slice(0,4);for(let a of(await Promise.all(j.map(a=>a4({manager:ab,projectRoot:i,query:a,evidenceScopePaths:aN,maxEvidence:ac,fileRolesHash:bp})))))d.push(...a.filter(a=>bD(i,a.filePath,aN)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aP.get(a.filePath),processingType:aR.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let k=new Set(c.pinnedEvidenceFilePaths||[]),l=bk(bf,c,f);for(let a of(d.push(...l.flatMap(({artifact:a})=>a.evidence.filter(a=>bD(i,a.filePath,aN)).slice(0,8).map(a=>({...a,chapterId:c.id,source:"role-node"})))),new Set([...k]))){if(!bD(i,a,aN))continue;let b=k.has(a),e=aS.getFileDetail(a);if(!e){d.push(...at(a,aP.get(a),aR.get(a),c.id,i).map(a=>({...a,source:b?"pinned-evidence":a.source})));continue}d.push(...e.chunks.slice(0,Math.max(ac,20)).map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aP.get(e.file.relativePath),processingType:aR.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:b?"pinned-evidence":"bound-file"})))}let m=d.filter(a=>bD(i,a.filePath,aN)),o=as(m,ac,b6),p=as(m,120,b6);aZ.push(...o);let q=function(a,b=220){let c=[],d=new Set;for(let e of a)for(let a of function(a){let b=W(a),c=b.split(/[。;;\n]/u).map(a=>a.trim()).filter(a=>a.length>=12);return c.length?c:b?[b]:[]}(e.content)){if(!function(a){return[I,J,K,L,M,N,O].some(b=>(function(a,b){b.lastIndex=0;let c=b.test(a);return b.lastIndex=0,c})(a,b))||[...P,...Q,...R,...S,...T,...U].some(b=>a.includes(b))}(a))continue;let f=W(a).slice(0,420),g=f.replace(/\d+/gu,"#").slice(0,180);if(d.has(g))continue;d.add(g);let h=function(a){return H.find(([,b])=>b.test(a))?.[0]||"通用工程"}(f),i=Y(f,I).slice(0,8),j=Y(f,J).slice(0,8),k=Y(f,K).slice(0,8),l=Y(f,L).slice(0,6),m=Y(f,M).slice(0,8),n=Y(f,N).slice(0,8),o=Y(f,O).slice(0,5),p=Z(f,P),q=Z(f,Q),r=Z(f,R),s=Z(f,S),t=function(a){return T.some(b=>a.text.includes(b))?"dangerous_work":U.some(b=>a.text.includes(b))?"subdivision_work":a.costValues.length?"cost_commitment":a.scheduleValues.length?a.riskControl.length?"risk_response":"schedule_milestone":a.frequencyValues.length?a.inspection.length?"inspection_ratio":"management_frequency":a.resourceValues.length?"resource_allocation":a.quantities.length?"engineering_quantity":a.standards.length?"standard_requirement":"technical_parameter"}({text:f,parameters:i,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,standards:o,inspection:q,riskControl:s});if(c.push({id:`tech-${c.length+1}`,category:t,discipline:h,workItem:function(a,b){return["砌筑","构造柱","防水","闭水试验","地砖","墙砖","吊顶","涂料","给水","排水","消防水","消防电","电气","风管","排烟","油烟净化","厨房设备","明厨亮灶","隔油池","临时用电","动火作业"].find(b=>a.includes(b))||b}(f,h),specification:i.join("、")||void 0,parameter:i.join("、")||void 0,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,commitmentValues:[...k,...l,...m].slice(0,10),process:p,qualityControl:r,inspection:q,standard:o,riskControl:s,sourceRole:e.roleId,sourceFile:e.filePath,text:f,confidence:Math.min(1,.42+.06*i.length+.05*j.length+.05*k.length+.05*l.length+.05*m.length+.07*o.length+.04*p.length+.04*q.length)}),c.length>=b)return c}return c}(p,160),r=function(a,b,c=24){let d=b.filter(b=>(function(a,b){let c=`${b.title} ${b.purpose} ${(b.sections||[]).join(" ")} ${(b.requiredFacts||[]).join(" ")} ${(b.queries||[]).join(" ")}`;return/施工方法|主要.*方法|工艺|分项|分部分项/u.test(c)?/土建|砌筑|防水|装饰|给排水|电气|消防|暖通|厨房|设备|排烟/u.test(a.discipline+a.workItem)||["technical_parameter","subdivision_work","dangerous_work"].includes(a.category):/质量|工期|进度/u.test(c)?a.qualityControl?.length||a.inspection?.length||a.standard?.length||["schedule_milestone","inspection_ratio","management_frequency","cost_commitment"].includes(a.category):/人.*材.*机|资源|材料|机械/u.test(c)?["resource_allocation","engineering_quantity"].includes(a.category)||/材料|设备|机械|厨房设备|暖通|电气|给排水/u.test(a.discipline+a.workItem+a.text):/安全|文明|应急|危大|危险性较大|专项/u.test(c)?a.riskControl?.length||["risk_response","management_frequency","cost_commitment","dangerous_work"].includes(a.category)||/临时用电|动火|高处|消防|应急|扬尘|有限空间|拆除/u.test(a.text):/重点|难点/u.test(c)?a.confidence>=.65:[a.discipline,a.workItem].some(a=>c.includes(a))})(b,a)).sort((a,b)=>b.confidence-a.confidence).slice(0,c);return{chapterId:a.id,chapterTitle:a.title,facts:d}}(c,q);aY.push(r);let s=0===r.facts.length?"":["本章必须优先落位以下工程量化事实和技术事实。不得用“按设计要求、按规范要求、加强管理”等空泛表述替代已列出的工程量、工期节点、频次、人员资源、金额承诺、参数、工艺、试验和验收指标。","","| 序号 | 类型 | 专业 | 分项 | 参数/规格 | 工程量/工期/频次/资源/金额 | 工艺动作 | 试验验收 | 规范标准 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...r.facts.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.costValues||[],...a.frequencyValues||[],...a.resourceValues||[]].join("、");return`| ${b+1} | ${a.category} | ${a.discipline} | ${a.workItem} | ${a.parameter||a.specification||""} | ${c} | ${(a.process||[]).join("、")} | ${(a.inspection||[]).join("、")} | ${(a.standard||[]).join("、")} | ${a.text.replace(/\|/gu,",").slice(0,220)} |`}),"","强制写作要求:","- 主要施工方法类章节按“适用部位/材料参数/工艺流程/操作要点/质量验收/安全与成品保护”展开。","- 本章事实表中出现的工程数量、涉及学校数量、工期节点、检查频次、人员资源、设备数量、金额/违约承诺、数字、单位、强度、厚度、管径、试验时间、验收指标和规范编号,应自然写入正文。","- 如果资料中已有具体参数,禁止只写“满足设计要求”“按规范施工”。","- 每个主要分项至少写出施工动作、检查动作和验收动作。","- 识别到分部分项、危大工程、危险性较大工程、有限空间、动火、高处、临电、拆除等风险线索时,必须写入对应章节的风险识别、专项方案、交底、旁站检查、验收放行和应急闭环。"].join("\n"),t=function(a){let b=_(a.facts).slice(0,18);return 0===b.length?"":["## 本章量化事实覆盖矩阵","以下对象、部位、工程量、工期、频次、资源或金额来自项目资料。正文必须逐项覆盖;同一施工方案涉及多处对象时,不得只写其中一处或把多个工程量合并成一个笼统数量。","| 序号 | 施工对象/部位/分项 | 量化值 | 参数/规格 | 来源角色 | 来源文件 | 原始事实 |","|---|---|---|---|---|---|---|",...b.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].join("、");return`| ${b+1} | ${$(a)} | ${c} | ${a.parameter||a.specification||""} | ${a.sourceRole||""} | ${a.sourceFile||""} | ${a.text.replace(/\|/gu,",").slice(0,180)} |`}),"","覆盖要求:","- 日期、数量、规格、工程量、资源数量和工期节点只能使用资料中的值或由资料明确推导的值;没有依据时不得编造。","- 如果同一工艺适用于多个部位、区域、学校、片区或分项,应使用表格或分项段落分别说明适用范围、工程量和控制要点。","- 资料中存在多个来源值或口径不一致时,应保持审慎表述并提示需按招标文件、答疑、图纸或清单优先级复核,不得随意选择一个数值。"].join("\n")}(r),u=c.requiredFacts.filter(a=>!o.some(b=>aG(b,a)));for(let a of(0===o.length&&a1.push(`${c.title}:未检索到明确资料依据`),u))a1.push(`${c.title}:${a} 未检索到明确依据`);let v=bj({type:"knowledge_retrieval",roleId:"knowledge-base",status:aZ.length>0?"success":"fallback",message:`已检索/绑定 ${aZ.length} 条证据`});a9<0?a9=cu(af,v):af[a9]={...v,order:af[a9]?.order??v.order},a.onProgress?.([...af]),ct(a.signal);let w=bl(bf,n),x=function(a,b,c){let d=bk(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?`要求项:
94
+ ${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}:${aq(bb(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
77
95
  ${b.slice(0,18).map(a=>a.replace(ao,"").replace(an,"")).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
78
96
  ${e}`:"",g?`【角色节点结构化产物】
79
- ${g}`:""].filter(Boolean).join("\n\n")}(bi,c,f),y=cc.filter(a=>bm(i,a.sourceFile,aN)),z=function(a,b,c){if(0===a.length||c.explicitStructure||c.explicitSections||c.lengthLimit||c.wantsConcise||c.detailedInstructions||c.explicitFacts||c.styleConstraint)return"";let d=[b.title,b.purpose,...b.sections||[],...b.queries||[]].join("\n"),e=a.filter(a=>{let b=a0.find(b=>b.key===a.key);return!b||b.chapterHint.test(d)||/概况|总述|说明|背景/u.test(d)});return 0===e.length?"":["## 项目基础事实候选","以下事实来自已进入本章证据范围的绑定资料,仅在与本章主题相关时自然吸收进正文;不得新增章节、不得强制生成表格、不得输出本提示标题。",...e.slice(0,12).map(a=>`- ${a.key}:${a.value}`)].join("\n")}(y,c,aJ),A=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))].slice(0,18),e=a.roleFacts.slice(0,10).map(({fact:a})=>`- ${a.key}:${aq(aX(a.value)).slice(0,180)}`),f=a.technicalFactAssignment.facts.slice(0,14).map(a=>{let b=[...a.quantities||[],...a.scheduleValues||[],...a.resourceValues||[],...a.standard||[],a.parameter||"",a.specification||""].filter(Boolean).slice(0,6).join("、");return`- ${[a.discipline,a.workItem].filter(Boolean).join("/")||a.text.slice(0,40)}${b?`:${b}`:""}`}),g=a.projectBasicFacts.slice(0,8).map(a=>`- ${a.key}:${a.value}`),h=new Set(a.evidence.map(a=>a.filePath)).size;return["【本章事实覆盖反馈】",d.length?`必须优先覆盖的事实/要求:
97
+ ${g}`:""].filter(Boolean).join("\n\n")}(bf,c,f),y=bJ.filter(a=>bD(i,a.sourceFile,aN)),z=function(a,b,c){if(0===a.length||c.explicitStructure||c.explicitSections||c.lengthLimit||c.wantsConcise||c.detailedInstructions||c.explicitFacts||c.styleConstraint)return"";let d=[b.title,b.purpose,...b.sections||[],...b.queries||[]].join("\n"),e=a.filter(a=>{let b=bg.find(b=>b.key===a.key);return!b||b.chapterHint.test(d)||/概况|总述|说明|背景/u.test(d)});return 0===e.length?"":["## 项目基础事实候选","以下事实来自已进入本章证据范围的绑定资料,仅在与本章主题相关时自然吸收进正文;不得新增章节、不得强制生成表格、不得输出本提示标题。",...e.slice(0,12).map(a=>`- ${a.key}:${a.value}`)].join("\n")}(y,c,aJ),A=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))].slice(0,18),e=a.roleFacts.slice(0,10).map(({fact:a})=>`- ${a.key}:${aq(bb(a.value)).slice(0,180)}`),f=a.technicalFactAssignment.facts.slice(0,14).map(a=>{let b=[...a.quantities||[],...a.scheduleValues||[],...a.resourceValues||[],...a.standard||[],a.parameter||"",a.specification||""].filter(Boolean).slice(0,6).join("、");return`- ${[a.discipline,a.workItem].filter(Boolean).join("/")||a.text.slice(0,40)}${b?`:${b}`:""}`}),g=a.projectBasicFacts.slice(0,8).map(a=>`- ${a.key}:${a.value}`),h=new Set(a.evidence.map(a=>a.filePath)).size;return["【本章事实覆盖反馈】",d.length?`必须优先覆盖的事实/要求:
80
98
  ${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
81
99
  ${e.join("\n")}`:"",f.length?`结构化/量化事实:
82
100
  ${f.join("\n")}`:"",g.length?`项目基础事实:
83
- ${g.join("\n")}`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。如资料未明确提供,不得编造具体数值,应写成需要复核的条件、假设或处理措施。`:"",`本章可用资料来源约 ${h} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:f,spec:au,roleFacts:l,technicalFactAssignment:r,projectBasicFacts:y,evidence:o,missingFacts:u}),B=au?.chapterRules.find(a=>a.id===c.id||a.title===c.title),C=cd.chapterTargets.get(c.id)||1200,D=Math.max(f?.minWords||0,B?.minWords||0,au?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.82*C),1200),E=bQ(D,C),F=await bt(b=>bP({template:n,chapter:c,evidence:o,missingFacts:u,promptTexts:aI,projectContext:cb,requirement:a.requirement,roleContext:x,targetWords:C,forbidDrawingImages:w,factCoverageContext:A,signal:b}),bR(C),a.signal);if(F||(F=await bt(b=>bM(n,c,o,u,aI,cb,a.requirement,x,{forbidDrawingImages:w,minWords:D,targetWords:C,maxTokens:E,technicalFactContext:s,coverageMatrixContext:t,projectBasicFactContext:z,factCoverageContext:A,signal:b}),bR(C),a.signal)),b7(a.signal),!F){let b=o.slice(0,80),d=x.slice(0,12e3);F=await bt(e=>bM(n,c,b,u,aI,cb,a.requirement,d,{forbidDrawingImages:w,minWords:Math.max(900,Math.floor(.75*D)),targetWords:C,maxTokens:E,technicalFactContext:s.slice(0,12e3),coverageMatrixContext:t.slice(0,8e3),projectBasicFactContext:z.slice(0,8e3),factCoverageContext:A.slice(0,1e4),signal:e}),bR(C),a.signal)}if(b7(a.signal),!F)throw Error(`${c.title} 大模型未返回有效章节正文`);F=await bU({template:n,chapter:c,content:F,evidence:o,missingFacts:u,promptTexts:aI,projectContext:cb,requirement:a.requirement,roleContext:x,targetWords:C,forbidDrawingImages:w,factCoverageContext:A,signal:a.signal});let G=be({chapter:c,content:F,missingFacts:u,targetWords:C});G.length>0&&(F=await bf({template:n,chapter:{id:c.id,title:c.title,content:F,evidence:o,missingFacts:u,sections:c.sections||[]},issues:G.slice(0,5),promptTexts:aI,requirement:a.requirement,forbidDrawingImages:w,signal:a.signal}),b7(a.signal));let V=await bV({template:n,chapter:c,content:F,evidence:o,promptTexts:aI,requirement:a.requirement,roleContext:x,targetChars:Math.floor(.95*C),forbidDrawingImages:w,maxTokens:E,signal:a.signal}),X=V.content,aa=bz(X),ad=c.sections?.length?c.sections:bZ(X);a7.push(a3({type:"chapter_generation",roleId:"chapter_generation",promptId:ah.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:b9(`${ay(c.title)} 已由大模型生成${V.rounds>0?`并扩写 ${V.rounds} 轮`:""}:当前 ${aa} 字 / 目标 ${Math.floor(.95*C)} 字`,b)},{subtitle:ay(c.title),order:e})),aY.push({id:c.id,title:c.title,content:X,evidence:o,missingFacts:u,sections:ad})}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),a2.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),a7.push(a3({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${ay(c.title)} 生成失败`},{subtitle:ay(c.title),order:e}))}af.some(a=>"chapter_generation"===a.type&&a.message===a7[a7.length-1]?.message)||af.push(a7[a7.length-1]),a.onProgress?.([...af])}))}if(aY.sort((a,b)=>bT.findIndex(b=>b.id===a.id)-bT.findIndex(a=>a.id===b.id)),aZ.sort((a,b)=>bT.findIndex(b=>b.id===a.chapterId)-bT.findIndex(a=>a.id===b.chapterId)),0===aY.length)throw Error(`章节生成未完成:${a2.slice(0,6).join(";")||"没有生成任何有效章节"}`);if(am&&aY.length<bT.length)throw Error(`OUTLINE 指定 ${bT.length} 章,实际只生成 ${aY.length} 章:${a2.slice(0,6).join(";")||"部分章节未生成"}`);b7(a.signal);let ch={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{ch=await bv(i,a$,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(b7(a.signal),ch.notes))a$.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let ci=function(a,b,c){let d={};for(let e of aG(a,c)){let a=b.find(a=>aH(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(n,a$,au);for(let a of bi)for(let b of a.facts)ci[b.key]=`${aX(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cj=function(a,b,c){let d=aG(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(!aH(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],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.slice(0,300),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}(a$,n,au),ck=bi.flatMap(a=>a.facts.map(a=>({key:a.key,value:aX(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cl=cc.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),cm={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=aG(b,c).filter(a=>a.required).slice(0,30);return 0===d.length?a.filter(a=>a.confidence>=.75&&aX(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aX(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...cl,...ck,...cj],n,au))try{cm=await bw(a$,aK,n,au,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}b7(a.signal);let cn=[...cl,...ck,...cj,...cm.facts];for(let a of(b8(af,ch.stage),cm.stages))b8(af,a);a.onProgress?.([...af]);let co=function(a){let b=[],c=new Set;for(let g of a.filter(a=>"table"===a.processingType)){if(c.has(g.filePath))continue;c.add(g.filePath);let a=(0,l.aY)(),h=e.isAbsolute(g.filePath)?g.filePath:d.existsSync(e.join(a,"knowledgeBase",g.filePath))?e.join(a,"knowledgeBase",g.filePath):e.join(a,g.filePath),i=e.extname(g.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=f.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=f.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let h=e.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=e[h].filter(Boolean),j=e.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:g.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",m=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:g.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(a$),cp=a$.filter(a=>"pinned-evidence"===a.source).length,cq=a$.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cr=a3({type:"reference",roleId:"quality-enhancement",status:a$.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${a$.length} 条,人工确认/固定证据 ${cp} 条,项目上下文 ${ca.length} 条,自动检索证据 ${cq} 条`},{subtitle:"证据与上下文增强"});for(let b of(af.push(cr),a.onProgress?.([...af]),cn))ci[b.key]=`${aX(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cs=new Map;for(let a of a$)cs.set(a.filePath,(cs.get(a.filePath)??0)+1);let ct=[...cs.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cu=function(a,b=[],c=[],d){let e=b=>a.filter(a=>b.some(b=>a.key.includes(b))),f=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),g=a.filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|MPa|kPa|℃|%|GB|JGJ|CJJ|台|套|个|项|㎡/iu.test(`${a.key} ${a.value}`)),h=a.filter(a=>"table"===a.processingType||/bill|boq|清单|工程量/u.test(`${a.roleId} ${a.sourceFile}`));return{project:a,schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),bills:h,preciseFacts:g,rules:f("rule"),specifications:f("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){let c=b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.key))],d=[];for(let b of c){let c=a.filter(a=>a.key===b||a.fieldName===b),e=new Map;for(let a of c){let b=aX(a.value).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(cn,co,a_,au),cv=aY.map(a=>{let b=au.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=[...new Set([...a.missingFacts||[],...b?.requiredFactIds||[]].filter(Boolean))],d=c.filter(b=>!a.missingFacts.includes(b)),e=c.filter(b=>a.missingFacts.includes(b)),f=+(a.evidence.length>0),g=c.length?d.length/c.length:1;return{chapterId:a.id,title:a.title,requiredFacts:c,coveredFacts:d,missingFacts:e,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*g+.3*f)}}),cw=function(a,b=[],c){let d=[],e=[];for(let b of a)0===b.evidence.length&&d.push(`${b.title} 未检索到资料证据`),b.content.length<80&&d.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&e.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===bj(c).length&&e.push("模板未绑定任何提示词");let f=new Set(b.map(a=>a.roleId));for(let a of["project_fact","rule"])c?.fileBindings?.some(b=>b.roleId===a)&&!f.has(a)&&d.push(`${a} 角色未抽取到结构化事实`);return{passed:0===e.length,warnings:d,errors:e}}(aY,cn,n);cw.warnings.push(...aC.warnings),cw.errors.push(...aC.blockingIssues);let cx=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"error",message:a}))),d}(cw,cu,aY);cx.push(...function(a){let b=[];for(let c of a)0===c.evidenceCount?b.push({level:"error",message:`章节缺少证据:${c.title}`,suggestion:"请补充对应项目资料或调整模板章节检索词。"}):c.readinessRate<.5&&b.push({level:"warning",message:`章节事实覆盖率较低:${c.title} ${Math.round(100*c.readinessRate)}%`,suggestion:"建议补充章节 requiredFacts 或项目资料证据。"});return b}(cv));let cy=a5(bi,n),cz=await bX({template:n,chapters:aY,budget:cd,promptTexts:aI,requirement:a.requirement,forbidDrawingImages:cy,signal:a.signal});aY.splice(0,aY.length,...cz);let cA=bW(cd,aY.map(a=>a.content).join("\n\n")),cB=[cd.targetChars?`目标 ${cd.targetChars} 字`:void 0,cd.targetPages?`目标 ${cd.targetPages} 页`:void 0].filter(Boolean).join(" / ")||"默认章节深度",cC=a3({type:"validation",roleId:"document-budget",status:cd.minChars&&cA.currentChars<cd.minChars?"fallback":"success",message:`文档预算:当前 ${cA.currentChars} 字,预计 ${cA.estimatedPages} 页;${cB}`},{subtitle:"文档预算"});af.push(cC),a.onProgress?.([...af]);let cD=a7.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cE=a7.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cD>0&&cx.push({level:"error",message:`章节生成存在兜底:${cD} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),cE>0&&cx.push({level:"warning",message:`部分章节生成失败:${cE} 章`,suggestion:a2.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cF=cx.filter(a=>"error"===a.level&&bx(a)).length,cG=[...af];b8(cG,a3({type:"validation",roleId:"document-workflow",status:cF>0?"failed":"success",message:`阻断 ${cF},错误 ${cw.errors.length},警告 ${cw.warnings.length}`},{subtitle:"最终规范校验"})),b8(cG,a3({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),b8(cG,a3({type:"export_ready",roleId:"document-workflow",status:cF>0?"fallback":"success",message:cF>0?"导出存在风险项,仍可导出,请人工复核":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cH={templateId:n.id,templateName:n.name,title:n.outputTitle,requirement:a.requirement||"",projectRoot:i,projectId:k,exportSettings:n.exportSettings,generationSettings:n.generationSettings,facts:ci,structuredFacts:cn,factsModel:cu,chapters:aY,sources:ct,missingItems:[...new Set(a_)],validation:cw,validationIssues:cx,executionStages:cG,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},cI=b6(cH);b7(a.signal);let cJ=aY.filter(a=>0===a.evidence.length||a.missingFacts.length>0||bz(a.content)<Math.floor(.7*(cd.chapterTargets.get(a.id)||1200))||be({chapter:bT.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:cd.chapterTargets.get(a.id)||1200}).length>0),cK=cF>0||cx.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message))||cJ.length>Math.max(3,Math.floor(.35*aY.length))?await bY({template:n,spec:au,markdown:cI,evidence:a$,promptTexts:aM||aI,projectContext:cb,requirement:a.requirement,signal:a.signal}):{markdown:cI,stage:{type:"llm_review",roleId:"llm-review",status:cJ.length>0?"skipped":"success",message:cJ.length>0?`本地风险扫描发现 ${cJ.length} 个低/中风险章节,已在章节阶段完成局部自检修复,跳过全文审查`:"本地风险扫描未发现需要 LLM 深度审查的章节,跳过全文审查"}};b7(a.signal);let cL=b_(a6(cK.markdown===cI?b6({...cH,validationIssues:cx,exportGate:cH.exportGate,executionStages:cG}):cK.markdown,cy)),cM=b5(cL,n).map(a=>a.message),cN=bK(cL).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cO=bL(cL,n).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cP=bJ(cL,cu).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cQ=aa({assignments:aZ,markdown:cL}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cR=bI(cL).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cS=bF(cL).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cT=bG(cL).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cU=bH(aY).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cV=b0(cL).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cW=[...bc(cL,aY,bS,bi,cy),...cM,...cN,...cO,...cP,...cQ,...cR,...cS,...cT,...cU,...cV],cX=await bg({markdown:cL,template:n,chapters:aY,promptTexts:aI,requirement:a.requirement,issues:cW,forbidDrawingImages:cy,signal:a.signal});b7(a.signal);let cY=cX.stage?[...cG,cK.stage,cX.stage]:[...cG,cK.stage],cZ=cX.chapters,c$=bW(cd,cZ.map(a=>a.content).join("\n\n"));cd.minChars&&c$.currentChars<Math.floor(.9*cd.minChars)&&(cZ=await bX({template:n,chapters:cZ,budget:cd,promptTexts:aI,requirement:a.requirement,forbidDrawingImages:cy,signal:a.signal}));let c_=b6({...cH,chapters:cZ,validationIssues:cx,exportGate:cH.exportGate,executionStages:cG}),c0=function(a,b){let c=b3(b2(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${b4(aB(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=bZ(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(c_,cZ),c1=cZ.map((a,b)=>({...a,sections:c0[b]||a.sections||[]})),c2=b_(ba(function(a,b){let c=b3(a,b),d=b1(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)}
101
+ ${g.join("\n")}`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。如资料未明确提供,不得编造具体数值,应写成需要复核的条件、假设或处理措施。`:"",`本章可用资料来源约 ${h} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:f,spec:au,roleFacts:l,technicalFactAssignment:r,projectBasicFacts:y,evidence:o,missingFacts:u}),B=au?.chapterRules.find(a=>a.id===c.id||a.title===c.title),C=bM.chapterTargets.get(c.id)||1200,D=Math.max(f?.minWords||0,B?.minWords||0,au?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.82*C),1200),E=bQ.get(c.id);if(E){let d=bu({chapter:c,content:E.content,missingFacts:u,targetWords:C});if(0===a6(d).length){let d=bT(E.content),f={...E,title:c.title,evidence:E.evidence?.length?E.evidence:o,missingFacts:u,sections:E.sections?.length?E.sections:c.sections||cj(E.content)};aX.push(f),b6.cache.chapterHits+=1,b6.quality.reusedChapterCount+=1,a8.push(bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ah.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:cv(`${az(c.title)} 已复用上次完成章节:当前 ${d} 字 / 目标 ${Math.floor(.95*C)} 字`,b)},{subtitle:az(c.title),order:e})),af.push(a8[a8.length-1]),a.onProgress?.([...af]);return}b6.cache.rejectedHits+=1}let F={template:n,chapter:c,evidence:o,missingFacts:u,promptTexts:aE,requirement:a.requirement,projectRoot:i,modelName:bn,targetWords:C,fileRolesHash:bp},G=b5.enableChapterCache?function(a,b){aW(b);let c=a5(a),d=aL.get(c),e=d?.value||a$(a.projectRoot,"chapter-draft",c);if(!e){b&&(b.cache.chapterMisses+=1);return}if(e.id!==a.chapter.id||!e.content?.trim()||a6(bu({chapter:a.chapter,content:e.content,missingFacts:e.missingFacts||a.missingFacts,targetWords:a.targetWords})).length>0){b&&(b.cache.rejectedHits+=1);return}return d&&(d.hits+=1),aU(aL,c,{value:e,updatedAt:Date.now(),hits:(d?.hits||0)+1}),b&&(b.cache.chapterHits+=1),e}(F,b6):void 0;if(G){let d=bT(G.content);a8.push(bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ah.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:cv(`${az(c.title)} 已复用章节缓存:当前 ${d} 字 / 目标 ${Math.floor(.95*C)} 字`,b)},{subtitle:az(c.title),order:e})),aX.push(G),af.push(a8[a8.length-1]),a.onProgress?.([...af]);return}let V=b8(D,C),X=await aV(b6,`chapter-draft:${c.id}`,()=>bL(b=>b7({template:n,chapter:c,evidence:o,missingFacts:u,promptTexts:aE,projectContext:bK,requirement:a.requirement,roleContext:x,targetWords:C,forbidDrawingImages:w,factCoverageContext:A,projectRoot:i,modelName:bn,fileRolesHash:bp,diagnostics:b6,signal:b}),b9(C),a.signal));if(X||(X=await aV(b6,`chapter-draft-fallback:${c.id}`,()=>bL(b=>b4(n,c,o,u,aE,bK,a.requirement,x,{forbidDrawingImages:w,minWords:D,targetWords:C,maxTokens:V,technicalFactContext:s,coverageMatrixContext:t,projectBasicFactContext:z,factCoverageContext:A,signal:b}),b9(C),a.signal))),ct(a.signal),!X){let b=o.slice(0,80),d=x.slice(0,12e3);X=await aV(b6,`chapter-draft-compact-fallback:${c.id}`,()=>bL(e=>b4(n,c,b,u,aE,bK,a.requirement,d,{forbidDrawingImages:w,minWords:Math.max(900,Math.floor(.75*D)),targetWords:C,maxTokens:V,technicalFactContext:s.slice(0,12e3),coverageMatrixContext:t.slice(0,8e3),projectBasicFactContext:z.slice(0,8e3),factCoverageContext:A.slice(0,1e4),signal:e}),b9(C),a.signal))}if(ct(a.signal),!X)throw Error(`${c.title} 大模型未返回有效章节正文`);let aa=X;X=await aV(b6,`chapter-supplement:${c.id}`,()=>cc({template:n,chapter:c,content:aa,evidence:o,missingFacts:u,promptTexts:aE,projectContext:bK,requirement:a.requirement,roleContext:x,targetWords:C,forbidDrawingImages:w,factCoverageContext:A,signal:a.signal}));let ad=bu({chapter:c,content:X,missingFacts:u,targetWords:C}),ae=bR(ad);b6.quality.blockingCount+=ae.blocking,b6.quality.importantCount+=ae.important,b6.quality.minorCount+=ae.minor;let ag=a6(ad);if(ag.length>0){let b=X;X=await aV(b6,`chapter-repair:${c.id}`,()=>bw({template:n,chapter:{id:c.id,title:c.title,content:b,evidence:o,missingFacts:u,sections:c.sections||[]},issues:ag.slice(0,3),promptTexts:aE,requirement:a.requirement,forbidDrawingImages:w,signal:a.signal})),b6.quality.repairedCount+=1,ct(a.signal)}let ai=await aV(b6,`chapter-expand:${c.id}`,()=>cd({template:n,chapter:c,content:X,evidence:o,promptTexts:aE,requirement:a.requirement,roleContext:x,targetChars:Math.floor(.95*C),forbidDrawingImages:w,maxTokens:V,signal:a.signal})),aj=ai.content,ak=bT(aj),al=c.sections?.length?c.sections:cj(aj);a8.push(bj({type:"chapter_generation",roleId:"chapter_generation",promptId:ah.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:cv(`${az(c.title)} 已由大模型生成${ai.rounds>0?`并扩写 ${ai.rounds} 轮`:""}:当前 ${ak} 字 / 目标 ${Math.floor(.95*C)} 字`,b)},{subtitle:az(c.title),order:e}));let am={id:c.id,title:c.title,content:aj,evidence:o,missingFacts:u,sections:al};aX.push(am);let ap=bu({chapter:c,content:aj,missingFacts:u,targetWords:C}),ar=bR(ap);b6.quality.blockingCount+=ar.blocking,b6.quality.importantCount+=ar.important,b6.quality.minorCount+=ar.minor,b5.enableChapterCache&&0===a6(ap).length&&function(a,b,c){let d=a5(a);aU(aL,d,{value:b,updatedAt:Date.now(),hits:0}),a_(a.projectRoot,"chapter-draft",d,b),c&&(c.cache.chapterWrites+=1),aW(c)}(F,am,b6)}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),a7.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),a8.push(bj({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${az(c.title)} 生成失败`},{subtitle:az(c.title),order:e}))}af.some(a=>"chapter_generation"===a.type&&a.message===a8[a8.length-1]?.message)||af.push(a8[a8.length-1]),a.onProgress?.([...af])}))}if(aX.sort((a,b)=>bv.findIndex(b=>b.id===a.id)-bv.findIndex(a=>a.id===b.id)),aY.sort((a,b)=>bv.findIndex(b=>b.id===a.chapterId)-bv.findIndex(a=>a.id===b.chapterId)),0===aX.length)throw Error(`章节生成未完成:${a7.slice(0,6).join(";")||"没有生成任何有效章节"}`);if(am&&aX.length<bv.length)throw Error(`OUTLINE 指定 ${bv.length} 章,实际只生成 ${aX.length} 章:${a7.slice(0,6).join(";")||"部分章节未生成"}`);ct(a.signal);let cw={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{cw=await bN(i,aZ,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(ct(a.signal),cw.notes))aZ.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let cx=function(a,b,c){let d={};for(let e of aH(a,c)){let a=b.find(a=>aI(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(n,aZ,au);for(let a of bf)for(let b of a.facts)cx[b.key]=`${bb(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cy=function(a,b,c){let d=aH(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(!aI(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],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.slice(0,300),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}(aZ,n,au),cz=bf.flatMap(a=>a.facts.map(a=>({key:a.key,value:bb(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cA=bJ.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),cB={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=aH(b,c).filter(a=>a.required).slice(0,30);return 0===d.length?a.filter(a=>a.confidence>=.75&&bb(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=bb(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}([...cA,...cz,...cy],n,au))try{cB=await bO(aZ,aK,n,au,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}ct(a.signal);let cC=[...cA,...cz,...cy,...cB.facts];for(let a of(cu(af,cw.stage),cB.stages))cu(af,a);a.onProgress?.([...af]);let cD=function(a){let b=[],c=new Set;for(let g of a.filter(a=>"table"===a.processingType)){if(c.has(g.filePath))continue;c.add(g.filePath);let a=(0,l.aY)(),h=e.isAbsolute(g.filePath)?g.filePath:d.existsSync(e.join(a,"knowledgeBase",g.filePath))?e.join(a,"knowledgeBase",g.filePath):e.join(a,g.filePath),i=e.extname(g.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=f.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=f.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let h=e.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=e[h].filter(Boolean),j=e.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:g.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",m=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:g.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(aZ),cE=aZ.filter(a=>"pinned-evidence"===a.source).length,cF=aZ.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cG=bj({type:"reference",roleId:"quality-enhancement",status:aZ.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aZ.length} 条,人工确认/固定证据 ${cE} 条,项目上下文 ${bH.length} 条,自动检索证据 ${cF} 条`},{subtitle:"证据与上下文增强"});for(let b of(af.push(cG),a.onProgress?.([...af]),cC))cx[b.key]=`${bb(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cH=new Map;for(let a of aZ)cH.set(a.filePath,(cH.get(a.filePath)??0)+1);let cI=[...cH.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cJ=function(a,b=[],c=[],d){let e=b=>a.filter(a=>b.some(b=>a.key.includes(b))),f=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),g=a.filter(a=>/\d|DN|φ|Φ|mm|cm|m²|m3|MPa|kPa|℃|%|GB|JGJ|CJJ|台|套|个|项|㎡/iu.test(`${a.key} ${a.value}`)),h=a.filter(a=>"table"===a.processingType||/bill|boq|清单|工程量/u.test(`${a.roleId} ${a.sourceFile}`));return{project:a,schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),bills:h,preciseFacts:g,rules:f("rule"),specifications:f("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){let c=b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.key))],d=[];for(let b of c){let c=a.filter(a=>a.key===b||a.fieldName===b),e=new Map;for(let a of c){let b=bb(a.value).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(cC,cD,a1,au),cK=aX.map(a=>{let b=au.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=[...new Set([...a.missingFacts||[],...b?.requiredFactIds||[]].filter(Boolean))],d=c.filter(b=>!a.missingFacts.includes(b)),e=c.filter(b=>a.missingFacts.includes(b)),f=+(a.evidence.length>0),g=c.length?d.length/c.length:1;return{chapterId:a.id,title:a.title,requiredFacts:c,coveredFacts:d,missingFacts:e,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*g+.3*f)}}),cL=function(a,b=[],c){let d=[],e=[];for(let b of a)0===b.evidence.length&&d.push(`${b.title} 未检索到资料证据`),b.content.length<80&&d.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&e.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===bA(c).length&&e.push("模板未绑定任何提示词");let f=new Set(b.map(a=>a.roleId));for(let a of["project_fact","rule"])c?.fileBindings?.some(b=>b.roleId===a)&&!f.has(a)&&d.push(`${a} 角色未抽取到结构化事实`);return{passed:0===e.length,warnings:d,errors:e}}(aX,cC,n);cL.warnings.push(...aw.warnings),cL.errors.push(...aw.blockingIssues);let cM=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:"error",message:a}))),d}(cL,cJ,aX);cM.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}(cK));let cN=bl(bf,n),cO=Date.now(),cP=bT(aX.map(a=>a.content).join("\n\n")),cQ=await cf({template:n,chapters:aX,budget:bM,promptTexts:aE,requirement:a.requirement,forbidDrawingImages:cN,signal:a.signal});aX.splice(0,aX.length,...cQ);let cR=ce(bM,aX.map(a=>a.content).join("\n\n")),cS=[bM.targetChars?`目标 ${bM.targetChars} 字`:void 0,bM.targetPages?`目标 ${bM.targetPages} 页`:void 0].filter(Boolean).join(" / ")||"默认章节深度",cT=bj({type:"validation",roleId:"document-budget",status:bM.minChars&&cR.currentChars<bM.minChars?"fallback":"success",message:cv(`文档预算:当前 ${cR.currentChars} 字,新增 ${Math.max(0,cR.currentChars-cP)} 字,预计 ${cR.estimatedPages} 页;${cS}`,cO)},{subtitle:"文档预算"});af.push(cT),a.onProgress?.([...af]);let cU=a8.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cV=a8.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cU>0&&cM.push({level:"error",message:`章节生成存在兜底:${cU} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),cV>0&&cM.push({level:"warning",message:`部分章节生成失败:${cV} 章`,suggestion:a7.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cW=cM.filter(a=>"error"===a.level&&bP(a)).length,cX=[...af];cu(cX,bj({type:"validation",roleId:"document-workflow",status:cW>0?"failed":"success",message:`阻断 ${cW},错误 ${cL.errors.length},警告 ${cL.warnings.length}`},{subtitle:"最终规范校验"})),cu(cX,bj({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),cu(cX,bj({type:"export_ready",roleId:"document-workflow",status:cW>0?"fallback":"success",message:cW>0?"导出存在风险项,仍可导出,请人工复核":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cY={templateId:n.id,templateName:n.name,title:n.outputTitle,requirement:a.requirement||"",projectRoot:i,projectId:k,exportSettings:n.exportSettings,generationSettings:n.generationSettings,facts:cx,structuredFacts:cC,factsModel:cJ,chapters:aX,sources:cI,missingItems:[...new Set(a1)],validation:cL,validationIssues:cM,executionStages:cX,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],partialChapters:aX.map(a=>({id:a.id,title:a.title,chars:bT(a.content),status:"completed",updatedAt:Date.now()})),generatedAt:Date.now()},cZ=cs(cY);ct(a.signal);let c$=b5.enableChapterReview?await aV(b6,"chapter-review",()=>cg({template:n,chapters:aX,budget:bM,promptTexts:aM||aE,requirement:a.requirement,strategy:b5,diagnostics:b6,signal:a.signal}),{chapters:aX.length}):{summaries:aX.map(a=>({chapterId:a.id,title:a.title,status:"pass",issues:[],suggestions:[],chars:bT(a.content)})),stage:bj({type:"llm_review",roleId:"chapter-review",status:"success",message:"短文档策略已跳过章节级 LLM 审查"},{subtitle:"章节级质量审查"})};for(let a of(cX.push(c$.stage),c$.summaries.filter(a=>"pass"!==a.status)))cM.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:${a.issues.slice(0,4).join(";")||"存在质量风险"}`,suggestion:a.suggestions.slice(0,3).join(";")||"请复核章节事实覆盖、结构完整性和专业闭环。"});let c_=b5.enableGlobalReview?await aV(b6,"global-consistency-review",()=>ch({template:n,chapters:aX,chapterReviews:c$.summaries,promptTexts:aM||aE,requirement:a.requirement,projectContext:bK,diagnostics:b6,signal:a.signal}),{chapters:aX.length}):{issues:[],stage:bj({type:"llm_review",roleId:"global-consistency-review",status:"success",message:"当前策略已跳过全局 LLM 一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cX.push(c_.stage),c_.issues))cM.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、项目参数、范围边界和闭环关系。"});a.onProgress?.([...cX]);let c0=aX.filter(a=>0===a.evidence.length||a.missingFacts.length>0||bT(a.content)<Math.floor(.7*(bM.chapterTargets.get(a.id)||1200))||c$.summaries.some(b=>b.chapterId===a.id&&"pass"!==b.status)||bu({chapter:bv.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:bM.chapterTargets.get(a.id)||1200}).length>0),c1=cW>0||c_.issues.length>0||c$.summaries.some(a=>"fail"===a.status)||cM.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message))||c0.length>Math.max(3,Math.floor(.35*aX.length)),c2=Date.now(),c3=c1?await ci({template:n,spec:au,markdown:cZ,evidence:aZ,promptTexts:aM||aE,projectContext:bK,requirement:a.requirement,signal:a.signal}):{markdown:cZ,stage:{type:"llm_review",roleId:"llm-review",status:c0.length>0?"skipped":"success",message:c0.length>0?`本地风险扫描发现 ${c0.length} 个低/中风险章节,已在章节阶段完成局部自检修复,跳过全文审查`:"本地风险扫描未发现需要 LLM 深度审查的章节,跳过全文审查"}};c3.stage.message=cv(c3.stage.message||"LLM 审查完成",c2),ct(a.signal);let c4=cl(bm(c3.markdown===cZ?cs({...cY,validationIssues:cM,exportGate:cY.exportGate,executionStages:cX}):c3.markdown,cN)),c5=cr(c4,n).map(a=>a.message),c6=b2(c4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c7=b3(c4,n).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c8=b1(c4,cJ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c9=aa({assignments:aY,markdown:c4}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),da=b0(c4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),db=bZ(c4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dc=b$(c4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dd=b_(aX).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),de=cm(c4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),df=[...bs(c4,aX,bt,bf,cN),...c5,...c6,...c7,...c8,...c9,...da,...db,...dc,...dd,...de],dg=Date.now(),dh=await aV(b6,"typed-quality-repair",()=>bx({markdown:c4,template:n,chapters:aX,promptTexts:aE,requirement:a.requirement,issues:df,forbidDrawingImages:cN,strategy:b5,signal:a.signal}),{issues:df.length});dh.stage&&(dh.stage.message=cv(dh.stage.message||"质量修复完成",dg)),ct(a.signal);let di=dh.stage?[...cX,c3.stage,dh.stage]:[...cX,c3.stage],dj=dh.chapters,dk=ce(bM,dj.map(a=>a.content).join("\n\n"));if(bM.minChars&&dk.currentChars<Math.floor(.9*bM.minChars)){let b=Date.now(),c=dk.currentChars;dj=await cf({template:n,chapters:dj,budget:bM,promptTexts:aE,requirement:a.requirement,forbidDrawingImages:cN,signal:a.signal});let d=ce(bM,dj.map(a=>a.content).join("\n\n"));di.push(bj({type:"validation",roleId:"document-budget-repair",status:bM.minChars&&d.currentChars<bM.minChars?"fallback":"success",message:cv(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dl=cs({...cY,chapters:dj,validationIssues:cM,exportGate:cY.exportGate,executionStages:cX}),dm=function(a,b){let c=cp(co(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${cq(aC(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=cj(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(dl,dj),dn=dj.map((a,b)=>({...a,sections:dm[b]||a.sections||[]})),dp=cl(bq(function(a,b){let c=cp(a,b),d=cn(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)}
84
102
 
85
103
  ${d}
86
104
 
@@ -90,9 +108,9 @@ ${c.slice(a).trimStart()}`}return`${d}
90
108
 
91
109
  <div class="page-break"></div>
92
110
 
93
- ${c}`}(a6(c_,cy),c1))),c3=[...bc(cL,aY,bS,bi,cy),...cM];for(let a of((cx=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>aH(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>aH(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.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&&h.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let l=bD(e),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0})),n=by(e);for(let b of a.gateRules){let a=b.level,o=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},p=o.target||b.target||"",q=o.value||b.value||p,r=o.min||Number(b.value)||1,s=d.find(a=>a.title===p),t="chapter"===o.subject&&s?s.content:e,u=q?function(a){try{return RegExp(a,"iu")}catch{return}}(q):void 0;"fact"===o.subject&&"exists"===o.operator&&p&&!j.has(p)&&h.push({level:a,message:bE(b,`缺少事实 ${p}`)}),"chapter"===o.subject&&"exists"===o.operator&&p&&!k.has(p)&&h.push({level:a,message:bE(b,`缺少章节 ${p}`)}),"file_role"===o.subject&&"exists"===o.operator&&p&&!f.some(a=>a.roleId===p)&&h.push({level:a,message:bE(b,`缺少文件角色 ${p}`)}),"prompt_role"===o.subject&&"exists"===o.operator&&p&&!g.some(a=>a.roleId===p)&&h.push({level:a,message:bE(b,`缺少提示词角色 ${p}`)}),"document"===o.subject&&"contains"===o.operator&&q&&!e.includes(q)&&h.push({level:a,message:bE(b,`全文必须包含 ${q}`)}),"document"===o.subject&&"not_contains"===o.operator&&q&&e.includes(q)&&h.push({level:a,message:bE(b,`出现禁用文本 ${q}`)}),"document"!==o.subject&&"chapter"!==o.subject||"regex_match"!==o.operator||!q||u&&u.test(t)||h.push({level:a,message:bE(b,`未匹配正则 ${q}`)}),("document"===o.subject||"chapter"===o.subject)&&"regex_not_match"===o.operator&&u?.test(t)&&h.push({level:a,message:bE(b,`匹配到禁止正则 ${q}`)}),"chapter"===o.subject&&"contains"===o.operator&&p&&q&&(!s||!s.content.includes(q))&&h.push({level:a,message:bE(b,`章节 ${p} 必须包含 ${q}`)}),"chapter"===o.subject&&"not_contains"===o.operator&&s?.content.includes(q)&&h.push({level:a,message:bE(b,`章节 ${p} 出现禁用文本 ${q}`)}),"chapter"===o.subject&&"min_length"===o.operator&&p&&(!s||s.content.length<r)&&h.push({level:a,message:bE(b,`章节 ${p} 低于 ${r} 字`)}),"table"===o.subject&&"min_count"===o.operator&&c.tables.length+l.length<r&&h.push({level:a,message:bE(b,`表格数量少于 ${r}`)}),"table"===o.subject&&"table_explanation_required"===o.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:bE(b,"存在缺少说明文字的表格")}),"image"===o.subject&&"min_count"===o.operator&&m.length<r&&h.push({level:a,message:bE(b,`图片数量少于 ${r}`)}),"page"===o.subject&&"min_count"===o.operator&&n<r&&h.push({level:a,message:bE(b,`预计页数 ${n} 少于 ${r}`)}),"page"===o.subject&&"max_count"===o.operator&&n>r&&h.push({level:a,message:bE(b,`预计页数 ${n} 超过 ${r}`)}),"image"===o.subject&&"image_caption_required"===o.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:bE(b,"存在缺少说明文字的图片")}),"source"===o.subject&&"all_have_source"===o.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:bE(b,"存在无来源事实")}),"source"===o.subject&&"min_count"===o.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<r&&h.push({level:a,message:bE(b,`来源数量少于 ${r}`)})}return h}(au,[...cx,...c3.map(a=>({level:"warning",message:a}))],cu,c1,c2,aj,ah)).push(...function(a){let b=[],c=a.markdown||"";for(let d of a.spec.factFields.filter(a=>a.required))!c.includes(d.name)&&d.name.length>=3&&b.push({level:"warning",message:`后台优化建议:正文可能未显式覆盖“${d.name}”`,suggestion:"建议检查对应章节是否已自然表达该事实。"});let d=a.summary.facts.projectName;d&&"当前知识库项目"!==d&&!c.includes(d)&&b.push({level:"warning",message:"正文未明显体现项目名称",suggestion:"建议在工程概况或首页标题中体现当前项目名称。"});let e=a.summary.facts.tenderNo;for(let a of(e&&!c.includes(e)&&b.push({level:"info",message:"正文未体现招标/项目编号",suggestion:"如正式文件需要编号,请在工程概况中补充。"}),["知识库证据","文件角色","提示词角色","文档规范包","规范包","后台自动规范","后台优化建议","项目基础事实候选","资料未提供","未检索到"]))c.includes(a)&&b.push({level:"error",message:`正文包含后台流程话术:${a}`,suggestion:"请重新生成或在审查阶段删除后台流程描述。"});return b}({markdown:c2,spec:au,summary:ap})),cx.push(...function(a){let b=[];for(let c of[{label:"项目名称",keys:["项目名称","工程名称"]},{label:"招标编号",keys:["招标编号","项目编号"]},{label:"工期要求",keys:["工期","进度节点"]},{label:"质量要求",keys:["质量"]}]){let d=new Map;for(let b of function(a,b){return a.filter(a=>b.some(b=>a.key.includes(b)||a.fieldName?.includes(b))).map(a=>({value:String(a.value),source:a.sourceFile}))}(a.facts,c.keys)){let a=b.value.replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();a&&!(a.length<2)&&d.set(a,[...d.get(a)||[],b])}if(d.size>1){let a=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");b.push({level:"error",message:`事实一致性冲突:${c.label} 存在多个值:${a}`,suggestion:"请确认当前项目资料组,或在模板绑定中只绑定当前项目资料。"})}}let c=a.summary.facts.projectName;return c&&"当前知识库项目"!==c&&!a.markdown.includes(c)&&b.push({level:"error",message:`正文未包含当前项目名称:${c}`,suggestion:"请重新生成,确保标题或工程概况体现当前项目名称。"}),b}({markdown:c2,facts:cn,summary:ap})),cx.push(...function(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)&&G(a,e)&&c.push({level:"error",message:`正文疑似混入其他项目名称:${e}`,suggestion:"请检查项目资料组选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.tenderNos,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}(c2,ap)),cx.push(...function(a){let b=[],c=(0,p.V)().technicalDetailGate,d=`${a.template.name} ${a.template.category} ${a.template.outputTitle}`;if(!(c?.templateMatchers?.length?c.templateMatchers:["施工组织设计","施工方案","技术标.*施工","施工.*技术标"]).some(a=>RegExp(a,"iu").test(d)))return b;let e=a.finalMarkdown||a.chapters.map(a=>`${a.title}
94
- ${a.content}`).join("\n\n"),f=Y(a.chapters.filter(a=>/施工方法|主要.*方法|工艺/u.test(a.title)).map(a=>a.content).join("\n")||e,I).length,g=[J,K,L,M,N].reduce((a,b)=>a+Y(e,b).length,0),h=Y(e,O).length,i=P.filter(a=>e.includes(a)).length,j=Q.filter(a=>e.includes(a)).length,k=(c?.genericPhrases?.length?c.genericPhrases:V).reduce((a,b)=>a+(e.match(RegExp(b,"gu"))?.length||0),0),l=a.assignments.flatMap(a=>a.facts),m=X(l.flatMap(a=>{var b;return X([...Y(b=`${a.parameter||""} ${a.specification||""} ${a.text}`,I),...Y(b,J),...Y(b,K),...Y(b,L),...Y(b,M),...Y(b,N),...Y(b,O)].map(a=>a.replace(/\s+/gu,"")))})).slice(0,120),n=m.filter(a=>e.replace(/\s+/gu,"").includes(a)),o=m.length?n.length/m.length:1,q=c?.minAssignedFactCountForBlocking??12;return l.length>=q&&o<(c?.minTechnicalFactUsageRate??.35)&&b.push({level:"error",message:`工程技术事实使用率不足:${Math.round(100*o)}%`,suggestion:"请把清单、图纸、设计说明中的材料规格、尺寸参数、试验验收和规范编号写入对应章节。"}),f<(c?.minMethodParameterCount??18)&&l.length>=q&&b.push({level:"error",message:`施工方法参数密度不足:仅识别 ${f} 个数字/规格参数`,suggestion:"主要施工方法应补充材料强度、厚度、尺寸、管径、试验时间、压力、偏差和数量等可核查参数。"}),g<(c?.minQuantitativeFactCount??20)&&l.length>=q&&b.push({level:"error",message:`工程量化事实密度不足:仅识别 ${g} 个工程量/工期/频次/资源/金额类数据`,suggestion:"请把工程数量、学校数量、工期节点、检查频次、人员驻场、机械设备、检测比例、响应时限和违约承诺写入对应章节。"}),h<(c?.minStandardCount??4)&&b.push({level:"warning",message:`规范标准引用不足:仅识别 ${h} 个规范编号`,suggestion:"请结合图纸、设计说明和招标文件补充 GB/JGJ/CJJ 等规范或验收标准。"}),i<(c?.minProcessActionCount??6)&&b.push({level:"warning",message:`工艺动作覆盖不足:仅识别 ${i} 类施工动作`,suggestion:"请补充基层处理、测量放线、样板、安装连接、隐蔽验收、调试和成品保护等工艺链。"}),j<(c?.minInspectionActionCount??6)&&b.push({level:"warning",message:`试验验收表达不足:仅识别 ${j} 类试验/验收动作`,suggestion:"请补充闭水、打压、通球、绝缘、联动、复试、允许偏差等验收控制。"}),k>Math.max(c?.maxGenericPhraseCountPer1800Chars??10,Math.floor(e.length/1800)*(c?.maxGenericPhraseCountPer1800Chars??10))&&b.push({level:"error",message:`空泛表达过多:识别 ${k} 处泛化表述`,suggestion:"请减少“按规范要求、满足设计要求、加强管理”等空话,并用具体参数、流程和验收动作替代。"}),b}({template:n,chapters:c1,assignments:aZ,finalMarkdown:c2})),cx.push(...aa({assignments:aZ,markdown:c2})),cx.push(...bI(c2)),cx.push(...bF(c2)),cx.push(...bG(c2)),cx.push(...b0(c2)),cx.push(...bH(c1)),cx.push(...bJ(c2,cu)),cx.push(...bK(c2)),cx.push(...function(a,b){let c=ag(b).map(a=>a.content).join("\n\n");if(!c.trim())return[];let d=[];for(let b of[...c.matchAll(/(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?\s*([\s\S]{20,800}?)(?=\n\s*\n|$)/giu)].map(a=>(a[1]||"").replace(/\s+/gu," ").trim()).filter(a=>a.length>=20).slice(0,20)){let c=b.slice(0,80);if(c.length>=20&&a.replace(/\s+/gu," ").includes(c)){d.push({level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前项目资料生成的正式正文。"});break}}return d}(c2,ah)),c={template:n,chapters:c1,markdown:c2},(0,p.V)().qualityBenchmarks.filter(a=>(function(a,b){let c=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return b.templateMatchers.some(a=>RegExp(a,"iu").test(c))})(c.template,a)).map(a=>{let b=0,d=0,e=[];for(let f of a.rules){let a=Math.max(0,f.weight||0);d+=a,function(a,b,c){let d=c||b.map(a=>`${a.title}
95
- ${a.content}`).join("\n\n"),e=function(a,b=[]){return b.filter(b=>b&&a.includes(b)).length}(d,a.keywords),f=function(a,b=[]){return b.filter(b=>a.some(a=>RegExp(b,"iu").test(a.title))).length}(b,a.titlePatterns),g=[a.keywords?.length?e/a.keywords.length:void 0,a.titlePatterns?.length?f/a.titlePatterns.length:void 0,a.tableRequired?+!!/\n\s*\|[^\n]+\|\s*\n\s*\|\s*[-:| ]+\|/u.test(d):void 0].filter(a=>"number"==typeof a),h=g.length?g.reduce((a,b)=>a+b,0)/g.length:1,i=null==a.minRatio||h>=a.minRatio,j=null==a.minCount||e+f>=a.minCount;return{passed:i&&j,ratio:h,keywordCount:e,titleCount:f}}(f,c.chapters,c.markdown).passed?b+=a:e.push({level:f.level||"warning",message:`质量基准未达标:${f.name}`,suggestion:f.suggestion||"请补充专业细节、表格或对应章节内容。"})}let f=d>0?Math.round(b/d*100):100,g=f<a.blockBelowScore||e.some(a=>"error"===a.level);return{benchmarkId:a.id,benchmarkName:a.name,score:f,pass:f>=a.passScore,blocked:g,issues:g?[{level:"error",message:`文档质量基准评分未达标:${a.name} ${f}分`,suggestion:"请重新生成或补充模板、资料、章节内容后再导出。"},...e]:e}})))cx.push(...a.issues);cx.push(...function(a){let b=[],c=a.markdown;for(let c of a.roles.filter(a=>a.required))c.satisfied?c.weak&&b.push({level:"warning",message:`工程专项资料角色证据较弱:${c.role}`,suggestion:"建议补充更多同类资料以提高正式文件可靠性。"}):b.push({level:"error",message:`工程专项资料角色缺失:${c.role}`,suggestion:"请补充对应项目资料或调整模板角色绑定。"});for(let d of(a.summary.facts.professionalScopes||[]).slice(0,10))d.length>=4&&!G(c,d)&&b.push({level:"warning",message:`正文可能未覆盖资料中的专业/范围:${d}`,suggestion:"建议检查施工范围、施工方法或资源配置章节。"});let d=a.chapters.map(a=>a.title).join("、");if(/施工组织|施工方案|技术标|施工/iu.test(c+d))for(let a of["质量","安全","进度"])c.includes(a)||d.includes(a)||b.push({level:"warning",message:`施工类正式文件缺少“${a}”控制内容`,suggestion:`建议补充${a}管理目标、措施和责任体系。`});return b}({markdown:c2,chapters:c1,summary:ap,roles:av})),cx.push(...bL(c2,n));let c4=function(a,b){let{currentChars:c,estimatedPages:d}=bW(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),e}(cd,c1.map(a=>a.content).join("\n\n")),c5=(function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=by(b,a),e=c.min||c.target,f=c.max||c.target,g=[];return e&&d<e&&g.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${e} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),f&&d>f+4&&g.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${d} 页,目标不超过 ${f} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),g})(n.generationSettings||n.exportSettings,c2).filter(a=>!(cd.minPages&&/低于目标页数/u.test(a.message)));cx.push(...c5),cx.push(...c4),cx.push(...b5(c2,n));let c6=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bx(a))},{key:"project_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:"bill_drawing_precision",label:"清单/图纸精确参数已使用",passed:b.preciseFacts.length<20||a.every(a=>!/清单\/图纸精确参数使用不足|未体现工程量清单|未体现图纸/u.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&&/其他项目|项目编号|项目名称|事实一致性冲突/iu.test(a.message))}],e=a.filter(a=>"error"===a.level&&bx(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(cx,cu,c1),c7=c6.blockingIssues.length,c8=cY.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:c7>0?"failed":"success",message:`阻断 ${c7},问题 ${cx.length}`}:"export_ready"===a.type?{...a,status:c6.passed?"success":"fallback",message:c6.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出存在风险项,仍可导出,请人工复核"}:a);return{...cH,chapters:c1,validationIssues:cx,exportGate:c6,executionStages:c8,markdown:c2}}async function cb(a){let b=ai(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 d=e.resolve(a.projectRoot||(0,l.aY)());if(!d)throw Error("No knowledge base project found");let f=(0,l.Qh)(),g=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),h=bn(d,bk(b)),i=[];for(let a of c.queries){let b=await f.search(d,a,{scope:"project",limit:Math.max(g,h.size>0?30:g),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});i.push(...b.results.filter(a=>bm(d,a.filePath,h)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let j=ar(i.filter(a=>bm(d,a.filePath,h)),g),k=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",m=new Set(a.existingFacts??[]),n=c.requiredFacts.filter(a=>!m.has(a)&&!j.some(b=>aF(b,a))),o=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",k?`> 当前文档上下文摘要:${k.replace(/\s+/gu," ").slice(0,800)}`:"",j.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",j.length>0?"### 资料依据":"",...j.map(at),"",n.length>0?"### 待确认事项":"",...n.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:o,evidence:j,missingFacts:n}}},79181:(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}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>t,FV:()=>s,Mu:()=>u,NR:()=>v,XB:()=>q,dg:()=>r,dw:()=>w,ov:()=>A,tl:()=>z});var d=c(73024),e=c(48161),f=c(76760),g=c(79181);function h(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function i(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function j(a=[]){let b=new Set;return a.filter(a=>!(!a.roleId||b.has(a.roleId))&&(b.add(a.roleId),!0))}function k(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:i(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?function(a=[]){return[...new Set(a.filter(Boolean))]}(Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds:a.resourceId?[a.resourceId]:[]):[],executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function l(a){return{id:i(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:j(Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]),promptRoles:j(Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[])}}function m(){try{let a=h();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(k),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(k):[],configs:Array.isArray(b.configs)?b.configs.map(l):[]}}catch{return{roles:[],configs:[]}}}function n(a){d.writeFileSync(h(),JSON.stringify({roles:a.roles.map(k),configs:a.configs.map(l)},null,2),"utf-8")}function o(){return(0,g.V)().roles.map(a=>k({...a,builtIn:!0}))}function p(){return(0,g.V)().roleConfigs.map(a=>l({...a,builtIn:!0}))}function q(a){let b=o(),c=m().roles.filter(a=>!b.some(b=>b.id===a.id&&b.type===a.type)),d=[...b,...c];return a?d.filter(b=>b.type===a):d}function r(a){let b=k(a),c=m();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),n(c),b}function s(a,b){if(o().some(c=>c.id===b&&c.type===a))throw Error("Configured role cannot be deleted");let c=m();c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(a=>({...a,fileRoles:a.fileRoles.filter(a=>a.roleId!==b),promptRoles:a.promptRoles.filter(a=>a.roleId!==b)})),n(c)}function t(){let a=p(),b=m().configs.filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function u(a){return t().find(b=>b.id===a)}function v(a){let b={...l(a),builtIn:!1},c=m();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),n(c),b}function w(a){if(p().some(b=>b.id===a))throw Error("Configured role config cannot be deleted");let b=m();b.configs=b.configs.filter(b=>b.id!==a),n(b)}function x(a,b){let c=i(a);if(!b.has(c))return b.add(c),c;do c=i(`${a}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`);while(b.has(c));return b.add(c),c}function y(a=[],b){return a.map((a,c)=>({roleId:b.get(a.roleId)||a.roleId,order:Number.isFinite(a.order)?a.order:c}))}function z(a){let b=a?.roleIds?new Set(a.roleIds):null,c=a?.configIds?new Set(a.configIds):null,d=m();return{type:"customize-agent.documentRoles",version:1,exportedAt:new Date().toISOString(),roles:d.roles.filter(a=>!b||b.has(a.id)).map(k),configs:d.configs.filter(a=>!c||c.has(a.id)).map(l)}}function A(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=m(),f=new Set([...o().map(a=>a.id),...e.roles.map(a=>a.id)]),g=new Set([...p().map(a=>a.id),...e.configs.map(a=>a.id)]),h=new Map,i=[];for(let a of c){let b=k(a),c=x(b.id,f);h.set(b.id,c),i.push({...b,id:c,builtIn:!1})}let j=new Set([...o().map(a=>a.id),...e.roles.map(a=>a.id),...i.map(a=>a.id)]),q=d.map(a=>{let b=l(a),c=x(b.id,g);return l({...b,id:c,builtIn:!1,fileRoles:y(b.fileRoles,h).filter(a=>j.has(a.roleId)),promptRoles:y(b.promptRoles,h).filter(a=>j.has(a.roleId))})});return e.roles.push(...i),e.configs.push(...q),n(e),{importedRoles:i.length,importedConfigs:q.length}}},99842:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>n,PH:()=>u,dg:()=>l,h0:()=>p,i3:()=>o,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};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||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[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,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
111
+ ${c}`}(bm(dl,cN),dn))),dq=[...bs(c4,aX,bt,bf,cN),...c5];for(let a of((cM=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>aI(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>aI(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.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&&h.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let l=bX(e),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0})),n=bS(e);for(let b of a.gateRules){let a=b.level,o=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},p=o.target||b.target||"",q=o.value||b.value||p,r=o.min||Number(b.value)||1,s=d.find(a=>a.title===p),t="chapter"===o.subject&&s?s.content:e,u=q?function(a){try{return RegExp(a,"iu")}catch{return}}(q):void 0;"fact"===o.subject&&"exists"===o.operator&&p&&!j.has(p)&&h.push({level:a,message:bY(b,`缺少事实 ${p}`)}),"chapter"===o.subject&&"exists"===o.operator&&p&&!k.has(p)&&h.push({level:a,message:bY(b,`缺少章节 ${p}`)}),"file_role"===o.subject&&"exists"===o.operator&&p&&!f.some(a=>a.roleId===p)&&h.push({level:a,message:bY(b,`缺少文件角色 ${p}`)}),"prompt_role"===o.subject&&"exists"===o.operator&&p&&!g.some(a=>a.roleId===p)&&h.push({level:a,message:bY(b,`缺少提示词角色 ${p}`)}),"document"===o.subject&&"contains"===o.operator&&q&&!e.includes(q)&&h.push({level:a,message:bY(b,`全文必须包含 ${q}`)}),"document"===o.subject&&"not_contains"===o.operator&&q&&e.includes(q)&&h.push({level:a,message:bY(b,`出现禁用文本 ${q}`)}),"document"!==o.subject&&"chapter"!==o.subject||"regex_match"!==o.operator||!q||u&&u.test(t)||h.push({level:a,message:bY(b,`未匹配正则 ${q}`)}),("document"===o.subject||"chapter"===o.subject)&&"regex_not_match"===o.operator&&u?.test(t)&&h.push({level:a,message:bY(b,`匹配到禁止正则 ${q}`)}),"chapter"===o.subject&&"contains"===o.operator&&p&&q&&(!s||!s.content.includes(q))&&h.push({level:a,message:bY(b,`章节 ${p} 必须包含 ${q}`)}),"chapter"===o.subject&&"not_contains"===o.operator&&s?.content.includes(q)&&h.push({level:a,message:bY(b,`章节 ${p} 出现禁用文本 ${q}`)}),"chapter"===o.subject&&"min_length"===o.operator&&p&&(!s||s.content.length<r)&&h.push({level:a,message:bY(b,`章节 ${p} 低于 ${r} 字`)}),"table"===o.subject&&"min_count"===o.operator&&c.tables.length+l.length<r&&h.push({level:a,message:bY(b,`表格数量少于 ${r}`)}),"table"===o.subject&&"table_explanation_required"===o.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:bY(b,"存在缺少说明文字的表格")}),"image"===o.subject&&"min_count"===o.operator&&m.length<r&&h.push({level:a,message:bY(b,`图片数量少于 ${r}`)}),"page"===o.subject&&"min_count"===o.operator&&n<r&&h.push({level:a,message:bY(b,`预计页数 ${n} 少于 ${r}`)}),"page"===o.subject&&"max_count"===o.operator&&n>r&&h.push({level:a,message:bY(b,`预计页数 ${n} 超过 ${r}`)}),"image"===o.subject&&"image_caption_required"===o.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:bY(b,"存在缺少说明文字的图片")}),"source"===o.subject&&"all_have_source"===o.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:bY(b,"存在无来源事实")}),"source"===o.subject&&"min_count"===o.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<r&&h.push({level:a,message:bY(b,`来源数量少于 ${r}`)})}return h}(au,[...cM,...dq.map(a=>({level:"warning",message:a}))],cJ,dn,dp,aj,ah)).push(...function(a){let b=[],c=a.markdown||"";for(let d of a.spec.factFields.filter(a=>a.required))!c.includes(d.name)&&d.name.length>=3&&b.push({level:"warning",message:`后台优化建议:正文可能未显式覆盖“${d.name}”`,suggestion:"建议检查对应章节是否已自然表达该事实。"});let d=a.summary.facts.projectName;d&&"当前知识库项目"!==d&&!c.includes(d)&&b.push({level:"warning",message:"正文未明显体现项目名称",suggestion:"建议在工程概况或首页标题中体现当前项目名称。"});let e=a.summary.facts.tenderNo;for(let a of(e&&!c.includes(e)&&b.push({level:"info",message:"正文未体现招标/项目编号",suggestion:"如正式文件需要编号,请在工程概况中补充。"}),["知识库证据","文件角色","提示词角色","文档规范包","规范包","后台自动规范","后台优化建议","项目基础事实候选","资料未提供","未检索到"]))c.includes(a)&&b.push({level:"error",message:`正文包含后台流程话术:${a}`,suggestion:"请重新生成或在审查阶段删除后台流程描述。"});return b}({markdown:dp,spec:au,summary:ap})),cM.push(...function(a){let b=[];for(let c of[{label:"项目名称",keys:["项目名称","工程名称"]},{label:"招标编号",keys:["招标编号","项目编号"]},{label:"工期要求",keys:["工期","进度节点"]},{label:"质量要求",keys:["质量"]}]){let d=new Map;for(let b of function(a,b){return a.filter(a=>b.some(b=>a.key.includes(b)||a.fieldName?.includes(b))).map(a=>({value:String(a.value),source:a.sourceFile}))}(a.facts,c.keys)){let a=b.value.replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();a&&!(a.length<2)&&d.set(a,[...d.get(a)||[],b])}if(d.size>1){let a=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");b.push({level:"error",message:`事实一致性冲突:${c.label} 存在多个值:${a}`,suggestion:"请确认当前项目资料组,或在模板绑定中只绑定当前项目资料。"})}}let c=a.summary.facts.projectName;return c&&"当前知识库项目"!==c&&!a.markdown.includes(c)&&b.push({level:"error",message:`正文未包含当前项目名称:${c}`,suggestion:"请重新生成,确保标题或工程概况体现当前项目名称。"}),b}({markdown:dp,facts:cC,summary:ap})),cM.push(...function(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)&&G(a,e)&&c.push({level:"error",message:`正文疑似混入其他项目名称:${e}`,suggestion:"请检查项目资料组选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.tenderNos,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}(dp,ap)),cM.push(...function(a){let b=[],c=(0,p.V)().technicalDetailGate,d=`${a.template.name} ${a.template.category} ${a.template.outputTitle}`;if(!(c?.templateMatchers?.length?c.templateMatchers:["施工组织设计","施工方案","技术标.*施工","施工.*技术标"]).some(a=>RegExp(a,"iu").test(d)))return b;let e=a.finalMarkdown||a.chapters.map(a=>`${a.title}
112
+ ${a.content}`).join("\n\n"),f=Y(a.chapters.filter(a=>/施工方法|主要.*方法|工艺/u.test(a.title)).map(a=>a.content).join("\n")||e,I).length,g=[J,K,L,M,N].reduce((a,b)=>a+Y(e,b).length,0),h=Y(e,O).length,i=P.filter(a=>e.includes(a)).length,j=Q.filter(a=>e.includes(a)).length,k=(c?.genericPhrases?.length?c.genericPhrases:V).reduce((a,b)=>a+(e.match(RegExp(b,"gu"))?.length||0),0),l=a.assignments.flatMap(a=>a.facts),m=X(l.flatMap(a=>{var b;return X([...Y(b=`${a.parameter||""} ${a.specification||""} ${a.text}`,I),...Y(b,J),...Y(b,K),...Y(b,L),...Y(b,M),...Y(b,N),...Y(b,O)].map(a=>a.replace(/\s+/gu,"")))})).slice(0,120),n=m.filter(a=>e.replace(/\s+/gu,"").includes(a)),o=m.length?n.length/m.length:1,q=c?.minAssignedFactCountForBlocking??12;return l.length>=q&&o<(c?.minTechnicalFactUsageRate??.35)&&b.push({level:"error",message:`工程技术事实使用率不足:${Math.round(100*o)}%`,suggestion:"请把清单、图纸、设计说明中的材料规格、尺寸参数、试验验收和规范编号写入对应章节。"}),f<(c?.minMethodParameterCount??18)&&l.length>=q&&b.push({level:"error",message:`施工方法参数密度不足:仅识别 ${f} 个数字/规格参数`,suggestion:"主要施工方法应补充材料强度、厚度、尺寸、管径、试验时间、压力、偏差和数量等可核查参数。"}),g<(c?.minQuantitativeFactCount??20)&&l.length>=q&&b.push({level:"error",message:`工程量化事实密度不足:仅识别 ${g} 个工程量/工期/频次/资源/金额类数据`,suggestion:"请把工程数量、学校数量、工期节点、检查频次、人员驻场、机械设备、检测比例、响应时限和违约承诺写入对应章节。"}),h<(c?.minStandardCount??4)&&b.push({level:"warning",message:`规范标准引用不足:仅识别 ${h} 个规范编号`,suggestion:"请结合图纸、设计说明和招标文件补充 GB/JGJ/CJJ 等规范或验收标准。"}),i<(c?.minProcessActionCount??6)&&b.push({level:"warning",message:`工艺动作覆盖不足:仅识别 ${i} 类施工动作`,suggestion:"请补充基层处理、测量放线、样板、安装连接、隐蔽验收、调试和成品保护等工艺链。"}),j<(c?.minInspectionActionCount??6)&&b.push({level:"warning",message:`试验验收表达不足:仅识别 ${j} 类试验/验收动作`,suggestion:"请补充闭水、打压、通球、绝缘、联动、复试、允许偏差等验收控制。"}),k>Math.max(c?.maxGenericPhraseCountPer1800Chars??10,Math.floor(e.length/1800)*(c?.maxGenericPhraseCountPer1800Chars??10))&&b.push({level:"error",message:`空泛表达过多:识别 ${k} 处泛化表述`,suggestion:"请减少“按规范要求、满足设计要求、加强管理”等空话,并用具体参数、流程和验收动作替代。"}),b}({template:n,chapters:dn,assignments:aY,finalMarkdown:dp})),cM.push(...aa({assignments:aY,markdown:dp})),cM.push(...b0(dp)),cM.push(...bZ(dp)),cM.push(...b$(dp)),cM.push(...cm(dp)),cM.push(...b_(dn)),cM.push(...b1(dp,cJ)),cM.push(...b2(dp)),cM.push(...function(a,b){let c=ag(b).map(a=>a.content).join("\n\n");if(!c.trim())return[];let d=[];for(let b of[...c.matchAll(/(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?\s*([\s\S]{20,800}?)(?=\n\s*\n|$)/giu)].map(a=>(a[1]||"").replace(/\s+/gu," ").trim()).filter(a=>a.length>=20).slice(0,20)){let c=b.slice(0,80);if(c.length>=20&&a.replace(/\s+/gu," ").includes(c)){d.push({level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前项目资料生成的正式正文。"});break}}return d}(dp,ah)),c={template:n,chapters:dn,markdown:dp},(0,p.V)().qualityBenchmarks.filter(a=>(function(a,b){let c=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return b.templateMatchers.some(a=>RegExp(a,"iu").test(c))})(c.template,a)).map(a=>{let b=0,d=0,e=[];for(let f of a.rules){let a=Math.max(0,f.weight||0);d+=a,function(a,b,c){let d=c||b.map(a=>`${a.title}
113
+ ${a.content}`).join("\n\n"),e=function(a,b=[]){return b.filter(b=>b&&a.includes(b)).length}(d,a.keywords),f=function(a,b=[]){return b.filter(b=>a.some(a=>RegExp(b,"iu").test(a.title))).length}(b,a.titlePatterns),g=[a.keywords?.length?e/a.keywords.length:void 0,a.titlePatterns?.length?f/a.titlePatterns.length:void 0,a.tableRequired?+!!/\n\s*\|[^\n]+\|\s*\n\s*\|\s*[-:| ]+\|/u.test(d):void 0].filter(a=>"number"==typeof a),h=g.length?g.reduce((a,b)=>a+b,0)/g.length:1,i=null==a.minRatio||h>=a.minRatio,j=null==a.minCount||e+f>=a.minCount;return{passed:i&&j,ratio:h,keywordCount:e,titleCount:f}}(f,c.chapters,c.markdown).passed?b+=a:e.push({level:f.level||"warning",message:`质量基准未达标:${f.name}`,suggestion:f.suggestion||"请补充专业细节、表格或对应章节内容。"})}let f=d>0?Math.round(b/d*100):100,g=f<a.blockBelowScore||e.some(a=>"error"===a.level);return{benchmarkId:a.id,benchmarkName:a.name,score:f,pass:f>=a.passScore,blocked:g,issues:g?[{level:"error",message:`文档质量基准评分未达标:${a.name} ${f}分`,suggestion:"请重新生成或补充模板、资料、章节内容后再导出。"},...e]:e}})))cM.push(...a.issues);cM.push(...function(a){let b=[],c=a.markdown;for(let c of a.roles.filter(a=>a.required))c.satisfied?c.weak&&b.push({level:"warning",message:`工程专项资料角色证据较弱:${c.role}`,suggestion:"建议补充更多同类资料以提高正式文件可靠性。"}):b.push({level:"error",message:`工程专项资料角色缺失:${c.role}`,suggestion:"请补充对应项目资料或调整模板角色绑定。"});for(let d of(a.summary.facts.professionalScopes||[]).slice(0,10))d.length>=4&&!G(c,d)&&b.push({level:"warning",message:`正文可能未覆盖资料中的专业/范围:${d}`,suggestion:"建议检查施工范围、施工方法或资源配置章节。"});let d=a.chapters.map(a=>a.title).join("、");if(/施工组织|施工方案|技术标|施工/iu.test(c+d))for(let a of["质量","安全","进度"])c.includes(a)||d.includes(a)||b.push({level:"warning",message:`施工类正式文件缺少“${a}”控制内容`,suggestion:`建议补充${a}管理目标、措施和责任体系。`});return b}({markdown:dp,chapters:dn,summary:ap,roles:av})),cM.push(...b3(dp,n));let dr=function(a,b){let{currentChars:c,estimatedPages:d}=ce(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),e}(bM,dn.map(a=>a.content).join("\n\n")),ds=(function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=bS(b,a),e=c.min||c.target,f=c.max||c.target,g=[];return e&&d<e&&g.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${e} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),f&&d>f+4&&g.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${d} 页,目标不超过 ${f} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),g})(n.generationSettings||n.exportSettings,dp).filter(a=>!(bM.minPages&&/低于目标页数/u.test(a.message)));cM.push(...ds),cM.push(...dr),cM.push(...cr(dp,n));let dt=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bP(a))},{key:"project_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:"bill_drawing_precision",label:"清单/图纸精确参数已使用",passed:b.preciseFacts.length<20||a.every(a=>!/清单\/图纸精确参数使用不足|未体现工程量清单|未体现图纸/u.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&&/其他项目|项目编号|项目名称|事实一致性冲突/iu.test(a.message))}],e=a.filter(a=>"error"===a.level&&bP(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(cM,cJ,dn),du=dt.blockingIssues.length,dv=bR(cM);b6.quality.blockingCount+=dv.blocking,b6.quality.importantCount+=dv.important,b6.quality.minorCount+=dv.minor;let dw=di.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:du>0?"failed":"success",message:`阻断 ${du},问题 ${cM.length}`}:"export_ready"===a.type?{...a,status:dt.passed?"success":"fallback",message:dt.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出存在风险项,仍可导出,请人工复核"}:a);return b6.llm.currentLimit=aQ,dw.push(bj({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${b6.llm.calls} 次,失败 ${b6.llm.failures} 次,缓存命中 ${b6.cache.chapterHits} 章/${b6.cache.sectionHits} 小节,写入 ${b6.cache.chapterWrites} 章/${b6.cache.sectionWrites} 小节,噪声过滤 ${b6.evidence.filteredNoise} 条,质量问题 阻断${b6.quality.blockingCount}/重要${b6.quality.importantCount}/轻微${b6.quality.minorCount},自动限流调整 ${b6.llm.limitAdjustments} 次`},{subtitle:"后台诊断"})),{...{...cY,chapters:dn,validationIssues:cM,exportGate:dt,executionStages:dw,partialChapters:dn.map(a=>({id:a.id,title:a.title,chars:bT(a.content),status:"completed",updatedAt:Date.now()})),reviewMetadata:{chapterSummaries:c$.summaries,globalIssues:c_.issues,diagnostics:b6}},markdown:dp}}async function cx(a){let b=ai(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 d=e.resolve(a.projectRoot||(0,l.aY)());if(!d)throw Error("No knowledge base project found");let f=(0,l.Qh)(),g=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),h=bE(d,bB(b)),i=[];for(let a of c.queries){let b=await f.search(d,a,{scope:"project",limit:Math.max(g,h.size>0?30:g),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});i.push(...b.results.filter(a=>bD(d,a.filePath,h)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let j=as(i.filter(a=>bD(d,a.filePath,h)),g),k=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",m=new Set(a.existingFacts??[]),n=c.requiredFacts.filter(a=>!m.has(a)&&!j.some(b=>aG(b,a))),o=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",k?`> 当前文档上下文摘要:${k.replace(/\s+/gu," ").slice(0,800)}`:"",j.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",j.length>0?"### 资料依据":"",...j.map(au),"",n.length>0?"### 待确认事项":"",...n.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:o,evidence:j,missingFacts:n}}},79181:(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}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>t,FV:()=>s,Mu:()=>u,NR:()=>v,XB:()=>q,dg:()=>r,dw:()=>w,ov:()=>A,tl:()=>z});var d=c(73024),e=c(48161),f=c(76760),g=c(79181);function h(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function i(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function j(a=[]){let b=new Set;return a.filter(a=>!(!a.roleId||b.has(a.roleId))&&(b.add(a.roleId),!0))}function k(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:i(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?function(a=[]){return[...new Set(a.filter(Boolean))]}(Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds:a.resourceId?[a.resourceId]:[]):[],executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function l(a){return{id:i(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:j(Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]),promptRoles:j(Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[])}}function m(){try{let a=h();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(k),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(k):[],configs:Array.isArray(b.configs)?b.configs.map(l):[]}}catch{return{roles:[],configs:[]}}}function n(a){d.writeFileSync(h(),JSON.stringify({roles:a.roles.map(k),configs:a.configs.map(l)},null,2),"utf-8")}function o(){return(0,g.V)().roles.map(a=>k({...a,builtIn:!0}))}function p(){return(0,g.V)().roleConfigs.map(a=>l({...a,builtIn:!0}))}function q(a){let b=o(),c=m().roles.filter(a=>!b.some(b=>b.id===a.id&&b.type===a.type)),d=[...b,...c];return a?d.filter(b=>b.type===a):d}function r(a){let b=k(a),c=m();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),n(c),b}function s(a,b){if(o().some(c=>c.id===b&&c.type===a))throw Error("Configured role cannot be deleted");let c=m();c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(a=>({...a,fileRoles:a.fileRoles.filter(a=>a.roleId!==b),promptRoles:a.promptRoles.filter(a=>a.roleId!==b)})),n(c)}function t(){let a=p(),b=m().configs.filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function u(a){return t().find(b=>b.id===a)}function v(a){let b={...l(a),builtIn:!1},c=m();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),n(c),b}function w(a){if(p().some(b=>b.id===a))throw Error("Configured role config cannot be deleted");let b=m();b.configs=b.configs.filter(b=>b.id!==a),n(b)}function x(a,b){let c=i(a);if(!b.has(c))return b.add(c),c;do c=i(`${a}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`);while(b.has(c));return b.add(c),c}function y(a=[],b){return a.map((a,c)=>({roleId:b.get(a.roleId)||a.roleId,order:Number.isFinite(a.order)?a.order:c}))}function z(a){let b=a?.roleIds?new Set(a.roleIds):null,c=a?.configIds?new Set(a.configIds):null,d=m();return{type:"customize-agent.documentRoles",version:1,exportedAt:new Date().toISOString(),roles:d.roles.filter(a=>!b||b.has(a.id)).map(k),configs:d.configs.filter(a=>!c||c.has(a.id)).map(l)}}function A(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=m(),f=new Set([...o().map(a=>a.id),...e.roles.map(a=>a.id)]),g=new Set([...p().map(a=>a.id),...e.configs.map(a=>a.id)]),h=new Map,i=[];for(let a of c){let b=k(a),c=x(b.id,f);h.set(b.id,c),i.push({...b,id:c,builtIn:!1})}let j=new Set([...o().map(a=>a.id),...e.roles.map(a=>a.id),...i.map(a=>a.id)]),q=d.map(a=>{let b=l(a),c=x(b.id,g);return l({...b,id:c,builtIn:!1,fileRoles:y(b.fileRoles,h).filter(a=>j.has(a.roleId)),promptRoles:y(b.promptRoles,h).filter(a=>j.has(a.roleId))})});return e.roles.push(...i),e.configs.push(...q),n(e),{importedRoles:i.length,importedConfigs:q.length}}},99842:(a,b,c)=>{c.d(b,{E:()=>s,Hh:()=>n,PH:()=>t,dg:()=>l,h0:()=>o,jk:()=>p,p:()=>r,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};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||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[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,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
96
114
  SELECT * FROM memories
97
115
  WHERE context LIKE ? AND (${h})
98
116
  ORDER BY access_count DESC, updated_at DESC
@@ -102,18 +120,4 @@ ${a.content}`).join("\n\n"),e=function(a,b=[]){return b.filter(b=>b&&a.includes(
102
120
  WHERE ${h}
103
121
  ORDER BY access_count DESC, updated_at DESC
104
122
  LIMIT ?
105
- `).all(...i,b)).map(k)}finally{d.close()}}function o(a,b,c=""){let d=b.replace(/\s+/gu," ").trim();if(!d)return null;let i=f.join(g.homedir(),".customize-agent","memory.db");h.mkdirSync(f.dirname(i),{recursive:!0});let j=new(e())(i);try{j.exec(`
106
- CREATE TABLE IF NOT EXISTS memories (
107
- id TEXT PRIMARY KEY,
108
- type TEXT NOT NULL CHECK(type IN ('project_fact', 'user_preference', 'feedback', 'pattern')),
109
- content TEXT NOT NULL,
110
- context TEXT NOT NULL DEFAULT '',
111
- access_count INTEGER NOT NULL DEFAULT 0,
112
- created_at TEXT NOT NULL DEFAULT (datetime('now')),
113
- updated_at TEXT NOT NULL DEFAULT (datetime('now'))
114
- );
115
- `);let b=function(a){let b=0x811c9dc5;for(let c=0;c<a.length;c++)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193);return(b>>>0).toString(16).padStart(8,"0")}(`${c}
116
- ${d.slice(0,200)}`);return j.prepare(`
117
- INSERT INTO memories (id, type, content, context) VALUES (?, ?, ?, ?)
118
- ON CONFLICT(id) DO UPDATE SET access_count = access_count + 1, updated_at = datetime('now'), context = ?
119
- `).run(b,a,d,c,c),b}finally{j.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()}}}};
123
+ `).all(...i,b)).map(k)}finally{d.close()}}function o(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 p(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 q(a){return"long_term"===a?"access_count >= 2":"access_count < 2"}function r(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 ${q(a)}`).get();return{count:Number(c.count??0),totalBytes:Number(c.totalBytes??0)}}finally{b.close()}}function s(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 ${q(a)}`).all();return c.transaction(()=>{c.prepare(`DELETE FROM memories WHERE ${q(a)}`).run()})(),b.length}finally{c.close()}}function t(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 ${q(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()}}}};