@customize-agent/server 4.0.28 → 4.0.30

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +5 -5
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/3445.js +21 -16
  5. package/.next/server/chunks/8204.js +1 -1
  6. package/.next/server/middleware-build-manifest.js +1 -1
  7. package/.next/server/pages/404.html +1 -1
  8. package/.next/server/pages/500.html +1 -1
  9. package/.next/server/pages/api/assets/generated.js +1 -1
  10. package/.next/server/pages/api/documents/export.js +2 -15
  11. package/.next/server/pages/api/documents/roles.js +1 -1
  12. package/.next/server/pages/api/documents/specs.js +1 -1
  13. package/.next/server/pages/asset-library.html +1 -1
  14. package/.next/server/pages/context/long-term.html +1 -1
  15. package/.next/server/pages/context/short-term.html +1 -1
  16. package/.next/server/pages/document-roles.html +1 -1
  17. package/.next/server/pages/document-specs.html +1 -1
  18. package/.next/server/pages/documents.html +1 -1
  19. package/.next/server/pages/guide.html +1 -1
  20. package/.next/server/pages/index.html +1 -1
  21. package/.next/server/pages/knowledge/file-detail.html +1 -1
  22. package/.next/server/pages/knowledge/files.html +1 -1
  23. package/.next/server/pages/knowledge/manage.html +1 -1
  24. package/.next/server/pages/knowledge/search.html +1 -1
  25. package/.next/server/pages/knowledge.html +1 -1
  26. package/.next/server/pages/models.html +1 -1
  27. package/.next/server/pages/overview.html +1 -1
  28. package/.next/server/pages/prompt.html +1 -1
  29. package/.next/server/pages/settings.html +1 -1
  30. package/.next/server/pages/system/logs.html +1 -1
  31. package/.next/server/pages-manifest.json +23 -23
  32. package/.next/static/chunks/pages/{_app-15f2d98b25c5d3ce.js → _app-8abe93a007ab30a7.js} +1 -1
  33. package/.next/static/chunks/pages/document-specs-0fa19a0e348efc80.js +1 -0
  34. package/.next/static/chunks/pages/documents-3b87f1bf389b2f18.js +1 -0
  35. package/.next/static/{vm4gX3opuCeylimLPKC7_ → dq39asOIM1hVN5SMdBZn3}/_buildManifest.js +1 -1
  36. package/package.json +4 -4
  37. package/.next/static/chunks/pages/document-specs-3a02d469bf6a43fa.js +0 -1
  38. package/.next/static/chunks/pages/documents-8516d74b25d9fa0d.js +0 -1
  39. /package/.next/static/{vm4gX3opuCeylimLPKC7_ → dq39asOIM1hVN5SMdBZn3}/_ssgManifest.js +0 -0
package/.next/BUILD_ID CHANGED
@@ -1 +1 @@
1
- vm4gX3opuCeylimLPKC7_
1
+ dq39asOIM1hVN5SMdBZn3
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/vm4gX3opuCeylimLPKC7_/_buildManifest.js",
9
- "static/vm4gX3opuCeylimLPKC7_/_ssgManifest.js"
8
+ "static/dq39asOIM1hVN5SMdBZn3/_buildManifest.js",
9
+ "static/dq39asOIM1hVN5SMdBZn3/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [],
12
12
  "rootMainFilesTree": {},
@@ -26,7 +26,7 @@
26
26
  "static/chunks/framework-161be364fd69a7ce.js",
27
27
  "static/chunks/main-91fb767ebd74c9c1.js",
28
28
  "static/css/38dba0a7a42a8df3.css",
29
- "static/chunks/pages/_app-15f2d98b25c5d3ce.js"
29
+ "static/chunks/pages/_app-8abe93a007ab30a7.js"
30
30
  ],
31
31
  "/_error": [
32
32
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -97,7 +97,7 @@
97
97
  "static/chunks/455-e04e99d9e242de44.js",
98
98
  "static/chunks/938-45efd516bb130bd5.js",
99
99
  "static/chunks/265-32ec272a49cfacef.js",
100
- "static/chunks/pages/document-specs-3a02d469bf6a43fa.js"
100
+ "static/chunks/pages/document-specs-0fa19a0e348efc80.js"
101
101
  ],
102
102
  "/documents": [
103
103
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -111,7 +111,7 @@
111
111
  "static/chunks/506-93f730bc149d0dce.js",
112
112
  "static/chunks/412-b9c854c6a76db67d.js",
113
113
  "static/chunks/130-c1e5c14958fcba2b.js",
114
- "static/chunks/pages/documents-8516d74b25d9fa0d.js"
114
+ "static/chunks/pages/documents-3b87f1bf389b2f18.js"
115
115
  ],
116
116
  "/guide": [
117
117
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -3,9 +3,9 @@
3
3
  "routes": {},
4
4
  "dynamicRoutes": {},
5
5
  "preview": {
6
- "previewModeId": "3a35279d14763d01ea3394c7b364eca2",
7
- "previewModeSigningKey": "6cf01ded466a71e2e4c00865473e27d8da00c51c9e8aebeb3d5af524c47377e9",
8
- "previewModeEncryptionKey": "ce440ff0c2aba740b9cfb90f31fe285e828f74bb1da325d0b19fc212a23559a0"
6
+ "previewModeId": "4d2b4df4a1b520c8ea502d29f1dec664",
7
+ "previewModeSigningKey": "e08d9ec8d28d89947f412cffa6398184a34b27ecb68873e40b055055df32aff2",
8
+ "previewModeEncryptionKey": "b9b3d7d29be86156cbe1c1e5ff4e63c6db01169067287aeee9e376b14f23e107"
9
9
  },
10
10
  "notFoundRoutes": []
11
11
  }
