@customize-agent/server 4.0.41 → 4.0.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/6697.js +9 -9
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/context/long-term.html +1 -1
- package/.next/server/pages/context/short-term.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/search.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +19 -19
- package/package.json +3 -3
- /package/.next/static/{ylFmZtWjQgli0L2BJjbVg → j7QTBGdHsR4TQE4meLMK3}/_buildManifest.js +0 -0
- /package/.next/static/{ylFmZtWjQgli0L2BJjbVg → j7QTBGdHsR4TQE4meLMK3}/_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:()=>am,bV:()=>an,OX:()=>bE,jG:()=>ai,R1:()=>bF,Bh:()=>ak,xm:()=>al});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)))}function y(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:"error",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:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...k?[{id:"configured-min-table-count",name:`配置要求正式表格不少于 ${k} 个`,type:"configured_table_density",level:"error",evaluator:{subject:"table",operator:"min_count",min:k}}]:[],...f.map(a=>({id:`user-required-chapter-${u(a)}`,name:`用户要求章节:${a}`,type:"user_required_chapter",level:"error",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:"error",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:"error",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户要求页数不少于 ${i.min}`,type:"user_page_target",level:"error",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}}]:[]],z=[...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:z.length>0?"fixed":"dynamic",chapterRules:z,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:2,titleStrategy:"template",minWordsPerChapter:900,generationHint:`按${d}正式文件要求,在评审标准或模板章节基础上最多动态补充 2 章,不得重新规划整份目录。`},gateRules:s,builtIn:!0}}}let z=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],A=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function B(a){return[...new Set(a.filter(Boolean))]}function C(a){return B(a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).map(a=>a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()).filter(a=>/项目|工程|标段|合同段/iu.test(a)&&a.length>=6)).slice(0,12)}function D(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function E(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function F(a){let b=E(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function G(a,b){let c=(0,j.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(E)),e=c.filter(a=>{let b=E(a.relativePath);return d.has(b)||[...d].some(a=>b.endsWith(a)||a.endsWith(b))});if(e.length>0){let a=[...new Set(e.map(a=>F(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:b?c.filter(a=>F(a.relativePath)===b):e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板绑定文件作为资料范围",ambiguous:a.length>1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=F(b.relativePath);if(!c)continue;let d=c.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u).map(a=>a.trim()).filter(a=>a.length>=2).reduce((a,b)=>a+ +!!f.includes(b),0);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>F(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>F(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>F(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),f=d.files,g=function(){let a={};for(let b of A)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[E(a.filePath),a.roles]));for(let a of f){let b=E(a.relativePath),c=[...h.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(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=C(a),d=C(b),e=B(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=B(a.map(a=>F(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,tenderNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a)).slice(0,20)}}(f,c),m=function(a){let b=a.map(a=>a.relativePath).join("\n");return{ownerNames:B([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:B([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:B([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:B([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=z.filter(a=>g[a].length>0),o=z.filter(a=>0===g[a].length);return{projectId:i.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:i,generatedAt:Date.now(),fingerprint: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:`施工范围资料:${D(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${D(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${D(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${D(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:z,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:z.length?n.length/z.length:1}}}function H(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}let I=[["土建砌筑",/砌筑|砌块|构造柱|混凝土|砂浆|灰缝|钢筋|植筋|墙体|圈梁/u],["防水工程",/防水|闭水|蓄水|JS|涂膜|卷材|阴阳角|管根|上翻/u],["装饰装修",/地砖|墙砖|吊顶|铝扣板|涂料|腻子|乳胶漆|水磨石|面层|基层|抹灰/u],["给排水",/给水|排水|PPR|PVC|管道|阀门|水压|通球|闭水|检查井|隔油池/u],["电气工程",/电气|配电|电缆|桥架|线管|开关|插座|照明|绝缘|接地|通电/u],["消防工程",/消防|消火栓|喷淋|报警|联动|防火|灭火器|水泵接合器/u],["暖通排烟",/暖通|通风|排烟|风管|风机|风口|油烟|净化|排风|防火阀/u],["厨房设备",/厨房|灶具|洗菜池|设备|明厨亮灶|食品|不锈钢|操作台/u],["安全文明",/临时用电|动火|高处|扬尘|噪声|围挡|应急|文明施工|安全教育/u]],J=/(?:[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,K=/\d+(?:\.\d+)?\s*(?:㎡|m²|m3|立方米|平方米|米|台|套|个|根|项|批|所|人|班组|工日|学校|校区|片区)/giu,L=/\d+(?:\.\d+)?\s*(?:日历天|工作日|小时内|小时|h|分钟|min|日内|天内|个月|周|天)|(?:每日|每天|每周|每月|每班|日清|周结|旬考核)/giu,M=/\d+(?:\.\d+)?\s*(?:万元|元|%\/天|‰|%|违约金|处罚|合同价|中标价)/giu,N=/(?:每日|每天|每周|每月|每班|每道工序|不少于\d+次|\d+次|\d+%|100%|全数|全部|一次性|每月不少于一次)/giu,O=/\d+(?:\.\d+)?\s*(?:人|班组|台|套|辆|名|个片区|片区)|(?:项目经理|安全员|质量员|施工员|材料员|资料员|专业工程师|专职巡查|应急小组)/giu,P=/\b(?:GB|GB\/T|JGJ|JGJ\/T|CJJ|CJJ\/T|CECS|DB\d*|GA)\s*\d+(?:[-—]\d+)?\b/giu,Q=["施工准备","基层处理","测量放线","弹线","样板","复核","安装","连接","热熔","粘结","涂刷","附加层","隐蔽验收","调试","联动","养护","成品保护"],R=["验收","检测","试验","复试","闭水","蓄水","打压","水压","通球","绝缘","接地","联动","允许偏差","合格"],S=["质量控制","饱满度","平整度","垂直度","偏差","强度","厚度","间距","标高","坡度","密封","防渗","防火"],T=["安全","临电","动火","高处","交叉作业","防护","扬尘","噪声","应急","消防","有限空间"],U=["危大工程","危险性较大","专项施工方案","专家论证","有限空间","高处作业","动火作业","临时用电","拆除工程","起重吊装","脚手架","深基坑","模板支撑"],V=["分部分项","分项工程","拆除","砌筑","防水","装饰","吊顶","涂料","给排水","电气","消防","暖通","排烟","厨房设备","明厨亮灶","隔油池"],W=["严格按照规范","满足设计要求","加强质量控制","做好安全管理","确保施工质量","按要求验收","结合现场情况","加强协调","做好成品保护","相关要求","规范要求"];function X(a){return a.replace(/\s+/gu," ").trim()}function Y(a){return[...new Set(a.map(a=>a.trim()).filter(Boolean))]}function Z(a,b){b.lastIndex=0;let c=[...a.matchAll(b)].map(a=>a[0]);return b.lastIndex=0,Y(c)}function $(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 aa(a){return a.filter(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].length>0)}function ab(a){let b=[],c=a.markdown.replace(/\s+/gu,"");for(let d of a.assignments){let a=aa(d.facts);if(a.length<3)continue;let e=Y(a.map(_).filter(a=>a.length>=2)).slice(0,18),f=Y(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 ac(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function ad(){return e.join(ac(),"document-templates.json")}function ae(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 af(){try{let a=ad();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(ae)}catch{return[]}}function ag(a){d.writeFileSync(ad(),JSON.stringify(a.map(ae),null,2),"utf-8")}function ah(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(ac(),"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 ai(){let a=(0,o.V)().templates,b=af().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function aj(a){return ai().find(b=>b.id===a)}function ak(a){let b=ae(a),c=af().filter(a=>a.id!==b.id);return c.push(b),ag(c),b}async function al(a,b=(0,j.aY)()){let c=aj(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=a4(c),i=a5(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let k=a9(c),l=ba(c);0===k.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=y(c).spec;"fixed"===n.chapterMode&&0===n.chapterRules.filter(a=>a.required).length&&d.push({level:"warning",message:"后台自动规范未形成必需章节规则"}),"dynamic"===n.chapterMode&&n.dynamicChapterRule.maxChapters&&n.dynamicChapterRule.minChapters&&n.dynamicChapterRule.maxChapters<n.dynamicChapterRule.minChapters&&d.push({level:"error",message:"后台自动规范动态章节规则异常"});let o=e.resolve(b),p=await (0,j.Qh)().getProject(o);c.builtIn&&await p.incrementalIndex();let q=(0,j.Yy)(o),r=G(o,{boundFilePaths:l.map(a=>a.filePath),boundFileRoles:a7(l)}),s=l.length>0?l:a8(c,r),t=s.length>0?s:l;0===t.length&&d.push({level:"error",message:"未从当前项目资料中解析到可用文件角色,请先确认知识库已上传并索引项目资料,或在模板高级固定绑定资料中手动指定文件"});let u=new Map(q.map(a=>[a.relativePath,a])),v=t.map(a=>{let b=g.find(b=>b.id===a.roleId),c=u.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)}}),w=ah(k);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:v,promptDiagnostics:k.map(a=>{let b=f.find(b=>b.id===a.roleId),c=w.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 am(a){if(new Set((0,o.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");ag(af().filter(b=>b.id!==a))}function an(a){let b=aj(a);if(!b)throw Error("Document template not found");let c=ae({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=af();return d.push(c),ag(d),c}let ao=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ap=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function aq(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(ap,"").slice(0,40)})`:""}`}function ar(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(ao,"").replace(ap,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function as(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase(),d=ar(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 at(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function au(a,b=0){return`- ${aq(a,b)}:${ar(a.content).replace(/\s+/gu," ").slice(0,260)}`}function av(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-完整地图图纸$/u,"完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明空间关系、区域划分、点位、路线或专业布置。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、清单、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
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:()=>am,bV:()=>an,OX:()=>bG,jG:()=>ai,R1:()=>bH,Bh:()=>ak,xm:()=>al});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)))}function y(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:"error",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:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...k?[{id:"configured-min-table-count",name:`配置要求正式表格不少于 ${k} 个`,type:"configured_table_density",level:"error",evaluator:{subject:"table",operator:"min_count",min:k}}]:[],...f.map(a=>({id:`user-required-chapter-${u(a)}`,name:`用户要求章节:${a}`,type:"user_required_chapter",level:"error",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:"error",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:"error",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户要求页数不少于 ${i.min}`,type:"user_page_target",level:"error",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}}]:[]],z=[...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:z.length>0?"fixed":"dynamic",chapterRules:z,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:2,titleStrategy:"template",minWordsPerChapter:900,generationHint:`按${d}正式文件要求,在评审标准或模板章节基础上最多动态补充 2 章,不得重新规划整份目录。`},gateRules:s,builtIn:!0}}}let z=["project_overview","tender_document","addendum","bill_of_quantities","drawings","schedule_quality_safety","construction_scope"],A=["project_overview","tender_document","addendum","bill_of_quantities","control_price","drawings","brand_recommendation","schedule_quality_safety","construction_scope","technical_specification","risk_constraints"];function B(a){return[...new Set(a.filter(Boolean))]}function C(a){return B(a.flatMap(a=>a.relativePath.split(/[\\/]/gu)).map(a=>a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()).filter(a=>/项目|工程|标段|合同段/iu.test(a)&&a.length>=6)).slice(0,12)}function D(a,b){return 0===a.length?b:a.slice(0,8).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")).join("、")}function E(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function F(a){let b=E(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function G(a,b){let c=(0,j.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(E)),e=c.filter(a=>{let b=E(a.relativePath);return d.has(b)||[...d].some(a=>b.endsWith(a)||a.endsWith(b))});if(e.length>0){let a=[...new Set(e.map(a=>F(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:b?c.filter(a=>F(a.relativePath)===b):e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板绑定文件作为资料范围",ambiguous:a.length>1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=F(b.relativePath);if(!c)continue;let d=c.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u).map(a=>a.trim()).filter(a=>a.length>=2).reduce((a,b)=>a+ +!!f.includes(b),0);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>F(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>F(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>F(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),f=d.files,g=function(){let a={};for(let b of A)a[b]=[];return a}(),h=new Map((b?.boundFileRoles||[]).map(a=>[E(a.filePath),a.roles]));for(let a of f){let b=E(a.relativePath),c=[...h.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(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=C(a),d=C(b),e=B(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=B(a.map(a=>F(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,tenderNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a)).slice(0,20)}}(f,c),m=function(a){let b=a.map(a=>a.relativePath).join("\n");return{ownerNames:B([...b.matchAll(/(?:建设单位|招标人|采购人)[::]?([^\\/\n,,。;;]{2,40})/gu)].map(a=>a[1].trim())).slice(0,8),locationNames:B([...b.matchAll(/(?:建设地点|项目地点|工程地点)[::]?([^\\/\n,,。;;]{2,50})/gu)].map(a=>a[1].trim())).slice(0,8),scheduleValues:B([...b.matchAll(/(\d+\s*(?:日历天|天|个月|月)|工期[^\\/\n,,。;;]{0,30})/gu)].map(a=>a[1].trim())).slice(0,8),qualityTargets:B([...b.matchAll(/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu)].map(a=>a[0].trim())).slice(0,8)}}(f),n=z.filter(a=>g[a].length>0),o=z.filter(a=>0===g[a].length);return{projectId:i.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:i,generatedAt:Date.now(),fingerprint: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:`施工范围资料:${D(g.construction_scope,"未识别到明确施工范围专项资料")}。`,drawingSummary:`图纸资料:${D(g.drawings,"未识别到图纸资料")}。`,boqSummary:`清单资料:${D(g.bill_of_quantities,"未识别到工程量清单资料")}。`,scheduleQualitySafetySummary:`工期质量安全资料:${D(g.schedule_quality_safety,"未识别到工期质量安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${D(g.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:z,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:z.length?n.length/z.length:1}}}function H(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}let I=[["土建砌筑",/砌筑|砌块|构造柱|混凝土|砂浆|灰缝|钢筋|植筋|墙体|圈梁/u],["防水工程",/防水|闭水|蓄水|JS|涂膜|卷材|阴阳角|管根|上翻/u],["装饰装修",/地砖|墙砖|吊顶|铝扣板|涂料|腻子|乳胶漆|水磨石|面层|基层|抹灰/u],["给排水",/给水|排水|PPR|PVC|管道|阀门|水压|通球|闭水|检查井|隔油池/u],["电气工程",/电气|配电|电缆|桥架|线管|开关|插座|照明|绝缘|接地|通电/u],["消防工程",/消防|消火栓|喷淋|报警|联动|防火|灭火器|水泵接合器/u],["暖通排烟",/暖通|通风|排烟|风管|风机|风口|油烟|净化|排风|防火阀/u],["厨房设备",/厨房|灶具|洗菜池|设备|明厨亮灶|食品|不锈钢|操作台/u],["安全文明",/临时用电|动火|高处|扬尘|噪声|围挡|应急|文明施工|安全教育/u]],J=/(?:[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,K=/\d+(?:\.\d+)?\s*(?:㎡|m²|m3|立方米|平方米|米|台|套|个|根|项|批|所|人|班组|工日|学校|校区|片区)/giu,L=/\d+(?:\.\d+)?\s*(?:日历天|工作日|小时内|小时|h|分钟|min|日内|天内|个月|周|天)|(?:每日|每天|每周|每月|每班|日清|周结|旬考核)/giu,M=/\d+(?:\.\d+)?\s*(?:万元|元|%\/天|‰|%|违约金|处罚|合同价|中标价)/giu,N=/(?:每日|每天|每周|每月|每班|每道工序|不少于\d+次|\d+次|\d+%|100%|全数|全部|一次性|每月不少于一次)/giu,O=/\d+(?:\.\d+)?\s*(?:人|班组|台|套|辆|名|个片区|片区)|(?:项目经理|安全员|质量员|施工员|材料员|资料员|专业工程师|专职巡查|应急小组)/giu,P=/\b(?:GB|GB\/T|JGJ|JGJ\/T|CJJ|CJJ\/T|CECS|DB\d*|GA)\s*\d+(?:[-—]\d+)?\b/giu,Q=["施工准备","基层处理","测量放线","弹线","样板","复核","安装","连接","热熔","粘结","涂刷","附加层","隐蔽验收","调试","联动","养护","成品保护"],R=["验收","检测","试验","复试","闭水","蓄水","打压","水压","通球","绝缘","接地","联动","允许偏差","合格"],S=["质量控制","饱满度","平整度","垂直度","偏差","强度","厚度","间距","标高","坡度","密封","防渗","防火"],T=["安全","临电","动火","高处","交叉作业","防护","扬尘","噪声","应急","消防","有限空间"],U=["危大工程","危险性较大","专项施工方案","专家论证","有限空间","高处作业","动火作业","临时用电","拆除工程","起重吊装","脚手架","深基坑","模板支撑"],V=["分部分项","分项工程","拆除","砌筑","防水","装饰","吊顶","涂料","给排水","电气","消防","暖通","排烟","厨房设备","明厨亮灶","隔油池"],W=["严格按照规范","满足设计要求","加强质量控制","做好安全管理","确保施工质量","按要求验收","结合现场情况","加强协调","做好成品保护","相关要求","规范要求"];function X(a){return a.replace(/\s+/gu," ").trim()}function Y(a){return[...new Set(a.map(a=>a.trim()).filter(Boolean))]}function Z(a,b){b.lastIndex=0;let c=[...a.matchAll(b)].map(a=>a[0]);return b.lastIndex=0,Y(c)}function $(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 aa(a){return a.filter(a=>[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].length>0)}function ab(a){let b=[],c=a.markdown.replace(/\s+/gu,"");for(let d of a.assignments){let a=aa(d.facts);if(a.length<3)continue;let e=Y(a.map(_).filter(a=>a.length>=2)).slice(0,18),f=Y(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 ac(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function ad(){return e.join(ac(),"document-templates.json")}function ae(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 af(){try{let a=ad();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(ae)}catch{return[]}}function ag(a){d.writeFileSync(ad(),JSON.stringify(a.map(ae),null,2),"utf-8")}function ah(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(ac(),"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 ai(){let a=(0,o.V)().templates,b=af().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function aj(a){return ai().find(b=>b.id===a)}function ak(a){let b=ae(a),c=af().filter(a=>a.id!==b.id);return c.push(b),ag(c),b}async function al(a,b=(0,j.aY)()){let c=aj(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=a4(c),i=a5(c);h||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),h&&!i&&d.push({level:"error",message:`项目角色配置不存在或已删除:${h}`});let k=a9(c),l=ba(c);0===k.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=y(c).spec;"fixed"===n.chapterMode&&0===n.chapterRules.filter(a=>a.required).length&&d.push({level:"warning",message:"后台自动规范未形成必需章节规则"}),"dynamic"===n.chapterMode&&n.dynamicChapterRule.maxChapters&&n.dynamicChapterRule.minChapters&&n.dynamicChapterRule.maxChapters<n.dynamicChapterRule.minChapters&&d.push({level:"error",message:"后台自动规范动态章节规则异常"});let o=e.resolve(b),p=await (0,j.Qh)().getProject(o);c.builtIn&&await p.incrementalIndex();let q=(0,j.Yy)(o),r=G(o,{boundFilePaths:l.map(a=>a.filePath),boundFileRoles:a7(l)}),s=l.length>0?l:a8(c,r),t=s.length>0?s:l;0===t.length&&d.push({level:"error",message:"未从当前项目资料中解析到可用文件角色,请先确认知识库已上传并索引项目资料,或在模板高级固定绑定资料中手动指定文件"});let u=new Map(q.map(a=>[a.relativePath,a])),v=t.map(a=>{let b=g.find(b=>b.id===a.roleId),c=u.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)}}),w=ah(k);return{templateId:a,projectRoleConfigId:h,fileDiagnostics:v,promptDiagnostics:k.map(a=>{let b=f.find(b=>b.id===a.roleId),c=w.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 am(a){if(new Set((0,o.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");ag(af().filter(b=>b.id!==a))}function an(a){let b=aj(a);if(!b)throw Error("Document template not found");let c=ae({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=af();return d.push(c),ag(d),c}let ao=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ap=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function aq(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(ap,"").slice(0,40)})`:""}`}function ar(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(ao,"").replace(ap,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function as(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase(),d=ar(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 at(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function au(a,b=0){return`- ${aq(a,b)}:${ar(a.content).replace(/\s+/gu," ").slice(0,260)}`}function av(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-完整地图图纸$/u,"完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明空间关系、区域划分、点位、路线或专业布置。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、清单、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
5
5
|
${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>aG(a,b)||c.includes(b)))]}(c,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),d.set(c.filePath,f)}let f=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of f)g[a.kind].push(a);let h=[`内部资料包:文本片段 ${c.length} 条、结构化资料 ${f.length} 个。`,`资料类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格/清单 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、图纸 ${g.map.length}、其他 ${g.attachment.length}。`,"正文必须只写资料中的工程事实、参数、数量、做法和控制措施,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:f,byKind:g,summary:h}}function aw(a){let b=a.resources.slice(0,20).map((a,b)=>[`- 资料:${aq(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(ar).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map((a,b)=>`${aq(a,b)}
|
|
6
6
|
类型:${a.processingType||"reference"}
|
|
7
7
|
章节/片段:${a.sectionTitle?.replace(ap,"")||"资料片段"}
|
|
@@ -47,21 +47,21 @@ ${b.sections.map(a=>`- ${a}`).join("\n")}`:"本章未预设二级小节,请根
|
|
|
47
47
|
${f}`:"",i.tenderAnnouncementContext||"",!i.tenderAnnouncementContext?"本章不得重复设置“项目基本信息”“项目基本信息表”“招标公告项目基本信息”等小节或表格;项目基本信息只允许出现在第一章。":"",h||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:","- 保留章节标题;如模板配置了小节,必须按配置生成;如未配置小节,必须结合本章内容自行生成 3-6 个正式二级小节,且小节不能为空;不要无依据地拆分过细小节;",b.tableSections?.length?`- 本章以下小节适合使用正式工程表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴证据摘录。`:"","- 表格只用于工程概况、施工部署、重点难点、资源配置、质量安全控制、验收移交等适合结构化表达的位置;项目基本信息已表格化时,表格前只保留一句引导语,不得逐项重复叙述同一批字段;其他表格前后必须有说明,不能整节只有表格。","- 不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入施工对象、工艺动作、控制措施、检查验收和责任闭环。","- 二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 管沟开挖”;三级小节不纳入目录;不得使用无编号独立加粗行表示三级小节。","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、技术规范等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 日期、数量、数值、规格、工程量、工期、资源配置等量化内容必须来自资料或明确推导;无依据时不得编造具体值。","- 如果同一施工方案、工艺或措施适用于多个部位、区域、学校、片区或分项,必须逐项覆盖适用范围和对应工程量,不得只写其中一个数量。","- 对工程类章节,必须把工程技术事实表和量化事实覆盖矩阵中的参数、规格、数量、部位、工艺动作、试验验收和规范标准落到正文;禁止用“按设计要求、按规范要求、加强管理”等空泛表述替代已知事实;","- 存在事实冲突时,按后台自动规范、文件角色、提示词角色和用户要求指定的优先级处理;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,除非规范包或提示词要求,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",`- 内容不少于 ${i.minWords||1e3} 字,避免空泛口号。`,"",j?"内部资料:":"",j].filter(Boolean).join("\n"),m=await be(k,l);if(m&&!(m.length<120))return a0(aY(m.startsWith("## ")?m:`## ${b.title}
|
|
48
48
|
|
|
49
49
|
${m}`,!!i.forbidDrawingImages))}async function bu(a){let b=aw(av({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?[`规范包:${a.spec.name}`,`事实字段:${a.spec.factFields.map(a=>`${a.name}${a.required?"(必需)":""}`).join("、")}`,"dynamic"===a.spec.chapterMode?`章节规则:动态章节|来源=${a.spec.dynamicChapterRule.source}|标题=${a.spec.dynamicChapterRule.titleStrategy||"ai_summary"}|${a.spec.dynamicChapterRule.generationHint||"由资料自动规划"}`:`章节规则:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`≥${a.minWords}字`:""}`).join("、")}`,`门禁规则:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}`].join("\n"):"后台自动规范未生成。",d=await be(["你是文档质量审查与优化专家。你要基于模板、后台自动规范、提示词角色和内部资料对初稿进行二次审查和优化,使其成为正式业务文档。",a1,"准确性优先级:后台自动规范/模板要求 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能用于风格偏好、历史纠偏和连续性检查;如果与知识库证据冲突,必须以知识库证据为准。","必须保持 Markdown 输出;必须保留文档开头的“## 目录”,目录必须是父子级导航结构:一级章单独成行,二级小节缩进列在所属章下方,三级小节不纳入目录;不得平铺成同级列表;不得删除目录页、页分隔符或已有正式标题层级和表格;不得保留或新增证据来源、资料来源、缺失项、校验结果等后台信息。","项目基本信息、项目基本信息表、招标公告基本信息只允许保留在第一章;后续章节如重复出现,应删除并替换为该章对应的分项、工艺、参数、资源、质量安全等内容。","图片/图纸类资料默认只作为文本事实依据,除非用户明确要求插图,否则不要插入图片或 Markdown 图片语法;不得引用 PDF/DWG/Excel 文件名。","重点检查:正式章节完整性、资料事实内化使用、参数数字准确性、冲突事实是否按配置优先级处理、解析器内部对象名清理、表格呈现、表达专业性、导出友好性。","必须检查日期、数量、数值、单位、规格、工程量和资源数量是否有资料依据;同一方案涉及多个部位/区域/学校/片区/分项时,必须检查是否逐项覆盖。","除非后台自动规范或提示词明确要求,删除中间分析产物标题和后台流程说明。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
50
|
-
${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","请直接返回优化后的完整正式 Markdown,不要附加解释。"].filter(Boolean).join("\n"));return d&&!(d.length<.7*a.markdown.length)&&d.includes("#")?{markdown:a0(d),stage:{type:"llm_review",roleId:"llm-review",status:"success",message:"已完成 LLM 二次审查与优化"}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:"skipped",message:"无可用模型或审查结果不可用,保留生成初稿"}}}function bv(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>ay(a[1]||"")).filter(a=>a.length>=2&&a.length<=80))].slice(0,12)}function bw(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=ay(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function bx(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;if(!c)return a;let e=/^####\s+(.+)$/u.exec(a.trim());if(e){let b=(e[1]||"").trim();if(/^\d+\.\d+\.\d+\s+\S/u.test(b))return a;let f=ay(b);return d+=1,`#### ${c}.${d} ${f}`}let f=bw(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function by(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(`^${
|
|
50
|
+
${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","请直接返回优化后的完整正式 Markdown,不要附加解释。"].filter(Boolean).join("\n"));return d&&!(d.length<.7*a.markdown.length)&&d.includes("#")?{markdown:a0(d),stage:{type:"llm_review",roleId:"llm-review",status:"success",message:"已完成 LLM 二次审查与优化"}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:"skipped",message:"无可用模型或审查结果不可用,保留生成初稿"}}}function bv(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>ay(a[1]||"")).filter(a=>a.length>=2&&a.length<=80))].slice(0,12)}function bw(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=ay(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function bx(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;if(!c)return a;let e=/^####\s+(.+)$/u.exec(a.trim());if(e){let b=(e[1]||"").trim();if(/^\d+\.\d+\.\d+\s+\S/u.test(b))return a;let f=ay(b);return d+=1,`#### ${c}.${d} ${f}`}let f=bw(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function by(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(`^${bC(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${ay(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}let g=bw(a);g&&b.push({level:"warning",message:`独立加粗行疑似未编号三级小节:${g}`,suggestion:"请改为“#### 章号.节号.序号 标题”,不要用无编号加粗行表示三级小节。"})}return b.slice(0,20)}function bz(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[aB(b,a.title),"",...c.flatMap((a,c)=>[` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`,""])]})].join("\n")}function bA(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 bB(a,b){let c=bA(a);b.forEach((a,b)=>{let d=ay(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${bC(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${aB(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0;return d.map(a=>{let b=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(b))return e+=1,f=0,a;let c=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(b);if(e>=0&&c)return f=Number(c[2])||f+1,`### ${e+1}.${f} ${ay(c[3]||"")}`;let d=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(b);return e>=0&&d?(f+=1,`### ${e+1}.${f} ${ay(d[3]||"")}`):a}).join("\n")}function bC(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function bD(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=ay(b),d=RegExp(`(^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${bC(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+(?:${bC(a)}|(?:\\d+(?:\\.\\d+)+\\s+)?${bC(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 bE(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${aB(b,a.title)}`,d=a0(a.content);return/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
|
|
51
51
|
|
|
52
|
-
${d}`})(a,b)).filter(Boolean).join("\n\n"),c=bz(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
|
|
52
|
+
${d}`})(a,b)).filter(Boolean).join("\n\n"),c=bz(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 bF(a){if(a?.aborted)throw Error("用户中止")}async function bG(a){var b,c;bF(a.signal);let g=aj(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)(),n=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),p=a4(i)||"none",q=(0,m.Mu)(p)?.name||p,r=a9(i),u=ba(i),v=y(i,a.requirement||""),w=v.spec,x=G(h,{requirement:a.requirement,boundFilePaths:u.map(a=>a.filePath),boundFileRoles:a7(u)}),z=u.length>0?u:a8(i,x),A=z.length>0?z:u,B=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,x),C=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&&0===a.spec.chapterRules.length&&"dynamic"!==a.spec.chapterMode&&e.push("模板缺少章节,后台自动规范无法形成稳定结构"),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||"dynamic"===a.spec.chapterMode,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:w,summary:x,resolvedRoles:B});if(!C.ready)throw Error(`生成准备度不足:${C.blockingIssues.join(";")}`);let D=[["## 后台项目资料摘要",x.extractedSections.projectOverview,`项目指纹:项目名候选 ${x.fingerprint.projectNames.join("、")||"无"};编号 ${x.fingerprint.tenderNos.join("、")||"无"};资料组 ${x.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*x.fingerprint.confidence)}%。`,`内容级事实候选:建设/招标单位 ${x.facts.ownerNames?.join("、")||"无"};地点 ${x.facts.locationNames?.join("、")||"无"};工期 ${x.facts.scheduleValues?.join("、")||"无"};质量 ${x.facts.qualityTargets?.join("、")||"无"}。`,x.extractedSections.scopeSummary,x.extractedSections.boqSummary,x.extractedSections.drawingSummary,x.extractedSections.scheduleQualitySafetySummary,x.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*x.coverage.materialCompletenessRate)}%`].join("\n"),(b=v.sourceHash,`## 后台自动文档规范
|
|
53
53
|
规范:${w.name}
|
|
54
54
|
版本标识:${b}
|
|
55
55
|
事实字段:${w.factFields.map(a=>`${a.name}${a.required?"(必需)":""}`).join("、")}
|
|
56
56
|
章节规则:${"fixed"===w.chapterMode?w.chapterRules.map(a=>a.title).join("、"):w.dynamicChapterRule.generationHint}
|
|
57
|
-
校验规则:${w.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${C.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*C.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*C.roleSatisfactionRate)}%`,`规范完整度:${Math.round(100*C.specCompletenessRate)}%`,C.missingRoles.length?`缺失角色:${C.missingRoles.join("、")}`:"",C.weakRoles.length?`较弱角色:${C.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),E=[D,bb(r,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),F=[D,bb(r,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),ac=[D,bb(r,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n"),ad=(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}|${ax})[章节]|[((]?(?:\\d{1,3}|${ax})[))、..])`;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}|${ax})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${ax})[))、..]\\s*`,"u"),"").replace(/\s+/gu," ").trim()).filter(a=>!(a.length<2||a.length>80||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(a)||/^(必须|不得|禁止|需要|请|应|输出|返回|使用|格式|示例)/u.test(a)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(a)))}(d))c.push({id:`explicit-${b}-${c.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return aD(c).slice(0,80)}(b.text||"",b.source);if(a.length>=2)return a}return[]})([{text:a.requirement,source:"用户需求"},{text:bb(r,["chapter_generation","formatting","reference"]),source:"提示词角色"}]).filter(a=>{var b;return b=a.title,!aM(g).some(a=>!!a.minLength&&b.length<a.minLength||!!a.maxLength&&b.length>a.maxLength||a.forbiddenPatterns.some(a=>aL(b,a)))}),ae=ad.length>=2;ae&&(i={...g,chapters:ad});let af=a=>[a,e.isAbsolute(a)?e.relative(h,a):e.join(h,a)],ag=new Set(A.flatMap(a=>af(a.filePath))),ai=new Set(Object.values(x.materialInventory).flat().flatMap(a=>af(a.filePath))),ak=ag.size>0?ag:ai,al=(0,m.XB)("file"),am=new Map(A.flatMap(a=>af(a.filePath).map(b=>[b,a.roleId]))),an=new Map(A.flatMap(a=>af(a.filePath).map(b=>[b,al.find(b=>b.id===a.roleId)?.processingType||"reference"]))),aq=await l.getProject(h);await aq.incrementalIndex(),
|
|
57
|
+
校验规则:${w.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${C.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*C.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*C.roleSatisfactionRate)}%`,`规范完整度:${Math.round(100*C.specCompletenessRate)}%`,C.missingRoles.length?`缺失角色:${C.missingRoles.join("、")}`:"",C.weakRoles.length?`较弱角色:${C.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),E=[D,bb(r,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),F=[D,bb(r,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),ac=[D,bb(r,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n"),ad=(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}|${ax})[章节]|[((]?(?:\\d{1,3}|${ax})[))、..])`;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}|${ax})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${ax})[))、..]\\s*`,"u"),"").replace(/\s+/gu," ").trim()).filter(a=>!(a.length<2||a.length>80||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(a)||/^(必须|不得|禁止|需要|请|应|输出|返回|使用|格式|示例)/u.test(a)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(a)))}(d))c.push({id:`explicit-${b}-${c.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a},二级小节由模型结合本章内容自行组织且不能为空。`,requiredFacts:[],sections:[],queries:[a]});return aD(c).slice(0,80)}(b.text||"",b.source);if(a.length>=2)return a}return[]})([{text:a.requirement,source:"用户需求"},{text:bb(r,["chapter_generation","formatting","reference"]),source:"提示词角色"}]).filter(a=>{var b;return b=a.title,!aM(g).some(a=>!!a.minLength&&b.length<a.minLength||!!a.maxLength&&b.length>a.maxLength||a.forbiddenPatterns.some(a=>aL(b,a)))}),ae=ad.length>=2;ae&&(i={...g,chapters:ad});let af=a=>[a,e.isAbsolute(a)?e.relative(h,a):e.join(h,a)],ag=new Set(A.flatMap(a=>af(a.filePath))),ai=new Set(Object.values(x.materialInventory).flat().flatMap(a=>af(a.filePath))),ak=ag.size>0?ag:ai,al=(0,m.XB)("file"),am=new Map(A.flatMap(a=>af(a.filePath).map(b=>[b,a.roleId]))),an=new Map(A.flatMap(a=>af(a.filePath).map(b=>[b,al.find(b=>b.id===a.roleId)?.processingType||"reference"]))),aq=await l.getProject(h);await aq.incrementalIndex(),bF(a.signal);let au=[],av=[],aw=[],aP=[],aQ=[],aR=[],aU=[],aZ=function(a,b,c){let d=(0,m.XB)("file"),e=(0,m.XB)("prompt"),f=ah(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=aJ(`${a} ${c.join(" ")}`),e=aJ(`${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(aJ(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=aJ(`${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,r,A),a$=[];for(let b of aZ){bF(a.signal);let c=function(a,b,c){let d=[];for(let e of b.filePaths){let f=a.getFileDetail(e);if(f){d.push(...f.chunks.slice(0,120).map(a=>({chapterId:b.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:b.fileRoleId,processingType:b.processingType,sectionTitle:a.sectionTitle,source:"role-node"})));continue}d.push(...at(e,b.fileRoleId,b.processingType,b.id,c))}return as(d,120)}(aq,b,h);aw.push(...c);let d=await aS(i,b,c);a$.push(d),aU.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:aU.length})),a.onProgress?.([...aU])}let a_=function(a,b){let c=b.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),d=new Map;for(let b of c.sort((a,b)=>a.order-b.order)){let c=az(b.title);!(!aA(b.title)||aN(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(i,a$),a1=[i.name,i.outputTitle,a.requirement,w?.dynamicChapterRule?.generationHint,...w?.dynamicChapterRule?.sourceRoleIds||[]].filter(Boolean).join(" "),a5=w?.chapterMode==="dynamic"&&0===a_.length?(await l.search(h,a1||i.name,{scope:"project",limit:20,weights:{keyword:.45,vector:.35,rewrite:.65,hybridBonus:.1}})).results.map(a=>({chapterId:"dynamic-planning",filePath:a.filePath,score:a.score,content:a.content,roleId:am.get(a.filePath),processingType:an.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})):[],a6=aF(i,w,a5),bc=function(a,b=2,c=[]){let d=new Set(c.map(a=>ay(a.title)));return a.filter(a=>{let b=az(a.title);if(!b||!aA(a.title)||d.has(b)||aC(b))return!1;let c=`${b}
|
|
58
58
|
${a.sourceRequirement}
|
|
59
59
|
${a.requiredContents.join("、")}
|
|
60
|
-
${a.writingRules.join("、")}`;return!/(总结|汇总|依据|清单|公告|范围)/u.test(b)&&/缺口|补充|未覆盖|遗漏|查漏补缺|专项|必要|深化|保障/u.test(c)}).slice(0,Math.max(0,b)).map((a,b)=>{let c=az(a.title);return{id:aK(a.id,`dynamic-${b+1}`),title:c,purpose:[`动态补充章节只能用于查漏补缺,补充评审标准未覆盖但本项目必须响应的专项内容;不得作为资料总结、清单依据或招标范围汇总。`,a.sourceRequirement,...a.writingRules].filter(Boolean).join("\n").slice(0,1200),requiredFacts:[...new Set([...a.requiredContents,...a.evidenceNeeds])],queries:[...new Set([c,...a.requiredContents,...a.evidenceNeeds,...a.requirements.flatMap(a=>[a.title,a.requirementText,...a.evidenceNeeds])].filter(Boolean))],pinnedEvidenceFilePaths:[]}})}(a_,aE(w),a6),bd=aD([...a6,...bc]),be=[i.name,i.outputTitle,a.requirement,...bd.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bf=(0,k.Hh)(be,8,h),bw=bf.length>0?bf.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",
|
|
60
|
+
${a.writingRules.join("、")}`;return!/(总结|汇总|依据|清单|公告|范围)/u.test(b)&&/缺口|补充|未覆盖|遗漏|查漏补缺|专项|必要|深化|保障/u.test(c)}).slice(0,Math.max(0,b)).map((a,b)=>{let c=az(a.title);return{id:aK(a.id,`dynamic-${b+1}`),title:c,purpose:[`动态补充章节只能用于查漏补缺,补充评审标准未覆盖但本项目必须响应的专项内容;不得作为资料总结、清单依据或招标范围汇总。`,a.sourceRequirement,...a.writingRules].filter(Boolean).join("\n").slice(0,1200),requiredFacts:[...new Set([...a.requiredContents,...a.evidenceNeeds])],queries:[...new Set([c,...a.requiredContents,...a.evidenceNeeds,...a.requirements.flatMap(a=>[a.title,a.requirementText,...a.evidenceNeeds])].filter(Boolean))],pinnedEvidenceFilePaths:[]}})}(a_,aE(w),a6),bd=aD([...a6,...bc]),be=[i.name,i.outputTitle,a.requirement,...bd.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bf=(0,k.Hh)(be,8,h),bw=bf.length>0?bf.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",bG=aT(a$.flatMap(a=>a.evidence)),bH=0===bG.length?"":["## 招标公告项目基本信息强制落位","以下字段来自招标文件示范文本中的招标公告,必须优先用于第一章项目基本信息表和正文,不得用“见招标公告/见招标文件”替代。","| 字段 | 值 |","|---|---|",...bG.map(a=>`| ${a.key} | ${a.value.replace(/\|/gu,",")} |`)].join("\n"),bI=aV({type:"context_recall",roleId:"project-memory",status:bf.length>0?"success":"skipped",message:bf.length>0?`已注入 ${bf.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),bJ=ae?`;识别到 OUTLINE 章节 ${ad.length} 个`:";未识别到有效 OUTLINE,将使用模板/资料兜底章节";for(let b of(aU.push(aV({type:"role_binding",roleId:p,status:"success",message:`已绑定 ${A.length} 个文件角色、${r.length} 个提示词角色;后台自动规范 ${w.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*C.materialCoverageRate)}%${bJ}`},{subtitle:q,roleName:q})),aU.push(aV({type:"validation",roleId:"document-readiness",status:C.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*C.materialCoverageRate)}%,资料角色 ${Math.round(100*C.roleSatisfactionRate)}%,规范 ${Math.round(100*C.specCompletenessRate)}%;${x.source.selectionReason}`},{subtitle:"生成准备度检查"})),aU.push(bI),a.onProgress?.([...aU]),bd)){bF(a.signal);try{let c=[],d=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(b,a_),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(n,ak.size>0?30:n),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});c.push(...d.results.filter(a=>0===ak.size||af(a.filePath).some(a=>ak.has(a))).map(a=>({chapterId:b.id,filePath:a.filePath,score:a.score,content:a.content,roleId:am.get(a.filePath),processingType:an.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let f=new Set(b.pinnedEvidenceFilePaths||[]),g=aW(a$,b,d);for(let a of(c.push(...g.flatMap(({artifact:a})=>a.evidence.slice(0,8).map(a=>({...a,chapterId:b.id,source:"role-node"})))),new Set([...f]))){let d=f.has(a),e=aq.getFileDetail(a);if(!e){c.push(...at(a,am.get(a),an.get(a),b.id,h).map(a=>({...a,source:d?"pinned-evidence":a.source})));continue}c.push(...e.chunks.slice(0,Math.max(n,20)).map(a=>({chapterId:b.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:am.get(e.file.relativePath),processingType:an.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let j=as(c,n),k=as(c,120);aw.push(...j);let m=function(a,b=220){let c=[],d=new Set;for(let e of a)for(let a of function(a){let b=X(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[J,K,L,M,N,O,P].some(b=>(function(a,b){b.lastIndex=0;let c=b.test(a);return b.lastIndex=0,c})(a,b))||[...Q,...R,...S,...T,...U,...V].some(b=>a.includes(b))}(a))continue;let f=X(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 I.find(([,b])=>b.test(a))?.[0]||"通用工程"}(f),i=Z(f,J).slice(0,8),j=Z(f,K).slice(0,8),k=Z(f,L).slice(0,8),l=Z(f,M).slice(0,6),m=Z(f,N).slice(0,8),n=Z(f,O).slice(0,8),o=Z(f,P).slice(0,5),p=$(f,Q),q=$(f,R),r=$(f,S),s=$(f,T),t=function(a){return U.some(b=>a.text.includes(b))?"dangerous_work":V.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}(k,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,m);av.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=aa(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),s=b.requiredFacts.filter(a=>!j.some(b=>aG(b,a)));for(let a of(0===j.length&&aP.push(`${b.title}:未检索到明确资料依据`),s))aP.push(`${b.title}:${a} 未检索到明确依据`);aU.some(a=>"knowledge_retrieval"===a.type)||(aU.push(aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`})),a.onProgress?.([...aU])),bF(a.signal);let t=aX(a$,i),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?`要求项:
|
|
61
61
|
${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}:${ar(aO(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
|
|
62
62
|
${b.slice(0,18).map(a=>a.replace(ap,"").replace(ao,"")).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
|
|
63
63
|
${e}`:"",g?`【角色节点结构化产物】
|
|
64
|
-
${g}`:""].filter(Boolean).join("\n\n")}(a$,b,d),v=w?.chapterRules.find(a=>a.id===b.id||a.title===b.title),x=d?.minWords||v?.minWords||w?.dynamicChapterRule.minWordsPerChapter||1200,y=0===au.length,z=await Promise.race([bt(i,b,j,s,E,bw,a.requirement,u,{forbidDrawingImages:t,minWords:x,technicalFactContext:p,coverageMatrixContext:q,tenderAnnouncementContext:y?bF:""}),new Promise(a=>setTimeout(()=>a(null),12e4))]);if(bD(a.signal),!z){let c=j.slice(0,80),d=u.slice(0,12e3);z=await Promise.race([bt(i,b,c,s,E,bw,a.requirement,d,{forbidDrawingImages:t,minWords:Math.max(900,Math.floor(.75*x)),technicalFactContext:p.slice(0,12e3),coverageMatrixContext:q.slice(0,8e3),tenderAnnouncementContext:y?bF.slice(0,8e3):""}),new Promise(a=>setTimeout(()=>a(null),12e4))])}if(bD(a.signal),!z)throw Error(`${b.title} 大模型未返回有效章节正文`);let A=z,B=b.sections?.length?b.sections:bv(A);aR.push(aV({type:"chapter_generation",roleId:"chapter_generation",promptId:r.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:`${ay(b.title)} 已由大模型生成`},{subtitle:ay(b.title),order:aR.length})),au.push({id:b.id,title:b.title,content:A,evidence:j,missingFacts:s,sections:B})}catch(c){if(a.signal?.aborted)throw c;console.error(`[gen] chapter ${b.title} failed:`,c),aQ.push(`${b.title}:${c instanceof Error?c.message:"生成失败"}`),aR.push(aV({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${ay(b.title)} 生成失败`},{subtitle:ay(b.title),order:aR.length}))}aU.some(a=>"chapter_generation"===a.type&&a.message===aR[aR.length-1]?.message)||aU.push(aR[aR.length-1]),a.onProgress?.([...aU])}if(0===au.length)throw Error(`章节生成未完成:${aQ.slice(0,6).join(";")||"没有生成任何有效章节"}`);bD(a.signal);let bI={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bI=await bg(h,aw)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bD(a.signal),bI.notes))aw.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bJ=function(a,b,c){let d={};for(let e of aH(a,c)){let a=b.find(a=>aI(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(i,aw,w);for(let a of a$)for(let b of a.facts)bJ[b.key]=`${aO(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bK=function(a,b,c){let d=aH(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!aI(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(aw,i,w),bL={facts:[],stages:[]};try{bL=await bh(aw,F,i,w)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bD(a.signal);let bM=a$.flatMap(a=>a.facts.map(a=>({key:a.key,value:aO(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),bN=[...bE.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"tender_announcement",confidence:.95})),...bM,...bK,...bL.facts];for(let a of(aU.some(a=>a.type===bI.stage.type)||aU.push(bI.stage),bL.stages))aU.some(b=>b.type===a.type)||aU.push(a);a.onProgress?.([...aU]);let bO=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}(aw),bP=aw.filter(a=>"pinned-evidence"===a.source).length,bQ=aw.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,bR=aV({type:"reference",roleId:"quality-enhancement",status:aw.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aw.length} 条,人工确认/固定证据 ${bP} 条,项目上下文 ${bf.length} 条,自动检索证据 ${bQ} 条`},{subtitle:"证据与上下文增强"});for(let b of(aU.push(bR),a.onProgress?.([...aU]),bN))bJ[b.key]=`${aO(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bS=new Map;for(let a of aw)bS.set(a.filePath,(bS.get(a.filePath)??0)+1);let bT=[...bS.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),bU=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=aO(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)}}(bN,bO,aP,w),bV=au.map(a=>{let b=w.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)}}),bW=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===a9(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}}(au,bN,i);bW.warnings.push(...C.warnings),bW.errors.push(...C.blockingIssues);let bX=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}(bW,bU,au);bX.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}(bV));let bY=aR.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,bZ=aR.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;bY>0&&bX.push({level:"error",message:`章节生成存在兜底:${bY} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),bZ>0&&bX.push({level:"warning",message:`部分章节生成失败:${bZ} 章`,suggestion:aQ.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let b$=bX.filter(a=>"error"===a.level&&bi(a)).length,b_=[aV({type:"role_binding",roleId:p,status:A.length>0?"success":"fallback",message:`已绑定 ${A.length} 个文件角色、${r.length} 个提示词角色;后台自动规范 ${w.factFields.length} 个事实字段`},{subtitle:q,roleName:q}),aV({type:"validation",roleId:"document-readiness",status:C.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*C.materialCoverageRate)}%,资料角色 ${Math.round(100*C.roleSatisfactionRate)}%,规范 ${Math.round(100*C.specCompletenessRate)}%;${x.source.selectionReason}`},{subtitle:"生成准备度检查"}),bG,aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`}),bR,aV(bI.stage),...bL.stages.map(a=>aV(a)),...aR,aV({type:"validation",roleId:"document-workflow",status:b$>0?"failed":"success",message:`阻断 ${b$},错误 ${bW.errors.length},警告 ${bW.warnings.length}`},{subtitle:"最终规范校验"}),aV({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}),aV({type:"export_ready",roleId:"document-workflow",status:b$>0?"failed":"success",message:b$>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"})],b0={templateId:i.id,templateName:i.name,title:i.outputTitle,requirement:a.requirement||"",exportSettings:i.exportSettings,generationSettings:i.generationSettings,facts:bJ,structuredFacts:bN,factsModel:bU,chapters:au,sources:bT,missingItems:[...new Set(aP)],validation:bW,validationIssues:bX,executionStages:b_,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},b1=bC(b0);bD(a.signal);let b2=await bu({template:i,spec:w,markdown:b1,evidence:aw,promptTexts:ac||E,projectContext:bw,requirement:a.requirement});bD(a.signal);let b3=aX(a$,i),b4=bx(aY(b2.markdown===b1?bC({...b0,validationIssues:bX,exportGate:b0.exportGate,executionStages:b_}):b2.markdown,b3)),b5=bB(b4,i).map(a=>a.message),b6=br(b4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),b7=bs(b4,i).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),b8=bq(b4,bU).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),b9=ab({assignments:av,markdown:b4}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ca=bp(b4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cb=bm(b4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cc=bn(b4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cd=bo(au).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ce=by(b4).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cf=[...a2(b4,au,a_,a$,b3),...b5,...b6,...b7,...b8,...b9,...ca,...cb,...cc,...cd,...ce],cg=await a3({markdown:b4,template:i,plan:a_,artifacts:a$,promptTexts:E,requirement:a.requirement,issues:cf,forbidDrawingImages:b3});bD(a.signal);let ch=cg.stage?[...b_,b2.stage,cg.stage]:[...b_,b2.stage],ci=aY(cg.markdown,b3),cj=au.map((a,b)=>{if(a.sections?.length)return a.sections;let c=ci.search(RegExp(`^##\\s+${bA(aB(b,a.title))}\\s*$`,"mu"));if(c<0)return[];let d=ci.slice(c),e=d.slice(1).search(/^##\s+/mu);return bv(e>=0?d.slice(0,e+1):d)}),ck=au.map((a,b)=>({...a,sections:cj[b]||a.sections||[]})),cl=bx(a0(function(a,b){let c=function(a,b){let c=a;b.forEach((a,b)=>{let d=ay(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${bA(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${aB(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0;return d.map(a=>{if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(a.trim()))return e+=1,f=0,a;let b=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(a.trim());return e>=0&&b?(f+=1,`### ${e+1}.${f} ${ay(b[3]||"")}`):a}).join("\n")}(a,b),d=bz(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)}
|
|
64
|
+
${g}`:""].filter(Boolean).join("\n\n")}(a$,b,d),v=w?.chapterRules.find(a=>a.id===b.id||a.title===b.title),x=d?.minWords||v?.minWords||w?.dynamicChapterRule.minWordsPerChapter||1200,y=0===au.length,z=await Promise.race([bt(i,b,j,s,E,bw,a.requirement,u,{forbidDrawingImages:t,minWords:x,technicalFactContext:p,coverageMatrixContext:q,tenderAnnouncementContext:y?bH:""}),new Promise(a=>setTimeout(()=>a(null),12e4))]);if(bF(a.signal),!z){let c=j.slice(0,80),d=u.slice(0,12e3);z=await Promise.race([bt(i,b,c,s,E,bw,a.requirement,d,{forbidDrawingImages:t,minWords:Math.max(900,Math.floor(.75*x)),technicalFactContext:p.slice(0,12e3),coverageMatrixContext:q.slice(0,8e3),tenderAnnouncementContext:y?bH.slice(0,8e3):""}),new Promise(a=>setTimeout(()=>a(null),12e4))])}if(bF(a.signal),!z)throw Error(`${b.title} 大模型未返回有效章节正文`);let A=z,B=b.sections?.length?b.sections:bv(A);aR.push(aV({type:"chapter_generation",roleId:"chapter_generation",promptId:r.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:`${ay(b.title)} 已由大模型生成`},{subtitle:ay(b.title),order:aR.length})),au.push({id:b.id,title:b.title,content:A,evidence:j,missingFacts:s,sections:B})}catch(c){if(a.signal?.aborted)throw c;console.error(`[gen] chapter ${b.title} failed:`,c),aQ.push(`${b.title}:${c instanceof Error?c.message:"生成失败"}`),aR.push(aV({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${ay(b.title)} 生成失败`},{subtitle:ay(b.title),order:aR.length}))}aU.some(a=>"chapter_generation"===a.type&&a.message===aR[aR.length-1]?.message)||aU.push(aR[aR.length-1]),a.onProgress?.([...aU])}if(0===au.length)throw Error(`章节生成未完成:${aQ.slice(0,6).join(";")||"没有生成任何有效章节"}`);bF(a.signal);let bK={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bK=await bg(h,aw)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bF(a.signal),bK.notes))aw.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bL=function(a,b,c){let d={};for(let e of aH(a,c)){let a=b.find(a=>aI(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(i,aw,w);for(let a of a$)for(let b of a.facts)bL[b.key]=`${aO(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bM=function(a,b,c){let d=aH(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!aI(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(aw,i,w),bN={facts:[],stages:[]};try{bN=await bh(aw,F,i,w)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bF(a.signal);let bO=a$.flatMap(a=>a.facts.map(a=>({key:a.key,value:aO(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),bP=[...bG.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"tender_announcement",confidence:.95})),...bO,...bM,...bN.facts];for(let a of(aU.some(a=>a.type===bK.stage.type)||aU.push(bK.stage),bN.stages))aU.some(b=>b.type===a.type)||aU.push(a);a.onProgress?.([...aU]);let bQ=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}(aw),bR=aw.filter(a=>"pinned-evidence"===a.source).length,bS=aw.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,bT=aV({type:"reference",roleId:"quality-enhancement",status:aw.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aw.length} 条,人工确认/固定证据 ${bR} 条,项目上下文 ${bf.length} 条,自动检索证据 ${bS} 条`},{subtitle:"证据与上下文增强"});for(let b of(aU.push(bT),a.onProgress?.([...aU]),bP))bL[b.key]=`${aO(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let bU=new Map;for(let a of aw)bU.set(a.filePath,(bU.get(a.filePath)??0)+1);let bV=[...bU.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),bW=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=aO(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)}}(bP,bQ,aP,w),bX=au.map(a=>{let b=w.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)}}),bY=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===a9(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}}(au,bP,i);bY.warnings.push(...C.warnings),bY.errors.push(...C.blockingIssues);let bZ=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}(bY,bW,au);bZ.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}(bX));let b$=aR.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,b_=aR.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;b$>0&&bZ.push({level:"error",message:`章节生成存在兜底:${b$} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),b_>0&&bZ.push({level:"warning",message:`部分章节生成失败:${b_} 章`,suggestion:aQ.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let b0=bZ.filter(a=>"error"===a.level&&bi(a)).length,b1=[aV({type:"role_binding",roleId:p,status:A.length>0?"success":"fallback",message:`已绑定 ${A.length} 个文件角色、${r.length} 个提示词角色;后台自动规范 ${w.factFields.length} 个事实字段`},{subtitle:q,roleName:q}),aV({type:"validation",roleId:"document-readiness",status:C.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*C.materialCoverageRate)}%,资料角色 ${Math.round(100*C.roleSatisfactionRate)}%,规范 ${Math.round(100*C.specCompletenessRate)}%;${x.source.selectionReason}`},{subtitle:"生成准备度检查"}),bI,aV({type:"knowledge_retrieval",roleId:"knowledge-base",status:aw.length>0?"success":"fallback",message:`已检索/绑定 ${aw.length} 条证据`}),bT,aV(bK.stage),...bN.stages.map(a=>aV(a)),...aR,aV({type:"validation",roleId:"document-workflow",status:b0>0?"failed":"success",message:`阻断 ${b0},错误 ${bY.errors.length},警告 ${bY.warnings.length}`},{subtitle:"最终规范校验"}),aV({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}),aV({type:"export_ready",roleId:"document-workflow",status:b0>0?"failed":"success",message:b0>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"})],b2={templateId:i.id,templateName:i.name,title:i.outputTitle,requirement:a.requirement||"",exportSettings:i.exportSettings,generationSettings:i.generationSettings,facts:bL,structuredFacts:bP,factsModel:bW,chapters:au,sources:bV,missingItems:[...new Set(aP)],validation:bY,validationIssues:bZ,executionStages:b1,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},b3=bE(b2);bF(a.signal);let b4=await bu({template:i,spec:w,markdown:b3,evidence:aw,promptTexts:ac||E,projectContext:bw,requirement:a.requirement});bF(a.signal);let b5=aX(a$,i),b6=bx(aY(b4.markdown===b3?bE({...b2,validationIssues:bZ,exportGate:b2.exportGate,executionStages:b1}):b4.markdown,b5)),b7=bD(b6,i).map(a=>a.message),b8=br(b6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),b9=bs(b6,i).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ca=bq(b6,bW).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cb=ab({assignments:av,markdown:b6}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cc=bp(b6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cd=bm(b6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ce=bn(b6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cf=bo(au).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cg=by(b6).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),ch=[...a2(b6,au,a_,a$,b5),...b7,...b8,...b9,...ca,...cb,...cc,...cd,...ce,...cf,...cg],ci=await a3({markdown:b6,template:i,plan:a_,artifacts:a$,promptTexts:E,requirement:a.requirement,issues:ch,forbidDrawingImages:b5});bF(a.signal);let cj=ci.stage?[...b1,b4.stage,ci.stage]:[...b1,b4.stage],ck=aY(ci.markdown,b5),cl=function(a,b){let c=bB(bA(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${bC(aB(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=bv(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(ck,au),cm=au.map((a,b)=>({...a,sections:cl[b]||a.sections||[]})),cn=bx(a0(function(a,b){let c=bB(a,b),d=bz(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)}
|
|
65
65
|
|
|
66
66
|
${d}
|
|
67
67
|
|
|
@@ -71,9 +71,9 @@ ${c.slice(a).trimStart()}`}return`${d}
|
|
|
71
71
|
|
|
72
72
|
<div class="page-break"></div>
|
|
73
73
|
|
|
74
|
-
${c}`}(
|
|
75
|
-
${a.content}`).join("\n\n"),f=Z(a.chapters.filter(a=>/施工方法|主要.*方法|工艺/u.test(a.title)).map(a=>a.content).join("\n")||e,J).length,g=[K,L,M,N,O].reduce((a,b)=>a+Z(e,b).length,0),h=Z(e,P).length,i=Q.filter(a=>e.includes(a)).length,j=R.filter(a=>e.includes(a)).length,k=(c?.genericPhrases?.length?c.genericPhrases:W).reduce((a,b)=>a+(e.match(RegExp(b,"gu"))?.length||0),0),l=a.assignments.flatMap(a=>a.facts),m=Y(l.flatMap(a=>{var b;return Y([...Z(b=`${a.parameter||""} ${a.specification||""} ${a.text}`,J),...Z(b,K),...Z(b,L),...Z(b,M),...Z(b,N),...Z(b,O),...Z(b,P)].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:
|
|
76
|
-
${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}})))bX.push(...a.issues);bX.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&&!H(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:x,roles:B})),bX.push(...bs(cl,i)),bX.push(...function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=bj(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,cl)),bX.push(...bB(cl,i));let cn=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bi(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&&bi(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(bX,bU,ck),co=cn.blockingIssues.length,cp=ch.map(a=>"validation"===a.type?{...a,status:co>0?"failed":"success",message:`阻断 ${co},问题 ${bX.length}`}:"export_ready"===a.type?{...a,status:cn.passed?"success":"failed",message:cn.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁存在阻断项"}:a);return{...b0,chapters:ck,validationIssues:bX,exportGate:cn,executionStages:cp,markdown:cl}}async function bF(a){let b=aj(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=a.projectRoot||(0,j.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,j.Qh)(),f=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),g=[];for(let a of c.queries){let b=await e.search(d,a,{scope:"project",limit:f,weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});g.push(...b.results.map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let h=as(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",k=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!k.has(a)&&!h.some(b=>aG(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(au),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},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(`
|
|
74
|
+
${c}`}(ck,cm))),co=[...a2(b6,au,a_,a$,b5),...b7];for(let a of((bZ=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>aI(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>aI(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}if("fixed"===a.chapterMode)for(let b of a.chapterRules.filter(a=>a.required)){k.has(b.title)||h.push({level:"error",message:`必需章节缺失:${b.title}`,suggestion:"请在模板或规范包章节规则中补齐章节。"});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} 字。`})}else{let b=a.dynamicChapterRule;if(b.minChapters&&d.length<b.minChapters&&h.push({level:"warning",message:`动态章节数量低于最少章节:${d.length}/${b.minChapters}`,suggestion:"请补充资料或降低最少章节数。"}),b.maxChapters&&d.length>b.maxChapters&&h.push({level:"warning",message:`动态章节数量超过最多章节:${d.length}/${b.maxChapters}`,suggestion:"请收紧来源文件角色或降低召回范围。"}),b.minWordsPerChapter)for(let a of d)a.content.length<b.minWordsPerChapter&&h.push({level:"warning",message:`动态章节内容低于最低字数:${a.title}`,suggestion:`建议不少于 ${b.minWordsPerChapter} 字。`})}let l=bk(e),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0})),n=bj(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:bl(b,`缺少事实 ${p}`)}),"chapter"===o.subject&&"exists"===o.operator&&p&&!k.has(p)&&h.push({level:a,message:bl(b,`缺少章节 ${p}`)}),"file_role"===o.subject&&"exists"===o.operator&&p&&!f.some(a=>a.roleId===p)&&h.push({level:a,message:bl(b,`缺少文件角色 ${p}`)}),"prompt_role"===o.subject&&"exists"===o.operator&&p&&!g.some(a=>a.roleId===p)&&h.push({level:a,message:bl(b,`缺少提示词角色 ${p}`)}),"document"===o.subject&&"contains"===o.operator&&q&&!e.includes(q)&&h.push({level:a,message:bl(b,`全文必须包含 ${q}`)}),"document"===o.subject&&"not_contains"===o.operator&&q&&e.includes(q)&&h.push({level:a,message:bl(b,`出现禁用文本 ${q}`)}),"document"!==o.subject&&"chapter"!==o.subject||"regex_match"!==o.operator||!q||u&&u.test(t)||h.push({level:a,message:bl(b,`未匹配正则 ${q}`)}),("document"===o.subject||"chapter"===o.subject)&&"regex_not_match"===o.operator&&u?.test(t)&&h.push({level:a,message:bl(b,`匹配到禁止正则 ${q}`)}),"chapter"===o.subject&&"contains"===o.operator&&p&&q&&(!s||!s.content.includes(q))&&h.push({level:a,message:bl(b,`章节 ${p} 必须包含 ${q}`)}),"chapter"===o.subject&&"not_contains"===o.operator&&s?.content.includes(q)&&h.push({level:a,message:bl(b,`章节 ${p} 出现禁用文本 ${q}`)}),"chapter"===o.subject&&"min_length"===o.operator&&p&&(!s||s.content.length<r)&&h.push({level:a,message:bl(b,`章节 ${p} 低于 ${r} 字`)}),"table"===o.subject&&"min_count"===o.operator&&c.tables.length+l.length<r&&h.push({level:a,message:bl(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:bl(b,"存在缺少说明文字的表格")}),"image"===o.subject&&"min_count"===o.operator&&m.length<r&&h.push({level:a,message:bl(b,`图片数量少于 ${r}`)}),"page"===o.subject&&"min_count"===o.operator&&n<r&&h.push({level:a,message:bl(b,`预计页数 ${n} 少于 ${r}`)}),"page"===o.subject&&"max_count"===o.operator&&n>r&&h.push({level:a,message:bl(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:bl(b,"存在缺少说明文字的图片")}),"source"===o.subject&&"all_have_source"===o.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:bl(b,"存在无来源事实")}),"source"===o.subject&&"min_count"===o.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<r&&h.push({level:a,message:bl(b,`来源数量少于 ${r}`)})}return h}(w,[...bZ,...co.map(a=>({level:"warning",message:a}))],bW,cm,cn,A,r)).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:cn,spec:w,summary:x})),bZ.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:cn,facts:bP,summary:x})),bZ.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)&&H(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}(cn,x)),bZ.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}
|
|
75
|
+
${a.content}`).join("\n\n"),f=Z(a.chapters.filter(a=>/施工方法|主要.*方法|工艺/u.test(a.title)).map(a=>a.content).join("\n")||e,J).length,g=[K,L,M,N,O].reduce((a,b)=>a+Z(e,b).length,0),h=Z(e,P).length,i=Q.filter(a=>e.includes(a)).length,j=R.filter(a=>e.includes(a)).length,k=(c?.genericPhrases?.length?c.genericPhrases:W).reduce((a,b)=>a+(e.match(RegExp(b,"gu"))?.length||0),0),l=a.assignments.flatMap(a=>a.facts),m=Y(l.flatMap(a=>{var b;return Y([...Z(b=`${a.parameter||""} ${a.specification||""} ${a.text}`,J),...Z(b,K),...Z(b,L),...Z(b,M),...Z(b,N),...Z(b,O),...Z(b,P)].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:cm,assignments:av,finalMarkdown:cn})),bZ.push(...ab({assignments:av,markdown:cn})),bZ.push(...bp(cn)),bZ.push(...bm(cn)),bZ.push(...bn(cn)),bZ.push(...by(cn)),bZ.push(...bo(cm)),bZ.push(...bq(cn,bW)),bZ.push(...br(cn)),c={template:i,chapters:cm,markdown:cn},(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}
|
|
76
|
+
${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}})))bZ.push(...a.issues);bZ.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&&!H(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:cn,chapters:cm,summary:x,roles:B})),bZ.push(...bs(cn,i)),bZ.push(...function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=bj(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,cn)),bZ.push(...bD(cn,i));let cp=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&bi(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&&bi(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(bZ,bW,cm),cq=cp.blockingIssues.length,cr=cj.map(a=>"validation"===a.type?{...a,status:cq>0?"failed":"success",message:`阻断 ${cq},问题 ${bZ.length}`}:"export_ready"===a.type?{...a,status:cp.passed?"success":"failed",message:cp.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁存在阻断项"}:a);return{...b2,chapters:cm,validationIssues:bZ,exportGate:cp,executionStages:cr,markdown:cn}}async function bH(a){let b=aj(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=a.projectRoot||(0,j.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,j.Qh)(),f=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),g=[];for(let a of c.queries){let b=await e.search(d,a,{scope:"project",limit:f,weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});g.push(...b.results.map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let h=as(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",k=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!k.has(a)&&!h.some(b=>aG(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(au),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},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(`
|
|
77
77
|
SELECT * FROM memories
|
|
78
78
|
WHERE context LIKE ? AND (${h})
|
|
79
79
|
ORDER BY access_count DESC, updated_at DESC
|