@customize-agent/server 4.0.83 → 4.0.85
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 +21 -21
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/4375.js +123 -0
- package/.next/server/chunks/7899.js +1 -1
- package/.next/server/chunks/8661.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/api/assets/generated/preview.js +1 -1
- package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated.js +1 -1
- package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
- package/.next/server/pages/api/config/healthCheck.js +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/export.js +1 -1
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate.js +1 -1
- package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id].js +1 -1
- package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated.js +1 -1
- package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
- package/.next/server/pages/api/documents/templates.js +1 -1
- package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/context/long-term.html +1 -1
- package/.next/server/pages/context/short-term.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/search.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +28 -28
- package/.next/static/{0pa5fvkdoD0BbKgNRpUEK → 37XAh0E9YCoej2skkcLoJ}/_buildManifest.js +1 -1
- package/.next/static/chunks/375-f731e5ec66ab942c.js +1 -0
- package/.next/static/chunks/466-a54223cadb7cfad9.js +1 -0
- package/.next/static/chunks/63-47dff441816f712f.js +4 -0
- package/.next/static/chunks/642-b325b80d595ec100.js +8 -0
- package/.next/static/chunks/694-b6ab4967c35bbcee.js +1 -0
- package/.next/static/chunks/{767-e97ea5dee1ab87b5.js → 767-4f3b0ae7bff68fde.js} +1 -1
- package/.next/static/chunks/788-db05269178a28c20.js +1 -0
- package/.next/static/chunks/795-262a7ef599d655f4.js +1 -0
- package/.next/static/chunks/pages/document-roles-7e5a02b0f03eb951.js +1 -0
- package/.next/static/chunks/pages/documents-e6a276951f092076.js +1 -0
- package/.next/static/chunks/pages/guide-c45dc4e0a02247c9.js +1 -0
- package/.next/static/chunks/pages/models-e2914678369d2823.js +1 -0
- package/package.json +2 -2
- package/.next/server/chunks/6315.js +0 -128
- package/.next/static/chunks/375-4a1c73eb22d653d2.js +0 -1
- package/.next/static/chunks/466-1cd359f130473697.js +0 -1
- package/.next/static/chunks/63-dd8eeb8edd766bae.js +0 -4
- package/.next/static/chunks/642-708b928fbafc6c20.js +0 -8
- package/.next/static/chunks/694-2d545cfbb9779f2c.js +0 -1
- package/.next/static/chunks/788-7f7359a830e3f4fd.js +0 -1
- package/.next/static/chunks/795-d8fb7a0420512701.js +0 -1
- package/.next/static/chunks/pages/document-roles-60f29e52f817dc11.js +0 -1
- package/.next/static/chunks/pages/documents-988649336d226901.js +0 -1
- package/.next/static/chunks/pages/guide-c00be7803483b703.js +0 -1
- package/.next/static/chunks/pages/models-d5e80645dc4a61b1.js +0 -1
- /package/.next/static/{0pa5fvkdoD0BbKgNRpUEK → 37XAh0E9YCoej2skkcLoJ}/_ssgManifest.js +0 -0
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=6315,exports.ids=[6315],exports.modules={2894:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>o,PH:()=>u,dg:()=>l,h0:()=>p,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021),i=c(47899);function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"pattern"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i.jt[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a){let b=[];for(let c of a)b.push(k(c));return b}function o(a,b,c){let d=j();if(!d)return[];try{let e=function(a){let b=[];for(let c of a.split(/[\s,,。;;::、/\\|]+/u)){let a=c.trim();a.length<i.Wc||b.push(a)}return[...new Set(b)]}(a),g=c?`%Project: ${f.resolve(c)}%`:void 0,h=Number.isFinite(b)&&b>0?Math.ceil(b):void 0,j=h?"LIMIT ?":"",k=h?[h]:[];if(0===e.length){let a=g?d.prepare(`SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC ${j}`).all(g,...k):d.prepare(`SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC ${j}`).all(...k);return n(a)}let l=function(a){let b=[],c=[];for(let d of a)b.push("(content LIKE ? OR context LIKE ?)"),c.push(`%${d}%`,`%${d}%`);return{clauses:b.join(" OR "),params:c}}(e),m=g?d.prepare(`
|
|
2
|
-
SELECT * FROM memories
|
|
3
|
-
WHERE context LIKE ? AND (${l.clauses})
|
|
4
|
-
ORDER BY access_count DESC, updated_at DESC
|
|
5
|
-
${j}
|
|
6
|
-
`).all(g,...l.params,...k):d.prepare(`
|
|
7
|
-
SELECT * FROM memories
|
|
8
|
-
WHERE ${l.clauses}
|
|
9
|
-
ORDER BY access_count DESC, updated_at DESC
|
|
10
|
-
${j}
|
|
11
|
-
`).all(...l.params,...k);return n(m)}finally{d.close()}}function p(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return!1;let c=new(e())(b);try{return c.prepare("DELETE FROM memories WHERE id = ?").run(a).changes>0}finally{c.close()}}function q(a,b){let c=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(c))return!1;let d=new(e())(c);try{return d.prepare("UPDATE memories SET content = ?, context = ?, updated_at = datetime('now') WHERE id = ?").run(b.content,b.context||"",a).changes>0}finally{d.close()}}function r(a){return"long_term"===a?"access_count >= 2":"access_count < 2"}function s(a){let b=j();if(!b)return{count:0,totalBytes:0};try{let c=b.prepare(`SELECT COUNT(*) as count, COALESCE(SUM(LENGTH(content) + LENGTH(context)), 0) as totalBytes FROM memories WHERE ${r(a)}`).get();return{count:Number(c.count??0),totalBytes:Number(c.totalBytes??0)}}finally{b.close()}}function t(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return 0;let c=new(e())(b);try{let b=c.prepare(`SELECT rowid FROM memories WHERE ${r(a)}`).all();return c.transaction(()=>{c.prepare(`DELETE FROM memories WHERE ${r(a)}`).run()})(),b.length}finally{c.close()}}function u(a){let b=f.join(g.homedir(),".customize-agent","memory.db");if(!h.existsSync(b))return{changed:0,beforeBytes:0,afterBytes:0};let c=new(e())(b);try{let b=c.prepare(`SELECT id, content, context FROM memories WHERE ${r(a)}`).all(),d=0,e=0,f=0,g=a=>{let b=String(a||"").replace(/\s+/gu," ").trim();return b.length>1200?`${b.slice(0,1e3)} … ${b.slice(-160)}`:b},h=c.prepare("UPDATE memories SET content = ?, context = ?, updated_at = datetime('now') WHERE id = ?");return c.transaction(()=>{for(let a of b){e+=Buffer.byteLength(`${a.content}${a.context}`);let b=g(a.content),c=g(a.context);f+=Buffer.byteLength(`${b}${c}`),(b!==a.content||c!==a.context)&&(h.run(b,c,a.id),d++)}})(),{changed:d,beforeBytes:e,afterBytes:f}}finally{c.close()}}},8753:(a,b,c)=>{c.d(b,{V:()=>h});var d=c(73024),e=c(48161),f=c(76760);let g={reviewStandardQueries:[],reviewChapterTemplateMatchers:[],reviewChapterSectionDefaults:{firstChapterSections:[],chapterSections:[],firstChapterTableSections:[],firstChapterTableRequirements:[]},templates:[],roles:[],roleConfigs:[],qualityBenchmarks:[],autoSpecGates:[],chapterTitleFilters:[]};function h(){try{var a;let b=function(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"engineering-document-config.json")}();if(!d.existsSync(b))return g;return a=JSON.parse(d.readFileSync(b,"utf-8")),{reviewStandardQueries:Array.isArray(a.reviewStandardQueries)?a.reviewStandardQueries.filter(Boolean):[],reviewChapterTemplateMatchers:Array.isArray(a.reviewChapterTemplateMatchers)?a.reviewChapterTemplateMatchers.filter(Boolean):[],reviewChapterSectionDefaults:{firstChapterSections:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterSections)?a.reviewChapterSectionDefaults.firstChapterSections.filter(Boolean):[],chapterSections:Array.isArray(a.reviewChapterSectionDefaults?.chapterSections)?a.reviewChapterSectionDefaults.chapterSections.filter(Boolean):[],firstChapterTableSections:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterTableSections)?a.reviewChapterSectionDefaults.firstChapterTableSections.filter(Boolean):[],firstChapterTableRequirements:Array.isArray(a.reviewChapterSectionDefaults?.firstChapterTableRequirements)?a.reviewChapterSectionDefaults.firstChapterTableRequirements.filter(Boolean):[]},templates:Array.isArray(a.templates)?a.templates:[],roles:Array.isArray(a.roles)?a.roles:[],roleConfigs:Array.isArray(a.roleConfigs)?a.roleConfigs:[],qualityBenchmarks:Array.isArray(a.qualityBenchmarks)?a.qualityBenchmarks:[],technicalDetailGate:a.technicalDetailGate,autoSpecGates:Array.isArray(a.autoSpecGates)?a.autoSpecGates:[],chapterTitleFilters:Array.isArray(a.chapterTitleFilters)?a.chapterTitleFilters:[]}}catch{return g}}},16315:(a,b,c)=>{c.d(b,{h0x:()=>d.h0,bVF:()=>d.bV,OXS:()=>bR,jGg:()=>d.jG,R1O:()=>bS,Bhi:()=>d.Bh,xmB:()=>d.xm});var d=c(52511),e=c(76760),f=c(19898),g=c(44533),h=c(2894),i=c(25840),j=c(77598),k=c(8753);let l=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],m=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|约束|响应|澄清|变更/iu],output:["需求约束","规则要求","变更说明"]},{id:"scope",label:"范围资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["实施范围","对象范围"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["结构化数据范围","参数规格范围"]},{id:"quality",label:"质量评价资料",patterns:[/质量|验收|审核|评审|评价|标准|规范|指标/iu],output:["质量要求","评价标准"]},{id:"schedule",label:"时间进度资料",patterns:[/周期|期限|进度|计划|节点|里程碑|时间|日期/iu],output:["周期要求","进度节点要求"]},{id:"safety",label:"安全合规资料",patterns:[/安全|合规|风险|应急|环保|隐私|审计|控制/iu],output:["安全合规要求","风险控制要求"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"analysis",label:"分析结论",patterns:[/报告|调研|分析|评估|研究|建议|结论/iu],output:["背景依据","分析结论","风险建议"]}],n=[{id:"overview",label:"概况章节",patterns:[/概况|背景|理解|说明|总则|摘要/iu],output:["对象名称","材料范围","实施范围"]},{id:"implementation",label:"实施章节",patterns:[/方法|部署|实施|范围|组织|流程|步骤/iu],output:["实施范围","对象范围","结构化数据范围"]},{id:"controls",label:"控制章节",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价/iu],output:["质量要求","周期要求","安全合规要求"]},{id:"resources",label:"资源章节",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["资源配置要求"]},{id:"risk",label:"风险章节",patterns:[/风险|重点|难点|约束|应急|合规/iu],output:["风险控制要求","风险建议"]}],o=[{id:"requirement",label:"需求规则资料",patterns:[/需求|要求|规则|条款|响应|requirement|rule/iu],output:["requirement_document"]},{id:"change",label:"变更澄清资料",patterns:[/补充|澄清|变更|修订|addendum|change/iu],output:["addendum"]},{id:"structured-data",label:"结构化数据资料",patterns:[/表格|列表|明细|数量|数据|字段|参数|规格|sheet|table|data/iu],output:["structured_data"]},{id:"budget",label:"预算费用资料",patterns:[/预算|费用|金额|报价|限价|成本|price|cost|budget/iu],output:["budget_cost"]},{id:"design",label:"设计方案资料",patterns:[/设计|方案|说明|图像|地图|附件|drawing|image|map|design/iu],output:["design_specification"]},{id:"resource",label:"资源配置资料",patterns:[/资源|人员|设备|材料|品牌|采购|供应|配置/iu],output:["resource_recommendation"]},{id:"schedule-quality-safety",label:"进度质量合规资料",patterns:[/质量|周期|进度|安全|合规|验收|审核|评价|环保|应急/iu],output:["schedule_quality_safety"]},{id:"scope",label:"范围任务资料",patterns:[/范围|内容|任务|目标|边界|对象|工作内容/iu],output:["scope_description"]},{id:"technical",label:"技术标准资料",patterns:[/技术|规范|标准|规程|指南|手册|参数|spec|standard/iu],output:["technical_specification"]},{id:"risk",label:"风险约束资料",patterns:[/风险|重点|难点|约束|限制|现场|条件|应急/iu],output:["risk_constraints"]}];function p(a,b){let c=new Set;for(let d of b)for(let b of d.patterns)if(b.lastIndex=0,b.test(a)){for(let a of d.output)c.add(a);break}return[...c]}function q(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function r(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function s(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function t(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,k.V)().autoSpecGates.filter(a=>a.templateMatchers.some(a=>(function(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}})(c,a)))}let u=["project_overview","requirement_document","addendum","structured_data","design_specification","schedule_quality_safety","scope_description"],v=["project_overview","requirement_document","addendum","structured_data","budget_cost","design_specification","resource_recommendation","schedule_quality_safety","scope_description","technical_specification","risk_constraints"];function w(a){let b=[];for(let c of a)for(let a of c.relativePath.split(/[\\/]/gu))a&&b.push(a);return b}function x(a){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function y(a){return a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()}function z(a){let b=new Set,c=[];for(let d of w(a)){let a=y(d);!/项目|任务|文档|合同|计划|方案/iu.test(a)||a.length<6||b.has(a)||(b.add(a),c.push(a))}return c}function A(a,b){return 0===a.length?b:a.map(a=>y(a.fileName)).join("、")}function B(a,b,c){b.lastIndex=0;let d=new Set,e=[];for(let f of a.matchAll(b)){let a=(f[c]||"").trim();!a||d.has(a)||(d.add(a),e.push(a))}return b.lastIndex=0,e}function C(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function D(a){let b=C(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function E(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}var F=c(47899);function G(a){return a.replace(F.H4," ").trim()}function H(a){let b=new Set,c=[];for(let d of a){let a=d.trim();!a||b.has(a)||(b.add(a),c.push(a))}return c}function I(a,b){b.lastIndex=0;let c=[];for(let d of a.matchAll(b))c.push(d[0]);return b.lastIndex=0,H(c)}function J(a,b){let c=[];for(let d of b)a.includes(d)&&c.push(d);return c}function K(a){let b=[a.location,a.workItem,a.material,a.equipment,a.discipline],c=[];for(let a of b)a&&c.push(a);return c.join(" / ")}function L(a){let b=[];for(let c of a)(c.quantities?.length||0)+(c.scheduleValues?.length||0)+(c.frequencyValues?.length||0)+(c.resourceValues?.length||0)+(c.costValues?.length||0)>0&&b.push(c);return b}function M(a){let b=[],c=a.markdown.replace(F.H4,"");for(let d of a.assignments){let a=L(d.facts);if(a.length<3)continue;let e=[],f=[];for(let b of a){let a=K(b);for(let c of(a.length>=F.u1&&e.push(a),[...b.quantities||[],...b.scheduleValues||[],...b.frequencyValues||[],...b.resourceValues||[],...b.costValues||[]]))f.push(c.replace(F.H4,""))}let g=H(e),h=H(f),i=g.filter(a=>c.includes(a.replace(F.H4,""))),j=h.filter(a=>c.includes(a));g.length>=3&&i.length/g.length<.45&&b.push({level:"warning",message:`${d.chapterTitle} 量化对象覆盖不足:${i.length}/${g.length}`,suggestion:"请按对象、事项、区域、阶段或类别逐项补齐适用范围、数量、时间/资源和控制要点,避免只写一个笼统数量。"}),h.length>=5&&j.length/h.length<.35&&b.push({level:"warning",message:`${d.chapterTitle} 量化数值使用不足:${j.length}/${h.length}`,suggestion:"请把资料中的日期、数量、单位、规格、工期节点、频次、资源数量写入对应章节;无依据不得编造。"})}return b}var N=c(58965),O=c(91977);function P(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(N.tK,"")})`:""}`}function Q(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(N.VX,"").replace(N.tK,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function R(a){let b=Q(a),c=Math.max(1,b.length),d=(b.match(/[\u4e00-\u9fa5]/gu)||[]).length,e=(b.match(/\d/gu)||[]).length,f=(b.match(/项目|任务|质量|安全|周期|验收|材料|设备|表格|数据|参数|规范|标准|流程|资源|风险/gu)||[]).length,g=(b.match(/CAD|AcDb|Polyline|ByLayer|ObjectId|Handle|Model|Layout|图层|页码|第\s*\d+\s*页|打印|版权所有|^[\s\W\d_]+$/gimu)||[]).length,h=(b.match(/(?:序号|项目名称|事项|单位|数量|单价|金额|备注)/gu)||[]).length,i=Math.min(1,d/c*.7+Math.min(.3,(e+3*f)/120)),j=Math.min(1,.18*g+.04*Math.max(0,h-8)+.35*(d/c<.25));return{noiseScore:j,factDensity:i,shouldUse:b.length>=30&&j<.72&&i>.08}}function S(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=Q(b).split("\n").map(a=>a.trim()).filter(a=>a&&!/^(?:序号\s*)?(?:项目名称|单位|数量|综合单价|合价|备注)(?:\s+|$)/u.test(a)).filter(a=>!/^第\s*\d+\s*页\s*(?:共\s*\d+\s*页)?$/u.test(a)).join("\n"),f=R(d);return d.length>20&&f.shouldUse||d.length>80&&f.noiseScore<.9?d:[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d}(a.filePath,a.content),c=R(b);return{item:{...a,content:b,score:a.score*(1+c.factDensity)*(1-.45*c.noiseScore)},quality:c}}),g=f.filter(a=>a.quality.shouldUse||/附件,仅作为内部事实提取依据/u.test(a.item.content)),h=Number.isFinite(b)&&b>0?Math.ceil(b):void 0,i=(g.length>=Math.min(3,a.length)?g:f).sort((a,b)=>b.item.score-a.item.score).filter(a=>{let b=function(a){let b=a.content.replace(/\s+/gu," ").trim();return`${a.filePath}:${a.sectionTitle||""}:${(0,j.createHash)("sha1").update(b).digest("hex")}`}(a.item);return!d.has(b)&&(d.add(b),!0)}),k=h?i.slice(0,h):i;if(c){let b=f.reduce((a,b)=>a+b.quality.noiseScore,0),d=f.reduce((a,b)=>a+b.quality.factDensity,0);c.evidence.raw+=a.length,c.evidence.used+=k.length,c.evidence.filteredNoise+=Math.max(0,f.length-g.length),c.evidence.avgNoiseScore=f.length?Number((b/f.length).toFixed(3)):0,c.evidence.avgFactDensity=f.length?Number((d/f.length).toFixed(3)):0}return k.map(a=>a.item)}function T(a,b={},c){let d=Number.isFinite(b.maxItems)&&b.maxItems>0?Math.floor(b.maxItems):void 0,e=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.floor(b.maxChars):void 0,f=S(a,void 0,c),g=b.preservePinned?f.filter(a=>"pinned-evidence"===a.source||"bound-file"===a.source):[],h=f.filter(a=>!g.includes(a)),i=[],j=new Map,k=0,l=(a,b=!1)=>{if(d&&i.length>=d)return;let c=j.get(a.filePath)||0;if(!b&&c>=4)return;let f=Q(a.content),g=k+f.length;e&&i.length>0&&g>e||(i.push({...a,content:f}),j.set(a.filePath,c+1),k=g)};for(let a of g)l(a,!0);for(let a of h)l(a);return i}function U(a,b=0){return`- ${P(a,b)}:${Q(a.content).replace(/\s+/gu," ").slice(0,260)}`}function V(a,b){let c=new Map;for(let d of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|map|drawing|design/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(d.filePath,d.processingType),f=c.get(d.filePath)||{filePath:d.filePath,kind:b,roleId:d.roleId,processingType:d.processingType,score:d.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图-/u,"").replace(/-完整地图$/u,"完整地图"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(d.filePath,b),contentUse:"map"===b?"作为视觉/地图证据,用于说明空间关系、区域划分、点位、路线或布局。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、明细、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,d.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
12
|
-
${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","基础事实","附件资料","视觉资料","图片资料"].filter(b=>(0,O.Lk)(a,b)||c.includes(b)))]}(d,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=d.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),c.set(d.filePath,f)}let d=[...c.values()].sort((a,b)=>b.score-a.score),f={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of d)f[a.kind].push(a);let g=[`绑定材料包:文本片段 ${b.length} 条、结构化材料 ${d.length} 个。`,`材料类型分布:文本 ${f.text.length}、文档 ${f.document.length}、表格/数据 ${f.spreadsheet.length+f.table.length}、图片 ${f.image.length}、视觉/地图 ${f.map.length}、其他 ${f.attachment.length}。`,"正文必须只写材料中的事实、参数、数量、做法和要求,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:b,resources:d,byKind:f,summary:g}}function W(a,b=6e3,c=18e3){return Math.max(b,Math.min(c,Math.ceil(5.5*(Number.isFinite(a)&&a>0?Math.ceil(a):1200))))}function X(a,b,c,d){let e=b.trim();if(e){if(!Number.isFinite(d)||!d||c.chars+e.length<=d){a.push(e),c.chars+=e.length;return}c.omitted+=1}}function Y(a,b,c){let d={chars:0,omitted:0},e=[],f=new Set,g=new Set,h=[...a].sort((a,b)=>b.score-a.score);for(let a of h){if(g.has(a.filePath))continue;let h=e.length;X(e,c(a,e.length),d,b),e.length>h&&(g.add(a.filePath),f.add(a))}for(let a of h)f.has(a)||X(e,c(a,e.length),d,b);return{lines:e,omitted:d.omitted}}function Z(a,b={}){let c=Number.isFinite(b.maxChars)&&b.maxChars>0?Math.ceil(b.maxChars):void 0,d=Y(a.resources,c?Math.floor(.35*c):void 0,(a,b)=>[`- 资料:${P(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(Q).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")),e=Y(a.textEvidence,c?Math.floor(.65*c):void 0,(a,b)=>`${P(a,b)}
|
|
13
|
-
类型:${a.processingType||"reference"}
|
|
14
|
-
章节/片段:${a.sectionTitle?.replace(N.tK,"")||"资料片段"}
|
|
15
|
-
内容:${Q(a.content).replace(/\s+/gu," ")}`),f=d.omitted+e.omitted>0?`提示:完整证据池仍保留 ${a.textEvidence.length} 条文本片段、${a.resources.length} 个结构化材料;为控制单次模型输入,本次只发送预算内高相关且覆盖多来源的证据,未发送片段将在章节/小节相关检索和质量校验中继续参与。`:"";return[a.summary,f,d.lines.length?`结构化资料:
|
|
16
|
-
${d.lines.join("\n")}`:"",e.lines.length?`文本/附件片段:
|
|
17
|
-
${e.lines.join("\n\n---\n\n")}`:""].filter(Boolean).join("\n\n")}var $=c(70208);function _(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let aa=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,ab=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,ac=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function ad(a){return(function(a){let b=a.trim(),c=/^```(?:markdown|md)?\s*\n([\s\S]*?)\n```\s*$/iu.exec(b);return c?c[1].trim():a})(a).replace(/\b(m|㎡)\s*2\b/giu,"平方米").replace(/\bm\s*[²2]\b/giu,"平方米").replace(/\b(m|㎥)\s*3\b/giu,"立方米").replace(/\bm\s*[³3]\b/giu,"立方米").replace(/\bmm2\b/giu,"平方毫米").replace(/\bcm2\b/giu,"平方厘米").replace(/\bkm2\b/giu,"平方千米").replace(/\s*×\s*/gu,"\xd7").replace(/\s*≤\s*/gu,"≤").replace(/\s*≥\s*/gu,"≥").replace(/\s*±\s*/gu,"\xb1").replace(aa,"").replace(ab,"").replace(ac,"").replace(N.tK,"").replace(/^#\s+/gmu,"").replace(N.VX,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").split(/\r?\n/u).filter(a=>{let b=a.trim();if(!b||/^\s*\|/u.test(b)||/^\s*\|?\s*:?-{3,}:?/u.test(b))return!0;let c=(0,$.GQ)(b.replace(/^#{1,6}\s+/u,""));return!(c.length<=1)&&!(/[,、;:和与在为对将]$/u.test(c)||/(通过|包括|如下|主要包括)$/u.test(c))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}let ae="你正在生成可直接交付的专业文档,不是系统调试报告。\n通用质量约束只用于补充用户要求、模板章节和绑定提示词;除事实安全、结构边界和导出格式要求外,不得覆盖用户明确要求。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n用户提供的信息和绑定材料应内化为正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n正文不得把原始文件条款、说明性附件或系统过程内容误作为章节标题或目录项。\n正文事实必须来自当前模板、用户要求、绑定提示词和绑定材料;信息不足或来源冲突时应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出。",af="只生成当前小节正文,不生成其他二级小节,不重复章节一级标题。\n优先使用当前模板、用户要求、绑定提示词和绑定材料中的事实;缺少依据时不得编造具体数值、名称、时间、规格或责任。\n小节应有实质正文;除非用户或模板明确要求纯表格,否则表格只能作为辅助表达,不能整节只有表格。\n不得用通用兜底段落、空泛管理话术或后台缺料说明冒充正文;信息不足时只写已有事实、适用边界和待复核口径。";function ag(a){return(0,$.GQ)(a.replace(/^#+\s*/u,"")).replace(/^(?:第)?[一二三四五六七八九十百千万\d]+章\s*/u,"").trim().replace(/\s+/gu,"")}function ah(a,b){let c=ag(a),d=ag(b);return!!(c&&d&&c===d)}function ai(a){return[...new Set([...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>(0,$.GQ)(a[1]||"")).filter(a=>a.length>=2&&a.length<=80).filter(a=>!/^\d+(?:\.\d+){2,}\s+/u.test(a)))]}function aj(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;let e=/^(#{4,5})\s+(.+)$/u.exec(a.trim());if(e){if(!c)return"#####"===e[1]?a.replace(/^\s*#####/u,"####"):a;let b=(e[2]||"").trim(),f=(0,$.GQ)(b.replace(/^\d+\.\d+\.\d+\s+/u,""));return f?(d+=1,`#### ${c}.${d} ${f}`):a}return a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function ak(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(`^${ao(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${(0,$.GQ)(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}}return b}function al(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[(0,$.tb)(b,a.title),"",...c.flatMap((a,c)=>[` ${function(a,b,c){let d=(0,$.GQ)(c);return!function(a){let b=/^\s*(\d+)\.(\d+)[..、]?\s+(.+)$/u.exec(a);return!!b&&(0,$.GQ)(b[3]||"").trim()===(0,$.GQ)(a).trim()}(c)?`${a+1}.${b+1} ${d}`:d}(b,c,a)}`,""])]})].join("\n")}function am(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 an(a,b){let c=am(a);b.forEach((a,b)=>{let d=(0,$.GQ)(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${ao(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${(0,$.tb)(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0,g=0,h="",i=new Set,j=a=>{let c=b[e]?.sections||[],d=ap(a);return c.findIndex(a=>ap(a)===d)},k=(a,c)=>{let d=(0,$.GQ)(a),k=j(d),l=b[e]?.sections||[];if(l.length>0&&k<0)return f||(f=1,h=`${e+1}.1`),(g+=1)<=4?`#### ${e+1}.${f}.${g} ${d}`:`**${d}**`;let m=k>=0?k+1:f+1,n=k>=0?ap(l[k]):ap(d);return i.has(n)?(f=m,h=c||`${e+1}.${f}`,g+=1,`#### ${e+1}.${f}.${g} ${d}`):(f=m,g=0,h=c||`${e+1}.${f}`,i.add(n),`### ${e+1}.${f} ${k>=0?(0,$.GQ)(l[k]):d}`)};return d.map(a=>{let c=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(c))return e+=1,f=0,g=0,h="",i=new Set,a;let d=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(c);if(e>=0&&d)return k(d[3]||"",`${d[1]}.${d[2]}`);let l=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&l)return k(l[3]||"",l[1]&&l[2]?`${l[1]}.${l[2]}`:void 0);let m=/^####\s+(\d+)\.(\d+)(?!\.)\s+(.+)$/u.exec(c);if(e>=0&&m)return k(m[3]||"",`${m[1]}.${m[2]}`);let n=/^####\s+(?:(\d+)\.(\d+)\.(\d+)\s+)?(.+)$/u.exec(c);if(e>=0&&n){let a=n[1]&&n[2]?`${n[1]}.${n[2]}`:h,c=(0,$.GQ)(n[4]||""),d=ap(c),l=j(c)>=0&&!i.has(d);return!f||a&&a!==h&&(0===(b[e]?.sections||[]).length||l)?k(c,a):(g+=1)<=4?`#### ${e+1}.${f}.${g} ${c}`:`**${c}**`}return a}).join("\n")}function ao(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function ap(a){return(0,$.GQ)(a.replace(/^\s*\d+(?:\.\d+)*[..、]?\s*/u,"")).replace(/[\s::.。]+$/gu,"").trim()}function aq(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=(0,$.YZ)(b),d=[...a.matchAll(/^##\s+(.+)$/gmu)].map(a=>({index:a.index||0,raw:a[0],title:(0,$.YZ)(a[1]||"")})),e=d.find(a=>a.title===c);if(!e)return;let f=d.find(a=>a.index>e.index&&a.title!==c),g=e.index+e.raw.length,h=f?.index??a.length;return{start:e.index,end:h,heading:e.raw,body:a.slice(g,h)}}(a,d.title);if(!b){c.push({level:"error",message:`${d.title} 正文缺少章节标题`,suggestion:"请重新生成,确保模板章节完整输出。"});continue}let e=b.heading+b.body,f=(d.sections||[]).filter(a=>!function(a,b){let c=ap(b);return a.split(/\r?\n/u).some(a=>{let b=/^#{2,4}\s+(.+)$/u.exec(a.trim());return!!b&&ap(b[1]||"")===c})}(e,a));f.length>0&&c.push({level:"error",message:`${d.title} 正文缺少规划小节:${f.join("、")}`,suggestion:"请重新生成或检查审查阶段是否删除了二级小节。"}),d.tableSections?.length&&!/\|[^\n]+\|\s*\n\s*\|\s*:?-{3,}:?\s*\|/u.test(e)&&c.push({level:"error",message:`${d.title} 缺少必要的正式表格`,suggestion:"请按模板 tableSections/tableRequirements 在对应小节补充正式 Markdown 表格。"})}return c}function ar(a){let b=[...a.matchAll(/^##\s+.+$/gmu)];if(0===b.length)return a;let c=a.slice(0,b[0].index||0);for(let d=0;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f),h=[...g.matchAll(/^###\s+(\d+)\.(\d+)\s+.+$/gmu)];if(h.length<2){c+=g;continue}let i=h[0].index||0;c+=g.slice(0,i)+h.map((a,b)=>{let c=a.index||0,d=h[b+1]?.index??g.length;return{order:Number(a[2]||b+1),content:g.slice(c,d).trim()}}).sort((a,b)=>a.order-b.order).map(a=>a.content).join("\n\n")+"\n\n"}return c.replace(/\n{3,}/gu,"\n\n").trim()}function as(a,b,c={}){let d=ar(aj(ad(_(a,!!c.forbidDrawingImages)))),e=function(a,b){let c=an(am(a),b),d=[...c.matchAll(/^##\s+(.+)$/gmu)];return b.map((a,e)=>{let f=(0,$.tb)(e,a.title),g=d.find(a=>ah(a[1]||"",f));if(!g||void 0===g.index)return a.sections||[];let h=d.find(a=>(a.index||0)>(g.index||0)&&b.some(b=>ah(a[1]||"",b.title))),i=a.sections||[];if(i.length>0)return i;let j=ai(c.slice(g.index,h?.index??c.length));return j.length>0?j.slice(0,6):[]})}(d,b),f=b.map((a,b)=>({...a,sections:e[b]?.length?e[b]:a.sections||[]}));return{markdown:ar(aj(ad(function(a,b){let c=an(a,b),d=al(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)}
|
|
18
|
-
|
|
19
|
-
${d}
|
|
20
|
-
|
|
21
|
-
${e}
|
|
22
|
-
|
|
23
|
-
${c.slice(a).trimStart()}`}return`${d}
|
|
24
|
-
|
|
25
|
-
<div class="page-break"></div>
|
|
26
|
-
|
|
27
|
-
${c}`}(d,f)))),chapters:f}}function at(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${(0,$.tb)(b,a.title)}`,d=ad(a.content);var e=/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
|
|
28
|
-
|
|
29
|
-
${d}`,f=a.title;let g=e.split(/\r?\n/u),h=!1;return g.filter((a,b)=>{let d=a.trim(),e=/^##\s+(.+)$/u.exec(a.trim())?.[1]||"";if(e){if(ah(e,c))return!h&&(h=!0,!0);if(b>0&&ah(e,f))return!1}return!(d&&!/^#{1,6}\s+/u.test(d)&&ah(d,f))}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()})(a,b)).filter(Boolean).join("\n\n");return as(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',al(a.chapters),'\n<div class="page-break"></div>\n',b].join("\n"),a.chapters).markdown}var au=c(78217),av=c(23760),aw=c(73024),ax=c(15751),ay=c(95393),az=c(96770),aA=c(29281);function aB(a){return(0,j.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function aC(a){return Array.isArray(a)?a.map(a=>String(a||"").trim()).filter(Boolean):"string"==typeof a&&a.trim()?[a.trim()]:[]}function aD(a){return Array.isArray(a)?a.filter(a=>a&&"object"==typeof a):a&&"object"==typeof a?[a]:[]}function aE(a,b){return a.toLowerCase().replace(/[^a-z0-9\u4e00-\u9fa5]+/giu,"-").replace(/^-|-$/gu,"").slice(0,48)||b}function aF(a){if(null==a)return"";if("string"==typeof a)return a;if("number"==typeof a||"boolean"==typeof a)return String(a);try{return JSON.stringify(a)}catch{return String(a)}}function aG(a){if(a?.aborted)throw Error("用户中止")}let aH=new Map,aI=0;function aJ(){let a=process.env.DOCUMENT_LLM_CONCURRENCY;if(!a?.trim())return;let b=Number(a);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}let aK=aJ(),aL=0,aM=[];function aN(){return aK??0}function aO(a,b){let c=(0,az.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function aP(){let a=(0,aA.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}function aQ(a,b){let c=aJ(),d=aK;if(void 0===c||void 0===aK){aL=a?0:aL+1,b&&(b.llm.currentLimit=0);return}a?(aL=0,0===aM.length&&aK<c&&(aK+=1)):(aL+=1)>=2&&(aK=Math.max(1,aK-1)),b&&(b.llm.currentLimit=aK,d!==aK&&(b.llm.limitAdjustments+=1))}async function aR(a,b,c){for(;void 0!==aK&&aI>=aK;){let a=Date.now();if(c&&(c.llm.throttledWaits+=1),b?.aborted)throw Error("用户中止");await new Promise((a,c)=>{let d={resolve:a,reject:c,active:!0,signal:b};d.onAbort=()=>{if(!d.active)return;d.active=!1;let a=aM.indexOf(d);a>=0&&aM.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),aM.push(d)}),c&&(c.llm.throttledWaitMs+=Date.now()-a)}aI+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,aI));try{let b=await a();return aQ(!0,c),b}catch(a){throw aQ(!1,c),a}finally{for(aI=Math.max(0,aI-1);aM.length>0;){let a=aM.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function aS(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=aP();if(!e)return;let{model:f,provider:g}=e,h=aB({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?aB(g.apiKey):""}),i=aH.get(h);i||(i=(0,ay.createProvider)(aO(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),aH.set(h,i));let j=Math.max(3e4,Number(d.timeoutMs??process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await aR(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),j)}),h=[i.chat([{role:"system",content:c?`${a}
|
|
30
|
-
只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:d.temperature??.3*!c,maxTokens:d.maxTokens,signal:d.signal}),g];return d.signal&&h.push(new Promise((a,b)=>{if(d.signal?.aborted)return void b(Error("用户中止"));f=()=>b(Error("用户中止")),d.signal?.addEventListener("abort",f,{once:!0})})),Promise.race(h).finally(()=>{e&&clearTimeout(e),f&&d.signal?.removeEventListener("abort",f)})},d.signal,d.diagnostics)).content.trim()}catch(a){if(d.diagnostics&&(d.diagnostics.llm.failures+=1),d.signal?.aborted)throw Error("用户中止",{cause:a});return}}async function aT(a,b,c){let d,e=new AbortController;if(c?.aborted)throw Error("用户中止");let f=()=>e.abort();c?.addEventListener("abort",f,{once:!0});let g=new Promise(a=>{d=setTimeout(()=>{e.abort(),a(null)},b)}),h=[Promise.resolve().then(()=>a(e.signal)),g];c&&h.push(new Promise((a,b)=>{e.signal.addEventListener("abort",()=>{c.aborted&&b(Error("用户中止"))},{once:!0})}));try{let a=await Promise.race(h);if(c?.aborted)throw Error("用户中止");return a}finally{d&&clearTimeout(d),c?.removeEventListener("abort",f)}}async function aU(a,b,c={}){let d=await aS(a,b,!0,{maxTokens:c.maxTokens,temperature:c.temperature,signal:c.signal,diagnostics:c.diagnostics,timeoutMs:c.timeoutMs});if(d)try{return JSON.parse(function(a){let b=a.trim(),c=b.match(/^```(?:json)?\s*([\s\S]*?)\s*```$/iu)?.[1]?.trim();if(c)return c;let d=b.indexOf("{"),e=b.lastIndexOf("}"),f=b.indexOf("["),g=b.lastIndexOf("]"),h=d>=0&&e>d?b.slice(d,e+1):"",i=f>=0&&g>f?b.slice(f,g+1):"";return h&&(!i||d<=f)?h:i||b}(d))}catch{return}}async function aV(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_CHARS??45e3))),h=Math.max(8,Math.floor(Number(process.env.DOCUMENT_FACT_EXTRACTION_MAX_ITEMS??48))),i=0,j=[];for(let b of a.slice(0,h)){let a=aF(b.content).replace(/\s+/gu," ").slice(0,Math.max(800,Math.floor(g/h))),c=`文件:${b.filePath}
|
|
31
|
-
角色:${b.roleId||""}
|
|
32
|
-
处理:${b.processingType||""}
|
|
33
|
-
内容:${a}`;if(j.length>0&&i+c.length>g)break;i+=c.length,j.push(c)}let k=j.join("\n\n---\n\n");if(!k.trim())return{facts:[],stages:f};aG(e);let l=(0,O.Uy)(c,d),m=l.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),n=await aU(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
|
|
34
|
-
返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"reference","confidence":0.8}]}。
|
|
35
|
-
|
|
36
|
-
动态事实 schema:
|
|
37
|
-
${m}
|
|
38
|
-
|
|
39
|
-
资料:
|
|
40
|
-
${k}`,{signal:e});return(aG(e),n?.facts?.length)?{facts:n.facts.filter(a=>a.key&&a.value).map(a=>{let b=l.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:aF(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${n.facts.length} 条事实`}]}:{facts:[],stages:f}}function aW(a){return/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期|税率/u.test(a)}function aX(a){return a?({"knowledge-base":"知识库","document-readiness":"生成准备度检查","quality-repair":"质量补写","export-gate":"导出门禁","context-memory":"上下文","final-format":"正式排版","multimodal-files":"多模态文件理解","llm-json":"LLM 事实抽取","llm-review":"LLM 审查","document-workflow":"最终规范校验"})[a]:void 0}function aY(a,b={}){let c={executionVersion:2,title:{role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",context_recall:"上下文召回",file_understanding:"文件角色读取",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",asset_generation:"生成资源处理",llm_review:"LLM 审查优化",validation:"内容优化与质量校验",formatting:"正式排版整理",export_ready:"导出就绪检查",reference:"资料增强"}[a.type],group:a.type,...a,...b};return{...c,roleName:c.roleName||aX(c.roleId),subtitle:c.subtitle||c.roleName||aX(c.roleId)}}function aZ(a,b){let c=a.findIndex(a=>a.type===b.type&&a.roleId===b.roleId&&a.promptId===b.promptId);return c>=0?(a[c]={...b,order:a[c]?.order??b.order},c):(a.push(b),a.length-1)}function a$(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}async function a_(a,b,c,d){let e=Date.now();try{return await c()}finally{let c=Date.now();a.metrics.push({name:b,startedAt:e,endedAt:c,durationMs:c-e,meta:d})}}function a0(a){return a.toLowerCase()}function a1(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}function a2(a){let b=[];for(let c of a)F.ee.lastIndex=0,F.ee.test(c)&&b.push(c);return b}function a3(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function a4(a,b,c,e){let f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=Z({chapterId:b.id,textEvidence:c,resources:[],byKind:{map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]},summary:""},{maxChars:W(1800,8e3,Math.max(14e3,3500*aN()))}),h=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
|
|
41
|
-
节点类型:${b.outputType}
|
|
42
|
-
文件角色:${b.fileRoleName}(${b.fileRoleId})
|
|
43
|
-
要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。提示词角色只提供规则和格式约束,其中的示例、样例、占位项目名、编号、日期、数量和示例正文不得作为事实抽取来源。
|
|
44
|
-
|
|
45
|
-
请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 必须只来自下面的绑定文件片段,优先抽取对象、范围、区域、阶段、数量、日期、周期、规格、单位、资源数量、检查频次和来源口径;同类对象不得合并丢失,计量单位保持原文含义,必要时使用导出友好的正式写法。
|
|
46
|
-
|
|
47
|
-
绑定文件片段:
|
|
48
|
-
${g}`,i=[];aG(e);let j=g.trim()?await aU(f,h,{signal:e}):void 0;if(aG(e),a3(j)){i.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await aU("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
|
|
49
|
-
|
|
50
|
-
原始 JSON:
|
|
51
|
-
${JSON.stringify(j)}`,{signal:e});a&&!a3(a)?j=a:i.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let k=aD(j?.chapters),l=aD(j?.facts),m=[];k.forEach((b,c)=>{let e="string"==typeof b.title?(0,$.YZ)(b.title):"";!e||!(0,$.bE)(b.title||e)||(0,d.DX)(e,a)||m.push({id:aE(e,`chapter-${c+1}`),title:e,order:c,sourceRequirement:b.sourceRequirement||e,requiredContents:aC(b.requiredContents),writingRules:aC(b.writingRules),evidenceNeeds:aC(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:aD(b.requirements).map((a,b)=>({id:aE(`${e}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:aC(a.requiredContents),writingRules:aC(a.writingRules),evidenceNeeds:aC(a.evidenceNeeds),preferredSourceRoleIds:aC(a.preferredSourceRoleIds)}))})});let n=[],o=new Set(c.map(a=>a.filePath));l.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&o.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&o.has(e)&&n.push({key:d,value:Q(aF(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:aC(a.relatedChapterHints)})});let p=m.length>0?[]:function(a,b,c){if("template_requirements"!==b.outputType)return[];let e=[],f=new Set;for(let b of c)for(let c of b.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!RegExp(`^(?:第(?:\\d{1,3}|${N.$m})[章节]|[((]?(?:\\d{1,3}|${N.$m})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let g=(0,$.YZ)(c);!(0,$.bE)(c)||f.has(g)||(0,d.DX)(g,a)||(f.add(g),e.push({id:aE(g,`chapter-${e.length+1}`),title:g,order:e.length,sourceRequirement:b.content.replace(/\s+/gu," "),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}))}return e}(a,b,c),q=n.length>0?[]:function(a,b){let c=[];for(let d of b){let b=d.content.replace(/\s+/gu," ");b.length<=20||c.push({key:`${a.fileRoleName}事实${c.length+1}`,value:b,sourceFile:d.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:d.sectionTitle?[d.sectionTitle]:[]})}return c}(b,c);return 0===m.length&&p.length>0&&i.push(`${b.fileRoleName} 结构化章节读取不足,已补充使用证据标题兜底。`),0===n.length&&q.length>0&&i.push(`${b.fileRoleName} 结构化事实读取不足,已补充使用证据片段兜底。`),{node:b,evidence:S(c,void 0),chapters:m.length>0?m:p,facts:n.length>0?n:q,outputRequirements:aC(j?.outputRequirements),warnings:[...i,...aC(j?.warnings)],forbidImageInsertion:j?.forbidImageInsertion??"drawing_facts"===b.outputType}}function a5(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}function a6(a,b,c){let d=function(a,b){let c=[a.title];for(let b of a.requiredFacts||[])b&&c.push(b);for(let a of b?.requiredContents||[])a&&c.push(a);for(let a of b?.evidenceNeeds||[])a&&c.push(a);for(let a of b?.requirements||[]){for(let b of(a.title&&c.push(a.title),a.requiredContents))b&&c.push(b);for(let b of a.evidenceNeeds)b&&c.push(b)}return c}(b,c),e=[],f=Math.max(40,Math.min(120,Number(process.env.DOCUMENT_ROLE_FACTS_PER_CHAPTER??80)));for(let b of a)for(let a of b.facts)if(function(a,b){if(0===b.length)return!0;let c=`${a.key}
|
|
52
|
-
${aF(a.value)}
|
|
53
|
-
${a.relatedChapterHints.join("\n")}`;for(let d of b)if(c.includes(d)||d.includes(a.key))return!0;return!1}(a,d)&&(e.push({artifact:b,fact:a}),e.length>=f))return e;return e}function a7(a,b,c){let d=a6(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?`要求项:
|
|
54
|
-
${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}:${Q(aF(b.value))}`])}let g=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_FACT_LINES_PER_GROUP??18))),h=[...f.entries()].map(([a,b])=>`### ${a}
|
|
55
|
-
${b.slice(0,g).map(a=>a.replace(N.tK,"").replace(N.VX,"").slice(0,320)).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
|
|
56
|
-
${e}`:"",h?`【角色节点结构化产物】
|
|
57
|
-
${h}`:""].filter(Boolean).join("\n\n")}function a8(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function a9(a,b,c,d,e){let f=[],g=Math.max(24,Math.min(80,Number(process.env.DOCUMENT_TENDER_QUALITY_ISSUE_LIMIT??40))),h=a=>{f.length<g&&f.push(a)};for(let b of c)for(let c of(a.includes(b.title)||h(`章节计划建议未体现:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&h(`${b.title} 未覆盖必写内容:${c}`);for(let d of b){let b=c.find(a=>a.title===d.title),e=b?.minWords||1e3;for(let b of(d.content.length<e&&h(`${d.title} 内容深度不足:${d.content.length}/${e}`),d.sections||[]))b&&!a.includes(b)&&h(`${d.title} 缺少目录小节:${b}`)}for(let b of d){let c=b.facts.slice(0,8).map(a=>aF(a.value).slice(0,80)).filter(a=>a.length>=6);c.length>0&&!c.some(b=>a.includes(b))&&h(`未体现 ${b.node.fileRoleName} 的关键读取结果`)}return e&&/!\[[^\]]*\]\([^)]*\)/iu.test(a)&&h("正文包含不应插入的图片"),/\b(?:m\s*[²2]|m\s*[³3]|mm2|cm2|km2)\b/iu.test(a)&&h("正文包含导出不友好的计量单位写法"),[...new Set(f)].slice(0,g)}function ba(a){return F.MG.lastIndex=0,F.MG.test(a)}function bb(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),(0,av.AC)(a.content,[{id:a.chapter.id,title:a.chapter.title,content:a.content,evidence:[],sections:a.chapter.sections||[],missingFacts:[]}])))b.push(c.message);for(let c of a.chapter.sections||[]){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*[..、]?\\s+)?${d}\\s*\\n([\\s\\S]*?)(?=^###\\s+|^##\\s+|$)`,"mu"));e?180>(0,au.V7)(e[1])&&b.push(`规划小节正文过短:${c}`):b.push(`缺少规划小节:${c}`)}for(let c of((0,au.V7)(a.content)<Math.floor(.85*a.targetWords)&&b.push("正文篇幅明显低于目标"),aa.lastIndex=0,(aa.test(a.content)||/知识库|检索|角色节点|事实字段|校验结果/u.test(a.content))&&b.push("正文包含后台流程话术"),/资料未提供|满足相关要求|结合实际情况|按(?:相关|有关|规范|规定|设计)要求/u.test(a.content)&&b.push("正文存在空泛占位表达"),a.missingFacts.slice(0,8)))c&&!a.content.includes(c)&&b.push(`requiredFacts 未明显覆盖:${c}`);return[...new Set(b)].slice(0,12)}async function bc(a){aG(a.signal);let b=a.repairType||function(a){let b=a.join("\n");for(let a of F.NP)if(a.pattern.lastIndex=0,a.pattern.test(b))return a.type;return"generic"}(a.issues),c=await aU(["你是章节局部修复专家。只返回 JSON patch,不返回完整章节,不重写无问题内容。",F._$[b]||F._$.generic,ae,a.forbidDrawingImages?"图片类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","每个 patch 必须能通过 originalText 或 targetStart/targetEnd 在原章节中唯一定位;replacement 只替换该局部片段。","禁止新增证据摘要中没有的信息;无法安全定位的问题不要生成 patch。",'返回 JSON:{"patches":[{"originalText":"原局部文本","targetStart":"定位起始文本","targetEnd":"定位结束文本","replacement":"替换后的局部文本","reason":"修复原因"}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`需要局部修复的问题:
|
|
58
|
-
${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
|
|
59
|
-
${Z(V({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence),{maxChars:W((0,au.V7)(a.chapter.content),5e3,14e3)})}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});aG(a.signal);let d=a.chapter.content,e=0;for(let b of Array.isArray(c?.patches)?c.patches:[]){let c=function(a){var b;let c=a.patch.replacement?.trim(),d=(b=a.content,Math.max(2600,Math.min(16e3,Math.ceil(.45*(0,au.V7)(b)))));if(!c||c.length>d||a.forbidDrawingImages&&/!\[[^\]]*\]\([^)]*\)/iu.test(c))return{content:a.content,applied:!1};let e=function(a,b){let c=b.originalText?.trim();if(c&&a.indexOf(c)===a.lastIndexOf(c))return c;let d=b.targetStart?.trim(),e=b.targetEnd?.trim();if(!d||!e)return;let f=a.indexOf(d),g=a.indexOf(e,f+d.length);if(f<0||g<0)return;let h=g+e.length,i=a.slice(f,h);return a.indexOf(i)===a.lastIndexOf(i)?i:void 0}(a.content,a.patch);if(!e||e.length>d)return{content:a.content,applied:!1};let f=ad(_(a.content.replace(e,c),a.forbidDrawingImages));return!function(a,b){let c=(a.match(/```/gu)||[]).length,d=b.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").trim();return c%2==0&&(!d||a.includes(d))&&!/^\s*$/u.test(a)}(f,a.title)||(0,au.V7)(f)<Math.floor(.65*(0,au.V7)(a.content))?{content:a.content,applied:!1}:{content:f,applied:f!==a.content}}({content:d,patch:b,title:a.chapter.title,forbidDrawingImages:a.forbidDrawingImages});d=c.content,c.applied&&(e+=1)}return{content:d,appliedCount:e,repairType:b}}async function bd(a){let b=a.issues.filter(a=>"minor"!==(0,av.z0)(a)).filter(ba);if(0===b.length)return{markdown:a.markdown,chapters:a.chapters,stage:void 0};let c=a.chapters.map(a=>({chapter:a,issues:function(a,b){let c=b.filter(ba),d=new Set(a.sections||[]),e=`${a.title}
|
|
60
|
-
${a.sections?.join("\n")||""}
|
|
61
|
-
${a.content.slice(0,8e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||按设计要求|按规范要求|m\s*[²2]|mm2|cm2|km2/u.test(e)).slice(0,6)}(a,b)})).filter(a=>a.issues.length>0);if(0===c.length)return{markdown:a.markdown,chapters:a.chapters,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已完成质量检查,未定位到可安全局部修复的阻断问题:共 ${b.length} 个;${b.slice(0,8).join(";")}`}};let d=Number(process.env.DOCUMENT_REPAIR_CONCURRENCY??a.strategy?.maxChapterReviewConcurrency??c.length),e=Math.max(1,Math.min((a.strategy?.maxChapterReviewConcurrency??c.length)||1,Number.isFinite(d)?Math.floor(d):c.length||1)),f=new Map,g=0;for(let b=0;b<c.length;b+=e){aG(a.signal);let d=c.slice(b,b+e);(await Promise.all(d.map(async b=>bc({template:a.template,chapter:b.chapter,issues:b.issues,promptTexts:a.promptTexts,requirement:a.requirement,forbidDrawingImages:a.forbidDrawingImages,diagnostics:a.diagnostics,signal:a.signal})))).forEach((a,b)=>{f.set(d[b].chapter.id,a.content),g+=a.appliedCount})}let h=0,i=a.chapters.map(a=>{let b=f.get(a.id);return b&&b!==a.content?(h+=1,{...a,content:b}):a}),j=h>0?`已应用 ${g} 个局部质量 patch,修复 ${h} 个章节;未进行整章或全文重写`:`已完成质量检查,未生成可唯一定位且通过校验的局部 patch:共 ${b.length} 个;${b.slice(0,8).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function be(a,b){let c=e.isAbsolute(b)?b:e.join(a,b),d=e.isAbsolute(b)?e.relative(a,b):b;return[b,c,d,e.join(a,d)]}function bf(a,b,c){return function(a,b){let c=e.resolve(a),d=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let d=e.resolve(c,"knowledgeBase",b);return aw.existsSync(d)?d:e.resolve(c,b)}(c,b);return d===c||d.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&be(a,b).some(a=>c.has(a))}function bg(a,b){return new Set(b.flatMap(b=>be(a,b.filePath)))}function bh(a){let b=a.replace(/```[\s\S]*?```/gu,"\n【示例代码块已省略:仅作为格式参考,不作为当前文档事实】\n").split(/\r?\n/u),c=[],d=!1,e=!1;for(let a of b){let b=a.trim();if((0,$.bl)(b)&&(e=!0),e){c.push(a),(0,$.Ui)(b)&&(e=!1);continue}let f=/^(?:#+\s*)?(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?/iu.test(b),g=/(?:不得|禁止|必须|应当|要求|规则|格式|输出|保留|只返回|不要)/u.test(b);if(f&&!g){c.at(-1)?.includes("示例内容已省略")||c.push("【示例内容已省略:仅作为格式参考,不作为当前文档事实】"),d=!0;continue}if(d){if(!b){d=!1;continue}if(!/^(?:#+\s*)?(?:规则|要求|输出|格式|禁止|注意|正文|章节|风格|校验)/u.test(b))continue;d=!1}c.push(a)}return c.join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function bi(a,b){let c=function(){let a=new Map;for(let b of(0,i.XB)("prompt"))a.set(b.id,b.executionType||"reference");return a}(),e=new Set(b),f=[];for(let b of(0,d.dU)(a))e.has(c.get(b.roleId)||"reference")&&f.push(`## [${b.roleId}] ${b.name}
|
|
62
|
-
${bh(b.content)}`);return f.join("\n\n")}function bj(a,b){let c=a.trim();if(!c)return[];let d=Math.max(1e3,Math.ceil(b)),e=[];for(let a=0;a<c.length;a+=d)e.push(c.slice(a,a+d));return e}function bk(a,b,c){return c<=1?a:`【片段 ${b+1}/${c}】
|
|
63
|
-
${a}`}function bl(a,b=1800){let c=(a.sections||[]).filter(Boolean).join("、")||"未规划小节",d=a.content.replace(/```[\s\S]*?```/gu," ").replace(/[#>*_`\-|]+/gu," ").replace(/\s+/gu," ").trim(),e=Math.max(800,b-500),f=Math.max(600,Math.floor(.7*e)),g=Math.max(200,e-f),h=d.slice(0,f),i=d.length>f+g?d.slice(-g):"",j=Math.max(120,Math.floor((b-h.length-i.length)/4)),k=a.evidence.slice(0,4).map(a=>`${a.filePath||a.roleId||"证据"}: ${Q(a.content||"").slice(0,j)}`).join("\n"),l=a.missingFacts.length?`未覆盖事实:${a.missingFacts.slice(0,12).join("、")}`:"未覆盖事实:无";return[`章节:${a.title}`,`字数:${(0,au.V7)(a.content)}`,`小节:${c}`,l,k?`证据摘要:
|
|
64
|
-
${k}`:"",`正文摘要:${h}${i?`
|
|
65
|
-
尾部摘要:${i}`:""}`].filter(Boolean).join("\n").slice(0,b)}function bm(a){if("string"==typeof a)return a.trim();if(!a||"object"!=typeof a)return"";let b="string"==typeof a.message?a.message.trim():"",c="string"==typeof a.suggestion?a.suggestion.trim():"",d="string"==typeof a.location?a.location.trim():"",e="string"==typeof a.type?a.type.trim():"";return["string"==typeof a.severity?a.severity.trim():"",d||e,b,c].filter(Boolean).join(":").trim()}function bn(a){return[...new Set(a.map(bm).filter(Boolean))]}function bo(a){let b=Number(process.env[a]);return Number.isFinite(b)&&b>0?Math.floor(b):void 0}function bp(a){let b=Math.max(1,Math.ceil(Math.max(0,a.totalChars)/Math.max(1e3,a.chunkChars))),c=Math.max(1,a.chapterCount),d=Math.max(1,Math.ceil(a.totalChars/24e3));return"chapter"===a.phase?{chunks:bo("DOCUMENT_CHAPTER_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(2,Math.ceil(.75*b))),issues:bo("DOCUMENT_CHAPTER_REVIEW_MAX_ISSUES")??Math.max(8,Math.ceil(8*d)),ms:Math.max(6e4,Number(process.env.DOCUMENT_CHAPTER_REVIEW_MAX_MS??Math.min(72e4,Math.max(18e4,9e4*d))))}:"global"===a.phase?{chunks:bo("DOCUMENT_GLOBAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.65*b))),issues:bo("DOCUMENT_GLOBAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(120,8*c+10*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_GLOBAL_REVIEW_MAX_MS??Math.min(108e4,Math.max(24e4,12e4*d))))}:{chunks:bo("DOCUMENT_FINAL_REVIEW_MAX_CHUNKS")??Math.min(b,Math.max(c,Math.ceil(.8*b))),issues:bo("DOCUMENT_FINAL_REVIEW_MAX_ISSUES")??Math.max(24,Math.min(140,10*c+12*d)),ms:Math.max(9e4,Number(process.env.DOCUMENT_FINAL_REVIEW_MAX_MS??Math.min(12e5,Math.max(3e5,15e4*d))))}}async function bq(a,b,c){let d=aP();if(!d?.provider.capabilities?.fileUnderstanding&&!d?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};aG(c);let f=(0,ay.createProvider)(aO(d.model.provider,d.provider),{baseUrl:d.provider.baseUrl,apiKey:d.provider.apiKey,modelName:d.model.name,directEndpoint:d.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=Math.max(1,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_FILES??4))),h=Math.max(131072,Math.floor(Number(process.env.DOCUMENT_FILE_UNDERSTANDING_MAX_BYTES??8388608))),i=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,g),j=[],k=i.map(b=>{let c=e.join(a,"knowledgeBase",b);return aw.existsSync(c)?aw.statSync(c).size>h?void j.push(e.basename(b)):{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:aw.readFileSync(c)}:void 0}).filter(Boolean);if(0===k.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:j.length?`参考文件过大,已跳过 ${j.length} 个多模态文件理解`:"没有可发送给多模态模型的参考文件"}};try{aG(c);let a=await f.understandFiles(k,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:c});aG(c);let b=a.content.trim();return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${k.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function br(a,b,c,d,e,f,g,h="",i={}){let j=Z(V(b,c),{maxChars:W(i.targetWords||i.minWords)});if(!j.trim()&&!h.trim())return;let k=b.sections?.length?`本章必须完整包含以下生成前规划小节,且每个小节都要有实质正文:
|
|
66
|
-
${b.sections.map(a=>`- ${a}`).join("\n")}`:"本章未预设小节;请优先遵循用户提示词、模板结构、显式大纲和绑定材料组织内容。没有明确依据时,不要为了凑结构而生成小节。",l=function(a,b){let c=bs(a,b);return 0===c.length?"":["本章小节篇幅计划(首轮生成应尽量一次达成,避免后续补写):",...c.map(a=>`- ${a.title}:约 ${a.targetWords} 字,至少达到 ${Math.floor(.8*a.targetWords)} 字,并写入与该小节相关的材料事实、适用边界和必要说明。`)].join("\n")}(b,i.targetWords||i.minWords||0),m=["你是专业文档生成专家,必须严格使用已提供的绑定材料生成文档章节。",ae,"准确性优先级:用户需求/模板章节 > 绑定提示词与角色节点结构化事实 > 知识库证据 > 后台内容优化建议 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。","提示词角色只提供规则和格式约束;其中的示例、样例、占位名称、编号、日期、数量和示例正文不得作为当前文档事实,不得写入正文。",i.forbidDrawingImages?"图片类材料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造信息;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),n=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,k,l,g?`用户要求:${g}`:"",f?`上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
67
|
-
${f}`:"",h||"",i.factCoverageContext||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的信息:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的文档章节,要求:",`- 首轮必须一次性生成可直接定稿的完整章节,不允许只写摘要、提纲或等待后续补写;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}${i.maxWords?`,最多不超过 ${i.maxWords} 字`:""}。`,"- 首轮必须完成章节标题、所有规划小节、每个小节的实质正文、关键事实覆盖、段落衔接和正式文档表达;后置流程只做少量兜底,不会替你重新生成整章。","- 保留章节标题;如生成前已规划小节,必须按规划完整生成;不要新增未规划的二级小节;每个小节至少包含多段实质正文或表格前后说明,不能只有标题、清单、模板话术或空泛说明。",b.sections?.length?`- 本章只允许使用以下二级小节标题:${b.sections.join("、")}。不得新增其他“###”二级小节;其他细节请写入对应小节正文或少量三级标题。`:"",b.tableSections?.length?`- 本章以下小节适合使用表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴材料摘录。`:"","- 章节内容应优先覆盖模板、用户要求、绑定提示词和材料已明确给出的关键事实、数量、时间、规格、标准、范围、对象、责任或约束。","- 日期、数量、数值、规格、周期、资源、范围、对象等量化内容必须来自材料或明确推导;无依据时不得编造具体值。","- 存在事实冲突时,优先遵循用户要求、模板结构、绑定文件证据和提示词角色;后台内容优化建议仅作质量参考。","- 将材料要点自然融入正文,不单列系统证据或来源章节,不输出中间分析产物标题。",af,"- 三级标题只在确有必要时少量使用;优先用自然段落、编号清单和表格承载细节,不要把普通段落重点升级成大量三级小节。","- 首次生成必须达到可定稿质量;后置修复只处理缺失规划小节、空小节、明显截断、后台话术或项目污染等关键缺陷,不负责大面积补写。",i.targetWords&&i.targetWords>=3500?"- 用户已提出较高篇幅目标,本章必须在首轮围绕各二级小节充分展开,不得用摘要式段落替代正文,也不得把扩写任务留给后置流程。":"","",j?"绑定材料:":"",j].filter(Boolean).join("\n"),o=await aS(m,n,!1,{maxTokens:i.maxTokens,signal:i.signal});if(o&&!(o.length<120))return ad(_(o.startsWith("## ")?o:`## ${b.title}
|
|
68
|
-
|
|
69
|
-
${o}`,!!i.forbidDrawingImages))}function bs(a,b){let c=a.sections?.filter(Boolean)||[];if(0===c.length)return[];let d=Math.floor(b/c.length),e=Math.max(b>=700*c.length?700:Math.max(280,Math.floor(.85*d)),d);return c.map(a=>({title:a,targetWords:e}))}function bt(a){return(0,$.GQ)(a).replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分、..\s-]*/u,"").replace(/^\d+(?:\.\d+)*[..、]?\s*/u,"").replace(/[::。;;,.,]+$/gu,"").trim()}async function bu(a){let b=Z(V(a.chapter,a.evidence),{maxChars:W(a.targetWords,5e3,12e3)}),c=await aU("你是专业文档结构规划专家。\n只根据用户提示词、章节标题和真实绑定资料规划本章二级小节;不得使用“目标与范围、资料依据、实施内容、质量控制”等通用占位小节凑数。\n只返回 JSON。",[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`章节目的:${a.chapter.purpose}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
|
|
70
|
-
${a.projectContext}`:"",a.roleContext,a.promptTexts?`提示词角色要求:
|
|
71
|
-
${a.promptTexts}`:"",b?`真实绑定资料:
|
|
72
|
-
${b}`:"","请输出 2-5 个适合直接成稿的二级小节标题。标题必须具体、业务相关、能承载真实资料;如果章节本身已经是单一主题,只拆成必要工作面/技术点/管理点,不要为了凑结构增加小节。",'JSON 格式:{"sections":["小节标题1","小节标题2"]}'].filter(Boolean).join("\n\n"),{maxTokens:1200,temperature:.1,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:12e4}),d=/^(?:目标与范围|资料依据|实施内容|质量控制|概述|总体要求)$/u;return Array.from(new Set((c?.sections||[]).map(bt).filter(a=>a.length>=4&&a.length<=60).filter(b=>b!==bt(a.chapter.title)).filter(a=>!d.test(a)))).slice(0,5)}async function bv(a){let b=function(a,b,c){let d=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))],e=c.map((b,c)=>{let e=`${b.sectionTitle||""}
|
|
73
|
-
${b.content}`.toLowerCase(),f=d.reduce((a,b)=>a+ +!!e.includes(b),0),g=b.sectionTitle&&a.includes(b.sectionTitle)||b.sectionTitle&&b.sectionTitle.includes(a)?4:0;return{item:b,score:f+g+.1*b.score-.001*c}}).sort((a,b)=>b.score-a.score).filter(a=>a.score>0).map(a=>a.item);return e.length>0?e:c}(a.sectionTitle,a.chapter,a.evidence),c=Z(V(a.chapter,b),{maxChars:W(a.targetWords,3500,9e3)}),d=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文:
|
|
74
|
-
${a.projectContext}`:"",a.factCoverageContext||"",a.roleContext,a.missingFacts.length?`需要特别补足的信息:${a.missingFacts.join("、")}`:"",a.qualityFeedback?`上轮小节未通过质量检查,必须修正:${a.qualityFeedback}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,af,c?`绑定材料:
|
|
75
|
-
${c}`:""].filter(Boolean).join("\n\n"),e=()=>aS(["你是专业文档的小节生成专家。",ae,a.promptTexts].filter(Boolean).join("\n\n"),d,!1,{maxTokens:bx(a.targetWords),temperature:.25,signal:a.signal}),f=()=>aT(e,a.timeoutMs,a.signal),g=a.timeoutMs?await (a.diagnostics?a_(a.diagnostics,`section-draft:${a.chapter.id}:${a.sectionTitle}`,f):f()):await e();if(g&&!(g.length<80))return ad(_(g.startsWith("### ")?g:`### ${a.sectionTitle}
|
|
76
|
-
|
|
77
|
-
${g}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}async function bw(a){let b=bs(a.chapter,a.targetWords);if(b.length<2)return;let c=Number(process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??1),d=Math.max(1,Math.min(b.length,3,Number.isFinite(c)?Math.floor(c):1)),e=Array(b.length),f=0,g=async(c,d=!1)=>{a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:d?"retry":"start"});try{let d=await bC({...a,evidence:a.evidence,projectContext:a.projectContext,roleContext:a.roleContext,factCoverageContext:a.factCoverageContext,sectionTitle:c.title,targetWords:c.targetWords,maxWords:a.maxWords?Math.max(c.targetWords,Math.ceil(a.maxWords/b.length)):Math.ceil(1.12*c.targetWords),timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.55*by(c.targetWords))))},bB(b.length));return d&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),d}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}};for(let c=0;c<b.length;c+=d){aG(a.signal);let f=b.slice(c,c+d);(await Promise.all(f.map(a=>g(a)))).forEach((a,b)=>{e[c+b]=a})}let h=e.map((a,b)=>a?-1:b).filter(a=>a>=0);for(let c=0;c<h.length;c+=d){aG(a.signal);let f=h.slice(c,c+d);(await Promise.all(f.map(a=>g(b[a],!0)))).forEach((a,b)=>{a&&(e[f[b]]=a)})}if(e.some(a=>!a)&&!a.allowPartialResult)return;let i=e.filter(Boolean);if(0!==i.length)return ad(_(`## ${a.chapter.title}
|
|
78
|
-
|
|
79
|
-
${i.join("\n\n")}`,a.forbidDrawingImages))}function bx(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function by(a){let b=a||1200;return b>=8e3?9e5:b>=5e3?6e5:b>=3e3?42e4:3e5}function bz(a){return a<=0?0:Math.max(1,Math.ceil(a/4e3))}async function bA(a){let b=(0,au.V7)(a.currentContent),c=a.maxChars??Math.ceil(1.12*a.targetChars),d=a.targetChars-b;if(b>=c||d<=300)return a.currentContent;let e=Z(V(a.chapter,a.evidence),{maxChars:W(Math.ceil(a.targetChars/2),6e3,16e3)}),f=await aS(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",ae,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。",af,"不得输出“已满足要求”“由于信息有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,最多不超过 ${c} 字;本轮只补足必要缺口,不要过度展开。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和结果说明补充。材料没有新的精确数值时,可以扩展过程性正文,但不得编造具体数值。",a.roleContext,e?`绑定材料:
|
|
80
|
-
${e}`:"","当前章节 Markdown 分片(必须保留并覆盖全部已有内容,不得只基于末尾扩写):",function(a,b){let c=bj(a,12e3);return 0===c.length?"":1===c.length?c[0]:c.map((a,b)=>`【片段 ${b+1}/${c.length}】
|
|
81
|
-
${a}`).join("\n\n")}(a.currentContent,0)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??bx(b,a.targetChars),temperature:.25,signal:a.signal});if(!f||f.length<120)return a.currentContent;let g=ad(_(f.startsWith("## ")?f:`## ${a.chapter.title}
|
|
82
|
-
|
|
83
|
-
${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=(0,au.V7)(a),g=(0,au.V7)(b),h=(0,$.GQ)(c),i=Math.max(0,d-f),j=Math.min(300,Math.max(80,Math.floor(.2*i)));return!(g>e)&&(!(i>0)||!(g<f+j))&&!(g<.98*f)&&(!h||!!b.includes(h))}(a.currentContent,g,a.chapter.title,a.targetChars,c)?a.currentContent:g}function bB(a){let b=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_ATTEMPTS??1);return Math.max(1,Math.min(2,Number.isFinite(b)?Math.floor(b):1,a))}async function bC(a,b){let c;for(let d=0;d<b;d+=1){let b=await bv({...a,qualityFeedback:c});if(!b){c="上一轮未生成有效正文,请重新生成完整小节正文。";continue}let d=function(a,b){let c=b.replace(/^#{3,4}\s+.*\n+/u,"").split(/\r?\n/u).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*\|?\s*:?-{3,}:?/u.test(a)).join("\n"),d=(0,au.V7)(c);return d<180?`正文有效内容不足:${a} 当前约 ${d} 字`:/资料未提供|信息有限|无法确定|待补充|建议补充更多资料|以下是|本文档|本小节围绕/u.test(c)?`存在空泛或说明性话术:${a}`:void 0}(a.sectionTitle,b);if(!d)return b;c=d}}async function bD(a){let b=bs(a.chapter,a.targetWords),c=new Map(b.map(a=>[a.title,a])),d=(a.forcedSections||[]).filter(b=>b.chapterTitle===a.chapter.title&&(b.planned||"missing_planned_section"===b.reason||"empty"===b.reason)).map(d=>({title:d.sectionTitle,targetWords:Math.max(420,c.get(d.sectionTitle)?.targetWords||Math.floor(a.targetWords/Math.max(1,b.length||a.forcedSections?.length||1))),forced:!0})),e=[...b];for(let a of d)e.some(b=>b.title===a.title)||e.push(a);if(e.length<1)return a.content;let f=a.content,g=new Set(d.map(a=>a.title)),h=e.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=f.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),d=(0,au.V7)(c?.[1]||""),e=g.has(a.title);return{...a,currentWords:d,priority:e?0:d<80?1:2,forced:e}}).filter(a=>a.forced||a.currentWords<80).sort((a,b)=>a.priority-b.priority||a.currentWords-b.currentWords),i=new Map,j=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??a.maxSectionConcurrency??1),k=Math.max(1,Math.min(h.length||1,3,Number.isFinite(j)?Math.floor(j):1));for(let b=0;b<h.length;b+=k){let c=h.slice(b,b+k),d=a.maxWords?Math.max(0,a.maxWords-(0,au.V7)(f)):1/0,e=Number.isFinite(d)&&d>200?Math.max(260,Math.floor(d/c.length)):void 0,g=bB(h.length),j=await Promise.all(c.map(b=>bC({...a,sectionTitle:b.title,targetWords:Math.max(350,b.targetWords-b.currentWords),maxWords:e,timeoutMs:Math.max(12e4,Math.min(3e5,Math.ceil(.55*by(Math.max(350,b.targetWords-b.currentWords)))))},g)));c.forEach((a,b)=>{i.set(a.title,j[b])})}for(let a of h){let b=i.get(a.title);b&&(f=function(a,b,c){let d=b.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=RegExp(`(^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${d}\\s*\\n)([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"),f=c.trim().replace(/^#{3,4}\s+(?:\d+(?:\.\d+)*\s+)?[^\n]+\n+/u,"").trim();return e.test(a)?a.replace(e,(a,b,c)=>{let d=function(a,b){let c=a.trim(),d=b.trim();if(!d)return"";if(!c)return d;if(c.includes(d))return"";if(d.includes(c))return d.slice(d.indexOf(c)+c.length).trim();let e=c.slice(-240),f=e.length>=80?d.indexOf(e):-1;return f>=0?d.slice(f+e.length).trim():d}(c,f);return d?`${b}${c.trim()}
|
|
84
|
-
|
|
85
|
-
${d}
|
|
86
|
-
|
|
87
|
-
`:`${b}${c.trim()}
|
|
88
|
-
|
|
89
|
-
`}):f?`${a.trim()}
|
|
90
|
-
|
|
91
|
-
### ${b}
|
|
92
|
-
|
|
93
|
-
${f}`:a}(f,a.title,b))}return ad(_(f,a.forbidDrawingImages))}async function bE(a){let b=a.content,c=0,d=bz(a.targetChars-(0,au.V7)(b)),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&(0,au.V7)(b)<a.targetChars&&(0,au.V7)(b)<e;c+=1){aG(a.signal);let c=b,d=await aT(c=>bA({template:a.template,chapter:a.chapter,currentContent:b,evidence:a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:a.roleContext,targetChars:a.targetChars,maxChars:e,forbidDrawingImages:a.forbidDrawingImages,maxTokens:a.maxTokens,signal:c}),by(a.targetChars),a.signal);if(!d||d===c)break;b=d}return{content:b,rounds:c}}async function bF(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=(0,au.V7)(b.map(a=>a.content).join("\n\n")),d=bz(a.budget.minChars-c),e=Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??1),f=Math.max(1,Math.min(a.chapters.length||1,2,Number.isFinite(e)?Math.floor(e):1)),g=new Set,h=a.budget.maxChars;for(let e=0;e<d&&c<a.budget.minChars&&(!h||c<h);e+=1){aG(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=(0,au.V7)(b.content);return{chapter:b,target:c,current:d,deficit:c-d}}).filter(a=>a.deficit>500&&!g.has(a.chapter.id)).sort((a,b)=>b.deficit-a.deficit);if(0===e.length)break;for(let d=0;d<e.length&&c<a.budget.minChars&&(!h||c<h);d+=f){aG(a.signal);let i=h?Math.max(0,h-c):1/0;if(i<=300)break;let j=h?Math.max(1,Math.min(f,Math.floor(i/800)||1)):f,k=e.slice(d,d+j),l=Number.isFinite(i)?Math.max(500,Math.floor(i/k.length)):void 0;for(let c of(await Promise.all(k.map(async b=>{let c=l?Math.min(Math.ceil(1.12*b.target),b.current+l):Math.ceil(1.12*b.target),d=await bE({template:a.template,chapter:{id:b.chapter.id,title:b.chapter.title,purpose:b.chapter.title,queries:[],requiredFacts:[],sections:b.chapter.sections},content:b.chapter.content,evidence:b.chapter.evidence,promptTexts:a.promptTexts,requirement:a.requirement,roleContext:"",targetChars:b.target,maxChars:c,forbidDrawingImages:a.forbidDrawingImages,maxTokens:bx(b.current,b.target),signal:a.signal});return{id:b.chapter.id,beforeChars:b.current,content:d.content}}))))(0,au.V7)(c.content)<=c.beforeChars+300&&g.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=(0,au.V7)(b.map(a=>a.content).join("\n\n"))}if(c<=d+300)break}return b}async function bG(a){let b=Date.now(),c=Math.max(1,Math.min(a.strategy.maxChapterReviewConcurrency,Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??a.strategy.maxChapterReviewConcurrency))),d=Array(a.chapters.length);for(let e=0;e<a.chapters.length;e+=c){aG(a.signal);let f=a.chapters.slice(e,e+c);(await Promise.all(f.map(async c=>{let d=a.budget.chapterTargets.get(c.id)||1200,e=bb({chapter:a.template.chapters.find(a=>a.id===c.id)||{id:c.id,title:c.title,purpose:"",queries:[],requiredFacts:[],sections:c.sections},content:c.content,missingFacts:c.missingFacts,targetWords:d}),f=bp({totalChars:(0,au.V7)(c.content),chapterCount:1,chunkChars:12e3,phase:"chapter"}),g=bj(c.content,12e3).slice(0,f.chunks),h=[];for(let i=0;i<g.length&&!(Date.now()-b>f.ms);i+=1){aG(a.signal);let b=g[i]||"",f=await aS(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${c.title}`,`目标深度:约 ${d} 字;当前 ${(0,au.V7)(c.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",c.missingFacts.length?`未覆盖事实:${c.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"",`章节正文片段 ${i+1}/${g.length}(必须检查该片段,不要假设其他片段已合格):`,bk(b,i,g.length),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))});h.push(function(a){if(a)try{return JSON.parse(a.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim())}catch{return}}(f))}let i=bn(h.flatMap(a=>Array.isArray(a?.issues)?a.issues:[])).slice(0,f.issues),j=bn(h.flatMap(a=>Array.isArray(a?.suggestions)?a.suggestions:[])).slice(0,f.issues),k=h.some(a=>a?.status==="fail"),l=h.some(a=>a?.status==="warn"),m=bn([...e,...i]),n=e.some(a=>/缺少规划小节|规划小节正文过短|空小节|只有标题|只有表格|正文篇幅明显低于目标|低于目标|缺失|占位|泄露|不足/u.test(a)),o=k||n?"fail":l||m.length>0?"warn":"pass";return{chapterId:c.id,title:c.title,status:o,issues:m,suggestions:j,chars:(0,au.V7)(c.content)}}))).forEach((a,b)=>{d[e+b]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:aY({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:a$(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function bH(a){let b=Date.now(),c=bp({totalChars:a.chapters.reduce((a,b)=>a+(0,au.V7)(b.content),0),chapterCount:a.chapters.length,chunkChars:8e3,phase:"global"}).issues,d=a.chapters.map(b=>{let c=a.chapterReviews.find(a=>a.chapterId===b.id),d=c?.issues||[];return`- ${b.title}:${(0,au.V7)(b.content)} 字;审查=${c?.status||"unknown"};问题数=${d.length};问题=${d.join(";")||"无"}`}).join("\n"),e=a.chapters.map(bl).join("\n\n---\n\n");aG(a.signal);let f=bn((await aS(["你是长文档全局一致性审查专家。只基于章节摘要检查跨章节一致性,不重写正文。","重点检查:章节之间信息冲突、术语不一致、重复堆砌、目录层级异常、关键要求缺失、前后矛盾、上下文衔接断裂。","摘要不足以判断的问题只能标记为需复核,不得臆测正文问题。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文摘要:
|
|
94
|
-
${a.projectContext}`:"","章节审查摘要:",d,"章节内容摘要(用于全文一致性审查,不是完整正文):",e,`请输出不超过 ${c} 条跨章节问题清单和建议;没有明确问题则返回“无明显跨章节冲突”。不要返回全文。`].filter(Boolean).join("\n"),!1,{maxTokens:Math.max(1400,Math.min(3200,180*c)),temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))})||"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6&&!/无明显|未发现明显|没有明确/u.test(a))).slice(0,c);return{issues:f,stage:aY({type:"llm_review",roleId:"global-consistency-review",status:f.length>0?"fallback":"success",message:a$(f.length>0?`摘要化全局一致性审查发现 ${f.length} 个需关注问题`:"摘要化全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function bI(a){aG(a.signal);let b=Date.now(),c=bp({totalChars:(0,au.V7)(a.markdown),chapterCount:a.template.chapters.length||1,chunkChars:12e3,phase:"final"}),d=c.ms,e=c.issues,f=Z(V({id:"review",title:"最终质量审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence),{maxChars:W((0,au.V7)(a.markdown),8e3,18e3)}),g=a.spec?`优化建议包:${a.spec.name}
|
|
95
|
-
建议关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
|
|
96
|
-
章节内容建议:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
|
|
97
|
-
质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
|
|
98
|
-
约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",h=bj(a.markdown,12e3).slice(0,c.chunks),i=[];for(let c=0;c<h.length&&(aG(a.signal),!(Date.now()-b>d));c+=1){let b=h[c]||"";i.push(await aU(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 后台内容优化建议 > 上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、材料事实内化使用、参数数字准确性、冲突事实、解析器内部对象名、表格呈现、表达专业性、导出友好性、系统提示泄露。","只返回 JSON 审查结果;不得返回优化后的完整 Markdown。",'返回格式:{"passed":true,"score":90,"issues":[{"type":"...","severity":"low|medium|high","location":"...","message":"..."}]}',a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`上下文/历史记忆:
|
|
99
|
-
${a.projectContext}`:"",g,"知识库证据摘要:",f,`待审查初稿片段 ${c+1}/${h.length}(必须检查该片段章节完整性、空小节和事实冲突):`,bk(b,c,h.length),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1600,temperature:0,signal:a.signal,diagnostics:a.diagnostics,timeoutMs:Math.max(3e4,Number(process.env.DOCUMENT_REVIEW_LLM_CALL_TIMEOUT_MS??9e4))}))}aG(a.signal);let j=i.flatMap(a=>Array.isArray(a?.issues)?a.issues.filter(a=>a?.message):[]).slice(0,e),k=Date.now()-b>d,l=j.filter(a=>"high"===a.severity).length,m=i.map(a=>Number(a?.score)).filter(Number.isFinite),n=m.length?Math.round(m.reduce((a,b)=>a+b,0)/m.length):void 0,o=function(a,b){if(0===a.length)return b;let c=[],d=0;for(let b of a){if(d+b.length>420&&c.length>0)break;c.push(b),d+=b.length}return c.join(";")}(j.map(a=>`${a.severity||"medium"}:${a.location||a.type||"全文"}-${a.message}`),"未发现明显质量问题");return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:l>0||k?"fallback":i.length>0?"success":"skipped",message:i.length>0?`已完成预算化结构化非重写式质量审查${void 0!==n?`,评分 ${n}`:""}${k?",已达到审查预算":""}:${o}`:"无可用模型或审查结果不可用,保留生成初稿"}}}function bJ(a,b){let c=(0,au.V7)(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}function bK(a){return a.replace(/^第[一二三四五六七八九十百千万\d]+[章节篇部分、..\s-]*/u,"").replace(/^\d+(?:\.\d+)*[、..\s-]*/u,"").replace(/[::。;;,.,]+$/gu,"").trim()}function bL(a,b){let c=bK(a);return!(c.length<4||c.length>36||c===bK(b)||/[。;;]$/u.test(a)||/[::].{8,}/u.test(a)||/(必须|不得|应当|需要|按照|依据|要求|建议|说明|原则|规则|标准|不得少于|不低于)/u.test(c)||/^(目标与范围|资料依据|实施内容|质量控制|概述|总体要求|注意事项|写作要求)$/u.test(c))}function bM(a,b){return(0,av.yw)(a,[{title:b.title,content:a,sections:b.sections||[]}]).filter(a=>a.planned||"missing_planned_section"===a.reason)}function bN(a){return a.replace(/^第[一二三四五六七八九十百千万\d]+章\s*/u,"").replace(/^\d+(?:\.\d+)+[..、]?\s*/u,"").replace(/^\d+[..、]\s*/u,"").replace(/[\s::.。]+$/gu,"").trim()}function bO(a){return/项目基本信息概况/u.test(a.sectionTitle)?"本小节依据招标文件、施工图纸及工程量清单对项目基本信息进行归集,用于明确施工组织设计的编制对象、建设范围、合同边界和现场管理基准。后续施工部署、资源配置、进度安排、质量安全控制和分包协调均应以本概况信息为基础,实施过程中如建设规模、工期节点或专业界面发生调整,应同步履行技术复核、计划更新和审批交底程序,确保现场执行口径与招标要求、设计文件及合同约定保持一致。":/施工组织编制依据/u.test(a.sectionTitle)?"本小节所列编制依据用于支撑施工组织设计的技术路线、管理措施和验收标准,执行时应优先采用招标文件、合同条款、施工图纸、现行国家及地方规范标准、企业管理制度和现场踏勘资料。项目部应在开工准备、方案审批、技术交底、过程检查和竣工验收各阶段持续核对依据文件的适用性,涉及规范更新、设计变更或建设单位指令调整时,应及时修订对应措施并形成闭环记录。":`本小节围绕“${a.sectionTitle}”明确施工组织设计的管理依据、适用范围和实施要求,相关内容应与招标文件、设计文件、现场条件及项目管理目标保持一致。项目实施过程中应将本小节要求纳入技术交底、资源配置、过程检查和验收复核,发现条件变化或执行偏差时及时调整施工安排并形成记录,确保该部分内容能够支撑后续施工部署、质量安全控制和履约管理闭环。`}function bP(a,b){let c=a;for(let a of b.filter(a=>"table_only"===a.reason)){let b=bN(a.sectionTitle);if(!b)continue;let d=[...c.matchAll(/^(#{3,4})\s+(.+)$/gmu)],e=d.find(a=>bN(a[2]||"")===b);if(!e||void 0===e.index)continue;let f=e.index+e[0].length,g=d.find(a=>(a.index||0)>e.index&&a[1].length<=e[1].length);c.slice(f,g?.index??c.length).includes(bO(a).slice(0,24))||(c=`${c.slice(0,f)}
|
|
100
|
-
|
|
101
|
-
${bO(a)}${c.slice(f)}`)}return c}function bQ(a,b,c){if(Number.isFinite(c)&&c>0)return Math.ceil(c);let d=new Set(b.filter(Boolean)),e=a.listFiles?.().filter(a=>0===d.size||d.has(a.relativePath)).reduce((a,b)=>a+Math.max(0,Math.ceil(Number(b.chunkCount)||0)),0)??0;return e>0?e:Math.max(1,d.size)}async function bR(a){var b,c,y,N;aG(a.signal);let P=(0,d.QJ)(a.templateId);if(!P)throw Error("Document template not found");let R=e.resolve(a.projectRoot||(0,g.aY)());if(!R)throw Error("No knowledge base project found");let S=(0,f.computeProjectId)(R),U=P,V=(0,g.Qh)(),X=[],Y=[],Z=(b,c=ad)=>{let d=b?[...b].sort((a,b)=>{let c=Y.indexOf(a.id),d=Y.indexOf(b.id);return(c<0?Number.MAX_SAFE_INTEGER:c)-(d<0?Number.MAX_SAFE_INTEGER:d)}):void 0;a.onProgress?.([...c],d?{chapters:d}:void 0)},_=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),aa=async(b,c=ad)=>{let d=setInterval(()=>{a.signal?.aborted||Z(X,c)},_);try{return await b()}finally{clearInterval(d)}},ab=(0,d.N6)(U)||"none",ac=(0,i.Mu)(ab)?.name||ab,ad=[aY({type:"role_binding",roleId:ab,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${U.name}`,details:[`当前项目:${S}`,`资料目录:${e.join(R,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:ac,roleName:ac,order:0})];Z();let ae=(0,d.zY)(U),af=(0,d.Vh)(U);if(aZ(ad,aY({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与绑定材料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估材料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:ad.length})),Z(),0===af.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let ag=function(a){let b=[];for(let c of(0,d.dU)(a))(0,$.eI)(c.content)&&b.push(`## [${c.roleId}] ${c.name}
|
|
102
|
-
${c.content}`);return b.join("\n\n")}(ae),ah=(0,$.cs)([{text:a.requirement,source:"用户需求"},{text:ag,source:"提示词角色",strict:!0}]),aj=ah.length>=2;aj&&(U={...P,chapters:ah}),aZ(ad,aY({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${af.length} 个绑定材料并生成摘要`,details:["读取材料清单","统计基础事实与材料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:ad.length})),Z();let al=await aa(()=>Promise.resolve(function(a,b){let c=(0,g.Yy)(a),d=function(a,b){let c=a.filter(a=>"error"!==a.status),d=new Set((b?.boundFilePaths||[]).map(C)),e=c.filter(a=>d.has(C(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>D(a.relativePath)).filter(Boolean))],b=1===a.length?a[0]:void 0;return{files:e,reason:b?`模板绑定文件定位到资料组:${b}`:"使用模板显式绑定文件作为资料范围",ambiguous:!1}}let f=(b?.requirement||"").trim();if(f){let a=new Map;for(let b of c){let c=D(b.relativePath);if(!c)continue;let d=function(a,b){let c=0;for(let d of a.split(/(?:\s|_|-|—|(|)|\(|\)|【|】|\[|\]|、|,|,)+/u)){let a=d.trim();a.length>=2&&b.includes(a)&&(c+=1)}return c}(c,f);d>0&&a.set(c,(a.get(c)||0)+d)}let b=[...a.entries()].sort((a,b)=>b[1]-a[1])[0];if(b)return{files:c.filter(a=>D(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>D(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>D(a.relativePath)===g[0]),reason:`知识库单一资料组:${g[0]}`,ambiguous:!1}:{files:c,reason:g.length>1?`未指定资料组,检测到 ${g.length} 个资料组,已阻断生成避免跨项目污染`:"未检测到资料组,使用全部资料",ambiguous:g.length>1}}(c,b),f=d.files,h=function(){let a={};for(let b of v)a[b]=[];return a}(),i=new Map((b?.boundFileRoles||[]).map(a=>[C(a.filePath),a.roles]));for(let a of f){let b=C(a.relativePath),c=[...i.entries()].filter(([a])=>b.endsWith(a)||a.endsWith(b)).flatMap(([,a])=>a);for(let b of[...new Set([...function(a){let b=new Set(p(a,o));return b.add("project_overview"),[...b]}(a.relativePath),...c])])h[b].push({filePath:a.relativePath,fileName:e.basename(a.relativePath),role:b,chunkCount:a.chunkCount})}let j=function(a){let b;for(let c of w(a))if(/项目/iu.test(c)&&!(c.length<6)){if(!/\.\w+$/u.test(c))return c;b||=c}return b?.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")||"当前知识库项目"}(f),k=function(a){for(let b of a){let a=b.relativePath.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/u)?.[0];if(a)return a}}(f),l=function(a,b){let c=z(a),d=z(b),e=x(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=x(a.map(a=>D(a.relativePath)).filter(Boolean)),g=[c.length>0,e.length>0,1===f.length];return{fingerprint:{projectNames:c,documentNos:e,fileGroups:f,confidence:g.filter(Boolean).length/g.length},contaminationCandidates:d.filter(a=>!c.includes(a))}}(f,c),m=function(a){let b=function(a){let b="";for(let c of a)b+=`${c.relativePath}
|
|
103
|
-
`;return b}(a);return{ownerNames:B(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:B(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:B(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:B(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(f),n=u.filter(a=>h[a].length>0),q=u.filter(a=>0===h[a].length);return{projectId:j.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||"current-project",projectName:j,generatedAt:Date.now(),fingerprint:l.fingerprint,contaminationCandidates:l.contaminationCandidates,source:{totalFiles:c.length,selectedFiles:f.length,selectionReason:d.reason,ambiguous:d.ambiguous},facts:{projectName:j,documentNo:k,scopeDescriptions:h.scope_description.map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(h.scope_description.concat(h.design_specification,h.structured_data).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")))],scheduleRequirement:h.schedule_quality_safety.length?"已识别周期、质量、安全或合规相关资料,生成时应以需求文件、变更说明和技术要求为准。":void 0,qualityRequirement:h.schedule_quality_safety.length?"已识别质量或评价相关资料。":void 0,safetyRequirement:h.schedule_quality_safety.length?"已识别安全或合规相关资料。":void 0,materialBrandRequirement:h.resource_recommendation.length?"已识别资源、材料、设备或品牌相关资料。":void 0,ownerNames:m.ownerNames,locationNames:m.locationNames,scheduleValues:m.scheduleValues,qualityTargets:m.qualityTargets},materialInventory:h,extractedSections:{projectOverview:`绑定材料组:${j}${k?`,文档/任务编号:${k}`:""}。`,scopeSummary:`范围资料:${A(h.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${A(h.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${A(h.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${A(h.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${A(h.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:u,satisfiedRoles:n,missingRoles:q,materialCompletenessRate:u.length?n.length/u.length:1}}}(R,{requirement:a.requirement,boundFilePaths:af.map(a=>a.filePath),boundFileRoles:(0,d.wR)(af)})));aZ(ad,aY({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(al.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:ad.length})),Z();let am=await aa(()=>Promise.resolve(function(a,b=""){let c=function(a,b=""){return j.createHash("sha1").update(JSON.stringify({id:a.id,name:a.name,description:a.description,outputTitle:a.outputTitle,chapters:a.chapters,promptBindings:a.promptBindings,fileBindings:a.fileBindings,projectRoleConfigId:a.projectRoleConfigId,requirement:b})).digest("hex").slice(0,12)}(a,b),d=function(a,b){for(let c of b)for(let b of c.patterns)if(b.lastIndex=0,b.test(a))return c.output[0]}(`${a.name} ${a.category} ${a.outputTitle} ${a.description}`,l)||a.category||"文档",e=function(a,b){let c=[a.name,a.category,a.outputTitle,a.description],d=[];for(let b of a.chapters)for(let a of(c.push(b.title,b.purpose,...b.sections||[],...b.requiredFacts||[],...b.queries||[]),b.requiredFacts||[]))d.push(a);let e=c.filter(Boolean).join("\n"),f=new Set(d);for(let a of p(e,m))f.add(a);for(let c of t(a,b))for(let a of c.requiredFacts)f.add(a);return[...f].filter(Boolean)}(a,d),f=function(a=""){let b=new Set;for(let c of[/(?:必须|需要|要求|增加|包含|包括|补充|设置|新增).{0,12}?(?:章节|章|节|小节)[::为是]?\s*([^。;;\n]{2,80})/giu,/(?:章节|目录).{0,8}?(?:包括|包含|为|是)[::]?\s*([^。;;\n]{2,120})/giu])for(let d of a.matchAll(c))for(let a of d[1].split(/[、,,/]/u).map(a=>a.trim()).filter(Boolean))!/不要|禁止|不得|不能/iu.test(a)&&a.length<=40&&b.add(a.replace(/[。;;::]+$/u,""));return[...b]}(b),g=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/必须|一定要|务必|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:输出|写明)\s*([^。;;\n]{2,30})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&a.length<=30&&!/不要|禁止|不得|不能|生成|要求内容|专业|结构完整|直接用于/u.test(a))}(b),h=function(a=""){let b=new Set;for(let c of s(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of r(c))b.add(a);let a=c.match(/(?:不要|禁止|不得|不能|不允许|严禁)(?:出现|输出|写|包含)?\s*([^。;;\n]{2,40})/iu);a&&b.add(a[1].replace(/^(这些|以下|内容|词语|文字)[::]?/u,"").trim())}return[...b].filter(a=>a&&!/章节|页|表格/u.test(a))}(b),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),k=t(a,d),o=Math.max(0,...k.map(a=>a.minTables||0)),u=Math.max(function(a=""){let b=a.match(/(?:至少|不少于)?\s*(\d{1,2})\s*(?:个|张)?\s*表格/iu);return b?Number(b[1]):/表格化|用表格|表格形式|表格表达/iu.test(a)?1:void 0}(b)||0,o)||void 0,v=a.chapters.map((a,b)=>{let c=[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]].join("\n"),d=new Set(a.requiredFacts||[]);for(let a of e)(c.includes(a)||RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"iu").test(c))&&d.add(a);for(let a of p(c,n))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(q),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),w=f.filter(a=>!v.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${q(a)}`,title:a,required:!0,order:v.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),x=[{id:"auto-source-required",name:"事实必须有来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"auto-min-source",name:"至少使用绑定材料来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"min_count",min:2}},{id:"auto-no-debug-text",name:"不得输出后台流程话术",type:"forbidden_text",level:"error",value:"知识库证据",evaluator:{subject:"document",operator:"not_contains",value:"知识库证据"}},...k.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${q(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...k.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${q(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...o?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${o} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:o}}]:[],...f.map(a=>({id:`user-required-chapter-${q(a)}`,name:`用户提到章节:${a}`,type:"user_required_chapter",level:"warning",target:a,evaluator:{subject:"chapter",operator:"exists",target:a}})),...g.map(a=>({id:`user-required-text-${q(a)}`,name:`用户提到应包含:${a}`,type:"user_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}})),...h.map(a=>({id:`user-forbidden-text-${q(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...u?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${u}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:u}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],y=[...v,...w];return{sourceHash:c,managedBy:"system",spec:{id:`auto-${a.id}-${c}`.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),name:`后台优化建议 - ${a.name}`,description:`${d}后台优化建议,由模板、提示词、角色绑定和用户临时要求静默生成,仅用于提升内容完整性,不接管章节结构。`,factFields:e.map(a=>({id:q(a),name:a,type:"auto",required:k.some(b=>b.requiredFacts.includes(a))||!/资源|品牌|重点|难点|约束/iu.test(a),extractionHint:`从绑定材料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与绑定材料一致,不得引入无关事实。`})),chapterMode:"fixed",chapterRules:y,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:x,builtIn:!0}}}(U,a.requirement||""))),an=am.spec,ao=function(a,b){let c=function(a){let b=[a.name,a.category,a.description,a.outputTitle].join("\n"),c=new Set(["project_overview","scope_description"]);return/需求|规则|响应|方案|实施|专项|安全|质量|进度|合规/iu.test(b)&&["requirement_document","structured_data","schedule_quality_safety"].forEach(a=>c.add(a)),/设计|方案|说明|图像|地图|附件/iu.test(b)&&c.add("design_specification"),c}(a);return(function(a){let b=new Set(p([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),o));return b.add("project_overview"),b.add("scope_description"),[...b]})(a).map(a=>{let d=b.materialInventory[a]||[],e=c.has(a),f=d.length>0,g=f&&d.length<(e?2:1);return{role:a,required:e,satisfied:f,weak:g,evidenceCount:d.length,filePaths:d.map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(U,al),ap=function(a){var b;let c=a.resolvedRoles.filter(a=>a.required&&!a.satisfied).map(a=>a.role),d=a.resolvedRoles.filter(a=>a.weak).map(a=>a.role),e=[],f=[];0===a.template.chapters.length&&f.push("模板未配置章节,建议通过模板章节或显式 OUTLINE 提供文档结构"),a.template.chapters.some(a=>!a.purpose&&(!a.queries||0===a.queries.length)&&(!a.requiredFacts||0===a.requiredFacts.length))&&f.push("部分模板章节缺少 purpose、queries 或 requiredFacts,生成质量可能不稳定"),a.summary.source.ambiguous&&e.push(a.summary.source.selectionReason),a.summary.fingerprint.confidence<.34&&f.push("材料指纹置信度较低,建议绑定明确的材料文件"),a.summary.coverage.materialCompletenessRate<.5&&e.push("绑定材料覆盖率过低,无法支撑文档生成"),c.length>0&&f.push(`模板必需材料角色未完全满足:${c.join("、")}`),d.length>0&&f.push(`部分材料角色证据较弱:${d.join("、")}`);let g=[a.spec.factFields.length>0,a.spec.chapterRules.length>0,a.spec.gateRules.length>0];return{ready:0===e.length,materialCoverageRate:a.summary.coverage.materialCompletenessRate,roleSatisfactionRate:(b=a.resolvedRoles).length?b.filter(a=>a.satisfied).length/b.length:1,specCompletenessRate:g.filter(Boolean).length/g.length,missingRoles:c,weakRoles:d,blockingIssues:e,warnings:f}}({template:U,spec:an,summary:al,resolvedRoles:ao});if(!ap.ready)throw Error(`生成准备度不足:${ap.blockingIssues.join(";")}`);let ar=[["## 后台绑定材料摘要",al.extractedSections.projectOverview,`材料指纹:对象名候选 ${al.fingerprint.projectNames.join("、")||"无"};编号 ${al.fingerprint.documentNos.join("、")||"无"};资料组 ${al.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*al.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${al.facts.ownerNames?.join("、")||"无"};地点 ${al.facts.locationNames?.join("、")||"无"};周期 ${al.facts.scheduleValues?.join("、")||"无"};质量 ${al.facts.qualityTargets?.join("、")||"无"}。`,al.extractedSections.scopeSummary,al.extractedSections.structuredDataSummary,al.extractedSections.designSummary,al.extractedSections.scheduleQualitySafetySummary,al.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*al.coverage.materialCompletenessRate)}%`].join("\n"),(b=am.sourceHash,`## 后台内容优化建议
|
|
104
|
-
建议包:${an.name}
|
|
105
|
-
版本标识:${b}
|
|
106
|
-
说明:以下内容仅用于提升事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
|
|
107
|
-
建议关注事实:${an.factFields.map(a=>a.name).join("、")}
|
|
108
|
-
章节内容建议:${an.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ")}`:""}`).join(";")||"以当前模板章节为准"}
|
|
109
|
-
质量提醒:${an.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${ap.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*ap.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*ap.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*ap.specCompletenessRate)}%`,ap.missingRoles.length?`缺失角色:${ap.missingRoles.join("、")}`:"",ap.weakRoles.length?`较弱角色:${ap.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),ay=[ar,`生成前规划章节结构:
|
|
110
|
-
${U.chapters.map(a=>[`- ${a.title}`,a.sections?.length?` 规划小节:${a.sections.join("、")}`:"",a.tableSections?.length?` 表格小节:${a.tableSections.join("、")}`:"",a.tableRequirements?.length?` 表格内容要求:${a.tableRequirements.join(";")}`:""].filter(Boolean).join("\n")).join("\n")}`,bi(ae,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),az=[ar,bi(ae,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),aA=[ar,bi(ae,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n");aZ(ad,aY({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${af.length} 条文件角色绑定`,details:[`提示词角色:${ae.length} 个`,`文件角色:${af.length} 个`,aj?`识别 OUTLINE 章节:${ah.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:ad.length})),Z();let aC=bg(R,af),aD=(0,i.XB)("file"),aE=new Map(af.flatMap(a=>be(R,a.filePath).map(b=>[b,a.roleId]))),aH=new Map(af.flatMap(a=>be(R,a.filePath).map(b=>[b,aD.find(b=>b.id===a.roleId)?.processingType||"reference"])));aZ(ad,aY({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:ad.length})),Z();let aI=await aa(()=>V.getProject(R)),aJ=bQ(aI,[...aC],a.maxEvidencePerChapter);aZ(ad,aY({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"已读取知识库索引,开始构建角色资料证据池",details:[`证据范围文件:${aC.size} 份`,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:ad.length})),Z(),aG(a.signal);let aL=[],aM=[],aO=[],aQ=[],aR=[],aS=-1,aU=function(a,b,c){let e=(0,i.XB)("file"),f=(0,i.XB)("prompt"),g=function(a){let b=new Map;for(let c of a){let a=b.get(c.roleId)||[];a.push(c.filePath),b.set(c.roleId,a)}return b}(c),h=function(a){let b=new Map;for(let c of(0,d.dU)(a)){let a=b.get(c.roleId)||[];a.push(bh(c.content)),b.set(c.roleId,a)}return b}(b),j=function(a,b){let c=[];for(let d of a){if(!b.has(d.id))continue;let a=d.executionType||"reference",e=/technical-review|review-standard|template|章节|目录|评审标准/u.test(`${d.id} ${d.name} ${d.description||""}`);("fact_extraction"===a||"reference"===a||e)&&c.push(d)}return c}(f,new Set(h.keys())),k=[];for(let a of e){if(!g.has(a.id))continue;let b=function(a){let b=[],c=[],d=[];for(let e of a)for(let a of(b.push(e.promptRole.id),c.push(e.promptRole.name),e.texts))d.push(a);return{promptRoleIds:b,promptRoleNames:c,promptTexts:d}}(function(a,b,c){let d=[];for(let e of b){let b=c.get(e.id)||[];d.push({promptRole:e,texts:b,score:function(a,b,c){let d=a0(`${a} ${c.join(" ")}`),e=a0(`${b.id} ${b.name} ${b.processingType||""}`),f=function(a,b){let c=0;for(let d of[b.id,b.name,b.processingType||""])d&&a.includes(a0(d))&&(c+=4);return c}(d,b);for(let a of F.Nx)a.promptPattern.lastIndex=0,a.filePattern&&(a.filePattern.lastIndex=0),(!a.filePattern||a.filePattern.test(e))&&a.promptPattern.test(d)&&(f+=a.points);return f}(e.id,a,b)})}d.sort((a,b)=>b.score-a.score);let e=d.filter(a=>a.score>5);if(e.length>0)return e;let f=d.find(a=>{let b=a.promptRole.executionType||"reference";return"fact_extraction"===b||"reference"===b});return f?[f]:[]}(a,j,h));k.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=a0(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of F.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return k}(0,ae,af),aX=function(a,b,c,d){let e=new Map,f=function(a){let b=new Set,c=[],d=0;for(let e of a)for(let a of e.filePaths)d+=1,b.has(a)||(b.add(a),c.push(a));return{filePaths:c,bindingCount:d}}(b),g=0,h=0,i=0;for(let b of f.filePaths){let f=a1(c,b),j=a.getFileDetail(b,Number.isFinite(d)&&d>0?{maxChunkContentChars:d}:void 0);if(j&&j.chunks.length>0){let a=function(a,b){let c=[],d=0,e=a.chunks||[],f=Number.isFinite(a.totalChunkCount)?Number(a.totalChunkCount):e.length;for(let f of e){let e=Q(f.content);if(e){if(Number.isFinite(b)&&b>0&&d+e.length>b&&c.length>0)break;c.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:e,sectionTitle:f.sectionTitle,source:"role-node"}),d+=e.length}}return{evidence:c,totalChunks:f,omittedChunks:Math.max(0,f-e.length)}}(j,d);e.set(f,a.evidence),g+=a.totalChunks,h+=a.evidence.length,i+=a.omittedChunks;continue}e.set(f,[])}return{files:e,uniqueFileCount:e.size,bindingCount:f.bindingCount,totalChunkCount:g,loadedChunkCount:h,omittedChunkCount:i}}(aI,aU,R,W(Math.max(1200,900*af.length),12e3,aN())),a3=aY({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${aX.uniqueFileCount} 份,角色绑定 ${aX.bindingCount} 条,加载片段 ${aX.loadedChunkCount}/${aX.totalChunkCount}`,details:[`复用绑定:${Math.max(0,aX.bindingCount-aX.uniqueFileCount)} 条`,`待执行资料理解节点:${aU.length} 个`,aX.omittedChunkCount>0?`按模型上下文预算延后加载片段:${aX.omittedChunkCount} 条`:"材料片段已全部纳入共享池"],progress:{current:aX.uniqueFileCount,total:Math.max(1,aX.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:ad.length});aZ(ad,a3),Z();let ba=[],bj=function(a,b,c){let d=new Map(("function"==typeof a.listFiles?a.listFiles():[]).map(a=>[String(a.relativePath||""),a])),e=[];for(let a of[...c].sort()){let c=a1(b,a),f=d.get(a)||d.get(c);if(!f){e.push({filePath:c,missing:!0});continue}e.push({filePath:f.relativePath||c,contentHash:f.contentHash,fileSize:f.fileSize,mtime:f.mtime,chunkCount:f.chunkCount,indexedAt:f.indexedAt})}return aB({type:"project-evidence-version-v2",entries:e})}(aI,R,aC),bk=aP()?.model.name,bl=bi(ae,["fact_extraction","reference","chapter_generation"]),bm=aB({fileBindings:af,evidenceScopePaths:[...aC].sort(),activeModelName:bk,projectEvidenceVersion:bj,promptTexts:bl,materialFingerprint:al.fingerprint,materialInventory:Object.fromEntries(Object.entries(al.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),bn=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??(aU.length>12?1:2)),bo=Math.max(1,Math.min(aU.length||1,3,Number.isFinite(bn)?Math.floor(bn):1));for(let b=0;b<aU.length;b+=bo){aG(a.signal);let c=aU.slice(b,b+bo).map(async(c,d)=>{let e=Date.now(),f=(function(a,b,c){let d=[];for(let e of b.filePaths)for(let f of a.files.get(a1(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return T(d,{maxItems:Math.max(8,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_ITEMS??36))),maxChars:Math.max(12e3,Math.floor(Number(process.env.DOCUMENT_ROLE_EVIDENCE_MAX_CHARS??42e3))),preservePinned:!0})})(aX,c,R).filter(a=>bf(R,a.filePath,aC)),g=ad.length,h=aY({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:"running",message:`${c.fileRoleName} 正在复用共享资料池读取 ${c.filePaths.length} 条绑定,候选证据 ${f.length} 条`,details:[`绑定文件:${c.filePaths.length} 份`,`候选证据:${f.length} 条`,c.promptRoleNames.length?`关联提示词:${c.promptRoleNames.join("、")}`:"未绑定专用提示词"],progress:{current:b+d+1,total:aU.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});ad.push(h),Z();let i=await aa(()=>a4(U,c,f,a.signal)),j=aY({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:a$(`${c.fileRoleName} 节点已完成,产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,"已完成模型理解"],progress:{current:b+d+1,total:aU.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return ad[g]=j,Z(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))aM.push(...a.evidence),ba.push(a.artifact);let d=T(aM,{maxItems:Math.max(40,8*aU.length),maxChars:Math.max(45e3,5e3*aU.length),preservePinned:!0});aM.splice(0,aM.length,...d)}let bp=function(a,b){let c=[];for(let a of b)if("template_requirements"===a.node.outputType)for(let b of a.chapters)c.push(b);c.sort((a,b)=>a.order-b.order);let e=new Map;for(let b of c){let c=(0,$.YZ)(b.title);!(!(0,$.bE)(b.title)||(0,d.DX)(c,a))&&(e.has(c)||e.set(c,{...b,title:c}))}return[...e.values()]}(U,ba),bs=(c=(0,$._9)(U,an,{preserveExplicitOutline:aj}),c.map(a=>({...a,sections:function(a,b){let c=(a.sections||[]).map(a=>a.trim()).filter(Boolean);if(c.length>=2)return c;let d=function(a){let b=bK(a).split(/[、,,;;]+/u).map(a=>bK(a)).filter(b=>bL(b,a));return b.length>=2?Array.from(new Set(b)).slice(0,4):[]}(a.title);if(d.length>=2)return d;let e=Array.from(new Set([...(b?.requirements||[]).map(a=>a.title),...b?.requiredContents||[]].map(a=>bK(a)).filter(b=>bL(b,a.title))));return e.length>=2?e.slice(0,5):1===c.length?c:[]}(a,a5(a,bp))}))),bt=[U.name,U.outputTitle,a.requirement,...bs.flatMap(a=>[a.title,a.purpose,...a.sections||[]])].filter(Boolean).join(" "),bv=(0,h.Hh)(bt,void 0,R),bz=[bv.length>0?bv.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",function(a){let b=Math.max(4,Math.min(12,Number(process.env.DOCUMENT_ROLE_DIGEST_ARTIFACT_LIMIT??8)));return a.slice(0,b).map(a=>(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=Math.max(8,Math.min(24,Number(process.env.DOCUMENT_ROLE_DIGEST_CHAPTER_LIMIT??18))),d=Math.max(16,Math.min(60,Number(process.env.DOCUMENT_ROLE_DIGEST_FACT_LIMIT??30))),e=[];for(let b of a.chapters.slice(0,c))e.push(`- ${b.title}:${(b.requiredContents.join("、")||b.sourceRequirement).slice(0,180)}`);e.length>0&&b.push(`章节/要求:
|
|
111
|
-
${e.join("\n")}`);let f=[];for(let b of a.facts.slice(0,d))f.push(`- ${b.key}:${aF(b.value).slice(0,260)}(来源:${b.sourceFile},角色:${b.roleId})`);return f.length>0&&b.push(`事实:
|
|
112
|
-
${f.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")})(a)).join("\n\n")}(ba)].filter(Boolean).join("\n\n"),bA={...U,chapters:bs},bB=(0,au.tF)({requirement:a.requirement,promptTexts:ay,template:bA,chapters:bs,spec:an});bs=await Promise.all(bs.map(async b=>{if(b.sections?.length)return b;let c=T(aM.filter(a=>a.chapterId===b.id||(0,O.Lk)(a,b.title)),{maxItems:a.maxEvidencePerChapter||10,maxChars:W(bB.chapterTargets.get(b.id)||1200),preservePinned:!0}),d=a7(ba,b,a5(b,bp)),e=await bu({template:bA,chapter:b,evidence:c,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:d,targetWords:bB.chapterTargets.get(b.id)||1200,signal:a.signal});return e.length?{...b,sections:e}:b})),U={...U,chapters:bs};let bC=(0,au.tF)({requirement:a.requirement,promptTexts:ay,template:U,chapters:bs,spec:an});Y=bs.map(a=>a.id);let bN=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
|
|
113
|
-
${a.template.category||""}
|
|
114
|
-
${a.requirement||""}`,e=/专项|安全|质量|验收|审核|合同|合规|审计|风控|风险/u.test(d),f=a.targetWords>=3e4||b>=8||c>=4e3,g=a.targetWords<=6e3&&b<=4&&!e,h=Number(process.env.DOCUMENT_TARGET_LLM_CONCURRENCY??0),i=Math.max(1,b),j=Math.max(1,Math.min(b||1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??i)))),k=Math.max(1,Math.min(3,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??(e?1:f?2:3)))));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:j,maxSectionConcurrency:k,maxChapterReviewConcurrency:Math.max(1,Math.min(2,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??i)))),targetLlmConcurrency:h}}({template:U,targetWords:bC.targetChars||[...bC.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});bN.targetLlmConcurrency>0&&(y=bN.targetLlmConcurrency,void 0===aK||!Number.isFinite(y)||y<=0||(aK=Math.min(aK,Math.floor(y))),aN());let bO={strategy:bN,metrics:[],llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:aN(),limitAdjustments:0},evidence:{raw:0,used:0,filteredNoise:0,avgNoiseScore:0,avgFactDensity:0,searchQueries:0,searchMs:0,contextChars:0},quality:{blockingCount:0,importantCount:0,minorCount:0,repairedCount:0}},bR=bN.targetLlmConcurrency>0?`LLM 并发上限 ${bN.targetLlmConcurrency}`:"LLM 不做本地并发限流";aZ(ad,aY({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${bN.mode} 生成策略:章节审查 ${bN.enableChapterReview?"启用":"跳过"}、全局审查 ${bN.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${bN.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${bN.enableDocumentBudgetExpansion?"启用":"跳过"};${bR}`},{subtitle:"后台自动策略"}));let bS=aY({type:"context_recall",roleId:"project-memory",status:bv.length>0?"success":"skipped",message:bv.length>0?`已注入 ${bv.length} 条短期/长期上下文`:"未召回可用上下文"},{subtitle:"上下文记忆"}),bT=aj?`;识别到 OUTLINE 章节 ${ah.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";aZ(ad,aY({type:"role_binding",roleId:ab,status:"success",message:`已绑定 ${af.length} 个文件角色、${ae.length} 个提示词角色;后台优化建议关注 ${an.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*ap.materialCoverageRate)}%${bT}`},{subtitle:ac,roleName:ac})),aZ(ad,aY({type:"validation",roleId:"document-readiness",status:ap.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*ap.materialCoverageRate)}%,资料角色 ${Math.round(100*ap.roleSatisfactionRate)}%,优化建议 ${Math.round(100*ap.specCompletenessRate)}%;${al.source.selectionReason}`},{subtitle:"生成准备度检查"})),aZ(ad,bS),Z();let bU=process.env.DOCUMENT_CHAPTER_CONCURRENCY,bV=Number(bU??bN.maxChapterConcurrency),bW=Math.max(1,Math.min(bs.length||1,bN.maxChapterConcurrency,Number.isFinite(bV)?Math.floor(bV):bN.maxChapterConcurrency));aZ(ad,aY({type:"validation",roleId:"chapter-concurrency",status:"success",message:`章节并发调度:本轮 ${bW}/${bs.length} 章并发`,details:[`策略上限:${bN.maxChapterConcurrency}`,`环境变量 DOCUMENT_CHAPTER_CONCURRENCY:${bU??"未设置"}`,`有效章节数:${bs.length}`]},{subtitle:"章节并发策略"})),Z();for(let b=0;b<bs.length;b+=bW){let c=bs.slice(b,b+bW);await Promise.all(c.map(async(c,d)=>{let e,f=b+d;aG(a.signal);let g=Date.now(),h=ad.length;try{ad.push(aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${f+1}/${bs.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:f+1,total:bs.length,label:"章节生成"}},{subtitle:(0,$.GQ)(c.title),order:f})),Z();let b=[],d=a5(c,bp),i=d?[d.title,...d.requiredContents,...d.evidenceNeeds,...d.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[],j=c.queries.length>0?c.queries:[U.name,U.outputTitle,c.title],k=[...new Set([...j,...i])].filter(Boolean),l=Date.now();ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 正在执行 ${k.length} 组知识库检索`,details:k.map(a=>`检索:${a.slice(0,42)}`),progress:{current:f+1,total:bs.length,label:"证据检索"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z();let m=[...aC].filter(Boolean).sort(),n=[],o=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let b of k.slice(0,o)){if(aG(a.signal),0===m.length)break;let c=await V.search(R,b,{scope:"project",filters:{filePaths:m},limit:Math.min(aJ,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15},generationMode:!1});n.push(c.results)}for(let a of(bO.evidence.searchQueries+=Math.min(k.length,o),bO.evidence.searchMs+=Date.now()-l,n))b.push(...a.filter(a=>bf(R,a.filePath,aC)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:aE.get(a.filePath),processingType:aH.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let p=new Set((c.pinnedEvidenceFilePaths||[]).filter(Boolean)),q=a6(ba,c,d);b.push(...q.flatMap(({artifact:a})=>a.evidence.filter(a=>bf(R,a.filePath,aC)).map(a=>({...a,chapterId:c.id,source:"role-node"}))));let r=new Set([...p]),s=bC.chapterTargets.get(c.id)||1200,t=W(s,6e3,Math.max(12e3,3e3*aN()));for(let a of r){if(!bf(R,a,aC))continue;let d=p.has(a),e=aI.getFileDetail(a,{maxChunkContentChars:t});e&&b.push(...e.chunks.map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:aE.get(e.file.relativePath),processingType:aH.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let u=b.filter(a=>bf(R,a.filePath,aC)),v=W(s,8e3,Math.max(16e3,3500*aN())),w=Math.max(8,Math.min(28,aJ*Math.max(1,Math.min(k.length,3)))),x=T(u,{maxItems:w,maxChars:v,preservePinned:!0},bO);bO.evidence.contextChars+=x.reduce((a,b)=>a+b.content.length,0);let y=T(u,{maxItems:Math.min(w,18),maxChars:Math.floor(.55*v),preservePinned:!0},bO);aM.push(...x);let z=T(aM,{maxItems:Math.max(40,10*bs.length),maxChars:Math.max(5e4,9e3*bs.length),preservePinned:!0});aM.splice(0,aM.length,...z);let A=function(a){let b=[],c=new Set;for(let d of a)for(let a of function(a){let b=G(a);if(!b)return[];let c=[];for(let a of b.split(F.oS)){let b=a.trim();b.length>=12&&c.push(b)}return c.length?c:[b]}(d.content)){if(!function(a){for(let b of F.By)if(function(a,b){b.lastIndex=0;let c=b.test(a);return b.lastIndex=0,c}(a,b))return!0;for(let b of F.ri)if(function(a,b){for(let c of b)if(a.includes(c))return!0;return!1}(a,[...b]))return!0;return!1}(a))continue;let e=G(a),f=e.replace(F.pL,"#");if(c.has(f))continue;c.add(f);let g=function(a){for(let[b,c]of F.lj)if(c.lastIndex=0,c.test(a))return b;return"通用领域"}(e),h=I(e,F.IP),i=I(e,F.SU),j=I(e,F.is),k=I(e,F.C2),l=I(e,F.dB),m=I(e,F.Xm),n=I(e,F.fT),o=J(e,F.qW),p=J(e,F.xy),q=J(e,F.Gw),r=J(e,F.UR),s=function(a){for(let b of F.ye)if(b.match(a))return b.category;return"technical_parameter"}({text:e,parameters:h,quantities:i,scheduleValues:j,costValues:k,frequencyValues:l,resourceValues:m,standards:n,inspection:p,riskControl:r});b.push({id:`tech-${b.length+1}`,category:s,discipline:g,workItem:function(a,b){for(let b of F.JA)if(a.includes(b))return b;return b}(e,g),specification:h.join("、")||void 0,parameter:h.join("、")||void 0,quantities:i,scheduleValues:j,costValues:k,frequencyValues:l,resourceValues:m,commitmentValues:[...j,...k,...l],process:o,qualityControl:q,inspection:p,standard:n,riskControl:r,sourceRole:d.roleId,sourceFile:d.filePath,text:e,confidence:Math.min(1,.42+.06*h.length+.05*i.length+.05*j.length+.05*k.length+.05*l.length+.07*n.length+.04*o.length+.04*p.length)})}return b}(y),B=function(a,b){let c=[];for(let d of b)(function(a,b){let c=`${b.title} ${b.purpose} ${(b.sections||[]).join(" ")} ${(b.requiredFacts||[]).join(" ")} ${(b.queries||[]).join(" ")}`;for(let b of F.Z)if(b.pattern.lastIndex=0,b.pattern.test(c))return b.match(a);return c.includes(a.discipline)||c.includes(a.workItem)})(d,a)&&c.push(d);return c.sort((a,b)=>b.confidence-a.confidence),{chapterId:a.id,chapterTitle:a.title,facts:c}}(c,A);aL.push(B);let C=0===B.facts.length?"":["本章必须优先使用以下结构化事实。不得用空泛表述替代已列出的数量、时间、频次、资源、金额、参数、流程动作、检查验收和标准依据。","","| 序号 | 类型 | 领域 | 对象 | 参数/规格 | 数量/时间/频次/资源/金额 | 过程动作 | 检查验收 | 标准依据 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...B.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(F.YT,",")} |`}),"","写作要求:","- 围绕本章主题,将事实表中的对象、参数、数量、时间节点、频次、资源、金额和标准依据自然写入正文。","- 有明确资料依据的事实必须保持原值,不得改写口径或编造缺失数据。","- 对流程、方法或执行类章节,应说明适用对象、实施步骤、控制要点、检查方式和结果闭环。","- 对存在风险、约束或合规要求的事实,应写清触发条件、控制措施、责任边界和复核方式。"].join("\n"),D=function(a){let b=L(a.facts);return 0===b.length?"":["## 本章量化事实覆盖矩阵","以下对象、数量、时间、频次、资源或金额来自绑定材料。正文必须逐项覆盖;同一方案涉及多个对象时,不得只写其中一项或把多个量化事实合并成一个笼统数量。","| 序号 | 对象/事项 | 量化值 | 参数/规格 | 来源角色 | 来源文件 | 原始事实 |","|---|---|---|---|---|---|---|",...b.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].join("、");return`| ${b+1} | ${K(a)} | ${c} | ${a.parameter||a.specification||""} | ${a.sourceRole||""} | ${a.sourceFile||""} | ${a.text.replace(F.YT,",")} |`}),"","覆盖要求:","- 日期、数量、规格、资源数量和时间节点只能使用资料中的值或由资料明确推导的值;没有依据时不得编造。","- 如果同一方案适用于多个对象、区域、阶段或类别,应使用表格或分项段落分别说明适用范围、量化事实和控制要点。","- 资料中存在多个来源值或口径不一致时,应保持审慎表述并提示需按资料优先级复核,不得随意选择一个数值。"].join("\n")}(B),E=c.requiredFacts.filter(a=>!x.some(b=>(0,O.Lk)(b,a)));for(let a of(0===x.length&&aO.push(`${c.title}:未检索到明确资料依据`),E))aO.push(`${c.title}:${a} 未检索到明确依据`);let H=aY({type:"knowledge_retrieval",roleId:"knowledge-base",status:aM.length>0?"success":"fallback",message:`已检索/绑定 ${aM.length} 条证据`});aS<0?aS=aZ(ad,H):ad[aS]={...H,order:ad[aS]?.order??H.order},Z(),aG(a.signal);let M=a8(ba,U),N=a7(ba,c,d),P=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[]].filter(Boolean))],e=a.roleFacts.map(({fact:a})=>`- ${a.key}:${Q(aF(a.value))}`),f=a.technicalFactAssignment.facts.map(a=>{let b=[...a.quantities||[],...a.scheduleValues||[],...a.resourceValues||[],...a.standard||[],a.parameter||"",a.specification||""].filter(Boolean).join("、");return`- ${[a.discipline,a.workItem].filter(Boolean).join("/")||Q(a.text)}${b?`:${b}`:""}`}),g=new Set(a.evidence.map(a=>a.filePath)).size;return["【本章事实覆盖反馈】",d.length?`必须优先覆盖的事实/要求:
|
|
115
|
-
${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
|
|
116
|
-
${e.join("\n")}`:"",f.length?`结构化/量化事实:
|
|
117
|
-
${f.join("\n")}`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。如材料未明确提供,不得编造具体数值,应写成需要复核的条件、假设或说明。`:"",`本章可用材料来源约 ${g} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:an,roleFacts:q,technicalFactAssignment:B,evidence:x,missingFacts:E}),S=an?.chapterRules.find(a=>a.id===c.id||a.title===c.title),Y=bC.chapterTargets.get(c.id)||1200,_=Math.ceil(Y*(bC.maxChars?1.1:1.18)),ab=bC.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*Y))):1200,ac=Math.max(d?.minWords||0,S?.minWords||0,an?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*Y),ab),af=bx(ac,Y),ag=c.sections?.filter(Boolean).length||0,ah=/[、,,;;]/u.test(c.title),aj=0!==Number(process.env.DOCUMENT_SECTION_FIRST_GENERATION??1)&&ag>=2&&!ah;ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:aj?`${(0,$.GQ)(c.title)} 正在按小节并发成稿`:`${(0,$.GQ)(c.title)} 正在整章一次成稿`,details:aj?[`有效证据:${x.length} 条`,`目标字数:约 ${Y} 字,上限约 ${_} 字`,`小节并发上限:${bN.maxSectionConcurrency}`,`规划小节:${c.sections?.length||0} 个`,"按章节结构拆分小节并发生成,章节聚合后再审查修复"]:[`有效证据:${x.length} 条`,`目标字数:约 ${Y} 字,上限约 ${_} 字`,`章节并发上限:${bW}`,"首次生成必须覆盖章节结构、小节、事实和目标篇幅,后置修复仅兜底"],progress:{current:f+1,total:bs.length,label:aj?"小节并发":"整章成稿"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z();let ak=aj?await aa(()=>a_(bO,`chapter-section-draft:${c.id}`,()=>aT(b=>bw({template:U,chapter:c,evidence:x,missingFacts:E,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:N,targetWords:Y,maxWords:_,forbidDrawingImages:M,factCoverageContext:P,projectRoot:R,modelName:bk,fileRolesHash:bm,allowPartialResult:!1,maxSectionConcurrency:bN.maxSectionConcurrency,diagnostics:bO,signal:b}),Math.min(by(Y),Math.max(24e4,Math.ceil(15e4*(c.sections?.length||2)/Math.max(1,bN.maxSectionConcurrency||1)))),a.signal))):await aa(()=>a_(bO,`chapter-draft:${c.id}`,()=>aT(b=>br(U,c,x,E,ay,bz,a.requirement,N,{forbidDrawingImages:M,minWords:ac,targetWords:Y,maxWords:_,maxTokens:af,technicalFactContext:C,coverageMatrixContext:D,factCoverageContext:P,signal:b}),by(Y),a.signal)));if(!ak&&aj&&(ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 小节并发未完整返回,改用整章兜底生成`,details:[`目标字数:约 ${Y} 字`,`有效证据:${x.length} 条`],progress:{current:f+1,total:bs.length,label:"整章兜底"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X),ak=await aa(()=>a_(bO,`chapter-draft-fallback:${c.id}`,()=>aT(b=>br(U,c,x,E,ay,bz,a.requirement,N,{forbidDrawingImages:M,minWords:ac,targetWords:Y,maxWords:_,maxTokens:af,technicalFactContext:C,coverageMatrixContext:D,factCoverageContext:P,signal:b}),by(Y),a.signal)))),ak||(ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 小节生成未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${Y} 字`,`有效证据:${x.length} 条`],progress:{current:f+1,total:bs.length,label:"整章兜底"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X),ak=await aa(()=>a_(bO,`chapter-draft-fallback:${c.id}`,()=>aT(b=>br(U,c,x,E,ay,bz,a.requirement,N,{forbidDrawingImages:M,minWords:ac,targetWords:Y,maxWords:_,maxTokens:af,technicalFactContext:C,coverageMatrixContext:D,factCoverageContext:P,signal:b}),by(Y),a.signal)))),aG(a.signal),ak||(ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${Y} 字`],progress:{current:f+1,total:bs.length,label:"紧凑兜底"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X),ak=await aa(()=>a_(bO,`chapter-draft-compact-fallback:${c.id}`,()=>aT(b=>br(U,c,x,E,ay,bz,a.requirement,N,{forbidDrawingImages:M,minWords:Math.max(450,Math.floor(.75*ac)),targetWords:Y,maxWords:_,maxTokens:af,technicalFactContext:C,coverageMatrixContext:D,factCoverageContext:P,signal:b}),by(Y),a.signal)))),aG(a.signal),!ak)throw Error(`${c.title} 大模型未返回有效章节正文`);let al=bM(ak,c);if(al.length>0){let b=ak;ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 首次成稿存在 ${al.length} 个小节缺口,正在定向补写`,details:al.map(a=>a.message),progress:{current:f+1,total:bs.length,label:"小节补写"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X),ak=await aa(()=>a_(bO,`chapter-supplement:${c.id}`,()=>bD({template:U,chapter:c,content:b,evidence:x,missingFacts:E,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:N,targetWords:Y,forbidDrawingImages:M,factCoverageContext:P,maxSectionConcurrency:bN.maxSectionConcurrency,forcedSections:al,signal:a.signal})))}if((al=bM(ak,c)).length>0){ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 首次生成仍有 ${al.length} 个小节缺口,正在章节内强制补齐`,details:al.map(a=>a.message),progress:{current:f+1,total:bs.length,label:"章节内小节补齐"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X);let b=ak;ak=await aa(()=>a_(bO,`chapter-forced-section-supplement:${c.id}`,()=>bD({template:U,chapter:c,content:b,evidence:x,missingFacts:E,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:N,targetWords:Y,forbidDrawingImages:M,factCoverageContext:P,maxSectionConcurrency:bN.maxSectionConcurrency,forcedSections:al,signal:a.signal}))),al=bM(ak,c)}if(al.length>0){ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 小节补齐仍未达标,正在整章重新生成`,details:al.map(a=>a.message),progress:{current:f+1,total:bs.length,label:"整章重生"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X);let b=await aa(()=>a_(bO,`chapter-regenerate-after-section-gaps:${c.id}`,()=>aT(b=>br(U,c,x,E,ay,bz,a.requirement,N,{forbidDrawingImages:M,minWords:ac,targetWords:Y,maxWords:_,maxTokens:af,technicalFactContext:C,coverageMatrixContext:D,factCoverageContext:`${P}
|
|
118
|
-
|
|
119
|
-
本章上一轮存在小节缺口,必须一次性生成完整章节并覆盖以下小节问题:
|
|
120
|
-
${al.map(a=>a.message).join("\n")}`,signal:b}),by(Y),a.signal)));b&&(ak=b),al=bM(ak,c)}if(al.length>0){let a=ak?.trim();if(a){let b=c.sections?.length?c.sections:ai(a);X.push({id:c.id,title:c.title,content:a,evidence:x,missingFacts:E,sections:b}),Z(X)}throw Error(`${c.title} 小节未完整生成:${al.map(a=>a.sectionTitle).join("、")}`)}let am=bb({chapter:c,content:ak,missingFacts:E,targetWords:Y}),ao=(0,av.Ff)(am);bO.quality.blockingCount+=ao.blocking,bO.quality.importantCount+=ao.important,bO.quality.minorCount+=ao.minor;let ap=a2(am);if(ap.length>0){let b=ak;ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 正在根据质量问题修复章节:${ap.length} 个阻断问题`,details:ap,progress:{current:f+1,total:bs.length,label:"章节修复"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X);let d=await aa(()=>a_(bO,`chapter-repair:${c.id}`,()=>bc({template:U,chapter:{id:c.id,title:c.title,content:b,evidence:x,missingFacts:E,sections:c.sections||[]},issues:ap,promptTexts:ay,requirement:a.requirement,forbidDrawingImages:M,diagnostics:bO,signal:a.signal})));ak=d.content,d.appliedCount>0&&(bO.quality.repairedCount+=1),aG(a.signal)}if(!ak?.trim())throw Error(`${(0,$.GQ)(c.title)} 首次生成失败,未获得可用于定稿的正文`);let aq=ak,ar=0;if((0,au.V7)(aq)<Math.floor(.82*Y)||a2(bb({chapter:c,content:aq,missingFacts:E,targetWords:Y})).length>0){ad[h]=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${(0,$.GQ)(c.title)} 首次成稿未达定稿门槛,正在定向扩写`,details:[`当前 ${(0,au.V7)(aq)} 字 / 目标 ${Math.floor(.95*Y)} 字`,`章节并发:${bW}`],progress:{current:f+1,total:bs.length,label:"章节扩写"}},{subtitle:(0,$.GQ)(c.title),order:f}),Z(X);let b=await aa(()=>a_(bO,`chapter-expand:${c.id}`,()=>bE({template:U,chapter:c,content:ak,evidence:x,promptTexts:ay,requirement:a.requirement,roleContext:N,targetChars:Math.floor(.95*Y),maxChars:_,forbidDrawingImages:M,maxTokens:af,signal:a.signal})));aq=b.content,ar=b.rounds}let as=(0,au.V7)(aq),at=c.sections?.length?c.sections:ai(aq),aw=(0,av.qK)(aq,[{title:c.title,content:aq,sections:at}]).map(a=>a.message),ax=[...bb({chapter:{...c,sections:at},content:aq,missingFacts:E,targetWords:Y}),...aw],az=function(a,b,c=[]){if(a<=0||c.some(a=>/未返回有效章节正文|生成失败/u.test(a)))return"failed";let d=Math.max(1,Math.floor(.95*b));return a<Math.floor(.75*d)?"failed":a<Math.floor(.9*d)||c.length>0?"fallback":"success"}(as,Y,ax);e=aY({type:"chapter_generation",roleId:"chapter_generation",promptId:ae.find(a=>"chapter_generation"===a.roleId)?.promptId,status:az,message:a$(`${(0,$.GQ)(c.title)} 已由大模型首轮成稿${ar>0?`并定向扩写 ${ar} 轮`:""}:当前 ${as} 字 / 目标 ${Math.floor(.95*Y)} 字${"success"!==az?`;风险:${ax.join("、")||"篇幅未达标"}`:""}`,g),details:[`达标率:${Math.round(as/Math.max(1,Math.floor(.95*Y))*100)}%`,`二级小节:${at.length} 个`,`扩写轮次:${ar}`],progress:{current:f+1,total:bs.length,label:"success"===az?"章节达标":"章节风险"}},{subtitle:(0,$.GQ)(c.title),order:f}),aR.push(e);let aA={id:c.id,title:c.title,content:aq,evidence:x,missingFacts:E,sections:at};X.push(aA),Z(X);let aB=bb({chapter:c,content:aq,missingFacts:E,targetWords:Y}),aD=(0,av.Ff)(aB);bO.quality.blockingCount+=aD.blocking,bO.quality.importantCount+=aD.important,bO.quality.minorCount+=aD.minor}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),aQ.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),aR.push(aY({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${(0,$.GQ)(c.title)} 生成失败`},{subtitle:(0,$.GQ)(c.title),order:f}))}e&&(ad[h]=e),Z(X)}))}if(X.sort((a,b)=>bs.findIndex(b=>b.id===a.id)-bs.findIndex(a=>a.id===b.id)),aL.sort((a,b)=>bs.findIndex(b=>b.id===a.chapterId)-bs.findIndex(a=>a.id===b.chapterId)),0===X.length)throw Error(`章节生成未完成:${aQ.join(";")||"没有生成任何有效章节"}`);if(aj&&X.length<bs.length)throw Error(`OUTLINE 指定 ${bs.length} 章,实际只生成 ${X.length} 章:${aQ.join(";")||"部分章节未生成"}`);aG(a.signal);let bX={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{bX=await bq(R,aM,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(aG(a.signal),bX.notes))aM.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let bY=T(aM,{maxItems:Math.max(48,10*bs.length),maxChars:Math.max(52e3,9e3*bs.length),preservePinned:!0});aM.splice(0,aM.length,...bY);let bZ=function(a,b,c){let d={};for(let e of(0,O.Uy)(a,c)){let a=b.find(a=>(0,O.I2)(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ")}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(U,aM,an);for(let a of ba)for(let b of a.facts)bZ[b.key]=`${aF(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let b$=function(a,b,c){let d=(0,O.Uy)(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!(0,O.I2)(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ")],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(aM,U,an),b_=ba.flatMap(a=>a.facts.map(a=>({key:a.key,value:aF(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),b0={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=(0,O.Uy)(b,c).filter(a=>a.required);return 0===d.length?a.filter(a=>a.confidence>=.75&&aF(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=aF(a.value).trim();if(!c||c.length<2||c.length>220&&a.confidence<.8)return!1;let d=`${a.fieldId||""} ${a.fieldName||""} ${a.key}`.toLowerCase();return!!(d.includes(b.id.toLowerCase())||d.includes(b.name.toLowerCase()))&&("project_basic_fact"===a.roleId||a.roleId?.startsWith("role-")||a.sourceRef?.filePath?a.confidence>=.55:a.confidence>=.75)})(a,b))).length/d.length<.9}([...b_,...b$],U,an)){let b=T(aM,{maxItems:48,maxChars:45e3,preservePinned:!0});try{b0=await aV(b,az,U,an,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}}aG(a.signal);let b1=[...b_,...b$,...b0.facts];for(let a of(aZ(ad,bX.stage),b0.stages))aZ(ad,a);Z();let b2=function(a){let b=[],c=new Set;for(let d of a.filter(a=>"table"===a.processingType)){if(c.has(d.filePath))continue;c.add(d.filePath);let a=(0,g.aY)(),f=e.isAbsolute(d.filePath)?d.filePath:aw.existsSync(e.join(a,"knowledgeBase",d.filePath))?e.join(a,"knowledgeBase",d.filePath):e.join(a,d.filePath),h=e.extname(d.filePath).toLowerCase();if(aw.existsSync(f)&&[".xlsx",".xls",".csv"].includes(h))try{let a=ax.readFile(f,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let e=a.Sheets[c],f=ax.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let g=f.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=f[g].filter(Boolean),i=f.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:d.roleId||"table",sheet:c,headers:h,rows:i,sourceFile:d.filePath,sourceRange:e["!ref"]})}continue}catch{}let i=d.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(i.length<2)continue;let j=i[0].includes("|")?"|":i[0].includes(" ")?" ":",",k=i.map(a=>a.split(j).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);k.length<2||b.push({tableType:d.roleId||"table",headers:k[0],rows:k.slice(1),sourceFile:d.filePath,sourceRange:d.sectionTitle})}return b}(aM),b3=aM.filter(a=>"pinned-evidence"===a.source).length,b4=aM.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,b5=aY({type:"reference",roleId:"quality-enhancement",status:aM.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${aM.length} 条,人工确认/固定证据 ${b3} 条,上下文 ${bv.length} 条,自动检索证据 ${b4} 条`},{subtitle:"证据与上下文增强"});for(let a of(ad.push(b5),Z(),b1))bZ[a.key]=`${aF(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let b6=new Map;for(let a of aM)b6.set(a.filePath,(b6.get(a.filePath)??0)+1);let b7=[...b6.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),b8=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|ISO|IEC|IEEE|RFC|API|台|套|个|项|批|次|页|份|人|㎡/iu.test(`${a.key} ${a.value}`)),h=a.filter(a=>"table"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/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))]).filter(aW),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=function(a){let b=aF(a).trim(),c=aF(b).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();return c&&!(c.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(b)?c:""}(a.value);b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].slice(0,4).map(a=>`${aF(a[0].value).slice(0,120)}(${[...new Set(a.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d.slice(0,8)}(a,d)}}(b1,b2,aO,an),b9=X.map(a=>{let b=an.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)}}),ca=function(a,b=[],c){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&f.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===(0,d.zY)(c).length&&f.push("模板未绑定任何提示词");let g=new Set(b.map(a=>a.roleId));return c?.fileBindings?.some(a=>"rule"===a.roleId)&&!g.has("rule")&&e.push("rule 角色未抽取到结构化事实"),{passed:0===f.length,warnings:e,errors:f}}(X,b1,U);ca.warnings.push(...ap.warnings),ca.errors.push(...ap.blockingIssues);let cb=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"warning",message:a,suggestion:"请按招标文件、图纸、清单和合同条款的优先顺序复核取值口径。"}))),d}(ca,b8,X);for(let a of(cb.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}(b9)),ba))for(let b of a.warnings)cb.push({level:"error",message:b,suggestion:"请检查绑定资料与角色抽取结果,避免依赖兜底片段进入正文生成。"});let cc=a8(ba,U),cd=Date.now(),ce=(0,au.V7)(X.map(a=>a.content).join("\n\n"));aZ(ad,aY({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${ce} 字`,details:[`章节数:${X.length}`,`目标:${bC.targetChars||bC.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),Z(X);let cf=bN.enableDocumentBudgetExpansion?await aa(()=>bF({template:U,chapters:X,budget:bC,promptTexts:ay,requirement:a.requirement,forbidDrawingImages:cc,signal:a.signal})):X;X.splice(0,X.length,...cf);let cg=X.map(a=>a.content).join("\n\n"),ch=(0,au.fW)(bC,cg),ci=[bC.targetChars?`目标 ${bC.targetChars} 字${bC.minChars||bC.maxChars?`(区间 ${bC.minChars||0}-${bC.maxChars||"∞"} 字)`:""}`:void 0,bC.targetPages?`目标 ${bC.targetPages} 页${bC.minPages||bC.maxPages?`(区间 ${bC.minPages||0}-${bC.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";aZ(ad,aY({type:"validation",roleId:"document-budget",status:bC.maxChars&&ch.currentChars>bC.maxChars||bC.minChars&&ch.currentChars<bC.minChars?"fallback":"success",message:a$(`文档预算:当前 ${ch.currentChars} 字,新增 ${Math.max(0,ch.currentChars-ce)} 字,预计 ${ch.estimatedPages} 页;${ci}`,cd)},{subtitle:"文档预算"})),Z(X);let cj=aR.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,ck=aR.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cj>0&&cb.push({level:"warning",message:`章节生成存在兜底:${cj} 章`,suggestion:"已保留章节成果;建议复核对应章节,但不阻断导出。"}),ck>0&&cb.push({level:"error",message:`部分章节生成失败:${ck} 章`,suggestion:aQ.join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cl=cb.filter(a=>"error"===a.level&&(0,av.Nz)(a)).length,cm=[...ad];aZ(cm,aY({type:"validation",roleId:"document-workflow",status:cl>0?"failed":"success",message:`阻断 ${cl},错误 ${ca.errors.length},警告 ${ca.warnings.length}`},{subtitle:"最终规范校验"})),aZ(cm,aY({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),aZ(cm,aY({type:"export_ready",roleId:"document-workflow",status:cl>0?"failed":"success",message:cl>0?"导出门禁未通过,请完成阻断问题修复后再导出":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cn={templateId:U.id,templateName:U.name,title:U.outputTitle,requirement:a.requirement||"",projectRoot:R,projectId:S,exportSettings:U.exportSettings,generationSettings:U.generationSettings,facts:bZ,structuredFacts:b1,factsModel:b8,chapters:X,sources:b7,missingItems:[...new Set(aO)],validation:ca,validationIssues:cb,executionStages:cm,exportGate:{passed:0===cl,blockingIssues:cb.filter(a=>"error"===a.level&&(0,av.Nz)(a)),checklist:[]},assets:[],partialChapters:X.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:bJ(a,bC.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:X,generatedAt:Date.now()},co=at(cn);aG(a.signal),aZ(cm,aY({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${X.length} 章`,details:[`审查并发:${bN.maxChapterReviewConcurrency}`,"检查事实覆盖、结构完整性和篇幅达标"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),Z(X,cm);let cp=bN.enableChapterReview?await aa(()=>a_(bO,"chapter-review",()=>bG({template:U,chapters:X,budget:bC,promptTexts:aA||ay,requirement:a.requirement,strategy:bN,diagnostics:bO,signal:a.signal}),{chapters:X.length}),cm):{summaries:X.map(a=>({chapterId:a.id,title:a.title,status:"pass",issues:[],suggestions:[],chars:(0,au.V7)(a.content)})),stage:aY({type:"llm_review",roleId:"chapter-review",status:"skipped",message:"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};cm.push(cp.stage);let cq=cp.summaries,cr=cq.filter(a=>"pass"!==a.status&&a.issues.length>0);if(cr.length>0){aZ(cm,aY({type:"llm_review",roleId:"chapter-review-repair",status:"running",message:`正在按章节审查结果就地修复:${cr.length} 章`,details:cr.map(a=>`${a.title}:${a.issues.slice(0,5).join(";")}`),progress:{current:1,total:cr.length,label:"章节就地修复"}},{subtitle:"章节就地修复"})),Z(X,cm);let b=new Map,c=0,d=Number(process.env.DOCUMENT_CHAPTER_REPAIR_CONCURRENCY??bN.maxChapterReviewConcurrency??1),e=Math.max(1,Math.min(bN.maxChapterReviewConcurrency||1,Number.isFinite(d)?Math.floor(d):1));for(let d=0;d<cr.length;d+=e){aG(a.signal);let f=cr.slice(d,d+e);for(let d of(await Promise.all(f.map(async b=>{let c=X.find(a=>a.id===b.chapterId);if(!c)return{chapterId:b.chapterId,content:void 0,appliedCount:0};let d=await bc({template:U,chapter:c,issues:b.issues,promptTexts:aA||ay,requirement:a.requirement,forbidDrawingImages:cc,diagnostics:bO,signal:a.signal});return{chapterId:b.chapterId,content:d.content,appliedCount:d.appliedCount}}))))d.content&&b.set(d.chapterId,d.content),c+=d.appliedCount}let f=0,g=new Set;for(let a=0;a<X.length;a+=1){let c=b.get(X[a].id);c&&c!==X[a].content&&(X[a]={...X[a],content:c},g.add(X[a].id),f+=1)}f>0&&(cq=cq.map(a=>g.has(a.chapterId)?{...a,status:"warn",issues:[],suggestions:[`已按章节审查结果应用局部修复,修复前问题已移交最终校验复核。`],chars:(0,au.V7)(X.find(b=>b.id===a.chapterId)?.content||"")}:a),co=at({...cn,chapters:X,validationIssues:cb,executionStages:cm})),cm.push(aY({type:"llm_review",roleId:"chapter-review-repair",status:"success",message:`章节就地修复完成:修复 ${f} 章,应用 ${c} 个 patch`},{subtitle:"章节就地修复"})),Z(X,cm)}for(let a of cq.filter(a=>"pass"!==a.status&&a.issues.length>0))cb.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:共 ${a.issues.length} 个问题;${a.issues.join(";")||"存在质量风险"}`,suggestion:a.suggestions.join(";")||"请复核章节事实覆盖、结构完整性和专业闭环。"});aZ(cm,aY({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["检查跨章节术语、项目参数、范围边界和闭环关系"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),Z(X,cm);let cs=bN.enableGlobalReview?await aa(()=>a_(bO,"global-consistency-review",()=>bH({template:U,chapters:X,chapterReviews:cq,promptTexts:aA||ay,requirement:a.requirement,projectContext:bz,diagnostics:bO,signal:a.signal}),{chapters:X.length}),cm):{issues:[],stage:aY({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:"当前策略未启用全局一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cm.push(cs.stage),cs.issues))cb.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、项目参数、范围边界和闭环关系。"});Z(X,cm);let ct=X.filter(a=>0===a.evidence.length||a.missingFacts.length>0||(0,au.V7)(a.content)<Math.floor(.7*(bC.chapterTargets.get(a.id)||1200))||cq.some(b=>b.chapterId===a.id&&"fail"===b.status)||bb({chapter:bs.find(b=>b.id===a.id)||{id:a.id,title:a.title,purpose:"",queries:[],requiredFacts:[],sections:a.sections},content:a.content,missingFacts:a.missingFacts,targetWords:bC.chapterTargets.get(a.id)||1200}).length>0),cu=cl>0||cs.issues.length>0||cq.some(a=>"fail"===a.status)||cb.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),cv=bN.enableFinalQualityReview&&(cu||ct.length>Math.max(3,Math.floor(.35*X.length))),cw=Date.now();cv&&(aZ(cm,aY({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${ct.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),Z(X,cm));let cx=T(aM,{maxItems:Math.max(32,8*bs.length),maxChars:Math.max(36e3,6e3*bs.length),preservePinned:!0}),cy=cv?await aa(()=>bI({template:U,spec:an,markdown:co,evidence:cx,promptTexts:aA||ay,projectContext:bz,requirement:a.requirement,diagnostics:bO,signal:a.signal}),cm):{markdown:co,stage:{type:"llm_review",roleId:"llm-review",status:ct.length>0?"fallback":"success",message:ct.length>0?`本地风险扫描发现 ${ct.length} 个低/中风险章节,未达到最终 LLM 审查触发阈值,保留为待复核 warning`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};cy.stage.message=a$(cy.stage.message||"LLM 审查完成",cw),aG(a.signal);let cz=as(cy.markdown===co?at({...cn,validationIssues:cb,exportGate:cn.exportGate,executionStages:cm}):cy.markdown,X,{forbidDrawingImages:cc}).markdown,cA=aq(cz,U).map(a=>a.message),cB=(0,av.bM)(cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cC=(0,av.mR)(cz,U).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cD=(0,av.N1)(cz,b8).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cE=M({assignments:aL,markdown:cz}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cF=[...(0,av.gN)(cz),...(0,av.f8)(cz)].map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cG=(0,av.k0)(cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cH=(0,av.qK)(cz,X).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cI=(0,av.iC)(cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cJ=(0,av.BV)(cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cK=(0,av.Ty)(X).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cL=ak(cz).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),cM=[...a9(cz,X,bp,ba,cc),...cA,...cB,...cC,...cD,...cE,...cF,...cG,...cH,...cI,...cJ,...cK,...cL],cN=Date.now();aZ(cm,aY({type:"llm_review",roleId:"quality-repair",status:cM.length>0?"running":"success",message:cM.length>0?`正在进行精准质量修复:${cM.length} 个问题`:"未发现需要精准修复的问题",details:cM,progress:{current:1,total:Math.max(1,cM.length),label:"质量修复"}},{subtitle:"精准质量修复"})),Z(X,cm);let cO=await aa(()=>a_(bO,"local-patch-quality-repair",()=>bd({markdown:cz,template:U,chapters:X,promptTexts:ay,requirement:a.requirement,issues:cM,forbidDrawingImages:cc,strategy:bN,diagnostics:bO,signal:a.signal}),{issues:cM.length}),cm);cO.stage&&(cO.stage.message=a$(cO.stage.message||"质量修复完成",cN)),aG(a.signal);let cP=cO.stage?[...cm,cy.stage,cO.stage]:[...cm,cy.stage],cQ=cO.chapters,cR=(0,av.yw)(cz,cQ).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(cR.length>0){let b=Date.now();aZ(cP,aY({type:"llm_review",roleId:"section-content-repair",status:"running",message:`正在补写空洞小节:${cR.length} 个问题`,details:cR.map(a=>a.message),progress:{current:1,total:cR.length,label:"小节补写"}},{subtitle:"小节内容补写"})),Z(cQ,cP);let c=[...cQ];for(let b=0;b<cQ.length;b+=bN.maxChapterConcurrency){aG(a.signal);let d=cQ.slice(b,b+bN.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=cR.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bs.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bC.chapterTargets.get(b.id)||1200,f=a5(d,bp),g=await bD({template:U,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:a7(ba,d,f),targetWords:e,forbidDrawingImages:cc,maxSectionConcurrency:bN.maxSectionConcurrency,forcedSections:c,signal:a.signal}),h=bP(g,c),i=b.sections?.length?b.sections:ai(h);return{...b,content:h,markdown:h,sections:i}}))).forEach((a,d)=>{c[b+d]=a})}cQ=c;let d=(0,av.qK)(at({...cn,chapters:cQ,validationIssues:cb,exportGate:cn.exportGate,executionStages:cm}),cQ);aZ(cP,aY({type:"llm_review",roleId:"section-content-repair",status:d.length>0?"fallback":"success",message:a$(d.length>0?`小节补写后仍存在 ${d.length} 个内容缺口`:"小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"小节内容补写"})),Z(cQ,cP)}let cS=(0,au.fW)(bC,cQ.map(a=>a.content).join("\n\n"));if(bN.enableDocumentBudgetExpansion&&bC.minChars&&cS.currentChars<Math.floor(.9*bC.minChars)&&(!bC.maxChars||cS.currentChars<bC.maxChars)){let b=Date.now(),c=cS.currentChars;aZ(cP,aY({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${bC.minChars} 字`,`章节数:${cQ.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),Z(cQ,cP),cQ=await aa(()=>bF({template:U,chapters:cQ,budget:bC,promptTexts:ay,requirement:a.requirement,forbidDrawingImages:cc,signal:a.signal}),cP);let d=(0,au.fW)(bC,cQ.map(a=>a.content).join("\n\n"));aZ(cP,aY({type:"validation",roleId:"document-budget-repair",status:bC.minChars&&d.currentChars<bC.minChars?"fallback":"success",message:a$(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let cT=as(at({...cn,chapters:cQ,validationIssues:cb,exportGate:cn.exportGate,executionStages:cm}),cQ,{forbidDrawingImages:cc}),cU=cT.chapters,cV=cT.markdown,cW=(0,av.yw)(cV,cU).filter(a=>a.planned||"missing_planned_section"===a.reason||"empty"===a.reason||"table_only"===a.reason);if(cW.length>0){let b=Date.now();aZ(cP,aY({type:"llm_review",roleId:"final-section-content-repair",status:"running",message:`最终结构化后补写残留空洞小节:${cW.length} 个问题`,details:cW.map(a=>a.message),progress:{current:1,total:cW.length,label:"最终小节补写"}},{subtitle:"最终小节内容补写"})),Z(cU,cP);let c=[...cU];for(let b=0;b<cU.length;b+=bN.maxChapterConcurrency){aG(a.signal);let d=cU.slice(b,b+bN.maxChapterConcurrency);(await Promise.all(d.map(async b=>{let c=cW.filter(a=>a.chapterTitle===b.title);if(0===c.length)return b;let d=bs.find(a=>a.id===b.id||a.title===b.title)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},e=bC.chapterTargets.get(b.id)||1200,f=a5(d,bp),g=await bD({template:U,chapter:d,content:b.content,evidence:b.evidence,missingFacts:b.missingFacts,promptTexts:ay,projectContext:bz,requirement:a.requirement,roleContext:a7(ba,d,f),targetWords:e,forbidDrawingImages:cc,maxSectionConcurrency:bN.maxSectionConcurrency,forcedSections:c,signal:a.signal}),h=bP(g,c),i=b.sections?.length?b.sections:ai(h);return{...b,content:h,markdown:h,sections:i}}))).forEach((a,d)=>{c[b+d]=a})}cU=(cT=as(at({...cn,chapters:c,validationIssues:cb,exportGate:cn.exportGate,executionStages:cm}),c,{forbidDrawingImages:cc})).chapters,cV=cT.markdown;let d=(0,av.qK)(cV,cU);aZ(cP,aY({type:"llm_review",roleId:"final-section-content-repair",status:d.length>0?"fallback":"success",message:a$(d.length>0?`最终补写后仍存在 ${d.length} 个内容缺口`:"最终小节内容补写完成",b),details:d.map(a=>a.message)},{subtitle:"最终小节内容补写"})),Z(cU,cP)}let cX=[...a9(cz,X,bp,ba,cc),...cA];for(let a of((cb=(0,av.kQ)(an,[...cb,...cX.map(a=>({level:"warning",message:a}))],b8,cU,cV,af,ae)).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.documentNo;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:cV,spec:an,summary:al})),cb.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===b||a.fieldName===b)).map(a=>({value:String(a.value),source:a.sourceFile}))}(a.facts,c.keys)){let a=function(a){let b=a.trim(),c=b.replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();return c&&!(c.length>80)&&/[\d年月日%]|合格|鲁班奖|黄山杯|一星|二星|三星|总价合同|单价合同/u.test(b)?c:""}(b.value);a&&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&&([c,...a.summary.fingerprint.projectNames].flatMap(a=>[a,a.replace(/^\d+(?:\.\d+)?[^\u4e00-\u9fa5]*/u,""),a.replace(/\([^)]*\)|([^)]*)/gu,"")]).map(a=>a.trim()).filter(a=>a.length>=8).some(b=>a.markdown.includes(b))||b.push({level:"error",message:`正文未包含当前对象名称:${c}`,suggestion:"请重新生成,确保标题、概况或背景信息体现当前对象名称。"})),b}({markdown:cV,facts:b1,summary:al})),cb.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)&&E(a,e)&&c.push({level:"error",message:`正文疑似混入其他对象名称:${e}`,suggestion:"请检查绑定材料选择、模板绑定文件和知识库证据范围。"});let e=b.fingerprint.documentNos,f=a.match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)?.find(a=>!e.includes(a));return f&&e.length>0&&c.push({level:"error",message:`正文疑似混入其他文档编号:${f}`,suggestion:"请重新生成并检查是否召回了其他绑定材料。"}),c}(cV,al)),cb.push(...function(a){let b=[],c=(0,k.V)().technicalDetailGate,d=`${a.template.name} ${a.template.category} ${a.template.outputTitle}`;if(!(c?.templateMatchers?.length?c.templateMatchers:[...F.TN]).some(a=>RegExp(a,"iu").test(d)))return b;let e=a.finalMarkdown||a.chapters.map(a=>`${a.title}
|
|
121
|
-
${a.content}`).join("\n\n"),f=[];for(let b of a.chapters)F.Zq.test(b.title)&&f.push(b.content);let g=I(f.join("\n")||e,F.IP).length,h=0;for(let a of[F.SU,F.is,F.C2,F.dB,F.Xm])h+=I(e,a).length;let i=I(e,F.fT).length,j=F.qW.filter(a=>e.includes(a)).length,l=F.xy.filter(a=>e.includes(a)).length,m=(c?.genericPhrases?.length?c.genericPhrases:F.vN).reduce((a,b)=>a+(e.match(RegExp(b,"gu"))?.length||0),0),n=[],o=[];for(let b of a.assignments)for(let a of b.facts){var p;n.push(a),o.push(...H([...I(p=`${a.parameter||""} ${a.specification||""} ${a.text}`,F.IP),...I(p,F.SU),...I(p,F.is),...I(p,F.C2),...I(p,F.dB),...I(p,F.Xm),...I(p,F.fT)].map(a=>a.replace(F.H4,""))))}let q=H(o),r=e.replace(F.H4,""),s=q.filter(a=>r.includes(a)),t=q.length?s.length/q.length:1,u=c?.minAssignedFactCountForBlocking??12;return n.length>=u&&t<(c?.minTechnicalFactUsageRate??.35)&&b.push({level:"error",message:`结构化事实使用率不足:${Math.round(100*t)}%`,suggestion:"请把资料中的规格参数、数量、时间、频次、资源、金额、检查结果和标准依据写入对应章节。"}),g<(c?.minMethodParameterCount??18)&&n.length>=u&&b.push({level:"error",message:`方法参数密度不足:仅识别 ${g} 个数字/规格参数`,suggestion:"方法或流程类章节应补充对象、参数、时限、数量、阈值、偏差范围和结果指标等可核查事实。"}),h<(c?.minQuantitativeFactCount??20)&&n.length>=u&&b.push({level:"error",message:`量化事实密度不足:仅识别 ${h} 个数量/时间/频次/资源/金额类数据`,suggestion:"请把数量、时间节点、检查频次、人员/资源配置、响应时限和费用/金额承诺写入对应章节。"}),i<(c?.minStandardCount??4)&&b.push({level:"warning",message:`标准依据引用不足:仅识别 ${i} 个标准编号`,suggestion:"请结合资料补充适用的标准、规范、制度编号或验收依据。"}),j<(c?.minProcessActionCount??6)&&b.push({level:"warning",message:`过程动作覆盖不足:仅识别 ${j} 类过程动作`,suggestion:"请补充准备、执行、检查、复核、调整、验收或归档等过程链条。"}),l<(c?.minInspectionActionCount??6)&&b.push({level:"warning",message:`检查验收表达不足:仅识别 ${l} 类检查/验收动作`,suggestion:"请补充检查方式、复核节点、验证标准、结果记录和闭环处理。"}),m>Math.max(c?.maxGenericPhraseCountPer1800Chars??10,Math.floor(e.length/1800)*(c?.maxGenericPhraseCountPer1800Chars??10))&&b.push({level:"error",message:`空泛表达过多:识别 ${m} 处泛化表述`,suggestion:"请减少空话套话,并用具体对象、参数、流程、检查动作和结果依据替代。"}),b}({template:U,chapters:cU,assignments:aL,finalMarkdown:cV})),cb.push(...M({assignments:aL,markdown:cV})),cb.push(...(0,av.gN)(cV)),cb.push(...(0,av.f8)(cV)),cb.push(...(0,av.k0)(cV)),cb.push(...(0,av.qK)(cV,cU)),cb.push(...(0,av.iC)(cV)),cb.push(...(0,av.BV)(cV)),cb.push(...ak(cV)),cb.push(...(0,av.Ty)(cU)),cb.push(...(0,av.N1)(cV,b8)),cb.push(...(0,av.bM)(cV)),cb.push(...(0,av.M$)(cV,ae)),cb.push(...(0,av.AC)(cV,cU)),N={template:U,chapters:cU,markdown:cV},(0,k.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))})(N.template,a)).map(a=>{let b=0,c=0,d=[];for(let e of a.rules){let a=Math.max(0,e.weight||0);c+=a,function(a,b,c){let d=c||b.map(a=>`${a.title}
|
|
122
|
-
${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}}(e,N.chapters,N.markdown).passed?b+=a:d.push({level:e.level||"warning",message:`质量基准未达标:${e.name}`,suggestion:e.suggestion||"请补充专业细节、表格或对应章节内容。"})}let e=c>0?Math.round(b/c*100):100,f=e<a.blockBelowScore||d.some(a=>"error"===a.level);return{benchmarkId:a.id,benchmarkName:a.name,score:e,pass:e>=a.passScore,blocked:f,issues:f?[{level:"error",message:`文档质量基准评分未达标:${a.name} ${e}分`,suggestion:"请重新生成或补充模板、资料、章节内容后再导出。"},...d]:d}})))cb.push(...a.issues);cb.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||[])d.length>=4&&!E(c,d)&&b.push({level:"warning",message:`正文可能未覆盖资料中的专业/范围:${d}`,suggestion:"建议检查范围、方法、流程或资源配置章节。"});return b}({markdown:cV,chapters:cU,summary:al,roles:ao})),cb.push(...(0,av.mR)(cV,U));let cY=(0,au.ty)(bC,cU.map(a=>a.content).join("\n\n")),cZ=(0,au.PE)(U.generationSettings||U.exportSettings,cV).filter(a=>!(bC.minPages&&/低于目标页数/u.test(a.message)));cb.push(...cZ),cb.push(...cY),cb.push(...aq(cV,U));let c$=(0,av.Ai)(cb,b8,cU),c_=c$.blockingIssues.length,c0=(0,av.Ff)(cb);bO.quality.blockingCount+=c0.blocking,bO.quality.importantCount+=c0.important,bO.quality.minorCount+=c0.minor;let c1=cP.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:c_>0?"failed":"success",message:`阻断 ${c_},问题 ${cb.length}`}:"export_ready"===a.type?{...a,status:c$.passed?"success":"failed",message:c$.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出门禁未通过,请完成阻断问题修复后再导出"}:a);bO.llm.currentLimit=aN();let c2=[...bO.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>`${a.name} ${Math.round(a.durationMs/1e3)}秒`).join(",");c1.push(aY({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${bO.llm.calls} 次,失败 ${bO.llm.failures} 次,排队 ${bO.llm.throttledWaits} 次/${Math.round(bO.llm.throttledWaitMs/1e3)} 秒,检索 ${bO.evidence.searchQueries} 次/${Math.round(bO.evidence.searchMs/1e3)} 秒,证据上下文 ${bO.evidence.contextChars} 字,噪声过滤 ${bO.evidence.filteredNoise} 条,质量问题 阻断${bO.quality.blockingCount}/重要${bO.quality.importantCount}/轻微${bO.quality.minorCount},自动限流调整 ${bO.llm.limitAdjustments} 次${c2?`,Top耗时:${c2}`:""}`},{subtitle:"后台诊断"}));let c3=cU.map(a=>({...a,evidence:T(a.evidence||[],{maxItems:12,maxChars:9e3,preservePinned:!0})}));return{...{...cn,chapters:c3,validationIssues:cb,exportGate:c$,executionStages:c1,partialChapters:cU.map(a=>({id:a.id,title:a.title,chars:(0,au.V7)(a.content),status:bJ(a,bC.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:c3,reviewMetadata:{chapterSummaries:cq,globalIssues:cs.issues,diagnostics:bO}},markdown:cV}}async function bS(a){let b=(0,d.QJ)(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let f=e.resolve(a.projectRoot||(0,g.aY)());if(!f)throw Error("No knowledge base project found");let h=(0,g.Qh)(),i=bg(f,(0,d.Vh)(b)),j=bQ(await h.getProject(f),[...i],a.maxEvidencePerChapter),k=[],l=[...i].filter(Boolean).sort(),m=Math.max(2,Math.min(8,Math.floor(Number(process.env.DOCUMENT_MAX_QUERIES_PER_CHAPTER??6))));for(let a of c.queries.slice(0,m)){let b=await h.search(f,a,{scope:"project",filters:{filePaths:l},limit:Math.min(j,12),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});k.push(...b.results.filter(a=>bf(f,a.filePath,i)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let n=T(k.filter(a=>bf(f,a.filePath,i)),{maxItems:Math.max(8,Math.min(28,2*j)),maxChars:18e3,preservePinned:!0}),o=a.currentMarkdown||"",p=new Set(a.existingFacts??[]),q=c.requiredFacts.filter(a=>!p.has(a)&&!n.some(b=>(0,O.Lk)(b,a))),r=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",o?`> 当前文档上下文摘要:${o.replace(/\s+/gu," ")}`:"",n.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",n.length>0?"### 资料依据":"",...n.map(U),"",q.length>0?"### 待确认事项":"",...q.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:r,evidence:n,missingFacts:q}}},23760:(a,b,c)=>{c.d(b,{AC:()=>m,Ai:()=>o,BV:()=>r,Ff:()=>k,M$:()=>G,N1:()=>C,Nz:()=>i,Ty:()=>s,bM:()=>D,f8:()=>v,gN:()=>t,iC:()=>q,k0:()=>w,kQ:()=>F,mR:()=>E,qK:()=>B,yw:()=>A,z0:()=>j});var d=c(8753),e=c(47899),f=c(78217),g=c(91977),h=c(52511);function i(a){return e.hc.test(a.message)}function j(a){let b="string"==typeof a?a:a.message;if("error"===("string"==typeof a?void 0:a.level))return"blocking";for(let a of e.gr)if(a.pattern.test(b))return a.severity;return"minor"}function k(a){let b={blocking:0,important:0,minor:0};for(let c of a)b[j(c)]+=1;return b}function l(a,b){let c=a.replace(/[\][()`*_>#|{},。、“”‘’:;!?,.!?:;-]+/gu," ").replace(e.ug," ").trim();if(c.length<120)return;let d=c.match(/[A-Za-z][A-Za-z-]{2,}|[\p{Script=Han}]{2,}/gu)||[];if(d.length<30)return;let f=1,g=new Map;for(let a=0;a<d.length;a+=1){let c=d[a].toLowerCase();if(g.set(c,(g.get(c)||0)+1),a>0&&c===d[a-1].toLowerCase()?f+=1:f=1,f>=12)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:"请重新生成该小节,禁止保留连续重复的英文单词或无意义片段。"}}let h=[...g.entries()].sort((a,b)=>b[1]-a[1])[0];if(h&&h[1]>=25&&h[1]/d.length>=.42)return{level:"error",message:`${b} 存在重复 token 退化输出`,suggestion:`检测到“${h[0]}”异常高频重复,请重新生成该小节。`}}function m(a,b=[]){let c=[],d=l(a,"全文");for(let a of(d&&c.push(d),b)){let b=l(a.content,`章节“${a.title}”`);for(let d of(b&&c.push(b),a.sections||[])){let b=d.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"));if(!e)continue;let f=l(e[1],`小节“${d}”`);f&&c.push(f)}}return c}function n(a){return!(!i(a)||/章节审查|最终质量审查|规划小节正文过短|正文存在空泛占位表达/u.test(a.message))}function o(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&n(a))},{key:"basic_facts",label:"基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"structured_precision",label:"结构化精确参数已使用",passed:b.preciseFacts.length<e.mu||a.every(a=>!e.Ab.test(a.message))},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))},{key:"no_project_contamination",label:"无项目污染和事实一致性阻断",passed:!a.some(a=>"error"===a.level&&e.Uv.test(a.message)&&n(a))}],f=a.filter(a=>"error"===a.level&&n(a));return{passed:0===f.length&&d.every(a=>a.passed),blockingIssues:f,checklist:d}}function p(a){let b=[];for(let c of a.split(e.AQ))e.w7.test(c)&&e.N3.test(c)&&b.push(c);return b}function q(a){let b=[...a.matchAll(e.DB)],c=[];for(let d=1;d<b.length;d+=1){let f=b[d].index||0,g=b[d+1]?.index??a.length,h=a.slice(f,g);e.Ks.test(h)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现基础信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(0===b.length)return c;let d=b[0].index||0,f=b[1]?.index??a.length,g=a.slice(d,f),h=g.search(e.jM);if(h<=0)return c;let i=g.slice(0,h).replace(e.Dc,""),j=[];for(let a of e.Y8)RegExp(`${a}\\s*[::]`,"u").test(i)&&j.push(a);return j.length>=3&&c.push({level:"warning",message:`基础信息表前重复叙述字段:${j.join("、")}`,suggestion:"基础信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述名称、编号、范围、周期、质量等字段。"}),c}function r(a){let b=[];for(let c of e.ZH)a.includes(c)&&b.push(c);return 0===b.length?[]:[{level:"warning",message:`存在模板化前缀或套话:${b.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入对象、动作、措施、检查和闭环。"}]}function s(a){let b=[];for(let c of a){let a=(c.sections||[]).filter(Boolean),d=a.filter((b,c)=>a.indexOf(b)!==c);d.length>0&&b.push({level:"warning",message:`${c.title} 存在重复小节:${[...new Set(d)].join("、")}`,suggestion:"请保留用户需求、模板或显式大纲中真实需要的小节,删除重复项。"})}return b}function t(a){let b=e.HX.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=0,d=0;for(let a of b[1].split(e.A5))e.ZT.test(a)&&e.EB.test(a)&&(c+=1,e.sr.test(a)&&(d+=1));return c>0&&0===d?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function u(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+章\s*/u,"").replace(/^\d+(?:\.\d+)+[..、]?\s*/u,"").replace(/^\d+[..、]\s*/u,"").replace(/[\s::.。]+$/gu,"").trim()}function v(a){let b=function(a){let b=e.HX.exec(a);return b?b[1].split(e.A5).map(a=>/^\s*\d+\.\d+\s+(.+)$/u.exec(a.trim())).filter(a=>!!a).map(a=>u(a[1]||"")).filter(Boolean):[]}(a),c=[...a.matchAll(/^###\s+(.+)$/gmu)].map(a=>u(a[1]||"")).filter(Boolean);if(0===b.length||0===c.length)return[];let d=new Set(c),f=new Set(b),g=b.filter(a=>!d.has(a)),h=c.filter(a=>!f.has(a)),i=[];return g.length>0&&i.push({level:"warning",message:`目录小节未在正文中找到:${[...new Set(g)].join("、")}`,suggestion:"请以用户 outline 抽取出的章节为准,修正文目录与正文二级小节编号及标题。"}),h.length>0&&i.push({level:"warning",message:`正文小节未进入目录:${[...new Set(h)].join("、")}`,suggestion:"请重新生成目录,确保只收录正文二级小节,不收录三级小节。"}),i}function w(a){let b=[],c=a.split(e.A5).map(a=>a.trim()).filter(a=>a&&!/^#{1,6}\s+/u.test(a)&&!/^\s*\|/u.test(a)&&!/^<div\b/iu.test(a)),d=c.find(a=>u(a).length<=1);d&&b.push({level:"warning",message:`正文存在孤立字或残缺段落:${d}`,suggestion:"请删除残缺行或重新生成所在小节。"});let f=c.find(a=>/[,、;:和与在为对将]$/u.test(a)||/(通过|包括|如下|主要包括)$/u.test(a));f&&b.push({level:"warning",message:`正文存在疑似截断句:${f}`,suggestion:"请补完整该段落,避免以连接词、逗号或冒号结尾。"});let g=c.find(a=>a.length>380);return g&&b.push({level:"warning",message:`正文存在过长段落:${g}`,suggestion:"请拆分为多段或表格,改善导出版式和可读性。"}),b}function x(a){return a.split(e.A5).filter(a=>!/^#{1,6}\s+/u.test(a.trim())).filter(a=>!/^\s*\|/u.test(a)).filter(a=>!/^\s*:?-{3,}:?/u.test(a)).filter(a=>!/^<\/?div\b/iu.test(a.trim())).join("\n").replace(/[|*_`<>-]/gu,"").replace(e.ug,"").length}function y(a){let b=[...a.matchAll(/^(#{3,4})\s+(.+)$/gmu)];return b.map((c,d)=>{let e=c[1].length,f=(c.index||0)+c[0].length,g=b.slice(d+1).find(a=>a[1].length<=e),h=g?.index??a.length,i=(c[2]||"").trim();return{rawTitle:i,title:u(i),level:e,body:a.slice(f,h)}}).filter(a=>a.title&&(3===a.level||4===a.level))}function z(a,b,c,d,f){let g=x(d),h=e.w7.test(d)&&e.N3.test(d),i=d.split("\n").filter(a=>!e.w7.test(a)&&!e.N3.test(a)).join("\n"),j=x(i);if(g<80&&/^####\s+/mu.test(i)||h&&j<20)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"table_only",planned:f,message:`${a} 小节只有标题或表格无正文:${b}`};if(!(g>=80)||!(j>=20)){if(0===g)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"empty",planned:f,message:`${a} 空小节:${b}`};if(g<180)return{chapterTitle:a,sectionTitle:b,level:c,bodyLength:g,reason:"too_short",planned:f,message:`${a} ${f?"规划小节":"正文小节"}正文过短:${b}`}}}function A(a,b){let c=[],d=new Set;for(let e of b){let b=e.content?.trim()?e.content:a;for(let a of e.sections||[]){let f=u(a),g=function(a,b){return y(a).find(a=>(function(a,b){let c=u(a),d=u(b);return!!(c&&d&&c===d)})(a.rawTitle,b))}(b,a),h=`${e.title}|${f}|planned`;if(!g){c.push({chapterTitle:e.title,sectionTitle:a,level:3,bodyLength:0,reason:"missing_planned_section",planned:!0,message:`${e.title} 缺少规划小节:${a}`}),d.add(h);continue}let i=z(e.title,f||a,g.level,g.body,!0);i&&c.push(i),d.add(h)}for(let a of y(b)){let b=`${e.title}|${a.title}|actual`,f=`${e.title}|${a.title}|planned`;if(d.has(b)||d.has(f))continue;let g=z(e.title,a.title,a.level,a.body,!1);g&&("empty"===g.reason||"table_only"===g.reason)&&c.push(g),d.add(b)}}return c}function B(a,b){return A(a,b).map(a=>({level:"error",message:a.message,suggestion:"missing_planned_section"===a.reason?"请补写该二级小节,不能只在目录中出现。":"table_only"===a.reason?"请在表格前后补充来源、适用范围、结论和执行要求。":"请补充与该小节相关的材料事实、适用边界和必要说明。"}))}function C(a,b){let c=[],d=a.replace(e.ug,""),f=function(a){let b=new Set;for(let c of a.preciseFacts)if(e.FM.test(`${c.processingType||""} ${c.roleId} ${c.sourceFile}`))for(let a of`${c.key} ${c.value}`.matchAll(e.No))b.add(a[0]);return[...b]}(b),g=function(a,b){let c=0;for(let d of a)b.includes(d.replace(e.ug,""))&&(c+=1);return c}(f,d);return f.length>=e.mu&&g/f.length<e.tg&&c.push({level:"error",message:`结构化精确参数使用不足:${g}/${f.length}`,suggestion:"请把资料中的规格、参数、数量、时间、资源、金额、比例和标准编号写入对应章节,禁止泛化概括。"}),b.bills.length>0&&!e.pP.test(a)&&c.push({level:"error",message:"正文未体现结构化数据资料",suggestion:"请从表格、列表或明细中提取对象、单位、数量、规格和关键参数补入对应章节。"}),b.drawings.length>0&&!e._U.test(a)&&c.push({level:"error",message:"正文未体现设计/方案/说明类资料",suggestion:"请从设计、方案或说明资料中提取对象、流程、节点、做法、配置、规则和标准要求。"}),c}function D(a){let b=[];for(let c of e.IA)c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见资料/按文件”。"});return b}function E(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,f=[];for(let a of(0,d.V)().autoSpecGates)(function(a,b){for(let c of b)try{if(RegExp(c,"iu").test(a))return!0}catch{if(a.includes(c))return!0}return!1})(c,a.templateMatchers)&&f.push(a);if(0===f.length)return[];let g=[],h=p(a).length,i=0;for(let b of f){for(let c of(i=Math.max(i,b.minTables||0),b.requiredTexts))a.includes(c)||g.push({level:"error",message:`配置要求缺少必要内容:${c}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let c of b.forbiddenTexts)a.includes(c)&&g.push({level:"error",message:`配置要求不得出现:${c}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"})}return e.bu.test(a)&&g.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"}),i&&h<i&&g.push({level:"error",message:`配置要求正式表格不足:${h}/${i}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),g}function F(a,b,c,d,h,i,j){if(!a)return b;let k=[...b],l=function(a){let b=[...a.project,...a.schedule,...a.quality,...a.safety,...a.resources];for(let c of Object.values(a.schemaFacts))b.push(...c);return b}(c),m=function(a,b){let c=new Set;for(let a of b)c.add(a.key),a.fieldName&&c.add(a.fieldName);for(let b of a.tables){for(let a of b.headers)c.add(a);for(let a of b.rows)for(let b of a)c.add(b)}return c}(c,l),n=new Set(d.map(a=>a.title));for(let b of a.factFields){if(!b.required)continue;let a=c.schemaFacts[b.id]||[],e=!1,f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId));for(let a of d){if(e&&f)break;for(let c of a.evidence)!e&&!a.missingFacts.includes(b.name)&&(0,g.I2)(c,b)&&(e=!0),!f&&(0,g.I2)(c,b)&&(f=!0)}0!==a.length||m.has(b.name)||e||k.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||k.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}for(let b of a.chapterRules){let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&k.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let o=p(h),q=function(a){let b=[];for(let c of a.matchAll(e.gW))b.push({alt:c[1]||"",url:c[2]||"",index:c.index??0});return b}(h),r=(0,f.Cv)(h);for(let b of a.gateRules){let a=b.evaluator?b.evaluator:e.cA[b.type]?.(b)??{subject:"document",operator:"contains",value:b.value||b.target},f=a.target||b.target||"",g=a.value||b.value||f,p=d.find(a=>a.title===f),s=function(a){for(let c of e.Lp){let d=c(a);if(d){var b;return{level:a.rule.level,message:(b=a.rule,`${b.name}:${d}`)}}}}({rule:b,evaluator:a,target:f,value:g,min:a.min||Number(b.value)||1,markdown:h,textScope:"chapter"===a.subject&&p?p.content:h,regex:g?function(a){try{return RegExp(a,"iu")}catch{return}}(g):void 0,chapter:p,factNames:m,chapterTitles:n,tableBlocks:o,imageRefs:q,estimatedPages:r,allFacts:l,factsModel:c,fileBindings:i,promptBindings:j});s&&k.push(s)}return k}function G(a,b){let c=function(a){let b="";for(let c of(0,h.dU)(a))c.content&&(b+=`${c.content}
|
|
123
|
-
|
|
124
|
-
`);return b}(b);if(!c.trim())return[];let d=a.replace(e.ug," ");for(let a of c.matchAll(e.QX)){let b=(a[1]||"").replace(e.ug," ").trim();if(b&&d.includes(b))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前绑定材料生成的正文。"}]}return[]}},25840:(a,b,c)=>{c.d(b,{DZ:()=>u,FV:()=>t,Mu:()=>v,NR:()=>w,XB:()=>r,dg:()=>s,dw:()=>x,ov:()=>B,tl:()=>A});var d=c(73024),e=c(48161),f=c(76760),g=c(47899),h=c(8753);function i(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function j(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,g.hH)}function k(a){if(!Array.isArray(a))return[];let b=[];for(let c=0;c<a.length;c+=1){let d=a[c];d.roleId&&b.push({roleId:d.roleId,order:Number.isFinite(d.order)?d.order:c})}return function(a=[]){let b=new Set,c=[];for(let d of a)!d.roleId||b.has(d.roleId)||(b.add(d.roleId),c.push(d));return c}(b)}function l(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:j(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,builtIn:!!a.builtIn,resourceId:"prompt"===d&&(a.resourceId||a.resourceIds?.[0])||void 0,resourceIds:"prompt"===d?function(a=[]){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}(Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds:a.resourceId?[a.resourceId]:[]):[],executionType:"prompt"===d?"string"==typeof(b=a.executionType)&&g.YB.has(b)?b:"reference":void 0,processingType:"file"===d?"string"==typeof(c=a.processingType)&&g.h2.has(c)?c:"reference":void 0}}function m(a){return{id:j(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:k(a.fileRoles),promptRoles:k(a.promptRoles)}}function n(){try{let a=i();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(l),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(l):[],configs:Array.isArray(b.configs)?b.configs.map(m):[]}}catch{return{roles:[],configs:[]}}}function o(a){d.writeFileSync(i(),JSON.stringify({roles:a.roles.map(l),configs:a.configs.map(m)},null,2),"utf-8")}function p(){return(0,h.V)().roles.map(a=>l({...a,builtIn:!0}))}function q(){return(0,h.V)().roleConfigs.map(a=>m({...a,builtIn:!0}))}function r(a){let b=p(),c=n().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 s(a){let b=l(a),c=n();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),o(c),b}function t(a,b){if(p().some(c=>c.id===b&&c.type===a))throw Error("Configured role cannot be deleted");let c=n();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)})),o(c)}function u(){let a=q(),b=n().configs.filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function v(a){return u().find(b=>b.id===a)}function w(a){let b={...m(a),builtIn:!1},c=n();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),o(c),b}function x(a){if(q().some(b=>b.id===a))throw Error("Configured role config cannot be deleted");let b=n();b.configs=b.configs.filter(b=>b.id!==a),o(b)}function y(a,b){let c=j(a);if(!b.has(c))return b.add(c),c;do c=j(`${a}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,7)}`);while(b.has(c));return b.add(c),c}function z(a=[],b){return a.map((a,c)=>({roleId:b.get(a.roleId)||a.roleId,order:Number.isFinite(a.order)?a.order:c}))}function A(a){let b=a?.roleIds?new Set(a.roleIds):null,c=a?.configIds?new Set(a.configIds):null,d=n();return{type:"customize-agent.documentRoles",version:1,exportedAt:new Date().toISOString(),roles:d.roles.filter(a=>!b||b.has(a.id)).map(l),configs:d.configs.filter(a=>!c||c.has(a.id)).map(m)}}function B(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=n(),f=new Set([...p().map(a=>a.id),...e.roles.map(a=>a.id)]),g=new Set([...q().map(a=>a.id),...e.configs.map(a=>a.id)]),h=new Map,i=[];for(let a of c){let b=l(a),c=y(b.id,f);h.set(b.id,c),i.push({...b,id:c,builtIn:!1})}let j=new Set([...p().map(a=>a.id),...e.roles.map(a=>a.id),...i.map(a=>a.id)]),k=d.map(a=>{let b=m(a),c=y(b.id,g);return m({...b,id:c,builtIn:!1,fileRoles:z(b.fileRoles,h).filter(a=>j.has(a.roleId)),promptRoles:z(b.promptRoles,h).filter(a=>j.has(a.roleId))})});return e.roles.push(...i),e.configs.push(...k),o(e),{importedRoles:i.length,importedConfigs:k.length}}},29281:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},44533:(a,b,c)=>{c.d(b,{Qh:()=>l,VS:()=>p,Yy:()=>o,aY:()=>n});var d=c(19898),e=c(87550),f=c.n(e),g=c(33873),h=c(21820),i=c(29021);let j=null;function k(){return g.join(h.homedir(),".customize-agent")}function l(){return j||(j=new d.MultiProjectManager(k())),j}function m(a){let b=g.resolve(a),c=g.resolve(g.join(h.homedir(),".customize-agent"));return!(i.existsSync(g.join(b,"pnpm-workspace.yaml"))&&i.existsSync(g.join(b,"apps","server")))&&(b===c||b.includes(`${g.sep}.customize-agent${g.sep}`)||b.endsWith(`${g.sep}apps${g.sep}server`)||b.endsWith(`${g.sep}apps${g.sep}cli`))}function n(){let a=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(a&&i.existsSync(a)&&!m(a))return g.resolve(a);let b=function(){let a=g.join(k(),"projects","registry.db");if(!i.existsSync(a))return[];let b=new(f())(a,{readonly:!0});try{return b.prepare("SELECT project_root FROM project_registry ORDER BY last_opened_at DESC").all().map(a=>g.resolve(a.project_root)).filter(a=>!m(a))}finally{b.close()}}();return b.length>0?b[0]:process.env.INIT_CWD&&!m(process.env.INIT_CWD)?process.env.INIT_CWD:g.resolve(process.cwd(),"../..")}function o(a,b={}){let c=new Map;for(let b of function(a){let b=g.join(h.homedir(),".customize-agent","projects",(0,d.computeProjectId)(g.resolve(a)),"kb.db");if(!i.existsSync(b))return[];let c=new d.IndexStateStore(b);try{return c.listRecords().map(a=>({...a,matchedBy:"metadata"}))}finally{c.close()}}(a))c.set(b.relativePath,b);for(let b of function(a){let b=g.join(a,"knowledgeBase");if(!i.existsSync(b))return[];let c=[],d=a=>{for(let e of i.readdirSync(a,{withFileTypes:!0})){let f=g.join(a,e.name);if(e.isDirectory()){d(f);continue}if(e.name.endsWith(".source.txt"))continue;let h=i.statSync(f),j=g.relative(b,f).split(g.sep).join("/");c.push({relativePath:j,category:j.includes("表格数据/")?"spreadsheet":j.includes("图片素材/")?"image":j.includes("图纸文件/")?"cad":j.includes("文档资料/")?"document":"other",format:g.extname(j).slice(1).toLowerCase()||"text",contentHash:"",fileSize:h.size,mtime:h.mtimeMs,chunkCount:0,collectionName:"",indexedAt:0,lastVerifiedAt:0,status:"disk",matchedBy:"disk"})}};return d(b),c}(a)){let a=c.get(b.relativePath);c.set(b.relativePath,a?{...a,fileSize:b.fileSize,mtime:b.mtime,matchedBy:"metadata"}:b)}return Array.from(c.values()).filter(a=>!b.category||a.category===b.category).sort((a,b)=>b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN"))}async function p(a,b={}){let c=(b.query||"").trim(),d=Math.max(1,Math.min(500,b.limit??50)),e=new Map,f=o(a,{category:b.category});for(let a of f)(!c||`${a.relativePath}
|
|
125
|
-
${a.category}
|
|
126
|
-
${a.format}
|
|
127
|
-
${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},52511:(a,b,c)=>{c.d(b,{Bh:()=>r,C1:()=>x,DX:()=>y,N6:()=>z,QJ:()=>q,Vh:()=>D,bV:()=>u,dU:()=>o,h0:()=>t,jG:()=>p,wR:()=>B,xm:()=>s,zY:()=>C});var d=c(73024),e=c(76760),f=c(48161),g=c(44533),h=c(25840),i=c(8753);function j(){let a=e.join(f.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function k(){return e.join(j(),"document-templates.json")}function l(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"文档",projectRoleConfigId:a.projectRoleConfigId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],sections:Array.isArray(a.sections)?a.sections.filter(Boolean):[],tableSections:Array.isArray(a.tableSections)?a.tableSections.filter(Boolean):[],tableRequirements:Array.isArray(a.tableRequirements)?a.tableRequirements.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"文档",purpose:a.description||"",queries:[],requiredFacts:[]}],exportSettings:a.exportSettings,generationSettings:a.generationSettings,promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"reference"})):[],builtIn:!1}}function m(){try{let a=k();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(l)}catch{return[]}}function n(a){d.writeFileSync(k(),JSON.stringify(a.map(l),null,2),"utf-8")}function o(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(j(),"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 p(){let a=(0,i.V)().templates,b=m().filter(b=>!a.some(a=>a.id===b.id));return[...a,...b]}function q(a){return p().find(b=>b.id===a)}function r(a){let b=l(a),c=m().filter(a=>a.id!==b.id);return c.push(b),n(c),b}async function s(a,b=(0,g.aY)()){let c=q(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],config:void 0};let f=(0,h.XB)("prompt"),i=(0,h.XB)("file"),j=z(c),k=A(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=C(c),m=D(c);0===l.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"});let n=e.resolve(b),p=(0,g.Yy)(n);0===m.length&&d.push({level:"error",message:"模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。"});let r=new Map(p.map(a=>[a.relativePath,a])),t=m.map(a=>{let b=i.find(b=>b.id===a.roleId),c=r.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),u=o(l);return{templateId:a,projectRoleConfigId:j,fileDiagnostics:t,promptDiagnostics:l.map(a=>{let b=f.find(b=>b.id===a.roleId),c=u.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}}),issues:d}}function t(a){if(new Set((0,i.V)().templates.map(a=>a.id)).has(a))throw Error("Configured template cannot be deleted");n(m().filter(b=>b.id!==a))}function u(a){let b=q(a);if(!b)throw Error("Document template not found");let c=l({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=m();return d.push(c),n(d),c}function v(a,b){try{return RegExp(b,"iu").test(a)}catch{return a.includes(b)}}function w(a){let b=`${a.name} ${a.category} ${a.outputTitle} ${a.description}`;return(0,i.V)().chapterTitleFilters.filter(a=>a.templateMatchers.some(a=>v(b,a)))}function x(a,b){return w(b).some(b=>!!b.minLength&&a.length<b.minLength||!!b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>v(a,b)))}function y(a,b){return w(b).some(b=>!!(b.minLength&&a.length<b.minLength||b.maxLength&&a.length>b.maxLength||b.forbiddenPatterns.some(b=>v(a,b)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>v(a,b)))}function z(a){return a.projectRoleConfigId||void 0}function A(a){let b=z(a);return b?(0,h.Mu)(b):void 0}function B(a){let b=new Map;for(let d of a){var c;b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...(c=d.roleId,/requirement|response|rule|需求|规则|评审|实质/u.test(c)?["requirement_document","technical_specification","schedule_quality_safety"]:/table|sheet|data|scope|quantity|表格|列表|明细|数量|数据|范围/u.test(c)?["structured_data","scope_description","budget_cost"]:/drawing|drawings|image|map|design|设计|图像|地图/u.test(c)?["design_specification"]:/schedule|quality|safety|progress|周期|进度|质量|安全/u.test(c)?["schedule_quality_safety","technical_specification"]:/risk|constraints|重点|难点|约束/u.test(c)?["risk_constraints","addendum","requirement_document"]:/material|equipment|brand|resource|材料|设备|品牌|资源/u.test(c)?["resource_recommendation","structured_data","technical_specification"]:/enterprise|reference|经验|体系/u.test(c)?["project_overview","technical_specification"]:["project_overview"])])])}return[...b.entries()].map(([a,b])=>({filePath:a,roles:b}))}function C(a){let b=A(a);if(b){let a=(0,h.XB)("prompt");return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(b=>a.find(a=>a.id===b.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({promptId:b,roleId:a.id})))}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function D(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"reference"}))}},58965:(a,b,c)=>{c.d(b,{$m:()=>f,VX:()=>d,tK:()=>e});let d=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,e=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,f="[零〇一二三四五六七八九十百千万两]+"},70208:(a,b,c)=>{c.d(b,{GQ:()=>m,Ui:()=>k,YZ:()=>n,_9:()=>s,bE:()=>o,bl:()=>j,cs:()=>l,eI:()=>i,tb:()=>p});var d=c(58965),e=c(52511);function f(a){return 0===a.trim().length}let g="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",h=RegExp(`<\\s*${g}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${g}\\s*>`,"giu");function i(a){return h.lastIndex=0,h.test(a)}function j(a){return RegExp(`^\\s*<\\s*${g}(?:\\s[^>]*)?>`,"iu").test(a)}function k(a){return RegExp(`^\\s*<\\/\\s*${g}\\s*>`,"iu").test(a)}function l(a){for(let b of a){let a=function(a,b,c){let e=[];for(let g of function(a,b){h.lastIndex=0;let c=[...a.matchAll(h)].map(a=>a[1]||"");if(c.length>0||b?.strict)return c;let d=/(?:<\s*)?(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>?\s*[::]?\s*([\s\S]*?)(?:<\/\s*(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)\s*>|END\s+(?:OUTLINE|CHAPTERS?)|$)/iu.exec(a);return d?.[1]?[d[1]]:[]}(a,c))for(let a of function(a){let b=`${d.$m}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],e=a.replace(/\r?\n/gu,"\n");for(let a of c)e=(e=(e=e.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return e.split(/\n|;|;/u).map(a=>(function(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${d.$m})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${d.$m})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!f(a))}(g))e.push({id:`explicit-${b}-${e.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a};如需二级小节,应由大模型结合提示词、需求和资料上下文动态规划。`,requiredFacts:[],sections:[],queries:[a]});return e.filter(a=>!f(a.title))}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}function m(a){let b=a.replace(/^#+\s*/u,"").trim(),c="";for(;b&&b!==c;)c=b,b=b.replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]+/u,"").replace(/^[((]?[一二三四五六七八九十]+[))、..\s]+/u,"").trim();return b}function n(a){return m(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function o(a){let b=a.trim(),c=n(b);return!(!c||c.length<2||c.length>50||/^#{3,6}\s*/u.test(b)||/^\|.*\|/u.test(b)||/\|/u.test(c)||/^[,,、;;::。.!!??\-—]/u.test(b)||/[{}<>]|Markdown|JSON|变量|占位符/u.test(c)||/[。;;]$/u.test(c)||/[::]\s*[。;;]?$/u.test(c)||/^(目录|章节|大纲|要求|说明|注意|输出|格式|示例|例如|写法|占位)$/u.test(c)||/(评标委员会|完全满足评审要求|全面梳理与响应|坚实的技术保障)/u.test(c))&&!q(c)}function p(a,b){let c=m(b);return`第${function(a){let b=["零","一","二","三","四","五","六","七","八","九"];if(a<=10)return 10===a?"十":b[a];if(a<20)return`十${b[a%10]}`;if(a<100){let c=Math.floor(a/10),d=a%10;return`${b[c]}十${d?b[d]:""}`}return String(a)}(a+1)}章 ${c}`}function q(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function r(a,b){let c=new Set;return a.filter(a=>{let d=n(a.title);return!(!d||!b?.preserveExplicitOutline&&(c.has(d)||q(d)||b?.template&&(0,e.C1)(d,b.template)))&&(c.add(d),a.title=d,!0)})}function s(a,b,c){return!b||c?.preserveExplicitOutline?r([...a.chapters],{...c,template:a}):r([...a.chapters].map(a=>{let c=m(a.title),d=b.chapterRules.find(b=>b.id===a.id||m(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}},78217:(a,b,c)=>{function d(a,b){return Math.ceil(e(a)/f(b))}function e(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function f(a){let b=Number(String(a&&"typography"in a&&a.typography?.bodySize||"").replace(/[^\d.]/gu,""))||14,c=Number(String(a&&"typography"in a&&a.typography?.lineHeight||"").replace(/[^\d.]/gu,""))||22;return b>=14&&c>=22?900:1050}function g(a){let b=a.trim();if(/^\d+(?:\.\d+)?$/u.test(b))return Number(b);let c={零:0,一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9};if("十"===b)return 10;let d=/^([一二两三四五六七八九])?十([一二三四五六七八九])?$/u.exec(b);if(d)return(d[1]?c[d[1]]:1)*10+(d[2]?c[d[2]]:0)}function h(a="",b=""){let c=`${a}${b}`;return/不少于|至少|不低于|以上|起码/u.test(c)?"minimum":/约|大概|左右|大约|约为|附近/u.test(c)?"approximate":"exact"}function i(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function j(a){let b=a.template.generationSettings||a.template.exportSettings,c=f(a.template.exportSettings||a.template.generationSettings),d=function(a){let b=a.replace(/\s+/gu," "),c=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(?:页|頁)\s*(以上|左右|以内|以下)?/gu)],d=[...b.matchAll(/(不少于|至少|不低于|约为|约|大概|大约|左右|生成|输出|达到|共)?\s*(\d+(?:\.\d+)?|[一二两三四五六七八九十]{1,3})\s*(万)?\s*(?:字|字符)\s*(以上|左右|以内|以下)?/gu)],e=c.map(a=>{let b=g(a[2]||"");return Number.isFinite(b)?{value:b,mode:h(a[1],a[3])}:void 0}).filter(a=>!!a).at(-1),f=d.map(a=>{let b=g(a[2]||"");return b?{value:Math.round(b*(a[3]?1e4:1)),mode:h(a[1],a[4])}:void 0}).filter(a=>!!a).at(-1);return{targetPages:e?.value,pageMode:e?.mode,targetChars:f?.value,charMode:f?.mode}}([a.requirement||"",a.promptTexts].join("\n")),e=!!(d.targetChars||d.targetPages),j=e?void 0:b?.targetPages?.target||b?.targetPages?.min,k=d.targetPages?d.targetPages*c:void 0,l=d.targetPages||j,m=e?"explicit":j?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",n=e?Math.max(d.targetChars||0,k||0)||void 0:Math.max((j?j*c:void 0)||0)||void 0,o=d.pageMode||"exact",p=d.charMode||o,q=e&&"approximate"===p,r=e&&"minimum"===p,s=e?l?Math.floor(l*(r?1:.9)):void 0:b?.targetPages?.min||(l?Math.floor(.95*l):void 0),t=e&&l&&!r?Math.ceil(l*(q?1.15:1.08)):b?.targetPages?.max,u=n?Math.floor(n*(r?1:.9)):s?s*c:void 0,v=n&&!r?Math.ceil(n*(q?1.15:1.08)):t?t*c:void 0,w=a.chapters.length>0?a.chapters:a.template.chapters,x=w.reduce((a,b)=>a+i(b),0)||1,y=new Map,z=w.map(a=>({chapter:a,target:n?Math.round(n*i(a)/x):0})),A=w.reduce((b,c)=>b+Math.max(a.spec?.chapterRules.find(a=>a.id===c.id||a.title===c.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0,n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200),0),B=n&&A>.92*n?Math.max(.45,.92*n/A):1;for(let{chapter:b,target:c}of z){let d=Math.floor(Math.max(Math.max(a.spec?.chapterRules.find(a=>a.id===b.id||a.title===b.title)?.minWords||0,a.spec?.dynamicChapterRule.minWordsPerChapter||0),n?Math.min(900,Math.max(450,Math.floor(n/Math.max(1,w.length)*.35))):1200)*B);y.set(b.id,Math.max(d,c))}return{targetPages:l,minPages:s,maxPages:t,targetChars:n,minChars:u,maxChars:v,charsPerPage:c,chapterTargets:y,source:m}}function k(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let e=d(b,a),f=c.min||c.target,g=c.max||c.target,h=[];return f&&e<f&&h.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${e} 页,目标不少于 ${f} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),g&&e>g+4&&h.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${e} 页,目标不超过 ${g} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),h}function l(a,b){let{currentChars:c,estimatedPages:d}=m(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,suggestion:"请继续扩写缺口章节,或降低目标字数/页数后重新生成。"}),a.maxChars&&c>Math.ceil(1.12*a.maxChars)?e.push({level:"error",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"请压缩重复段落、过细小节或过度展开内容后再导出。"}):a.maxChars&&c>a.maxChars&&e.push({level:"warning",message:`正文篇幅超过目标字数区间:当前 ${c} 字,建议不超过 ${a.maxChars} 字`,suggestion:"建议减少重复段落、过细小节或过度展开内容。"}),a.minPages&&d<a.minPages&&e.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${a.minPages} 页`,suggestion:"请继续扩写正文,或调整导出字号/行距后再导出。"}),a.maxPages&&d>a.maxPages&&e.push({level:"warning",message:`正文篇幅超过目标页数区间:预计约 ${d} 页,建议不超过 ${a.maxPages} 页`,suggestion:"建议压缩过度展开内容或调整目标页数。"}),e}function m(a,b){let c=e(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}c.d(b,{Cv:()=>d,PE:()=>k,V7:()=>e,fW:()=>m,tF:()=>j,ty:()=>l})},91977:(a,b,c)=>{c.d(b,{I2:()=>g,Lk:()=>e,Uy:()=>f});var d=c(70208);function e(a,b){let c=`${a.filePath}
|
|
128
|
-
${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function f(a,b){let c=(0,d._9)(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),e=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],f=new Map;for(let a of[...c,...e])f.set(a.id,{...f.get(a.id)||a,...a,required:a.required||f.get(a.id)?.required||!1});return[...f.values()]}function g(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&e(a,b.name)}}};
|