@@ -1,16 +1,16 @@
1
1
  "use strict";exports.id=3445,exports.ids=[3445],exports.modules={2323:(a,b,c)=>{c.d(b,{I:()=>f});var d=c(96770);let e=null;function f(){return e||(e=new d.ConfigStore),e}},23328:(a,b,c)=>{c.d(b,{Qh:()=>l,VS:()=>p,Yy:()=>o,aY:()=>n});var d=c(19898),e=c(87550),f=c.n(e),g=c(33873),h=c(21820),i=c(29021);let j=null;function k(){return g.join(h.homedir(),".customize-agent")}function l(){return j||(j=new d.MultiProjectManager(k())),j}function m(a){let b=g.resolve(a),c=g.resolve(g.join(h.homedir(),".customize-agent"));return!(i.existsSync(g.join(b,"pnpm-workspace.yaml"))&&i.existsSync(g.join(b,"apps","server")))&&(b===c||b.includes(`${g.sep}.customize-agent${g.sep}`)||b.endsWith(`${g.sep}apps${g.sep}server`)||b.endsWith(`${g.sep}apps${g.sep}cli`))}function n(){let a=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(a&&i.existsSync(a)&&!m(a))return g.resolve(a);let b=function(){let a=g.join(k(),"projects","registry.db");if(!i.existsSync(a))return[];let b=new(f())(a,{readonly:!0});try{return b.prepare("SELECT project_root FROM project_registry ORDER BY last_opened_at DESC").all().map(a=>g.resolve(a.project_root)).filter(a=>!m(a))}finally{b.close()}}();return b.length>0?b[0]:process.env.INIT_CWD&&!m(process.env.INIT_CWD)?process.env.INIT_CWD:g.resolve(process.cwd(),"../..")}function o(a,b={}){let c=new Map;for(let b of function(a){let b=g.join(h.homedir(),".customize-agent","projects",(0,d.computeProjectId)(g.resolve(a)),"kb.db");if(!i.existsSync(b))return[];let c=new d.IndexStateStore(b);try{return c.listRecords().map(a=>({...a,matchedBy:"metadata"}))}finally{c.close()}}(a))c.set(b.relativePath,b);for(let b of function(a){let b=g.join(a,"knowledgeBase");if(!i.existsSync(b))return[];let c=[],d=a=>{for(let e of i.readdirSync(a,{withFileTypes:!0})){let f=g.join(a,e.name);if(e.isDirectory()){d(f);continue}if(e.name.endsWith(".source.txt"))continue;let h=i.statSync(f),j=g.relative(b,f).split(g.sep).join("/");c.push({relativePath:j,category:j.includes("表格数据/")?"spreadsheet":j.includes("图片素材/")?"image":j.includes("图纸文件/")?"cad":j.includes("文档资料/")?"document":"other",format:g.extname(j).slice(1).toLowerCase()||"text",contentHash:"",fileSize:h.size,mtime:h.mtimeMs,chunkCount:0,collectionName:"",indexedAt:0,lastVerifiedAt:0,status:"disk",matchedBy:"disk"})}};return d(b),c}(a)){let a=c.get(b.relativePath);c.set(b.relativePath,a?{...a,fileSize:b.fileSize,mtime:b.mtime,matchedBy:"metadata"}:b)}return Array.from(c.values()).filter(a=>!b.category||a.category===b.category).sort((a,b)=>b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN"))}async function p(a,b={}){let c=(b.query||"").trim(),d=Math.max(1,Math.min(500,b.limit??50)),e=new Map,f=o(a,{category:b.category});for(let a of f)(!c||`${a.relativePath}
2
2
  ${a.category}
3
3
  ${a.format}
4
- ${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},57367:(a,b,c)=>{c.d(b,{Co:()=>z,EK:()=>B,ER:()=>C,_q:()=>w,py:()=>A,uD:()=>x,ug:()=>y});var d=c(73024),e=c(48161),f=c(76760);let g=[{id:"required_fact",name:"必需事实",description:"检查指定事实字段是否存在。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"fact",operator:"exists"}},{id:"required_chapter",name:"必需章节",description:"检查指定章节是否存在。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"chapter",operator:"exists"}},{id:"required_file_role",name:"必需文件角色",description:"检查项目角色配置是否绑定指定文件角色。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"file_role",operator:"exists"}},{id:"required_prompt_role",name:"必需提示词角色",description:"检查项目角色配置是否绑定指定提示词角色。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"prompt_role",operator:"exists"}},{id:"source_required",name:"事实必须有来源",description:"检查结构化事实是否都有资料来源。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"forbidden_text",name:"禁止出现文本",description:"检查全文是否出现禁用文本。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"document",operator:"not_contains"}},{id:"min_chapter_length",name:"章节最低字数",description:"检查指定章节是否达到最低字数。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"chapter",operator:"min_length"}},{id:"table_required",name:"必须有表格",description:"检查文档是否包含结构化表格。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"table",operator:"min_count",min:1}}],h=new Map(g.map(a=>[a.id,a])),i=["document","chapter","fact","file_role","prompt_role","table","image","source"],j=["exists","contains","not_contains","regex_match","regex_not_match","min_count","min_length","all_have_source","image_caption_required","table_explanation_required"];function k(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function l(){return f.join(k(),"document-specs.json")}function m(){return f.join(k(),"document-gate-types.json")}function n(a){return(a||`spec-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function o(a,b=""){return String(a||b).trim().slice(0,500)}function p(a,b){let c=a||b||{subject:"document",operator:"contains"},d=i.includes(c.subject)?c.subject:"document",e=j.includes(c.operator)?c.operator:"contains",f=Number(c.min);return{subject:d,operator:e,target:o(c.target),value:o(c.value),min:Number.isFinite(f)&&f>0?f:void 0}}function q(a){let b=n(a.id||a.name||`gate-type-${Date.now()}`);if(h.has(b))throw Error("不能覆盖系统内置门禁类型");return{id:b,name:o(a.name,"自定义门禁类型"),description:o(a.description),builtIn:!1,defaultLevel:"warning"===a.defaultLevel||"info"===a.defaultLevel?a.defaultLevel:"error",evaluator:p(a.evaluator)}}function r(a){return{id:n(a.id),name:a.name||"未命名规范包",description:a.description||"",factFields:Array.isArray(a.factFields)?a.factFields.filter(a=>a.name).map(a=>({id:n(a.id),name:a.name,type:"auto",required:!!a.required,sourceRoleIds:Array.isArray(a.sourceRoleIds)?a.sourceRoleIds.filter(Boolean):[],extractionHint:a.extractionHint||"",validationHint:a.validationHint||""})):[],chapterMode:"fixed"===a.chapterMode?"fixed":"dynamic",chapterRules:Array.isArray(a.chapterRules)?a.chapterRules.filter(a=>a.title).map((a,b)=>({id:n(a.id),title:a.title,required:!!a.required,order:Number.isFinite(a.order)?a.order:b,minWords:Number.isFinite(a.minWords)?a.minWords:0,requiredFactIds:Array.isArray(a.requiredFactIds)?a.requiredFactIds.filter(Boolean):[],requiredFileRoleIds:Array.isArray(a.requiredFileRoleIds)?a.requiredFileRoleIds.filter(Boolean):[],requiredPromptRoleIds:Array.isArray(a.requiredPromptRoleIds)?a.requiredPromptRoleIds.filter(Boolean):[],generationHint:a.generationHint||""})):[],dynamicChapterRule:{source:["file_outline","file_role","fact_group","table_rows"].includes(a.dynamicChapterRule?.source)?a.dynamicChapterRule.source:"ai_plan",sourceRoleIds:Array.isArray(a.dynamicChapterRule?.sourceRoleIds)?a.dynamicChapterRule.sourceRoleIds.filter(Boolean):[],minChapters:Number.isFinite(a.dynamicChapterRule?.minChapters)?a.dynamicChapterRule.minChapters:void 0,maxChapters:Number.isFinite(a.dynamicChapterRule?.maxChapters)?a.dynamicChapterRule.maxChapters:void 0,titleStrategy:["source_title","field_value","template"].includes(a.dynamicChapterRule?.titleStrategy||"")?a.dynamicChapterRule?.titleStrategy:"ai_summary",titleTemplate:a.dynamicChapterRule?.titleTemplate||"",minWordsPerChapter:Number.isFinite(a.dynamicChapterRule?.minWordsPerChapter)?a.dynamicChapterRule.minWordsPerChapter:void 0,requiredFactIds:Array.isArray(a.dynamicChapterRule?.requiredFactIds)?a.dynamicChapterRule.requiredFactIds.filter(Boolean):[],requiredFileRoleIds:Array.isArray(a.dynamicChapterRule?.requiredFileRoleIds)?a.dynamicChapterRule.requiredFileRoleIds.filter(Boolean):[],requiredPromptRoleIds:Array.isArray(a.dynamicChapterRule?.requiredPromptRoleIds)?a.dynamicChapterRule.requiredPromptRoleIds.filter(Boolean):[],generationHint:a.dynamicChapterRule?.generationHint||""},gateRules:Array.isArray(a.gateRules)?a.gateRules.filter(a=>a.name).map(a=>{var b;let c=n(a.type||a.name||"custom_gate");return{id:n(a.id),name:a.name,type:c,level:"warning"===a.level||"info"===a.level?a.level:"error",target:a.target||"",value:a.value||"",evaluator:p((b={...a,type:c}).evaluator,h.get(b.type)?.evaluator)}}):[],wordTemplatePath:a.wordTemplatePath||"",builtIn:!!a.builtIn}}function s(){try{let a=l();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(l(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(){try{let a=m();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(q)}catch{return[]}}function v(a){d.writeFileSync(m(),JSON.stringify(a.map(q),null,2),"utf-8")}function w(){return[...new Map([...g,...u()].map(a=>[a.id,a])).values()]}function x(a){let b=q(a),c=u().filter(a=>a.id!==b.id);return c.push(b),v(c),b}function y(a){if(h.has(a))throw Error("系统内置门禁类型不可删除");v(u().filter(b=>b.id!==a))}function z(){return[...new Map(s().map(a=>[a.id,a])).values()]}function A(a){if(a)return s().find(b=>b.id===a)}function B(a){let b=r(a),c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}function C(a){t(s().filter(b=>b.id!==a))}},73445:(a,b,c)=>{c.d(b,{Bh:()=>x,OX:()=>am,R1:()=>an,bV:()=>A,h0:()=>z,jG:()=>v,xm:()=>y});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(96770),j=c(23328),k=c(99842),l=c(2323),m=c(89952),n=c(57367);let o=[];function p(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function q(){return e.join(p(),"document-templates.json")}function r(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,documentSpecId:a.documentSpecId||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):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"业务文档",purpose:a.description||"",queries:[],requiredFacts:[]}],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 s(){try{let a=q();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(q(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(p(),"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 v(){return[...o,...s()]}function w(a){return v().find(b=>b.id===a)}function x(a){let b=r(a);if(o.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}async function y(a,b=(0,j.aY)()){let c=w(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],spec:void 0,config:void 0};let f=(0,m.XB)("prompt"),g=(0,m.XB)("file"),h=c.projectRoleConfigId?(0,m.Mu)(c.projectRoleConfigId):void 0;c.projectRoleConfigId||d.push({level:"error",message:"模板未绑定项目角色配置"}),c.projectRoleConfigId&&!h&&d.push({level:"error",message:"项目角色配置不存在或已删除"});let i=$(c),k=_(c);0===i.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"}),0===k.length&&d.push({level:"error",message:"模板未绑定知识库文件角色"});let l=c.documentSpecId?(0,n.py)(c.documentSpecId):void 0;if(c.documentSpecId&&!l&&d.push({level:"error",message:"文档规范包不存在或已删除"}),l?.chapterMode==="fixed"){let a=new Set(c.chapters.map(a=>a.id)),b=new Set(c.chapters.map(a=>a.title));for(let c of l.chapterRules.filter(a=>a.required))a.has(c.id)||b.has(c.title)||d.push({level:"error",message:`模板章节不满足规范包要求:${c.title}`})}l?.chapterMode==="dynamic"&&l.dynamicChapterRule.maxChapters&&l.dynamicChapterRule.minChapters&&l.dynamicChapterRule.maxChapters<l.dynamicChapterRule.minChapters&&d.push({level:"error",message:"动态章节规则的最多章节不能小于最少章节"});let o=e.resolve(b),p=await (0,j.Qh)().getProject(o);c.builtIn&&await p.incrementalIndex();let q=new Map((0,j.Yy)(o).map(a=>[a.relativePath,a])),r=k.map(a=>{let b=g.find(b=>b.id===a.roleId),c=q.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),s=u(i),t=i.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});return{templateId:a,projectRoleConfigId:c.projectRoleConfigId,documentSpecId:c.documentSpecId,fileDiagnostics:r,promptDiagnostics:t,spec:l?{id:l.id,name:l.name,factFields:l.factFields.length,gateRules:l.gateRules.length}:void 0,issues:d}}function z(a){if(o.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");t(s().filter(b=>b.id!==a))}function A(a){let b=w(a);if(!b)throw Error("Document template not found");let c=r({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=s();return d.push(c),t(d),c}let B=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,C=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function D(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(C,"").slice(0,40)})`:""}`}function E(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(B,"").replace(C,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function F(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase(),d=E(b);return d.length>20?d.slice(0,4e3):[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d.slice(0,4e3)}(a.filePath,a.content)})).sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}:${a.content.slice(0,100)}`;return!c.has(b)&&(c.add(b),!0)}).slice(0,b)}function G(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function H(a,b=0){return`- ${D(a,b)}:${E(a.content).replace(/\s+/gu," ").slice(0,260)}`}function I(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-完整地图图纸$/u,"完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明空间关系、区域划分、点位、路线或专业布置。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、清单、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
4
+ ${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},57367:(a,b,c)=>{c.d(b,{Co:()=>A,EK:()=>C,ER:()=>D,_q:()=>x,py:()=>B,uD:()=>y,ug:()=>z});var d=c(73024),e=c(48161),f=c(76760);let g=[{id:"required_fact",name:"必需事实",description:"检查指定事实字段是否存在。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"fact",operator:"exists"}},{id:"required_chapter",name:"必需章节",description:"检查指定章节是否存在。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"chapter",operator:"exists"}},{id:"required_file_role",name:"必需文件角色",description:"检查项目角色配置是否绑定指定文件角色。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"file_role",operator:"exists"}},{id:"required_prompt_role",name:"必需提示词角色",description:"检查项目角色配置是否绑定指定提示词角色。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"prompt_role",operator:"exists"}},{id:"source_required",name:"事实必须有来源",description:"检查结构化事实是否都有资料来源。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"forbidden_text",name:"禁止出现文本",description:"检查全文是否出现禁用文本。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"document",operator:"not_contains"}},{id:"min_chapter_length",name:"章节最低字数",description:"检查指定章节是否达到最低字数。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"chapter",operator:"min_length"}},{id:"table_required",name:"必须有表格",description:"检查文档是否包含结构化表格。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"table",operator:"min_count",min:1}}],h=new Map(g.map(a=>[a.id,a])),i=["document","chapter","fact","file_role","prompt_role","table","image","source"],j=["exists","contains","not_contains","regex_match","regex_not_match","min_count","min_length","all_have_source","image_caption_required","table_explanation_required"];function k(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function l(){return f.join(k(),"document-specs.json")}function m(){return f.join(k(),"document-gate-types.json")}function n(a){return(a||`spec-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function o(a,b=""){return String(a||b).trim().slice(0,500)}function p(a=[]){return[...new Set(a.filter(Boolean))]}function q(a,b){let c=a||b||{subject:"document",operator:"contains"},d=i.includes(c.subject)?c.subject:"document",e=j.includes(c.operator)?c.operator:"contains",f=Number(c.min);return{subject:d,operator:e,target:o(c.target),value:o(c.value),min:Number.isFinite(f)&&f>0?f:void 0}}function r(a){let b=n(a.id||a.name||`gate-type-${Date.now()}`);if(h.has(b))throw Error("不能覆盖系统内置门禁类型");return{id:b,name:o(a.name,"自定义门禁类型"),description:o(a.description),builtIn:!1,defaultLevel:"warning"===a.defaultLevel||"info"===a.defaultLevel?a.defaultLevel:"error",evaluator:q(a.evaluator)}}function s(a){return{id:n(a.id),name:a.name||"未命名规范包",description:a.description||"",factFields:Array.isArray(a.factFields)?a.factFields.filter(a=>a.name).map(a=>({id:n(a.id),name:a.name,type:"auto",required:!!a.required,sourceRoleIds:p(Array.isArray(a.sourceRoleIds)?a.sourceRoleIds:[]),extractionHint:a.extractionHint||"",validationHint:a.validationHint||""})):[],chapterMode:"fixed"===a.chapterMode?"fixed":"dynamic",chapterRules:Array.isArray(a.chapterRules)?a.chapterRules.filter(a=>a.title).map((a,b)=>({id:n(a.id),title:a.title,required:!!a.required,order:Number.isFinite(a.order)?a.order:b,minWords:Number.isFinite(a.minWords)?a.minWords:0,requiredFactIds:p(Array.isArray(a.requiredFactIds)?a.requiredFactIds:[]),requiredFileRoleIds:p(Array.isArray(a.requiredFileRoleIds)?a.requiredFileRoleIds:[]),requiredPromptRoleIds:p(Array.isArray(a.requiredPromptRoleIds)?a.requiredPromptRoleIds:[]),generationHint:a.generationHint||""})):[],dynamicChapterRule:{source:["file_outline","file_role","fact_group","table_rows"].includes(a.dynamicChapterRule?.source)?a.dynamicChapterRule.source:"ai_plan",sourceRoleIds:p(Array.isArray(a.dynamicChapterRule?.sourceRoleIds)?a.dynamicChapterRule.sourceRoleIds:[]),minChapters:Number.isFinite(a.dynamicChapterRule?.minChapters)?a.dynamicChapterRule.minChapters:void 0,maxChapters:Number.isFinite(a.dynamicChapterRule?.maxChapters)?a.dynamicChapterRule.maxChapters:void 0,titleStrategy:["source_title","field_value","template"].includes(a.dynamicChapterRule?.titleStrategy||"")?a.dynamicChapterRule?.titleStrategy:"ai_summary",titleTemplate:a.dynamicChapterRule?.titleTemplate||"",minWordsPerChapter:Number.isFinite(a.dynamicChapterRule?.minWordsPerChapter)?a.dynamicChapterRule.minWordsPerChapter:void 0,requiredFactIds:p(Array.isArray(a.dynamicChapterRule?.requiredFactIds)?a.dynamicChapterRule.requiredFactIds:[]),requiredFileRoleIds:p(Array.isArray(a.dynamicChapterRule?.requiredFileRoleIds)?a.dynamicChapterRule.requiredFileRoleIds:[]),requiredPromptRoleIds:p(Array.isArray(a.dynamicChapterRule?.requiredPromptRoleIds)?a.dynamicChapterRule.requiredPromptRoleIds:[]),generationHint:a.dynamicChapterRule?.generationHint||""},gateRules:Array.isArray(a.gateRules)?a.gateRules.filter(a=>a.name).map(a=>{var b;let c=n(a.type||a.name||"custom_gate");return{id:n(a.id),name:a.name,type:c,level:"warning"===a.level||"info"===a.level?a.level:"error",target:a.target||"",value:a.value||"",evaluator:q((b={...a,type:c}).evaluator,h.get(b.type)?.evaluator)}}):[],wordTemplatePath:a.wordTemplatePath||"",builtIn:!!a.builtIn}}function t(){try{let a=l();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(s)}catch{return[]}}function u(a){d.writeFileSync(l(),JSON.stringify(a.map(s),null,2),"utf-8")}function v(){try{let a=m();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function w(a){d.writeFileSync(m(),JSON.stringify(a.map(r),null,2),"utf-8")}function x(){return[...new Map([...g,...v()].map(a=>[a.id,a])).values()]}function y(a){let b=r(a),c=v().filter(a=>a.id!==b.id);return c.push(b),w(c),b}function z(a){if(h.has(a))throw Error("系统内置门禁类型不可删除");w(v().filter(b=>b.id!==a))}function A(){return[...new Map(t().map(a=>[a.id,a])).values()]}function B(a){if(a)return t().find(b=>b.id===a)}function C(a){let b=s(a),c=t().filter(a=>a.id!==b.id);return c.push(b),u(c),b}function D(a){u(t().filter(b=>b.id!==a))}},73445:(a,b,c)=>{c.d(b,{Bh:()=>x,OX:()=>at,R1:()=>au,bV:()=>A,h0:()=>z,jG:()=>v,xm:()=>y});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(96770),j=c(23328),k=c(99842),l=c(2323),m=c(89952),n=c(57367);let o=[];function p(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function q(){return e.join(p(),"document-templates.json")}function r(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,documentSpecId:a.documentSpecId||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):[]})):a.documentSpecId?[]:[{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 s(){try{let a=q();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(q(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(p(),"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 v(){return[...o,...s()]}function w(a){return v().find(b=>b.id===a)}function x(a){let b=r(a);if(o.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}async function y(a,b=(0,j.aY)()){let c=w(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],spec:void 0,config:void 0};let f=(0,m.XB)("prompt"),g=(0,m.XB)("file"),h=c.projectRoleConfigId?(0,m.Mu)(c.projectRoleConfigId):void 0;c.projectRoleConfigId||d.push({level:"error",message:"模板未绑定项目角色配置"}),c.projectRoleConfigId&&!h&&d.push({level:"error",message:"项目角色配置不存在或已删除"});let i=ac(c),k=ad(c);0===i.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"}),0===k.length&&d.push({level:"error",message:"模板未绑定知识库文件角色"});let l=c.documentSpecId?(0,n.py)(c.documentSpecId):void 0;c.documentSpecId&&!l&&d.push({level:"error",message:"文档规范包不存在或已删除"}),c.documentSpecId||d.push({level:"error",message:"模板未绑定文档规范包"}),l?.chapterMode==="fixed"&&0===l.chapterRules.filter(a=>a.required).length&&d.push({level:"warning",message:"固定章节模式未配置必需章节规则"}),l?.chapterMode==="dynamic"&&l.dynamicChapterRule.maxChapters&&l.dynamicChapterRule.minChapters&&l.dynamicChapterRule.maxChapters<l.dynamicChapterRule.minChapters&&d.push({level:"error",message:"动态章节规则的最多章节不能小于最少章节"});let o=e.resolve(b),p=await (0,j.Qh)().getProject(o);c.builtIn&&await p.incrementalIndex();let q=new Map((0,j.Yy)(o).map(a=>[a.relativePath,a])),r=k.map(a=>{let b=g.find(b=>b.id===a.roleId),c=q.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),s=u(i),t=i.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});return{templateId:a,projectRoleConfigId:c.projectRoleConfigId,documentSpecId:c.documentSpecId,fileDiagnostics:r,promptDiagnostics:t,spec:l?{id:l.id,name:l.name,factFields:l.factFields.length,gateRules:l.gateRules.length}:void 0,issues:d}}function z(a){if(o.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");t(s().filter(b=>b.id!==a))}function A(a){let b=w(a);if(!b)throw Error("Document template not found");let c=r({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=s();return d.push(c),t(d),c}let B=/\b(?:TDbPipe|TDbPipeValve|TDbPipeFitting|TDbWellh|AcDb\w+|Dwg\w+|Polyline|Hatch|Layer|BlockReference)\b/giu,C=/[\w\u4e00-\u9fa5()()\-—_+\s]+\.(?:pdf|dwg|docx?|xlsx?|xls|csv|png|jpe?g|webp)\b/giu;function D(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(C,"").slice(0,40)})`:""}`}function E(a){return[...a].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").replace(B,"").replace(C,"").replace(/\b(?:Model|Layout\d*|Entity|Handle|ObjectId|ByLayer|Continuous)\b/giu,"").replace(/[\t ]{2,}/gu," ").replace(/\n{3,}/gu,"\n\n").trim()}function F(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase(),d=E(b);return d.length>20?d.slice(0,4e3):[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp",".dwg"].includes(c)?`该资料为${c.replace(".","").toUpperCase()}格式附件,仅作为内部事实提取依据;正式正文不得引用文件名。`:d.slice(0,4e3)}(a.filePath,a.content)})).sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}:${a.content.slice(0,100)}`;return!c.has(b)&&(c.add(b),!0)}).slice(0,b)}function G(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function H(a,b=0){return`- ${D(a,b)}:${E(a.content).replace(/\s+/gu," ").slice(0,260)}`}function I(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-完整地图图纸$/u,"完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明空间关系、区域划分、点位、路线或专业布置。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、清单、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
5
5
  ${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>L(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 J(a){let b=a.resources.slice(0,20).map((a,b)=>[`- 资料:${D(a,b)}`,` 资料类型:${a.kind}`,` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 可用事实方向:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 可用内容:${a.snippets.map(E).filter(Boolean).join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map((a,b)=>`${D(a,b)}
6
6
  类型:${a.processingType||"reference"}
7
7
  章节/片段:${a.sectionTitle?.replace(C,"")||"资料片段"}
8
8
  内容:${E(a.content).replace(/\s+/gu," ").slice(0,900)}`).join("\n\n---\n\n");return[a.summary,b?`结构化资料:
9
9
  ${b}`:"",c?`文本/附件片段:
10
- ${c}`:""].filter(Boolean).join("\n\n")}function K(a,b,c=[]){if(!b)return a.chapters;if("fixed"===b.chapterMode)return b.chapterRules.length>0?[...b.chapterRules].sort((a,b)=>a.order-b.order).map(a=>({id:a.id,title:a.title,purpose:a.generationHint||a.title,requiredFacts:a.requiredFactIds||[],queries:[a.title,a.generationHint||"",...a.requiredFactIds||[]].filter(Boolean),pinnedEvidenceFilePaths:[]})):a.chapters;let d=b.dynamicChapterRule,f=Math.max(1,Math.min(20,d.minChapters||3)),g=Math.max(f,Math.min(30,d.maxChapters||Math.max(f,8))),h=new Set([...d.sourceRoleIds||[],...d.requiredFileRoleIds||[]]),i=c.filter(a=>0===h.size||a.roleId&&h.has(a.roleId)).filter((a,b,c)=>c.findIndex(b=>`${b.filePath}:${b.sectionTitle||""}`==`${a.filePath}:${a.sectionTitle||""}`)===b).slice(0,g).map((a,b)=>{let c=function(a,b,c){let d=(a.sectionTitle||e.basename(a.filePath).replace(/\.[^.]+$/u,"")||`资料片段 ${b+1}`).replace(/\s+/gu," ").slice(0,60);return c?c.replaceAll("{{index}}",String(b+1)).replaceAll("{{sourceTitle}}",d):d}(a,b,d.titleTemplate);return{id:`dynamic-${b+1}`,title:c,purpose:d.generationHint||`根据 ${a.filePath} 动态生成章节`,requiredFacts:d.requiredFactIds||[],queries:[c,a.filePath,a.sectionTitle||"",d.generationHint||""].filter(Boolean),pinnedEvidenceFilePaths:[a.filePath]}});if(i.length>=f)return i;let j=a.chapters.length>0?a.chapters.map(a=>a.title):["背景与目标","资料分析","结论与建议"];for(;i.length<f;){let a=i.length,b=j[a]||`动态章节 ${a+1}`;i.push({id:`dynamic-${a+1}`,title:b,purpose:d.generationHint||b,requiredFacts:d.requiredFactIds||[],queries:[b,d.generationHint||"",(d.sourceRoleIds||[]).filter(Boolean).join(" ")].filter(Boolean),pinnedEvidenceFilePaths:[]})}return i}function L(a,b){let c=`${a.filePath}
11
- ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function M(a,b){let c=K(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 N(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&L(a,b.name)}function O(a){return a.toLowerCase()}function P(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function Q(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>Q(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${Q(b)}`).filter(Boolean).join(";"):String(a)}async function R(a,b){let c=b.slice(0,36).map(a=>`文件:${a.filePath}
10
+ ${c}`:""].filter(Boolean).join("\n\n")}function K(a,b,c=[]){if(!b)return a.chapters;if("fixed"===b.chapterMode)return b.chapterRules.length>0?[...b.chapterRules].sort((a,b)=>a.order-b.order).map(b=>{let c=a.chapters.find(a=>a.id===b.id||a.title===b.title);return{id:b.id,title:b.title,purpose:b.generationHint||c?.purpose||b.title,requiredFacts:b.requiredFactIds||c?.requiredFacts||[],sections:c?.sections||[],queries:[b.title,b.generationHint||"",...b.requiredFactIds||[],...c?.sections||[]].filter(Boolean),pinnedEvidenceFilePaths:c?.pinnedEvidenceFilePaths||[]}}):a.chapters;let d=b.dynamicChapterRule,f=Math.max(1,Math.min(20,d.minChapters||3)),g=Math.max(f,Math.min(30,d.maxChapters||Math.max(f,8))),h=new Set([...d.sourceRoleIds||[],...d.requiredFileRoleIds||[]]),i=c.filter(a=>0===h.size||a.roleId&&h.has(a.roleId)).filter((a,b,c)=>c.findIndex(b=>`${b.filePath}:${b.sectionTitle||""}`==`${a.filePath}:${a.sectionTitle||""}`)===b).slice(0,g).map((a,b)=>{let c=function(a,b,c){let d=(a.sectionTitle||e.basename(a.filePath).replace(/\.[^.]+$/u,"")||`资料片段 ${b+1}`).replace(/\s+/gu," ").slice(0,60);return c?c.replaceAll("{{index}}",String(b+1)).replaceAll("{{sourceTitle}}",d):d}(a,b,d.titleTemplate);return{id:`dynamic-${b+1}`,title:c,purpose:d.generationHint||`根据 ${a.filePath} 动态生成章节`,requiredFacts:d.requiredFactIds||[],queries:[c,a.filePath,a.sectionTitle||"",d.generationHint||""].filter(Boolean),pinnedEvidenceFilePaths:[a.filePath]}});if(i.length>=f)return i;let j=a.chapters.length>0?a.chapters.map(a=>a.title):["背景与目标","资料分析","结论与建议"];for(;i.length<f;){let a=i.length,b=j[a]||`动态章节 ${a+1}`;i.push({id:`dynamic-${a+1}`,title:b,purpose:d.generationHint||b,requiredFacts:d.requiredFactIds||[],queries:[b,d.generationHint||"",(d.sourceRoleIds||[]).filter(Boolean).join(" ")].filter(Boolean),pinnedEvidenceFilePaths:[]})}return i}function L(a,b){let c=`${a.filePath}
11
+ ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function M(a,b){let c=K(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 N(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&L(a,b.name)}function O(a){return a.toLowerCase()}function P(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function Q(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>Q(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${Q(b)}`).filter(Boolean).join(";"):String(a)}function R(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 S(a){return Array.isArray(a)?a.map(a=>Q(a).trim()).filter(Boolean):"string"==typeof a?a.split(/[;;\n]/u).map(a=>a.trim()).filter(Boolean):[]}function T(a){return!!a&&(null!=a.chapters&&!Array.isArray(a.chapters)||null!=a.facts&&!Array.isArray(a.facts))}async function U(a,b){let c=b.slice(0,36).map(a=>`文件:${a.filePath}
12
12
  片段:${a.sectionTitle||""}
13
- 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),d=a.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",e=c.trim()?await ad(d,`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
13
+ 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),d=a.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",e=`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
14
14
  节点类型:${a.outputType}
15
15
  文件角色:${a.fileRoleName}(${a.fileRoleId})
16
16
  要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。
@@ -18,33 +18,38 @@ ${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|
18
18
  请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 只提取当前模板和规范包需要的正式章节;requirements 只保留可合并写入正文的核心要求,避免无依据地拆成过细子节点。facts 中计量单位保持原文含义,必要时使用导出友好的正式写法。
19
19
 
20
20
  绑定文件片段:
21
- ${c}`):void 0,f=(e?.chapters||[]).filter(a=>a.title).map((a,b)=>({id:P(a.title,`chapter-${b+1}`),title:a.title,order:b,sourceRequirement:a.sourceRequirement||a.title,requiredContents:Array.isArray(a.requiredContents)?a.requiredContents.filter(Boolean):[],writingRules:Array.isArray(a.writingRules)?a.writingRules.filter(Boolean):[],evidenceNeeds:Array.isArray(a.evidenceNeeds)?a.evidenceNeeds.filter(Boolean):[],minWords:Math.max(800,Math.min(3500,Number(a.minWords)||1200)),requirements:Array.isArray(a.requirements)?a.requirements.map((c,d)=>({id:P(`${a.title}-${c.title||d+1}`,`req-${b+1}-${d+1}`),title:c.title||`要求 ${d+1}`,requirementText:c.requirementText||c.title||"",requiredContents:Array.isArray(c.requiredContents)?c.requiredContents.filter(Boolean):[],writingRules:Array.isArray(c.writingRules)?c.writingRules.filter(Boolean):[],evidenceNeeds:Array.isArray(c.evidenceNeeds)?c.evidenceNeeds.filter(Boolean):[],preferredSourceRoleIds:Array.isArray(c.preferredSourceRoleIds)?c.preferredSourceRoleIds.filter(Boolean):[]})):[]})),g=(e?.facts||[]).filter(a=>a.key&&a.value).map(c=>({key:c.key,value:E(Q(c.value)),sourceFile:c.sourceFile||b.find(a=>a.filePath)?.filePath||"",roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:Array.isArray(c.relatedChapterHints)?c.relatedChapterHints.filter(Boolean):[]}));return{node:a,evidence:b,chapters:f.length>0?f:function(a,b){if("template_requirements"!==a.outputType)return[];let c=[],d=new Set;for(let a of b){for(let b of a.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!/^(?:第[一二三四五六七八九十百千万\d]+[章节]|[一二三四五六七八九十]+、|\d+(?:\.\d+)*[、..])/.test(b))continue;let e=b.replace(/^\d+(?:\.\d+)*[、..]\s*/u,"").slice(0,80);if(!(e.length<4||d.has(e)||/资料来源|证据来源|校验结果|缺失项|知识库/u.test(e))&&(d.add(e),c.push({id:P(e,`chapter-${c.length+1}`),title:e,order:c.length,sourceRequirement:a.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),c.length>=18))break}if(c.length>=18)break}return c}(a,b),facts:g.length>0?g:b.slice(0,20).map((b,c)=>({key:`${a.fileRoleName}事实${c+1}`,value:b.content.replace(/\s+/gu," ").slice(0,360),sourceFile:b.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:b.sectionTitle?[b.sectionTitle]:[]})).filter(a=>a.value.length>20),outputRequirements:Array.isArray(e?.outputRequirements)?e.outputRequirements.filter(Boolean):[],warnings:Array.isArray(e?.warnings)?e.warnings.filter(Boolean):[],forbidImageInsertion:e?.forbidImageInsertion??"drawing_facts"===a.outputType}}function S(a,b,c){let d=[b.title,...b.requiredFacts||[],...c?.requiredContents||[],...c?.evidenceNeeds||[],...c?.requirements.flatMap(a=>[a.title,...a.requiredContents,...a.evidenceNeeds])||[]].filter(Boolean);return a.flatMap(a=>a.facts.map(b=>({artifact:a,fact:b}))).filter(({fact:a})=>{let b=`${a.key}
21
+ ${c}`,f=[],g=c.trim()?await ai(d,e):void 0;if(T(g)){f.push(`${a.fileRoleName} 结构化读取返回格式异常,已尝试修复 JSON schema。`);let b=await ai("你是 JSON schema 修复器。只根据输入 JSON 重新整理字段类型,不新增事实,不改写事实含义。",`请把下面 JSON 修复为严格结构:{"chapters":[],"facts":[],"outputRequirements":[],"warnings":[],"forbidImageInsertion":false}。chapters facts 必须是数组;如果原值是对象,请转为数组;如果无法转换,使用空数组。只返回 JSON。
22
+
23
+ 原始 JSON:
24
+ ${JSON.stringify(g).slice(0,12e3)}`);b&&!T(b)?g=b:f.push(`${a.fileRoleName} 结构化读取修复失败,已降级使用证据片段生成。`)}let h=R(g?.chapters),i=R(g?.facts),j=[];h.forEach((a,b)=>{let c="string"==typeof a.title?a.title.trim():"";c&&j.push({id:P(c,`chapter-${b+1}`),title:c,order:b,sourceRequirement:a.sourceRequirement||c,requiredContents:S(a.requiredContents),writingRules:S(a.writingRules),evidenceNeeds:S(a.evidenceNeeds),minWords:Math.max(800,Math.min(3500,Number(a.minWords)||1200)),requirements:R(a.requirements).map((a,d)=>({id:P(`${c}-${a.title||d+1}`,`req-${b+1}-${d+1}`),title:a.title||`要求 ${d+1}`,requirementText:a.requirementText||a.title||"",requiredContents:S(a.requiredContents),writingRules:S(a.writingRules),evidenceNeeds:S(a.evidenceNeeds),preferredSourceRoleIds:S(a.preferredSourceRoleIds)}))})});let k=[];return i.forEach(c=>{let d="string"==typeof c.key?c.key.trim():"";d&&null!=c.value&&k.push({key:d,value:E(Q(c.value)),sourceFile:c.sourceFile||b.find(a=>a.filePath)?.filePath||"",roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:S(c.relatedChapterHints)})}),(0===j.length||0===k.length)&&f.push(`${a.fileRoleName} 部分结构化结果不足,已补充使用证据片段兜底。`),{node:a,evidence:b,chapters:j.length>0?j:function(a,b){if("template_requirements"!==a.outputType)return[];let c=[],d=new Set;for(let a of b){for(let b of a.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!/^(?:第[一二三四五六七八九十百千万\d]+[章节]|[一二三四五六七八九十]+、|\d+(?:\.\d+)*[、..])/.test(b))continue;let e=b.replace(/^\d+(?:\.\d+)*[、..]\s*/u,"").slice(0,80);if(!(e.length<4||d.has(e)||/资料来源|证据来源|校验结果|缺失项|知识库/u.test(e))&&(d.add(e),c.push({id:P(e,`chapter-${c.length+1}`),title:e,order:c.length,sourceRequirement:a.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),c.length>=18))break}if(c.length>=18)break}return c}(a,b),facts:k.length>0?k:b.slice(0,20).map((b,c)=>({key:`${a.fileRoleName}事实${c+1}`,value:b.content.replace(/\s+/gu," ").slice(0,360),sourceFile:b.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:b.sectionTitle?[b.sectionTitle]:[]})).filter(a=>a.value.length>20),outputRequirements:S(g?.outputRequirements),warnings:[...f,...S(g?.warnings)],forbidImageInsertion:g?.forbidImageInsertion??"drawing_facts"===a.outputType}}function V(a,b,c){let d=[b.title,...b.requiredFacts||[],...c?.requiredContents||[],...c?.evidenceNeeds||[],...c?.requirements.flatMap(a=>[a.title,...a.requiredContents,...a.evidenceNeeds])||[]].filter(Boolean);return a.flatMap(a=>a.facts.map(b=>({artifact:a,fact:b}))).filter(({fact:a})=>{let b=`${a.key}
22
25
  ${Q(a.value)}
23
- ${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function T(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function U(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let V=/.*(?:知识库证据|文件角色|提示词角色|文档规范包|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,W=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function X(a){return 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(V,"").replace(W,"").replace(C,"").replace(B,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\n{3,}/gu,"\n\n").trim()}let Y="你正在生成可直接交付的正式业务文档,不是分析报告、证据报告或系统调试报告。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n文档结构、禁用标题、必需章节、事实取舍和行业表达必须优先遵循用户绑定的提示词角色、项目角色配置和文档规范包;通用生成链路不得擅自发明业务规则。\n资料信息应内化为正式正文表达;除非规范包或用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n语言应正式、专业、克制,适合直接导出交付。";async function Z(a){if(0===a.issues.length)return{markdown:a.markdown,stage:void 0};let b=await ac(["你是文档质量补写和纠偏专家。必须严格按照模板、章节计划、规范包、提示词角色和已提供资料补齐内容,禁止编造。",a.forbidDrawingImages?"图片/图纸类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","保持 Markdown 标题层级;直接返回修复后的完整 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",`需要修复的问题:
24
- ${a.issues.map(a=>`- ${a}`).join("\n")}`,`章节计划:
26
+ ${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function W(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function X(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let Y=/.*(?:知识库证据|文件角色|提示词角色|文档规范包|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单|校验结果).*(?:\n|$)/gu,Z=/^\s*(?:#{1,6}\s*)?(?:PDF\s*第\s*\d+\s*页|rule\b|文件[::]|片段[::]|来源[::]).*$/gimu,$=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function _(a){return 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(Y,"").replace(Z,"").replace($,"").replace(C,"").replace(B,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\n{3,}/gu,"\n\n").trim()}let aa="你正在生成可直接交付的正式业务文档,不是分析报告、证据报告或系统调试报告。\n不得把“知识库、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到”等后台流程话术写入正文。\n文档结构、禁用标题、必需章节、事实取舍和行业表达必须优先遵循用户绑定的提示词角色、项目角色配置和文档规范包;通用生成链路不得擅自发明业务规则。\n资料信息应内化为正式正文表达;除非规范包或用户要求来源追溯章节,否则不要单列系统证据清单。\n表格、标题和公式必须使用 Markdown/导出友好的写法,避免 ASCII 流程图和容易导致导出异常的符号组合。\n语言应正式、专业、克制,适合直接导出交付。";async function ab(a){if(0===a.issues.length)return{markdown:a.markdown,stage:void 0};let b=a.template.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"),c=await ah(["你是文档质量补写和纠偏专家。必须严格按照模板、章节计划、规范包、提示词角色和已提供资料补齐内容,禁止编造。",a.forbidDrawingImages?"图片/图纸类资料只作为文本事实来源,禁止插入图片或 Markdown 图片语法。":"","保持 Markdown 标题层级;直接返回修复后的完整 Markdown。","必须保留模板配置的章节和二级小节;配置要求使用表格的小节,应由已提供资料和正文内容归纳生成正式 Markdown 表格,不得输出证据摘录表。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",`需要修复的问题:
27
+ ${a.issues.map(a=>`- ${a}`).join("\n")}`,b?`模板配置结构要求:
28
+ ${b}`:"",`章节计划:
25
29
  ${a.plan.map(a=>`- ${a.title}:${a.requiredContents.join("、")};要求=${a.sourceRequirement.slice(0,200)}`).join("\n")}`,"角色节点产物摘要:",a.artifacts.map(a=>{let b=a.chapters.slice(0,18).map(a=>`- ${a.title}:${a.requiredContents.join("、")||a.sourceRequirement.slice(0,120)}`).join("\n"),c=a.facts.slice(0,30).map(a=>`- ${a.key}:${Q(a.value).slice(0,220)}(来源:${a.sourceFile},角色:${a.roleId})`).join("\n");return[`## ${a.node.fileRoleName} / ${a.node.outputType}`,b?`章节/要求:
26
30
  ${b}`:"",c?`事实:
27
- ${c}`:"",a.outputRequirements.length?`输出要求:${a.outputRequirements.join(";")}`:""].filter(Boolean).join("\n")}).join("\n\n"),"待修复 Markdown:",a.markdown].filter(Boolean).join("\n\n"));return b&&!(b.length<.85*a.markdown.length)&&b.includes("#")?{markdown:X(U(b,a.forbidDrawingImages)),stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已按角色节点和章节计划完成质量补写,修复 ${a.issues.length} 项`}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"quality-repair",status:"fallback",message:`质量补写未返回有效结果:${a.issues.slice(0,5).join(";")}`}}}function $(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("prompt");if(b)return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.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 _(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("file");if(b)return[...b.fileRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({filePath:b,roleId:a.id})))}return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}function aa(a,b){let c=(0,i.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function ab(){let a=(0,l.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}async function ac(a,b,c=!1){try{let d=ab();if(!d)return;let{model:e,provider:f}=d,g=(0,h.createProvider)(aa(e.provider,f),{baseUrl:f.baseUrl,apiKey:f.apiKey,modelName:e.name,directEndpoint:f.directEndpoint});return(await g.chat([{role:"system",content:c?`${a}
28
- 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:.3*!c})).content.trim()}catch{return}}async function ad(a,b){let c=await ac(a,b,!0);if(c)try{let a=c.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function ae(a,b){let c=ab();if(!c?.provider.capabilities?.fileUnderstanding&&!c?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};let f=(0,h.createProvider)(aa(c.model.provider,c.provider),{baseUrl:c.provider.baseUrl,apiKey:c.provider.apiKey,modelName:c.model.name,directEndpoint:c.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===g.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{let a=(await f.understandFiles(g,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200})).content.trim();return{notes:a?[a]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:a?"success":"fallback",message:a?`已理解 ${g.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function af(a,b,c,d){let e=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],f=a.slice(0,24).map(a=>`文件:${a.filePath}
31
+ ${c}`:"",a.outputRequirements.length?`输出要求:${a.outputRequirements.join(";")}`:""].filter(Boolean).join("\n")}).join("\n\n"),"待修复 Markdown:",a.markdown].filter(Boolean).join("\n\n"));return c&&!(c.length<.85*a.markdown.length)&&c.includes("#")?{markdown:_(X(c,a.forbidDrawingImages)),stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已按角色节点和章节计划完成质量补写,修复 ${a.issues.length} 项`}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"quality-repair",status:"fallback",message:`质量补写未返回有效结果:${a.issues.slice(0,5).join(";")}`}}}function ac(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("prompt");if(b)return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.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 ad(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("file");if(b)return[...b.fileRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({filePath:b,roleId:a.id})))}return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}function ae(a,b){let c=new Map((0,m.XB)("prompt").map(a=>[a.id,a.executionType||"reference"]));return u(a).filter(a=>b.includes(c.get(a.roleId)||"reference")).map(a=>`## [${a.roleId}] ${a.name}
32
+ ${a.content}`).join("\n\n")}function af(a,b){let c=(0,i.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function ag(){let a=(0,l.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}async function ah(a,b,c=!1){try{let d=ag();if(!d)return;let{model:e,provider:f}=d,g=(0,h.createProvider)(af(e.provider,f),{baseUrl:f.baseUrl,apiKey:f.apiKey,modelName:e.name,directEndpoint:f.directEndpoint});return(await g.chat([{role:"system",content:c?`${a}
33
+ 只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:.3*!c})).content.trim()}catch{return}}async function ai(a,b){let c=await ah(a,b,!0);if(c)try{let a=c.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function aj(a,b){let c=ag();if(!c?.provider.capabilities?.fileUnderstanding&&!c?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};let f=(0,h.createProvider)(af(c.model.provider,c.provider),{baseUrl:c.provider.baseUrl,apiKey:c.provider.apiKey,modelName:c.model.name,directEndpoint:c.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===g.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{let a=(await f.understandFiles(g,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200})).content.trim();return{notes:a?[a]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:a?"success":"fallback",message:a?`已理解 ${g.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function ak(a,b,c,d){let e=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],f=a.slice(0,24).map(a=>`文件:${a.filePath}
29
34
  角色:${a.roleId||""}
30
35
  处理:${a.processingType||""}
31
- 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!f.trim())return{facts:[],stages:e};let g=M(c,d),h=g.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),i=await ad(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
36
+ 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!f.trim())return{facts:[],stages:e};let g=M(c,d),h=g.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),i=await ai(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色;事实取舍和冲突处理遵循规范包字段说明、文件角色和提示词角色配置。
32
37
  返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
33
38
 
34
39
  动态事实 schema:
35
40
  ${h}
36
41
 
37
42
  资料:
38
- ${f}`);return i?.facts?.length?{facts:i.facts.filter(a=>a.key&&a.value).map(a=>{let b=g.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:Q(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 抽取 ${i.facts.length} 条事实`}]}:{facts:[],stages:e}}function ag(a){return/出现禁用文本|资料未提供|导出|临时|无效|占位/iu.test(a.message)}function ah(a,b){return`${a.name}:${b}`}async function ai(a,b,c,d,e,f,g,h="",i={}){let j=J(I(b,c));if(!j.trim()&&!h.trim())return;let k=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",Y,"准确性优先级:章节计划/示范文本节点产物 > 规范包事实字段 > 角色节点结构化事实 > 知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。",i.forbidDrawingImages?"图片/图纸类资料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),l=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
39
- ${f}`:"",h||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:","- 保留章节二级标题,章节内部结构遵循模板、规范包和提示词角色,不要无依据地拆分过细小节;","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、技术规范等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 存在事实冲突时,按规范包、文件角色、提示词角色和用户要求指定的优先级处理;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,除非规范包或提示词要求,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",`- 内容不少于 ${i.minWords||1e3} 字,避免空泛口号。`,"",j?"内部资料:":"",j].filter(Boolean).join("\n"),m=await ac(k,l);if(m&&!(m.length<120))return X(U(m.startsWith("## ")?m:`## ${b.title}
43
+ ${f}`);return i?.facts?.length?{facts:i.facts.filter(a=>a.key&&a.value).map(a=>{let b=g.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:Q(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 抽取 ${i.facts.length} 条事实`}]}:{facts:[],stages:e}}function al(a){return/出现禁用文本|资料未提供|导出|临时|无效|占位|生成未完成|低于目标页数|缺少配置小节|缺少必要的正式表格|正文缺少章节标题/iu.test(a.message)}function am(a,b){return`${a.name}:${b}`}async function an(a,b,c,d,e,f,g,h="",i={}){let j=J(I(b,c));if(!j.trim()&&!h.trim())return;let k=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",aa,"准确性优先级:章节计划/示范文本节点产物 > 规范包事实字段 > 角色节点结构化事实 > 知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。",i.forbidDrawingImages?"图片/图纸类资料只作为文本事实依据;禁止插入图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),l=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,b.sections?.length?`本章必须包含以下二级小节:
44
+ ${b.sections.map(a=>`- ${a}`).join("\n")}`:"",g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
45
+ ${f}`:"",h||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式文档章节,要求:","- 保留章节标题,并按模板配置的小节生成二级小节;不要无依据地新增或拆分过细小节;",b.tableSections?.length?`- 本章以下小节适合使用正式工程表格辅助表达:${b.tableSections.join("、")};表格必须由正文归纳形成,禁止直接粘贴证据摘录。`:"","- 表格只用于工程概况、施工部署、重点难点、资源配置、质量安全控制、验收移交等适合结构化表达的位置;表格前后必须有说明,不能整节只有表格。","- 必须使用模板节点提取的章节要求和输出规范;","- 必须结合项目事实、表格数据、技术规范等内部资料;","- 对同一对象的事实应综合表达,优先写入准确的数量、单位、规格、参数、做法和标准;","- 存在事实冲突时,按规范包、文件角色、提示词角色和用户要求指定的优先级处理;","- 默认不要引用原始文件名,不写解析器内部对象名;","- 将资料要点自然融入正文,不单列系统证据或来源章节;","- 小节层级保持适度,除非规范包或提示词要求,不要输出中间分析产物标题;","- 组织关系、流程、职责、资源配置、风险控制等适合表格表达的内容可使用 Markdown 表格;",`- 内容不少于 ${i.minWords||1e3} 字,避免空泛口号。`,"",j?"内部资料:":"",j].filter(Boolean).join("\n"),m=await ah(k,l);if(m&&!(m.length<120))return _(X(m.startsWith("## ")?m:`## ${b.title}
40
46
 
41
- ${m}`,!!i.forbidDrawingImages))}async function aj(a){let b=J(I({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?[`规范包:${a.spec.name}`,`事实字段:${a.spec.factFields.map(a=>`${a.name}${a.required?"(必需)":""}`).join("、")}`,"dynamic"===a.spec.chapterMode?`章节规则:动态章节|来源=${a.spec.dynamicChapterRule.source}|标题=${a.spec.dynamicChapterRule.titleStrategy||"ai_summary"}|${a.spec.dynamicChapterRule.generationHint||"由资料自动规划"}`:`章节规则:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`≥${a.minWords}字`:""}`).join("、")}`,`门禁规则:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}`].join("\n"):"未绑定文档规范包。",d=await ac(["你是文档质量审查与优化专家。你要基于模板、规范包、提示词角色和内部资料对初稿进行二次审查和优化,使其成为正式业务文档。",Y,"准确性优先级:文档规范包/模板要求 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能用于风格偏好、历史纠偏和连续性检查;如果与知识库证据冲突,必须以知识库证据为准。","必须保持 Markdown 输出;保留已有正式标题层级和表格;不得保留或新增证据来源、资料来源、缺失项、校验结果等后台信息。","图片/图纸类资料默认只作为文本事实依据,除非用户明确要求插图,否则不要插入图片或 Markdown 图片语法;不得引用 PDF/DWG/Excel 文件名。","重点检查:正式章节完整性、资料事实内化使用、参数数字准确性、冲突事实是否按配置优先级处理、解析器内部对象名清理、表格呈现、表达专业性、导出友好性。","除非规范包或提示词明确要求,删除中间分析产物标题和后台流程说明。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
42
- ${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","请直接返回优化后的完整正式 Markdown,不要附加解释。"].filter(Boolean).join("\n"));return d&&!(d.length<.7*a.markdown.length)&&d.includes("#")?{markdown:X(d),stage:{type:"llm_review",roleId:"llm-review",status:"success",message:"已完成 LLM 二次审查与优化"}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:"skipped",message:"无可用模型或审查结果不可用,保留生成初稿"}}}function ak(a){let b=a.chapters.map(a=>X(a.content)).filter(Boolean).join("\n\n");return X(['<div class="document-cover">',`# ${a.title}`,"","</div>","",'<div class="page-break"></div>',"","## 目录","",...a.chapters.map((a,b)=>`${b+1}. ${a.title}`),"",'<div class="page-break"></div>',"",b].join("\n"))}function al(a){if(a?.aborted)throw Error("用户中止")}async function am(a){al(a.signal);let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=e.resolve(a.projectRoot||(0,j.aY)());if(!c)throw Error("No knowledge base project found");let g=(0,j.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),i=$(b),l=_(b),o=(0,n.py)(b.documentSpecId),p=u(i).map(a=>`## [${a.roleId}] ${a.name}
43
- ${a.content}`).join("\n\n"),q=a=>[a,e.isAbsolute(a)?e.relative(c,a):e.join(c,a)],r=new Set(l.flatMap(a=>q(a.filePath))),s=(0,m.XB)("file"),t=new Map(l.flatMap(a=>q(a.filePath).map(b=>[b,a.roleId]))),v=new Map(l.flatMap(a=>q(a.filePath).map(b=>[b,s.find(b=>b.id===a.roleId)?.processingType||"reference"]))),x=await g.getProject(c);await x.incrementalIndex(),al(a.signal);let y=[],z=[],A=[],D=[],H=[],I=function(a,b){let c=(0,m.XB)("file"),d=(0,m.XB)("prompt"),e=u(b),f=_(a),g=new Map;for(let a of f)g.set(a.roleId,[...g.get(a.roleId)||[],a.filePath]);let h=c.filter(a=>g.has(a.id)),i=d.filter(a=>e.some(b=>b.roleId===a.id));return h.map((a,b)=>{let c=i.map(b=>{let c=e.filter(a=>a.roleId===b.id).map(a=>a.content);return{promptRole:b,texts:c,score:function(a,b,c){let d=O(`${a} ${c.join(" ")}`),e=0;for(let a of(/fact|抽取|读取|提取|理解|reference/u.test(d)&&(e+=5),/chapter_generation|章节生成|正文生成/u.test(d)&&(e+=1),[b.id,b.name,b.processingType||""].filter(Boolean)))d.includes(O(a))&&(e+=4);return/示范文本|招标文件|章节|目录|输出要求/u.test(`${b.name} ${c.join(" ")}`)&&/示范文本|章节|目录|输出要求|编制要求/u.test(d)&&(e+=6),/清单|工程量/u.test(`${b.name} ${c.join(" ")}`)&&/清单|工程量|项目特征/u.test(d)&&(e+=6),/图纸|drawing|cad/u.test(`${b.name} ${c.join(" ")}`)&&/图纸|drawing|cad|文本|标注/u.test(d)&&(e+=6),e}(b.id,a,c)}}).sort((a,b)=>b.score-a.score),d=c.filter(a=>a.score>=5).slice(0,2),f=c[b]||c[0],h=d.length>0?d:f?[f]:[],j=h.map(a=>a.promptRole.id),k=h.flatMap(a=>a.texts);return{id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:j,promptTexts:k,outputType:function(a,b=[]){let c=O(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);return/示范文本|招标文件|章节|目录|输出要求|编制要求|template|tender/u.test(c)?"template_requirements":/清单|工程量|bill|boq|quantity/u.test(c)?"bill_facts":/图纸|drawing|cad|设计图|图纸解析/u.test(c)?"drawing_facts":/规范|标准|spec|technical/u.test(c)?"technical_facts":/项目|工程概况|事实|fact/u.test(c)?"project_facts":"reference_facts"}(a,k)}})}(b,i),J=[];for(let b of I){al(a.signal);let d=function(a,b,c){let d=[];for(let e of b.filePaths){let f=a.getFileDetail(e);if(f){d.push(...f.chunks.slice(0,120).map(a=>({chapterId:b.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:b.fileRoleId,processingType:b.processingType,sectionTitle:a.sectionTitle,source:"role-node"})));continue}d.push(...G(e,b.fileRoleId,b.processingType,b.id,c))}return F(d,120)}(x,b,c);z.push(...d);let e=await R(b,d);J.push(e),H.push({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:d.length>0?"success":"fallback",message:`${b.fileRoleName} 节点已按绑定提示词读取,产出章节 ${e.chapters.length} 个、事实 ${e.facts.length} 条`}),a.onProgress?.([...H])}let V=function(a){let b=a.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),c=new Map;for(let a of b.sort((a,b)=>a.order-b.order))c.has(a.title)||c.set(a.title,a);return[...c.values()]}(J),W=[b.name,b.outputTitle,a.requirement,o?.dynamicChapterRule?.generationHint,...o?.dynamicChapterRule?.sourceRoleIds||[]].filter(Boolean).join(" "),Y=o?.chapterMode==="dynamic"&&0===V.length?(await g.search(c,W||b.name,{scope:"project",limit:20,weights:{keyword:.45,vector:.35,rewrite:.65,hybridBonus:.1}})).results.map(a=>({chapterId:"dynamic-planning",filePath:a.filePath,score:a.score,content:a.content,roleId:t.get(a.filePath),processingType:v.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})):[],aa=o?.chapterMode==="dynamic"&&V.length>0?V.map((a,b)=>({id:P(a.id,`dynamic-${b+1}`),title:a.title,purpose:[a.sourceRequirement,...a.writingRules].filter(Boolean).join("\n").slice(0,1200),requiredFacts:[...new Set([...a.requiredContents,...a.evidenceNeeds])],queries:[...new Set([a.title,...a.requiredContents,...a.evidenceNeeds,...a.requirements.flatMap(a=>[a.title,a.requirementText,...a.evidenceNeeds])].filter(Boolean))],pinnedEvidenceFilePaths:[]})):K(b,o,Y),ab=[b.name,b.outputTitle,a.requirement,...aa.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),ac=(0,k.Hh)(ab,8,c),ad=ac.length>0?ac.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",am={type:"context_recall",roleId:"project-memory",status:ac.length>0?"success":"skipped",message:ac.length>0?`已注入 ${ac.length} 条短期/长期上下文`:"未召回可用项目上下文"};for(let d of(H.push({type:"role_binding",roleId:b.projectRoleConfigId||"none",status:"success",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`}),H.push(am),a.onProgress?.([...H]),aa)){al(a.signal);try{let e=[],f=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(d,V),j=f?[f.title,...f.requiredContents,...f.evidenceNeeds,...f.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[];for(let a of[...new Set([...d.queries.length>0?d.queries:[b.name,b.outputTitle,d.title],...j])]){let b=await g.search(c,a,{scope:"project",limit:Math.max(h,r.size>0?30:h),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});e.push(...b.results.filter(a=>0===r.size||r.has(a.filePath)).map(a=>({chapterId:d.id,filePath:a.filePath,score:a.score,content:a.content,roleId:t.get(a.filePath),processingType:v.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let k=new Set(d.pinnedEvidenceFilePaths||[]),l=S(J,d,f);for(let a of(e.push(...l.flatMap(({artifact:a})=>a.evidence.slice(0,8).map(a=>({...a,chapterId:d.id,source:"role-node"})))),new Set([...k]))){let b=k.has(a),f=x.getFileDetail(a);if(!f){e.push(...G(a,t.get(a),v.get(a),d.id,c).map(a=>({...a,source:b?"pinned-evidence":a.source})));continue}e.push(...f.chunks.slice(0,Math.max(h,20)).map(a=>({chapterId:d.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:t.get(f.file.relativePath),processingType:v.get(f.file.relativePath),sectionTitle:a.sectionTitle,source:b?"pinned-evidence":"bound-file"})))}let m=F(e,h);z.push(...m);let n=d.requiredFacts.filter(a=>!m.some(b=>L(b,a)));for(let a of(0===m.length&&A.push(`${d.title}:未检索到明确资料依据`),n))A.push(`${d.title}:${a} 未检索到明确依据`);H.some(a=>"knowledge_retrieval"===a.type)||(H.push({type:"knowledge_retrieval",roleId:"knowledge-base",status:z.length>0?"success":"fallback",message:`已检索/绑定 ${z.length} 条证据`}),a.onProgress?.([...H])),al(a.signal);let o=T(J,b),q=function(a,b,c){let d=S(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?`要求项:
47
+ ${m}`,!!i.forbidDrawingImages))}async function ao(a){let b=J(I({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?[`规范包:${a.spec.name}`,`事实字段:${a.spec.factFields.map(a=>`${a.name}${a.required?"(必需)":""}`).join("、")}`,"dynamic"===a.spec.chapterMode?`章节规则:动态章节|来源=${a.spec.dynamicChapterRule.source}|标题=${a.spec.dynamicChapterRule.titleStrategy||"ai_summary"}|${a.spec.dynamicChapterRule.generationHint||"由资料自动规划"}`:`章节规则:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`≥${a.minWords}字`:""}`).join("、")}`,`门禁规则:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}`].join("\n"):"未绑定文档规范包。",d=await ah(["你是文档质量审查与优化专家。你要基于模板、规范包、提示词角色和内部资料对初稿进行二次审查和优化,使其成为正式业务文档。",aa,"准确性优先级:文档规范包/模板要求 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能用于风格偏好、历史纠偏和连续性检查;如果与知识库证据冲突,必须以知识库证据为准。","必须保持 Markdown 输出;保留已有正式标题层级和表格;不得保留或新增证据来源、资料来源、缺失项、校验结果等后台信息。","图片/图纸类资料默认只作为文本事实依据,除非用户明确要求插图,否则不要插入图片或 Markdown 图片语法;不得引用 PDF/DWG/Excel 文件名。","重点检查:正式章节完整性、资料事实内化使用、参数数字准确性、冲突事实是否按配置优先级处理、解析器内部对象名清理、表格呈现、表达专业性、导出友好性。","除非规范包或提示词明确要求,删除中间分析产物标题和后台流程说明。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
48
+ ${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","请直接返回优化后的完整正式 Markdown,不要附加解释。"].filter(Boolean).join("\n"));return d&&!(d.length<.7*a.markdown.length)&&d.includes("#")?{markdown:_(d),stage:{type:"llm_review",roleId:"llm-review",status:"success",message:"已完成 LLM 二次审查与优化"}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:"skipped",message:"无可用模型或审查结果不可用,保留生成初稿"}}}function 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=RegExp(`(^##\\s+${ap(b)}\\s*$)([\\s\\S]*?)(?=\\n##\\s+|(?![\\s\\S]))`,"mu").exec(a);if(c&&void 0!==c.index)return{start:c.index,end:c.index+c[0].length,heading:c[1]||`## ${b}`,body:c[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=>_(a.content)).filter(Boolean).join("\n\n"),c=a.chapters.flatMap((a,b)=>{let c=a.sections||[];return[`${b+1}. ${a.title}`,...c.map((a,c)=>` ${/^\s*\d+(?:\.\d+)+\s+/.test(a)?a:`${b+1}.${c+1} ${a}`}`)]});return _(['<div class="document-cover">',`# ${a.title}`,"","</div>","",'<div class="page-break"></div>',"","## 目录","",...c,"",'<div class="page-break"></div>',"",b].join("\n"))}function as(a){if(a?.aborted)throw Error("用户中止")}async function at(a){as(a.signal);let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=e.resolve(a.projectRoot||(0,j.aY)());if(!c)throw Error("No knowledge base project found");let g=(0,j.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),i=ac(b),l=ad(b),o=(0,n.py)(b.documentSpecId),p=ae(i,["chapter_generation","formatting","reference"]),q=ae(i,["fact_extraction","reference"]),r=ae(i,["validation","llm_review","formatting","reference"]),s=a=>[a,e.isAbsolute(a)?e.relative(c,a):e.join(c,a)],t=new Set(l.flatMap(a=>s(a.filePath))),v=(0,m.XB)("file"),x=new Map(l.flatMap(a=>s(a.filePath).map(b=>[b,a.roleId]))),y=new Map(l.flatMap(a=>s(a.filePath).map(b=>[b,v.find(b=>b.id===a.roleId)?.processingType||"reference"]))),z=await g.getProject(c);await z.incrementalIndex(),as(a.signal);let A=[],D=[],H=[],I=[],J=[],R=function(a,b){let c=(0,m.XB)("file"),d=(0,m.XB)("prompt"),e=u(b),f=ad(a),g=new Map;for(let a of f)g.set(a.roleId,[...g.get(a.roleId)||[],a.filePath]);let h=c.filter(a=>g.has(a.id)),i=d.filter(a=>e.some(b=>b.roleId===a.id));return h.map((a,b)=>{let c=i.map(b=>{let c=e.filter(a=>a.roleId===b.id).map(a=>a.content);return{promptRole:b,texts:c,score:function(a,b,c){let d=O(`${a} ${c.join(" ")}`),e=0;for(let a of(/fact|抽取|读取|提取|理解|reference/u.test(d)&&(e+=5),/chapter_generation|章节生成|正文生成/u.test(d)&&(e+=1),[b.id,b.name,b.processingType||""].filter(Boolean)))d.includes(O(a))&&(e+=4);return/示范文本|招标文件|章节|目录|输出要求/u.test(`${b.name} ${c.join(" ")}`)&&/示范文本|章节|目录|输出要求|编制要求/u.test(d)&&(e+=6),/清单|工程量/u.test(`${b.name} ${c.join(" ")}`)&&/清单|工程量|项目特征/u.test(d)&&(e+=6),/图纸|drawing|cad/u.test(`${b.name} ${c.join(" ")}`)&&/图纸|drawing|cad|文本|标注/u.test(d)&&(e+=6),e}(b.id,a,c)}}).sort((a,b)=>b.score-a.score),d=c.filter(a=>a.score>=5).slice(0,2),f=c[b]||c[0],h=d.length>0?d:f?[f]:[],j=h.map(a=>a.promptRole.id),k=h.flatMap(a=>a.texts);return{id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:j,promptTexts:k,outputType:function(a,b=[]){let c=O(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);return/示范文本|招标文件|章节|目录|输出要求|编制要求|template|tender/u.test(c)?"template_requirements":/清单|工程量|bill|boq|quantity/u.test(c)?"bill_facts":/图纸|drawing|cad|设计图|图纸解析/u.test(c)?"drawing_facts":/规范|标准|spec|technical/u.test(c)?"technical_facts":/项目|工程概况|事实|fact/u.test(c)?"project_facts":"reference_facts"}(a,k)}})}(b,i),S=[];for(let b of R){as(a.signal);let d=function(a,b,c){let d=[];for(let e of b.filePaths){let f=a.getFileDetail(e);if(f){d.push(...f.chunks.slice(0,120).map(a=>({chapterId:b.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:b.fileRoleId,processingType:b.processingType,sectionTitle:a.sectionTitle,source:"role-node"})));continue}d.push(...G(e,b.fileRoleId,b.processingType,b.id,c))}return F(d,120)}(z,b,c);D.push(...d);let e=await U(b,d);S.push(e),J.push({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:d.length>0?"success":"fallback",message:`${b.fileRoleName} 节点已按绑定提示词读取,产出章节 ${e.chapters.length} 个、事实 ${e.facts.length} 条`}),a.onProgress?.([...J])}let T=function(a){let b=a.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),c=new Map;for(let a of b.sort((a,b)=>a.order-b.order))c.has(a.title)||c.set(a.title,a);return[...c.values()]}(S),Y=[b.name,b.outputTitle,a.requirement,o?.dynamicChapterRule?.generationHint,...o?.dynamicChapterRule?.sourceRoleIds||[]].filter(Boolean).join(" "),Z=o?.chapterMode==="dynamic"&&0===T.length?(await g.search(c,Y||b.name,{scope:"project",limit:20,weights:{keyword:.45,vector:.35,rewrite:.65,hybridBonus:.1}})).results.map(a=>({chapterId:"dynamic-planning",filePath:a.filePath,score:a.score,content:a.content,roleId:x.get(a.filePath),processingType:y.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})):[],$=o?.chapterMode==="dynamic"&&T.length>0?T.map((a,b)=>({id:P(a.id,`dynamic-${b+1}`),title:a.title,purpose:[a.sourceRequirement,...a.writingRules].filter(Boolean).join("\n").slice(0,1200),requiredFacts:[...new Set([...a.requiredContents,...a.evidenceNeeds])],queries:[...new Set([a.title,...a.requiredContents,...a.evidenceNeeds,...a.requirements.flatMap(a=>[a.title,a.requirementText,...a.evidenceNeeds])].filter(Boolean))],pinnedEvidenceFilePaths:[]})):K(b,o,Z),aa=[b.name,b.outputTitle,a.requirement,...$.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),af=(0,k.Hh)(aa,8,c),ag=af.length>0?af.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",ah={type:"context_recall",roleId:"project-memory",status:af.length>0?"success":"skipped",message:af.length>0?`已注入 ${af.length} 条短期/长期上下文`:"未召回可用项目上下文"};for(let d of(J.push({type:"role_binding",roleId:b.projectRoleConfigId||"none",status:"success",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`}),J.push(ah),a.onProgress?.([...J]),$)){as(a.signal);try{let e=[],f=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(d,T),j=f?[f.title,...f.requiredContents,...f.evidenceNeeds,...f.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[];for(let a of[...new Set([...d.queries.length>0?d.queries:[b.name,b.outputTitle,d.title],...j])]){let b=await g.search(c,a,{scope:"project",limit:Math.max(h,t.size>0?30:h),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});e.push(...b.results.filter(a=>0===t.size||t.has(a.filePath)).map(a=>({chapterId:d.id,filePath:a.filePath,score:a.score,content:a.content,roleId:x.get(a.filePath),processingType:y.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let k=new Set(d.pinnedEvidenceFilePaths||[]),l=V(S,d,f);for(let a of(e.push(...l.flatMap(({artifact:a})=>a.evidence.slice(0,8).map(a=>({...a,chapterId:d.id,source:"role-node"})))),new Set([...k]))){let b=k.has(a),f=z.getFileDetail(a);if(!f){e.push(...G(a,x.get(a),y.get(a),d.id,c).map(a=>({...a,source:b?"pinned-evidence":a.source})));continue}e.push(...f.chunks.slice(0,Math.max(h,20)).map(a=>({chapterId:d.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:x.get(f.file.relativePath),processingType:y.get(f.file.relativePath),sectionTitle:a.sectionTitle,source:b?"pinned-evidence":"bound-file"})))}let m=F(e,h);D.push(...m);let n=d.requiredFacts.filter(a=>!m.some(b=>L(b,a)));for(let a of(0===m.length&&H.push(`${d.title}:未检索到明确资料依据`),n))H.push(`${d.title}:${a} 未检索到明确依据`);J.some(a=>"knowledge_retrieval"===a.type)||(J.push({type:"knowledge_retrieval",roleId:"knowledge-base",status:D.length>0?"success":"fallback",message:`已检索/绑定 ${D.length} 条证据`}),a.onProgress?.([...J])),as(a.signal);let q=W(S,b),r=function(a,b,c){let d=V(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?`要求项:
44
49
  ${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}:${E(Q(b.value))}`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
45
50
  ${b.slice(0,18).map(a=>a.replace(C,"").replace(B,"")).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
46
51
  ${e}`:"",g?`【角色节点结构化产物】
47
- ${g}`:""].filter(Boolean).join("\n\n")}(J,d,f),s=await Promise.race([ai(b,d,m,n,p,ad,a.requirement,q,{forbidDrawingImages:o,minWords:f?.minWords||1200}),new Promise(a=>setTimeout(()=>a(null),6e4))]);al(a.signal);let u=s||function(a,b,c,d){let e=c.slice(0,8).map((a,b)=>`| ${b+1} | ${a.content.replace(/\s+/gu," ").replace(/\|/gu," ").slice(0,160)} | ${a.processingType||"文本资料"} |`);return X([`## ${b.title}`,"",`本章围绕${b.purpose||b.title}展开,结合工程范围、专业施工条件和现场组织要求,形成可执行的施工组织安排。`,"",e.length?"| 序号 | 施工组织要点 | 适用类型 |":"",e.length?"|---:|---|---|":"",...e,"","施工过程中,项目部将按照招标文件要求和经审批的施工方案组织实施,强化技术交底、过程检查、工序验收和整改闭环,确保各专业施工内容衔接有序、质量安全受控。"].filter(Boolean).join("\n"))}(b.id,d,m,0);D.push({type:"chapter_generation",roleId:"chapter_generation",promptId:i.find(a=>"chapter_generation"===a.roleId)?.promptId,status:s?"success":"fallback",message:s?`${d.title} 已由大模型生成`:`${d.title} 使用本地专业兜底生成`}),y.push({id:d.id,title:d.title,content:u,evidence:m,missingFacts:n})}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${d.title} failed:`,b),D.push({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${d.title} 生成失败`})}H.some(a=>"chapter_generation"===a.type&&a.message===D[D.length-1]?.message)||H.push(D[D.length-1]),a.onProgress?.([...H])}al(a.signal);let an={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{an=await ae(c,z)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(al(a.signal),an.notes))z.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let ao=function(a,b,c){let d={};for(let e of M(a,c)){let a=b.find(a=>N(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(b,z,o);for(let a of J)for(let b of a.facts)ao[b.key]=`${Q(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let ap=function(a,b,c){let d=M(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(!N(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}(z,b,o),aq={facts:[],stages:[]};try{aq=await af(z,p,b,o)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}al(a.signal);let ar=[...J.flatMap(a=>a.facts.map(a=>({key:a.key,value:Q(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...ap,...aq.facts];for(let a of(H.some(a=>a.type===an.stage.type)||H.push(an.stage),aq.stages))H.some(b=>b.type===a.type)||H.push(a);a.onProgress?.([...H]);let as=function(a){let b=[],c=new Set;for(let g of a.filter(a=>"table"===a.processingType)){if(c.has(g.filePath))continue;c.add(g.filePath);let a=(0,j.aY)(),h=e.isAbsolute(g.filePath)?g.filePath:d.existsSync(e.join(a,"knowledgeBase",g.filePath))?e.join(a,"knowledgeBase",g.filePath):e.join(a,g.filePath),i=e.extname(g.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=f.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=f.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let h=e.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=e[h].filter(Boolean),j=e.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:g.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let k=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(k.length<2)continue;let l=k[0].includes("|")?"|":k[0].includes(" ")?" ":",",m=k.map(a=>a.split(l).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:g.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(z),at=z.filter(a=>"pinned-evidence"===a.source).length,au=z.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,av={type:"reference",roleId:"quality-enhancement",status:z.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${z.length} 条,人工确认/固定证据 ${at} 条,项目上下文 ${ac.length} 条,自动检索证据 ${au} 条`};for(let b of(H.push(av),a.onProgress?.([...H]),ar))ao[b.key]=`${Q(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let aw=new Map;for(let a of z)aw.set(a.filePath,(aw.get(a.filePath)??0)+1);let ax=[...aw.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ay=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));return{project:a,schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),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=Q(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)}}(ar,as,A,o),az=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&&0===_(c).length&&e.push("模板未绑定任何知识库文件"),c&&0===$(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}}(y,ar,b),aA=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}(az,ay,y),aB=[{type:"role_binding",roleId:b.projectRoleConfigId||"none",status:l.length>0?"success":"fallback",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`},am,{type:"knowledge_retrieval",roleId:"knowledge-base",status:z.length>0?"success":"fallback",message:`已检索/绑定 ${z.length} 条证据`},av,an.stage,...aq.stages,...D,{type:"validation",roleId:"document-workflow",status:az.errors.length>0?"failed":"success",message:`错误 ${az.errors.length},警告 ${az.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"},{type:"export_ready",roleId:"document-workflow",status:az.errors.length>0?"failed":"success",message:az.errors.length>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"}],aC={templateId:b.id,templateName:b.name,title:b.outputTitle,requirement:a.requirement||"",facts:ao,structuredFacts:ar,factsModel:ay,chapters:y,sources:ax,missingItems:[...new Set(A)],validation:az,validationIssues:aA,executionStages:aB,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},aD=ak(aC);al(a.signal);let aE=await aj({template:b,spec:o,markdown:aD,evidence:z,promptTexts:p,projectContext:ad,requirement:a.requirement});al(a.signal);let aF=T(J,b),aG=U(aE.markdown===aD?ak({...aC,validationIssues:aA,exportGate:aC.exportGate,executionStages:aB}):aE.markdown,aF),aH=function(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 a of b){let b=c.find(b=>b.title===a.title),d=b?.minWords||1e3;a.content.length<d&&f.push(`${a.title} 内容深度不足:${a.content.length}/${d}`)}for(let b of d){let c=b.facts.slice(0,5).map(a=>Q(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)}(aG,y,V,J,aF),aI=await Z({markdown:aG,template:b,plan:V,artifacts:J,promptTexts:p,requirement:a.requirement,issues:aH,forbidDrawingImages:aF});al(a.signal);let aJ=aI.stage?[...aB,aE.stage,aI.stage]:[...aB,aE.stage],aK=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&ag(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:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))}],e=a.filter(a=>"error"===a.level&&ag(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(aA=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>N(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>N(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}if("fixed"===a.chapterMode)for(let b of a.chapterRules.filter(a=>a.required)){k.has(b.title)||h.push({level:"error",message:`必需章节缺失:${b.title}`,suggestion:"请在模板或规范包章节规则中补齐章节。"});let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&h.push({level:"warning",message:`章节内容低于最低字数:${b.title}`,suggestion:`建议不少于 ${b.minWords} 字。`})}else{let b=a.dynamicChapterRule;if(b.minChapters&&d.length<b.minChapters&&h.push({level:"warning",message:`动态章节数量低于最少章节:${d.length}/${b.minChapters}`,suggestion:"请补充资料或降低最少章节数。"}),b.maxChapters&&d.length>b.maxChapters&&h.push({level:"warning",message:`动态章节数量超过最多章节:${d.length}/${b.maxChapters}`,suggestion:"请收紧来源文件角色或降低召回范围。"}),b.minWordsPerChapter)for(let a of d)a.content.length<b.minWordsPerChapter&&h.push({level:"warning",message:`动态章节内容低于最低字数:${a.title}`,suggestion:`建议不少于 ${b.minWordsPerChapter} 字。`})}let l=e.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a)),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0}));for(let b of a.gateRules){let a=b.level,n=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},o=n.target||b.target||"",p=n.value||b.value||o,q=n.min||Number(b.value)||1,r=d.find(a=>a.title===o),s="chapter"===n.subject&&r?r.content:e,t=p?function(a){try{return RegExp(a,"iu")}catch{return}}(p):void 0;"fact"===n.subject&&"exists"===n.operator&&o&&!j.has(o)&&h.push({level:a,message:ah(b,`缺少事实 ${o}`)}),"chapter"===n.subject&&"exists"===n.operator&&o&&!k.has(o)&&h.push({level:a,message:ah(b,`缺少章节 ${o}`)}),"file_role"===n.subject&&"exists"===n.operator&&o&&!f.some(a=>a.roleId===o)&&h.push({level:a,message:ah(b,`缺少文件角色 ${o}`)}),"prompt_role"===n.subject&&"exists"===n.operator&&o&&!g.some(a=>a.roleId===o)&&h.push({level:a,message:ah(b,`缺少提示词角色 ${o}`)}),"document"===n.subject&&"contains"===n.operator&&p&&!e.includes(p)&&h.push({level:a,message:ah(b,`全文必须包含 ${p}`)}),"document"===n.subject&&"not_contains"===n.operator&&p&&e.includes(p)&&h.push({level:a,message:ah(b,`出现禁用文本 ${p}`)}),"document"!==n.subject&&"chapter"!==n.subject||"regex_match"!==n.operator||!p||t&&t.test(s)||h.push({level:a,message:ah(b,`未匹配正则 ${p}`)}),("document"===n.subject||"chapter"===n.subject)&&"regex_not_match"===n.operator&&t?.test(s)&&h.push({level:a,message:ah(b,`匹配到禁止正则 ${p}`)}),"chapter"===n.subject&&"contains"===n.operator&&o&&p&&(!r||!r.content.includes(p))&&h.push({level:a,message:ah(b,`章节 ${o} 必须包含 ${p}`)}),"chapter"===n.subject&&"not_contains"===n.operator&&r?.content.includes(p)&&h.push({level:a,message:ah(b,`章节 ${o} 出现禁用文本 ${p}`)}),"chapter"===n.subject&&"min_length"===n.operator&&o&&(!r||r.content.length<q)&&h.push({level:a,message:ah(b,`章节 ${o} 低于 ${q} 字`)}),"table"===n.subject&&"min_count"===n.operator&&c.tables.length+l.length<q&&h.push({level:a,message:ah(b,`表格数量少于 ${q}`)}),"table"===n.subject&&"table_explanation_required"===n.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:ah(b,"存在缺少说明文字的表格")}),"image"===n.subject&&"min_count"===n.operator&&m.length<q&&h.push({level:a,message:ah(b,`图片数量少于 ${q}`)}),"image"===n.subject&&"image_caption_required"===n.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:ah(b,"存在缺少说明文字的图片")}),"source"===n.subject&&"all_have_source"===n.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:ah(b,"存在无来源事实")}),"source"===n.subject&&"min_count"===n.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<q&&h.push({level:a,message:ah(b,`来源数量少于 ${q}`)})}return h}(o,[...aA,...aH.map(a=>({level:"warning",message:a}))],ay,y,aI.markdown,l,i),ay,y),aL={...aC,validationIssues:aA,exportGate:aK,executionStages:aJ},aM=U(aI.markdown,aF);return{...aL,markdown:aM}}async function an(a){let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let d=a.projectRoot||(0,j.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,j.Qh)(),f=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),g=[];for(let a of c.queries){let b=await e.search(d,a,{scope:"project",limit:f,weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});g.push(...b.results.map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let h=F(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",k=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!k.has(a)&&!h.some(b=>L(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(H),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>p,FV:()=>o,Mu:()=>q,NR:()=>r,XB:()=>m,dg:()=>n,dw:()=>s});var d=c(73024),e=c(48161),f=c(76760);function g(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function h(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function i(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:h(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,resourceId:a.resourceId||a.resourceIds?.[0]||void 0,resourceIds:Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds.filter(Boolean):a.resourceId?[a.resourceId]:[],executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function j(a){return{id:h(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[],promptRoles:Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]}}function k(){try{let a=g();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(i),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(i):[],configs:Array.isArray(b.configs)?b.configs.map(j):[]}}catch{return{roles:[],configs:[]}}}function l(a){d.writeFileSync(g(),JSON.stringify({roles:a.roles.map(i),configs:a.configs.map(j)},null,2),"utf-8")}function m(a){let b=k().roles;return a?b.filter(b=>b.type===a):b}function n(a){let b=i(a),c=k();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),l(c),b}function o(a,b){let c=k();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)})),l(c)}function p(){return k().configs}function q(a){return k().configs.find(b=>b.id===a)}function r(a){let b={...j(a),builtIn:!1},c=k();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),l(c),b}function s(a){let b=k();b.configs=b.configs.filter(b=>b.id!==a),l(b)}},99842:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>n,PH:()=>u,dg:()=>l,h0:()=>p,i3:()=>o,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
52
+ ${g}`:""].filter(Boolean).join("\n\n")}(S,d,f),s=o?.chapterRules.find(a=>a.id===d.id||a.title===d.title),u=f?.minWords||s?.minWords||o?.dynamicChapterRule.minWordsPerChapter||1200,v=await Promise.race([an(b,d,m,n,p,ag,a.requirement,r,{forbidDrawingImages:q,minWords:u}),new Promise(a=>setTimeout(()=>a(null),12e4))]);as(a.signal);let w=v||function(a,b,c,d){let e=(b.sections||[]).flatMap(a=>[`### ${a}`,"","本节应结合招标文件、工程量清单、图纸资料和现场组织要求进行正式展开,重点说明施工组织安排、实施方法、质量安全控制、责任分工和检查验收闭环。","","因当前大模型未能返回稳定章节内容,本节仅保留正式写作骨架,系统不会把原始资料片段、文件名或后台证据表直接写入正文。建议重新生成或补充模型能力后再导出正式文件。",""]);return _([`## ${b.title}`,"","本章内容需要依据已绑定资料进一步生成正式正文。为避免错误资料、文件名页或原始证据片段进入正式文件,当前仅保留章节结构和写作方向。","",...e].filter(Boolean).join("\n"))}(b.id,d,0,0);I.push({type:"chapter_generation",roleId:"chapter_generation",promptId:i.find(a=>"chapter_generation"===a.roleId)?.promptId,status:v?"success":"fallback",message:v?`${d.title} 已由大模型生成`:`${d.title} 使用本地专业兜底生成`}),A.push({id:d.id,title:d.title,content:w,evidence:m,missingFacts:n,sections:d.sections||[]})}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${d.title} failed:`,b),I.push({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${d.title} 生成失败`})}J.some(a=>"chapter_generation"===a.type&&a.message===I[I.length-1]?.message)||J.push(I[I.length-1]),a.onProgress?.([...J])}as(a.signal);let ai={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{ai=await aj(c,D)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(as(a.signal),ai.notes))D.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let ap=function(a,b,c){let d={};for(let e of M(a,c)){let a=b.find(a=>N(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(b,D,o);for(let a of S)for(let b of a.facts)ap[b.key]=`${Q(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let at=function(a,b,c){let d=M(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(!N(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}(D,b,o),au={facts:[],stages:[]};try{au=await ak(D,q,b,o)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}as(a.signal);let av=[...S.flatMap(a=>a.facts.map(a=>({key:a.key,value:Q(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...at,...au.facts];for(let a of(J.some(a=>a.type===ai.stage.type)||J.push(ai.stage),au.stages))J.some(b=>b.type===a.type)||J.push(a);a.onProgress?.([...J]);let aw=function(a){let b=[],c=new Set;for(let g of a.filter(a=>"table"===a.processingType)){if(c.has(g.filePath))continue;c.add(g.filePath);let a=(0,j.aY)(),h=e.isAbsolute(g.filePath)?g.filePath:d.existsSync(e.join(a,"knowledgeBase",g.filePath))?e.join(a,"knowledgeBase",g.filePath):e.join(a,g.filePath),i=e.extname(g.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=f.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=f.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let h=e.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=e[h].filter(Boolean),j=e.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:g.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let k=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(k.length<2)continue;let l=k[0].includes("|")?"|":k[0].includes(" ")?" ":",",m=k.map(a=>a.split(l).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:g.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(D),ax=D.filter(a=>"pinned-evidence"===a.source).length,ay=D.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,az={type:"reference",roleId:"quality-enhancement",status:D.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${D.length} 条,人工确认/固定证据 ${ax} 条,项目上下文 ${af.length} 条,自动检索证据 ${ay} 条`};for(let b of(J.push(az),a.onProgress?.([...J]),av))ap[b.key]=`${Q(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let aA=new Map;for(let a of D)aA.set(a.filePath,(aA.get(a.filePath)??0)+1);let aB=[...aA.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),aC=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));return{project:a,schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),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=Q(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)}}(av,aw,H,o),aD=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} 内容较短,建议人工补充或重新生成`),b.content.includes("本章应依据已绑定资料生成正式正文")&&e.push(`${b.title} 章节生成未完成,禁止作为正式文件导出`);c&&0===ad(c).length&&e.push("模板未绑定任何知识库文件"),c&&0===ac(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}}(A,av,b),aE=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}(aD,aC,A),aF=[{type:"role_binding",roleId:b.projectRoleConfigId||"none",status:l.length>0?"success":"fallback",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`},ah,{type:"knowledge_retrieval",roleId:"knowledge-base",status:D.length>0?"success":"fallback",message:`已检索/绑定 ${D.length} 条证据`},az,ai.stage,...au.stages,...I,{type:"validation",roleId:"document-workflow",status:aD.errors.length>0?"failed":"success",message:`错误 ${aD.errors.length},警告 ${aD.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"},{type:"export_ready",roleId:"document-workflow",status:aD.errors.length>0?"failed":"success",message:aD.errors.length>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"}],aG={templateId:b.id,templateName:b.name,title:b.outputTitle,requirement:a.requirement||"",exportSettings:b.exportSettings,generationSettings:b.generationSettings,facts:ap,structuredFacts:av,factsModel:aC,chapters:A,sources:aB,missingItems:[...new Set(H)],validation:aD,validationIssues:aE,executionStages:aF,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},aH=ar(aG);as(a.signal);let aI=await ao({template:b,spec:o,markdown:aH,evidence:D,promptTexts:r||p,projectContext:ag,requirement:a.requirement});as(a.signal);let aJ=W(S,b),aK=X(aI.markdown===aH?ar({...aG,validationIssues:aE,exportGate:aG.exportGate,executionStages:aF}):aI.markdown,aJ),aL=aq(aK,b).map(a=>a.message),aM=[...function(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 a of b){let b=c.find(b=>b.title===a.title),d=b?.minWords||1e3;a.content.length<d&&f.push(`${a.title} 内容深度不足:${a.content.length}/${d}`)}for(let b of d){let c=b.facts.slice(0,5).map(a=>Q(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)}(aK,A,T,S,aJ),...aL],aN=await ab({markdown:aK,template:b,plan:T,artifacts:S,promptTexts:p,requirement:a.requirement,issues:aM,forbidDrawingImages:aJ});as(a.signal);let aO=aN.stage?[...aF,aI.stage,aN.stage]:[...aF,aI.stage],aP=_(X(aN.markdown,aJ));(aE=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>N(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>N(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}if("fixed"===a.chapterMode)for(let b of a.chapterRules.filter(a=>a.required)){k.has(b.title)||h.push({level:"error",message:`必需章节缺失:${b.title}`,suggestion:"请在模板或规范包章节规则中补齐章节。"});let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&h.push({level:"warning",message:`章节内容低于最低字数:${b.title}`,suggestion:`建议不少于 ${b.minWords} 字。`})}else{let b=a.dynamicChapterRule;if(b.minChapters&&d.length<b.minChapters&&h.push({level:"warning",message:`动态章节数量低于最少章节:${d.length}/${b.minChapters}`,suggestion:"请补充资料或降低最少章节数。"}),b.maxChapters&&d.length>b.maxChapters&&h.push({level:"warning",message:`动态章节数量超过最多章节:${d.length}/${b.maxChapters}`,suggestion:"请收紧来源文件角色或降低召回范围。"}),b.minWordsPerChapter)for(let a of d)a.content.length<b.minWordsPerChapter&&h.push({level:"warning",message:`动态章节内容低于最低字数:${a.title}`,suggestion:`建议不少于 ${b.minWordsPerChapter} 字。`})}let l=e.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a)),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0}));for(let b of a.gateRules){let a=b.level,n=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},o=n.target||b.target||"",p=n.value||b.value||o,q=n.min||Number(b.value)||1,r=d.find(a=>a.title===o),s="chapter"===n.subject&&r?r.content:e,t=p?function(a){try{return RegExp(a,"iu")}catch{return}}(p):void 0;"fact"===n.subject&&"exists"===n.operator&&o&&!j.has(o)&&h.push({level:a,message:am(b,`缺少事实 ${o}`)}),"chapter"===n.subject&&"exists"===n.operator&&o&&!k.has(o)&&h.push({level:a,message:am(b,`缺少章节 ${o}`)}),"file_role"===n.subject&&"exists"===n.operator&&o&&!f.some(a=>a.roleId===o)&&h.push({level:a,message:am(b,`缺少文件角色 ${o}`)}),"prompt_role"===n.subject&&"exists"===n.operator&&o&&!g.some(a=>a.roleId===o)&&h.push({level:a,message:am(b,`缺少提示词角色 ${o}`)}),"document"===n.subject&&"contains"===n.operator&&p&&!e.includes(p)&&h.push({level:a,message:am(b,`全文必须包含 ${p}`)}),"document"===n.subject&&"not_contains"===n.operator&&p&&e.includes(p)&&h.push({level:a,message:am(b,`出现禁用文本 ${p}`)}),"document"!==n.subject&&"chapter"!==n.subject||"regex_match"!==n.operator||!p||t&&t.test(s)||h.push({level:a,message:am(b,`未匹配正则 ${p}`)}),("document"===n.subject||"chapter"===n.subject)&&"regex_not_match"===n.operator&&t?.test(s)&&h.push({level:a,message:am(b,`匹配到禁止正则 ${p}`)}),"chapter"===n.subject&&"contains"===n.operator&&o&&p&&(!r||!r.content.includes(p))&&h.push({level:a,message:am(b,`章节 ${o} 必须包含 ${p}`)}),"chapter"===n.subject&&"not_contains"===n.operator&&r?.content.includes(p)&&h.push({level:a,message:am(b,`章节 ${o} 出现禁用文本 ${p}`)}),"chapter"===n.subject&&"min_length"===n.operator&&o&&(!r||r.content.length<q)&&h.push({level:a,message:am(b,`章节 ${o} 低于 ${q} 字`)}),"table"===n.subject&&"min_count"===n.operator&&c.tables.length+l.length<q&&h.push({level:a,message:am(b,`表格数量少于 ${q}`)}),"table"===n.subject&&"table_explanation_required"===n.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:am(b,"存在缺少说明文字的表格")}),"image"===n.subject&&"min_count"===n.operator&&m.length<q&&h.push({level:a,message:am(b,`图片数量少于 ${q}`)}),"image"===n.subject&&"image_caption_required"===n.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:am(b,"存在缺少说明文字的图片")}),"source"===n.subject&&"all_have_source"===n.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:am(b,"存在无来源事实")}),"source"===n.subject&&"min_count"===n.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<q&&h.push({level:a,message:am(b,`来源数量少于 ${q}`)})}return h}(o,[...aE,...aM.map(a=>({level:"warning",message:a}))],aC,A,aP,l,i)).push(...function(a,b){let c=a?.targetPages;if(!c?.min&&!c?.target&&!c?.max)return[];let d=Math.ceil(b.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length/800),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}(b.generationSettings||b.exportSettings,aP)),aE.push(...aq(aP,b));let aQ=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&al(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:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))}],e=a.filter(a=>"error"===a.level&&al(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(aE,aC,A);return{...aG,validationIssues:aE,exportGate:aQ,executionStages:aO,markdown:aP}}async function au(a){let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let d=a.projectRoot||(0,j.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,j.Qh)(),f=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),g=[];for(let a of c.queries){let b=await e.search(d,a,{scope:"project",limit:f,weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});g.push(...b.results.map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let h=F(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",k=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!k.has(a)&&!h.some(b=>L(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(H),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>q,FV:()=>p,Mu:()=>r,NR:()=>s,XB:()=>n,dg:()=>o,dw:()=>t});var d=c(73024),e=c(48161),f=c(76760);function g(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function h(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function i(a=[]){let b=new Set;return a.filter(a=>!(!a.roleId||b.has(a.roleId))&&(b.add(a.roleId),!0))}function j(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:h(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,resourceId:a.resourceId||a.resourceIds?.[0]||void 0,resourceIds:function(a=[]){return[...new Set(a.filter(Boolean))]}(Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds:a.resourceId?[a.resourceId]:[]),executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function k(a){return{id:h(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:i(Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]),promptRoles:i(Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[])}}function l(){try{let a=g();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(j),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(j):[],configs:Array.isArray(b.configs)?b.configs.map(k):[]}}catch{return{roles:[],configs:[]}}}function m(a){d.writeFileSync(g(),JSON.stringify({roles:a.roles.map(j),configs:a.configs.map(k)},null,2),"utf-8")}function n(a){let b=l().roles;return a?b.filter(b=>b.type===a):b}function o(a){let b=j(a),c=l();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),m(c),b}function p(a,b){let c=l();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)})),m(c)}function q(){return l().configs}function r(a){return l().configs.find(b=>b.id===a)}function s(a){let b={...k(a),builtIn:!1},c=l();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),m(c),b}function t(a){let b=l();b.configs=b.configs.filter(b=>b.id!==a),m(b)}},99842:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>n,PH:()=>u,dg:()=>l,h0:()=>p,i3:()=>o,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
48
53
  SELECT * FROM memories
49
54
  WHERE context LIKE ? AND (${h})
50
55
  ORDER BY access_count DESC, updated_at DESC