@customize-agent/server 4.0.53 → 4.0.54

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 (53) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +20 -20
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/6697.js +11 -11
  5. package/.next/server/middleware-build-manifest.js +1 -1
  6. package/.next/server/pages/404.html +1 -1
  7. package/.next/server/pages/500.html +1 -1
  8. package/.next/server/pages/api/assets/generated/preview.js +1 -1
  9. package/.next/server/pages/api/assets/generated.js +1 -1
  10. package/.next/server/pages/api/documents/export.js +1 -1
  11. package/.next/server/pages/api/documents/generate.js +1 -1
  12. package/.next/server/pages/api/documents/generated/[id].js +1 -1
  13. package/.next/server/pages/api/documents/generated.js +1 -1
  14. package/.next/server/pages/asset-library.html +1 -1
  15. package/.next/server/pages/context/long-term.html +1 -1
  16. package/.next/server/pages/context/short-term.html +1 -1
  17. package/.next/server/pages/document-roles.html +1 -1
  18. package/.next/server/pages/documents.html +1 -1
  19. package/.next/server/pages/guide.html +1 -1
  20. package/.next/server/pages/index.html +1 -1
  21. package/.next/server/pages/knowledge/file-detail.html +1 -1
  22. package/.next/server/pages/knowledge/files.html +1 -1
  23. package/.next/server/pages/knowledge/manage.html +1 -1
  24. package/.next/server/pages/knowledge/search.html +1 -1
  25. package/.next/server/pages/knowledge.html +1 -1
  26. package/.next/server/pages/models.html +1 -1
  27. package/.next/server/pages/overview.html +1 -1
  28. package/.next/server/pages/prompt.html +1 -1
  29. package/.next/server/pages/settings.html +1 -1
  30. package/.next/server/pages/system/logs.html +1 -1
  31. package/.next/server/pages-manifest.json +25 -25
  32. package/.next/static/{7BxPmRQXi-2VWFugrlQk8 → Gjm7sUmlMDFP1formv8BS}/_buildManifest.js +1 -1
  33. package/.next/static/chunks/{317-18aac52df5551e76.js → 317-0cc5d3d1f0f660e8.js} +1 -1
  34. package/.next/static/chunks/375-f731e5ec66ab942c.js +1 -0
  35. package/.next/static/chunks/496-ceb2d8197d6335cf.js +1 -0
  36. package/.next/static/chunks/694-b6ab4967c35bbcee.js +1 -0
  37. package/.next/static/chunks/788-db05269178a28c20.js +1 -0
  38. package/.next/static/chunks/795-262a7ef599d655f4.js +1 -0
  39. package/.next/static/chunks/940-364bc292676ba191.js +1 -0
  40. package/.next/static/chunks/pages/document-roles-00219c0a0871daec.js +1 -0
  41. package/.next/static/chunks/pages/documents-930fccb8c2804b16.js +1 -0
  42. package/.next/static/chunks/pages/guide-4f27a34912654b0b.js +1 -0
  43. package/package.json +3 -3
  44. package/.next/static/chunks/375-4a1c73eb22d653d2.js +0 -1
  45. package/.next/static/chunks/496-4fb9a063790e65ff.js +0 -1
  46. package/.next/static/chunks/694-2d545cfbb9779f2c.js +0 -1
  47. package/.next/static/chunks/788-7f7359a830e3f4fd.js +0 -1
  48. package/.next/static/chunks/795-d8fb7a0420512701.js +0 -1
  49. package/.next/static/chunks/940-7cb66111eee2f9fb.js +0 -1
  50. package/.next/static/chunks/pages/document-roles-fd02980db151650c.js +0 -1
  51. package/.next/static/chunks/pages/documents-d7ea38fc2e590069.js +0 -1
  52. package/.next/static/chunks/pages/guide-0a3cdfa79c037307.js +0 -1
  53. /package/.next/static/{7BxPmRQXi-2VWFugrlQk8 → Gjm7sUmlMDFP1formv8BS}/_ssgManifest.js +0 -0
