@customize-agent/server 4.0.73 → 4.0.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +2 -2
- package/.next/package.json +1 -0
- package/.next/prerender-manifest.json +3 -3
- package/.next/server/chunks/1936.js +3 -3
- package/.next/server/chunks/5247.js +42 -42
- package/.next/server/chunks/9301.js +3 -3
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_error.js +1 -1
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/health.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 +23 -23
- package/.next/static/JH2Wo8GNcowN9z3MQDmEZ/_buildManifest.js +1 -0
- package/.next/static/JH2Wo8GNcowN9z3MQDmEZ/_ssgManifest.js +1 -0
- package/.next/static/oey4I5vSnEH7q7J-hOdgz/_buildManifest.js +1 -0
- package/.next/static/oey4I5vSnEH7q7J-hOdgz/_ssgManifest.js +1 -0
- package/package.json +13 -13
- /package/.next/static/{fi3WmBxX1wUpcv3jgZ9mu → ICg95RJqIvTR1l_z2ikBh}/_buildManifest.js +0 -0
- /package/.next/static/{fi3WmBxX1wUpcv3jgZ9mu → ICg95RJqIvTR1l_z2ikBh}/_ssgManifest.js +0 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
WHERE ${h.clauses}
|
|
9
9
|
ORDER BY access_count DESC, updated_at DESC
|
|
10
10
|
LIMIT ?
|
|
11
|
-
`).all(...h.params,b);return n(j)}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}}},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}},35247:(a,b,c)=>{c.d(b,{h0x:()=>t,bVF:()=>u,OXS:()=>cl,jGg:()=>p,R1O:()=>cm,Bhi:()=>r,xmB:()=>s});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:"project_fact"})):[],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=y(c),k=z(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=A(c),m=B(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)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>v(a,b)))}function y(a){return a.projectRoleConfigId?a.projectRoleConfigId:!function(a){let b=(0,i.V)().reviewChapterTemplateMatchers;if(0===b.length)return!1;let c=`${a.name} ${a.category} ${a.outputTitle}`;return b.some(a=>RegExp(a,"iu").test(c))}(a)?void 0:"construction-bid-sgzsj-professional"}function z(a){let b=y(a);return b?(0,h.Mu)(b):void 0}function A(a){let b=z(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 B(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}var C=c(19898),D=c(2894),E=c(77598);let F=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],G=[{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:["背景依据","分析结论","风险建议"]}],H=[{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:["风险控制要求","风险建议"]}],I=[{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 J(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 K(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function L(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function M(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function N(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,i.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 O=["project_overview","requirement_document","addendum","structured_data","design_specification","schedule_quality_safety","scope_description"],P=["project_overview","requirement_document","addendum","structured_data","budget_cost","design_specification","resource_recommendation","schedule_quality_safety","scope_description","technical_specification","risk_constraints"];function Q(a){let b=[];for(let c of a)for(let a of c.relativePath.split(/[\\/]/gu))a&&b.push(a);return b}function R(a){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function S(a){return a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()}function T(a){let b=new Set,c=[];for(let d of Q(a)){let a=S(d);if(!(!/项目|任务|文档|合同|计划|方案/iu.test(a)||a.length<6||b.has(a))&&(b.add(a),c.push(a),c.length>=12))break}return c}function U(a,b){if(0===a.length)return b;let c=[];for(let b of a)if(c.push(S(b.fileName)),c.length>=8)break;return c.join("、")}function V(a,b,c,d=8){b.lastIndex=0;let e=new Set,f=[];for(let g of a.matchAll(b)){let a=(g[c]||"").trim();if(!(!a||e.has(a))&&(e.add(a),f.push(a),f.length>=d))break}return b.lastIndex=0,f}function W(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function X(a){let b=W(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function Y(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}var Z=c(47899);function $(a){return a.replace(Z.H4," ").trim()}function _(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 aa(a,b){b.lastIndex=0;let c=[];for(let d of a.matchAll(b))c.push(d[0]);return b.lastIndex=0,_(c)}function ab(a,b){let c=[];for(let d of b)a.includes(d)&&c.push(d);return c}function ac(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 ad(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 ae(a){let b=[],c=a.markdown.replace(Z.H4,"");for(let d of a.assignments){let a=ad(d.facts);if(a.length<3)continue;let e=[],f=[];for(let b of a){let a=ac(b);for(let c of(a.length>=Z.u1&&e.push(a),[...b.quantities||[],...b.scheduleValues||[],...b.frequencyValues||[],...b.resourceValues||[],...b.costValues||[]]))f.push(c.replace(Z.H4,""))}let g=_(e).slice(0,Z.SZ),h=_(f).slice(0,Z.ZM),i=g.filter(a=>c.includes(a.replace(Z.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.slice(0,Z.px)}let af=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ag=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,ah="[零〇一二三四五六七八九十百千万两]+";function ai(a){return 0===a.trim().length}let aj="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",ak=RegExp(`<\\s*${aj}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${aj}\\s*>`,"giu");function al(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]*/u,"").trim()}function am(a){return al(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function an(a){let b=a.trim(),c=am(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))&&!ap(c)}function ao(a,b){let c=al(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 ap(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function aq(a,b){let c=new Set;return a.filter(a=>{let d=am(a.title);if(!d)return!1;if(!b?.preserveExplicitOutline&&(c.has(d)||ap(d)||b?.template&&w(b.template).some(a=>!!a.minLength&&d.length<a.minLength||!!a.maxLength&&d.length>a.maxLength||a.forbiddenPatterns.some(a=>v(d,a)))))return!1;return c.add(d),a.title=d,!0})}function ar(a,b,c){return!b||c?.preserveExplicitOutline?aq([...a.chapters],{...c,template:a}):aq([...a.chapters].map(a=>{let c=al(a.title),d=b.chapterRules.find(b=>b.id===a.id||al(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}function as(a,b){let c=`${a.filePath}
|
|
11
|
+
`).all(...h.params,b);return n(j)}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}}},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}},35247:(a,b,c)=>{c.d(b,{h0x:()=>t,bVF:()=>u,OXS:()=>cm,jGg:()=>p,R1O:()=>cn,Bhi:()=>r,xmB:()=>s});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:"project_fact"})):[],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=y(c),k=z(c);j||d.push({level:"error",message:"模板未绑定项目角色配置,且未匹配到自动专业角色配置"}),j&&!k&&d.push({level:"error",message:`项目角色配置不存在或已删除:${j}`});let l=A(c),m=B(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)))||b.requiredPatterns.length>0&&!b.requiredPatterns.some(b=>v(a,b)))}function y(a){return a.projectRoleConfigId?a.projectRoleConfigId:!function(a){let b=(0,i.V)().reviewChapterTemplateMatchers;if(0===b.length)return!1;let c=`${a.name} ${a.category} ${a.outputTitle}`;return b.some(a=>RegExp(a,"iu").test(c))}(a)?void 0:"construction-bid-sgzsj-professional"}function z(a){let b=y(a);return b?(0,h.Mu)(b):void 0}function A(a){let b=z(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 B(a){return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}var C=c(19898),D=c(2894),E=c(77598);let F=[{id:"report",label:"报告",patterns:[/报告|调研|分析|评估|研究|复盘|总结/iu],output:["报告"]},{id:"plan",label:"实施方案",patterns:[/方案|规划|计划|预案|路径|路线图/iu],output:["实施方案"]},{id:"standard",label:"规范说明",patterns:[/规范|标准|制度|规则|指南|手册/iu],output:["规范说明"]},{id:"proposal",label:"建议方案",patterns:[/建议|提案|需求|响应|说明书/iu],output:["建议方案"]}],G=[{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:["背景依据","分析结论","风险建议"]}],H=[{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:["风险控制要求","风险建议"]}],I=[{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 J(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 K(a){return a.replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,60)||`fact-${Date.now()}`}function L(a){let b=RegExp("[“”\"'‘’「」『』《》](.{2,80}?)[“”\"'‘’「」『』《》]","gu");return[...a.matchAll(b)].map(a=>a[1].trim()).filter(Boolean)}function M(a){return a.split(/[\n;;。]/u).map(a=>a.trim()).filter(a=>a.length>=2)}function N(a,b=""){let c=function(a,b=""){return`${b} ${a.name} ${a.category} ${a.outputTitle} ${a.description}`}(a,b);return(0,i.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 O=["project_overview","requirement_document","addendum","structured_data","design_specification","schedule_quality_safety","scope_description"],P=["project_overview","requirement_document","addendum","structured_data","budget_cost","design_specification","resource_recommendation","schedule_quality_safety","scope_description","technical_specification","risk_constraints"];function Q(a){let b=[];for(let c of a)for(let a of c.relativePath.split(/[\\/]/gu))a&&b.push(a);return b}function R(a){let b=new Set,c=[];for(let d of a)!d||b.has(d)||(b.add(d),c.push(d));return c}function S(a){return a.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"").trim()}function T(a){let b=new Set,c=[];for(let d of Q(a)){let a=S(d);if(!(!/项目|任务|文档|合同|计划|方案/iu.test(a)||a.length<6||b.has(a))&&(b.add(a),c.push(a),c.length>=12))break}return c}function U(a,b){if(0===a.length)return b;let c=[];for(let b of a)if(c.push(S(b.fileName)),c.length>=8)break;return c.join("、")}function V(a,b,c,d=8){b.lastIndex=0;let e=new Set,f=[];for(let g of a.matchAll(b)){let a=(g[c]||"").trim();if(!(!a||e.has(a))&&(e.add(a),f.push(a),f.length>=d))break}return b.lastIndex=0,f}function W(a){return a.replace(/\\/gu,"/").replace(/^\/+|\/+$/gu,"")}function X(a){let b=W(a).split("/").filter(Boolean);return b.length>1?b[0]:void 0}function Y(a,b){return a.replace(/\s+/gu,"").includes(b.replace(/\s+/gu,""))}var Z=c(47899);function $(a){return a.replace(Z.H4," ").trim()}function _(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 aa(a,b){b.lastIndex=0;let c=[];for(let d of a.matchAll(b))c.push(d[0]);return b.lastIndex=0,_(c)}function ab(a,b){let c=[];for(let d of b)a.includes(d)&&c.push(d);return c}function ac(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 ad(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 ae(a){let b=[],c=a.markdown.replace(Z.H4,"");for(let d of a.assignments){let a=ad(d.facts);if(a.length<3)continue;let e=[],f=[];for(let b of a){let a=ac(b);for(let c of(a.length>=Z.u1&&e.push(a),[...b.quantities||[],...b.scheduleValues||[],...b.frequencyValues||[],...b.resourceValues||[],...b.costValues||[]]))f.push(c.replace(Z.H4,""))}let g=_(e).slice(0,Z.SZ),h=_(f).slice(0,Z.ZM),i=g.filter(a=>c.includes(a.replace(Z.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.slice(0,Z.px)}let af=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,ag=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu,ah="[零〇一二三四五六七八九十百千万两]+";function ai(a){return 0===a.trim().length}let aj="(?:OUTLINE|CHAPTERS?|章节(?:大纲)?|大纲|目录)",ak=RegExp(`<\\s*${aj}(?:\\s[^>]*)?>([\\s\\S]*?)<\\/\\s*${aj}\\s*>`,"giu");function al(a){return a.replace(/^#+\s*/u,"").replace(/^第[一二三四五六七八九十百千万\d]+[章节]\s*/u,"").replace(/^\d+(?:\.\d+)*[、..\s]*/u,"").trim()}function am(a){return al(a.replace(/\s+/gu," ").trim()).replace(/^[,,、;;::。.!!??\-—\s]+/u,"").trim()}function an(a){let b=a.trim(),c=am(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))&&!ap(c)}function ao(a,b){let c=al(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 ap(a){return/见(?:公告|文件|资料|附件)|按(?:资料|文件|相关要求)|质量标准[::]|范围[::].*依据/u.test(a)}function aq(a,b){let c=new Set;return a.filter(a=>{let d=am(a.title);if(!d)return!1;if(!b?.preserveExplicitOutline&&(c.has(d)||ap(d)||b?.template&&w(b.template).some(a=>!!a.minLength&&d.length<a.minLength||!!a.maxLength&&d.length>a.maxLength||a.forbiddenPatterns.some(a=>v(d,a)))))return!1;return c.add(d),a.title=d,!0})}function ar(a,b,c){return!b||c?.preserveExplicitOutline?aq([...a.chapters],{...c,template:a}):aq([...a.chapters].map(a=>{let c=al(a.title),d=b.chapterRules.find(b=>b.id===a.id||al(b.title)===c);return{...a,title:c,purpose:a.purpose,requiredFacts:a.requiredFacts||[],queries:[...new Set([...a.queries||[],c,d?.generationHint||"",...a.sections||[]].filter(Boolean))]}}),{...c,template:a})}function as(a,b){let c=`${a.filePath}
|
|
12
12
|
${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function at(a,b){let c=ar(a,b).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),d=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],e=new Map;for(let a of[...c,...d])e.set(a.id,{...e.get(a.id)||a,...a,required:a.required||e.get(a.id)?.required||!1});return[...e.values()]}function au(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&as(a,b.name)}function av(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(ag,"").slice(0,40)})`:""}`}function aw(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(af,"").replace(ag,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function ax(a){let b=aw(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 ay(a,b,c){let d=new Set,f=a.map(a=>{let b=function(a,b){let c=e.extname(a).toLowerCase(),d=aw(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=ax(d);return d.length>20&&f.shouldUse?d.slice(0,4e3):d.length>80&&f.noiseScore<.9?d.slice(0,1600):[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d.slice(0,1200)}(a.filePath,a.content),c=ax(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=(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,E.createHash)("sha1").update(b).digest("hex")}`}(a.item);return!d.has(b)&&(d.add(b),!0)}).slice(0,b);if(c){let b=f.reduce((a,b)=>a+b.quality.noiseScore,0),d=f.reduce((a,b)=>a+b.quality.factDensity,0);c.evidence.raw+=a.length,c.evidence.used+=h.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 h.map(a=>a.item)}function az(a,b=0){return`- ${av(a,b)}:${aw(a.content).replace(/\s+/gu," ").slice(0,260)}`}function aA(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|map|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"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图-/u,"").replace(/-完整地图$/u,"完整地图"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为视觉/地图证据,用于说明空间关系、区域划分、点位、路线或布局。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、明细、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
13
13
|
${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","视觉资料","图片资料"].filter(b=>as(a,b)||c.includes(b)))]}(c,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),d.set(c.filePath,f)}let f=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of f)g[a.kind].push(a);let h=[`内部资料包:文本片段 ${c.length} 条、结构化资料 ${f.length} 个。`,`资料类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格/数据 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、视觉/地图 ${g.map.length}、其他 ${g.attachment.length}。`,"正文必须只写资料中的事实、参数、数量、做法和控制措施,不得出现文件名、来源清单或后台证据描述。"].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:f,byKind:g,summary:h}}function aB(a){let b=a.resources.slice(0,20).map((a,b)=>[`- 资料:${av(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(aw).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map((a,b)=>`${av(a,b)}
|
|
14
14
|
类型:${a.processingType||"reference"}
|
|
@@ -17,18 +17,18 @@ ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范
|
|
|
17
17
|
${b}`:"",c?`文本/附件片段:
|
|
18
18
|
${c}`:""].filter(Boolean).join("\n\n")}function aC(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let aD=/.*(?:知识库证据|文件角色|提示词角色|后台自动规范|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,aE=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,aF=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function aG(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(aD,"").replace(aE,"").replace(aF,"").replace(ag,"").replace(/^#\s+/gmu,"").replace(af,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\|\s*(?:[/—-]|无|暂无|待定|待补充|N\/?A)\s*(?=\|)/giu,"| 结合项目资料及现场深化确认 ").replace(/见(?:公告|文件|资料|附件|相关文件)/gu,"依据已提供资料").replace(/按(?:资料|文件|设计要求|相关规范|有关规范|标准|要求)/gu,"依据已提供资料和适用标准").replace(/满足(?:相关|有关)?要求/gu,"满足资料约束、适用标准和正式交付要求").replace(/\n{3,}/gu,"\n\n").trim()}let aH="你正在生成可直接交付的正式业务文档,不是分析报告、证据报告或系统调试报告。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、项目基础事实候选、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n文档结构优先遵循用户需求、模板章节和绑定提示词;后台内容优化建议只用于提升事实覆盖和表达质量,不得新增、删除或重排章节。\n资料信息应内化为正式正文表达;除非用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n正式正文不得把原始公告、规则条款、说明性附件或系统过程内容误作为章节标题或目录项。\n如绑定资料中存在项目基础事实,应在相关章节自然吸收;如模板或用户要求表格化呈现,表格前只保留必要引导语,不得逐项重复叙述同一批字段。\n正文必须以当前模板、用户要求和绑定资料中的真实对象、范围、数量、时间、规格、标准、责任和约束为依据,不得自由发挥。\n同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项时,必须逐项覆盖适用范围和对应依据,不得只写一个代表性对象后泛化到全部范围。\n不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。\n正文二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;不得用无编号独立加粗行表示三级小节;三级小节不纳入目录。\n资料不足或不同来源数值冲突时,应保持审慎并提示复核口径,不得编造精确数量。\n语言应正式、专业、克制,适合直接导出交付。";function aI(a){return[...new Set([...a.matchAll(/^#{3,4}\s+(.+)$/gmu)].map(a=>al(a[1]||"")).filter(a=>a.length>=2&&a.length<=80).filter(a=>!/^\d+(?:\.\d+){2,}\s+/u.test(a)))].slice(0,12)}function aJ(a){let b=/^\*\*([^*]+?)\*\*\s*[::]?\s*$/u.exec(a.trim());if(!b)return"";let c=al(b[1]||"");return c.length<2||c.length>40||/[。;;.!!??]$/u.test(c)||/^(注|说明|备注|提示|要求)[::]/u.test(c)?"":c}function aK(a){let b=a.split(/\r?\n/u),c="",d=0;return b.map(a=>{let b=/^###\s+(\d+\.\d+)\s+.+$/u.exec(a.trim());if(b)return c=b[1],d=0,a;if(/^##\s+/u.test(a.trim()))return c="",d=0,a;if(!c)return a;let e=/^####\s+(.+)$/u.exec(a.trim());if(e){let b=(e[1]||"").trim();if(/^\d+\.\d+\.\d+\s+\S/u.test(b))return a;let f=al(b);return d+=1,`#### ${c}.${d} ${f}`}let f=aJ(a);return f?(d+=1,`#### ${c}.${d} ${f}`):a}).join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function aL(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(`^${aP(c)}\\.\\d+\\s+\\S`,"u").test(a)||b.push({level:"warning",message:`三级小节缺少 ${c}.x 编号:${al(a)}`,suggestion:"三级小节必须使用“#### 章号.节号.序号 标题”,且不纳入目录。"})}let g=aJ(a);g&&b.push({level:"warning",message:`独立加粗行疑似未编号三级小节:${g}`,suggestion:"请改为“#### 章号.节号.序号 标题”,不要用无编号加粗行表示三级小节。"})}return b.slice(0,20)}function aM(a){return["## 目录","",...a.flatMap((a,b)=>{let c=a.sections||[];return[ao(b,a.title),"",...c.flatMap((a,c)=>[` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`,""])]})].join("\n")}function aN(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 aO(a,b){let c=aN(a);b.forEach((a,b)=>{let d=al(a.title),e=RegExp(`^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${aP(d)}\\s*$`,"mu");c=e.test(c)?c.replace(e,`## ${ao(b,a.title)}`):c});let d=c.split(/\r?\n/u),e=-1,f=0;return d.map(a=>{let b=a.trim();if(/^##\s+第[一二三四五六七八九十百千万\d]+章\s+/u.test(b))return e+=1,f=0,a;let c=/^##\s+(\d+)\.(\d+)\s+(.+)$/u.exec(b);if(e>=0&&c)return f=Number(c[2])||f+1,`### ${e+1}.${f} ${al(c[3]||"")}`;let d=/^###\s+(?:(\d+)\.(\d+)\s+)?(.+)$/u.exec(b);return e>=0&&d?(f+=1,`### ${e+1}.${f} ${al(d[3]||"")}`):a}).join("\n")}function aP(a){return a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}function aQ(a,b){let c=[];for(let d of b.chapters){let b=function(a,b){let c=al(b),d=RegExp(`(^##\\s+(?:第[一二三四五六七八九十百千万\\d]+章\\s*)?${aP(c)}\\s*$)([\\s\\S]*?)(?=\\n##\\s+|(?![\\s\\S]))`,"mu").exec(a);if(d&&void 0!==d.index)return{start:d.index,end:d.index+d[0].length,heading:d[1]||`## ${b}`,body:d[2]||""}}(a,d.title);if(!b){c.push({level:"error",message:`${d.title} 正文缺少章节标题`,suggestion:"请重新生成,确保模板章节完整输出。"});continue}let e=b.heading+b.body,f=(d.sections||[]).filter(a=>!(function(a){let b=a.replace(/^\s*\d+(?:\.\d+)+\s+/u,"").trim();return RegExp(`^###\\s+(?:${aP(a)}|(?:\\d+(?:\\.\\d+)+\\s+)?${aP(b)})\\s*$`,"mu")})(a).test(e));f.length>0&&c.push({level:"error",message:`${d.title} 正文缺少配置小节:${f.join("、")}`,suggestion:"请重新生成或检查审查阶段是否删除了二级小节。"}),d.tableSections?.length&&!/\|[^\n]+\|\s*\n\s*\|\s*:?-{3,}:?\s*\|/u.test(e)&&c.push({level:"error",message:`${d.title} 缺少必要的正式表格`,suggestion:"请按模板 tableSections/tableRequirements 在对应小节补充正式 Markdown 表格。"})}return c}function aR(a){let b=a.chapters.map((a,b)=>(function(a,b){let c=`## ${ao(b,a.title)}`,d=aG(a.content);return/^##\s+.+$/mu.test(d)?d.replace(/^##\s+.+$/mu,c):`${c}
|
|
19
19
|
|
|
20
|
-
${d}`})(a,b)).filter(Boolean).join("\n\n"),c=aM(a.chapters);return aG(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',c,'\n<div class="page-break"></div>\n',b].join("\n"))}function aS(a,b){return Math.ceil(aT(a)/aU(b))}function aT(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function aU(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 aV(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 aW(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function
|
|
21
|
-
只返回 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
|
|
20
|
+
${d}`})(a,b)).filter(Boolean).join("\n\n"),c=aM(a.chapters);return aG(['<div class="document-cover">',`# ${a.title}`,'\n</div>\n\n<div class="page-break"></div>\n',c,'\n<div class="page-break"></div>\n',b].join("\n"))}function aS(a,b){return Math.ceil(aT(a)/aU(b))}function aT(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function aU(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 aV(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 aW(a="",b=""){let c=`${a}${b}`;return/不少于|至少|不低于|以上|起码/u.test(c)?"minimum":/约|大概|左右|大约|约为|附近/u.test(c)?"approximate":"exact"}function aX(a){let b=a.title+a.purpose;return/方法|技术|质量|安全|进度|资源|保障|措施|部署|方案|流程|执行/u.test(b)?1.3:/概况|结语|附录/u.test(b)?.75:1}function aY(a,b){let c=aT(b),d=Math.ceil(c/a.charsPerPage);return{currentChars:c,estimatedPages:d}}function aZ(a){return Z.hc.test(a.message)}function a$(a){let b="string"==typeof a?a:a.message;if("error"===("string"==typeof a?void 0:a.level))return"blocking";for(let a of Z.gr)if(a.pattern.test(b))return a.severity;return"minor"}function a_(a){let b={blocking:0,important:0,minor:0};for(let c of a)b[a$(c)]+=1;return b}function a0(a){let b=[];for(let c of a.split(Z.AQ))Z.w7.test(c)&&Z.N3.test(c)&&b.push(c);return b}function a1(a){let b=[...a.matchAll(Z.DB)],c=[];for(let d=1;d<b.length;d+=1){let e=b[d].index||0,f=b[d+1]?.index??a.length,g=a.slice(e,f);Z.qV.test(g)&&c.push({level:"warning",message:`第 ${d+1} 章可能重复出现项目基本信息`,suggestion:"如该信息与本章主题无关,建议合并到更合适的概况类章节,避免重复铺陈。"})}if(0===b.length)return c;let d=b[0].index||0,e=b[1]?.index??a.length,f=a.slice(d,e),g=f.search(Z.jJ);if(g<=0)return c;let h=f.slice(0,g).replace(Z.Dc,""),i=[];for(let a of Z.gL)RegExp(`${a}\\s*[::]`,"u").test(h)&&i.push(a);return i.length>=3&&c.push({level:"warning",message:`项目基本信息表前重复叙述字段:${i.join("、")}`,suggestion:"项目基本信息已表格化时,表格前只保留一句引导语,不要重复逐项叙述项目名称、编号、地点、工期、质量等字段。"}),c}function a2(a){let b=[];for(let c of Z.ZH)a.includes(c)&&b.push(c);return 0===b.length?[]:[{level:"warning",message:`存在模板化前缀或套话:${b.join("、")}`,suggestion:"请删除“本节/本章将/以下从”等前缀,标题后直接进入对象、动作、措施、检查和闭环。"}]}function a3(a){let b=[];for(let c of a)(c.sections||[]).length<3&&b.push({level:"error",message:`${c.title} 二级小节少于 3 个`,suggestion:"请由模型结合章节主题、项目资料和专业写作需要补齐 3-6 个正式二级小节,不得使用代码默认小节。"});return b}function a4(a){let b=Z.HX.exec(a);if(!b)return[{level:"error",message:"缺少目录页",suggestion:"请在封面后生成“## 目录”,并按一级章父级、二级小节子级组织。"}];let c=0,d=0;for(let a of b[1].split(Z.A5))Z.ZT.test(a)&&Z.EB.test(a)&&(c+=1,Z.sr.test(a)&&(d+=1));return c>0&&0===d?[{level:"error",message:"目录二级小节未作为子级缩进",suggestion:"目录应为父子级导航:一级章单独成行,二级小节至少缩进两个空格列在所属章下方。"}]:[]}function a5(a,b){let c=[],d=a.replace(Z.ug,""),e=function(a){let b=new Set;for(let c of a.preciseFacts)if(Z.FM.test(`${c.processingType||""} ${c.roleId} ${c.sourceFile}`)){for(let a of`${c.key} ${c.value}`.matchAll(Z.No))if(b.add(a[0]),b.size>=Z.l9)return[...b]}return[...b]}(b),f=function(a,b){let c=0;for(let d of a)b.includes(d.replace(Z.ug,""))&&(c+=1);return c}(e,d);return e.length>=Z.mu&&f/e.length<Z.tg&&c.push({level:"error",message:`结构化精确参数使用不足:${f}/${e.length}`,suggestion:"请把资料中的规格、参数、数量、时间、资源、金额、比例和标准编号写入对应章节,禁止泛化概括。"}),b.bills.length>0&&!Z.pP.test(a)&&c.push({level:"error",message:"正文未体现结构化数据资料",suggestion:"请从表格、列表或明细中提取对象、单位、数量、规格和关键参数补入对应章节。"}),b.drawings.length>0&&!Z._U.test(a)&&c.push({level:"error",message:"正文未体现设计/方案/说明类资料",suggestion:"请从设计、方案或说明资料中提取对象、流程、节点、做法、配置、规则和标准要求。"}),c}function a6(a){let b=[];for(let c of Z.IA)c.test(a)&&b.push({level:"warning",message:`存在占位式表达:${c.source}`,suggestion:"请改写为来自资料的准确事实;资料确实未提供时,改写为正式管理措施,不留空值或“见资料/按文件”。"});return b}function a7(a,b){let c=`${b.name} ${b.category} ${b.outputTitle} ${b.description}`,d=[];for(let a of(0,i.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)&&d.push(a);if(0===d.length)return[];let e=[],f=a0(a).length,g=0;for(let b of d){for(let c of(g=Math.max(g,b.minTables||0),b.requiredTexts))a.includes(c)||e.push({level:"error",message:`配置要求缺少必要内容:${c}`,suggestion:"请按当前模板匹配的专业规则补齐必要内容。"});for(let c of b.forbiddenTexts)a.includes(c)&&e.push({level:"error",message:`配置要求不得出现:${c}`,suggestion:"请根据当前模板匹配的专业规则清理正文污染内容。"})}return Z.bu.test(a)&&e.push({level:"error",message:"正式正文存在 Markdown 标题符号 #",suggestion:"导出正文应去除 Markdown 标题符号,保留正式标题文字。"}),g&&f<g&&e.push({level:"error",message:`配置要求正式表格不足:${f}/${g}`,suggestion:"请按当前模板匹配的专业规则补充必要表格。"}),e}var a8=c(15751),a9=c(95393),ba=c(96770),bb=c(29281);function bc(a){return(0,E.createHash)("sha1").update(JSON.stringify(a)).digest("hex")}function bd(a,b,c){a.size>=800&&a.delete(a.keys().next().value),a.set(b,c)}function be(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function bf(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>bf(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${bf(b)}`).filter(Boolean).join(";"):String(a)}function bg(a){return Array.isArray(a)?a.filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):a&&"object"==typeof a?Object.values(a).filter(a=>!!a&&"object"==typeof a&&!Array.isArray(a)):[]}function bh(a){return Array.isArray(a)?a.map(a=>bf(a).trim()).filter(Boolean):"string"==typeof a?a.split(/[;;\n]/u).map(a=>a.trim()).filter(Boolean):[]}function bi(a){if(a?.aborted)throw Error("用户中止")}let bj=new Map,bk=0;function bl(){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 bm=bl(),bn=0,bo=[];function bp(a,b){let c=(0,ba.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function bq(){let a=(0,bb.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 br(a,b){let c=bl(),d=bm;if(void 0===c||void 0===bm){bn=a?0:bn+1,b&&(b.llm.currentLimit=0);return}a?(bn=0,0===bo.length&&bm<c&&(bm+=1)):(bn+=1)>=2&&(bm=Math.max(1,bm-1)),b&&(b.llm.currentLimit=bm,d!==bm&&(b.llm.limitAdjustments+=1))}async function bs(a,b,c){for(;void 0!==bm&&bk>=bm;){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=bo.indexOf(d);a>=0&&bo.splice(a,1),c(Error("用户中止"))},b?.addEventListener("abort",d.onAbort,{once:!0}),bo.push(d)}),c&&(c.llm.throttledWaitMs+=Date.now()-a)}bk+=1,c&&(c.llm.maxActive=Math.max(c.llm.maxActive,bk));try{let b=await a();return br(!0,c),b}catch(a){throw br(!1,c),a}finally{for(bk=Math.max(0,bk-1);bo.length>0;){let a=bo.shift();if(a?.active){a.active=!1,a.signal?.removeEventListener("abort",a.onAbort||(()=>void 0)),a.resolve();break}}}}async function bt(a,b,c=!1,d={}){d.diagnostics&&(d.diagnostics.llm.calls+=1);try{let e=bq();if(!e)return;let{model:f,provider:g}=e,h=bc({provider:f.provider,model:f.name,baseUrl:g.baseUrl,directEndpoint:g.directEndpoint,protocol:g.protocol,apiKeyHash:g.apiKey?bc(g.apiKey):""}),i=bj.get(h);i||(i=(0,a9.createProvider)(bp(f.provider,g),{baseUrl:g.baseUrl,apiKey:g.apiKey,modelName:f.name,directEndpoint:g.directEndpoint}),bj.set(h,i));let j=Math.max(3e4,Number(process.env.DOCUMENT_LLM_CALL_TIMEOUT_MS??3e5));return(await bs(()=>{let e,f,g=new Promise((a,b)=>{e=setTimeout(()=>b(Error("LLM 调用超时")),j)}),h=[i.chat([{role:"system",content:c?`${a}
|
|
21
|
+
只返回 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 bu(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 bv(a,b,c={}){let d=await bt(a,b,!0,{maxTokens:c.maxTokens,temperature:c.temperature,signal:c.signal,diagnostics:c.diagnostics});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 bw(a,b,c,d,e){let f=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],g=a.slice(0,24).map(a=>`文件:${a.filePath}
|
|
22
22
|
角色:${a.roleId||""}
|
|
23
23
|
处理:${a.processingType||""}
|
|
24
|
-
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!g.trim())return{facts:[],stages:f};
|
|
24
|
+
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!g.trim())return{facts:[],stages:f};bi(e);let h=at(c,d),i=h.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),j=await bv(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
|
|
25
25
|
返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
|
|
26
26
|
|
|
27
27
|
动态事实 schema:
|
|
28
28
|
${i}
|
|
29
29
|
|
|
30
30
|
资料:
|
|
31
|
-
${g}`,{signal:e});return(
|
|
31
|
+
${g}`,{signal:e});return(bi(e),j?.facts?.length)?{facts:j.facts.filter(a=>a.key&&a.value).map(a=>{let b=h.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:bf(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${j.facts.length} 条事实`}]}:{facts:[],stages:f}}function bx(a){return 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 by(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||bx(c.roleId),subtitle:c.subtitle||c.roleName||bx(c.roleId)}}function bz(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 bA(a,b){return`${a},耗时 ${Math.round((Date.now()-b)/1e3)} 秒`}let bB=new Map,bC=new Map,bD=new Map,bE=new Map;async function bF(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 bG(a){let b=Date.now(),c=0;for(let[a,d]of bD.entries())b-d.updatedAt>Z.jA&&(bD.delete(a),c+=1);for(;bD.size>800;){let a=[...bD.entries()].sort((a,b)=>a[1].updatedAt+6e4*a[1].hits-(b[1].updatedAt+6e4*b[1].hits))[0]?.[0];if(!a)break;bD.delete(a),c+=1}a&&(a.cache.prunedItems+=c)}function bH(){return"0"!==process.env.DOCUMENT_PERSISTENT_FACT_CACHE}function bI(a,b,c){return e.join(f.homedir(),".customize-agent","document-cache",bc(a),b,`${c}.json`)}function bJ(a,b,c){if(bH())try{let e=bI(a,b,c);if(!d.existsSync(e))return;return JSON.parse(d.readFileSync(e,"utf8"))}catch{return}}function bK(a,b,c,f){if(bH())try{let g=bI(a,b,c);d.mkdirSync(e.dirname(g),{recursive:!0}),d.writeFileSync(g,JSON.stringify(f))}catch{}}function bL(a){return a.toLowerCase()}function bM(a,b){return e.relative(a,e.isAbsolute(b)?b:e.join(a,b))}async function bN(a){bi(a.signal);let b=bc({type:"role-artifact-v1",projectRoot:a.projectRoot,projectId:(0,C.computeProjectId)(a.projectRoot),templateId:a.template.id,templateName:a.template.name,node:{id:a.node.id,fileRoleId:a.node.fileRoleId,promptRoleIds:a.node.promptRoleIds,filePaths:a.node.filePaths,outputType:a.node.outputType},promptTexts:a.promptTexts,modelName:a.modelName,evidence:a.evidence.map(a=>({filePath:a.filePath,sectionTitle:a.sectionTitle,contentHash:bc(a.content)}))}),c=bB.get(b);if(c)return{artifact:c,cached:!0};let d=await bT(a.template,a.node,a.evidence,a.signal);return bi(a.signal),bd(bB,b,d),{artifact:d,cached:!1}}async function bO(a){let b=bc({type:"chapter-search-v2",projectRoot:a.projectRoot,projectId:(0,C.computeProjectId)(a.projectRoot),query:a.query,maxEvidence:a.maxEvidence,fileRolesHash:a.fileRolesHash,generationMode:!!a.generationMode,scope:[...a.evidenceScopePaths].sort()}),c=bC.get(b)||bJ(a.projectRoot,"chapter-search",b);if(c)return bd(bC,b,c),c;let d=[...a.evidenceScopePaths].filter(Boolean).sort();if(0===d.length)return[];let e=await a.manager.search(a.projectRoot,a.query,{scope:"project",filters:{filePaths:d},limit:a.generationMode?a.maxEvidence:Math.max(a.maxEvidence,30),weights:a.generationMode?{keyword:.55,vector:.4,rewrite:0,hybridBonus:.08}:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15},generationMode:a.generationMode});return bd(bC,b,e.results),bK(a.projectRoot,"chapter-search",b,e.results),e.results}function bP(a){return bc({type:"chapter-draft-v1",projectRoot:a.projectRoot,projectId:(0,C.computeProjectId)(a.projectRoot),templateId:a.template.id,chapterId:a.chapter.id,chapterTitle:a.chapter.title,requirement:a.requirement||"",promptTexts:a.promptTexts,modelName:a.modelName||"",targetWords:a.targetWords,fileRolesHash:a.fileRolesHash,missingFacts:a.missingFacts,evidence:a.evidence.map(a=>({filePath:a.filePath,score:Math.round(1e3*a.score)/1e3,roleId:a.roleId,processingType:a.processingType,source:a.source,digest:bc(a.content.slice(0,3e3))}))})}function bQ(a){let b=[];for(let c of a)Z.Bd.lastIndex=0,Z.Bd.test(c)&&b.push(c);return b}function bR(a){return bc({type:"section-draft-v1",projectRoot:a.projectRoot,projectId:(0,C.computeProjectId)(a.projectRoot),templateId:a.template.id,chapterId:a.chapter.id,sectionTitle:a.sectionTitle,requirement:a.requirement||"",promptTexts:bc(a.promptTexts.slice(0,12e3)),modelName:a.modelName||"",targetWords:a.targetWords,fileRolesHash:a.fileRolesHash,evidence:a.evidence.map(a=>({filePath:a.filePath,roleId:a.roleId,digest:bc(a.content.slice(0,2e3))}))})}function bS(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function bT(a,b,c,d){let e=c.slice(0,36).map(a=>`文件:${a.filePath}
|
|
32
32
|
片段:${a.sectionTitle||""}
|
|
33
33
|
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),f=b.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",g=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
|
|
34
34
|
节点类型:${b.outputType}
|
|
@@ -38,33 +38,33 @@ ${g}`,{signal:e});return(bh(e),j?.facts?.length)?{facts:j.facts.filter(a=>a.key&
|
|
|
38
38
|
请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 必须只来自下面的绑定文件片段,优先抽取对象、范围、区域、阶段、数量、日期、周期、规格、单位、资源数量、检查频次和来源口径;同类对象不得合并丢失,计量单位保持原文含义,必要时使用导出友好的正式写法。
|
|
39
39
|
|
|
40
40
|
绑定文件片段:
|
|
41
|
-
${e}`,h=[];
|
|
41
|
+
${e}`,h=[];bi(d);let i=e.trim()?await bv(f,g,{signal:d}):void 0;if(bi(d),bS(i)){h.push(`${b.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let a=await bv("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters 和 facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
|
|
42
42
|
|
|
43
43
|
原始 JSON:
|
|
44
|
-
${JSON.stringify(i).slice(0,12e3)}`,{signal:d});a&&!
|
|
44
|
+
${JSON.stringify(i).slice(0,12e3)}`,{signal:d});a&&!bS(a)?i=a:h.push(`${b.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let j=bg(i?.chapters),k=bg(i?.facts),l=[];j.forEach((b,c)=>{let d="string"==typeof b.title?am(b.title):"";!d||!an(b.title||d)||x(d,a)||l.push({id:be(d,`chapter-${c+1}`),title:d,order:c,sourceRequirement:b.sourceRequirement||d,requiredContents:bh(b.requiredContents),writingRules:bh(b.writingRules),evidenceNeeds:bh(b.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(b.minWords)||1200)),requirements:bg(b.requirements).map((a,b)=>({id:be(`${d}-${a.title||b+1}`,`req-${c+1}-${b+1}`),title:a.title||`要求 ${b+1}`,requirementText:a.requirementText||a.title||"",requiredContents:bh(a.requiredContents),writingRules:bh(a.writingRules),evidenceNeeds:bh(a.evidenceNeeds),preferredSourceRoleIds:bh(a.preferredSourceRoleIds)}))})});let m=[],n=new Set(c.map(a=>a.filePath));return k.forEach(a=>{let d="string"==typeof a.key?a.key.trim():"",e=a.sourceFile&&n.has(a.sourceFile)?a.sourceFile:c.find(a=>a.filePath)?.filePath||"";d&&null!=a.value&&e&&n.has(e)&&m.push({key:d,value:aw(bf(a.value)),sourceFile:e,roleId:b.fileRoleId,processingType:b.processingType,relatedChapterHints:bh(a.relatedChapterHints)})}),(0===l.length||0===m.length)&&h.push(`${b.fileRoleName} 部分结构化结果不足,已补充使用证据片段兜底。`),{node:b,evidence:c,chapters:l.length>0?l:function(a,b,c){if("template_requirements"!==b.outputType)return[];let d=[],e=new Set;for(let b of c){for(let c of b.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!RegExp(`^(?:第(?:\\d{1,3}|${ah})[章节]|[((]?(?:\\d{1,3}|${ah})[))、..]|\\d+(?:\\.\\d+)*[、..])`,"u").test(c))continue;let f=am(c);if(!(!an(c)||e.has(f)||x(f,a))&&(e.add(f),d.push({id:be(f,`chapter-${d.length+1}`),title:f,order:d.length,sourceRequirement:b.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),d.length>=40))break}if(d.length>=40)break}return d}(a,b,c),facts:m.length>0?m:function(a,b){let c=[];for(let d of b){let b=d.content.replace(/\s+/gu," ").slice(0,360);if(!(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]:[]}),c.length>=20))break}return c}(b,c),outputRequirements:bh(i?.outputRequirements),warnings:[...h,...bh(i?.warnings)],forbidImageInsertion:i?.forbidImageInsertion??"drawing_facts"===b.outputType}}function bU(a){let b=a.length>1e4?`${a.slice(0,5e3)}
|
|
45
45
|
|
|
46
|
-
${a.slice(-5e3)}`:a,c=b.replace(/\s+/gu," ");return{explicitStructure:/(?:目录|大纲|章节|结构|框架|按以下|如下结构|不要新增|不得新增|只写|仅写)/u.test(c),explicitSections:/(?:小节|二级标题|三级标题|一级标题|##|###|第[一二三四五六七八九十]+章|\d+[.、]\s*[^\s])/u.test(b),lengthLimit:/(?:\d+\s*(?:字|页|段)|控制在|不超过|不少于|篇幅|字数|页数)/u.test(c),wantsConcise:/(?:简洁|精简|简要|不要展开|无需展开|概述|摘要|少写|控制篇幅)/u.test(c),detailedInstructions:c.length>=900||/(?:必须包含|重点写|详细说明|逐项|分别说明|表格|列表|明细|流程|步骤|标准|责任|频次|验收)/u.test(c),explicitFacts:/(?:\d+\s*(?:天|日|个月|万元|元|%|㎡|m2|米|m|人|台|套)|项目名称|周期|质量标准|地点|预算|编号)/u.test(c),styleConstraint:/(?:口吻|语气|风格|措辞|正式|承诺|汇报|方案|不要使用|禁止使用)/u.test(c)}}function
|
|
47
|
-
${
|
|
48
|
-
${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>=80))return e;return e}function
|
|
46
|
+
${a.slice(-5e3)}`:a,c=b.replace(/\s+/gu," ");return{explicitStructure:/(?:目录|大纲|章节|结构|框架|按以下|如下结构|不要新增|不得新增|只写|仅写)/u.test(c),explicitSections:/(?:小节|二级标题|三级标题|一级标题|##|###|第[一二三四五六七八九十]+章|\d+[.、]\s*[^\s])/u.test(b),lengthLimit:/(?:\d+\s*(?:字|页|段)|控制在|不超过|不少于|篇幅|字数|页数)/u.test(c),wantsConcise:/(?:简洁|精简|简要|不要展开|无需展开|概述|摘要|少写|控制篇幅)/u.test(c),detailedInstructions:c.length>=900||/(?:必须包含|重点写|详细说明|逐项|分别说明|表格|列表|明细|流程|步骤|标准|责任|频次|验收)/u.test(c),explicitFacts:/(?:\d+\s*(?:天|日|个月|万元|元|%|㎡|m2|米|m|人|台|套)|项目名称|周期|质量标准|地点|预算|编号)/u.test(c),styleConstraint:/(?:口吻|语气|风格|措辞|正式|承诺|汇报|方案|不要使用|禁止使用)/u.test(c)}}function bV(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=[];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}
|
|
47
|
+
${bf(a.value)}
|
|
48
|
+
${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>=80))return e;return e}function bW(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function bX(a,b,c,d,e){let f=[];for(let b of c)for(let c of(a.includes(b.title)||f.push(`章节计划建议未体现:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&f.push(`${b.title} 未覆盖必写内容:${c}`);for(let d of b){let b=c.find(a=>a.title===d.title),e=b?.minWords||1e3;for(let b of(d.content.length<e&&f.push(`${d.title} 内容深度不足:${d.content.length}/${e}`),(d.sections||[]).length<3&&f.push(`${d.title} 二级小节少于 3 个,必须由模型结合章节主题和项目资料补齐 3-6 个正式二级小节`),d.sections||[]))b&&!a.includes(b)&&f.push(`${d.title} 缺少目录小节:${b}`)}for(let b of d){let c=b.facts.slice(0,5).map(a=>bf(a.value).slice(0,24)).filter(a=>a.length>=6);c.length>0&&!c.some(b=>a.includes(b))&&f.push(`未体现 ${b.node.fileRoleName} 的关键读取结果`)}return e&&/!\[[^\]]*\]\([^)]*\)/iu.test(a)&&f.push("正文包含不应插入的图片"),/\b(?:m\s*[²2]|m\s*[³3]|mm2|cm2|km2)\b/iu.test(a)&&f.push("正文包含导出不友好的计量单位写法"),[...new Set(f)].slice(0,40)}function bY(a){return Z.MG.lastIndex=0,Z.MG.test(a)}function bZ(a){let b=[];for(let c of(RegExp(`^##\\s+${a.chapter.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")}`,"mu").test(a.content)||b.push("正文缺少章节标题"),a.chapter.sections||[])){let d=c.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),e=a.content.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${d}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu"));e?180>aT(e[1])&&b.push(`配置小节正文过短:${c}`):b.push(`缺少配置小节:${c}`)}for(let c of(aT(a.content)<Math.floor(.85*a.targetWords)&&b.push("正文篇幅明显低于目标"),aD.lastIndex=0,(aD.test(a.content)||/知识库|检索|角色节点|事实字段|校验结果/u.test(a.content))&&b.push("正文包含后台流程话术"),/资料未提供|满足相关要求|结合实际情况|按(?:相关|有关|规范|规定|设计)要求/u.test(a.content)&&b.push("正文存在空泛占位表达"),a.missingFacts.slice(0,8)))c&&!a.content.includes(c)&&b.push(`requiredFacts 未明显覆盖:${c}`);return[...new Set(b)].slice(0,10)}async function b$(a){bi(a.signal);let b=a.repairType||function(a){let b=a.join("\n");for(let a of Z.NP)if(a.pattern.lastIndex=0,a.pattern.test(b))return a.type;return"generic"}(a.issues),c=await bv(["你是章节局部修复专家。只返回 JSON patch,不返回完整章节,不重写无问题内容。",Z._$[b]||Z._$.generic,aH,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}`:"",`需要局部修复的问题:
|
|
49
49
|
${a.issues.map(a=>`- ${a}`).join("\n")}`,a.chapter.evidence.length?`本章证据摘要:
|
|
50
|
-
${aB(aA({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence))}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});
|
|
50
|
+
${aB(aA({id:a.chapter.id,title:a.chapter.title,purpose:a.chapter.title,queries:[],requiredFacts:[]},a.chapter.evidence))}`:"","当前章节 Markdown:",a.chapter.content].filter(Boolean).join("\n\n"),{maxTokens:2200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});bi(a.signal);let d=a.chapter.content,e=0;for(let b of(Array.isArray(c?.patches)?c.patches:[]).slice(0,3)){let c=function(a){let b=a.patch.replacement?.trim();if(!b||b.length>2600||a.forbidDrawingImages&&/!\[[^\]]*\]\([^)]*\)/iu.test(b))return{content:a.content,applied:!1};let c=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(!c||c.length>3200)return{content:a.content,applied:!1};let d=aG(aC(a.content.replace(c,b),a.forbidDrawingImages));return!function(a,b){let c=(a.match(/```/gu)||[]).length,d=b.replace(/^第[一二三四五六七八九十百千万]+章\s*/u,"").slice(0,6);return c%2==0&&a.includes(d)&&!/^\s*$/u.test(a)}(d,a.title)||aT(d)<Math.floor(.65*aT(a.content))?{content:a.content,applied:!1}:{content:d,applied:d!==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 b_(a){let b=a.issues.filter(a=>"minor"!==a$(a)).filter(bY);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(bY),d=new Set(a.sections||[]),e=`${a.title}
|
|
51
51
|
${a.sections?.join("\n")||""}
|
|
52
|
-
${a.content.slice(0,4e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||按设计要求|按规范要求|m\s*[²2]|mm2|cm2|km2/u.test(e))})(a,b).slice(0,3)})).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.slice(0,5).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){
|
|
53
|
-
${
|
|
54
|
-
${b.sections.map(a=>`- ${a}`).join("\n")}`:k.explicitStructure||k.explicitSections||k.lengthLimit||k.wantsConcise?"本章未预设二级小节;请优先遵循用户提示词和模板结构组织内容,不得因系统增强自行扩展小节。":"本章未预设二级小节;必须根据章节主题、项目资料和专业写作需要生成 3-6 个正式二级小节,不得新增、删除或重排一级章节。",m=function(a,b){let c=
|
|
55
|
-
${f}`:"",i.projectBasicFactContext||"",h||"",i.factCoverageContext||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:",`- 首轮生成必须尽量达到目标篇幅的 85%-95%;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}
|
|
52
|
+
${a.content.slice(0,4e3)}`;return c.filter(b=>b.includes(a.title)||[...d].some(a=>b.includes(a))||/图片|三级小节|目录|表格|量化|数值|单位|事实/u.test(b)&&/!\[|####|\*\*|\||按设计要求|按规范要求|m\s*[²2]|mm2|cm2|km2/u.test(e))})(a,b).slice(0,3)})).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.slice(0,5).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){bi(a.signal);let d=c.slice(b,b+e);(await Promise.all(d.map(async b=>b$({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.slice(0,5).join(";")}`;return{markdown:a.markdown,chapters:i,stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:j}}}function b0(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 b1(a,b,c){return function(a,b){let c=e.resolve(a),f=function(a,b){let c=e.resolve(a);if(e.isAbsolute(b))return e.resolve(b);let f=e.resolve(c,"knowledgeBase",b);return d.existsSync(f)?f:e.resolve(c,b)}(c,b);return f===c||f.startsWith(`${c}${e.sep}`)}(a,b)&&c.size>0&&b0(a,b).some(a=>c.has(a))}function b2(a,b){return new Set(b.flatMap(b=>b0(a,b.filePath)))}function b3(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(RegExp(`^\\s*<\\s*${aj}(?:\\s[^>]*)?>`,"iu").test(b)&&(e=!0),e){c.push(a),RegExp(`^\\s*<\\/\\s*${aj}\\s*>`,"iu").test(b)&&(e=!1);continue}let f=/^(?:#+\s*)?(?:示例|样例|范例|例如|参考示例|示例数据|示例正文|示例目录|example|sample)\s*[::]?/iu.test(b),g=/(?:不得|禁止|必须|应当|要求|规则|格式|输出|保留|只返回|不要)/u.test(b);if(f&&!g){c.at(-1)?.includes("示例内容已省略")||c.push("【示例内容已省略:仅作为格式参考,不作为项目事实】"),d=!0;continue}if(d){if(!b){d=!1;continue}if(!/^(?:#+\s*)?(?:规则|要求|输出|格式|禁止|注意|正文|章节|风格|校验)/u.test(b))continue;d=!1}c.push(a)}return c.join("\n").replace(/\n{3,}/gu,"\n\n").trim()}function b4(a,b){let c=function(){let a=new Map;for(let b of(0,h.XB)("prompt"))a.set(b.id,b.executionType||"reference");return a}(),d=new Set(b),e=[];for(let b of o(a))d.has(c.get(b.roleId)||"reference")&&e.push(`## [${b.roleId}] ${b.name}
|
|
53
|
+
${b3(b.content)}`);return e.join("\n\n")}async function b5(a,b,c){let f=bq();if(!f?.provider.capabilities?.fileUnderstanding&&!f?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};bi(c);let g=(0,a9.createProvider)(bp(f.model.provider,f.provider),{baseUrl:f.provider.baseUrl,apiKey:f.provider.apiKey,modelName:f.model.name,directEndpoint:f.provider.directEndpoint});if(!g.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let h=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===h.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{bi(c);let a=await g.understandFiles(h,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200,signal:c});bi(c);let b=a.content.trim();return{notes:b?[b]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:b?"success":"fallback",message:b?`已理解 ${h.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function b6(a,b,c,d,e,f,g,h="",i={}){let j=aB(aA(b,c));if(!j.trim()&&!h.trim())return;let k=bU([e,g||""].filter(Boolean).join("\n\n")),l=b.sections?.length?`本章必须完整包含以下二级小节,且每个小节都要有实质正文:
|
|
54
|
+
${b.sections.map(a=>`- ${a}`).join("\n")}`:k.explicitStructure||k.explicitSections||k.lengthLimit||k.wantsConcise?"本章未预设二级小节;请优先遵循用户提示词和模板结构组织内容,不得因系统增强自行扩展小节。":"本章未预设二级小节;必须根据章节主题、项目资料和专业写作需要生成 3-6 个正式二级小节,不得新增、删除或重排一级章节。",m=function(a,b){let c=b7(a,b);return 0===c.length?"":["本章小节篇幅计划(首轮生成应尽量一次达成,避免后续补写):",...c.map(a=>`- ${a.title}:约 ${a.targetWords} 字,至少达到 ${Math.floor(.8*a.targetWords)} 字,并覆盖对象/范围、依据/关键事实、处理要求、控制措施和结果闭环。`)].join("\n")}(b,i.targetWords||i.minWords||0),n=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",aH,"准确性优先级:用户需求/模板章节 > 绑定提示词与角色节点结构化事实 > 知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。","提示词角色只提供规则和格式约束;其中的示例、样例、占位项目名、编号、日期、数量和示例正文不得作为当前项目事实,不得写入正文。",i.forbidDrawingImages?"图片类资料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),o=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,l,m,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
55
|
+
${f}`:"",i.projectBasicFactContext||"",h||"",i.factCoverageContext||"",i.technicalFactContext||"",i.coverageMatrixContext||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:",`- 首轮生成必须尽量达到目标篇幅的 85%-95%;内容不少于 ${i.minWords||1e3} 字${i.targetWords?`,目标约 ${i.targetWords} 字`:""}${i.maxWords?`,最多不超过 ${i.maxWords} 字`:""};不得依赖后续扩写补救,也不得过度展开。`,"- 保留章节标题;如模板配置了小节,必须按配置完整生成;如未配置小节且用户未限制结构,必须生成 3-6 个正式二级小节;每个二级小节必须有实质正文,不能只有标题或表格。",b.tableSections?.length?`- 本章以下小节适合使用正式表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴资料摘录。`:"","- 表格只用于模板、用户要求或资料内容适合结构化表达的位置;表格前必须说明数据来源和适用范围,表格后必须说明控制措施、结论或执行要求,不能整节只有表格。","- 不得使用“本节”“本章将”“以下从”“以下内容”等模板化前缀;标题后直接进入本章对象、关键事实、处理要求、控制措施和结果闭环。","- 每个核心小节必须形成“对象/范围 → 依据/关键事实 → 执行或说明动作 → 控制要求 → 结果/责任闭环”的完整表达链条;具体术语以模板、用户要求和资料内容为准。","- 二级小节下如需设置三级小节,必须使用“#### 章号.节号.序号 标题”,例如“#### 2.2.1 关键事项”;三级小节不纳入目录;不得使用无编号独立加粗行表示三级小节。","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、标准要求、约束条件等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 日期、数量、数值、规格、周期、资源、范围、对象等量化内容必须来自资料或明确推导;无依据时不得编造具体值。","- 如果同一规则、方案、流程或措施适用于多个对象、区域、主体、片区或分项,必须逐项覆盖适用范围和对应依据,不得只写其中一个。","- 对模板和资料中已经明确给出的关键事实、数量、时间、规格、标准、范围、对象、责任或约束,必须写入对应小节,不能只写原则性要求。","- 严禁使用空泛占位表达替代资料事实;确实缺少资料时,只能写成待复核事项、约束条件或控制措施,不得编造具体数值。","- 正文不得出现“知识库”“证据”“检索”“角色节点”“事实字段”“校验结果”等后台系统话术。","- 存在事实冲突时,优先遵循用户要求、模板结构、绑定文件证据和提示词角色;后台内容优化建议仅作质量参考;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",i.targetWords&&i.targetWords>=3500?"- 用户已提出较高篇幅目标,本章必须围绕每个二级小节充分展开对象范围、资料依据、关键事实、执行要求、风险约束、检查确认和责任闭环;不得用摘要式段落替代正文。":"","",j?"内部资料:":"",j].filter(Boolean).join("\n"),p=await bt(n,o,!1,{maxTokens:i.maxTokens,signal:i.signal});if(p&&!(p.length<120))return aG(aC(p.startsWith("## ")?p:`## ${b.title}
|
|
56
56
|
|
|
57
|
-
${p}`,!!i.forbidDrawingImages))}function
|
|
57
|
+
${p}`,!!i.forbidDrawingImages))}function b7(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}))}async function b8(a){let b=function(a,b,c,d=45){let e=[...new Set(([a,b.title,...b.requiredFacts||[]].join(" ").match(/[\p{Script=Han}]{2,}|[A-Za-z0-9_-]{3,}/gu)||[]).map(a=>a.toLowerCase()))].slice(0,40),f=c.map((b,c)=>{let d=`${b.sectionTitle||""}
|
|
58
58
|
${b.content}`.toLowerCase(),f=e.reduce((a,b)=>a+ +!!d.includes(b),0),g=b.sectionTitle&&a.includes(b.sectionTitle)||b.sectionTitle&&b.sectionTitle.includes(a)?4:0;return{item:b,score:f+g+.1*b.score-.001*c}}).sort((a,b)=>b.score-a.score).filter(a=>a.score>0).slice(0,d).map(a=>a.item);return f.length>=Math.min(12,c.length)?f:c.slice(0,d)}(a.sectionTitle,a.chapter,a.evidence),c=aB(aA(a.chapter,b)),d=[`文档模板:${a.template.name}`,`章节标题:${a.chapter.title}`,`当前二级小节:${a.sectionTitle}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文:
|
|
59
|
-
${a.projectContext}`:"",a.factCoverageContext||"",a.roleContext,a.missingFacts.length?`需要特别补足的事实:${a.missingFacts.join("、")}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords}
|
|
60
|
-
${c}`:""].filter(Boolean).join("\n\n"),e=await
|
|
59
|
+
${a.projectContext}`:"",a.factCoverageContext||"",a.roleContext,a.missingFacts.length?`需要特别补足的事实:${a.missingFacts.join("、")}`:"",`请只生成当前二级小节正文,使用“### ${a.sectionTitle}”作为小节标题,目标约 ${a.targetWords} 字${a.maxWords?`,最多不超过 ${a.maxWords} 字`:""}。`,"- 内容必须围绕当前小节,不得生成其他二级小节,不得重复章节一级标题。","- 必须把资料中的关键事实、数量、时间、规格、标准、范围、对象、责任或约束写入正文;缺少依据时不得编造。","- 每个小节必须包含对象/范围、依据/关键事实、处理要求、控制措施和结果闭环;具体术语以模板、用户要求和资料为准。","- 表格只能作为辅助表达,表格前后必须有正文说明,不能整节只有表格。",c?`内部资料:
|
|
60
|
+
${c}`:""].filter(Boolean).join("\n\n"),e=await bt(["你是正式业务文档的小节生成专家。",aH,a.promptTexts].filter(Boolean).join("\n\n"),d,!1,{maxTokens:ca(a.targetWords),temperature:.25,signal:a.signal});if(e&&!(e.length<80))return aG(aC(e.startsWith("### ")?e:`### ${a.sectionTitle}
|
|
61
61
|
|
|
62
|
-
${e}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}async function
|
|
62
|
+
${e}`,a.forbidDrawingImages)).replace(/^##\s+.*\n+/u,"").trim()}async function b9(a){let b=b7(a.chapter,a.targetWords);if(b.length<2)return;let c=Number(process.env.DOCUMENT_SECTION_CONCURRENCY??b.length),d=Math.max(1,Math.min(b.length,Number.isFinite(c)?Math.floor(c):b.length)),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"});let e=a.projectRoot&&a.fileRolesHash?{template:a.template,chapter:a.chapter,sectionTitle:c.title,evidence:d?a.evidence.slice(0,80):a.evidence,promptTexts:a.promptTexts,requirement:a.requirement,projectRoot:a.projectRoot,modelName:a.modelName,targetWords:c.targetWords,fileRolesHash:a.fileRolesHash}:void 0;if(!d&&e){let d=function(a,b){let c=bR(a),d=bE.get(c),e=d?.value||bJ(a.projectRoot,"section-draft",c);if(!e?.trim()){b&&(b.cache.sectionMisses+=1);return}if(/后台流程话术|提示词|占位|TODO|待补充/iu.test(e)||aT(e)<Math.max(120,Math.floor(.45*a.targetWords))){b&&(b.cache.rejectedHits+=1);return}return bd(bE,c,{value:e,updatedAt:Date.now(),hits:(d?.hits||0)+1}),b&&(b.cache.sectionHits+=1,b.quality.reusedSectionCount+=1),e}(e,a.diagnostics);if(d)return f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"}),d}try{let g=await b8({...a,evidence:d?a.evidence.slice(0,80):a.evidence,projectContext:d?a.projectContext.slice(0,8e3):a.projectContext,roleContext:d?a.roleContext.slice(0,12e3):a.roleContext,factCoverageContext:d?a.factCoverageContext?.slice(0,8e3):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)});return g&&e&&function(a,b,c){if(!b.trim()||/后台流程话术|提示词|占位|TODO|待补充/iu.test(b))return;let d=bR(a);bd(bE,d,{value:b,updatedAt:Date.now(),hits:0}),bK(a.projectRoot,"section-draft",d,b),c&&(c.cache.sectionWrites+=1)}(e,g,a.diagnostics),g&&(f+=1,a.onSectionProgress?.({completed:f,total:b.length,sectionTitle:c.title,phase:"complete"})),g}catch(b){console.warn(`[document-workflow] 小节生成失败:${a.chapter.title} / ${c.title}`,b);return}};for(let c=0;c<b.length;c+=d){bi(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=Math.max(0,Math.min(b.length,Number(process.env.DOCUMENT_SECTION_RETRY_LIMIT??4))),i=e.map((a,b)=>a?-1:b).filter(a=>a>=0).slice(0,h);for(let c=0;c<i.length;c+=d){bi(a.signal);let f=i.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 j=e.filter(Boolean);if(0!==j.length)return aG(aC(`## ${a.chapter.title}
|
|
63
63
|
|
|
64
|
-
${j.join("\n\n")}`,a.forbidDrawingImages))}function
|
|
65
|
-
${
|
|
64
|
+
${j.join("\n\n")}`,a.forbidDrawingImages))}function ca(a,b){return Math.min(32e3,Math.max(6e3,Math.ceil(1.6*(b||a))))}function cb(a){let b=a||1200;return b>=8e3?9e5:b>=5e3?6e5:b>=3e3?42e4:3e5}function cc(a){return a<=0?0:Math.min(3,Math.max(1,Math.ceil(a/4e3)))}async function cd(a){let b=aT(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=aB(aA(a.chapter,a.evidence)),f=await bt(["你是章节正文扩写专家。你的任务是在保持章节结构和已有内容连续性的基础上,对当前章节进行局部扩写、补充和衔接优化。",aH,"返回扩写后的完整本章 Markdown,而不是整篇文档;必须保留本章一级标题,不得新增、删除或重命名一级章节。","不得删除、压缩、总结已有正文中的有效事实和已成文内容;可以在已有二级小节内部补充段落、补充三级小节、补充表格前后说明、增强段落衔接。","可以对局部语句做轻微衔接性改写,但不得改变事实含义,不得减少有效字数;不得把所有新增内容堆到章末,应优先补到对应的小节或语义位置。","不得输出“已满足要求”“由于资料有限”“以下是补充”等说明性话术。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,`章节标题:${a.chapter.title}`,a.requirement?`用户要求:${a.requirement}`:"",`当前本章有效字数约 ${b} 字,目标约 ${a.targetChars} 字,最多不超过 ${c} 字;本轮只补足必要缺口,不要过度展开。`,"扩写重点:围绕尚未充分展开的对象范围、关键事实、执行要求、资源条件、风险约束、检查确认和责任闭环补充。资料没有新的精确数值时,可以扩展过程性或管理性正文,但不得编造具体数值。",a.roleContext,e?`内部资料:
|
|
65
|
+
${e}`:"","当前章节 Markdown:",a.currentContent.slice(-24e3)].filter(Boolean).join("\n\n"),!1,{maxTokens:a.maxTokens??ca(b,a.targetChars),temperature:.25,signal:a.signal});if(!f||f.length<120)return a.currentContent;let g=aG(aC(f.startsWith("## ")?f:`## ${a.chapter.title}
|
|
66
66
|
|
|
67
|
-
${
|
|
67
|
+
${f}`,a.forbidDrawingImages));return!function(a,b,c,d,e=Math.ceil(1.12*d)){let f=aT(a),g=aT(b),h=al(c).slice(0,6),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}async function ce(a){let b=b7(a.chapter,a.targetWords);if(b.length<2||a.targetWords<3e3)return a.content;let c=a.content;if(a.maxWords&&aT(c)>=a.maxWords)return c;let d=b.map(a=>{let b=a.title.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),d=c.match(RegExp(`^#{3,4}\\s+(?:\\d+(?:\\.\\d+)*\\s+)?${b}\\s*\\n([\\s\\S]*?)(?=^#{3,4}\\s+|^##\\s+|$)`,"mu")),e=aT(d?.[1]||"");return{...a,currentWords:e}}).filter(a=>a.currentWords<Math.floor(.55*a.targetWords)).slice(0,4),e=Array(b.length),f=Number(process.env.DOCUMENT_SECTION_SUPPLEMENT_CONCURRENCY??process.env.DOCUMENT_SECTION_CONCURRENCY??d.length),g=Math.max(1,Math.min(d.length||1,Number.isFinite(f)?Math.floor(f):d.length||1));for(let f=0;f<d.length;f+=g){let h=d.slice(f,f+g),i=a.maxWords?Math.max(0,a.maxWords-aT(c)):1/0;if(i<=200)break;let j=Number.isFinite(i)?Math.max(260,Math.floor(i/h.length)):void 0,k=await Promise.all(h.map(b=>b8({...a,sectionTitle:b.title,targetWords:Math.max(350,b.targetWords-b.currentWords),maxWords:j})));h.forEach((a,c)=>{e[b.findIndex(b=>b.title===a.title)]=k[c]})}return e.forEach((a,d)=>{a&&(c=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()}
|
|
68
68
|
|
|
69
69
|
${d}
|
|
70
70
|
|
|
@@ -74,16 +74,16 @@ ${d}
|
|
|
74
74
|
|
|
75
75
|
### ${b}
|
|
76
76
|
|
|
77
|
-
${f}`:a}(c,b[d].title,a))}),aG(aC(c,a.forbidDrawingImages))}async function
|
|
77
|
+
${f}`:a}(c,b[d].title,a))}),aG(aC(c,a.forbidDrawingImages))}async function cf(a){let b=a.content,c=0,d=cc(a.targetChars-aT(b)),e=a.maxChars??Math.ceil(1.12*a.targetChars);for(;c<d&&aT(b)<a.targetChars&&aT(b)<e;c+=1){bi(a.signal);let c=b,d=await bu(c=>cd({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}),cb(a.targetChars),a.signal);if(!d||d===c)break;b=d}return{content:b,rounds:c}}async function cg(a){if(!a.budget.minChars)return a.chapters;let b=a.chapters,c=aT(b.map(a=>a.content).join("\n\n")),d=Math.min(2,cc(a.budget.minChars-c)),e=Number(process.env.DOCUMENT_BUDGET_EXPAND_CONCURRENCY??a.chapters.length),f=Math.max(1,Math.min(a.chapters.length||1,Number.isFinite(e)?Math.floor(e):a.chapters.length||1)),g=new Set,h=a.budget.maxChars;for(let e=0;e<d&&c<a.budget.minChars&&(!h||c<h);e+=1){bi(a.signal);let d=c,e=b.map(b=>{let c=a.budget.chapterTargets.get(b.id)||0,d=aT(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){bi(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 cf({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:ca(b.current,b.target),signal:a.signal});return{id:b.chapter.id,beforeChars:b.current,content:d.content}}))))aT(c.content)<=c.beforeChars+300&&g.add(c.id),b=b.map(a=>a.id===c.id?{...a,content:c.content}:a);c=aT(b.map(a=>a.content).join("\n\n"))}if(c<=d+300)break}return b}async function ch(a){let b=Date.now(),c=Math.max(1,Math.min(a.strategy.maxChapterReviewConcurrency,Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??a.strategy.maxChapterReviewConcurrency))),d=Array(a.chapters.length);for(let b=0;b<a.chapters.length;b+=c){bi(a.signal);let e=a.chapters.slice(b,b+c);(await Promise.all(e.map(async b=>{let c,d=a.budget.chapterTargets.get(b.id)||1200,e=bZ({chapter:a.template.chapters.find(a=>a.id===b.id)||{id:b.id,title:b.title,purpose:"",queries:[],requiredFacts:[],sections:b.sections},content:b.content,missingFacts:b.missingFacts,targetWords:d}),f=await bt(["你是章节质量审查员。只输出 JSON,不重写正文。","检查维度:章节是否围绕标题、必需事实是否覆盖、是否有占位符/提示词泄露、是否存在重复标题、是否缺少专业闭环、是否明显低于目标深度。",a.promptTexts].filter(Boolean).join("\n\n"),[`章节:${b.title}`,`目标深度:约 ${d} 字;当前 ${aT(b.content)} 字。`,a.requirement?`用户要求:${a.requirement}`:"",b.missingFacts.length?`未覆盖事实:${b.missingFacts.join("、")}`:"",e.length?`本地检查问题:${e.join(";")}`:"","章节正文:",b.content.slice(0,18e3),'请返回 JSON:{"status":"pass|warn|fail","issues":["..."],"suggestions":["..."]}'].filter(Boolean).join("\n"),!0,{maxTokens:1200,temperature:0,signal:a.signal,diagnostics:a.diagnostics});try{c=f?JSON.parse(f.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim()):void 0}catch{c=void 0}let g=[...e,...Array.isArray(c?.issues)?c.issues.filter(Boolean).slice(0,6):[]],h=c?.status==="fail"||e.some(a=>/缺失|占位|泄露|不足/u.test(a))?"fail":c?.status==="warn"||g.length>0?"warn":"pass";return{chapterId:b.id,title:b.title,status:h,issues:[...new Set(g)].slice(0,8),suggestions:Array.isArray(c?.suggestions)?c.suggestions.filter(Boolean).slice(0,5):[],chars:aT(b.content)}}))).forEach((a,c)=>{d[b+c]=a})}let e=d.filter(a=>"fail"===a.status).length,f=d.filter(a=>"warn"===a.status).length;return{summaries:d,stage:by({type:"llm_review",roleId:"chapter-review",status:e>0?"fallback":"success",message:bA(`章节级质量审查完成:通过 ${d.length-e-f} 章,警告 ${f} 章,失败 ${e} 章`,b)},{subtitle:"章节级质量审查"})}}async function ci(a){let b=Date.now(),c=a.chapters.map(b=>`- ${b.title}:${aT(b.content)} 字;审查=${a.chapterReviews.find(a=>a.chapterId===b.id)?.status||"unknown"};问题=${(a.chapterReviews.find(a=>a.chapterId===b.id)?.issues||[]).slice(0,3).join(";")||"无"}`).join("\n"),d=(await bt(["你是长文档全局一致性审查专家。只检查跨章节问题,不重写正文。","重点检查:章节之间项目信息冲突、术语不一致、重复堆砌、目录层级异常、风险/质量/安全/进度闭环缺失、前后矛盾。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文摘要:
|
|
78
78
|
${a.projectContext.slice(0,8e3)}`:"","章节审查摘要:",c,"章节摘录:",a.chapters.map(a=>`## ${a.title}
|
|
79
79
|
${a.content.slice(0,2500)}
|
|
80
80
|
...
|
|
81
|
-
${a.content.slice(-1200)}`).join("\n\n---\n\n"),"请只返回跨章节问题清单和建议,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:1800,temperature:0,signal:a.signal,diagnostics:a.diagnostics})||"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6).slice(0,10);return{issues:d,stage:
|
|
81
|
+
${a.content.slice(-1200)}`).join("\n\n---\n\n"),"请只返回跨章节问题清单和建议,不要返回全文。"].filter(Boolean).join("\n"),!1,{maxTokens:1800,temperature:0,signal:a.signal,diagnostics:a.diagnostics})||"").split("\n").map(a=>a.replace(/^[-*\d.、\s]+/u,"").trim()).filter(a=>a.length>6).slice(0,10);return{issues:d,stage:by({type:"llm_review",roleId:"global-consistency-review",status:d.length>0?"fallback":"success",message:bA(d.length>0?`全局一致性审查发现 ${d.length} 个需关注问题`:"全局一致性审查未发现明显跨章节冲突",b)},{subtitle:"全局一致性审查"})}}async function cj(a){bi(a.signal);let b=aB(aA({id:"review",title:"最终质量审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?`优化建议包:${a.spec.name}
|
|
82
82
|
建议关注事实:${a.spec.factFields.map(a=>a.name).join("、")}
|
|
83
83
|
章节内容建议:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`约${a.minWords}字`:""}`).join("、")||"以当前模板章节为准"}
|
|
84
84
|
质量提醒:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}
|
|
85
|
-
约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",d=await
|
|
86
|
-
${a.projectContext}`:"",c,"知识库证据摘要:",b,"待审查初稿:",a.markdown.slice(0,24e3),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1800,temperature:0,signal:a.signal,diagnostics:a.diagnostics});
|
|
85
|
+
约束:以上只用于质量检查,不得新增、删除、重排或重写用户/模板章节。`:"后台优化建议未生成。",d=await bv(["你是文档质量审查专家。只检查问题,不重写正文,不输出完整文档。","准确性优先级:用户需求/模板结构 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 后台内容优化建议 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","重点检查:章节完整性、资料事实内化使用、参数数字准确性、冲突事实、解析器内部对象名、表格呈现、表达专业性、导出友好性、系统提示泄露。","只返回 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?`项目上下文/历史记忆:
|
|
86
|
+
${a.projectContext}`:"",c,"知识库证据摘要:",b,"待审查初稿:",a.markdown.slice(0,24e3),"请只返回 JSON 审查结果,不要返回全文。"].filter(Boolean).join("\n"),{maxTokens:1800,temperature:0,signal:a.signal,diagnostics:a.diagnostics});bi(a.signal);let e=Array.isArray(d?.issues)?d.issues.filter(a=>a?.message).slice(0,8):[],f=e.filter(a=>"high"===a.severity).length,g=Number.isFinite(d?.score)?Math.round(Number(d.score)):void 0,h=e.length>0?e.map(a=>`${a.severity||"medium"}:${a.location||a.type||"全文"}-${a.message}`).join(";").slice(0,180):"未发现明显质量问题";return{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:f>0?"fallback":d?"success":"skipped",message:d?`已完成结构化非重写式质量审查${void 0!==g?`,评分 ${g}`:""}:${h}`:"无可用模型或审查结果不可用,保留生成初稿"}}}async function ck(a){let b=a.chapters.filter(a=>2>(a.sections?.filter(Boolean).length||0));if(0===b.length)return a.chapters;let c=await bv("你是专业文档结构规划专家。你的任务是根据用户提示词、文档需求、项目资料摘要和一级章节标题,动态规划专业二级小节。只返回 JSON。",`请为缺少二级小节的一级章节规划二级小节。
|
|
87
87
|
要求:
|
|
88
88
|
1. 只为输入的一级章节规划小节,不得新增、删除、重排一级章节。
|
|
89
89
|
2. 每章规划 3-6 个二级小节,名称必须贴合章节主题、用户提示词、需求和资料上下文。
|
|
@@ -100,31 +100,31 @@ ${a.promptTexts.slice(0,6e3)||"未提供"}
|
|
|
100
100
|
${a.projectContext.slice(0,6e3)||"未提供"}
|
|
101
101
|
|
|
102
102
|
一级章节列表:
|
|
103
|
-
${b.map((a,b)=>`${b+1}. ${a.title}`).join("\n")}`,{signal:a.signal}).catch(()=>void 0),d=new Map;for(let a of c?.chapters||[]){let b="string"==typeof a.title?a.title.trim():"",c=function(a){if(!Array.isArray(a))return[];let b=new Set;return a.filter(a=>"string"==typeof a).map(a=>a.replace(/^\s*(?:#{1,6}|[-*+]|\d+[、.)).]|[((][^))]+[))])\s*/u,"").trim()).filter(a=>a.length>=2&&a.length<=40).filter(a=>!b.has(a)&&(b.add(a),!0)).slice(0,6)}(a.sections);b&&c.length>=2&&d.set(b,c)}return a.chapters.map(a=>{if((a.sections?.filter(Boolean).length||0)>=2)return a;let b=d.get(a.title)||[];return b.length<2?a:{...a,sections:b,queries:Array.from(new Set([...a.queries||[],...b]))}})}function
|
|
104
|
-
${d.content}`)}return b.join("\n\n")}(aj),av=function(a){for(let b of a){let a=function(a,b,c){let d=[];for(let e of function(a,b){ak.lastIndex=0;let c=[...a.matchAll(ak)].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=`${ah}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],d=a.replace(/\r?\n/gu,"\n");for(let a of c)d=(d=(d=d.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return d.split(/\n|;|;/u).map(a=>(function(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${ah})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${ah})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!ai(a))}(e))d.push({id:`explicit-${b}-${d.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a};如需二级小节,应由大模型结合提示词、需求和资料上下文动态规划。`,requiredFacts:[],sections:[],queries:[a]});return d.filter(a=>!ai(a.title)).slice(0,80)}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}([{text:a.requirement,source:"用户需求"},{text:aq,source:"提示词角色",strict:!0}]),ax=av.length>=2;ax&&(m={...j,chapters:av}),
|
|
105
|
-
`;return b}(a);return{ownerNames:V(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:V(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:V(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:V(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(f),n=O.filter(a=>h[a].length>0),o=O.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.slice(0,12).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(h.scope_description.concat(h.design_specification,h.structured_data).slice(0,16).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:`范围资料:${U(h.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${U(h.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${U(h.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${U(h.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${U(h.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:O,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:O.length?n.length/O.length:1}}}(k,{requirement:a.requirement,boundFilePaths:ap.map(a=>a.filePath),boundFileRoles:function(a){let b=new Map;for(let d of a){var c;b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...(c=d.roleId,/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}))}(ap)})));by(S,bx({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(az.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:S.length})),t();let aA=await v(()=>Promise.resolve(function(a,b=""){let c=function(a,b=""){return E.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}`,F)||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 J(e,G))f.add(a);for(let c of N(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 M(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of L(c))b.add(a);let a=c.match(/(?:必须|需要|要求|一定要|务必|包含|包括|输出|写明)\s*([^。;;\n]{2,60})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&!/不要|禁止|不得|不能/u.test(a)).slice(0,30)}(b),h=function(a=""){let b=new Set;for(let c of M(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of L(c))b.add(a);let a=c.match(/(?:不要|禁止|不得|不能|不允许|严禁)(?:出现|输出|写|包含)?\s*([^。;;\n]{2,40})/iu);a&&b.add(a[1].replace(/^(这些|以下|内容|词语|文字)[::]?/u,"").trim())}return[...b].filter(a=>a&&!/章节|页|表格/u.test(a)).slice(0,30)}(b),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),j=N(a,d),k=Math.max(0,...j.map(a=>a.minTables||0)),l=Math.max(function(a=""){let b=a.match(/(?:至少|不少于)?\s*(\d{1,2})\s*(?:个|张)?\s*表格/iu);return b?Number(b[1]):/表格化|用表格|表格形式|表格表达/iu.test(a)?1:void 0}(b)||0,k)||void 0,m=a.chapters.map((a,b)=>{let c=[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]].join("\n"),d=new Set(a.requiredFacts||[]);for(let a of e)(c.includes(a)||RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"iu").test(c))&&d.add(a);for(let a of J(c,H))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(K),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),n=f.filter(a=>!m.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${K(a)}`,title:a,required:!0,order:m.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),o=[{id:"auto-source-required",name:"事实必须有来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"auto-min-source",name:"至少使用项目资料来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"min_count",min:2}},{id:"auto-no-debug-text",name:"不得输出后台流程话术",type:"forbidden_text",level:"error",value:"知识库证据",evaluator:{subject:"document",operator:"not_contains",value:"知识库证据"}},...j.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${K(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...j.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${K(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...k?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${k} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:k}}]:[],...f.map(a=>({id:`user-required-chapter-${K(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-${K(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-${K(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...l?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${l}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],p=[...m,...n];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:K(a),name:a,type:"auto",required:j.some(b=>b.requiredFacts.includes(a))||!/资源|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:p,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:o,builtIn:!0}}}(m,a.requirement||""))),aB=aA.spec,aD=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(J([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),I));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.slice(0,20).map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(m,az),aE=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:m,spec:aB,summary:az,resolvedRoles:aD});if(!aE.ready)throw Error(`生成准备度不足:${aE.blockingIssues.join(";")}`);let aF=[["## 后台项目资料摘要",az.extractedSections.projectOverview,`项目指纹:项目名候选 ${az.fingerprint.projectNames.join("、")||"无"};编号 ${az.fingerprint.documentNos.join("、")||"无"};资料组 ${az.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*az.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${az.facts.ownerNames?.join("、")||"无"};地点 ${az.facts.locationNames?.join("、")||"无"};周期 ${az.facts.scheduleValues?.join("、")||"无"};质量 ${az.facts.qualityTargets?.join("、")||"无"}。`,az.extractedSections.scopeSummary,az.extractedSections.structuredDataSummary,az.extractedSections.designSummary,az.extractedSections.scheduleQualitySafetySummary,az.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*az.coverage.materialCompletenessRate)}%`].join("\n"),(b=aA.sourceHash,`## 后台内容优化建议
|
|
103
|
+
${b.map((a,b)=>`${b+1}. ${a.title}`).join("\n")}`,{signal:a.signal}).catch(()=>void 0),d=new Map;for(let a of c?.chapters||[]){let b="string"==typeof a.title?a.title.trim():"",c=function(a){if(!Array.isArray(a))return[];let b=new Set;return a.filter(a=>"string"==typeof a).map(a=>a.replace(/^\s*(?:#{1,6}|[-*+]|\d+[、.)).]|[((][^))]+[))])\s*/u,"").trim()).filter(a=>a.length>=2&&a.length<=40).filter(a=>!b.has(a)&&(b.add(a),!0)).slice(0,6)}(a.sections);b&&c.length>=2&&d.set(b,c)}return a.chapters.map(a=>{if((a.sections?.filter(Boolean).length||0)>=2)return a;let b=d.get(a.title)||[];return b.length<2?a:{...a,sections:b,queries:Array.from(new Set([...a.queries||[],...b]))}})}function cl(a,b){let c=aT(a.content);return c<=0||b&&c<Math.floor(.95*b*.75)?"failed":"completed"}async function cm(a){var b,c,f;bi(a.signal);let j=q(a.templateId);if(!j)throw Error("Document template not found");let k=e.resolve(a.projectRoot||(0,g.aY)());if(!k)throw Error("No knowledge base project found");let l=(0,C.computeProjectId)(k),m=j,n=(0,g.Qh)(),p=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),r=[],s=[],t=(b,c=S)=>{let d=b?[...b].sort((a,b)=>{let c=s.indexOf(a.id),d=s.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)},u=Math.max(15e3,Math.min(6e4,Number(process.env.DOCUMENT_GENERATION_HEARTBEAT_MS??3e4))),v=async(b,c=S)=>{let d=setInterval(()=>{a.signal?.aborted||t(r,c)},u);try{return await b()}finally{clearInterval(d)}},w=y(m)||"none",z=(0,h.Mu)(w)?.name||w,S=[by({type:"role_binding",roleId:w,status:"running",message:`生成任务已创建,正在读取模板与角色配置:${m.name}`,details:[`当前项目:${l}`,`资料目录:${e.join(k,"knowledgeBase")}`,"正在读取文件角色和提示词角色绑定"],progress:{current:1,total:4,label:"初始化配置"}},{subtitle:z,roleName:z,order:0})];t();let aj=A(m),ap=B(m);if(bz(S,by({type:"validation",roleId:"document-preparation",status:"running",message:"正在分析模板规范、用户要求与项目资料摘要",details:["解析 OUTLINE 与模板章节","读取绑定文件清单","评估资料覆盖率与生成准备度"],progress:{current:1,total:3,label:"准备分析"}},{subtitle:"生成准备",order:S.length})),t(),0===ap.length)throw Error("模板未绑定知识库文件。模板生成文件只允许使用显式绑定的知识库文件,请先在模板中绑定需要参与生成的资料。");let aq=function(a){let b=[];for(let d of o(a)){var c;c=d.content,ak.lastIndex=0,ak.test(c)&&b.push(`## [${d.roleId}] ${d.name}
|
|
104
|
+
${d.content}`)}return b.join("\n\n")}(aj),av=function(a){for(let b of a){let a=function(a,b,c){let d=[];for(let e of function(a,b){ak.lastIndex=0;let c=[...a.matchAll(ak)].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=`${ah}`,c=[`第(?:\\d{1,3}|${b})[章节]\\s*`,`(?:\\d{1,3})[、))]\\s*`,`(?:\\d{1,3})[..]\\s+(?!\\d)`,`(?:${b})[、..))]\\s*`,`[((](?:\\d{1,3}|${b})[))]\\s*`,"[-*+]\\s+"],d=a.replace(/\r?\n/gu,"\n");for(let a of c)d=(d=(d=d.replace(RegExp(`([;;。!?!?])\\s*(?=${a})`,"gu"),"$1\n")).replace(RegExp(`(?<=\\n)\\s+(?=${a})`,"gu"),"")).replace(RegExp(`(?<![\\d..])\\s+(?=${a})`,"gu"),"\n");return d.split(/\n|;|;/u).map(a=>(function(a){let b=a.trim(),c="";for(;b!==c;)c=b,b=b.replace(RegExp(`^\\s*第(?:\\d{1,3}|${ah})[章节]\\s*`,"u"),"").replace(RegExp(`^\\s*[((]?(?:\\d{1,3}|${ah})[))、..]\\s*`,"u"),"").replace(RegExp("^\\s*[-*+]\\s+","u"),"").trim();return b.replace(/\s+/gu," ")})(a)).filter(a=>!ai(a))}(e))d.push({id:`explicit-${b}-${d.length+1}`,title:a,purpose:`按照${b}中 <OUTLINE> 块明确指定的章节生成:${a};如需二级小节,应由大模型结合提示词、需求和资料上下文动态规划。`,requiredFacts:[],sections:[],queries:[a]});return d.filter(a=>!ai(a.title)).slice(0,80)}(b.text||"",b.source,{strict:b.strict});if(a.length>=2)return a}return[]}([{text:a.requirement,source:"用户需求"},{text:aq,source:"提示词角色",strict:!0}]),ax=av.length>=2;ax&&(m={...j,chapters:av}),bz(S,by({type:"validation",roleId:"document-preparation",status:"running",message:`正在扫描 ${ap.length} 个绑定资料并生成项目摘要`,details:["读取资料清单","统计项目事实与资料角色覆盖","准备后台控制提示词"],progress:{current:2,total:5,label:"资料摘要"}},{subtitle:"生成准备",order:S.length})),t();let az=await v(()=>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(W)),e=c.filter(a=>d.has(W(a.relativePath)));if(e.length>0){let a=[...new Set(e.map(a=>X(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=X(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=>X(a.relativePath)===b[0]),reason:`需求描述定位到资料组:${b[0]}`,ambiguous:!1}}let g=[...new Set(c.map(a=>X(a.relativePath)).filter(Boolean))];return 1===g.length?{files:c.filter(a=>X(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 P)a[b]=[];return a}(),i=new Map((b?.boundFileRoles||[]).map(a=>[W(a.filePath),a.roles]));for(let a of f){let b=W(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(J(a,I));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 Q(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=T(a),d=T(b),e=R(a.map(a=>a.relativePath).join("\n").match(/\b\d{4}[A-Z]{2,}\d{4,}\b/gu)||[]),f=R(a.map(a=>X(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)).slice(0,20)}}(f,c),m=function(a){let b=function(a){let b="";for(let c of a)b+=`${c.relativePath}
|
|
105
|
+
`;return b}(a);return{ownerNames:V(b,/(?:责任主体|委托人|客户|甲方|乙方|需求方|服务方|执行方|负责人)[::]?([^\\/\n,,。;;]{2,40})/gu,1),locationNames:V(b,/(?:项目地点|实施地点|服务地点|交付地点|项目地址|执行地点)[::]?([^\\/\n,,。;;]{2,50})/gu,1),scheduleValues:V(b,/(\d+\s*(?:天|周|个月|月|年|小时)|(?:周期|期限|交付|完成)[^\\/\n,,。;;]{0,30})/gu,1),qualityTargets:V(b,/(?:质量(?:标准|目标|要求)?[::]?[^\\/\n,,。;;]{2,40}|合格|优良)/gu,0)}}(f),n=O.filter(a=>h[a].length>0),o=O.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.slice(0,12).map(a=>a.fileName.replace(/\.(?:pdf|docx?|xlsx?|xls|dwg)$/iu,"")),professionalScopes:[...new Set(h.scope_description.concat(h.design_specification,h.structured_data).slice(0,16).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:`范围资料:${U(h.scope_description,"未识别到明确范围资料")}。`,designSummary:`设计/方案/说明资料:${U(h.design_specification,"未识别到设计、方案或说明资料")}。`,structuredDataSummary:`结构化数据资料:${U(h.structured_data,"未识别到表格、列表或明细资料")}。`,scheduleQualitySafetySummary:`周期质量安全资料:${U(h.schedule_quality_safety,"未识别到周期、质量或安全专项资料")}。`,constraintsAndRisks:`约束和风险资料:${U(h.risk_constraints,"未识别到重点难点或约束资料")}。`},coverage:{requiredRoles:O,satisfiedRoles:n,missingRoles:o,materialCompletenessRate:O.length?n.length/O.length:1}}}(k,{requirement:a.requirement,boundFilePaths:ap.map(a=>a.filePath),boundFileRoles:function(a){let b=new Map;for(let d of a){var c;b.set(d.filePath,[...new Set([...b.get(d.filePath)||[],...(c=d.roleId,/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}))}(ap)})));bz(S,by({type:"validation",roleId:"document-preparation",status:"running",message:"正在生成自动文档规格并评估生成准备度",details:[`资料覆盖率线索:${Object.keys(az.materialInventory).length} 类角色`,"评估必需资料角色","生成事实字段与章节约束"],progress:{current:3,total:5,label:"规格评估"}},{subtitle:"生成准备",order:S.length})),t();let aA=await v(()=>Promise.resolve(function(a,b=""){let c=function(a,b=""){return E.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}`,F)||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 J(e,G))f.add(a);for(let c of N(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 M(a).filter(a=>/必须|需要|要求|一定要|务必|包含|包括|输出|写明/iu.test(a)&&!/章节|章|节|小节/iu.test(a))){for(let a of L(c))b.add(a);let a=c.match(/(?:必须|需要|要求|一定要|务必|包含|包括|输出|写明)\s*([^。;;\n]{2,60})/iu);a&&b.add(a[1].trim())}return[...b].filter(a=>a&&!/不要|禁止|不得|不能/u.test(a)).slice(0,30)}(b),h=function(a=""){let b=new Set;for(let c of M(a).filter(a=>/不要|禁止|不得|不能|不允许|严禁/iu.test(a))){for(let a of L(c))b.add(a);let a=c.match(/(?:不要|禁止|不得|不能|不允许|严禁)(?:出现|输出|写|包含)?\s*([^。;;\n]{2,40})/iu);a&&b.add(a[1].replace(/^(这些|以下|内容|词语|文字)[::]?/u,"").trim())}return[...b].filter(a=>a&&!/章节|页|表格/u.test(a)).slice(0,30)}(b),i=function(a=""){let b=a.match(/(?:大概|约|左右|不少于|至少|控制在|不超过|最多)?\s*(\d{1,3})\s*(?:页|page)/iu);if(!b)return;let c=Number(b[1]);if(Number.isFinite(c)&&!(c<=0))return/不少于|至少/iu.test(a)?{min:c}:/不超过|最多|以内|控制在/iu.test(a)?{max:c}:{target:c,min:Math.max(1,Math.floor(.85*c)),max:Math.ceil(1.15*c)}}(b),j=N(a,d),k=Math.max(0,...j.map(a=>a.minTables||0)),l=Math.max(function(a=""){let b=a.match(/(?:至少|不少于)?\s*(\d{1,2})\s*(?:个|张)?\s*表格/iu);return b?Number(b[1]):/表格化|用表格|表格形式|表格表达/iu.test(a)?1:void 0}(b)||0,k)||void 0,m=a.chapters.map((a,b)=>{let c=[a.title,a.purpose,...a.sections||[],...a.requiredFacts||[],...a.queries||[]].join("\n"),d=new Set(a.requiredFacts||[]);for(let a of e)(c.includes(a)||RegExp(a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"iu").test(c))&&d.add(a);for(let a of J(c,H))d.add(a);return{id:a.id,title:a.title,required:!0,order:b,minWords:900,requiredFactIds:[...d].filter(a=>e.includes(a)).map(K),requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:[a.purpose,a.sections?.length?`必须包含小节:${a.sections.join("、")}`:"",d.size?`重点覆盖事实:${[...d].join("、")}`:""].filter(Boolean).join("\n")}}),n=f.filter(a=>!m.some(b=>b.title.includes(a)||a.includes(b.title))).map((a,b)=>({id:`user-chapter-${K(a)}`,title:a,required:!0,order:m.length+b,minWords:600,requiredFactIds:[],requiredFileRoleIds:[],requiredPromptRoleIds:[],generationHint:`用户明确要求包含该章节:${a}`})),o=[{id:"auto-source-required",name:"事实必须有来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"auto-min-source",name:"至少使用项目资料来源",type:"source_required",level:"warning",evaluator:{subject:"source",operator:"min_count",min:2}},{id:"auto-no-debug-text",name:"不得输出后台流程话术",type:"forbidden_text",level:"error",value:"知识库证据",evaluator:{subject:"document",operator:"not_contains",value:"知识库证据"}},...j.flatMap(a=>a.requiredTexts.map(a=>({id:`configured-required-${K(a)}`,name:`配置建议包含:${a}`,type:"configured_required_text",level:"warning",value:a,evaluator:{subject:"document",operator:"contains",value:a}}))),...j.flatMap(a=>a.forbiddenTexts.map(a=>({id:`configured-forbidden-${K(a)}`,name:`配置建议避免:${a}`,type:"configured_forbidden_text",level:"warning",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}}))),...k?[{id:"configured-min-table-count",name:`配置建议正式表格不少于 ${k} 个`,type:"configured_table_density",level:"warning",evaluator:{subject:"table",operator:"min_count",min:k}}]:[],...f.map(a=>({id:`user-required-chapter-${K(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-${K(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-${K(a)}`,name:`用户要求不得包含:${a}`,type:"user_forbidden_text",level:"error",value:a,evaluator:{subject:"document",operator:"not_contains",value:a}})),...l?[{id:"user-min-table-count",name:`用户提到表格数量不少于 ${l}`,type:"user_format_table",level:"warning",evaluator:{subject:"table",operator:"min_count",min:l}}]:[],...i?.min?[{id:"user-min-page-count",name:`用户提到页数不少于 ${i.min}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"min_count",min:i.min}}]:[],...i?.max?[{id:"user-max-page-count",name:`用户要求页数不超过 ${i.max}`,type:"user_page_target",level:"warning",evaluator:{subject:"page",operator:"max_count",min:i.max}}]:[]],p=[...m,...n];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:K(a),name:a,type:"auto",required:j.some(b=>b.requiredFacts.includes(a))||!/资源|品牌|重点|难点|约束/iu.test(a),extractionHint:`从项目资料摘要、角色绑定证据和知识库证据中抽取“${a}”。`,validationHint:`生成内容涉及“${a}”时必须与项目资料一致,不得引入其他项目事实。`})),chapterMode:"fixed",chapterRules:p,dynamicChapterRule:{source:"ai_plan",minChapters:0,maxChapters:0,titleStrategy:"template",minWordsPerChapter:0,generationHint:`不自动规划或补充章节;仅按${d}正式文件要求提供内容完整性建议。`},gateRules:o,builtIn:!0}}}(m,a.requirement||""))),aB=aA.spec,aD=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(J([a.name,a.description,a.outputTitle,...a.chapters.flatMap(a=>[a.title,a.purpose,...a.requiredFacts||[],...a.queries||[]])].join("\n"),I));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.slice(0,20).map(a=>a.filePath),reason:f?`已匹配 ${d.length} 个资料文件`:e?"必需资料角色缺失":"可选资料角色缺失"}})}(m,az),aE=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:m,spec:aB,summary:az,resolvedRoles:aD});if(!aE.ready)throw Error(`生成准备度不足:${aE.blockingIssues.join(";")}`);let aF=[["## 后台项目资料摘要",az.extractedSections.projectOverview,`项目指纹:项目名候选 ${az.fingerprint.projectNames.join("、")||"无"};编号 ${az.fingerprint.documentNos.join("、")||"无"};资料组 ${az.fingerprint.fileGroups.join("、")||"无"};置信度 ${Math.round(100*az.fingerprint.confidence)}%。`,`内容级事实候选:责任主体 ${az.facts.ownerNames?.join("、")||"无"};地点 ${az.facts.locationNames?.join("、")||"无"};周期 ${az.facts.scheduleValues?.join("、")||"无"};质量 ${az.facts.qualityTargets?.join("、")||"无"}。`,az.extractedSections.scopeSummary,az.extractedSections.structuredDataSummary,az.extractedSections.designSummary,az.extractedSections.scheduleQualitySafetySummary,az.extractedSections.constraintsAndRisks,`资料满足率:${Math.round(100*az.coverage.materialCompletenessRate)}%`].join("\n"),(b=aA.sourceHash,`## 后台内容优化建议
|
|
106
106
|
建议包:${aB.name}
|
|
107
107
|
版本标识:${b}
|
|
108
108
|
说明:以下内容仅用于提升事实覆盖、检索命中和质量检查,不得新增、删除、重排用户或模板章节。
|
|
109
109
|
建议关注事实:${aB.factFields.map(a=>a.name).join("、")}
|
|
110
110
|
章节内容建议:${aB.chapterRules.map(a=>`${a.title}${a.generationHint?`:${a.generationHint.replace(/\s+/gu," ").slice(0,120)}`:""}`).join(";")||"以当前模板章节为准"}
|
|
111
111
|
质量提醒:${aB.gateRules.map(a=>a.name).join("、")}`),["## 后台生成准备度",`可生成:${aE.ready?"是":"否"}`,`资料覆盖率:${Math.round(100*aE.materialCoverageRate)}%`,`资料角色满足率:${Math.round(100*aE.roleSatisfactionRate)}%`,`优化建议完整度:${Math.round(100*aE.specCompletenessRate)}%`,aE.missingRoles.length?`缺失角色:${aE.missingRoles.join("、")}`:"",aE.weakRoles.length?`较弱角色:${aE.weakRoles.join("、")}`:""].filter(Boolean).join("\n")].filter(Boolean).join("\n\n"),aH=[aF,`模板配置章节结构:
|
|
112
|
-
${m.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")}`,
|
|
113
|
-
${d.content}`)),c.length>=b)break;return c}(c.chunks||[])})}return
|
|
114
|
-
${c.join("\n")}`);let d=[];for(let b of a.facts.slice(0,30))d.push(`- ${b.key}:${
|
|
115
|
-
${d.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")}(b));return c.join("\n\n")}(
|
|
112
|
+
${m.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")}`,b4(aj,["chapter_generation","formatting","reference"])].filter(Boolean).join("\n\n"),aJ=bU([aH,a.requirement||""].filter(Boolean).join("\n\n")),a$=[aF,b4(aj,["fact_extraction","reference"])].filter(Boolean).join("\n\n"),a9=[aF,b4(aj,["validation","llm_review","formatting","reference"])].filter(Boolean).join("\n\n");bz(S,by({type:"validation",roleId:"document-preparation",status:"success",message:`模板规范与资料摘要分析完成,识别 ${ap.length} 条文件角色绑定`,details:[`提示词角色:${aj.length} 个`,`文件角色:${ap.length} 个`,ax?`识别 OUTLINE 章节:${av.length} 个`:"未识别显式 OUTLINE,使用模板章节"],progress:{current:3,total:3,label:"准备完成"}},{subtitle:"生成准备",order:S.length})),t();let ba=b2(k,ap),bb=(0,h.XB)("file"),be=new Map(ap.flatMap(a=>b0(k,a.filePath).map(b=>[b,a.roleId]))),bg=new Map(ap.flatMap(a=>b0(k,a.filePath).map(b=>[b,bb.find(b=>b.id===a.roleId)?.processingType||"reference"])));bz(S,by({type:"knowledge_retrieval",roleId:"knowledge-index",status:"running",message:"正在读取已入库的模板绑定资料",details:["使用上传阶段已完成的解析、切片和索引结果","不在生成流程中重新解析或入库","准备章节证据检索范围"],progress:{current:1,total:3,label:"读取索引"}},{subtitle:"知识库检索",order:S.length})),t();let bh=await v(()=>n.getProject(k));bz(S,by({type:"knowledge_retrieval",roleId:"knowledge-index",status:"success",message:"已读取知识库索引,开始构建角色资料证据池",details:[`证据范围文件:${ba.size} 份`,"即将按角色读取资料片段"],progress:{current:3,total:3,label:"索引已就绪"}},{subtitle:"知识库检索",order:S.length})),t(),bi(a.signal);let bj=[],bk=[],bl=[],bn=[],bo=[],bp=-1,br=function(a,b,c){let d=(0,h.XB)("file"),e=(0,h.XB)("prompt"),f=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),g=function(a){let b=new Map;for(let c of o(a)){let a=b.get(c.roleId)||[];a.push(b3(c.content)),b.set(c.roleId,a)}return b}(b),i=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}(e,new Set(g.keys())),j=[];for(let a of d){if(!f.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=bL(`${a} ${c.join(" ")}`),e=bL(`${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(bL(d))&&(c+=4);return c}(d,b);for(let a of Z.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).slice(0,2);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,i,g));j.push({id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:f.get(a.id)||[],processingType:a.processingType,promptRoleIds:b.promptRoleIds,promptRoleNames:b.promptRoleNames,promptTexts:b.promptTexts,outputType:function(a,b=[]){let c=bL(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);for(let a of Z.AB)if(a.pattern.lastIndex=0,a.pattern.test(c))return a.outputType;return"reference_facts"}(a,b.promptTexts)})}return j}(0,aj,ap),bs=function(a,b,c){let d=new Map,e=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);for(let b of e.filePaths){let e=bM(c,b),f=a.getFileDetail(b);if(f&&f.chunks.length>0){d.set(e,function(a){let b=[];for(let c of(a.chunks||[]).slice(0,120))b.push({chapterId:"role-evidence-pool",filePath:a.file.relativePath,score:1,content:c.content,sectionTitle:c.sectionTitle,source:"role-node"});return b}(f));continue}d.set(e,[])}return{files:d,uniqueFileCount:d.size,bindingCount:e.bindingCount}}(bh,br,k),bt=by({type:"file_understanding",roleId:"role-evidence-pool",status:"success",message:`已构建共享资料证据池:唯一文件 ${bs.uniqueFileCount} 份,角色绑定 ${bs.bindingCount} 条`,details:[`复用绑定:${Math.max(0,bs.bindingCount-bs.uniqueFileCount)} 条`,`待执行资料理解节点:${br.length} 个`],progress:{current:bs.uniqueFileCount,total:Math.max(1,bs.bindingCount),label:"资料池"}},{subtitle:"共享资料池",order:S.length});bz(S,bt),t();let bv=[],bx=function(a,b,c){let d=[];for(let f of[...c].sort()){let c=a.getFileDetail(f)||a.getFileDetail(e.join(b,f));if(!c){d.push({filePath:f,missing:!0});continue}d.push({filePath:c.file?.relativePath||f,chunkCount:c.chunks?.length||0,chunks:function(a,b=200){let c=[];for(let d of a)if(c.push(bc(`${d.sectionTitle||""}
|
|
113
|
+
${d.content}`)),c.length>=b)break;return c}(c.chunks||[])})}return bc({type:"project-evidence-version-v1",entries:d})}(bh,k,ba),bB=bq()?.model.name,bC=b4(aj,["fact_extraction","reference","chapter_generation"]),bE=bc({fileBindings:ap,evidenceScopePaths:[...ba].sort(),activeModelName:bB,projectEvidenceVersion:bx,promptTexts:bC,materialFingerprint:az.fingerprint,materialInventory:Object.fromEntries(Object.entries(az.materialInventory).map(([a,b])=>[a,b.map(a=>({filePath:a.filePath,chunkCount:a.chunkCount}))]))}),bH=Number(process.env.DOCUMENT_ROLE_CONCURRENCY??br.length),bI=Math.max(1,Math.min(br.length||1,Number.isFinite(bH)?Math.floor(bH):br.length||1));for(let b=0;b<br.length;b+=bI){bi(a.signal);let c=br.slice(b,b+bI).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(bM(c,e))||[])d.push({...f,chapterId:b.id,roleId:b.fileRoleId,processingType:b.processingType});return ay(d,120)})(bs,c,k).filter(a=>b1(k,a.filePath,ba)),g=S.length,h=by({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:br.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});S.push(h),t();let{artifact:i,cached:j}=await v(()=>bN({template:m,node:c,evidence:f,promptTexts:bC,projectRoot:k,modelName:bB,signal:a.signal})),l=by({type:"file_understanding",roleId:c.fileRoleId,promptId:c.promptRoleIds[0],status:f.length>0?"success":"fallback",message:bA(`${c.fileRoleName} 节点已${j?"复用缓存":"完成"},产出章节建议 ${i.chapters.length} 个、事实 ${i.facts.length} 条`,e),details:[`产出章节建议:${i.chapters.length} 个`,`提取事实:${i.facts.length} 条`,j?"命中角色理解缓存":"已完成模型理解"],progress:{current:b+d+1,total:br.length,label:"资料理解"}},{subtitle:c.fileRoleName,roleName:c.fileRoleName,promptName:c.promptRoleNames.join("、")||void 0,order:g});return S[g]=l,t(),{artifact:i,evidence:f}});for(let a of(await Promise.all(c)))bk.push(...a.evidence),bv.push(a.artifact)}let bR=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 d=new Map;for(let b of c){let c=am(b.title);!(!an(b.title)||x(c,a))&&(d.has(c)||d.set(c,{...b,title:c}))}return[...d.values()]}(m,bv),bS=ar(m,aB,{preserveExplicitOutline:ax}),bT=[m.name,m.outputTitle,a.requirement,...bS.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),bY=(0,D.Hh)(bT,8,k),b7=function(a){let b=[],c=new Set;for(let d of a)for(let{key:a,patterns:e}of Z.A4)if(!b.some(b=>b.key===a))for(let f of e){let e=f.exec(d.content)?.[1]?.replace(/\s+/gu," ").trim();if(!e||/见(?:公告|文件|资料|附件)|详见|按.*要求/u.test(e))continue;let g=`${a}:${e}`;if(!c.has(g)){c.add(g),b.push({key:a,value:e.slice(0,300),sourceFile:d.filePath});break}}return b}(bv.flatMap(a=>a.evidence)),b8=[bY.length>0?bY.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",function(a,b=[]){let c=[],d=function(a){if(0===a.length)return"";let b=["## 项目基础事实候选"];for(let c of a)b.push(`- ${c.key}:${c.value}`);return b.join("\n")}(b);for(let b of(d&&c.push(d),a))c.push(function(a){let b=[`## ${a.node.fileRoleName} / ${a.node.outputType}`],c=[];for(let b of a.chapters.slice(0,18))c.push(`- ${b.title}:${b.requiredContents.join("、")||b.sourceRequirement.slice(0,120)}`);c.length>0&&b.push(`章节/要求:
|
|
114
|
+
${c.join("\n")}`);let d=[];for(let b of a.facts.slice(0,30))d.push(`- ${b.key}:${bf(b.value).slice(0,220)}(来源:${b.sourceFile},角色:${b.roleId})`);return d.length>0&&b.push(`事实:
|
|
115
|
+
${d.join("\n")}`),a.outputRequirements.length>0&&b.push(`输出要求:${a.outputRequirements.join(";")}`),b.join("\n")}(b));return c.join("\n\n")}(bv,b7)].filter(Boolean).join("\n\n").slice(0,24e3),cc=bS.filter(a=>2>(a.sections?.filter(Boolean).length||0));if(cc.length>0){bz(S,by({type:"validation",roleId:"chapter-structure-plan",status:"running",message:`正在由大模型为 ${cc.length} 个缺少二级小节的章节动态规划结构`,details:["读取提示词约束","结合项目资料摘要","生成可用于并发写作和目录展示的章节结构"],progress:{current:1,total:3,label:"结构规划"}},{subtitle:"章节结构规划",order:S.length})),t(),bS=await v(()=>ck({chapters:bS,promptTexts:aH,projectContext:b8,requirement:a.requirement,signal:a.signal})),m={...m,chapters:bS};let b=bS.filter(a=>(a.sections?.filter(Boolean).length||0)>=2).length;bz(S,by({type:"validation",roleId:"chapter-structure-plan",status:b>=bS.length?"success":b>0?"fallback":"failed",message:b>0?`章节结构规划完成,${b}/${bS.length} 个章节已获得二级小节`:"章节结构规划未返回有效小节,后续将从正文标题中提取并标记结构风险",details:bS.slice(0,8).map(a=>`${a.title}:${a.sections?.length||0} 个小节`),progress:{current:3,total:3,label:"结构规划"}},{subtitle:"章节结构规划",order:S.length})),t()}let cd=function(a){let b=a.template.generationSettings||a.template.exportSettings,c=aU(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=aV(a[2]||"");return Number.isFinite(b)?{value:b,mode:aW(a[1],a[3])}:void 0}).filter(a=>!!a).at(-1),f=d.map(a=>{let b=aV(a[2]||"");return b?{value:Math.round(b*(a[3]?1e4:1)),mode:aW(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),f=e?void 0:b?.targetPages?.target||b?.targetPages?.min,g=d.targetPages?d.targetPages*c:void 0,h=d.targetPages||f,i=e?"explicit":f?"template":a.spec?.chapterRules.some(a=>a.minWords)||a.spec?.dynamicChapterRule.minWordsPerChapter?"spec":"default",j=e?Math.max(d.targetChars||0,g||0)||void 0:Math.max((f?f*c:void 0)||0)||void 0,k=d.pageMode||"exact",l=d.charMode||k,m=e&&"approximate"===l,n=e&&"minimum"===l,o=e?h?Math.floor(h*(n?1:.9)):void 0:b?.targetPages?.min||(h?Math.floor(.95*h):void 0),p=e&&h&&!n?Math.ceil(h*(m?1.15:1.08)):b?.targetPages?.max,q=j?Math.floor(j*(n?1:.9)):o?o*c:void 0,r=j&&!n?Math.ceil(j*(m?1.15:1.08)):p?p*c:void 0,s=a.chapters.length>0?a.chapters:a.template.chapters,t=s.reduce((a,b)=>a+aX(b),0)||1,u=new Map,v=s.map(a=>({chapter:a,target:j?Math.round(j*aX(a)/t):0})),w=s.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,j?Math.min(900,Math.max(450,Math.floor(j/Math.max(1,s.length)*.35))):1200),0),x=j&&w>.92*j?Math.max(.45,.92*j/w):1;for(let{chapter:b,target:c}of v){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),j?Math.min(900,Math.max(450,Math.floor(j/Math.max(1,s.length)*.35))):1200)*x);u.set(b.id,Math.max(d,c))}return{targetPages:h,minPages:o,maxPages:p,targetChars:j,minChars:q,maxChars:r,charsPerPage:c,chapterTargets:u,source:i}}({requirement:a.requirement,promptTexts:aH,template:m,chapters:bS,spec:aB}),cm=new Map((a.resumeChapters||[]).filter(a=>a.id&&a.content?.trim()).map(a=>[a.id,a]));s=bS.map(a=>a.id);let cn=function(a){let b=a.template.chapters.length,c=b>0?a.targetWords/b:a.targetWords,d=`${a.template.name}
|
|
116
116
|
${a.template.category||""}
|
|
117
|
-
${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,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??b)));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterCache:!0,enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:i,maxSectionConcurrency:Math.max(1,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??999))),maxChapterReviewConcurrency:Math.max(1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??b))),targetLlmConcurrency:h}}({template:m,targetWords:
|
|
118
|
-
${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}:${aw(
|
|
117
|
+
${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,Math.floor(Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??b)));return{mode:e?"strict":f?"longform":g?"fast":"balanced",enableChapterCache:!0,enableChapterReview:!0,enableGlobalReview:!0,enableDocumentBudgetExpansion:!0,enableFinalQualityReview:!0,maxChapterConcurrency:i,maxSectionConcurrency:Math.max(1,Math.floor(Number(process.env.DOCUMENT_SECTION_CONCURRENCY??999))),maxChapterReviewConcurrency:Math.max(1,Math.floor(Number(process.env.DOCUMENT_CHAPTER_REVIEW_CONCURRENCY??b))),targetLlmConcurrency:h}}({template:m,targetWords:cd.targetChars||[...cd.chapterTargets.values()].reduce((a,b)=>a+b,0),requirement:a.requirement});cn.targetLlmConcurrency>0&&(c=cn.targetLlmConcurrency,void 0===bm||!Number.isFinite(c)||c<=0||(bm=Math.min(bm,Math.floor(c))));let co={strategy:cn,metrics:[],cache:{chapterHits:0,chapterMisses:0,chapterWrites:0,sectionHits:0,sectionMisses:0,sectionWrites:0,prunedItems:0,rejectedHits:0},llm:{calls:0,failures:0,throttledWaits:0,throttledWaitMs:0,maxActive:0,currentLimit:bm??0,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,reusedChapterCount:0,reusedSectionCount:0}};bG(co);let cp=cn.targetLlmConcurrency>0?`LLM 并发上限 ${cn.targetLlmConcurrency}`:"LLM 不做本地并发限流";bz(S,by({type:"validation",roleId:"document-strategy",status:"success",message:`已自动选择 ${cn.mode} 生成策略:章节缓存 ${cn.enableChapterCache?"启用":"跳过"}、章节审查 ${cn.enableChapterReview?"启用":"跳过"}、全局审查 ${cn.enableGlobalReview?"启用":"跳过"}、最终质量审查 ${cn.enableFinalQualityReview?"启用":"跳过"}、全文扩写 ${cn.enableDocumentBudgetExpansion?"启用":"跳过"};${cp}`},{subtitle:"后台自动策略"}));let cq=by({type:"context_recall",roleId:"project-memory",status:bY.length>0?"success":"skipped",message:bY.length>0?`已注入 ${bY.length} 条短期/长期上下文`:"未召回可用项目上下文"},{subtitle:"项目记忆"}),cr=ax?`;识别到 OUTLINE 章节 ${av.length} 个`:";未识别到有效 OUTLINE,将使用模板章节";bz(S,by({type:"role_binding",roleId:w,status:"success",message:`已绑定 ${ap.length} 个文件角色、${aj.length} 个提示词角色;后台优化建议关注 ${aB.factFields.length} 个事实字段;资料覆盖率 ${Math.round(100*aE.materialCoverageRate)}%${cr}`},{subtitle:z,roleName:z})),bz(S,by({type:"validation",roleId:"document-readiness",status:aE.ready?"success":"failed",message:`生成准备度:资料 ${Math.round(100*aE.materialCoverageRate)}%,资料角色 ${Math.round(100*aE.roleSatisfactionRate)}%,优化建议 ${Math.round(100*aE.specCompletenessRate)}%;${az.source.selectionReason}`},{subtitle:"生成准备度检查"})),bz(S,cq),t();let cs=Number(process.env.DOCUMENT_CHAPTER_CONCURRENCY??cn.maxChapterConcurrency),ct=Math.max(1,Math.min(cn.maxChapterConcurrency,cs));for(let b=0;b<bS.length;b+=ct){let c=bS.slice(b,b+ct);await Promise.all(c.map(async(c,d)=>{let e,f=b+d;bi(a.signal);let g=Date.now(),h=S.length;try{S.push(by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在检索证据并准备章节内容`,details:[`章节序号:${f+1}/${bS.length}`,`二级小节:${c.sections?.length||0} 个`,"正在生成检索查询"],progress:{current:f+1,total:bS.length,label:"章节生成"}},{subtitle:al(c.title),order:f})),t();let b=[],d=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(c,bR),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:[m.name,m.outputTitle,c.title],l=[...new Set([...j,...i])].filter(Boolean).slice(0,4),o=Date.now();S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在执行 ${l.length} 组知识库检索`,details:l.map(a=>`检索:${a.slice(0,42)}`),progress:{current:f+1,total:bS.length,label:"证据检索"}},{subtitle:al(c.title),order:f}),t();let q=await Promise.all(l.map(a=>bO({manager:n,projectRoot:k,query:a,evidenceScopePaths:ba,maxEvidence:p,fileRolesHash:bE,generationMode:!1})));for(let a of(co.evidence.searchQueries+=l.length,co.evidence.searchMs+=Date.now()-o,q))b.push(...a.filter(a=>b1(k,a.filePath,ba)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,roleId:be.get(a.filePath),processingType:bg.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})));let s=new Set(c.pinnedEvidenceFilePaths||[]),u=bV(bv,c,d);for(let a of(b.push(...u.flatMap(({artifact:a})=>a.evidence.filter(a=>b1(k,a.filePath,ba)).slice(0,8).map(a=>({...a,chapterId:c.id,source:"role-node"})))),new Set([...s]))){if(!b1(k,a,ba))continue;let d=s.has(a),e=bh.getFileDetail(a);if(!e)continue;let f=Math.max(p,20);b.push(...e.chunks.slice(0,f).map(a=>({chapterId:c.id,filePath:e.file.relativePath,score:1,content:a.content,roleId:be.get(e.file.relativePath),processingType:bg.get(e.file.relativePath),sectionTitle:a.sectionTitle,source:d?"pinned-evidence":"bound-file"})))}let w=b.filter(a=>b1(k,a.filePath,ba)),x=ay(w,p,co);co.evidence.contextChars+=x.reduce((a,b)=>a+b.content.length,0);let y=ay(w,120,co);bk.push(...x);let z=function(a,b=Z.dw){let c=[],d=new Set;for(let e of a)for(let a of function(a){let b=$(a);if(!b)return[];let c=[];for(let a of b.split(Z.oS)){let b=a.trim();b.length>=12&&c.push(b)}return c.length?c:[b]}(e.content)){if(!function(a){for(let b of Z.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 Z.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 f=$(a).slice(0,Z.$2),g=f.replace(Z.pL,"#").slice(0,Z.pF);if(d.has(g))continue;d.add(g);let h=function(a){for(let[b,c]of Z.lj)if(c.lastIndex=0,c.test(a))return b;return"通用领域"}(f),i=aa(f,Z.IP).slice(0,Z.xs.parameters),j=aa(f,Z.SU).slice(0,Z.xs.quantities),k=aa(f,Z.is).slice(0,Z.xs.scheduleValues),l=aa(f,Z.C2).slice(0,Z.xs.costValues),m=aa(f,Z.dB).slice(0,Z.xs.frequencyValues),n=aa(f,Z.Xm).slice(0,Z.xs.resourceValues),o=aa(f,Z.fT).slice(0,Z.xs.standards),p=ab(f,Z.qW),q=ab(f,Z.xy),r=ab(f,Z.Gw),s=ab(f,Z.UR),t=function(a){for(let b of Z.ye)if(b.match(a))return b.category;return"technical_parameter"}({text:f,parameters:i,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,standards:o,inspection:q,riskControl:s});if(c.push({id:`tech-${c.length+1}`,category:t,discipline:h,workItem:function(a,b){for(let b of Z.JA)if(a.includes(b))return b;return b}(f,h),specification:i.join("、")||void 0,parameter:i.join("、")||void 0,quantities:j,scheduleValues:k,costValues:l,frequencyValues:m,resourceValues:n,commitmentValues:[...k,...l,...m].slice(0,Z.xs.commitmentValues),process:p,qualityControl:r,inspection:q,standard:o,riskControl:s,sourceRole:e.roleId,sourceFile:e.filePath,text:f,confidence:Math.min(1,.42+.06*i.length+.05*j.length+.05*k.length+.05*l.length+.05*m.length+.07*o.length+.04*p.length+.04*q.length)}),c.length>=b)return c}return c}(y,160),A=function(a,b,c=Z.jf){let d=[];for(let c of b)(function(a,b){let c=`${b.title} ${b.purpose} ${(b.sections||[]).join(" ")} ${(b.requiredFacts||[]).join(" ")} ${(b.queries||[]).join(" ")}`;for(let b of Z.Z)if(b.pattern.lastIndex=0,b.pattern.test(c))return b.match(a);return c.includes(a.discipline)||c.includes(a.workItem)})(c,a)&&d.push(c);return d.sort((a,b)=>b.confidence-a.confidence),{chapterId:a.id,chapterTitle:a.title,facts:d.slice(0,c)}}(c,z);bj.push(A);let B=0===A.facts.length?"":["本章必须优先使用以下结构化事实。不得用空泛表述替代已列出的数量、时间、频次、资源、金额、参数、流程动作、检查验收和标准依据。","","| 序号 | 类型 | 领域 | 对象 | 参数/规格 | 数量/时间/频次/资源/金额 | 过程动作 | 检查验收 | 标准依据 | 可写入正文的事实 |","|---|---|---|---|---|---|---|---|---|---|",...A.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(Z.YT,",").slice(0,Z.dw)} |`}),"","写作要求:","- 围绕本章主题,将事实表中的对象、参数、数量、时间节点、频次、资源、金额和标准依据自然写入正文。","- 有明确资料依据的事实必须保持原值,不得改写口径或编造缺失数据。","- 对流程、方法或执行类章节,应说明适用对象、实施步骤、控制要点、检查方式和结果闭环。","- 对存在风险、约束或合规要求的事实,应写清触发条件、控制措施、责任边界和复核方式。"].join("\n"),C=function(a){let b=ad(a.facts).slice(0,Z.nl);return 0===b.length?"":["## 本章量化事实覆盖矩阵","以下对象、数量、时间、频次、资源或金额来自项目资料。正文必须逐项覆盖;同一方案涉及多个对象时,不得只写其中一项或把多个量化事实合并成一个笼统数量。","| 序号 | 对象/事项 | 量化值 | 参数/规格 | 来源角色 | 来源文件 | 原始事实 |","|---|---|---|---|---|---|---|",...b.map((a,b)=>{let c=[...a.quantities||[],...a.scheduleValues||[],...a.frequencyValues||[],...a.resourceValues||[],...a.costValues||[]].join("、");return`| ${b+1} | ${ac(a)} | ${c} | ${a.parameter||a.specification||""} | ${a.sourceRole||""} | ${a.sourceFile||""} | ${a.text.replace(Z.YT,",").slice(0,Z.pF)} |`}),"","覆盖要求:","- 日期、数量、规格、资源数量和时间节点只能使用资料中的值或由资料明确推导的值;没有依据时不得编造。","- 如果同一方案适用于多个对象、区域、阶段或类别,应使用表格或分项段落分别说明适用范围、量化事实和控制要点。","- 资料中存在多个来源值或口径不一致时,应保持审慎表述并提示需按资料优先级复核,不得随意选择一个数值。"].join("\n")}(A),D=c.requiredFacts.filter(a=>!x.some(b=>as(b,a)));for(let a of(0===x.length&&bl.push(`${c.title}:未检索到明确资料依据`),D))bl.push(`${c.title}:${a} 未检索到明确依据`);let E=by({type:"knowledge_retrieval",roleId:"knowledge-base",status:bk.length>0?"success":"fallback",message:`已检索/绑定 ${bk.length} 条证据`});bp<0?bp=bz(S,E):S[bp]={...E,order:S[bp]?.order??E.order},t(),bi(a.signal);let F=bW(bv,m),G=function(a,b,c){let d=bV(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?`要求项:
|
|
118
|
+
${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}:${aw(bf(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
|
|
119
119
|
${b.slice(0,18).map(a=>a.replace(ag,"").replace(af,"")).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
|
|
120
120
|
${e}`:"",g?`【角色节点结构化产物】
|
|
121
|
-
${g}`:""].filter(Boolean).join("\n\n")}(
|
|
121
|
+
${g}`:""].filter(Boolean).join("\n\n")}(bv,c,d),H=b7.filter(a=>b1(k,a.sourceFile,ba)),I=function(a,b,c){if(0===a.length||c.explicitStructure||c.explicitSections||c.lengthLimit||c.wantsConcise||c.detailedInstructions||c.explicitFacts||c.styleConstraint)return"";let d=[b.title,b.purpose,...b.sections||[],...b.queries||[]].join("\n"),e=a.filter(a=>{let b=Z.A4.find(b=>b.key===a.key);return!b||b.chapterHint.test(d)||/概况|总述|说明|背景/u.test(d)});return 0===e.length?"":["## 项目基础事实候选","以下事实来自已进入本章证据范围的绑定资料,仅在与本章主题相关时自然吸收进正文;不得新增章节、不得强制生成表格、不得输出本提示标题。",...e.slice(0,12).map(a=>`- ${a.key}:${a.value}`)].join("\n")}(H,c,aJ),J=function(a){let b=a.spec?.chapterRules.find(b=>b.id===a.chapter.id||b.title===a.chapter.title),c=(b?.requiredFactIds||[]).map(b=>a.spec?.factFields.find(a=>a.id===b)?.name).filter(Boolean),d=[...new Set([...a.chapter.requiredFacts,...c,...a.plan?.requiredContents||[],...a.plan?.evidenceNeeds||[]].filter(Boolean))].slice(0,18),e=a.roleFacts.slice(0,10).map(({fact:a})=>`- ${a.key}:${aw(bf(a.value)).slice(0,180)}`),f=a.technicalFactAssignment.facts.slice(0,14).map(a=>{let b=[...a.quantities||[],...a.scheduleValues||[],...a.resourceValues||[],...a.standard||[],a.parameter||"",a.specification||""].filter(Boolean).slice(0,6).join("、");return`- ${[a.discipline,a.workItem].filter(Boolean).join("/")||a.text.slice(0,40)}${b?`:${b}`:""}`}),g=a.projectBasicFacts.slice(0,8).map(a=>`- ${a.key}:${a.value}`),h=new Set(a.evidence.map(a=>a.filePath)).size;return["【本章事实覆盖反馈】",d.length?`必须优先覆盖的事实/要求:
|
|
122
122
|
${d.map(a=>`- ${a}`).join("\n")}`:"",e.length?`角色节点已抽取事实:
|
|
123
123
|
${e.join("\n")}`:"",f.length?`结构化/量化事实:
|
|
124
124
|
${f.join("\n")}`:"",g.length?`项目基础事实:
|
|
125
|
-
${g.join("\n")}`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。如资料未明确提供,不得编造具体数值,应写成需要复核的条件、假设或处理措施。`:"",`本章可用资料来源约 ${h} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:aB,roleFacts:u,technicalFactAssignment:A,projectBasicFacts:H,evidence:x,missingFacts:D}),K=aB?.chapterRules.find(a=>a.id===c.id||a.title===c.title),L=
|
|
125
|
+
${g.join("\n")}`:"",a.missingFacts.length?`当前检索未充分命中的事实:${a.missingFacts.join("、")}。如资料未明确提供,不得编造具体数值,应写成需要复核的条件、假设或处理措施。`:"",`本章可用资料来源约 ${h} 个文件,正文必须把可用事实内化到对应小节,不得单列后台资料清单。`].filter(Boolean).join("\n")}({chapter:c,plan:d,spec:aB,roleFacts:u,technicalFactAssignment:A,projectBasicFacts:H,evidence:x,missingFacts:D}),K=aB?.chapterRules.find(a=>a.id===c.id||a.title===c.title),L=cd.chapterTargets.get(c.id)||1200,M=Math.ceil(L*(cd.maxChars?1.1:1.18)),N=cd.targetChars?Math.min(1200,Math.max(450,Math.floor(.72*L))):1200,O=Math.max(d?.minWords||0,K?.minWords||0,aB?.dynamicChapterRule.minWordsPerChapter||0,Math.floor(.78*L),N),P=cm.get(c.id);if(P){let a=bZ({chapter:c,content:P.content,missingFacts:D,targetWords:L});if(0===bQ(a).length){let a=aT(P.content),b={...P,title:c.title,evidence:P.evidence?.length?P.evidence:x,missingFacts:D,sections:P.sections?.length?P.sections:c.sections||aI(P.content)};r.push(b),t(r),co.cache.chapterHits+=1,co.quality.reusedChapterCount+=1;let d=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:bA(`${al(c.title)} 已复用上次完成章节:当前 ${a} 字 / 目标 ${Math.floor(.95*L)} 字`,g)},{subtitle:al(c.title),order:f});bo.push(d),S[h]=d,t(r);return}co.cache.rejectedHits+=1}let Q={template:m,chapter:c,evidence:x,missingFacts:D,promptTexts:aH,requirement:a.requirement,projectRoot:k,modelName:bB,targetWords:L,fileRolesHash:bE},R=cn.enableChapterCache?function(a,b){bG(b);let c=bP(a),d=bD.get(c),e=d?.value||bJ(a.projectRoot,"chapter-draft",c);if(!e){b&&(b.cache.chapterMisses+=1);return}if(e.id!==a.chapter.id||!e.content?.trim()||bQ(bZ({chapter:a.chapter,content:e.content,missingFacts:e.missingFacts||a.missingFacts,targetWords:a.targetWords})).length>0){b&&(b.cache.rejectedHits+=1);return}return d&&(d.hits+=1),bd(bD,c,{value:e,updatedAt:Date.now(),hits:(d?.hits||0)+1}),b&&(b.cache.chapterHits+=1),e}(Q,co):void 0;if(R){let a=aT(R.content),b=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"success",message:bA(`${al(c.title)} 已复用章节缓存:当前 ${a} 字 / 目标 ${Math.floor(.95*L)} 字`,g)},{subtitle:al(c.title),order:f});bo.push(b),r.push(R),S[h]=b,t(r);return}let T=ca(O,L),U=(c.sections?.filter(Boolean).length||0)>=2;S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在${U?"按二级小节并发生成":"整章生成"}正文`,details:[`有效证据:${x.length} 条`,`目标字数:约 ${L} 字,上限约 ${M} 字`,`章节并发上限:${ct}`,U?`小节并发上限:${cn.maxSectionConcurrency},规划小节:${c.sections?.length||0} 个`:"未启用小节并发,使用整章生成"],progress:{current:f+1,total:bS.length,label:"正文生成"}},{subtitle:al(c.title),order:f}),t();let V=await v(()=>bF(co,`chapter-draft:${c.id}`,()=>bu(b=>b9({template:m,chapter:c,evidence:x,missingFacts:D,promptTexts:aH,projectContext:b8,requirement:a.requirement,roleContext:G,targetWords:L,maxWords:M,forbidDrawingImages:F,factCoverageContext:J,projectRoot:k,modelName:bB,fileRolesHash:bE,allowPartialResult:!0,maxSectionConcurrency:cn.maxSectionConcurrency,diagnostics:co,signal:b,onSectionProgress:a=>{S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在生成二级小节:${a.completed}/${a.total}${a.sectionTitle?`,当前:${a.sectionTitle}`:""}`,details:[`章节并发:${ct}`,`小节并发:${cn.maxSectionConcurrency}`,`阶段:${"retry"===a.phase?"重试":"complete"===a.phase?"完成":"生成中"}`],progress:{current:a.completed,total:a.total,label:"小节生成"}},{subtitle:al(c.title),order:f}),t(r)}}),cb(L),a.signal)));if(V||(S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 小节生成未完整返回,正在执行整章兜底生成`,details:[`目标字数:约 ${L} 字`,`有效证据:${x.length} 条`],progress:{current:f+1,total:bS.length,label:"整章兜底"}},{subtitle:al(c.title),order:f}),t(r),V=await v(()=>bF(co,`chapter-draft-fallback:${c.id}`,()=>bu(b=>b6(m,c,x,D,aH,b8,a.requirement,G,{forbidDrawingImages:F,minWords:O,targetWords:L,maxWords:M,maxTokens:T,technicalFactContext:B,coverageMatrixContext:C,projectBasicFactContext:I,factCoverageContext:J,signal:b}),cb(L),a.signal)))),bi(a.signal),!V){let b=x.slice(0,80),d=G.slice(0,12e3);S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在执行紧凑兜底生成`,details:["已压缩证据与上下文",`目标字数:约 ${L} 字`],progress:{current:f+1,total:bS.length,label:"紧凑兜底"}},{subtitle:al(c.title),order:f}),t(r),V=await v(()=>bF(co,`chapter-draft-compact-fallback:${c.id}`,()=>bu(e=>b6(m,c,b,D,aH,b8,a.requirement,d,{forbidDrawingImages:F,minWords:Math.max(450,Math.floor(.75*O)),targetWords:L,maxWords:M,maxTokens:T,technicalFactContext:B.slice(0,12e3),coverageMatrixContext:C.slice(0,8e3),projectBasicFactContext:I.slice(0,8e3),factCoverageContext:J.slice(0,1e4),signal:e}),cb(L),a.signal)))}if(bi(a.signal),!V)throw Error(`${c.title} 大模型未返回有效章节正文`);let W=V;S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在检查并补写短小节`,details:[`目标字数:约 ${L} 字`,`规划小节:${c.sections?.length||0} 个`],progress:{current:f+1,total:bS.length,label:"小节补写"}},{subtitle:al(c.title),order:f}),t(r),V=await v(()=>bF(co,`chapter-supplement:${c.id}`,()=>ce({template:m,chapter:c,content:W,evidence:x,missingFacts:D,promptTexts:aH,projectContext:b8,requirement:a.requirement,roleContext:G,targetWords:L,maxWords:M,forbidDrawingImages:F,factCoverageContext:J,maxSectionConcurrency:cn.maxSectionConcurrency,signal:a.signal})));let X=bZ({chapter:c,content:V,missingFacts:D,targetWords:L}),Y=a_(X);co.quality.blockingCount+=Y.blocking,co.quality.importantCount+=Y.important,co.quality.minorCount+=Y.minor;let _=bQ(X);if(_.length>0){let b=V;S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在根据质量问题修复章节`,details:_.slice(0,5),progress:{current:f+1,total:bS.length,label:"章节修复"}},{subtitle:al(c.title),order:f}),t(r);let d=await v(()=>bF(co,`chapter-repair:${c.id}`,()=>b$({template:m,chapter:{id:c.id,title:c.title,content:b,evidence:x,missingFacts:D,sections:c.sections||[]},issues:_.slice(0,3),promptTexts:aH,requirement:a.requirement,forbidDrawingImages:F,diagnostics:co,signal:a.signal})));V=d.content,d.appliedCount>0&&(co.quality.repairedCount+=1),bi(a.signal)}S[h]=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:"running",message:`${al(c.title)} 正在按目标字数扩写和定稿`,details:[`当前目标:${Math.floor(.95*L)} 字`,`章节并发:${ct}`],progress:{current:f+1,total:bS.length,label:"章节扩写"}},{subtitle:al(c.title),order:f}),t(r);let ae=V||`## ${c.title}
|
|
126
126
|
|
|
127
|
-
本章节生成失败,缺少可用于定稿的正文。`,_=await v(()=>bE(cn,`chapter-expand:${c.id}`,()=>ce({template:m,chapter:c,content:Y,evidence:x,promptTexts:aH,requirement:a.requirement,roleContext:G,targetChars:Math.floor(.95*L),forbidDrawingImages:F,maxTokens:Q,signal:a.signal}))),ae=_.content,ah=aT(ae),ai=c.sections?.length?c.sections:aI(ae),ak=bY({chapter:{...c,sections:ai},content:ae,missingFacts:D,targetWords:L}),am=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"}(ah,L,ak);e=bx({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:am,message:bz(`${al(c.title)} 已由大模型生成${_.rounds>0?`并扩写 ${_.rounds} 轮`:""}:当前 ${ah} 字 / 目标 ${Math.floor(.95*L)} 字${"success"!==am?`;风险:${ak.join("、")||"篇幅未达标"}`:""}`,g),details:[`达标率:${Math.round(ah/Math.max(1,Math.floor(.95*L))*100)}%`,`二级小节:${ai.length} 个`,`扩写轮次:${_.rounds}`],progress:{current:f+1,total:bR.length,label:"success"===am?"章节达标":"章节风险"}},{subtitle:al(c.title),order:f}),bn.push(e);let an={id:c.id,title:c.title,content:ae,evidence:x,missingFacts:D,sections:ai};r.push(an),t(r);let ao=bY({chapter:c,content:ae,missingFacts:D,targetWords:L}),ap=a$(ao);cn.quality.blockingCount+=ap.blocking,cn.quality.importantCount+=ap.important,cn.quality.minorCount+=ap.minor,cm.enableChapterCache&&0===bP(ao).length&&function(a,b,c){let d=bO(a);bc(bC,d,{value:b,updatedAt:Date.now(),hits:0}),bJ(a.projectRoot,"chapter-draft",d,b),c&&(c.cache.chapterWrites+=1),bF(c)}(O,an,cn)}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),bm.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),bn.push(bx({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${al(c.title)} 生成失败`},{subtitle:al(c.title),order:f}))}e&&(S[h]=e),t(r)}))}if(r.sort((a,b)=>bR.findIndex(b=>b.id===a.id)-bR.findIndex(a=>a.id===b.id)),bi.sort((a,b)=>bR.findIndex(b=>b.id===a.chapterId)-bR.findIndex(a=>a.id===b.chapterId)),0===r.length)throw Error(`章节生成未完成:${bm.slice(0,6).join(";")||"没有生成任何有效章节"}`);if(ax&&r.length<bR.length)throw Error(`OUTLINE 指定 ${bR.length} 章,实际只生成 ${r.length} 章:${bm.slice(0,6).join(";")||"部分章节未生成"}`);bh(a.signal);let ct={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{ct=await b4(k,bj,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bh(a.signal),ct.notes))bj.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let cu=function(a,b,c){let d={};for(let e of at(a,c)){let a=b.find(a=>au(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(m,bj,aB);for(let a of bu)for(let b of a.facts)cu[b.key]=`${be(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cv=function(a,b,c){let d=at(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(!au(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(bj,m,aB),cw=bu.flatMap(a=>a.facts.map(a=>({key:a.key,value:be(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cx=b6.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),cy={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=at(b,c).filter(a=>a.required).slice(0,30);return 0===d.length?a.filter(a=>a.confidence>=.75&&be(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=be(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}([...cx,...cw,...cv],m,aB))try{cy=await bv(bj,aZ,m,aB,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bh(a.signal);let cz=[...cx,...cw,...cv,...cy.facts];for(let a of(by(S,ct.stage),cy.stages))by(S,a);t();let cA=function(a){let b=[],c=new Set;for(let f of a.filter(a=>"table"===a.processingType)){if(c.has(f.filePath))continue;c.add(f.filePath);let a=(0,g.aY)(),h=e.isAbsolute(f.filePath)?f.filePath:d.existsSync(e.join(a,"knowledgeBase",f.filePath))?e.join(a,"knowledgeBase",f.filePath):e.join(a,f.filePath),i=e.extname(f.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=a7.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=a7.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let g=e.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=e[g].filter(Boolean),i=e.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:f.roleId||"table",sheet:c,headers:h,rows:i.slice(0,200),sourceFile:f.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=f.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",l=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);l.length<2||b.push({tableType:f.roleId||"table",headers:l[0],rows:l.slice(1,80),sourceFile:f.filePath,sourceRange:f.sectionTitle})}return b}(bj),cB=bj.filter(a=>"pinned-evidence"===a.source).length,cC=bj.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cD=bx({type:"reference",roleId:"quality-enhancement",status:bj.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${bj.length} 条,人工确认/固定证据 ${cB} 条,项目上下文 ${bX.length} 条,自动检索证据 ${cC} 条`},{subtitle:"证据与上下文增强"});for(let a of(S.push(cD),t(),cz))cu[a.key]=`${be(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cE=new Map;for(let a of bj)cE.set(a.filePath,(cE.get(a.filePath)??0)+1);let cF=[...cE.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cG=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))],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=be(a.value).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(cz,cA,bk,aB),cH=r.map(a=>{let b=aB.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=[...new Set([...a.missingFacts||[],...b?.requiredFactIds||[]].filter(Boolean))],d=c.filter(b=>!a.missingFacts.includes(b)),e=c.filter(b=>a.missingFacts.includes(b)),f=+(a.evidence.length>0),g=c.length?d.length/c.length:1;return{chapterId:a.id,title:a.title,requiredFacts:c,coveredFacts:d,missingFacts:e,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*g+.3*f)}}),cI=function(a,b=[],c){let d=[],e=[];for(let b of a)0===b.evidence.length&&d.push(`${b.title} 未检索到资料证据`),b.content.length<80&&d.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&e.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===A(c).length&&e.push("模板未绑定任何提示词");let f=new Set(b.map(a=>a.roleId));for(let a of["project_fact","rule"])c?.fileBindings?.some(b=>b.roleId===a)&&!f.has(a)&&d.push(`${a} 角色未抽取到结构化事实`);return{passed:0===e.length,warnings:d,errors:e}}(r,cz,m);cI.warnings.push(...aE.warnings),cI.errors.push(...aE.blockingIssues);let cJ=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"error",message:a}))),d}(cI,cG,r);cJ.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}(cH));let cK=bV(bu,m),cL=Date.now(),cM=aT(r.map(a=>a.content).join("\n\n"));by(S,bx({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cM} 字`,details:[`章节数:${r.length}`,`目标:${cc.targetChars||cc.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),t(r);let cN=cm.enableDocumentBudgetExpansion?await v(()=>cf({template:m,chapters:r,budget:cc,promptTexts:aH,requirement:a.requirement,forbidDrawingImages:cK,signal:a.signal})):r;r.splice(0,r.length,...cN);let cO=aX(cc,r.map(a=>a.content).join("\n\n")),cP=[cc.targetChars?`目标 ${cc.targetChars} 字`:void 0,cc.targetPages?`目标 ${cc.targetPages} 页`:void 0].filter(Boolean).join(" / ")||"默认章节深度";by(S,bx({type:"validation",roleId:"document-budget",status:cc.minChars&&cO.currentChars<cc.minChars?"fallback":"success",message:bz(`文档预算:当前 ${cO.currentChars} 字,新增 ${Math.max(0,cO.currentChars-cM)} 字,预计 ${cO.estimatedPages} 页;${cP}`,cL)},{subtitle:"文档预算"})),t(r);let cQ=bn.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cR=bn.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cQ>0&&cJ.push({level:"error",message:`章节生成存在兜底:${cQ} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),cR>0&&cJ.push({level:"warning",message:`部分章节生成失败:${cR} 章`,suggestion:bm.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cS=cJ.filter(a=>"error"===a.level&&aY(a)).length,cT=[...S];by(cT,bx({type:"validation",roleId:"document-workflow",status:cS>0?"failed":"success",message:`阻断 ${cS},错误 ${cI.errors.length},警告 ${cI.warnings.length}`},{subtitle:"最终规范校验"})),by(cT,bx({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),by(cT,bx({type:"export_ready",roleId:"document-workflow",status:cS>0?"fallback":"success",message:cS>0?"导出存在风险项,仍可导出,请人工复核":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cU={templateId:m.id,templateName:m.name,title:m.outputTitle,requirement:a.requirement||"",projectRoot:k,projectId:l,exportSettings:m.exportSettings,generationSettings:m.generationSettings,facts:cu,structuredFacts:cz,factsModel:cG,chapters:r,sources:cF,missingItems:[...new Set(bk)],validation:cI,validationIssues:cJ,executionStages:cT,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],partialChapters:r.map(a=>({id:a.id,title:a.title,chars:aT(a.content),status:ck(a,cc.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:r,generatedAt:Date.now()},cV=aR(cU);bh(a.signal),by(cT,bx({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${r.length} 章`,details:[`审查并发:${cm.maxChapterReviewConcurrency}`,"检查事实覆盖、结构完整性和篇幅达标"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),t(r,cT);let cW=cm.enableChapterReview?await v(()=>bE(cn,"chapter-review",()=>cg({template:m,chapters:r,budget:cc,promptTexts:a8||aH,requirement:a.requirement,strategy:cm,diagnostics:cn,signal:a.signal}),{chapters:r.length}),cT):{summaries:r.map(a=>({chapterId:a.id,title:a.title,status:"pass",issues:[],suggestions:[],chars:aT(a.content)})),stage:bx({type:"llm_review",roleId:"chapter-review",status:"skipped",message:"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};for(let a of(cT.push(cW.stage),cW.summaries.filter(a=>"pass"!==a.status)))cJ.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:${a.issues.slice(0,4).join(";")||"存在质量风险"}`,suggestion:a.suggestions.slice(0,3).join(";")||"请复核章节事实覆盖、结构完整性和专业闭环。"});by(cT,bx({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["检查跨章节术语、项目参数、范围边界和闭环关系"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),t(r,cT);let cX=cm.enableGlobalReview?await v(()=>bE(cn,"global-consistency-review",()=>ch({template:m,chapters:r,chapterReviews:cW.summaries,promptTexts:a8||aH,requirement:a.requirement,projectContext:b7,diagnostics:cn,signal:a.signal}),{chapters:r.length}),cT):{issues:[],stage:bx({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:"当前策略未启用全局 LLM 一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cT.push(cX.stage),cX.issues))cJ.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、项目参数、范围边界和闭环关系。"});t(r,cT);let cY=r.filter(a=>0===a.evidence.length||a.missingFacts.length>0||aT(a.content)<Math.floor(.7*(cc.chapterTargets.get(a.id)||1200))||cW.summaries.some(b=>b.chapterId===a.id&&"pass"!==b.status)||bY({chapter:bR.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:cc.chapterTargets.get(a.id)||1200}).length>0),cZ=cS>0||cX.issues.length>0||cW.summaries.some(a=>"fail"===a.status)||cJ.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c$=cm.enableFinalQualityReview&&(cZ||cY.length>Math.max(3,Math.floor(.35*r.length))),c_=Date.now();c$&&(by(cT,bx({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${cY.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),t(r,cT));let c0=c$?await v(()=>ci({template:m,spec:aB,markdown:cV,evidence:bj,promptTexts:a8||aH,projectContext:b7,requirement:a.requirement,diagnostics:cn,signal:a.signal}),cT):{markdown:cV,stage:{type:"llm_review",roleId:"llm-review",status:cY.length>0?"skipped":"success",message:cY.length>0?`本地风险扫描发现 ${cY.length} 个低/中风险章节,当前策略未启用最终质量审查`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};c0.stage.message=bz(c0.stage.message||"LLM 审查完成",c_),bh(a.signal);let c1=aK(aC(c0.markdown===cV?aR({...cU,validationIssues:cJ,exportGate:cU.exportGate,executionStages:cT}):c0.markdown,cK)),c2=aQ(c1,m).map(a=>a.message),c3=a5(c1).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c4=a6(c1,m).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c5=a4(c1,cG).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c6=ae({assignments:bi,markdown:c1}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c7=a3(c1).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c8=a0(c1).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c9=a1(c1).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),da=a2(r).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),db=aL(c1).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dc=[...bW(c1,r,bQ,bu,cK),...c2,...c3,...c4,...c5,...c6,...c7,...c8,...c9,...da,...db],dd=Date.now();by(cT,bx({type:"llm_review",roleId:"quality-repair",status:dc.length>0?"running":"success",message:dc.length>0?`正在进行精准质量修复:${dc.length} 个问题`:"未发现需要精准修复的问题",details:dc.slice(0,6),progress:{current:1,total:Math.max(1,dc.length),label:"质量修复"}},{subtitle:"精准质量修复"})),t(r,cT);let de=await v(()=>bE(cn,"local-patch-quality-repair",()=>b$({markdown:c1,template:m,chapters:r,promptTexts:aH,requirement:a.requirement,issues:dc,forbidDrawingImages:cK,strategy:cm,diagnostics:cn,signal:a.signal}),{issues:dc.length}),cT);de.stage&&(de.stage.message=bz(de.stage.message||"质量修复完成",dd)),bh(a.signal);let df=de.stage?[...cT,c0.stage,de.stage]:[...cT,c0.stage],dg=de.chapters,dh=aX(cc,dg.map(a=>a.content).join("\n\n"));if(cm.enableDocumentBudgetExpansion&&cc.minChars&&dh.currentChars<Math.floor(.9*cc.minChars)){let b=Date.now(),c=dh.currentChars;by(df,bx({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${cc.minChars} 字`,`章节数:${dg.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),t(dg,df),dg=await v(()=>cf({template:m,chapters:dg,budget:cc,promptTexts:aH,requirement:a.requirement,forbidDrawingImages:cK,signal:a.signal}),df);let d=aX(cc,dg.map(a=>a.content).join("\n\n"));by(df,bx({type:"validation",roleId:"document-budget-repair",status:cc.minChars&&d.currentChars<cc.minChars?"fallback":"success",message:bz(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let di=aR({...cU,chapters:dg,validationIssues:cJ,exportGate:cU.exportGate,executionStages:cT}),dj=function(a,b){let c=aO(aN(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${aP(ao(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=aI(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(di,dg),dk=dg.map((a,b)=>({...a,sections:dj[b]||a.sections||[]})),dl=aK(aG(function(a,b){let c=aO(a,b),d=aM(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)}
|
|
127
|
+
本章节生成失败,缺少可用于定稿的正文。`,ah=await v(()=>bF(co,`chapter-expand:${c.id}`,()=>cf({template:m,chapter:c,content:ae,evidence:x,promptTexts:aH,requirement:a.requirement,roleContext:G,targetChars:Math.floor(.95*L),maxChars:M,forbidDrawingImages:F,maxTokens:T,signal:a.signal}))),ai=ah.content,ak=aT(ai),am=c.sections?.length?c.sections:aI(ai),an=bZ({chapter:{...c,sections:am},content:ai,missingFacts:D,targetWords:L}),ao=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"}(ak,L,an);e=by({type:"chapter_generation",roleId:"chapter_generation",promptId:aj.find(a=>"chapter_generation"===a.roleId)?.promptId,status:ao,message:bA(`${al(c.title)} 已由大模型生成${ah.rounds>0?`并扩写 ${ah.rounds} 轮`:""}:当前 ${ak} 字 / 目标 ${Math.floor(.95*L)} 字${"success"!==ao?`;风险:${an.join("、")||"篇幅未达标"}`:""}`,g),details:[`达标率:${Math.round(ak/Math.max(1,Math.floor(.95*L))*100)}%`,`二级小节:${am.length} 个`,`扩写轮次:${ah.rounds}`],progress:{current:f+1,total:bS.length,label:"success"===ao?"章节达标":"章节风险"}},{subtitle:al(c.title),order:f}),bo.push(e);let ap={id:c.id,title:c.title,content:ai,evidence:x,missingFacts:D,sections:am};r.push(ap),t(r);let aq=bZ({chapter:c,content:ai,missingFacts:D,targetWords:L}),ar=a_(aq);co.quality.blockingCount+=ar.blocking,co.quality.importantCount+=ar.important,co.quality.minorCount+=ar.minor,cn.enableChapterCache&&0===bQ(aq).length&&function(a,b,c){let d=bP(a);bd(bD,d,{value:b,updatedAt:Date.now(),hits:0}),bK(a.projectRoot,"chapter-draft",d,b),c&&(c.cache.chapterWrites+=1),bG(c)}(Q,ap,co)}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${c.title} failed:`,b),bn.push(`${c.title}:${b instanceof Error?b.message:"生成失败"}`),bo.push(by({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${al(c.title)} 生成失败`},{subtitle:al(c.title),order:f}))}e&&(S[h]=e),t(r)}))}if(r.sort((a,b)=>bS.findIndex(b=>b.id===a.id)-bS.findIndex(a=>a.id===b.id)),bj.sort((a,b)=>bS.findIndex(b=>b.id===a.chapterId)-bS.findIndex(a=>a.id===b.chapterId)),0===r.length)throw Error(`章节生成未完成:${bn.slice(0,6).join(";")||"没有生成任何有效章节"}`);if(ax&&r.length<bS.length)throw Error(`OUTLINE 指定 ${bS.length} 章,实际只生成 ${r.length} 章:${bn.slice(0,6).join(";")||"部分章节未生成"}`);bi(a.signal);let cu={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{cu=await b5(k,bk,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(bi(a.signal),cu.notes))bk.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let cv=function(a,b,c){let d={};for(let e of at(a,c)){let a=b.find(a=>au(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(m,bk,aB);for(let a of bv)for(let b of a.facts)cv[b.key]=`${bf(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let cw=function(a,b,c){let d=at(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(!au(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(bk,m,aB),cx=bv.flatMap(a=>a.facts.map(a=>({key:a.key,value:bf(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),cy=b7.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:"project_basic_fact",confidence:.85})),cz={facts:[],stages:[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"已有本地/角色事实覆盖主要必需字段,跳过 LLM 全量事实抽取"}]};if(function(a,b,c){let d=at(b,c).filter(a=>a.required).slice(0,30);return 0===d.length?a.filter(a=>a.confidence>=.75&&bf(a.value).trim().length>=2).length<12:d.filter(b=>a.some(a=>(function(a,b){let c=bf(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}([...cy,...cx,...cw],m,aB))try{cz=await bw(bk,a$,m,aB,a.signal)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}bi(a.signal);let cA=[...cy,...cx,...cw,...cz.facts];for(let a of(bz(S,cu.stage),cz.stages))bz(S,a);t();let cB=function(a){let b=[],c=new Set;for(let f of a.filter(a=>"table"===a.processingType)){if(c.has(f.filePath))continue;c.add(f.filePath);let a=(0,g.aY)(),h=e.isAbsolute(f.filePath)?f.filePath:d.existsSync(e.join(a,"knowledgeBase",f.filePath))?e.join(a,"knowledgeBase",f.filePath):e.join(a,f.filePath),i=e.extname(f.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=a8.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=a8.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let g=e.findIndex(a=>a.filter(Boolean).length>=2);if(g<0)continue;let h=e[g].filter(Boolean),i=e.slice(g+1).map(a=>a.slice(0,h.length)).filter(a=>a.some(Boolean));0!==i.length&&b.push({tableType:f.roleId||"table",sheet:c,headers:h,rows:i.slice(0,200),sourceFile:f.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=f.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",l=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);l.length<2||b.push({tableType:f.roleId||"table",headers:l[0],rows:l.slice(1,80),sourceFile:f.filePath,sourceRange:f.sectionTitle})}return b}(bk),cC=bk.filter(a=>"pinned-evidence"===a.source).length,cD=bk.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,cE=by({type:"reference",roleId:"quality-enhancement",status:bk.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${bk.length} 条,人工确认/固定证据 ${cC} 条,项目上下文 ${bY.length} 条,自动检索证据 ${cD} 条`},{subtitle:"证据与上下文增强"});for(let a of(S.push(cE),t(),cA))cv[a.key]=`${bf(a.value)}(来源:${a.sourceFile},角色:${a.roleId})`;let cF=new Map;for(let a of bk)cF.set(a.filePath,(cF.get(a.filePath)??0)+1);let cG=[...cF.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),cH=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))],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=bf(a.value).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(cA,cB,bl,aB),cI=r.map(a=>{let b=aB.chapterRules.find(b=>b.id===a.id||b.title===a.title),c=[...new Set([...a.missingFacts||[],...b?.requiredFactIds||[]].filter(Boolean))],d=c.filter(b=>!a.missingFacts.includes(b)),e=c.filter(b=>a.missingFacts.includes(b)),f=+(a.evidence.length>0),g=c.length?d.length/c.length:1;return{chapterId:a.id,title:a.title,requiredFacts:c,coveredFacts:d,missingFacts:e,evidenceCount:a.evidence.length,readinessRate:Math.min(1,.7*g+.3*f)}}),cJ=function(a,b=[],c){let d=[],e=[];for(let b of a)0===b.evidence.length&&d.push(`${b.title} 未检索到资料证据`),b.content.length<80&&d.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&a.length<c.chapters.length&&e.push(`章节生成不完整:已生成 ${a.length}/${c.chapters.length} 章`),c&&0===A(c).length&&e.push("模板未绑定任何提示词");let f=new Set(b.map(a=>a.roleId));for(let a of["project_fact","rule"])c?.fileBindings?.some(b=>b.roleId===a)&&!f.has(a)&&d.push(`${a} 角色未抽取到结构化事实`);return{passed:0===e.length,warnings:d,errors:e}}(r,cA,m);cJ.warnings.push(...aE.warnings),cJ.errors.push(...aE.blockingIssues);let cK=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"error",message:a}))),d}(cJ,cH,r);cK.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}(cI));let cL=bW(bv,m),cM=Date.now(),cN=aT(r.map(a=>a.content).join("\n\n"));bz(S,by({type:"validation",roleId:"document-budget",status:"running",message:`正在进行全文预算校准:当前 ${cN} 字`,details:[`章节数:${r.length}`,`目标:${cd.targetChars||cd.targetPages||"按章节深度"}`],progress:{current:1,total:2,label:"预算校准"}},{subtitle:"文档预算"})),t(r);let cO=cn.enableDocumentBudgetExpansion?await v(()=>cg({template:m,chapters:r,budget:cd,promptTexts:aH,requirement:a.requirement,forbidDrawingImages:cL,signal:a.signal})):r;r.splice(0,r.length,...cO);let cP=aY(cd,r.map(a=>a.content).join("\n\n")),cQ=[cd.targetChars?`目标 ${cd.targetChars} 字${cd.minChars||cd.maxChars?`(区间 ${cd.minChars||0}-${cd.maxChars||"∞"} 字)`:""}`:void 0,cd.targetPages?`目标 ${cd.targetPages} 页${cd.minPages||cd.maxPages?`(区间 ${cd.minPages||0}-${cd.maxPages||"∞"} 页)`:""}`:void 0].filter(Boolean).join(" / ")||"默认章节深度";bz(S,by({type:"validation",roleId:"document-budget",status:cd.maxChars&&cP.currentChars>cd.maxChars||cd.minChars&&cP.currentChars<cd.minChars?"fallback":"success",message:bA(`文档预算:当前 ${cP.currentChars} 字,新增 ${Math.max(0,cP.currentChars-cN)} 字,预计 ${cP.estimatedPages} 页;${cQ}`,cM)},{subtitle:"文档预算"})),t(r);let cR=bo.filter(a=>"chapter_generation"===a.type&&"fallback"===a.status).length,cS=bo.filter(a=>"chapter_generation"===a.type&&"failed"===a.status).length;cR>0&&cK.push({level:"error",message:`章节生成存在兜底:${cR} 章`,suggestion:"请检查模型调用、提示词长度或证据负载后重新生成。"}),cS>0&&cK.push({level:"warning",message:`部分章节生成失败:${cS} 章`,suggestion:bn.slice(0,6).join(";")||"请检查模型调用或资料配置后重新生成失败章节。"});let cT=cK.filter(a=>"error"===a.level&&aZ(a)).length,cU=[...S];bz(cU,by({type:"validation",roleId:"document-workflow",status:cT>0?"failed":"success",message:`阻断 ${cT},错误 ${cJ.errors.length},警告 ${cJ.warnings.length}`},{subtitle:"最终规范校验"})),bz(cU,by({type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"})),bz(cU,by({type:"export_ready",roleId:"document-workflow",status:cT>0?"fallback":"success",message:cT>0?"导出存在风险项,仍可导出,请人工复核":"已准备好导出 Markdown/HTML/DOCX/PDF"}));let cV={templateId:m.id,templateName:m.name,title:m.outputTitle,requirement:a.requirement||"",projectRoot:k,projectId:l,exportSettings:m.exportSettings,generationSettings:m.generationSettings,facts:cv,structuredFacts:cA,factsModel:cH,chapters:r,sources:cG,missingItems:[...new Set(bl)],validation:cJ,validationIssues:cK,executionStages:cU,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],partialChapters:r.map(a=>({id:a.id,title:a.title,chars:aT(a.content),status:cl(a,cd.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:r,generatedAt:Date.now()},cW=aR(cV);bi(a.signal),bz(cU,by({type:"llm_review",roleId:"chapter-review",status:"running",message:`正在进行章节级质量审查:${r.length} 章`,details:[`审查并发:${cn.maxChapterReviewConcurrency}`,"检查事实覆盖、结构完整性和篇幅达标"],progress:{current:1,total:3,label:"章节审查"}},{subtitle:"章节级质量审查"})),t(r,cU);let cX=cn.enableChapterReview?await v(()=>bF(co,"chapter-review",()=>ch({template:m,chapters:r,budget:cd,promptTexts:a9||aH,requirement:a.requirement,strategy:cn,diagnostics:co,signal:a.signal}),{chapters:r.length}),cU):{summaries:r.map(a=>({chapterId:a.id,title:a.title,status:"pass",issues:[],suggestions:[],chars:aT(a.content)})),stage:by({type:"llm_review",roleId:"chapter-review",status:"skipped",message:"当前策略未启用章节级 LLM 审查"},{subtitle:"章节级质量审查"})};for(let a of(cU.push(cX.stage),cX.summaries.filter(a=>"pass"!==a.status)))cK.push({level:"fail"===a.status?"error":"warning",message:`${a.title} 章节审查:${a.issues.slice(0,4).join(";")||"存在质量风险"}`,suggestion:a.suggestions.slice(0,3).join(";")||"请复核章节事实覆盖、结构完整性和专业闭环。"});bz(cU,by({type:"llm_review",roleId:"global-consistency-review",status:"running",message:"正在进行全局一致性审查",details:["检查跨章节术语、项目参数、范围边界和闭环关系"],progress:{current:2,total:3,label:"全局审查"}},{subtitle:"全局一致性审查"})),t(r,cU);let cY=cn.enableGlobalReview?await v(()=>bF(co,"global-consistency-review",()=>ci({template:m,chapters:r,chapterReviews:cX.summaries,promptTexts:a9||aH,requirement:a.requirement,projectContext:b8,diagnostics:co,signal:a.signal}),{chapters:r.length}),cU):{issues:[],stage:by({type:"llm_review",roleId:"global-consistency-review",status:"skipped",message:"当前策略未启用全局 LLM 一致性审查"},{subtitle:"全局一致性审查"})};for(let a of(cU.push(cY.stage),cY.issues))cK.push({level:"warning",message:`全局一致性审查:${a}`,suggestion:"请复核跨章节术语、项目参数、范围边界和闭环关系。"});t(r,cU);let cZ=r.filter(a=>0===a.evidence.length||a.missingFacts.length>0||aT(a.content)<Math.floor(.7*(cd.chapterTargets.get(a.id)||1200))||cX.summaries.some(b=>b.chapterId===a.id&&"pass"!==b.status)||bZ({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:cd.chapterTargets.get(a.id)||1200}).length>0),c$=cT>0||cY.issues.length>0||cX.summaries.some(a=>"fail"===a.status)||cK.some(a=>/事实一致性|项目污染|章节生成存在兜底|章节生成失败|阻断/u.test(a.message)),c_=cn.enableFinalQualityReview&&(c$||cZ.length>Math.max(3,Math.floor(.35*r.length))),c0=Date.now();c_&&(bz(cU,by({type:"llm_review",roleId:"llm-review",status:"running",message:`正在进行最终质量审查:风险章节 ${cZ.length} 个`,details:["只检查结构、事实一致性、目录层级和正式文档风格,不重写正文"],progress:{current:3,total:3,label:"质量审查"}},{subtitle:"最终质量审查"})),t(r,cU));let c1=c_?await v(()=>cj({template:m,spec:aB,markdown:cW,evidence:bk,promptTexts:a9||aH,projectContext:b8,requirement:a.requirement,diagnostics:co,signal:a.signal}),cU):{markdown:cW,stage:{type:"llm_review",roleId:"llm-review",status:cZ.length>0?"skipped":"success",message:cZ.length>0?`本地风险扫描发现 ${cZ.length} 个低/中风险章节,当前策略未启用最终质量审查`:"本地风险扫描未发现需要 LLM 最终质量审查的章节"}};c1.stage.message=bA(c1.stage.message||"LLM 审查完成",c0),bi(a.signal);let c2=aK(aC(c1.markdown===cW?aR({...cV,validationIssues:cK,exportGate:cV.exportGate,executionStages:cU}):c1.markdown,cL)),c3=aQ(c2,m).map(a=>a.message),c4=a6(c2).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c5=a7(c2,m).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c6=a5(c2,cH).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c7=ae({assignments:bj,markdown:c2}).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c8=a4(c2).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),c9=a1(c2).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),da=a2(c2).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),db=a3(r).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dc=aL(c2).map(a=>`${a.message}${a.suggestion?`:${a.suggestion}`:""}`),dd=[...bX(c2,r,bR,bv,cL),...c3,...c4,...c5,...c6,...c7,...c8,...c9,...da,...db,...dc],de=Date.now();bz(cU,by({type:"llm_review",roleId:"quality-repair",status:dd.length>0?"running":"success",message:dd.length>0?`正在进行精准质量修复:${dd.length} 个问题`:"未发现需要精准修复的问题",details:dd.slice(0,6),progress:{current:1,total:Math.max(1,dd.length),label:"质量修复"}},{subtitle:"精准质量修复"})),t(r,cU);let df=await v(()=>bF(co,"local-patch-quality-repair",()=>b_({markdown:c2,template:m,chapters:r,promptTexts:aH,requirement:a.requirement,issues:dd,forbidDrawingImages:cL,strategy:cn,diagnostics:co,signal:a.signal}),{issues:dd.length}),cU);df.stage&&(df.stage.message=bA(df.stage.message||"质量修复完成",de)),bi(a.signal);let dg=df.stage?[...cU,c1.stage,df.stage]:[...cU,c1.stage],dh=df.chapters,di=aY(cd,dh.map(a=>a.content).join("\n\n"));if(cn.enableDocumentBudgetExpansion&&cd.minChars&&di.currentChars<Math.floor(.9*cd.minChars)&&(!cd.maxChars||di.currentChars<cd.maxChars)){let b=Date.now(),c=di.currentChars;bz(dg,by({type:"validation",roleId:"document-budget-repair",status:"running",message:`正在进行修复后预算补齐:当前 ${c} 字`,details:[`目标下限:${cd.minChars} 字`,`章节数:${dh.length}`],progress:{current:1,total:2,label:"预算补齐"}},{subtitle:"修复后预算补齐"})),t(dh,dg),dh=await v(()=>cg({template:m,chapters:dh,budget:cd,promptTexts:aH,requirement:a.requirement,forbidDrawingImages:cL,signal:a.signal}),dg);let d=aY(cd,dh.map(a=>a.content).join("\n\n"));bz(dg,by({type:"validation",roleId:"document-budget-repair",status:cd.minChars&&d.currentChars<cd.minChars?"fallback":"success",message:bA(`修复后预算补齐:当前 ${d.currentChars} 字,新增 ${Math.max(0,d.currentChars-c)} 字,预计 ${d.estimatedPages} 页`,b)},{subtitle:"修复后预算补齐"}))}let dj=aR({...cV,chapters:dh,validationIssues:cK,exportGate:cV.exportGate,executionStages:cU}),dk=function(a,b){let c=aO(aN(a),b);return b.map((a,b)=>{let d=c.search(RegExp(`^##\\s+${aP(ao(b,a.title))}\\s*$`,"mu"));if(d<0)return a.sections||[];let e=c.slice(d),f=e.slice(1).search(/^##\s+/mu),g=aI(f>=0?e.slice(0,f+1):e);return g.length>0?g:a.sections||[]})}(dj,dh),dl=dh.map((a,b)=>({...a,sections:dk[b]||a.sections||[]})),dm=aK(aG(function(a,b){let c=aO(a,b),d=aM(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)}
|
|
128
128
|
|
|
129
129
|
${d}
|
|
130
130
|
|
|
@@ -134,11 +134,11 @@ ${c.slice(a).trimStart()}`}return`${d}
|
|
|
134
134
|
|
|
135
135
|
<div class="page-break"></div>
|
|
136
136
|
|
|
137
|
-
${c}`}(aC(
|
|
138
|
-
${a.content}`).join("\n\n"),f=[];for(let b of a.chapters)Z.Zq.test(b.title)&&f.push(b.content);let g=aa(f.join("\n")||e,Z.IP).length,h=0;for(let a of[Z.SU,Z.is,Z.C2,Z.dB,Z.Xm])h+=aa(e,a).length;let j=aa(e,Z.fT).length,k=Z.qW.filter(a=>e.includes(a)).length,l=Z.xy.filter(a=>e.includes(a)).length,m=(c?.genericPhrases?.length?c.genericPhrases:Z.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(..._([...aa(p=`${a.parameter||""} ${a.specification||""} ${a.text}`,Z.IP),...aa(p,Z.SU),...aa(p,Z.is),...aa(p,Z.C2),...aa(p,Z.dB),...aa(p,Z.Xm),...aa(p,Z.fT)].map(a=>a.replace(Z.H4,""))))}let q=_(o).slice(0,Z.nB),r=e.replace(Z.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:"请把数量、时间节点、检查频次、人员/资源配置、响应时限和费用/金额承诺写入对应章节。"}),j<(c?.minStandardCount??4)&&b.push({level:"warning",message:`标准依据引用不足:仅识别 ${j} 个标准编号`,suggestion:"请结合资料补充适用的标准、规范、制度编号或验收依据。"}),k<(c?.minProcessActionCount??6)&&b.push({level:"warning",message:`过程动作覆盖不足:仅识别 ${k} 类过程动作`,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:m,chapters:
|
|
137
|
+
${c}`}(aC(dj,cL),dl))),dn=[...bX(c2,r,bR,bv,cL),...c3];for(let a of((cK=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=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),j=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,i),k=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)&&au(c,b)&&(e=!0),!f&&au(c,b)&&(f=!0)}0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}for(let b of a.chapterRules){let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&h.push({level:"warning",message:`章节内容深度建议:${b.title}`,suggestion:`可扩展到约 ${b.minWords} 字,但不要改变模板章节结构。`})}let l=a0(e),m=function(a){let b=[];for(let c of a.matchAll(Z.gW))b.push({alt:c[1]||"",url:c[2]||"",index:c.index??0});return b}(e),n=aS(e);for(let b of a.gateRules){let a=b.evaluator?b.evaluator:Z.cA[b.type]?.(b)??{subject:"document",operator:"contains",value:b.value||b.target},o=a.target||b.target||"",p=a.value||b.value||o,q=d.find(a=>a.title===o),r=function(a){for(let c of Z.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:o,value:p,min:a.min||Number(b.value)||1,markdown:e,textScope:"chapter"===a.subject&&q?q.content:e,regex:p?function(a){try{return RegExp(a,"iu")}catch{return}}(p):void 0,chapter:q,factNames:j,chapterTitles:k,tableBlocks:l,imageRefs:m,estimatedPages:n,allFacts:i,factsModel:c,fileBindings:f,promptBindings:g});r&&h.push(r)}return h}(aB,[...cK,...dn.map(a=>({level:"warning",message:a}))],cH,dl,dm,ap,aj)).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:dm,spec:aB,summary:az})),cK.push(...function(a){let b=[];for(let c of[{label:"项目名称",keys:["项目名称","任务名称","文档名称"]},{label:"项目编号",keys:["项目编号","任务编号","文档编号","合同编号"]},{label:"周期要求",keys:["周期","进度节点","完成期限","交付周期"]},{label:"质量要求",keys:["质量"]}]){let d=new Map;for(let b of function(a,b){return a.filter(a=>b.some(b=>a.key.includes(b)||a.fieldName?.includes(b))).map(a=>({value:String(a.value),source:a.sourceFile}))}(a.facts,c.keys)){let a=b.value.replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();a&&!(a.length<2)&&d.set(a,[...d.get(a)||[],b])}if(d.size>1){let a=[...d.values()].map(a=>`${a[0].value}(${a.map(a=>a.source).filter(Boolean).join("、")||"未知来源"})`).join(" vs ");b.push({level:"error",message:`事实一致性冲突:${c.label} 存在多个值:${a}`,suggestion:"请确认当前项目资料组,或在模板绑定中只绑定当前项目资料。"})}}let c=a.summary.facts.projectName;return c&&"当前知识库项目"!==c&&!a.markdown.includes(c)&&b.push({level:"error",message:`正文未包含当前项目名称:${c}`,suggestion:"请重新生成,确保标题、概况或背景信息体现当前项目名称。"}),b}({markdown:dm,facts:cA,summary:az})),cK.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)&&Y(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}(dm,az)),cK.push(...function(a){let b=[],c=(0,i.V)().technicalDetailGate,d=`${a.template.name} ${a.template.category} ${a.template.outputTitle}`;if(!(c?.templateMatchers?.length?c.templateMatchers:[...Z.TN]).some(a=>RegExp(a,"iu").test(d)))return b;let e=a.finalMarkdown||a.chapters.map(a=>`${a.title}
|
|
138
|
+
${a.content}`).join("\n\n"),f=[];for(let b of a.chapters)Z.Zq.test(b.title)&&f.push(b.content);let g=aa(f.join("\n")||e,Z.IP).length,h=0;for(let a of[Z.SU,Z.is,Z.C2,Z.dB,Z.Xm])h+=aa(e,a).length;let j=aa(e,Z.fT).length,k=Z.qW.filter(a=>e.includes(a)).length,l=Z.xy.filter(a=>e.includes(a)).length,m=(c?.genericPhrases?.length?c.genericPhrases:Z.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(..._([...aa(p=`${a.parameter||""} ${a.specification||""} ${a.text}`,Z.IP),...aa(p,Z.SU),...aa(p,Z.is),...aa(p,Z.C2),...aa(p,Z.dB),...aa(p,Z.Xm),...aa(p,Z.fT)].map(a=>a.replace(Z.H4,""))))}let q=_(o).slice(0,Z.nB),r=e.replace(Z.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:"请把数量、时间节点、检查频次、人员/资源配置、响应时限和费用/金额承诺写入对应章节。"}),j<(c?.minStandardCount??4)&&b.push({level:"warning",message:`标准依据引用不足:仅识别 ${j} 个标准编号`,suggestion:"请结合资料补充适用的标准、规范、制度编号或验收依据。"}),k<(c?.minProcessActionCount??6)&&b.push({level:"warning",message:`过程动作覆盖不足:仅识别 ${k} 类过程动作`,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:m,chapters:dl,assignments:bj,finalMarkdown:dm})),cK.push(...ae({assignments:bj,markdown:dm})),cK.push(...a4(dm)),cK.push(...a1(dm)),cK.push(...a2(dm)),cK.push(...aL(dm)),cK.push(...a3(dl)),cK.push(...a5(dm,cH)),cK.push(...a6(dm)),cK.push(...function(a,b){let c=function(a){let b="";for(let c of o(a))c.content&&(b+=`${c.content}
|
|
139
139
|
|
|
140
|
-
`);return b}(b);if(!c.trim())return[];let d=a.replace(Z.ug," "),e=0;for(let a of c.matchAll(Z.QX)){let b=(a[1]||"").replace(Z.ug," ").trim();if(b.length<Z.Dz)continue;e+=1;let c=b.slice(0,Z.CQ);if(c.length>=Z.Dz&&d.includes(c))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前项目资料生成的正式正文。"}];if(e>=Z.Dz)break}return[]}(
|
|
141
|
-
${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,f.chapters,f.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,g=e<a.blockBelowScore||d.some(a=>"error"===a.level);return{benchmarkId:a.id,benchmarkName:a.name,score:e,pass:e>=a.passScore,blocked:g,issues:g?[{level:"error",message:`文档质量基准评分未达标:${a.name} ${e}分`,suggestion:"请重新生成或补充模板、资料、章节内容后再导出。"},...d]:d}})))
|
|
140
|
+
`);return b}(b);if(!c.trim())return[];let d=a.replace(Z.ug," "),e=0;for(let a of c.matchAll(Z.QX)){let b=(a[1]||"").replace(Z.ug," ").trim();if(b.length<Z.Dz)continue;e+=1;let c=b.slice(0,Z.CQ);if(c.length>=Z.Dz&&d.includes(c))return[{level:"error",message:"正文疑似包含提示词示例内容",suggestion:"请删除提示词样例数据,仅保留基于当前项目资料生成的正式正文。"}];if(e>=Z.Dz)break}return[]}(dm,aj)),f={template:m,chapters:dl,markdown:dm},(0,i.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))})(f.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}
|
|
141
|
+
${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,f.chapters,f.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,g=e<a.blockBelowScore||d.some(a=>"error"===a.level);return{benchmarkId:a.id,benchmarkName:a.name,score:e,pass:e>=a.passScore,blocked:g,issues:g?[{level:"error",message:`文档质量基准评分未达标:${a.name} ${e}分`,suggestion:"请重新生成或补充模板、资料、章节内容后再导出。"},...d]:d}})))cK.push(...a.issues);cK.push(...function(a){let b=[],c=a.markdown;for(let c of a.roles.filter(a=>a.required))c.satisfied?c.weak&&b.push({level:"warning",message:`必需资料角色证据较弱:${c.role}`,suggestion:"建议补充更多同类资料以提高正式文件可靠性。"}):b.push({level:"error",message:`必需资料角色缺失:${c.role}`,suggestion:"请补充对应项目资料或调整模板角色绑定。"});for(let d of(a.summary.facts.professionalScopes||[]).slice(0,10))d.length>=4&&!Y(c,d)&&b.push({level:"warning",message:`正文可能未覆盖资料中的专业/范围:${d}`,suggestion:"建议检查范围、方法、流程或资源配置章节。"});let d=a.chapters.map(a=>a.title).join("、");if(/专项|安全|质量|进度|合规|审计|风控|风险/iu.test(c+d))for(let a of["质量","安全","进度"])c.includes(a)||d.includes(a)||b.push({level:"warning",message:`正式文件缺少“${a}”控制内容`,suggestion:`建议补充${a}目标、措施和责任体系。`});return b}({markdown:dm,chapters:dl,summary:az,roles:aD})),cK.push(...a7(dm,m));let dp=function(a,b){let{currentChars:c,estimatedPages:d}=aY(a,b),e=[];return a.minChars&&c<a.minChars&&e.push({level:"error",message:`正文篇幅低于目标字数:当前 ${c} 字,目标不少于 ${a.minChars} 字`,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}(cd,dl.map(a=>a.content).join("\n\n")),dq=(function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=aS(b,a),e=c.min||c.target,f=c.max||c.target,g=[];return e&&d<e&&g.push({level:"error",message:`正文篇幅低于目标页数:预计约 ${d} 页,目标不少于 ${e} 页`,suggestion:"请重新生成或增加章节正文深度后再导出正式文件。"}),f&&d>f+4&&g.push({level:"warning",message:`正文篇幅可能超过目标页数:预计约 ${d} 页,目标不超过 ${f} 页`,suggestion:"建议检查是否存在重复段落或过度展开。"}),g})(m.generationSettings||m.exportSettings,dm).filter(a=>!(cd.minPages&&/低于目标页数/u.test(a.message)));cK.push(...dq),cK.push(...dp),cK.push(...aQ(dm,m));let dr=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&aZ(a))},{key:"project_facts",label:"项目基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"structured_precision",label:"结构化精确参数已使用",passed:b.preciseFacts.length<Z.mu||a.every(a=>!Z.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&&Z.Uv.test(a.message))}],e=a.filter(a=>"error"===a.level&&aZ(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(cK,cH,dl),ds=dr.blockingIssues.length,dt=a_(cK);co.quality.blockingCount+=dt.blocking,co.quality.importantCount+=dt.important,co.quality.minorCount+=dt.minor;let du=dg.map(a=>"validation"===a.type&&"document-workflow"===a.roleId?{...a,status:ds>0?"failed":"success",message:`阻断 ${ds},问题 ${cK.length}`}:"export_ready"===a.type?{...a,status:dr.passed?"success":"fallback",message:dr.passed?"已准备好导出 Markdown/HTML/DOCX/PDF":"导出存在风险项,仍可导出,请人工复核"}:a);return co.llm.currentLimit=bm??0,du.push(by({type:"validation",roleId:"document-diagnostics",status:"success",message:`性能统计:LLM ${co.llm.calls} 次,失败 ${co.llm.failures} 次,排队 ${co.llm.throttledWaits} 次/${Math.round(co.llm.throttledWaitMs/1e3)} 秒,检索 ${co.evidence.searchQueries} 次/${Math.round(co.evidence.searchMs/1e3)} 秒,证据上下文 ${co.evidence.contextChars} 字,缓存命中 ${co.cache.chapterHits} 章/${co.cache.sectionHits} 小节,写入 ${co.cache.chapterWrites} 章/${co.cache.sectionWrites} 小节,噪声过滤 ${co.evidence.filteredNoise} 条,质量问题 阻断${co.quality.blockingCount}/重要${co.quality.importantCount}/轻微${co.quality.minorCount},自动限流调整 ${co.llm.limitAdjustments} 次`},{subtitle:"后台诊断"})),{...{...cV,chapters:dl,validationIssues:cK,exportGate:dr,executionStages:du,partialChapters:dl.map(a=>({id:a.id,title:a.title,chars:aT(a.content),status:cl(a,cd.chapterTargets.get(a.id)),updatedAt:Date.now()})),checkpointChapters:dl,reviewMetadata:{chapterSummaries:cX.summaries,globalIssues:cY.issues,diagnostics:co}},markdown:dm}}async function cn(a){let b=q(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let d=e.resolve(a.projectRoot||(0,g.aY)());if(!d)throw Error("No knowledge base project found");let f=(0,g.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),i=b2(d,B(b)),j=[],k=[...i].filter(Boolean).sort();for(let a of c.queries){let b=await f.search(d,a,{scope:"project",filters:{filePaths:k},limit:Math.max(h,30),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});j.push(...b.results.filter(a=>b1(d,a.filePath,i)).map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let l=ay(j.filter(a=>b1(d,a.filePath,i)),h),m=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",n=new Set(a.existingFacts??[]),o=c.requiredFacts.filter(a=>!n.has(a)&&!l.some(b=>as(b,a))),p=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",m?`> 当前文档上下文摘要:${m.replace(/\s+/gu," ").slice(0,800)}`:"",l.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",l.length>0?"### 资料依据":"",...l.map(az),"",o.length>0?"### 待确认事项":"",...o.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:p,evidence:l,missingFacts:o}}},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}
|
|
142
142
|
${a.category}
|
|
143
143
|
${a.format}
|
|
144
144
|
${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}}}};
|