@@ -1,7 +1,7 @@
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:()=>bW,jG:()=>ah,R1:()=>bX,Bh:()=>aj,xm:()=>ak});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(96770),j=c(23328),k=c(99842),l=c(2323),m=c(89952),n=c(77598),o=c(79181);let p=[{id:"bid",label:"投标文件",patterns:[/投标|标书|技术标|商务标/iu],output:["投标文件"]},{id:"construction",label:"施工组织设计",patterns:[/施工组织|施工方案|施工部署|施工方法/iu],output:["施工组织设计"]},{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案/iu],output:["实施方案"]}],q=[{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:["背景依据","分析结论","风险建议"]}],r=[{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:["重点难点约束","风险建议"]}],s=[{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 t(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 u(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function v(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function w(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function x(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,o.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 y=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],z=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function A(a){return[...new Set(a.filter(Boolean))]}function B(a){return A(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 C(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function D(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function E(a){let b=D(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function F(a,b){let c=(0,j.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(D)),e=c.filter(a=>d.has(D(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>E(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=E(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=>E(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>E(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>E(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 z)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[D(a.filePath),a.roles]));for(let a of f){let b=D(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(t(a,s));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),k=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),l=function(a,b){let c=B(a),d=B(b),e=A(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=A(a.map(a=>E(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:A([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:A([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:A([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:A([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=y.filter(a=>g[a].length>0),o=y.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:l.fingerprint,contaminationCandidates:l.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:i,tenderNo:k,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}${k?`,招标/项目编号:${k}`:""}。`,scopeSummary:`施工范围资料:${C(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${C(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${C(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${C(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${C(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:y,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:y.length?n.length/y.length:1}}}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,o.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,j.aY)()){let c=ai(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,m.XB)("prompt"),g=(0,m.XB)("file"),h=a5(c),i=a6(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let k=ba(c),l=bb(c);0===k.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=e.resolve(b),o=await (0,j.Qh)().getProject(n);c.builtIn&&await o.incrementalIndex();let p=(0,j.Yy)(n),q=F(n,{boundFilePaths:l.map(a=>a.filePath),boundFileRoles:a8(l)}),r=l.length>0?l:a9(c,q),s=r.length>0?r:l;0===s.length&&d.push({level:"error",message:"未从当前项目资料中解析到可用文件角色,请先确认知识库已上传并索引项目资料,或在模板高级固定绑定资料中手动指定文件"});let t=new Map(p.map(a=>[a.relativePath,a])),u=s.map(a=>{let b=g.find(b=>b.id===a.roleId),c=t.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)}}),v=ag(k);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:u,promptDiagnostics:k.map(a=>{let b=f.find(b=>b.id===a.roleId),c=v.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,o.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=`${a.filePath}:${a.content.slice(0,100)}`;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}
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:()=>bW,jG:()=>ah,R1:()=>bX,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(96770),k=c(23328),l=c(99842),m=c(2323),n=c(89952),o=c(79181);let p=[{id:"bid",label:"投标文件",patterns:[/投标|标书|技术标|商务标/iu],output:["投标文件"]},{id:"construction",label:"施工组织设计",patterns:[/施工组织|施工方案|施工部署|施工方法/iu],output:["施工组织设计"]},{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案/iu],output:["实施方案"]}],q=[{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:["背景依据","分析结论","风险建议"]}],r=[{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:["重点难点约束","风险建议"]}],s=[{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 t(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 u(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function v(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function w(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function x(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,o.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 y=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],z=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function A(a){return[...new Set(a.filter(Boolean))]}function B(a){return A(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 C(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function D(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function E(a){let b=D(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function F(a,b){let c=(0,k.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(D)),e=c.filter(a=>d.has(D(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>E(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=E(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=>E(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>E(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>E(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 z)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[D(a.filePath),a.roles]));for(let a of f){let b=D(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(t(a,s));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),l=function(a,b){let c=B(a),d=B(b),e=A(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=A(a.map(a=>E(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:A([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:A([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:A([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:A([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=y.filter(a=>g[a].length>0),o=y.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:l.fingerprint,contaminationCandidates:l.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:`施工范围资料:${C(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${C(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${C(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${C(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${C(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:y,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:y.length?n.length/y.length:1}}}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,o.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,k.aY)()){let c=ai(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,n.XB)("prompt"),g=(0,n.XB)("file"),h=a5(c),i=a6(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let j=ba(c),l=bb(c);0===j.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let m=e.resolve(b),o=await (0,k.Qh)().getProject(m);c.builtIn&&await o.incrementalIndex();let p=(0,k.Yy)(m),q=F(m,{boundFilePaths:l.map(a=>a.filePath),boundFileRoles:a8(l)}),r=l.length>0?l:a9(c,q),s=r.length>0?r:l;0===s.length&&d.push({level:"error",message:"未从当前项目资料中解析到可用文件角色,请先确认知识库已上传并索引项目资料,或在模板高级固定绑定资料中手动指定文件"});let t=new Map(p.map(a=>[a.relativePath,a])),u=s.map(a=>{let b=g.find(b=>b.id===a.roleId),c=t.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)}}),v=ag(j);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:u,promptDiagnostics:j.map(a=>{let b=f.find(b=>b.id===a.roleId),c=v.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,o.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||""}:${a.source||""}:${(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
5
  ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>aE(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)}
6
6
  类型:${a.processingType||"reference"}
7
7
  章节/片段:${a.sectionTitle?.replace(ao,"")||"资料片段"}
@@ -29,10 +29,10 @@ ${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c
29
29
  ${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
30
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*bp(a.chapter.content)))),temperature:.2});return b&&!(b.length<.75*a.chapter.content.length)&&b.includes(a.chapter.title.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").slice(0,6))?a0(aY(b,a.forbidDrawingImages)):a.chapter.content}async function a4(a){if(0===a.issues.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let b=0,c=[];for(let d of a.chapters){let e=function(a,b){let c=new Set(a.sections||[]),d=`${a.title}
31
31
  ${a.sections?.join("\n")||""}
32
- ${a.content.slice(0,4e3)}`;return b.filter(b=>b.includes(a.title)||[...c].some(a=>b.includes(a))||/本节|本章将|以下从|以下内容|图片|三级小节|目录|表格|量化|数值|单位|事实|占位/u.test(b)&&/本节|本章将|以下从|以下内容|!\[|####|\*\*|\||按设计要求|按规范要求|m\s*[²2]|mm2|cm2|km2/u.test(d))}(d,a.issues);if(0===e.length){c.push(d);continue}let f=await a3({template:a.template,chapter:d,issues:e.slice(0,8),promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages});f!==d.content&&(b+=1),c.push({...d,content:f})}let d=b>0?`已完成 ${b} 个章节的局部问题修复,未进行全文重写`:`已完成质量检查,未定位到可安全局部修复的章节问题:${a.issues.slice(0,5).join(";")}`;return{markdown:a.markdown,chapters:c,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:d}}}function a5(a){if(a.projectRoleConfigId)return a.projectRoleConfigId;let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;if(function(a){let b=(0,o.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 a6(a){let b=a5(a);return b?(0,m.Mu)(b):void 0}function a7(a){return/tender|response|requirements|招标|评审|实质/u.test(a)?["tender_document","technical_specification","schedule_quality_safety"]:/boq|清单|scope|工程量/u.test(a)?["bill_of_quantities","construction_scope","control_price"]:/drawing|drawings|图纸|design/u.test(a)?["drawings"]:/schedule|quality|safety|工期|质量|安全/u.test(a)?["schedule_quality_safety","technical_specification"]:/risk|constraints|现场|重点|难点/u.test(a)?["risk_constraints","addendum","tender_document"]:/material|equipment|brand|材料|设备|品牌/u.test(a)?["brand_recommendation","bill_of_quantities","technical_specification"]:/enterprise|reference|经验|体系/u.test(a)?["project_overview","technical_specification"]:["project_overview"]}function a8(a){let b=new Map;for(let c of a)b.set(c.filePath,[...new Set([...b.get(c.filePath)||[],...a7(c.roleId)])]);return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function a9(a,b){let c=a6(a);if(!c)return[];let d=[];for(let a of[...c.fileRoles].sort((a,b)=>a.order-b.order))for(let c of a7(a.roleId).flatMap(a=>b.materialInventory[a]||[]).slice(0,20))d.push({roleId:a.roleId,filePath:c.filePath});let e=new Set;return d.filter(a=>{let b=`${a.roleId}
33
- ${a.filePath}`;return!e.has(b)&&(e.add(b),!0)})}function ba(a){let b=a6(a);if(b){let a=(0,m.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 0===c.size||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,b){let c=new Map((0,m.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}
34
- ${a.content}`).join("\n\n")}function bg(a,b){let c=(0,i.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function bh(){let a=(0,l.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 bi(a,b,c=!1,d={}){try{let e=bh();if(!e)return;let{model:f,provider:g}=e,i=(0,h.createProvider)(bg(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint});return(await i.chat([{role:"system",content:c?`${a}
35
- 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal})).content.trim()}catch{return}}async function bj(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 bk(a,b){let c=await bi(a,b,!0);if(c)try{let a=c.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function bl(a,b){let c=bh();if(!c?.provider.capabilities?.fileUnderstanding&&!c?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};let f=(0,h.createProvider)(bg(c.model.provider,c.provider),{baseUrl:c.provider.baseUrl,apiKey:c.provider.apiKey,modelName:c.model.name,directEndpoint:c.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=[...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===g.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{let a=(await f.understandFiles(g,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200})).content.trim();return{notes:a?[a]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:a?"success":"fallback",message:a?`已理解 ${g.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bm(a,b,c,d){let e=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],f=a.slice(0,24).map(a=>`文件:${a.filePath}
32
+ ${a.content.slice(0,4e3)}`;return b.filter(b=>b.includes(a.title)||[...c].some(a=>b.includes(a))||/本节|本章将|以下从|以下内容|图片|三级小节|目录|表格|量化|数值|单位|事实|占位/u.test(b)&&/本节|本章将|以下从|以下内容|!\[|####|\*\*|\||按设计要求|按规范要求|m\s*[²2]|mm2|cm2|km2/u.test(d))}(d,a.issues);if(0===e.length){c.push(d);continue}let f=await a3({template:a.template,chapter:d,issues:e.slice(0,8),promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages});f!==d.content&&(b+=1),c.push({...d,content:f})}let d=b>0?`已完成 ${b} 个章节的局部问题修复,未进行全文重写`:`已完成质量检查,未定位到可安全局部修复的章节问题:${a.issues.slice(0,5).join(";")}`;return{markdown:a.markdown,chapters:c,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:d}}}function a5(a){if(a.projectRoleConfigId)return a.projectRoleConfigId;let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;if(function(a){let b=(0,o.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 a6(a){let b=a5(a);return b?(0,n.Mu)(b):void 0}function a7(a){return/tender|response|requirements|招标|评审|实质/u.test(a)?["tender_document","technical_specification","schedule_quality_safety"]:/boq|清单|scope|工程量/u.test(a)?["bill_of_quantities","construction_scope","control_price"]:/drawing|drawings|图纸|design/u.test(a)?["drawings"]:/schedule|quality|safety|工期|质量|安全/u.test(a)?["schedule_quality_safety","technical_specification"]:/risk|constraints|现场|重点|难点/u.test(a)?["risk_constraints","addendum","tender_document"]:/material|equipment|brand|材料|设备|品牌/u.test(a)?["brand_recommendation","bill_of_quantities","technical_specification"]:/enterprise|reference|经验|体系/u.test(a)?["project_overview","technical_specification"]:["project_overview"]}function a8(a){let b=new Map;for(let c of a)b.set(c.filePath,[...new Set([...b.get(c.filePath)||[],...a7(c.roleId)])]);return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function a9(a,b){let c=a6(a);if(!c)return[];let d=[];for(let a of[...c.fileRoles].sort((a,b)=>a.order-b.order))for(let c of a7(a.roleId).flatMap(a=>b.materialInventory[a]||[]).slice(0,20))d.push({roleId:a.roleId,filePath:c.filePath});let e=new Set;return d.filter(a=>{let b=`${a.roleId}
33
+ ${a.filePath}`;return!e.has(b)&&(e.add(b),!0)})}function ba(a){let b=a6(a);if(b){let a=(0,n.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 0===c.size||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,b){let c=new Map((0,n.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}
34
+ ${a.content}`).join("\n\n")}function bg(a,b){let c=(0,j.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function bh(){let a=(0,m.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 bi(a,b,c=!1,d={}){try{let e=bh();if(!e)return;let{model:f,provider:g}=e,h=(0,i.createProvider)(bg(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint});return(await h.chat([{role:"system",content:c?`${a}
35
+ 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal})).content.trim()}catch{return}}async function bj(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 bk(a,b){let c=await bi(a,b,!0);if(c)try{let a=c.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function bl(a,b){let c=bh();if(!c?.provider.capabilities?.fileUnderstanding&&!c?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};let f=(0,i.createProvider)(bg(c.model.provider,c.provider),{baseUrl:c.provider.baseUrl,apiKey:c.provider.apiKey,modelName:c.model.name,directEndpoint:c.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=[...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===g.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{let a=(await f.understandFiles(g,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200})).content.trim();return{notes:a?[a]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:a?"success":"fallback",message:a?`已理解 ${g.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function bm(a,b,c,d){let e=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],f=a.slice(0,24).map(a=>`文件:${a.filePath}
36
36
  角色:${a.roleId||""}
37
37
  处理:${a.processingType||""}
38
38
  内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!f.trim())return{facts:[],stages:e};let g=aF(c,d),h=g.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),i=await bk(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
@@ -56,17 +56,17 @@ ${d}`,a.forbidDrawingImages));return!function(a,b,c,d){let e=bp(a),f=bp(b),g=ax(
56
56
  约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",d=await bi(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、资料事实内化使用、参数数字准确性、冲突事实、解析器内部对象名、表格呈现、表达专业性、导出友好性、系统提示泄露。","只返回简短审查结论和问题清单;不得返回优化后的完整 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆:
57
57
  ${a.projectContext}`:"",c,"知识库证据摘要:",b,"待审查初稿:",a.markdown.slice(0,24e3),"请只返回审查问题清单,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:2e3,temperature:0});return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:d?"success":"skipped",message:d?`已完成非重写式质量审查:${d.slice(0,180)}`:"无可用模型或审查结果不可用,保留生成初稿"}}}function bL(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>ax(a[1]||"")).filter(a=>a.length>=2&&a.length<=80))].slice(0,12)}function bM(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=ax(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function bN(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=ax(b);return d+=1,`#### ${c}.${d} ${f}`}let f=bM(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function bO(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(`^${bS(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${ax(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}let g=bM(a);g&&b.push({level:"warning",message:`独立加粗行疑似未编号三级小节:${g}`,suggestion:"请改为“#### 章号.节号.序号 标题”,不要用无编号加粗行表示三级小节。"})}return b.slice(0,20)}function bP(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[aA(b,a.title),"",...c.flatMap((a,c)=>[` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`,""])]})].join("\n")}function bQ(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 bR(a,b){let c=bQ(a);b.forEach((a,b)=>{let d=ax(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${bS(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${aA(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} ${ax(c[3]||"")}`;let d=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(b);return e>=0&&d?(f+=1,`### ${e+1}.${f} ${ax(d[3]||"")}`):a}).join("\n")}function bS(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function bT(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=ax(b),d=RegExp(`(^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${bS(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+(?:${bS(a)}|(?:\\d+(?:\\.\\d+)+\\s+)?${bS(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 bU(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${aA(b,a.title)}`,d=a0(a.content);return/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
58
58
 
59
- ${d}`})(a,b)).filter(Boolean).join("\n\n"),c=bP(a.chapters);return a0(['<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 bV(a){if(a?.aborted)throw Error("用户中止")}async function bW(a){var b,c;bV(a.signal);let g=ai(a.templateId);if(!g)throw Error("Document template not found");let h=e.resolve(a.projectRoot||(0,j.aY)());if(!h)throw Error("No knowledge base project found");let i=g,l=(0,j.Qh)(),y=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),z=a5(i)||"none",A=(0,m.Mu)(z)?.name||z,B=[aV({type:"role_binding",roleId:z,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${i.name}`},{subtitle:A,roleName:A,order:0})];a.onProgress?.([...B]);let C=ba(i),D=bb(i);B.push(aV({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与项目资料摘要"},{subtitle:"生成准备",order:B.length})),a.onProgress?.([...B]);let E=function(a,b=""){let c=function(a,b=""){return n.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}`,p)||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 t(c,q))d.add(a);let e=x(a,b);if("施工组织设计"===b||e.length>0){for(let a of t("招标 施工 工程 清单 图纸 质量 工期 安全 文明 材料 重点 难点",q))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 w(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of v(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),h=function(a=""){let b=new Set;for(let c of w(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of v(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),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),j=x(a,d),k=Math.max(0,...j.map(a=>a.minTables||0)),l=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,k)||void 0,m=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 t(c,r))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(u),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),o=f.filter(a=>!m.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${u(a)}`,title:a,required:!0,order:m.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),s=[{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:"知识库证据"}},...j.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${u(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...j.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${u(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...k?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${k} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:k}}]:[],...f.map(a=>({id:`user-required-chapter-${u(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-${u(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...h.map(a=>({id:`user-forbidden-text-${u(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...l?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${l}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],y=[...m,...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:u(a),name:a,type:"auto",required:j.some(b=>b.requiredFacts.includes(a))||!/材料|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:y,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:s,builtIn:!0}}}(i,a.requirement||""),ab=E.spec,ac=F(h,{requirement:a.requirement,boundFilePaths:D.map(a=>a.filePath),boundFileRoles:a8(D)}),ad=D.length>0?D:a9(i,ac),ae=ad.length>0?ad:D,af=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(t([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),s));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?"必需资料角色缺失":"可选资料角色缺失"}})}(i,ac),ah=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:i,spec:ab,summary:ac,resolvedRoles:af});if(!ah.ready)throw Error(`生成准备度不足:${ah.blockingIssues.join(";")}`);let aj=[["## 后台项目资料摘要",ac.extractedSections.projectOverview,`项目指纹:项目名候选 ${ac.fingerprint.projectNames.join("、")||"无"};编号 ${ac.fingerprint.tenderNos.join("、")||"无"};资料组 ${ac.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*ac.fingerprint.confidence)}%。`,`内容级事实候选:建设/招标单位 ${ac.facts.ownerNames?.join("、")||"无"};地点 ${ac.facts.locationNames?.join("、")||"无"};工期 ${ac.facts.scheduleValues?.join("、")||"无"};质量 ${ac.facts.qualityTargets?.join("、")||"无"}。`,ac.extractedSections.scopeSummary,ac.extractedSections.boqSummary,ac.extractedSections.drawingSummary,ac.extractedSections.scheduleQualitySafetySummary,ac.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*ac.coverage.materialCompletenessRate)}%`].join("\n"),(b=E.sourceHash,`## 后台内容优化建议
59
+ ${d}`})(a,b)).filter(Boolean).join("\n\n"),c=bP(a.chapters);return a0(['<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 bV(a){if(a?.aborted)throw Error("用户中止")}async function bW(a){var b,c;bV(a.signal);let g=ai(a.templateId);if(!g)throw Error("Document template not found");let i=e.resolve(a.projectRoot||(0,k.aY)());if(!i)throw Error("No knowledge base project found");let j=g,m=(0,k.Qh)(),y=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),z=a5(j)||"none",A=(0,n.Mu)(z)?.name||z,B=[aV({type:"role_binding",roleId:z,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${j.name}`},{subtitle:A,roleName:A,order:0})];a.onProgress?.([...B]);let C=ba(j),D=bb(j);B.push(aV({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与项目资料摘要"},{subtitle:"生成准备",order:B.length})),a.onProgress?.([...B]);let E=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}`,p)||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 t(c,q))d.add(a);let e=x(a,b);if("施工组织设计"===b||e.length>0){for(let a of t("招标 施工 工程 清单 图纸 质量 工期 安全 文明 材料 重点 难点",q))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 w(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of v(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 w(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of v(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=x(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 t(c,r))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(u),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-${u(a)}`,title:a,required:!0,order:n.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),s=[{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-${u(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-${u(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-${u(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-${u(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-${u(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}}]:[]],y=[...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:u(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/材料|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:y,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:s,builtIn:!0}}}(j,a.requirement||""),ab=E.spec,ac=F(i,{requirement:a.requirement,boundFilePaths:D.map(a=>a.filePath),boundFileRoles:a8(D)}),ad=D.length>0?D:a9(j,ac),ae=ad.length>0?ad:D,af=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(t([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),s));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?"必需资料角色缺失":"可选资料角色缺失"}})}(j,ac),ah=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:j,spec:ab,summary:ac,resolvedRoles:af});if(!ah.ready)throw Error(`生成准备度不足:${ah.blockingIssues.join(";")}`);let aj=[["## 后台项目资料摘要",ac.extractedSections.projectOverview,`项目指纹:项目名候选 ${ac.fingerprint.projectNames.join("、")||"无"};编号 ${ac.fingerprint.tenderNos.join("、")||"无"};资料组 ${ac.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*ac.fingerprint.confidence)}%。`,`内容级事实候选:建设/招标单位 ${ac.facts.ownerNames?.join("、")||"无"};地点 ${ac.facts.locationNames?.join("、")||"无"};工期 ${ac.facts.scheduleValues?.join("、")||"无"};质量 ${ac.facts.qualityTargets?.join("、")||"无"}。`,ac.extractedSections.scopeSummary,ac.extractedSections.boqSummary,ac.extractedSections.drawingSummary,ac.extractedSections.scheduleQualitySafetySummary,ac.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*ac.coverage.materialCompletenessRate)}%`].join("\n"),(b=E.sourceHash,`## 后台内容优化建议
60
60
  建议包:${ab.name}
61
61
  版本标识:${b}
62
62
  说明:以下内容仅用于提升事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
63
63
  建议关注事实:${ab.factFields.map(a=>a.name).join("、")}
64
64
  章节内容建议:${ab.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ").slice(0,120)}`:""}`).join(";")||"以当前模板章节为准"}
65
- 质量提醒:${ab.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${ah.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*ah.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*ah.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*ah.specCompletenessRate)}%`,ah.missingRoles.length?`缺失角色:${ah.missingRoles.join("、")}`:"",ah.weakRoles.length?`较弱角色:${ah.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),ak=[aj,bf(C,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),al=aT([ak,a.requirement||""].filter(Boolean).join("\n\n")),am=[aj,bf(C,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),ap=[aj,bf(C,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n"),at=(function(a){for(let b of a){let a=function(a,b){let c=[];for(let d of function(a){let b=[...a.matchAll(/<\s*OUTLINE\s*>([\s\S]*?)<\/\s*OUTLINE\s*>/giu)].map(a=>a[1]||"");if(b.length>0)return b;let c=/(?:<\s*)?OUTLINE\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*OUTLINE\s*>|END\s+OUTLINE|$)/iu.exec(a);return c?.[1]?[c[1]]:[]}(a))for(let a of function(a){let b=`(?:第(?:\\d{1,3}|${aw})[章节])`;return a.replace(/\r?\n/gu,"\n").replace(RegExp(`\\s+(?=${b}\\s*)`,"gu"),"\n").split("\n").map(a=>a.replace(RegExp(`^\\s*第(?:\\d{1,3}|${aw})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${aw})[))、..]\\s*`,"u"),"").replace(/\s+/gu," ").trim()).filter(a=>0!==a.trim().length)}(d))c.push({id:`explicit-${b}-${c.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return aC(c).slice(0,80)}(b.text||"",b.source);if(a.length>=2)return a}return[]})([{text:a.requirement,source:"用户需求"},{text:bf(C,["chapter_generation","formatting","reference"]),source:"提示词角色"}]).filter(a=>{var b;return b=a.title,!aL(g).some(a=>!!a.minLength&&b.length<a.minLength||!!a.maxLength&&b.length>a.maxLength||a.forbiddenPatterns.some(a=>aK(b,a)))}),au=at.length>=2;au&&(i={...g,chapters:at});let av=be(h,ae),aB=new Set(Object.values(ac.materialInventory).flat().flatMap(a=>bc(h,a.filePath))),aI=av.size>0?av:aB,aO=(0,m.XB)("file"),aP=new Map(ae.flatMap(a=>bc(h,a.filePath).map(b=>[b,a.roleId]))),aQ=new Map(ae.flatMap(a=>bc(h,a.filePath).map(b=>[b,aO.find(b=>b.id===a.roleId)?.processingType||"reference"])));B.push(aV({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在检查知识库增量索引状态"},{subtitle:"知识库索引",order:B.length})),a.onProgress?.([...B]);let aU=await l.getProject(h);await aU.incrementalIndex(),B.push(aV({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"知识库增量索引检查完成,开始构建角色资料证据池"},{subtitle:"知识库索引",order:B.length})),a.onProgress?.([...B]),bV(a.signal);let aZ=[],a$=[],a_=[],a1=[],a3=[],a6=[],a7=function(a,b,c){let d=(0,m.XB)("file"),e=(0,m.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=>a.content);return{promptRole:b,texts:c,score:function(a,b,c){let d=aH(`${a} ${c.join(" ")}`),e=aH(`${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(aH(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=aH(`${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,C,ae),bg=function(a,b,c){let d=new Map;for(let e of[...new Set(b.flatMap(a=>a.filePaths))]){let b=aJ(c,e),f=a.getFileDetail(e);if(f){d.set(b,f.chunks.slice(0,120).map(a=>({chapterId:"role-evidence-pool",filePath:f.file.relativePath,score:1,content:a.content,sectionTitle:a.sectionTitle,source:"role-node"})));continue}d.set(b,as(e,void 0,void 0,"role-evidence-pool",c))}return{files:d,uniqueFileCount:d.size,bindingCount:b.reduce((a,b)=>a+b.filePaths.length,0)}}(aU,a7,h);B.push(aV({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${bg.uniqueFileCount} 份,角色绑定 ${bg.bindingCount} 条,复用 ${Math.max(0,bg.bindingCount-bg.uniqueFileCount)} 条`},{subtitle:"共享资料池",order:B.length})),a.onProgress?.([...B]);let bh=[];for(let b of a7){bV(a.signal);let c=(function(a,b,c){return ar(b.filePaths.flatMap(d=>(a.files.get(aJ(c,d))||[]).map(a=>({...a,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType}))),120)})(bg,b,h).filter(a=>bd(h,a.filePath,aI));B.push(aV({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:"running",message:`${b.fileRoleName} 正在复用共享资料池读取 ${b.filePaths.length} 条绑定,候选证据 ${c.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:B.length})),a.onProgress?.([...B]),a_.push(...c);let d=await aR(i,b,c);bh.push(d),B.push(aV({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:c.length>0?"success":"fallback",message:`${b.fileRoleName} 节点已完成,产出章节建议 ${d.chapters.length} 个、事实 ${d.facts.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:B.length})),a.onProgress?.([...B])}let bi=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=ay(b.title);!(!az(b.title)||aM(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(i,bh),bk=aD(i,ab),bF=[i.name,i.outputTitle,a.requirement,...bk.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bG=(0,k.Hh)(bF,8,h),bM=bG.length>0?bG.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",bW=function(a){let b=[],c=new Set;for(let d of a)for(let{key:a,patterns:e}of aS)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}(bh.flatMap(a=>a.evidence)),bX=function(a){let b=a.template.generationSettings||a.template.exportSettings,c=bq(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=>br(a[1]||"")).filter(a=>Number.isFinite(a)).at(-1),targetChars:d.map(a=>{let b=br(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+bs(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*bs(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:ak,template:i,chapters:bk,spec:ab}),bY=aV({type:"context_recall",roleId:"project-memory",status:bG.length>0?"success":"skipped",message:bG.length>0?`已注入 ${bG.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),bZ=au?`;识别到 OUTLINE 章节 ${at.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";for(let b of(B.push(aV({type:"role_binding",roleId:z,status:"success",message:`已绑定 ${ae.length} 个文件角色、${C.length} 个提示词角色;后台优化建议关注 ${ab.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ah.materialCoverageRate)}%${bZ}`},{subtitle:A,roleName:A})),B.push(aV({type:"validation",roleId:"document-readiness",status:ah.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ah.materialCoverageRate)}%,资料角色 ${Math.round(100*ah.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ah.specCompletenessRate)}%;${ac.source.selectionReason}`},{subtitle:"生成准备度检查"})),B.push(bY),a.onProgress?.([...B]),bk)){bV(a.signal);try{let c=[],d=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(b,bi),e=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[];for(let a of[...new Set([...b.queries.length>0?b.queries:[i.name,i.outputTitle,b.title],...e])]){let d=await l.search(h,a,{scope:"project",limit:Math.max(y,aI.size>0?30:y),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});c.push(...d.results.filter(a=>bd(h,a.filePath,aI)).map(a=>({chapterId:b.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aP.get(a.filePath),processingType:aQ.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let f=new Set(b.pinnedEvidenceFilePaths||[]),g=aW(bh,b,d);for(let a of(c.push(...g.flatMap(({artifact:a})=>a.evidence.filter(a=>bd(h,a.filePath,aI)).slice(0,8).map(a=>({...a,chapterId:b.id,source:"role-node"})))),new Set([...f]))){if(!bd(h,a,aI))continue;let d=f.has(a),e=aU.getFileDetail(a);if(!e){c.push(...as(a,aP.get(a),aQ.get(a),b.id,h).map(a=>({...a,source:d?"pinned-evidence":a.source})));continue}c.push(...e.chunks.slice(0,Math.max(y,20)).map(a=>({chapterId:b.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aP.get(e.file.relativePath),processingType:aQ.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let j=c.filter(a=>bd(h,a.filePath,aI)),k=ar(j,y),m=ar(j,120);a_.push(...k);let n=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}(m,160),o=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}}(b,n);a$.push(o);let p=0===o.facts.length?"":["本章必须优先落位以下工程量化事实和技术事实。不得用“按设计要求、按规范要求、加强管理”等空泛表述替代已列出的工程量、工期节点、频次、人员资源、金额承诺、参数、工艺、试验和验收指标。","","| 序号 | 类型 | 专业 | 分项 | 参数/规格 | 工程量/工期/频次/资源/金额 | 工艺动作 | 试验验收 | 规范标准 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...o.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"),q=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")}(o),r=b.requiredFacts.filter(a=>!k.some(b=>aE(b,a)));for(let a of(0===k.length&&a1.push(`${b.title}:未检索到明确资料依据`),r))a1.push(`${b.title}:${a} 未检索到明确依据`);B.some(a=>"knowledge_retrieval"===a.type)||(B.push(aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:a_.length>0?"success":"fallback",message:`已检索/绑定 ${a_.length} 条证据`})),a.onProgress?.([...B])),bV(a.signal);let s=aX(bh,i),t=function(a,b,c){let d=aW(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?`要求项:
65
+ 质量提醒:${ab.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${ah.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*ah.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*ah.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*ah.specCompletenessRate)}%`,ah.missingRoles.length?`缺失角色:${ah.missingRoles.join("、")}`:"",ah.weakRoles.length?`较弱角色:${ah.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),ak=[aj,bf(C,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),al=aT([ak,a.requirement||""].filter(Boolean).join("\n\n")),am=[aj,bf(C,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),ap=[aj,bf(C,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n"),at=(function(a){for(let b of a){let a=function(a,b){let c=[];for(let d of function(a){let b=[...a.matchAll(/<\s*OUTLINE\s*>([\s\S]*?)<\/\s*OUTLINE\s*>/giu)].map(a=>a[1]||"");if(b.length>0)return b;let c=/(?:<\s*)?OUTLINE\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*OUTLINE\s*>|END\s+OUTLINE|$)/iu.exec(a);return c?.[1]?[c[1]]:[]}(a))for(let a of function(a){let b=`(?:第(?:\\d{1,3}|${aw})[章节])`;return a.replace(/\r?\n/gu,"\n").replace(RegExp(`\\s+(?=${b}\\s*)`,"gu"),"\n").split("\n").map(a=>a.replace(RegExp(`^\\s*第(?:\\d{1,3}|${aw})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${aw})[))、..]\\s*`,"u"),"").replace(/\s+/gu," ").trim()).filter(a=>0!==a.trim().length)}(d))c.push({id:`explicit-${b}-${c.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return aC(c).slice(0,80)}(b.text||"",b.source);if(a.length>=2)return a}return[]})([{text:a.requirement,source:"用户需求"},{text:bf(C,["chapter_generation","formatting","reference"]),source:"提示词角色"}]).filter(a=>{var b;return b=a.title,!aL(g).some(a=>!!a.minLength&&b.length<a.minLength||!!a.maxLength&&b.length>a.maxLength||a.forbiddenPatterns.some(a=>aK(b,a)))}),au=at.length>=2;au&&(j={...g,chapters:at});let av=be(i,ae),aB=new Set(Object.values(ac.materialInventory).flat().flatMap(a=>bc(i,a.filePath))),aI=av.size>0?av:aB,aO=(0,n.XB)("file"),aP=new Map(ae.flatMap(a=>bc(i,a.filePath).map(b=>[b,a.roleId]))),aQ=new Map(ae.flatMap(a=>bc(i,a.filePath).map(b=>[b,aO.find(b=>b.id===a.roleId)?.processingType||"reference"])));B.push(aV({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在检查知识库增量索引状态"},{subtitle:"知识库索引",order:B.length})),a.onProgress?.([...B]);let aU=await m.getProject(i);await aU.incrementalIndex(),B.push(aV({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"知识库增量索引检查完成,开始构建角色资料证据池"},{subtitle:"知识库索引",order:B.length})),a.onProgress?.([...B]),bV(a.signal);let aZ=[],a$=[],a_=[],a1=[],a3=[],a6=[],a7=-1,bg=function(a,b,c){let d=(0,n.XB)("file"),e=(0,n.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=>a.content);return{promptRole:b,texts:c,score:function(a,b,c){let d=aH(`${a} ${c.join(" ")}`),e=aH(`${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(aH(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=aH(`${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,C,ae),bh=function(a,b,c){let d=new Map,e=0;for(let f of[...new Set(b.flatMap(a=>a.filePaths))]){let b=aJ(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}}(aU,bg,i),bi=[],bk=aV({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${bh.uniqueFileCount} 份,角色绑定 ${bh.bindingCount} 条,复用 ${Math.max(0,bh.bindingCount-bh.uniqueFileCount)} 条;${bh.fallbackFileCount} 份使用文件级兜底证据`},{subtitle:"共享资料池",order:B.length});bi.push(bk),B.push(bk),a.onProgress?.([...B]);let bF=[];for(let b of bg){bV(a.signal);let c=(function(a,b,c){return ar(b.filePaths.flatMap(d=>(a.files.get(aJ(c,d))||[]).map(a=>({...a,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType}))),120)})(bh,b,i).filter(a=>bd(i,a.filePath,aI)),d=B.length,e=aV({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:"running",message:`${b.fileRoleName} 正在复用共享资料池读取 ${b.filePaths.length} 条绑定,候选证据 ${c.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:d});B.push(e),a.onProgress?.([...B]),a_.push(...c);let f=await aR(j,b,c);bF.push(f);let g=aV({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:c.length>0?"success":"fallback",message:`${b.fileRoleName} 节点已完成,产出章节建议 ${f.chapters.length} 个、事实 ${f.facts.length} 条`},{subtitle:b.fileRoleName,roleName:b.fileRoleName,promptName:b.promptRoleNames.join("、")||void 0,order:d});bi.push(g),B[d]=g,a.onProgress?.([...B])}let bG=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=ay(b.title);!(!az(b.title)||aM(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(j,bF),bM=aD(j,ab),bW=[j.name,j.outputTitle,a.requirement,...bM.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bX=(0,l.Hh)(bW,8,i),bY=bX.length>0?bX.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",bZ=function(a){let b=[],c=new Set;for(let d of a)for(let{key:a,patterns:e}of aS)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)),b$=function(a){let b=a.template.generationSettings||a.template.exportSettings,c=bq(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=>br(a[1]||"")).filter(a=>Number.isFinite(a)).at(-1),targetChars:d.map(a=>{let b=br(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+bs(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*bs(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:ak,template:j,chapters:bM,spec:ab}),b_=aV({type:"context_recall",roleId:"project-memory",status:bX.length>0?"success":"skipped",message:bX.length>0?`已注入 ${bX.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),b0=au?`;识别到 OUTLINE 章节 ${at.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";for(let b of(B.push(aV({type:"role_binding",roleId:z,status:"success",message:`已绑定 ${ae.length} 个文件角色、${C.length} 个提示词角色;后台优化建议关注 ${ab.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ah.materialCoverageRate)}%${b0}`},{subtitle:A,roleName:A})),B.push(aV({type:"validation",roleId:"document-readiness",status:ah.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ah.materialCoverageRate)}%,资料角色 ${Math.round(100*ah.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ah.specCompletenessRate)}%;${ac.source.selectionReason}`},{subtitle:"生成准备度检查"})),B.push(b_),a.onProgress?.([...B]),bM)){bV(a.signal);try{let c=[],d=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(b,bG),e=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[];for(let a of[...new Set([...b.queries.length>0?b.queries:[j.name,j.outputTitle,b.title],...e])]){let d=await m.search(i,a,{scope:"project",limit:Math.max(y,aI.size>0?30:y),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});c.push(...d.results.filter(a=>bd(i,a.filePath,aI)).map(a=>({chapterId:b.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aP.get(a.filePath),processingType:aQ.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let f=new Set(b.pinnedEvidenceFilePaths||[]),g=aW(bF,b,d);for(let a of(c.push(...g.flatMap(({artifact:a})=>a.evidence.filter(a=>bd(i,a.filePath,aI)).slice(0,8).map(a=>({...a,chapterId:b.id,source:"role-node"})))),new Set([...f]))){if(!bd(i,a,aI))continue;let d=f.has(a),e=aU.getFileDetail(a);if(!e){c.push(...as(a,aP.get(a),aQ.get(a),b.id,i).map(a=>({...a,source:d?"pinned-evidence":a.source})));continue}c.push(...e.chunks.slice(0,Math.max(y,20)).map(a=>({chapterId:b.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aP.get(e.file.relativePath),processingType:aQ.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let h=c.filter(a=>bd(i,a.filePath,aI)),k=ar(h,y),l=ar(h,120);a_.push(...k);let n=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}(l,160),o=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}}(b,n);a$.push(o);let p=0===o.facts.length?"":["本章必须优先落位以下工程量化事实和技术事实。不得用“按设计要求、按规范要求、加强管理”等空泛表述替代已列出的工程量、工期节点、频次、人员资源、金额承诺、参数、工艺、试验和验收指标。","","| 序号 | 类型 | 专业 | 分项 | 参数/规格 | 工程量/工期/频次/资源/金额 | 工艺动作 | 试验验收 | 规范标准 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...o.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"),q=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")}(o),r=b.requiredFacts.filter(a=>!k.some(b=>aE(b,a)));for(let a of(0===k.length&&a1.push(`${b.title}:未检索到明确资料依据`),r))a1.push(`${b.title}:${a} 未检索到明确依据`);let s=aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:a_.length>0?"success":"fallback",message:`已检索/绑定 ${a_.length} 条证据`});a7<0?(a7=B.length,B.push(s)):B[a7]=s,a.onProgress?.([...B]),bV(a.signal);let t=aX(bF,j),u=function(a,b,c){let d=aW(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?`要求项:
66
66
  ${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(aN(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
67
67
  ${b.slice(0,18).map(a=>a.replace(ao,"").replace(an,"")).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
68
68
  ${e}`:"",g?`【角色节点结构化产物】
69
- ${g}`:""].filter(Boolean).join("\n\n")}(bh,b,d),u=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=aS.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")}(bW.filter(a=>bd(h,a.sourceFile,aI)),b,al),v=ab?.chapterRules.find(a=>a.id===b.id||a.title===b.title),w=bX.chapterTargets.get(b.id)||1200,x=Math.max(d?.minWords||0,v?.minWords||0,ab?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.82*w),1200),z=bD(x,w),A=await bj(c=>bC(i,b,k,r,ak,bM,a.requirement,t,{forbidDrawingImages:s,minWords:x,targetWords:w,maxTokens:z,technicalFactContext:p,coverageMatrixContext:q,projectBasicFactContext:u,signal:c}),bE(w),a.signal);if(bV(a.signal),!A){let c=k.slice(0,80),d=t.slice(0,12e3);A=await bj(e=>bC(i,b,c,r,ak,bM,a.requirement,d,{forbidDrawingImages:s,minWords:Math.max(900,Math.floor(.75*x)),targetWords:w,maxTokens:z,technicalFactContext:p.slice(0,12e3),coverageMatrixContext:q.slice(0,8e3),projectBasicFactContext:u.slice(0,8e3),signal:e}),bE(w),a.signal)}if(bV(a.signal),!A)throw Error(`${b.title} 大模型未返回有效章节正文`);let D=await bH({template:i,chapter:b,content:A,evidence:k,promptTexts:ak,requirement:a.requirement,roleContext:t,targetChars:Math.floor(.95*w),forbidDrawingImages:s,maxTokens:z,signal:a.signal}),E=D.content,F=bp(E),G=b.sections?.length?b.sections:bL(E);a6.push(aV({type:"chapter_generation",roleId:"chapter_generation",promptId:C.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:`${ax(b.title)} 已由大模型生成${D.rounds>0?`并扩写 ${D.rounds} 轮`:""}:当前 ${F} 字 / 目标 ${Math.floor(.95*w)} 字`},{subtitle:ax(b.title),order:a6.length})),aZ.push({id:b.id,title:b.title,content:E,evidence:k,missingFacts:r,sections:G})}catch(c){if(a.signal?.aborted)throw c;console.error(`[gen] chapter ${b.title} failed:`,c),a3.push(`${b.title}:${c instanceof Error?c.message:"生成失败"}`),a6.push(aV({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${ax(b.title)} 生成失败`},{subtitle:ax(b.title),order:a6.length}))}B.some(a=>"chapter_generation"===a.type&&a.message===a6[a6.length-1]?.message)||B.push(a6[a6.length-1]),a.onProgress?.([...B])}if(0===aZ.length)throw Error(`章节生成未完成:${a3.slice(0,6).join(";")||"没有生成任何有效章节"}`);bV(a.signal);let b$={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{b$=await bl(h,a_)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bV(a.signal),b$.notes))a_.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let b_=function(a,b,c){let d={};for(let e of aF(a,c)){let a=b.find(a=>aG(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(i,a_,ab);for(let a of bh)for(let b of a.facts)b_[b.key]=`${aN(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b0=function(a,b,c){let d=aF(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(!aG(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_,i,ab),b1={facts:[],stages:[]};try{b1=await bm(a_,am,i,ab)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bV(a.signal);let b2=bh.flatMap(a=>a.facts.map(a=>({key:a.key,value:aN(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b3=[...bW.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),...b2,...b0,...b1.facts];for(let a of(B.some(a=>a.type===b$.stage.type)||B.push(b$.stage),b1.stages))B.some(b=>b.type===a.type)||B.push(a);a.onProgress?.([...B]);let b4=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,j.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 k=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(k.length<2)continue;let l=k[0].includes("|")?"|":k[0].includes(" ")?" ":",",m=k.map(a=>a.split(l).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_),b5=a_.filter(a=>"pinned-evidence"===a.source).length,b6=a_.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,b7=aV({type:"reference",roleId:"quality-enhancement",status:a_.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${a_.length} 条,人工确认/固定证据 ${b5} 条,项目上下文 ${bG.length} 条,自动检索证据 ${b6} 条`},{subtitle:"证据与上下文增强"});for(let b of(B.push(b7),a.onProgress?.([...B]),b3))b_[b.key]=`${aN(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b8=new Map;for(let a of a_)b8.set(a.filePath,(b8.get(a.filePath)??0)+1);let b9=[...b8.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ca=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=aN(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)}}(b3,b4,a1,ab),cb=aZ.map(a=>{let b=ab.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)}}),cc=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}}(aZ,b3,i);cc.warnings.push(...ah.warnings),cc.errors.push(...ah.blockingIssues);let cd=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}(cc,ca,aZ);cd.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}(cb));let ce=aX(bh,i),cf=await bJ({template:i,chapters:aZ,budget:bX,promptTexts:ak,requirement:a.requirement,forbidDrawingImages:ce,signal:a.signal});aZ.splice(0,aZ.length,...cf);let cg=bI(bX,aZ.map(a=>a.content).join("\n\n")),ch=[bX.targetChars?`目标 ${bX.targetChars} 字`:void 0,bX.targetPages?`目标 ${bX.targetPages} 页`:void 0].filter(Boolean).join(" / ")||"默认章节深度",ci=aV({type:"validation",roleId:"document-budget",status:bX.minChars&&cg.currentChars<bX.minChars?"fallback":"success",message:`文档预算:当前 ${cg.currentChars} 字,预计 ${cg.estimatedPages} 页;${ch}`},{subtitle:"文档预算"});B.push(ci),a.onProgress?.([...B]);let cj=a6.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,ck=a6.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cj>0&&cd.push({level:"error",message:`章节生成存在兜底:${cj} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),ck>0&&cd.push({level:"warning",message:`部分章节生成失败:${ck} 章`,suggestion:a3.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cl=cd.filter(a=>"error"===a.level&&bn(a)).length,cm=[aV({type:"role_binding",roleId:z,status:ae.length>0?"success":"fallback",message:`已绑定 ${ae.length} 个文件角色、${C.length} 个提示词角色;后台优化建议关注 ${ab.factFields.length} 个事实字段`},{subtitle:A,roleName:A}),aV({type:"validation",roleId:"document-readiness",status:ah.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ah.materialCoverageRate)}%,资料角色 ${Math.round(100*ah.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ah.specCompletenessRate)}%;${ac.source.selectionReason}`},{subtitle:"生成准备度检查"}),bY,aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:a_.length>0?"success":"fallback",message:`已检索/绑定 ${a_.length} 条证据`}),b7,ci,aV(b$.stage),...b1.stages.map(a=>aV(a)),...a6,aV({type:"validation",roleId:"document-workflow",status:cl>0?"failed":"success",message:`阻断 ${cl},错误 ${cc.errors.length},警告 ${cc.warnings.length}`},{subtitle:"最终规范校验"}),aV({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}),aV({type:"export_ready",roleId:"document-workflow",status:cl>0?"failed":"success",message:cl>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"})],cn={templateId:i.id,templateName:i.name,title:i.outputTitle,requirement:a.requirement||"",exportSettings:i.exportSettings,generationSettings:i.generationSettings,facts:b_,structuredFacts:b3,factsModel:ca,chapters:aZ,sources:b9,missingItems:[...new Set(a1)],validation:cc,validationIssues:cd,executionStages:cm,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},co=bU(cn);bV(a.signal);let cp=await bK({template:i,spec:ab,markdown:co,evidence:a_,promptTexts:ap||ak,projectContext:bM,requirement:a.requirement});bV(a.signal);let cq=bN(aY(cp.markdown===co?bU({...cn,validationIssues:cd,exportGate:cn.exportGate,executionStages:cm}):cp.markdown,ce)),cr=bT(cq,i).map(a=>a.message),cs=bA(cq).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ct=bB(cq,i).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cu=bz(cq,ca).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cv=aa({assignments:a$,markdown:cq}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cw=by(cq).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cx=bv(cq).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cy=bw(cq).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cz=bx(aZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cA=bO(cq).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cB=[...a2(cq,aZ,bi,bh,ce),...cr,...cs,...ct,...cu,...cv,...cw,...cx,...cy,...cz,...cA],cC=await a4({markdown:cq,template:i,chapters:aZ,promptTexts:ak,requirement:a.requirement,issues:cB,forbidDrawingImages:ce});bV(a.signal);let cD=cC.stage?[...cm,cp.stage,cC.stage]:[...cm,cp.stage],cE=cC.chapters;cE=await bJ({template:i,chapters:cE,budget:bX,promptTexts:ak,requirement:a.requirement,forbidDrawingImages:ce,signal:a.signal});let cF=bU({...cn,chapters:cE,validationIssues:cd,exportGate:cn.exportGate,executionStages:cm}),cG=function(a,b){let c=bR(bQ(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${bS(aA(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=bL(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(cF,cE),cH=cE.map((a,b)=>({...a,sections:cG[b]||a.sections||[]})),cI=bN(a0(function(a,b){let c=bR(a,b),d=bP(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)}
69
+ ${g}`:""].filter(Boolean).join("\n\n")}(bF,b,d),v=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=aS.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")}(bZ.filter(a=>bd(i,a.sourceFile,aI)),b,al),w=ab?.chapterRules.find(a=>a.id===b.id||a.title===b.title),x=b$.chapterTargets.get(b.id)||1200,z=Math.max(d?.minWords||0,w?.minWords||0,ab?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.82*x),1200),A=bD(z,x),D=await bj(c=>bC(j,b,k,r,ak,bY,a.requirement,u,{forbidDrawingImages:t,minWords:z,targetWords:x,maxTokens:A,technicalFactContext:p,coverageMatrixContext:q,projectBasicFactContext:v,signal:c}),bE(x),a.signal);if(bV(a.signal),!D){let c=k.slice(0,80),d=u.slice(0,12e3);D=await bj(e=>bC(j,b,c,r,ak,bY,a.requirement,d,{forbidDrawingImages:t,minWords:Math.max(900,Math.floor(.75*z)),targetWords:x,maxTokens:A,technicalFactContext:p.slice(0,12e3),coverageMatrixContext:q.slice(0,8e3),projectBasicFactContext:v.slice(0,8e3),signal:e}),bE(x),a.signal)}if(bV(a.signal),!D)throw Error(`${b.title} 大模型未返回有效章节正文`);let E=await bH({template:j,chapter:b,content:D,evidence:k,promptTexts:ak,requirement:a.requirement,roleContext:u,targetChars:Math.floor(.95*x),forbidDrawingImages:t,maxTokens:A,signal:a.signal}),F=E.content,G=bp(F),V=b.sections?.length?b.sections:bL(F);a6.push(aV({type:"chapter_generation",roleId:"chapter_generation",promptId:C.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:`${ax(b.title)} 已由大模型生成${E.rounds>0?`并扩写 ${E.rounds} 轮`:""}:当前 ${G} 字 / 目标 ${Math.floor(.95*x)} 字`},{subtitle:ax(b.title),order:a6.length})),aZ.push({id:b.id,title:b.title,content:F,evidence:k,missingFacts:r,sections:V})}catch(c){if(a.signal?.aborted)throw c;console.error(`[gen] chapter ${b.title} failed:`,c),a3.push(`${b.title}:${c instanceof Error?c.message:"生成失败"}`),a6.push(aV({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${ax(b.title)} 生成失败`},{subtitle:ax(b.title),order:a6.length}))}B.some(a=>"chapter_generation"===a.type&&a.message===a6[a6.length-1]?.message)||B.push(a6[a6.length-1]),a.onProgress?.([...B])}if(0===aZ.length)throw Error(`章节生成未完成:${a3.slice(0,6).join(";")||"没有生成任何有效章节"}`);bV(a.signal);let b1={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{b1=await bl(i,a_)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bV(a.signal),b1.notes))a_.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let b2=function(a,b,c){let d={};for(let e of aF(a,c)){let a=b.find(a=>aG(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(j,a_,ab);for(let a of bF)for(let b of a.facts)b2[b.key]=`${aN(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b3=function(a,b,c){let d=aF(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(!aG(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_,j,ab),b4={facts:[],stages:[]};try{b4=await bm(a_,am,j,ab)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bV(a.signal);let b5=bF.flatMap(a=>a.facts.map(a=>({key:a.key,value:aN(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b6=[...bZ.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),...b5,...b3,...b4.facts];for(let a of(B.some(a=>a.type===b1.stage.type)||B.push(b1.stage),b4.stages))B.some(b=>b.type===a.type)||B.push(a);a.onProgress?.([...B]);let b7=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,k.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 l=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",m=j.map(a=>a.split(l).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_),b8=a_.filter(a=>"pinned-evidence"===a.source).length,b9=a_.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,ca=aV({type:"reference",roleId:"quality-enhancement",status:a_.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${a_.length} 条,人工确认/固定证据 ${b8} 条,项目上下文 ${bX.length} 条,自动检索证据 ${b9} 条`},{subtitle:"证据与上下文增强"});for(let b of(B.push(ca),a.onProgress?.([...B]),b6))b2[b.key]=`${aN(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cb=new Map;for(let a of a_)cb.set(a.filePath,(cb.get(a.filePath)??0)+1);let cc=[...cb.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cd=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=aN(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)}}(b6,b7,a1,ab),ce=aZ.map(a=>{let b=ab.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)}}),cf=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}}(aZ,b6,j);cf.warnings.push(...ah.warnings),cf.errors.push(...ah.blockingIssues);let cg=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}(cf,cd,aZ);cg.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}(ce));let ch=aX(bF,j),ci=await bJ({template:j,chapters:aZ,budget:b$,promptTexts:ak,requirement:a.requirement,forbidDrawingImages:ch,signal:a.signal});aZ.splice(0,aZ.length,...ci);let cj=bI(b$,aZ.map(a=>a.content).join("\n\n")),ck=[b$.targetChars?`目标 ${b$.targetChars} 字`:void 0,b$.targetPages?`目标 ${b$.targetPages} 页`:void 0].filter(Boolean).join(" / ")||"默认章节深度",cl=aV({type:"validation",roleId:"document-budget",status:b$.minChars&&cj.currentChars<b$.minChars?"fallback":"success",message:`文档预算:当前 ${cj.currentChars} 字,预计 ${cj.estimatedPages} 页;${ck}`},{subtitle:"文档预算"});B.push(cl),a.onProgress?.([...B]);let cm=a6.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cn=a6.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cm>0&&cg.push({level:"error",message:`章节生成存在兜底:${cm} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),cn>0&&cg.push({level:"warning",message:`部分章节生成失败:${cn} 章`,suggestion:a3.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let co=cg.filter(a=>"error"===a.level&&bn(a)).length,cp=[aV({type:"role_binding",roleId:z,status:ae.length>0?"success":"fallback",message:`已绑定 ${ae.length} 个文件角色、${C.length} 个提示词角色;后台优化建议关注 ${ab.factFields.length} 个事实字段`},{subtitle:A,roleName:A}),aV({type:"validation",roleId:"document-readiness",status:ah.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ah.materialCoverageRate)}%,资料角色 ${Math.round(100*ah.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ah.specCompletenessRate)}%;${ac.source.selectionReason}`},{subtitle:"生成准备度检查"}),b_,aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:a_.length>0?"success":"fallback",message:`已检索/绑定 ${a_.length} 条证据`}),...bi,ca,cl,aV(b1.stage),...b4.stages.map(a=>aV(a)),...a6,aV({type:"validation",roleId:"document-workflow",status:co>0?"failed":"success",message:`阻断 ${co},错误 ${cf.errors.length},警告 ${cf.warnings.length}`},{subtitle:"最终规范校验"}),aV({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}),aV({type:"export_ready",roleId:"document-workflow",status:co>0?"failed":"success",message:co>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"})],cq={templateId:j.id,templateName:j.name,title:j.outputTitle,requirement:a.requirement||"",exportSettings:j.exportSettings,generationSettings:j.generationSettings,facts:b2,structuredFacts:b6,factsModel:cd,chapters:aZ,sources:cc,missingItems:[...new Set(a1)],validation:cf,validationIssues:cg,executionStages:cp,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},cr=bU(cq);bV(a.signal);let cs=await bK({template:j,spec:ab,markdown:cr,evidence:a_,promptTexts:ap||ak,projectContext:bY,requirement:a.requirement});bV(a.signal);let ct=bN(aY(cs.markdown===cr?bU({...cq,validationIssues:cg,exportGate:cq.exportGate,executionStages:cp}):cs.markdown,ch)),cu=bT(ct,j).map(a=>a.message),cv=bA(ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cw=bB(ct,j).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cx=bz(ct,cd).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cy=aa({assignments:a$,markdown:ct}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cz=by(ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cA=bv(ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cB=bw(ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cC=bx(aZ).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cD=bO(ct).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cE=[...a2(ct,aZ,bG,bF,ch),...cu,...cv,...cw,...cx,...cy,...cz,...cA,...cB,...cC,...cD],cF=await a4({markdown:ct,template:j,chapters:aZ,promptTexts:ak,requirement:a.requirement,issues:cE,forbidDrawingImages:ch});bV(a.signal);let cG=cF.stage?[...cp,cs.stage,cF.stage]:[...cp,cs.stage],cH=cF.chapters;cH=await bJ({template:j,chapters:cH,budget:b$,promptTexts:ak,requirement:a.requirement,forbidDrawingImages:ch,signal:a.signal});let cI=bU({...cq,chapters:cH,validationIssues:cg,exportGate:cq.exportGate,executionStages:cp}),cJ=function(a,b){let c=bR(bQ(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${bS(aA(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=bL(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(cI,cH),cK=cH.map((a,b)=>({...a,sections:cJ[b]||a.sections||[]})),cL=bN(a0(function(a,b){let c=bR(a,b),d=bP(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)}
70
70
 
71
71
  ${d}
72
72
 
@@ -76,9 +76,9 @@ ${c.slice(a).trimStart()}`}return`${d}
76
76
 
77
77
  <div class="page-break"></div>
78
78
 
79
- ${c}`}(aY(cF,ce),cH))),cJ=[...a2(cq,aZ,bi,bh,ce),...cr];for(let a of((cd=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=>aG(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>aG(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=bt(e),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0})),n=bo(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:bu(b,`缺少事实 ${p}`)}),"chapter"===o.subject&&"exists"===o.operator&&p&&!k.has(p)&&h.push({level:a,message:bu(b,`缺少章节 ${p}`)}),"file_role"===o.subject&&"exists"===o.operator&&p&&!f.some(a=>a.roleId===p)&&h.push({level:a,message:bu(b,`缺少文件角色 ${p}`)}),"prompt_role"===o.subject&&"exists"===o.operator&&p&&!g.some(a=>a.roleId===p)&&h.push({level:a,message:bu(b,`缺少提示词角色 ${p}`)}),"document"===o.subject&&"contains"===o.operator&&q&&!e.includes(q)&&h.push({level:a,message:bu(b,`全文必须包含 ${q}`)}),"document"===o.subject&&"not_contains"===o.operator&&q&&e.includes(q)&&h.push({level:a,message:bu(b,`出现禁用文本 ${q}`)}),"document"!==o.subject&&"chapter"!==o.subject||"regex_match"!==o.operator||!q||u&&u.test(t)||h.push({level:a,message:bu(b,`未匹配正则 ${q}`)}),("document"===o.subject||"chapter"===o.subject)&&"regex_not_match"===o.operator&&u?.test(t)&&h.push({level:a,message:bu(b,`匹配到禁止正则 ${q}`)}),"chapter"===o.subject&&"contains"===o.operator&&p&&q&&(!s||!s.content.includes(q))&&h.push({level:a,message:bu(b,`章节 ${p} 必须包含 ${q}`)}),"chapter"===o.subject&&"not_contains"===o.operator&&s?.content.includes(q)&&h.push({level:a,message:bu(b,`章节 ${p} 出现禁用文本 ${q}`)}),"chapter"===o.subject&&"min_length"===o.operator&&p&&(!s||s.content.length<r)&&h.push({level:a,message:bu(b,`章节 ${p} 低于 ${r} 字`)}),"table"===o.subject&&"min_count"===o.operator&&c.tables.length+l.length<r&&h.push({level:a,message:bu(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:bu(b,"存在缺少说明文字的表格")}),"image"===o.subject&&"min_count"===o.operator&&m.length<r&&h.push({level:a,message:bu(b,`图片数量少于 ${r}`)}),"page"===o.subject&&"min_count"===o.operator&&n<r&&h.push({level:a,message:bu(b,`预计页数 ${n} 少于 ${r}`)}),"page"===o.subject&&"max_count"===o.operator&&n>r&&h.push({level:a,message:bu(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:bu(b,"存在缺少说明文字的图片")}),"source"===o.subject&&"all_have_source"===o.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:bu(b,"存在无来源事实")}),"source"===o.subject&&"min_count"===o.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<r&&h.push({level:a,message:bu(b,`来源数量少于 ${r}`)})}return h}(ab,[...cd,...cJ.map(a=>({level:"warning",message:a}))],ca,cH,cI,ae,C)).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:cI,spec:ab,summary:ac})),cd.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:cI,facts:b3,summary:ac})),cd.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}(cI,ac)),cd.push(...function(a){let b=[],c=(0,o.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}
80
- ${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)),p=m.length?n.length/m.length:1,q=c?.minAssignedFactCountForBlocking??12;return l.length>=q&&p<(c?.minTechnicalFactUsageRate??.35)&&b.push({level:"error",message:`工程技术事实使用率不足:${Math.round(100*p)}%`,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:i,chapters:cH,assignments:a$,finalMarkdown:cI})),cd.push(...aa({assignments:a$,markdown:cI})),cd.push(...by(cI)),cd.push(...bv(cI)),cd.push(...bw(cI)),cd.push(...bO(cI)),cd.push(...bx(cH)),cd.push(...bz(cI,ca)),cd.push(...bA(cI)),c={template:i,chapters:cH,markdown:cI},(0,o.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}
81
- ${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}})))cd.push(...a.issues);cd.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:cI,chapters:cH,summary:ac,roles:af})),cd.push(...bB(cI,i));let cK=function(a,b){let{currentChars:c,estimatedPages:d}=bI(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}(bX,cH.map(a=>a.content).join("\n\n")),cL=(function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=bo(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})(i.generationSettings||i.exportSettings,cI).filter(a=>!(bX.minPages&&/低于目标页数/u.test(a.message)));cd.push(...cL),cd.push(...cK),cd.push(...bT(cI,i));let cM=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bn(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&&bn(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(cd,ca,cH),cN=cM.blockingIssues.length,cO=cD.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:cN>0?"failed":"success",message:`阻断 ${cN},问题 ${cd.length}`}:"export_ready"===a.type?{...a,status:cM.passed?"success":"failed",message:cM.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁存在阻断项"}:a);return{...cn,chapters:cH,validationIssues:cd,exportGate:cM,executionStages:cO,markdown:cI}}async function bX(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,j.aY)());if(!d)throw Error("No knowledge base project found");let f=(0,j.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 k=ar(i.filter(a=>bd(d,a.filePath,h)),g),l=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",m=new Set(a.existingFacts??[]),n=c.requiredFacts.filter(a=>!m.has(a)&&!k.some(b=>aE(b,a))),o=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",l?`> 当前文档上下文摘要:${l.replace(/\s+/gu," ").slice(0,800)}`:"",k.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",k.length>0?"### 资料依据":"",...k.map(at),"",n.length>0?"### 待确认事项":"",...n.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:o,evidence:k,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(`
79
+ ${c}`}(aY(cI,ch),cK))),cM=[...a2(ct,aZ,bG,bF,ch),...cu];for(let a of((cg=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=>aG(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>aG(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=bt(e),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0})),n=bo(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:bu(b,`缺少事实 ${p}`)}),"chapter"===o.subject&&"exists"===o.operator&&p&&!k.has(p)&&h.push({level:a,message:bu(b,`缺少章节 ${p}`)}),"file_role"===o.subject&&"exists"===o.operator&&p&&!f.some(a=>a.roleId===p)&&h.push({level:a,message:bu(b,`缺少文件角色 ${p}`)}),"prompt_role"===o.subject&&"exists"===o.operator&&p&&!g.some(a=>a.roleId===p)&&h.push({level:a,message:bu(b,`缺少提示词角色 ${p}`)}),"document"===o.subject&&"contains"===o.operator&&q&&!e.includes(q)&&h.push({level:a,message:bu(b,`全文必须包含 ${q}`)}),"document"===o.subject&&"not_contains"===o.operator&&q&&e.includes(q)&&h.push({level:a,message:bu(b,`出现禁用文本 ${q}`)}),"document"!==o.subject&&"chapter"!==o.subject||"regex_match"!==o.operator||!q||u&&u.test(t)||h.push({level:a,message:bu(b,`未匹配正则 ${q}`)}),("document"===o.subject||"chapter"===o.subject)&&"regex_not_match"===o.operator&&u?.test(t)&&h.push({level:a,message:bu(b,`匹配到禁止正则 ${q}`)}),"chapter"===o.subject&&"contains"===o.operator&&p&&q&&(!s||!s.content.includes(q))&&h.push({level:a,message:bu(b,`章节 ${p} 必须包含 ${q}`)}),"chapter"===o.subject&&"not_contains"===o.operator&&s?.content.includes(q)&&h.push({level:a,message:bu(b,`章节 ${p} 出现禁用文本 ${q}`)}),"chapter"===o.subject&&"min_length"===o.operator&&p&&(!s||s.content.length<r)&&h.push({level:a,message:bu(b,`章节 ${p} 低于 ${r} 字`)}),"table"===o.subject&&"min_count"===o.operator&&c.tables.length+l.length<r&&h.push({level:a,message:bu(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:bu(b,"存在缺少说明文字的表格")}),"image"===o.subject&&"min_count"===o.operator&&m.length<r&&h.push({level:a,message:bu(b,`图片数量少于 ${r}`)}),"page"===o.subject&&"min_count"===o.operator&&n<r&&h.push({level:a,message:bu(b,`预计页数 ${n} 少于 ${r}`)}),"page"===o.subject&&"max_count"===o.operator&&n>r&&h.push({level:a,message:bu(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:bu(b,"存在缺少说明文字的图片")}),"source"===o.subject&&"all_have_source"===o.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:bu(b,"存在无来源事实")}),"source"===o.subject&&"min_count"===o.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<r&&h.push({level:a,message:bu(b,`来源数量少于 ${r}`)})}return h}(ab,[...cg,...cM.map(a=>({level:"warning",message:a}))],cd,cK,cL,ae,C)).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:cL,spec:ab,summary:ac})),cg.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:cL,facts:b6,summary:ac})),cg.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}(cL,ac)),cg.push(...function(a){let b=[],c=(0,o.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}
80
+ ${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)),p=m.length?n.length/m.length:1,q=c?.minAssignedFactCountForBlocking??12;return l.length>=q&&p<(c?.minTechnicalFactUsageRate??.35)&&b.push({level:"error",message:`工程技术事实使用率不足:${Math.round(100*p)}%`,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:j,chapters:cK,assignments:a$,finalMarkdown:cL})),cg.push(...aa({assignments:a$,markdown:cL})),cg.push(...by(cL)),cg.push(...bv(cL)),cg.push(...bw(cL)),cg.push(...bO(cL)),cg.push(...bx(cK)),cg.push(...bz(cL,cd)),cg.push(...bA(cL)),c={template:j,chapters:cK,markdown:cL},(0,o.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}
81
+ ${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}})))cg.push(...a.issues);cg.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:cL,chapters:cK,summary:ac,roles:af})),cg.push(...bB(cL,j));let cN=function(a,b){let{currentChars:c,estimatedPages:d}=bI(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}(b$,cK.map(a=>a.content).join("\n\n")),cO=(function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=bo(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})(j.generationSettings||j.exportSettings,cL).filter(a=>!(b$.minPages&&/低于目标页数/u.test(a.message)));cg.push(...cO),cg.push(...cN),cg.push(...bT(cL,j));let cP=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bn(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&&bn(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(cg,cd,cK),cQ=cP.blockingIssues.length,cR=cG.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:cQ>0?"failed":"success",message:`阻断 ${cQ},问题 ${cg.length}`}:"export_ready"===a.type?{...a,status:cP.passed?"success":"failed",message:cP.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁存在阻断项"}:a);return{...cq,chapters:cK,validationIssues:cg,exportGate:cP,executionStages:cR,markdown:cL}}async function bX(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,k.aY)());if(!d)throw Error("No knowledge base project found");let f=(0,k.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=ar(i.filter(a=>bd(d,a.filePath,h)),g),l=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",m=new Set(a.existingFacts??[]),n=c.requiredFacts.filter(a=>!m.has(a)&&!j.some(b=>aE(b,a))),o=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",l?`> 当前文档上下文摘要:${l.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(`
82
82
  SELECT * FROM memories
83
83
  WHERE context LIKE ? AND (${h})
84
84
  ORDER BY access_count DESC, updated_at DESC