@customize-agent/server 3.0.11 → 3.0.12

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 (71) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +11 -10
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/3445.js +39 -6
  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/documents/roles.js +1 -1
  10. package/.next/server/pages/api/documents/specs.js +1 -1
  11. package/.next/server/pages/api/kb/categories.js +34 -1
  12. package/.next/server/pages/api/kb/duplicates.js +34 -1
  13. package/.next/server/pages/api/kb/files/detail.js +34 -1
  14. package/.next/server/pages/api/kb/files/open.js +34 -1
  15. package/.next/server/pages/api/kb/files/preview-pdf-page.js +34 -1
  16. package/.next/server/pages/api/kb/files/reindex.js +34 -1
  17. package/.next/server/pages/api/kb/files.js +34 -1
  18. package/.next/server/pages/api/kb/ignore.js +34 -1
  19. package/.next/server/pages/api/kb/operations.js +34 -1
  20. package/.next/server/pages/api/kb/reindex.js +34 -1
  21. package/.next/server/pages/api/kb/search.js +34 -1
  22. package/.next/server/pages/api/kb/stats.js +34 -1
  23. package/.next/server/pages/api/kb/tags.js +34 -1
  24. package/.next/server/pages/api/kb/upload.js +34 -1
  25. package/.next/server/pages/context/long-term.html +1 -1
  26. package/.next/server/pages/context/short-term.html +1 -1
  27. package/.next/server/pages/document-roles.html +1 -1
  28. package/.next/server/pages/document-specs.html +1 -1
  29. package/.next/server/pages/documents.html +1 -1
  30. package/.next/server/pages/guide.html +1 -1
  31. package/.next/server/pages/index.html +1 -1
  32. package/.next/server/pages/knowledge/file-detail.html +1 -1
  33. package/.next/server/pages/knowledge/files.html +1 -1
  34. package/.next/server/pages/knowledge/manage.html +1 -1
  35. package/.next/server/pages/knowledge/search.html +1 -1
  36. package/.next/server/pages/knowledge.html +1 -1
  37. package/.next/server/pages/models.html +1 -1
  38. package/.next/server/pages/overview.html +1 -1
  39. package/.next/server/pages/prompt.html +1 -1
  40. package/.next/server/pages/settings.html +1 -1
  41. package/.next/server/pages-manifest.json +21 -21
  42. package/.next/static/ZG2x_4BgDtQoIcW28iwgH/_buildManifest.js +1 -0
  43. package/.next/static/chunks/400-ba996d76e74a7368.js +78 -0
  44. package/.next/static/chunks/740-cd38299e151d3ffc.js +16 -0
  45. package/.next/static/chunks/746-120983153bceeea6.js +1 -0
  46. package/.next/static/chunks/804-b11aef99b57308a3.js +11 -0
  47. package/.next/static/chunks/958-0793922b6b146891.js +1 -0
  48. package/.next/static/chunks/pages/{_app-49c11d5b0712c7a5.js → _app-725afbb7d3371a13.js} +8 -8
  49. package/.next/static/chunks/pages/_error-49c333927e615faa.js +1 -0
  50. package/.next/static/chunks/pages/context/long-term-dba1d735f2b5e12b.js +1 -0
  51. package/.next/static/chunks/pages/context/short-term-7cc72881b42b74fb.js +1 -0
  52. package/.next/static/chunks/pages/document-roles-653f01136b58197b.js +1 -0
  53. package/.next/static/chunks/pages/document-specs-120681be3e183b9e.js +1 -0
  54. package/.next/static/chunks/pages/documents-93e638518deec9b5.js +1 -0
  55. package/.next/static/chunks/pages/documents-a72286e23487eaf7.js +1 -0
  56. package/.next/static/chunks/pages/guide-f6ad48fc4e564c1c.js +1 -0
  57. package/.next/static/chunks/pages/knowledge/manage-5d501503e54b4424.js +1 -0
  58. package/.next/static/chunks/pages/models-0fb086e70387dde1.js +1 -0
  59. package/.next/static/chunks/pages/overview-9fbf5907184af472.js +1 -0
  60. package/.next/static/chunks/pages/{prompt-654d82321a383233.js → prompt-d9996cf322de0125.js} +1 -1
  61. package/.next/static/he1VpXuNk12nGqt9mP7Jd/_buildManifest.js +1 -0
  62. package/.next/static/he1VpXuNk12nGqt9mP7Jd/_ssgManifest.js +1 -0
  63. package/package.json +2 -2
  64. package/.next/static/chunks/pages/context/long-term-710aaeb12e378258.js +0 -1
  65. package/.next/static/chunks/pages/context/short-term-e68f01478e7ed238.js +0 -1
  66. package/.next/static/chunks/pages/document-roles-caee7af42da4f792.js +0 -1
  67. package/.next/static/chunks/pages/document-specs-7085069b6dcdaee6.js +0 -1
  68. package/.next/static/chunks/pages/documents-b78988e17525927f.js +0 -1
  69. package/.next/static/chunks/pages/models-6131bc7596604158.js +0 -1
  70. package/.next/static/yEauW-YU8G-h4UdYFV8_d/_buildManifest.js +0 -1
  71. /package/.next/static/{yEauW-YU8G-h4UdYFV8_d → ZG2x_4BgDtQoIcW28iwgH}/_ssgManifest.js +0 -0
package/.next/BUILD_ID CHANGED
@@ -1 +1 @@
1
- yEauW-YU8G-h4UdYFV8_d
1
+ ZG2x_4BgDtQoIcW28iwgH
@@ -5,8 +5,8 @@
5
5
  "devFiles": [],
6
6
  "ampDevFiles": [],
7
7
  "lowPriorityFiles": [
8
- "static/yEauW-YU8G-h4UdYFV8_d/_buildManifest.js",
9
- "static/yEauW-YU8G-h4UdYFV8_d/_ssgManifest.js"
8
+ "static/ZG2x_4BgDtQoIcW28iwgH/_buildManifest.js",
9
+ "static/ZG2x_4BgDtQoIcW28iwgH/_ssgManifest.js"
10
10
  ],
11
11
  "rootMainFiles": [],
12
12
  "rootMainFilesTree": {},
@@ -22,7 +22,7 @@
22
22
  "static/chunks/framework-b5223c1542334872.js",
23
23
  "static/chunks/main-1a03005b3754c708.js",
24
24
  "static/css/5237c5e3358f3282.css",
25
- "static/chunks/pages/_app-49c11d5b0712c7a5.js"
25
+ "static/chunks/pages/_app-725afbb7d3371a13.js"
26
26
  ],
27
27
  "/_error": [
28
28
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -47,7 +47,7 @@
47
47
  "static/chunks/446-0591221372df7d49.js",
48
48
  "static/chunks/400-f06f00619f22421e.js",
49
49
  "static/chunks/257-ba16dfe16a27f417.js",
50
- "static/chunks/pages/context/long-term-710aaeb12e378258.js"
50
+ "static/chunks/pages/context/long-term-dba1d735f2b5e12b.js"
51
51
  ],
52
52
  "/context/short-term": [
53
53
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -66,7 +66,7 @@
66
66
  "static/chunks/446-0591221372df7d49.js",
67
67
  "static/chunks/400-f06f00619f22421e.js",
68
68
  "static/chunks/257-ba16dfe16a27f417.js",
69
- "static/chunks/pages/context/short-term-e68f01478e7ed238.js"
69
+ "static/chunks/pages/context/short-term-7cc72881b42b74fb.js"
70
70
  ],
71
71
  "/document-roles": [
72
72
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -83,7 +83,7 @@
83
83
  "static/chunks/492-62671486700ed3f9.js",
84
84
  "static/chunks/455-e31becaaf948f868.js",
85
85
  "static/chunks/846-fed995f7c83fc6c3.js",
86
- "static/chunks/pages/document-roles-caee7af42da4f792.js"
86
+ "static/chunks/pages/document-roles-653f01136b58197b.js"
87
87
  ],
88
88
  "/document-specs": [
89
89
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -101,7 +101,8 @@
101
101
  "static/chunks/455-e31becaaf948f868.js",
102
102
  "static/chunks/992-ea93dfa182a02a8e.js",
103
103
  "static/chunks/846-fed995f7c83fc6c3.js",
104
- "static/chunks/pages/document-specs-7085069b6dcdaee6.js"
104
+ "static/chunks/746-120983153bceeea6.js",
105
+ "static/chunks/pages/document-specs-120681be3e183b9e.js"
105
106
  ],
106
107
  "/documents": [
107
108
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -120,7 +121,7 @@
120
121
  "static/chunks/292-c2888a94068fae74.js",
121
122
  "static/chunks/846-fed995f7c83fc6c3.js",
122
123
  "static/chunks/730-727fe4b055c78dc2.js",
123
- "static/chunks/pages/documents-b78988e17525927f.js"
124
+ "static/chunks/pages/documents-93e638518deec9b5.js"
124
125
  ],
125
126
  "/guide": [
126
127
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -225,7 +226,7 @@
225
226
  "static/chunks/455-e31becaaf948f868.js",
226
227
  "static/chunks/992-ea93dfa182a02a8e.js",
227
228
  "static/css/0e153583d22cc52e.css",
228
- "static/chunks/pages/models-6131bc7596604158.js"
229
+ "static/chunks/pages/models-0fb086e70387dde1.js"
229
230
  ],
230
231
  "/overview": [
231
232
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -250,7 +251,7 @@
250
251
  "static/chunks/668-662b7bc81e4ad48f.js",
251
252
  "static/chunks/492-62671486700ed3f9.js",
252
253
  "static/chunks/446-0591221372df7d49.js",
253
- "static/chunks/pages/prompt-654d82321a383233.js"
254
+ "static/chunks/pages/prompt-d9996cf322de0125.js"
254
255
  ],
255
256
  "/settings": [
256
257
  "static/chunks/webpack-77d10b4726f13aa5.js",
@@ -3,9 +3,9 @@
3
3
  "routes": {},
4
4
  "dynamicRoutes": {},
5
5
  "preview": {
6
- "previewModeId": "066f0f2ef7b0e0ba9df37a6f41e119d0",
7
- "previewModeSigningKey": "389766dba17ffb40e4ed31ed33fed850bc7f2a546274f21b67735235c915da6f",
8
- "previewModeEncryptionKey": "b7659d692f988e578e96784365f3b3e6abc917f167f49e0a78e44b8f04fb263c"
6
+ "previewModeId": "f815f088e1d2d63d1b69f7a71f66bf1a",
7
+ "previewModeSigningKey": "80fb4f104195f3487daeda6114594a45a061796dff79074f0cf1c6c34daa3a04",
8
+ "previewModeEncryptionKey": "a01474e9beec3809c1b22b0da7948ba7e3d4ab9a12431027fcb1193363b1eef2"
9
9
  },
10
10
  "notFoundRoutes": []
11
11
  }
@@ -1,9 +1,42 @@
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:()=>k,aY:()=>m});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 j||(j=new d.MultiProjectManager),j}function l(a){let b=g.resolve(a);return b===g.resolve(g.join(h.homedir(),".customize-agent"))||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 m(a=!1){let b=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(b&&i.existsSync(b)&&!l(b))return g.resolve(b);let c=function(){let a=g.join(h.homedir(),".customize-agent","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=>!l(a))}finally{b.close()}}();return c.length>0?c[0]:a&&!l(process.cwd())?process.cwd():""}},57367:(a,b,c)=>{c.d(b,{Co:()=>l,EK:()=>n,ER:()=>o,py:()=>m});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-specs.json")}function h(a){return(a||`spec-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function i(a){return{id:h(a.id),name:a.name||"未命名规范包",description:a.description||"",factFields:Array.isArray(a.factFields)?a.factFields.filter(a=>a.name).map(a=>({id:h(a.id),name:a.name,type:["text","number","date","table","list"].includes(a.type)?a.type:"text",required:!!a.required,sourceRoleIds:Array.isArray(a.sourceRoleIds)?a.sourceRoleIds.filter(Boolean):[],extractionHint:a.extractionHint||"",validationHint:a.validationHint||""})):[],chapterRules:Array.isArray(a.chapterRules)?a.chapterRules.filter(a=>a.title).map((a,b)=>({id:h(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||""})):[],gateRules:Array.isArray(a.gateRules)?a.gateRules.filter(a=>a.name).map(a=>({id:h(a.id),name:a.name,type:["required_fact","required_chapter","required_file_role","required_prompt_role","source_required","forbidden_text","min_chapter_length","table_required"].includes(a.type)?a.type:"required_fact",level:"warning"===a.level||"info"===a.level?a.level:"error",target:a.target||"",value:a.value||""})):[],wordTemplatePath:a.wordTemplatePath||""}}function j(){try{let a=g();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(i)}catch{return[]}}function k(a){d.writeFileSync(g(),JSON.stringify(a.map(i),null,2),"utf-8")}function l(){return j()}function m(a){if(a)return j().find(b=>b.id===a)}function n(a){let b=i(a),c=j().filter(a=>a.id!==b.id);return c.push(b),k(c),b}function o(a){k(j().filter(b=>b.id!==a))}},73445:(a,b,c)=>{c.d(b,{Bh:()=>u,OX:()=>E,R1:()=>F,bV:()=>w,h0:()=>v,jG:()=>s});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(23328),j=c(2323),k=c(89952),l=c(57367);let m=[{id:"construction-organization-design",name:"施工组织设计",description:"根据招标文件、图纸、清单、表格和项目资料生成施工组织设计草稿。",category:"工程建设",outputTitle:"施工组织设计",chapters:[{id:"basis",title:"第一章 编制依据",purpose:"整理招标文件、图纸、规范和编制说明。",requiredFacts:["招标文件","图纸","规范标准"],queries:["招标文件 编制依据 技术规范 标准 图纸 合同","规范 标准 图纸 招标文件"]},{id:"overview",title:"第二章 工程概况",purpose:"提取工程名称、地点、规模、范围和建设条件。",requiredFacts:["工程名称","工程地点","工程规模","施工范围"],queries:["工程名称 工程地点 建设单位 工程规模 建筑面积 结构类型","工程概况 招标范围 项目规模"]},{id:"deployment",title:"第三章 施工部署",purpose:"形成项目组织、施工区段和总体部署。",requiredFacts:["施工部署","组织机构","施工段"],queries:["施工部署 项目组织机构 施工段划分 总体安排","施工组织 施工顺序 施工流水"]},{id:"schedule",title:"第四章 施工进度计划及保证措施",purpose:"提取工期、节点、进度要求并形成保证措施。",requiredFacts:["工期要求","节点工期"],queries:["工期要求 开工 竣工 进度计划 节点工期","工期 进度 保证措施"]},{id:"preparation",title:"第五章 施工准备",purpose:"整理技术、现场、材料、机械和劳动力准备。",requiredFacts:["技术准备","现场准备","材料准备"],queries:["施工准备 技术准备 现场准备 材料准备 机械准备","临设 水电 进场 准备"]},{id:"methods",title:"第六章 主要分部分项工程施工方案",purpose:"依据工程范围生成主要施工方法。",requiredFacts:["主要分部分项工程","施工工艺"],queries:["土方 基础 主体 砌体 装饰 安装 道路 管线 主要施工方法","分部分项 施工工艺 技术措施"]},{id:"quality",title:"第七章 质量保证体系及措施",purpose:"形成质量目标、体系和保证措施。",requiredFacts:["质量目标","质量标准"],queries:["质量目标 质量标准 验收规范 质量保证措施","质量管理 检验 试验"]},{id:"safety",title:"第八章 安全生产管理体系及措施",purpose:"形成安全目标、风险控制和应急管理。",requiredFacts:["安全目标","安全要求"],queries:["安全目标 安全文明施工 安全管理 危险源 应急预案","安全生产 风险 防护"]},{id:"civilized",title:"第九章 文明施工及环境保护措施",purpose:"整理文明施工、扬尘、噪声、污水和固废措施。",requiredFacts:["文明施工","环境保护"],queries:["文明施工 环境保护 扬尘 噪声 污水 固废","绿色施工 环保 控制措施"]},{id:"resources",title:"第十章 劳动力、材料、机械设备投入计划",purpose:"提取资源计划和相关表格。",requiredFacts:["劳动力计划","材料计划","机械设备计划"],queries:["劳动力计划 材料计划 机械设备计划 主要设备 表格","资源投入 机械 劳动力 材料"]},{id:"layout",title:"第十一章 施工总平面布置",purpose:"整理临设、道路、水电、堆场和平面布置要求。",requiredFacts:["施工总平面布置"],queries:["施工平面布置 临时设施 道路 水电 堆场","总平面布置 临时用地"]},{id:"season",title:"第十二章 季节性施工措施",purpose:"形成雨季、冬季、高温、防汛等措施。",requiredFacts:["季节性施工要求"],queries:["雨季施工 冬季施工 高温施工 台风 防汛","季节性施工 措施"]},{id:"emergency",title:"第十三章 应急预案",purpose:"形成风险、组织、响应和救援措施。",requiredFacts:["应急预案"],queries:["应急预案 风险 应急组织 救援措施","事故 应急 响应"]},{id:"appendix",title:"第十四章 附表及附件",purpose:"汇总附件、表格、图纸和来源清单。",requiredFacts:["附表","附件"],queries:["附表 计划表 机械表 劳动力表 进度表","附件 表格 清单 图纸"]}],builtIn:!0}];function n(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function o(){return e.join(n(),"document-templates.json")}function p(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):[]})):[{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 q(){try{let a=o();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(p)}catch{return[]}}function r(a){d.writeFileSync(o(),JSON.stringify(a.map(p),null,2),"utf-8")}function s(){return[...m,...q()]}function t(a){return s().find(b=>b.id===a)}function u(a){let b=p(a);if(m.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=q().filter(a=>a.id!==b.id);return c.push(b),r(c),b}function v(a){if(m.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");r(q().filter(b=>b.id!==a))}function w(a){let b=t(a);if(!b)throw Error("Document template not found");let c=p({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=q();return d.push(c),r(d),c}function x(a,b){let c=new Set;return a.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 y(a){return`- ${a.filePath}(score=${a.score.toFixed(3)}):${a.content.replace(/\s+/gu," ").slice(0,260)}`}function z(a){if(a.projectRoleConfigId){let b=(0,k.Mu)(a.projectRoleConfigId),c=(0,k.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?.resourceId).map(a=>({promptId:a.resourceId,roleId:a.id}))}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function A(a){if(a.projectRoleConfigId){let b=(0,k.Mu)(a.projectRoleConfigId),c=(0,k.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?.resourceId).map(a=>({filePath:a.resourceId,roleId:a.id}))}return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}async function B(a,b){try{let c=(0,j.I)().load(),d=c.models.reasoning.active||c.models.action.active||c.models.reader.active,e=[...c.models.reasoning.list,...c.models.action.list,...c.models.reader.list].find(a=>a.name===d);if(!e)return;let f=c.providers[e.provider];if(!f)return;let g=(0,h.createProvider)(e.provider,{baseUrl:f.baseUrl,apiKey:f.apiKey,modelName:e.name}),i=(await g.chat([{role:"system",content:`${a}
2
- 只返回 JSON,不要返回 markdown。`},{role:"user",content:b}],{temperature:0})).content.trim().replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(i)}catch{return}}async function C(a,b){let c=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],d=a.slice(0,20).map(a=>`文件:${a.filePath}
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:()=>k,aY:()=>m});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 j||(j=new d.MultiProjectManager),j}function l(a){let b=g.resolve(a);return b===g.resolve(g.join(h.homedir(),".customize-agent"))||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 m(a=!1){let b=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(b&&i.existsSync(b)&&!l(b))return g.resolve(b);let c=function(){let a=g.join(h.homedir(),".customize-agent","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=>!l(a))}finally{b.close()}}();if(c.length>0)return c[0];if(a&&!l(process.cwd()))return process.cwd();let d=g.join(h.homedir(),".customize-agent","demo-project");for(let[a,b]of(i.mkdirSync(d,{recursive:!0}),Object.entries({"规则文件-攻略写作要求.md":`# 三角洲热门干员攻略写作要求
2
+
3
+ 公开参考入口:https://df.qq.com/ 和 https://deltaforce.garena.com/
4
+
5
+ 写作要求:
6
+ - 面向新手和进阶玩家,语言要直白。
7
+ - 必须解释干员定位、技能价值、适用场景和常见误区。
8
+ - 不能把没有来源的数据写成确定结论。
9
+ - 表格中的推荐指数只能作为示例参考。`,"项目事实-热门干员资料.md":`# 三角洲热门干员资料
10
+
11
+ 攻略目标:帮助用户快速理解热门干员怎么选、怎么搭配、怎么上手。
12
+ 适用人群:刚开始游玩三角洲行动的新手,以及希望快速建立队伍分工的进阶玩家。
13
+
14
+ ## 热门干员
15
+ - 露娜:侦察定位,适合信息获取、标记敌人、帮助队伍判断推进路线。
16
+ - 红狼:突击定位,适合正面突破、拉枪线、打开交战空间。
17
+ - 牧羊人:工程定位,适合控场、防守、限制敌方推进。
18
+ - 蜂医:支援定位,适合治疗、救援、提高队伍持续作战能力。
19
+
20
+ 实战技巧:新手队伍建议至少包含一名侦察和一名支援;进攻队伍可以搭配突击位;防守或卡点时工程位价值更高。`,"表格数据-热门干员推荐.csv":`干员名称,定位,推荐指数,上手难度,推荐场景
21
+ 露娜,侦察,5,中,信息侦察和路线判断
22
+ 红狼,突击,5,中高,突破和正面交火
23
+ 牧羊人,工程,4,中,防守控场和区域封锁
24
+ 蜂医,支援,5,低,治疗救援和续航`,"图纸文件-战术路线示意.md":`# 战术路线示意
25
+
26
+ 示意说明:
27
+ - 侦察位优先观察主通道和侧翼。
28
+ - 突击位沿掩体推进,不要单独深入。
29
+ - 工程位在关键入口布置控场手段。
30
+ - 支援位保持在队伍中后段,优先保证救援路线。`,"规范文件-攻略结构规范.md":`# 攻略结构规范
31
+
32
+ 必须包含:攻略目标、热门干员定位、队伍搭配、推荐优先级、实战注意事项。
33
+ 推荐写法:先讲结论,再讲原因,最后给操作建议。
34
+ 导出前检查:不能出现“资料未提供”;必须包含至少一张推荐表;必须覆盖露娜、红狼、牧羊人、蜂医。`}))){let c=g.join(d,a);i.existsSync(c)||i.writeFileSync(c,b,"utf-8")}return d}},57367:(a,b,c)=>{c.d(b,{Co:()=>m,EK:()=>o,ER:()=>p,py:()=>n});var d=c(73024),e=c(48161),f=c(76760);let g={id:"delta-force-demo-spec",name:"三角洲热门干员攻略规范包",description:"内置示例规范包:要求攻略必须包含干员名称、定位、推荐指数、热门干员章节和表格数据。",factFields:[{id:"operator-name",name:"干员名称",type:"list",required:!0,sourceRoleIds:["delta-fact-files"],extractionHint:"抽取露娜、红狼、牧羊人、蜂医等干员名称。"},{id:"operator-role",name:"定位",type:"text",required:!0,sourceRoleIds:["delta-fact-files"],extractionHint:"抽取干员定位,例如侦察、突击、工程、支援。"},{id:"recommend-score",name:"推荐指数",type:"table",required:!0,sourceRoleIds:["delta-table-files"],extractionHint:"从表格中抽取推荐指数和上手难度。"}],chapterRules:[{id:"overview",title:"第一章 攻略目标和适用人群",required:!0,order:0,minWords:80,requiredFactIds:["operator-name"]},{id:"operators",title:"第二章 热门干员定位速览",required:!0,order:1,minWords:120,requiredFactIds:["operator-name","operator-role"]},{id:"tables",title:"第四章 数据表和推荐优先级",required:!0,order:3,minWords:80,requiredFactIds:["recommend-score"]}],gateRules:[{id:"gate-operator-fact",name:"必须抽取干员名称",type:"required_fact",level:"warning",target:"干员名称"},{id:"gate-table",name:"必须包含推荐表格",type:"table_required",level:"warning"},{id:"gate-no-missing",name:"不能出现资料未提供",type:"forbidden_text",level:"error",value:"资料未提供"}],wordTemplatePath:""};function h(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-specs.json")}function i(a){return(a||`spec-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function j(a){return{id:i(a.id),name:a.name||"未命名规范包",description:a.description||"",factFields:Array.isArray(a.factFields)?a.factFields.filter(a=>a.name).map(a=>({id:i(a.id),name:a.name,type:["text","number","date","table","list"].includes(a.type)?a.type:"text",required:!!a.required,sourceRoleIds:Array.isArray(a.sourceRoleIds)?a.sourceRoleIds.filter(Boolean):[],extractionHint:a.extractionHint||"",validationHint:a.validationHint||""})):[],chapterRules:Array.isArray(a.chapterRules)?a.chapterRules.filter(a=>a.title).map((a,b)=>({id:i(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||""})):[],gateRules:Array.isArray(a.gateRules)?a.gateRules.filter(a=>a.name).map(a=>({id:i(a.id),name:a.name,type:["required_fact","required_chapter","required_file_role","required_prompt_role","source_required","forbidden_text","min_chapter_length","table_required"].includes(a.type)?a.type:"required_fact",level:"warning"===a.level||"info"===a.level?a.level:"error",target:a.target||"",value:a.value||""})):[],wordTemplatePath:a.wordTemplatePath||""}}function k(){try{let a=h();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(j)}catch{return[]}}function l(a){d.writeFileSync(h(),JSON.stringify(a.map(j),null,2),"utf-8")}function m(){return[...new Map([g,...k()].map(a=>[a.id,a])).values()]}function n(a){if(a)return a===g.id?g:k().find(b=>b.id===a)}function o(a){let b=j(a),c=k().filter(a=>a.id!==b.id);return c.push(b),l(c),b}function p(a){if(a===g.id)throw Error("Built-in demo spec cannot be deleted");l(k().filter(b=>b.id!==a))}},73445:(a,b,c)=>{c.d(b,{Bh:()=>v,OX:()=>F,R1:()=>G,bV:()=>x,h0:()=>w,jG:()=>t});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(23328),j=c(2323),k=c(89952),l=c(57367);let m=[{id:"delta-force-hot-operators-guide",name:"三角洲热门干员攻略",description:"内置全流程示例:基于示例攻略资料、表格、规则和规范包生成热门干员攻略文档。",category:"游戏攻略",outputTitle:"三角洲热门干员攻略",projectRoleConfigId:"delta-force-demo-config",documentSpecId:"delta-force-demo-spec",chapters:[{id:"overview",title:"第一章 攻略目标和适用人群",purpose:"说明攻略面向的新手/进阶玩家和使用场景。",requiredFacts:["攻略目标","适用人群"],queries:["三角洲行动 干员 攻略 适用 新手 进阶"]},{id:"operators",title:"第二章 热门干员定位速览",purpose:"汇总热门干员定位、技能和推荐场景。",requiredFacts:["干员名称","定位","技能"],queries:["三角洲行动 干员 定位 技能 露娜 红狼 牧羊人 蜂医"]},{id:"loadout",title:"第三章 干员搭配和队伍分工",purpose:"按突击、侦察、支援、工程等职责给出队伍搭配。",requiredFacts:["队伍分工","搭配建议"],queries:["三角洲行动 干员 搭配 队伍 分工 突击 侦察 支援 工程"]},{id:"tables",title:"第四章 数据表和推荐优先级",purpose:"引用表格数据生成优先级和推荐清单。",requiredFacts:["推荐指数","上手难度"],queries:["干员 推荐指数 上手难度 表格 优先级"]},{id:"tips",title:"第五章 实战注意事项",purpose:"整理实战打法、误区和复盘建议。",requiredFacts:["实战技巧","注意事项"],queries:["三角洲行动 实战 技巧 注意事项 误区"]}],builtIn:!0}];function n(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function o(){return e.join(n(),"document-templates.json")}function p(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):[]})):[{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 q(){try{let a=o();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(p)}catch{return[]}}function r(a){d.writeFileSync(o(),JSON.stringify(a.map(p),null,2),"utf-8")}let s={"builtin:delta-fact-extraction":{name:"三角洲事实抽取",content:"请从资料中抽取干员名称、定位、技能、推荐指数、上手难度、推荐场景,输出结构化事实,不要编造。"},"builtin:delta-chapter-generation":{name:"三角洲章节生成",content:"请用新手能看懂的大白话生成攻略,先给结论,再解释原因,最后给实战建议。必须引用表格数据和来源资料。"},"builtin:delta-validation":{name:"三角洲攻略校验",content:"检查是否覆盖露娜、红狼、牧羊人、蜂医;是否有推荐表格;是否出现资料未提供;是否有来源。"}};function t(){return[...m,...q()]}function u(a){return t().find(b=>b.id===a)}function v(a){let b=p(a);if(m.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=q().filter(a=>a.id!==b.id);return c.push(b),r(c),b}function w(a){if(m.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");r(q().filter(b=>b.id!==a))}function x(a){let b=u(a);if(!b)throw Error("Document template not found");let c=p({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=q();return d.push(c),r(d),c}function y(a,b){let c=new Set;return a.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 z(a){return`- ${a.filePath}(score=${a.score.toFixed(3)}):${a.content.replace(/\s+/gu," ").slice(0,260)}`}function A(a){if(a.projectRoleConfigId){let b=(0,k.Mu)(a.projectRoleConfigId),c=(0,k.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 B(a){if(a.projectRoleConfigId){let b=(0,k.Mu)(a.projectRoleConfigId),c=(0,k.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"}))}async function C(a,b){try{let c=(0,j.I)().load(),d=c.models.reasoning.active||c.models.action.active||c.models.reader.active,e=[...c.models.reasoning.list,...c.models.action.list,...c.models.reader.list].find(a=>a.name===d);if(!e)return;let f=c.providers[e.provider];if(!f)return;let g=(0,h.createProvider)(e.provider,{baseUrl:f.baseUrl,apiKey:f.apiKey,modelName:e.name}),i=(await g.chat([{role:"system",content:`${a}
35
+ 只返回 JSON,不要返回 markdown。`},{role:"user",content:b}],{temperature:0})).content.trim().replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(i)}catch{return}}async function D(a,b){let c=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],d=a.slice(0,20).map(a=>`文件:${a.filePath}
3
36
  角色:${a.roleId||""}
4
37
  处理:${a.processingType||""}
5
- 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!d.trim())return{facts:[],stages:c};let e=await B(b||"你是工程文档事实抽取器。",`请从资料中抽取工程文档结构化事实,返回 {"facts":[{"key":"工程名称","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
38
+ 内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!d.trim())return{facts:[],stages:c};let e=await C(b||"你是工程文档事实抽取器。",`请从资料中抽取工程文档结构化事实,返回 {"facts":[{"key":"工程名称","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
6
39
 
7
- ${d}`);return e?.facts?.length?{facts:e.facts.filter(a=>a.key&&a.value).map(a=>({key:a.key,value: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 抽取 ${e.facts.length} 条事实`}]}:{facts:[],stages:c}}function D(a){return['<div class="document-cover">',`# ${a.title}`,"",`**文档版本**:V1.0 `,`**生成时间**:${new Date(a.generatedAt).toLocaleString("zh-CN")} `,`**生成要求**:${a.requirement||"未填写"} `,"</div>","",'<div class="page-break"></div>',"","## 目录","",...a.chapters.map((a,b)=>`${b+1}. ${a.title}`),"",'<div class="page-break"></div>',"","## 结构化事实表","",Object.keys(a.facts).length>0?["| 事实项 | 依据 |","|---|---|",...Object.entries(a.facts).map(([a,b])=>`| ${a} | ${b.replace(/\|/gu," ")} |`)].join("\n"):"未抽取到明确事实,需人工确认。","",...a.chapters.flatMap(a=>[a.content,""]),"## 资料来源清单","","| 文件 | 引用次数 |","|---|---:|",...a.sources.map(a=>`| ${a.filePath} | ${a.count} |`),"","## 缺失项与需确认事项","",...a.missingItems.length>0?a.missingItems.map(a=>`- ${a}`):["- 暂未发现完全缺失章节;仍需人工复核关键数据。"],"","## 校验结果","",...a.validation.warnings.map(a=>`- 警告:${a}`),...a.validation.errors.map(a=>`- 错误:${a}`),"","## 严格校验清单","",...a.validationIssues.map(a=>`- ${a.level.toUpperCase()}:${a.message}${a.suggestion?`(建议:${a.suggestion})`:""}`)].join("\n")}async function E(a){let b=t(a.templateId);if(!b)throw Error("Document template not found");let c=a.projectRoot||(0,i.aY)();if(!c)throw Error("No knowledge base project found");let g=(0,i.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),j=z(b),m=A(b),o=(0,l.py)(b.documentSpecId),p=(function(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(n(),"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})(j).map(a=>`## [${a.roleId}] ${a.name}
8
- ${a.content}`).join("\n\n"),q=new Set(m.map(a=>a.filePath)),r=(0,k.XB)("file"),s=new Map(m.map(a=>[a.filePath,a.roleId])),u=new Map(m.map(a=>[a.filePath,r.find(b=>b.id===a.roleId)?.processingType||"reference"])),v=await g.getProject(c);await v.incrementalIndex();let w=[],B=[],E=[];for(let a of b.chapters){let d=[];for(let e of a.queries.length>0?a.queries:[b.name,b.outputTitle,a.title,...m.map(a=>a.filePath)]){let b=await g.search(c,e,{scope:"project",limit:Math.max(h,q.size>0?30:h),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});d.push(...b.results.filter(a=>0===q.size||q.has(a.filePath)).map(b=>({chapterId:a.id,filePath:b.filePath,score:b.score,content:b.content,roleId:s.get(b.filePath),processingType:u.get(b.filePath),sectionTitle:b.sectionTitle,source:b.source})))}for(let b of q){let c=v.getFileDetail(b);c&&d.push(...c.chunks.slice(0,Math.max(h,20)).map(b=>({chapterId:a.id,filePath:c.file.relativePath,score:1,content:b.content,roleId:s.get(c.file.relativePath),processingType:u.get(c.file.relativePath),sectionTitle:b.sectionTitle,source:"bound-file"})))}let e=x(d,h);B.push(...e);let f=a.requiredFacts.filter(a=>!e.some(b=>b.content.includes(a.replace(/要求|计划|目标|标准/gu,""))||b.content.includes(a)));for(let b of(0===e.length&&E.push(`${a.title}:未检索到明确资料依据`),f))E.push(`${a.title}:${b} 未检索到明确依据`);let i=[`## ${a.title}`,"",p?`### 模板绑定提示词规则
9
- ${p.slice(0,3e3)}`:"","",e.length>0?`本章根据模板绑定资料围绕“${a.purpose||b.description}”整理。`:"模板绑定资料未检索到明确内容,需进一步确认。","",e.length>0?"### 资料依据":"",...e.map(y),"",f.length>0?"### 待确认事项":"",...f.map(a=>`- ${a}:资料未提供,需进一步确认。`)].filter(Boolean).join("\n");w.push({id:a.id,title:a.title,content:i,evidence:e,missingFacts:f})}let F=function(a,b){let c={};for(let d of[...new Set(a.chapters.flatMap(a=>a.requiredFacts))]){let a=b.find(a=>a.content.includes(d.replace(/要求|计划|目标|标准/gu,""))||a.content.includes(d));a&&(c[d]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath})`)}return c}(b,B),G=function(a){let b=[["工程名称",/工程名称[::\s]+([^\n,。;;]+)/u],["工程地点",/(?:工程地点|建设地点)[::\s]+([^\n,。;;]+)/u],["建设单位",/建设单位[::\s]+([^\n,。;;]+)/u],["工期要求",/(?:工期|计划工期)[::\s]+([^\n,。;;]+)/u],["质量目标",/质量目标[::\s]+([^\n,。;;]+)/u],["安全目标",/安全目标[::\s]+([^\n,。;;]+)/u],["施工范围",/(?:施工范围|招标范围)[::\s]+([^\n]+)/u]],c=[];for(let d of a)for(let[a,e]of b){let b=d.content.match(e);b?.[1]&&!c.some(c=>c.key===a&&c.value===b[1].trim())&&c.push({key:a,value:b[1].trim().slice(0,300),sourceFile:d.filePath,roleId:d.roleId||"unknown",processingType:d.processingType,confidence:d.score})}return c}(B),H=await C(B,p),I=[...G,...H.facts],J=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=e.isAbsolute(g.filePath)?g.filePath:e.join((0,i.aY)(),g.filePath),h=e.extname(g.filePath).toLowerCase();if(d.existsSync(a)&&[".xlsx",".xls",".csv"].includes(h))try{let c=f.readFile(a,{cellDates:!0,sheetStubs:!1});for(let a of c.SheetNames){let d=c.Sheets[a],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:a,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",l=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);l.length<2||b.push({tableType:g.roleId||"table",headers:l[0],rows:l.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(B);for(let a of I)F[a.key]=`${a.value}(来源:${a.sourceFile},角色:${a.roleId})`;let K=new Map;for(let a of B)K.set(a.filePath,(K.get(a.filePath)??0)+1);let L=[...K.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),M=function(a,b=[],c=[]){let d=b=>a.filter(a=>b.some(b=>a.key.includes(b))),e=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b));return{project:d(["工程名称","工程地点","建设单位","施工范围"]),schedule:d(["工期","开工","竣工","节点"]),quality:d(["质量"]),safety:d(["安全"]),resources:d(["劳动力","材料","机械","设备"]),tables:b,drawings:e("drawing"),rules:e("rule"),specifications:e("specification"),missing:[...new Set(c)],conflicts:[]}}(I,J,E),N=function(a,b,c=[],d){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);for(let a of["工程名称","工期要求","质量目标","施工范围"])b[a]||c.some(b=>b.key===a)||e.push(`${a} 未形成明确事实,请人工确认`);d&&0===A(d).length&&f.push("模板未绑定任何知识库文件"),d&&0===z(d).length&&f.push("模板未绑定任何提示词");let g=new Set(c.map(a=>a.roleId));for(let a of["project_fact","rule"])d?.fileBindings?.some(b=>b.roleId===a)&&!g.has(a)&&e.push(`${a} 角色未抽取到结构化事实`);return{passed:0===f.length,warnings:e,errors:f}}(w,F,I,b),O=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 0===b.project.length&&d.push({level:"error",message:"项目基础事实缺失",suggestion:"请在项目事实文件角色中绑定包含工程概况的资料。"}),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}(N,M,w),P=[...H.stages,{type:"chapter_generation",roleId:"document-workflow",status:"success",message:`生成 ${w.length} 个章节`},{type:"validation",roleId:"document-workflow",status:N.errors.length>0?"failed":"success",message:`错误 ${N.errors.length},警告 ${N.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}],Q={templateId:b.id,templateName:b.name,title:b.outputTitle,requirement:a.requirement||(j.length?`使用模板绑定提示词:${j.map(a=>`${a.promptId}(${a.roleId})`).join(", ")}`:""),facts:F,structuredFacts:I,factsModel:M,chapters:w,sources:L,missingItems:[...new Set(E)],validation:N,validationIssues:O,executionStages:P,exportGate:{passed:!0,blockingIssues:[],checklist:[]},generatedAt:Date.now()},R=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level)},{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);return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(O=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=new Set([...c.project,...c.schedule,...c.quality,...c.safety,...c.resources].map(a=>a.key)),j=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required))i.has(b.name)||h.push({level:"error",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"});for(let b of a.chapterRules.filter(a=>a.required)){j.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} 字。`})}for(let b of a.gateRules){let a=b.level;"required_fact"===b.type&&b.target&&!i.has(b.target)&&h.push({level:a,message:`${b.name}:缺少事实 ${b.target}`}),"required_chapter"===b.type&&b.target&&!j.has(b.target)&&h.push({level:a,message:`${b.name}:缺少章节 ${b.target}`}),"required_file_role"===b.type&&b.target&&!f.some(a=>a.roleId===b.target)&&h.push({level:a,message:`${b.name}:缺少文件角色 ${b.target}`}),"required_prompt_role"===b.type&&b.target&&!g.some(a=>a.roleId===b.target)&&h.push({level:a,message:`${b.name}:缺少提示词角色 ${b.target}`}),"forbidden_text"===b.type&&b.value&&e.includes(b.value)&&h.push({level:a,message:`${b.name}:出现禁用文本 ${b.value}`}),"table_required"===b.type&&0===c.tables.length&&h.push({level:a,message:`${b.name}:缺少结构化表格`}),"source_required"===b.type&&[...c.project,...c.schedule,...c.quality,...c.safety].some(a=>!a.sourceFile)&&h.push({level:a,message:`${b.name}:存在无来源事实`})}return h}(o,O,M,w,D(Q),m,j),M,w);return{...Q,validationIssues:O,exportGate:R,markdown:D({...Q,validationIssues:O,exportGate:R})}}async function F(a){let b=t(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,i.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,i.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=x(g,f),j=c.requiredFacts.filter(a=>!h.some(b=>b.content.includes(a.replace(/要求|计划|目标|标准/gu,""))||b.content.includes(a))),k=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理。`:"资料未提供,需进一步确认。","",h.length>0?"### 资料依据":"",...h.map(y),"",j.length>0?"### 待确认事项":"",...j.map(a=>`- ${a}:资料未提供,需进一步确认。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:k,evidence:h,missingFacts:j}}},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||void 0,executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===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||"",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),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)}}};
40
+ ${d}`);return e?.facts?.length?{facts:e.facts.filter(a=>a.key&&a.value).map(a=>({key:a.key,value: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 抽取 ${e.facts.length} 条事实`}]}:{facts:[],stages:c}}function E(a){return['<div class="document-cover">',`# ${a.title}`,"",`**文档版本**:V1.0 `,`**生成时间**:${new Date(a.generatedAt).toLocaleString("zh-CN")} `,`**生成要求**:${a.requirement||"未填写"} `,"</div>","",'<div class="page-break"></div>',"","## 目录","",...a.chapters.map((a,b)=>`${b+1}. ${a.title}`),"",'<div class="page-break"></div>',"","## 结构化事实表","",Object.keys(a.facts).length>0?["| 事实项 | 依据 |","|---|---|",...Object.entries(a.facts).map(([a,b])=>`| ${a} | ${b.replace(/\|/gu," ")} |`)].join("\n"):"未抽取到明确事实,需人工确认。","",...a.chapters.flatMap(a=>[a.content,""]),"## 资料来源清单","","| 文件 | 引用次数 |","|---|---:|",...a.sources.map(a=>`| ${a.filePath} | ${a.count} |`),"","## 缺失项与需确认事项","",...a.missingItems.length>0?a.missingItems.map(a=>`- ${a}`):["- 暂未发现完全缺失章节;仍需人工复核关键数据。"],"","## 校验结果","",...a.validation.warnings.map(a=>`- 警告:${a}`),...a.validation.errors.map(a=>`- 错误:${a}`),"","## 严格校验清单","",...a.validationIssues.map(a=>`- ${a.level.toUpperCase()}:${a.message}${a.suggestion?`(建议:${a.suggestion})`:""}`)].join("\n")}async function F(a){let b=u(a.templateId);if(!b)throw Error("Document template not found");let c=a.projectRoot||(0,i.aY)();if(!c)throw Error("No knowledge base project found");let g=(0,i.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),j=A(b),m=B(b),o=(0,l.py)(b.documentSpecId),p=(function(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(n(),"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("builtin:")){let b=s[a];b&&c.push({id:a,roleId:f.roleId,name:b.name,content:b.content});continue}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})(j).map(a=>`## [${a.roleId}] ${a.name}
41
+ ${a.content}`).join("\n\n"),q=a=>[a,e.isAbsolute(a)?e.relative(c,a):e.join(c,a)],r=new Set(m.flatMap(a=>q(a.filePath))),t=(0,k.XB)("file"),v=new Map(m.flatMap(a=>q(a.filePath).map(b=>[b,a.roleId]))),w=new Map(m.flatMap(a=>q(a.filePath).map(b=>[b,t.find(b=>b.id===a.roleId)?.processingType||"reference"]))),x=await g.getProject(c);await x.incrementalIndex();let C=[],F=[],G=[];for(let a of b.chapters){let d=[];for(let e of a.queries.length>0?a.queries:[b.name,b.outputTitle,a.title,...m.map(a=>a.filePath)]){let b=await g.search(c,e,{scope:"project",limit:Math.max(h,r.size>0?30:h),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});d.push(...b.results.filter(a=>0===r.size||r.has(a.filePath)).map(b=>({chapterId:a.id,filePath:b.filePath,score:b.score,content:b.content,roleId:v.get(b.filePath),processingType:w.get(b.filePath),sectionTitle:b.sectionTitle,source:b.source})))}for(let b of r){let c=x.getFileDetail(b);c&&d.push(...c.chunks.slice(0,Math.max(h,20)).map(b=>({chapterId:a.id,filePath:c.file.relativePath,score:1,content:b.content,roleId:v.get(c.file.relativePath),processingType:w.get(c.file.relativePath),sectionTitle:b.sectionTitle,source:"bound-file"})))}let e=y(d,h);F.push(...e);let f=a.requiredFacts.filter(a=>!e.some(b=>b.content.includes(a.replace(/要求|计划|目标|标准/gu,""))||b.content.includes(a)));for(let b of(0===e.length&&G.push(`${a.title}:未检索到明确资料依据`),f))G.push(`${a.title}:${b} 未检索到明确依据`);let i=[`## ${a.title}`,"",p?`### 模板绑定提示词规则
42
+ ${p.slice(0,3e3)}`:"","",e.length>0?`本章根据模板绑定资料围绕“${a.purpose||b.description}”整理。`:"模板绑定资料未检索到明确内容,需进一步确认。","",e.length>0?"### 资料依据":"",...e.map(z),"",f.length>0?"### 待确认事项":"",...f.map(a=>`- ${a}:资料未提供,需进一步确认。`)].filter(Boolean).join("\n");C.push({id:a.id,title:a.title,content:i,evidence:e,missingFacts:f})}let H=function(a,b){let c={};for(let d of[...new Set(a.chapters.flatMap(a=>a.requiredFacts))]){let a=b.find(a=>a.content.includes(d.replace(/要求|计划|目标|标准/gu,""))||a.content.includes(d));a&&(c[d]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath})`)}return c}(b,F),I=function(a){let b=[["工程名称",/工程名称[::\s]+([^\n,。;;]+)/u],["工程地点",/(?:工程地点|建设地点)[::\s]+([^\n,。;;]+)/u],["建设单位",/建设单位[::\s]+([^\n,。;;]+)/u],["工期要求",/(?:工期|计划工期)[::\s]+([^\n,。;;]+)/u],["质量目标",/质量目标[::\s]+([^\n,。;;]+)/u],["安全目标",/安全目标[::\s]+([^\n,。;;]+)/u],["施工范围",/(?:施工范围|招标范围)[::\s]+([^\n]+)/u]],c=[];for(let d of a)for(let[a,e]of b){let b=d.content.match(e);b?.[1]&&!c.some(c=>c.key===a&&c.value===b[1].trim())&&c.push({key:a,value:b[1].trim().slice(0,300),sourceFile:d.filePath,roleId:d.roleId||"unknown",processingType:d.processingType,confidence:d.score})}return c}(F),J=await D(F,p),K=[...I,...J.facts],L=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=e.isAbsolute(g.filePath)?g.filePath:e.join((0,i.aY)(),g.filePath),h=e.extname(g.filePath).toLowerCase();if(d.existsSync(a)&&[".xlsx",".xls",".csv"].includes(h))try{let c=f.readFile(a,{cellDates:!0,sheetStubs:!1});for(let a of c.SheetNames){let d=c.Sheets[a],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:a,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let j=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let k=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",l=j.map(a=>a.split(k).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);l.length<2||b.push({tableType:g.roleId||"table",headers:l[0],rows:l.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(F);for(let a of K)H[a.key]=`${a.value}(来源:${a.sourceFile},角色:${a.roleId})`;let M=new Map;for(let a of F)M.set(a.filePath,(M.get(a.filePath)??0)+1);let N=[...M.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),O=function(a,b=[],c=[]){let d=b=>a.filter(a=>b.some(b=>a.key.includes(b))),e=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b));return{project:d(["工程名称","工程地点","建设单位","施工范围"]),schedule:d(["工期","开工","竣工","节点"]),quality:d(["质量"]),safety:d(["安全"]),resources:d(["劳动力","材料","机械","设备"]),tables:b,drawings:e("drawing"),rules:e("rule"),specifications:e("specification"),missing:[...new Set(c)],conflicts:[]}}(K,L,G),P=function(a,b,c=[],d){let e=[],f=[];for(let b of a)0===b.evidence.length&&e.push(`${b.title} 未检索到资料证据`),b.content.length<80&&e.push(`${b.title} 内容较短,建议人工补充或重新生成`);for(let a of["工程名称","工期要求","质量目标","施工范围"])b[a]||c.some(b=>b.key===a)||e.push(`${a} 未形成明确事实,请人工确认`);d&&0===B(d).length&&f.push("模板未绑定任何知识库文件"),d&&0===A(d).length&&f.push("模板未绑定任何提示词");let g=new Set(c.map(a=>a.roleId));for(let a of["project_fact","rule"])d?.fileBindings?.some(b=>b.roleId===a)&&!g.has(a)&&e.push(`${a} 角色未抽取到结构化事实`);return{passed:0===f.length,warnings:e,errors:f}}(C,H,K,b),Q=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 0===b.project.length&&d.push({level:"error",message:"项目基础事实缺失",suggestion:"请在项目事实文件角色中绑定包含工程概况的资料。"}),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}(P,O,C),R=[...J.stages,{type:"chapter_generation",roleId:"document-workflow",status:"success",message:`生成 ${C.length} 个章节`},{type:"validation",roleId:"document-workflow",status:P.errors.length>0?"failed":"success",message:`错误 ${P.errors.length},警告 ${P.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"}],S={templateId:b.id,templateName:b.name,title:b.outputTitle,requirement:a.requirement||(j.length?`使用模板绑定提示词:${j.map(a=>`${a.promptId}(${a.roleId})`).join(", ")}`:""),facts:H,structuredFacts:K,factsModel:O,chapters:C,sources:N,missingItems:[...new Set(G)],validation:P,validationIssues:Q,executionStages:R,exportGate:{passed:!0,blockingIssues:[],checklist:[]},generatedAt:Date.now()},T=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level)},{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);return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(Q=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=new Set([...c.project,...c.schedule,...c.quality,...c.safety,...c.resources].map(a=>a.key)),j=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required))i.has(b.name)||h.push({level:"error",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"});for(let b of a.chapterRules.filter(a=>a.required)){j.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} 字。`})}for(let b of a.gateRules){let a=b.level;"required_fact"===b.type&&b.target&&!i.has(b.target)&&h.push({level:a,message:`${b.name}:缺少事实 ${b.target}`}),"required_chapter"===b.type&&b.target&&!j.has(b.target)&&h.push({level:a,message:`${b.name}:缺少章节 ${b.target}`}),"required_file_role"===b.type&&b.target&&!f.some(a=>a.roleId===b.target)&&h.push({level:a,message:`${b.name}:缺少文件角色 ${b.target}`}),"required_prompt_role"===b.type&&b.target&&!g.some(a=>a.roleId===b.target)&&h.push({level:a,message:`${b.name}:缺少提示词角色 ${b.target}`}),"forbidden_text"===b.type&&b.value&&e.includes(b.value)&&h.push({level:a,message:`${b.name}:出现禁用文本 ${b.value}`}),"table_required"===b.type&&0===c.tables.length&&h.push({level:a,message:`${b.name}:缺少结构化表格`}),"source_required"===b.type&&[...c.project,...c.schedule,...c.quality,...c.safety].some(a=>!a.sourceFile)&&h.push({level:a,message:`${b.name}:存在无来源事实`})}return h}(o,Q,O,C,E(S),m,j),O,C);return{...S,validationIssues:Q,exportGate:T,markdown:E({...S,validationIssues:Q,exportGate:T})}}async function G(a){let b=u(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,i.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,i.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=y(g,f),j=c.requiredFacts.filter(a=>!h.some(b=>b.content.includes(a.replace(/要求|计划|目标|标准/gu,""))||b.content.includes(a))),k=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理。`:"资料未提供,需进一步确认。","",h.length>0?"### 资料依据":"",...h.map(z),"",j.length>0?"### 待确认事项":"",...j.map(a=>`- ${a}:资料未提供,需进一步确认。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:k,evidence:h,missingFacts:j}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>s,FV:()=>r,Mu:()=>t,NR:()=>u,XB:()=>p,dg:()=>q,dw:()=>v});var d=c(73024),e=c(48161),f=c(76760);let g=f.join(e.homedir(),".customize-agent","demo-project"),h=[{id:"delta-rule-files",name:"三角洲攻略规则文件",description:"大白话:告诉系统这篇攻略要遵守什么写作规则和输出要求。",type:"file",processingType:"rule",resourceIds:[f.join(g,"规则文件-攻略写作要求.md")]},{id:"delta-fact-files",name:"三角洲干员事实文件",description:"大白话:存放干员、定位、技能、打法这些真实攻略资料。",type:"file",processingType:"project_fact",resourceIds:[f.join(g,"项目事实-热门干员资料.md")]},{id:"delta-table-files",name:"三角洲干员表格数据",description:"大白话:存放可以被解析成表格的数据,比如推荐指数、难度、职责。",type:"file",processingType:"table",resourceIds:[f.join(g,"表格数据-热门干员推荐.csv")]},{id:"delta-drawing-files",name:"三角洲战术示意图文件",description:"大白话:没有真实 CAD 图纸时,用路线/阵型/站位说明代替图纸资料。",type:"file",processingType:"drawing",resourceIds:[f.join(g,"图纸文件-战术路线示意.md")]},{id:"delta-spec-files",name:"三角洲攻略规范文件",description:"大白话:告诉系统攻略应该包含哪些章节、怎么写、怎么校验。",type:"file",processingType:"specification",resourceIds:[f.join(g,"规范文件-攻略结构规范.md")]},{id:"delta-fact-prompt",name:"三角洲事实抽取提示词",description:"从示例资料中抽取干员名称、定位、技能、难度和推荐指数。",type:"prompt",executionType:"fact_extraction",resourceIds:["builtin:delta-fact-extraction"]},{id:"delta-generation-prompt",name:"三角洲章节生成提示词",description:"生成适合新手阅读的热门干员攻略正文。",type:"prompt",executionType:"chapter_generation",resourceIds:["builtin:delta-chapter-generation"]},{id:"delta-validation-prompt",name:"三角洲校验提示词",description:"检查是否缺少热门干员、表格和实战注意事项。",type:"prompt",executionType:"validation",resourceIds:["builtin:delta-validation"]}],i={id:"delta-force-demo-config",name:"三角洲热门干员攻略项目配置",description:"内置示例配置:文件角色和提示词角色已排好顺序,用户可直接选择内置模板生成。",fileRoles:[{roleId:"delta-rule-files",order:0},{roleId:"delta-fact-files",order:1},{roleId:"delta-table-files",order:2},{roleId:"delta-drawing-files",order:3},{roleId:"delta-spec-files",order:4}],promptRoles:[{roleId:"delta-fact-prompt",order:0},{roleId:"delta-generation-prompt",order:1},{roleId:"delta-validation-prompt",order:2}]};function j(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function k(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function l(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:k(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||"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 m(a){return{id:k(a.id),name:a.name||"未命名配置",description:a.description||"",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 n(){try{let a=j();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(l),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(l):[],configs:Array.isArray(b.configs)?b.configs.map(m):[]}}catch{return{roles:[],configs:[]}}}function o(a){d.writeFileSync(j(),JSON.stringify({roles:a.roles.map(l),configs:a.configs.map(m)},null,2),"utf-8")}function p(a){let b=[...new Map([...h,...n().roles].map(a=>[a.id,a])).values()];return a?b.filter(b=>b.type===a):b}function q(a){let b=l(a),c=n();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),o(c),b}function r(a,b){if(h.some(c=>c.id===b&&c.type===a))throw Error("Built-in demo role cannot be deleted");let c=n();c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(a=>({...a,fileRoles:a.fileRoles.filter(a=>a.roleId!==b),promptRoles:a.promptRoles.filter(a=>a.roleId!==b)})),o(c)}function s(){return[...new Map([i,...n().configs].map(a=>[a.id,a])).values()]}function t(a){return a===i.id?i:n().configs.find(b=>b.id===a)}function u(a){let b=m(a),c=n();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),o(c),b}function v(a){if(a===i.id)throw Error("Built-in demo config cannot be deleted");let b=n();b.configs=b.configs.filter(b=>b.id!==a),o(b)}}};
@@ -1 +1 @@
1
- exports.id=8204,exports.ids=[8204],exports.modules={4823:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(60056);function e(a){return{algorithm:a?d.w4.darkAlgorithm:d.w4.defaultAlgorithm,token:{colorPrimary:a?"#0a84ff":"#007aff",colorInfo:a?"#0a84ff":"#007aff",colorSuccess:a?"#30d158":"#34c759",colorWarning:a?"#ff9f0a":"#ff9500",colorError:a?"#ff453a":"#ff3b30",colorBgBase:a?"#1c1c1e":"#f5f5f7",colorBgContainer:a?"rgba(44,44,46,0.78)":"rgba(255,255,255,0.78)",colorBgElevated:a?"rgba(44,44,46,0.92)":"rgba(255,255,255,0.94)",colorBorder:a?"rgba(255,255,255,0.12)":"rgba(60,60,67,0.16)",colorText:a?"#f5f5f7":"#1d1d1f",colorTextSecondary:a?"#98989d":"#6e6e73",fontFamily:"var(--fontSans)",fontSize:14,borderRadius:14,borderRadiusLG:20,borderRadiusSM:10,controlHeight:36,lineWidth:1,boxShadow:a?"0 8px 24px rgba(0,0,0,0.24)":"0 8px 24px rgba(0,0,0,0.06)",boxShadowSecondary:a?"0 4px 12px rgba(0,0,0,0.2)":"0 4px 12px rgba(0,0,0,0.04)",motionDurationMid:"0.2s",motionEaseInOut:"cubic-bezier(0.25, 0.1, 0.25, 1)"},components:{Card:{borderRadiusLG:20,paddingLG:24,headerFontSize:13,headerFontSizeSM:12},Button:{borderRadius:14,borderRadiusLG:18,borderRadiusSM:10,fontWeight:600,primaryShadow:"var(--shadowButton)"},Input:{borderRadius:14,controlHeight:36,activeShadow:"0 0 0 3px rgba(0,122,255,0.12)"},Select:{borderRadius:14},Modal:{borderRadiusLG:20,titleFontSize:17,fontWeightStrong:700},Tag:{borderRadiusSM:100,defaultBg:a?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.04)"},Table:{borderRadiusLG:20,headerBg:a?"rgba(255,255,255,0.04)":"rgba(0,0,0,0.02)",headerColor:"var(--colorTextSecondary)",headerSplitColor:"transparent",headerBorderRadius:12},Spin:{dotSize:28,dotSizeLG:40},Upload:{borderRadiusLG:20}}}}},8204:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>h});var e=c(8732),f=c(94487);c(66285),c(97237);var g=a([f]);function h({Component:a,pageProps:b}){return(0,e.jsx)(f.PE,{children:(0,e.jsx)(a,{...b})})}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},13484:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"管理控制台"},"nav":{"overview":"总览","knowledge":"知识库","knowledgeManage":"知识库管理","fileManagement":"文件管理","knowledgeSearch":"知识库搜索","documents":"生成编辑","documentRoles":"角色配置","documentSpecs":"文档规范包","guide":"学习说明","models":"模型配置","settings":"设置","contextEngineering":"上下文工程","longTermContext":"长期上下文","shortTermContext":"短期上下文","promptManagement":"提示词管理"},"overview":{"title":"系统总览","description":"查看 Customize Agent 运行状态与关键指标","status":"服务状态","statusRunning":"运行中","statusError":"异常","knowledgeBase":"知识库","modelConfig":"模型配置","filesCount":"文件总数","chunksCount":"分块总数","storageSize":"存储空间","providersCount":"已配置模型","quickActions":"快捷操作","goToKnowledge":"管理知识库","goToModels":"配置模型","goToSettings":"系统设置","cores":"核","memory":"内存","tokensUsed":"累计 Tokens","tasksTotal":"总任务数","successRate":"成功率","topModel":"调用最多模型","taskTypes":"任务类型","calls":"次调用"},"knowledge":{"title":"知识库管理","description":"管理本地文件和知识库索引","manageTitle":"知识库管理","manageDesc":"查看知识库统计、分类和功能状态","stats":"统计概览","files":"文件管理","settings":"知识库设置","totalFiles":"文件总数","totalChunks":"分块总数","totalSize":"存储大小","lastIndexed":"上次索引","categories":"文件分类","fileCount":"文件数量","search":"搜索文件","searchPlaceholder":"输入文件名或内容关键词...","filterCategory":"筛选分类","allCategories":"全部类型","upload":"上传文件","uploadHint":"点击或拖拽上传 (PDF, Word, Excel, 图片, 代码等)","uploading":"上传中...","reindex":"重新索引","reindexing":"正在重新索引...","delete":"删除","deleteConfirm":"确定要删除该文件吗?此操作不可恢复。","fileList":"文件列表","fileName":"文件名","fileSize":"大小","fileCategory":"分类","fileDate":"修改日期","noFiles":"暂无文件,请上传文件开始使用","loadError":"加载文件列表失败","emptySearch":"未找到匹配的文件","ignoreRules":"忽略规则","ignoreHint":"每行一个 glob 模式,匹配的文件将被跳过","saveIgnore":"保存规则","duplicates":"重复文件","noDuplicates":"未发现重复文件","duplicatesFound":"发现 {count} 组重复文件","features":"功能状态","featureName":"功能","featureDesc":"说明","featureValue":"实现","featureVectorStoreDesc":"向量数据库,存储文档向量索引","featureEmbeddingDesc":"文本嵌入模型,将文本转换为向量","featureDedup":"去重引擎","featureDedupDesc":"检测并移除重复/相似文档","featureChunker":"分块器","featureChunkerDesc":"将文档拆分为可检索的语义块","globalSearch":"全局搜索","projectSearch":"项目搜索","autoIndex":"自动索引","enabled":"已启用","disabled":"已禁用"},"models":{"title":"模型配置","description":"管理 LLM 模型与层级分配","modelList":"Model 列表","addModel":"添加模型","editModel":"编辑模型","providerName":"Provider 名称","modelName":"模型名称","apiKey":"API Key","baseUrl":"Base URL","protocol":"请求协议","testConnection":"测试连接","testing":"测试中...","connected":"已连接","connectionFailed":"连接失败","noProviders":"暂无模型,请添加一个","modelTiers":"模型层级分配","tierReader":"Reader(只读)","tierReaderDesc":"处理低风险、只读和成本敏感任务,例如读取文件、检索知识库、搜索文本、整理上下文。建议选择速度快、价格低、长上下文能力稳定的模型。","tierReasoning":"Reasoning(推理)","tierReasoningDesc":"处理需要深入分析、规划、代码理解和多步骤推理的任务。建议选择推理能力强、稳定性高的模型,必要时可使用更高阶模型。","tierAction":"Action(操作)","tierActionDesc":"处理会产生副作用的任务,例如写文件、修改代码、执行命令、调用外部工具。建议选择可靠、遵循指令能力强且经过验证的模型。","activeModel":"当前模型","deleteProvider":"删除","deleteProviderConfirm":"确定要删除此模型及其所有配置吗?","modelNamePlaceholder":"例如: gpt-4o / deepseek-chat","selectModelPlaceholder":"暂不配置","apiKeyEditHint":"已配置的 Key 会以掩码回显,聚焦后可输入新 Key;掩码不可复制,留空或保持掩码则不修改。","apiKeyEditPlaceholder":"输入新的 API Key,留空保持不变","embeddingConfig":"Embedding 配置","embeddingProvider":"Embedding Provider","embeddingProviderHash":"本地 Hash Embedding","embeddingProviderOpenAI":"OpenAI 兼容 Embedding","embeddingHint":"Embedding 用于知识库向量检索。修改 Embedding 模型或维度后,建议到知识库页面重新索引。","model":"Model","dimensions":"Dimensions","status":"状态","localHash":"本地 Hash","openAICompatible":"OpenAI 兼容","saveEmbedding":"保存 Embedding 配置","testEmbedding":"测试 Embedding","embeddingApiKeyHint":"留空或保持掩码表示不修改密钥","optional":"可选","save":"保存","cancel":"取消"},"context":{"title":"上下文工程管理","longTermDesc":"来自记忆库的持久化上下文(跨会话保留)","shortTermDesc":"来自最近会话日志的短期上下文","longTermSource":"数据来源: ~/.customize-agent/memory.db(记忆库)","shortTermSource":"数据来源: ~/.customize-agent/logs/(会话日志)","importance":"重要性","content":"内容","tags":"标签","source":"来源","sourceHint":"可选,额外的来源/上下文说明","updatedAt":"更新时间"},"prompt":{"title":"提示词管理","description":"管理各项目的 CUSTOMIZE.md 系统提示词文件","filePath":"文件路径","lastModified":"最后修改","hasFile":"已配置","noFile":"未配置","noProjects":"暂无项目,请先初始化 Customize Agent 项目"},"documents":{"title":"生成编辑","description":"基于模板库和本地知识库生成、编辑、校验业务文档","templateLibrary":"模板库","workflow":"模板工作流","template":"模板","selected":"已选择","boundPrompts":"绑定提示词","boundFiles":"绑定知识库文件","boundPromptsRequired":"请选择提示词","boundFilesRequired":"请选择知识库文件","promptRole":"提示词角色","fileRole":"文件角色","manageRoles":"管理角色","roleEditor":"角色编辑器","roleType":"角色类型","roleName":"角色名称","roleDescription":"角色说明","addPromptBinding":"添加提示词绑定","addFileBinding":"添加文件绑定","structuredFacts":"结构化事实","exportGate":"导出门禁","executionStages":"执行阶段","executionStatus":"执行状态","flowPrepare":"准备配置","flowPrepareDesc":"读取模板、项目角色配置、文件角色和提示词角色","flowPrepareDone":"配置读取完成","flowFactExtraction":"事实抽取","flowFactExtractionDesc":"按文件处理类型抽取 JSON 事实和表格结构","flowChapterGeneration":"章节生成","flowChapterGenerationDesc":"基于证据、事实和提示词生成章节草稿","flowValidation":"严格校验","flowValidationDesc":"检查事实完整性、来源追踪和章节证据","flowFormatting":"正式排版","flowFormattingDesc":"生成封面、目录、分页和正式文档结构","flowDone":"生成完成","flowDoneDesc":"流程完成,可进入编辑和导出","flowGateFailed":"生成完成,但导出门禁未通过,请检查校验结果","projectRoleConfig":"项目角色配置","documentSpec":"文档规范包","documentSpecPlaceholder":"请选择文档规范包","exportDocx":"导出 Word","projectRoleConfigRequired":"请选择项目角色配置","noRoleConfig":"未绑定项目角色配置","evidenceLimit":"每章证据数","requirement":"生成要求","requirementPlaceholder":"例如:根据上传的招标文件、图纸和清单,生成一份施工组织设计草稿。","generate":"开始生成","editor":"生成 / 编辑器","edit":"编辑","chapters":"章节","sources":"资料来源","missingItems":"缺失项","validation":"校验","evidenceCount":"证据数量","missingCount":"缺失事实","downloadMarkdown":"下载 Markdown","exportHtml":"导出 HTML","exportPdf":"导出 PDF","saveDraft":"保存草稿","draftHistory":"草稿历史","regenerateChapter":"重新生成本章","newTemplate":"新建模板","templateEditor":"模板编辑器","templateName":"模板名称","templateCategory":"模板分类","templateDescription":"模板说明","outputTitle":"输出标题","chapter":"章节","chapterTitle":"章节标题","chapterPurpose":"章节用途","chapterQueries":"检索 Query","requiredFacts":"必需事实","addChapter":"添加章节","builtIn":"内置","deleteTemplateConfirm":"确定删除该模板吗?","noDraft":"请选择模板并生成草稿"},"specs":{"title":"文档规范包","description":"配置事实字段、章节要求、强门禁规则和 Word 模板,让不同公司和项目可以自定义生产级约束。","newSpec":"新建规范包","list":"规范包列表","editor":"规范包编辑器","name":"规范包名称","specDescription":"规范包说明","wordTemplatePath":"Word 模板路径","facts":"事实字段","chapters":"章节规则","gates":"门禁规则","factName":"字段名称","factType":"字段类型","required":"必填/必需","sourceRoles":"来源文件角色","extractionHint":"抽取说明","validationHint":"校验说明","addFact":"添加事实字段","chapterTitle":"章节标题","order":"顺序","minWords":"最低字数","requiredFacts":"必需事实","requiredFileRoles":"必需文件角色","requiredPromptRoles":"必需提示词角色","generationHint":"生成说明","addChapter":"添加章节规则","gateName":"门禁名称","addGate":"添加门禁规则"},"guide":{"title":"学习说明:如何跑通文档生成全流程","description":"本页面用于指导用户从模型配置、知识库、提示词、角色配置、模板创建、生成、校验到导出的完整操作流程。建议第一次使用时按顺序完成每一步。","fullFlow":"全流程步骤","stepModel":"1. 配置模型","stepModelDesc":"进入模型配置页面,添加可用的大模型供应商和模型,并设置当前启用模型。LLM JSON 事实抽取会优先使用已启用模型;如果模型不可用,系统会回退到本地确定性抽取。","stepKnowledge":"2. 上传知识库文件","stepKnowledgeDesc":"进入知识库页面上传招标文件、工程说明、表格数据、图纸说明、规范文件等资料。上传后等待索引完成,确保文件能在知识库文件列表中看到。","stepPrompt":"3. 创建提示词","stepPromptDesc":"进入提示词页面创建事实抽取、章节生成、校验、格式化等提示词。提示词应明确输出要求、禁止编造、引用来源和格式规范。","stepRole":"4. 配置角色和项目角色配置","stepRoleDesc":"进入角色配置页面,创建文件角色并绑定知识库文件,创建提示词角色并绑定提示词,再创建项目角色配置,对文件角色和提示词角色排序。","stepTemplate":"5. 创建模板","stepTemplateDesc":"进入生成编辑页面,新建模板,填写名称、分类、输出标题,并绑定一个项目角色配置。模板不直接绑定文件和提示词,只绑定项目角色配置。","stepGenerate":"6. 执行生成","stepGenerateDesc":"点击生成后,执行状态 Card 会展示准备配置、事实抽取、章节生成、严格校验、正式排版和完成状态,方便用户感知当前进度。","stepReview":"7. 审查结果","stepReviewDesc":"生成后检查编辑器、章节、结构化事实、来源、缺失项、严格校验、导出门禁和执行阶段。校验错误需要先处理再导出正式 PDF。","stepExport":"8. 导出文件","stepExportDesc":"可以导出 Markdown、HTML、PDF。PDF 会启用导出门禁,门禁未通过时系统会阻止导出,避免未经校验的文档流出。","roleDesign":"角色设计说明","roleDesignDesc":"角色用于把用户自定义名称和系统可执行能力连接起来。用户可以完全自定义角色名称,但必须选择执行类型或处理类型,让系统知道如何使用它。","fileRole":"文件角色","fileRoleDesc":"文件角色绑定知识库文件,并选择处理类型,例如规则文件、项目事实文件、表格数据、图纸文件、规范文件或参考资料。","promptRole":"提示词角色","promptRoleDesc":"提示词角色绑定提示词,并选择执行类型,例如事实抽取、章节生成、校验、格式化或参考。","projectConfig":"项目角色配置","projectConfigDesc":"项目角色配置把多个文件角色和提示词角色组合起来,并定义执行顺序。模板只需要绑定项目角色配置。","generationEngine":"生成引擎说明","generationEngineDesc":"生成引擎会按角色配置组织资料和提示词,执行事实抽取、表格解析、章节生成、严格校验和正式排版。","prepareTitle":"准备资料时要注意什么?","prepareContent":"建议至少准备项目事实文件、规则文件和生成提示词。表格类资料应尽量使用清晰表头,图纸资料建议配套图纸目录或说明文件。","rolesTitle":"角色应该怎么命名?","rolesContent":"角色名称建议使用业务语义,例如“招标文件事实源”“劳动力计划表”“施工组织设计章节生成提示词”。系统不依赖名称判断能力,而是依赖处理类型和执行类型。","templateTitle":"模板应该怎么创建?","templateContent":"模板用于定义输出文档类型和标题,绑定项目角色配置即可。不同项目可以复用同一模板,但应创建不同的项目角色配置来绑定不同资料。","generateTitle":"生成过程中怎么看进度?","generateContent":"生成页会显示执行状态 Card。当前步骤会高亮,成功后变为完成;如果失败会显示错误。生成完成后,下方执行阶段会展示后端真实阶段结果。","qaTitle":"怎样判断能否正式导出?","qaContent":"重点查看导出门禁。只有无阻断级错误、基础事实齐全、事实具备来源、章节有证据且没有资料未提供章节时,才建议导出 PDF。"},"roles":{"title":"角色配置","description":"创建文件角色、提示词角色,并组合成可排序的项目角色配置供模板绑定使用","newFileRole":"新建文件角色","newPromptRole":"新建提示词角色","newConfig":"新建项目配置","fileRoles":"文件角色","promptRoles":"提示词角色","configs":"项目角色配置","roleEditor":"角色编辑器","configEditor":"项目角色配置编辑器","roleType":"角色类型","fileRole":"文件角色","promptRole":"提示词角色","roleName":"角色名称","roleDescription":"角色说明","bindFile":"绑定知识库文件","bindPrompt":"绑定提示词","executionType":"执行类型","processingType":"处理类型","factExtraction":"事实抽取","chapterGeneration":"章节生成","validation":"校验","formatting":"格式化","reference":"参考","ruleFile":"规则文件","projectFactFile":"项目事实文件","tableFile":"表格数据","drawingFile":"图纸文件","specificationFile":"规范文件","configName":"配置名称","configDescription":"配置说明","addRole":"添加角色"},"settings":{"title":"系统设置","description":"管理语言、主题等偏好","language":"语言","languageDesc":"界面显示语言","theme":"主题","themeDesc":"浅色 / 深色模式","light":"浅色","dark":"深色","system":"跟随系统","about":"关于","version":"版本","port":"服务端口"},"common":{"save":"保存","cancel":"取消","confirm":"确认","delete":"删除","edit":"编辑","add":"添加","search":"搜索","loading":"加载中...","error":"出错了","success":"操作成功","retry":"重试","close":"关闭","back":"返回","more":"更多","noData":"暂无数据","bytes":"字节","kb":"KB","mb":"MB","gb":"GB","unknown":"未知","never":"从未"}}')},34924:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Y:()=>j});var e=c(8732),f=c(57312),g=c(94487),h=c(68329),i=a([f,g]);function j(){let{resolvedTheme:a,setTheme:b}=(0,f.useTheme)(),{locale:c,setLocale:d}=(0,g.x_)(),i=(0,g.Vr)("settings"),j="dark"===a;return(0,e.jsxs)("header",{className:"topbar",children:[(0,e.jsx)("div",{className:"flex-1"}),(0,e.jsxs)("button",{onClick:()=>b(j?"light":"dark"),className:"topbarBtn",children:[j?(0,e.jsx)(h.bd5,{size:14}):(0,e.jsx)(h.AX$,{size:14}),(0,e.jsx)("span",{children:i(j?"light":"dark")})]}),(0,e.jsxs)("button",{onClick:()=>{d("zh-CN"===c?"en-US":"zh-CN")},className:"topbarBtn",children:[(0,e.jsx)(h.ATU,{size:14}),(0,e.jsx)("span",{children:"zh-CN"===c?"English":"中文"})]})]})}[f,g]=i.then?(await i)():i,d()}catch(a){d(a)}})},54506:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"Admin Console"},"nav":{"overview":"Overview","knowledge":"Knowledge Base","knowledgeManage":"KB Management","fileManagement":"File Management","knowledgeSearch":"KB Search","documents":"Generate & Edit","documentRoles":"Role Config","documentSpecs":"Document Specs","guide":"Guide","models":"Model Config","settings":"Settings","contextEngineering":"Context Engineering","longTermContext":"Long-term Context","shortTermContext":"Short-term Context","promptManagement":"Prompt Management"},"overview":{"title":"System Overview","description":"Monitor Customize Agent status and key metrics","status":"Service Status","statusRunning":"Running","statusError":"Error","knowledgeBase":"Knowledge Base","modelConfig":"Model Config","filesCount":"Total Files","chunksCount":"Total Chunks","storageSize":"Storage Size","providersCount":"Models","quickActions":"Quick Actions","goToKnowledge":"Manage Knowledge Base","goToModels":"Configure Models","goToSettings":"System Settings","cores":"cores","memory":"Memory","tokensUsed":"Total Tokens","tasksTotal":"Total Tasks","successRate":"Success Rate","topModel":"Most Used Model","taskTypes":"Task Types","calls":"calls"},"knowledge":{"title":"Knowledge Base","description":"Manage local files and knowledge base index","manageTitle":"KB Management","manageDesc":"View knowledge base statistics, categories, and features","stats":"Statistics","files":"File Management","settings":"KB Settings","totalFiles":"Total Files","totalChunks":"Total Chunks","totalSize":"Total Size","lastIndexed":"Last Indexed","categories":"File Categories","fileCount":"File Count","search":"Search Files","searchPlaceholder":"Search by filename or content...","filterCategory":"Filter Category","allCategories":"All Types","upload":"Upload File","uploadHint":"Click or drag to upload (PDF, Word, Excel, images, code, etc.)","uploading":"Uploading...","reindex":"Reindex","reindexing":"Reindexing...","delete":"Delete","deleteConfirm":"Are you sure you want to delete this file? This action cannot be undone.","fileList":"File List","fileName":"File Name","fileSize":"Size","fileCategory":"Category","fileDate":"Modified","noFiles":"No files yet. Upload files to get started.","loadError":"Failed to load file list","emptySearch":"No matching files found","ignoreRules":"Ignore Rules","ignoreHint":"One glob pattern per line. Matching files will be skipped.","saveIgnore":"Save Rules","duplicates":"Duplicate Files","noDuplicates":"No duplicate files found","duplicatesFound":"Found {count} duplicate groups","features":"Feature Status","featureName":"Feature","featureDesc":"Description","featureValue":"Implementation","featureVectorStoreDesc":"Vector database for storing document embeddings","featureEmbeddingDesc":"Text embedding model for converting text to vectors","featureDedup":"Dedup Engine","featureDedupDesc":"Detects and removes duplicate/similar documents","featureChunker":"Chunker","featureChunkerDesc":"Splits documents into retrievable semantic chunks","globalSearch":"Global Search","projectSearch":"Project Search","autoIndex":"Auto Index","enabled":"Enabled","disabled":"Disabled"},"models":{"title":"Model Configuration","description":"Manage LLM models and tier assignments","modelList":"Model List","addModel":"Add Model","editModel":"Edit Model","providerName":"Provider Name","modelName":"Model Name","apiKey":"API Key","baseUrl":"Base URL","protocol":"Protocol","testConnection":"Test Connection","testing":"Testing...","connected":"Connected","connectionFailed":"Connection Failed","noProviders":"No models yet. Add one to get started.","modelTiers":"Model Tier Assignment","tierReader":"Reader (Read-only)","tierReaderDesc":"Handles low-risk, read-only, and cost-sensitive work such as reading files, searching the knowledge base, text search, and context organization. Prefer fast, inexpensive models with stable long-context support.","tierReasoning":"Reasoning (Analysis)","tierReasoningDesc":"Handles deeper analysis, planning, code understanding, and multi-step reasoning. Prefer models with stronger reasoning quality and reliability.","tierAction":"Action (Write/Execute)","tierActionDesc":"Handles side-effect operations such as writing files, changing code, running commands, and calling external tools. Prefer reliable models with strong instruction-following and verified behavior.","activeModel":"Active Model","deleteProvider":"Delete","deleteProviderConfirm":"Are you sure you want to delete this model and all its configs?","modelNamePlaceholder":"e.g. gpt-4o / deepseek-chat","selectModelPlaceholder":"No model selected","apiKeyEditHint":"Configured keys are shown as a masked value. Focus the field to enter a new key; the mask cannot be copied. Leave empty or keep the mask to avoid changes.","apiKeyEditPlaceholder":"Enter a new API key, or leave empty to keep current","embeddingConfig":"Embedding Configuration","embeddingProvider":"Embedding Provider","embeddingProviderHash":"Local Hash Embedding","embeddingProviderOpenAI":"OpenAI-compatible Embedding","embeddingHint":"Embedding is used for knowledge base vector retrieval. After changing the embedding model or dimensions, reindex the knowledge base.","model":"Model","dimensions":"Dimensions","status":"Status","localHash":"Local Hash","openAICompatible":"OpenAI-compatible","saveEmbedding":"Save Embedding Config","testEmbedding":"Test Embedding","embeddingApiKeyHint":"Leave empty or keep the masked value to avoid changing the key","optional":"Optional","save":"Save","cancel":"Cancel"},"context":{"title":"Context Engineering","longTermDesc":"Persistent context from memory store (cross-session)","shortTermDesc":"Short-term context from recent session logs","longTermSource":"Source: ~/.customize-agent/memory.db (Memory Store)","shortTermSource":"Source: ~/.customize-agent/logs/ (Session Logs)","importance":"Importance","content":"Content","tags":"Tags","source":"Source","sourceHint":"Optional additional source/context description","updatedAt":"Updated"},"prompt":{"title":"Prompt Management","description":"Manage CUSTOMIZE.md system prompt files per project","filePath":"File Path","lastModified":"Last Modified","hasFile":"Configured","noFile":"Not Configured","noProjects":"No projects found. Initialize a Customize Agent project first."},"documents":{"title":"Generate & Edit","description":"Generate, edit, and validate business documents from templates and the local knowledge base","templateLibrary":"Template Library","workflow":"Template Workflow","template":"Template","selected":"Selected","boundPrompts":"Bound Prompts","boundFiles":"Bound Knowledge Files","boundPromptsRequired":"Select prompts","boundFilesRequired":"Select knowledge files","promptRole":"Prompt Role","fileRole":"File Role","manageRoles":"Manage Roles","roleEditor":"Role Editor","roleType":"Role Type","roleName":"Role Name","roleDescription":"Role Description","addPromptBinding":"Add Prompt Binding","addFileBinding":"Add File Binding","structuredFacts":"Structured Facts","exportGate":"Export Gate","executionStages":"Execution Stages","executionStatus":"Execution Status","flowPrepare":"Prepare Config","flowPrepareDesc":"Load template, project role config, file roles, and prompt roles","flowPrepareDone":"Config loaded","flowFactExtraction":"Fact Extraction","flowFactExtractionDesc":"Extract JSON facts and table structures by file processing type","flowChapterGeneration":"Chapter Generation","flowChapterGenerationDesc":"Generate chapter drafts from evidence, facts, and prompts","flowValidation":"Strict Validation","flowValidationDesc":"Check fact completeness, source traceability, and chapter evidence","flowFormatting":"Formal Formatting","flowFormattingDesc":"Generate cover, table of contents, page breaks, and formal document structure","flowDone":"Completed","flowDoneDesc":"Generation completed; ready for editing and export","flowGateFailed":"Generation completed, but export gate failed. Check validation results","projectRoleConfig":"Project Role Config","documentSpec":"Document Spec Package","documentSpecPlaceholder":"Select a document spec package","exportDocx":"Export Word","projectRoleConfigRequired":"Select a project role config","noRoleConfig":"No project role config bound","evidenceLimit":"Evidence per Chapter","requirement":"Generation Requirement","requirementPlaceholder":"Example: Generate a construction organization design draft from uploaded tender files, drawings, and BOQ sheets.","generate":"Generate","editor":"Generate / Editor","edit":"Edit","chapters":"Chapters","sources":"Sources","missingItems":"Missing Items","validation":"Validation","evidenceCount":"Evidence Count","missingCount":"Missing Facts","downloadMarkdown":"Download Markdown","exportHtml":"Export HTML","exportPdf":"Export PDF","saveDraft":"Save Draft","draftHistory":"Draft History","regenerateChapter":"Regenerate Chapter","newTemplate":"New Template","templateEditor":"Template Editor","templateName":"Template Name","templateCategory":"Template Category","templateDescription":"Template Description","outputTitle":"Output Title","chapter":"Chapter","chapterTitle":"Chapter Title","chapterPurpose":"Chapter Purpose","chapterQueries":"Search Queries","requiredFacts":"Required Facts","addChapter":"Add Chapter","builtIn":"Built-in","deleteTemplateConfirm":"Delete this template?","noDraft":"Select a template and generate a draft"},"specs":{"title":"Document Spec Packages","description":"Configure fact fields, chapter rules, export gates, and Word templates for company/project-specific production constraints.","newSpec":"New Spec","list":"Spec List","editor":"Spec Editor","name":"Spec Name","specDescription":"Description","wordTemplatePath":"Word Template Path","facts":"Fact Fields","chapters":"Chapter Rules","gates":"Gate Rules","factName":"Field Name","factType":"Field Type","required":"Required","sourceRoles":"Source File Roles","extractionHint":"Extraction Hint","validationHint":"Validation Hint","addFact":"Add Fact Field","chapterTitle":"Chapter Title","order":"Order","minWords":"Min Words","requiredFacts":"Required Facts","requiredFileRoles":"Required File Roles","requiredPromptRoles":"Required Prompt Roles","generationHint":"Generation Hint","addChapter":"Add Chapter Rule","gateName":"Gate Name","addGate":"Add Gate Rule"},"guide":{"title":"Guide: Run the Full Document Generation Flow","description":"This guide walks users through model setup, knowledge files, prompts, role configuration, template creation, generation, validation, and export.","fullFlow":"Full Flow","stepModel":"1. Configure Models","stepModelDesc":"Open Model Config, add providers and models, set an active model, and run health checks.","stepKnowledge":"2. Upload Knowledge Files","stepKnowledgeDesc":"Upload tender files, project descriptions, tables, drawings, specifications, and standards, then wait for indexing.","stepPrompt":"3. Create Prompts","stepPromptDesc":"Create prompts for fact extraction, chapter generation, validation, and formatting.","stepRole":"4. Configure Roles","stepRoleDesc":"Create file roles and prompt roles, bind resources, then create an ordered project role config.","stepTemplate":"5. Create Template","stepTemplateDesc":"Create a template in Generate & Edit and bind a project role config.","stepGenerate":"6. Generate","stepGenerateDesc":"Click Generate and observe the execution status card for progress.","stepReview":"7. Review","stepReviewDesc":"Review facts, sources, missing items, validation, export gate, and execution stages.","stepExport":"8. Export","stepExportDesc":"Export Markdown, HTML, or PDF. PDF export enforces the export gate.","roleDesign":"Role Design","roleDesignDesc":"Roles connect user-defined names to executable system behavior through execution or processing types.","fileRole":"File Role","fileRoleDesc":"A file role binds a knowledge file and declares its processing type.","promptRole":"Prompt Role","promptRoleDesc":"A prompt role binds a prompt and declares its execution type.","projectConfig":"Project Role Config","projectConfigDesc":"A project role config combines and orders file roles and prompt roles. Templates bind configs directly.","generationEngine":"Generation Engine","generationEngineDesc":"The engine organizes resources by roles and runs fact extraction, table parsing, generation, validation, and formatting.","prepareTitle":"How should I prepare files?","prepareContent":"Prepare project facts, rules, tables, drawings, and specifications. Make table headers clear and include drawing descriptions when possible.","rolesTitle":"How should roles be named?","rolesContent":"Use business names such as Tender Fact Source, Labor Plan Table, or Chapter Generation Prompt. System behavior depends on types, not names.","templateTitle":"How should templates be created?","templateContent":"Templates define document entry and output title. Bind a project role config instead of selecting files and prompts directly.","generateTitle":"How do I see progress?","generateContent":"The generation page shows an execution status card. The current step is highlighted and final backend stages appear after completion.","qaTitle":"How do I know whether export is allowed?","qaContent":"Check the export gate. PDF export should only proceed when there are no blocking errors and facts/sources/chapters are complete."},"roles":{"title":"Role Config","description":"Create file roles and prompt roles, then combine them into ordered project role configs for templates","newFileRole":"New File Role","newPromptRole":"New Prompt Role","newConfig":"New Project Config","fileRoles":"File Roles","promptRoles":"Prompt Roles","configs":"Project Role Configs","roleEditor":"Role Editor","configEditor":"Project Role Config Editor","roleType":"Role Type","fileRole":"File Role","promptRole":"Prompt Role","roleName":"Role Name","roleDescription":"Role Description","bindFile":"Bind Knowledge File","bindPrompt":"Bind Prompt","executionType":"Execution Type","processingType":"Processing Type","factExtraction":"Fact Extraction","chapterGeneration":"Chapter Generation","validation":"Validation","formatting":"Formatting","reference":"Reference","ruleFile":"Rule File","projectFactFile":"Project Fact File","tableFile":"Table Data","drawingFile":"Drawing File","specificationFile":"Specification File","configName":"Config Name","configDescription":"Config Description","addRole":"Add Role"},"settings":{"title":"System Settings","description":"Manage language, theme, and other preferences","language":"Language","languageDesc":"Interface display language","theme":"Theme","themeDesc":"Light / Dark mode","light":"Light","dark":"Dark","system":"System","about":"About","version":"Version","port":"Service Port"},"common":{"save":"Save","cancel":"Cancel","confirm":"Confirm","delete":"Delete","edit":"Edit","add":"Add","search":"Search","loading":"Loading...","error":"Something went wrong","success":"Success","retry":"Retry","close":"Close","back":"Back","more":"More","noData":"No data","bytes":"bytes","kb":"KB","mb":"MB","gb":"GB","unknown":"Unknown","never":"Never"}}')},66285:()=>{},93065:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>m});var e=c(8732),f=c(82015),g=c(21202),h=c(9328),i=c.n(h),j=c(94487),k=c(68329),l=a([j]);j=(l.then?(await l)():l)[0];let n=[{href:"/overview",icon:k.HxJ,labelKey:"nav.overview"},{icon:k.WmV,labelKey:"nav.knowledge",children:[{href:"/knowledge/manage",icon:k.BmN,labelKey:"nav.knowledgeManage"},{href:"/knowledge/files",icon:k.iUU,labelKey:"nav.fileManagement"},{href:"/knowledge/search",icon:k.vji,labelKey:"nav.knowledgeSearch"}]},{icon:k.jy9,labelKey:"nav.contextEngineering",children:[{href:"/context/long-term",icon:k.WmV,labelKey:"nav.longTermContext"},{href:"/context/short-term",icon:k.WmV,labelKey:"nav.shortTermContext"}]},{href:"/documents",icon:k.sv7,labelKey:"nav.documents"},{href:"/document-roles",icon:k.wB_,labelKey:"nav.documentRoles"},{href:"/document-specs",icon:k.iUU,labelKey:"nav.documentSpecs"},{href:"/guide",icon:k.Gyj,labelKey:"nav.guide"},{href:"/models",icon:k.fX,labelKey:"nav.models"},{href:"/prompt",icon:k.vEG,labelKey:"nav.promptManagement"},{href:"/settings",icon:k.wB_,labelKey:"nav.settings"}];function m(){let a=(0,g.usePathname)(),b=(0,j.Vr)(),c=(0,f.useMemo)(()=>{let b={};for(let c of n)c.children?.some(b=>a===b.href||a.startsWith(b.href+"/"))&&(b[c.labelKey]=!0);return b},[a]),[d,h]=(0,f.useState)({}),[l,m]=(0,f.useState)(!1);return(0,e.jsxs)("aside",{className:`sidebar${l?" sidebarCollapsedSelf":""}`,children:[(0,e.jsx)(i(),{href:"/overview",prefetch:!1,children:(0,e.jsx)("div",{className:"sidebarLogo",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"sidebarLogoTitle",children:(0,e.jsx)("span",{className:"logoGradient",children:b("app.title")})}),(0,e.jsx)("div",{className:"sidebarLogoSub",children:b("app.subtitle")})]})})}),(0,e.jsx)("button",{className:"sidebarCollapseBtn",onClick:()=>m(a=>!a),"aria-label":l?"展开侧边栏":"收起侧边栏",children:l?(0,e.jsx)(k.wdi,{size:16}):(0,e.jsx)(k.ues,{size:16})}),(0,e.jsx)("nav",{className:"sidebarNav",children:n.map(f=>{if(f.children){let g=d[f.labelKey]??c[f.labelKey]??!1;return(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"sidebarItem sidebarParent",onClick:()=>{var a;return a=f.labelKey,void h(b=>({...b,[a]:!b[a]}))},children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)}),(0,e.jsx)("span",{className:"sidebarChevron",children:g?(0,e.jsx)(k.yQN,{size:14}):(0,e.jsx)(k.c_$,{size:14})})]}),g&&!l&&(0,e.jsx)("div",{className:"sidebarSubmenu",children:f.children.map(c=>{let d=a===c.href||a.startsWith(c.href+"/");return(0,e.jsx)(i(),{href:c.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem sidebarSubItem${d?" sidebarItemActive":""}`,children:[(0,e.jsx)(c.icon,{size:16}),(0,e.jsx)("span",{children:b(c.labelKey)})]})},c.href)})})]},f.labelKey)}let g=a===f.href||a.startsWith(f.href+"/");return(0,e.jsx)(i(),{href:f.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem${g?" sidebarItemActive":""}`,children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)})]})},f.href)})})]})}d()}catch(a){d(a)}})},94487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PE:()=>r,Vr:()=>p,x_:()=>o});var e=c(8732),f=c(82015),g=c(57312),h=c(60056),i=c(4823),j=c(93065),k=c(34924),l=c(13484),m=c(54506),n=a([g,j,k]);[g,j,k]=n.then?(await n)():n;let s=(0,f.createContext)(null);function o(){let a=(0,f.useContext)(s);if(!a)throw Error("useAppLocale must be used inside Layout");return a}function p(a){let{messages:b}=o();return(0,f.useCallback)(c=>(function(a,b){let c=b.split(".").reduce((a,b)=>{if(a&&"object"==typeof a&&b in a)return a[b]},a);return"string"==typeof c?c:b})(b,a?`${a}.${c}`:c),[b,a])}let t={"zh-CN":l,"en-US":m};function q({children:a}){let{resolvedTheme:b}=(0,g.useTheme)(),[c,d]=(0,f.useState)(!1),[l,m]=(0,f.useState)("zh-CN"),n="dark"===b,o=t[l]??t["zh-CN"],p=(0,f.useCallback)(a=>{document.cookie=`NEXT_LOCALE=${a};path=/;max-age=31536000;samesite=lax`,m(a)},[]),q=(0,f.useMemo)(()=>({locale:l,setLocale:p,messages:o}),[l,p,o]),r=(0,f.useMemo)(()=>(0,i.D)(n),[n]);return c?(0,e.jsx)(s.Provider,{value:q,children:(0,e.jsx)(h.sG,{theme:r,children:(0,e.jsxs)(h.qw,{children:[(0,e.jsx)(j.B,{}),(0,e.jsxs)("div",{className:"mainContent",children:[(0,e.jsx)(k.Y,{}),(0,e.jsx)("main",{className:"mainInner",children:a})]})]})})}):(0,e.jsx)("div",{className:"appShellPlaceholder"})}function r({children:a}){return(0,e.jsx)(g.ThemeProvider,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,children:(0,e.jsx)(q,{children:a})})}d()}catch(a){d(a)}})},97237:()=>{}};
1
+ exports.id=8204,exports.ids=[8204],exports.modules={4823:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(60056);function e(a){return{algorithm:a?d.w4.darkAlgorithm:d.w4.defaultAlgorithm,token:{colorPrimary:a?"#0a84ff":"#007aff",colorInfo:a?"#0a84ff":"#007aff",colorSuccess:a?"#30d158":"#34c759",colorWarning:a?"#ff9f0a":"#ff9500",colorError:a?"#ff453a":"#ff3b30",colorBgBase:a?"#1c1c1e":"#f5f5f7",colorBgContainer:a?"rgba(44,44,46,0.78)":"rgba(255,255,255,0.78)",colorBgElevated:a?"rgba(44,44,46,0.92)":"rgba(255,255,255,0.94)",colorBorder:a?"rgba(255,255,255,0.12)":"rgba(60,60,67,0.16)",colorText:a?"#f5f5f7":"#1d1d1f",colorTextSecondary:a?"#98989d":"#6e6e73",fontFamily:"var(--fontSans)",fontSize:14,borderRadius:14,borderRadiusLG:20,borderRadiusSM:10,controlHeight:36,lineWidth:1,boxShadow:a?"0 8px 24px rgba(0,0,0,0.24)":"0 8px 24px rgba(0,0,0,0.06)",boxShadowSecondary:a?"0 4px 12px rgba(0,0,0,0.2)":"0 4px 12px rgba(0,0,0,0.04)",motionDurationMid:"0.2s",motionEaseInOut:"cubic-bezier(0.25, 0.1, 0.25, 1)"},components:{Card:{borderRadiusLG:20,paddingLG:24,headerFontSize:13,headerFontSizeSM:12},Button:{borderRadius:14,borderRadiusLG:18,borderRadiusSM:10,fontWeight:600,primaryShadow:"var(--shadowButton)"},Input:{borderRadius:14,controlHeight:36,activeShadow:"0 0 0 3px rgba(0,122,255,0.12)"},Select:{borderRadius:14},Modal:{borderRadiusLG:20,titleFontSize:17,fontWeightStrong:700},Tag:{borderRadiusSM:100,defaultBg:a?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.04)"},Table:{borderRadiusLG:20,headerBg:a?"rgba(255,255,255,0.04)":"rgba(0,0,0,0.02)",headerColor:"var(--colorTextSecondary)",headerSplitColor:"transparent",headerBorderRadius:12},Spin:{dotSize:28,dotSizeLG:40},Upload:{borderRadiusLG:20}}}}},8204:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>h});var e=c(8732),f=c(94487);c(66285),c(97237);var g=a([f]);function h({Component:a,pageProps:b}){return(0,e.jsx)(f.PE,{children:(0,e.jsx)(a,{...b})})}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},13484:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"管理控制台"},"nav":{"overview":"总览","knowledge":"知识库","knowledgeManage":"知识库管理","fileManagement":"文件管理","knowledgeSearch":"知识库搜索","documents":"生成编辑","documentRoles":"角色配置","documentSpecs":"文档规范包","guide":"学习说明","models":"模型配置","settings":"设置","contextEngineering":"上下文工程","longTermContext":"长期上下文","shortTermContext":"短期上下文","promptManagement":"提示词管理"},"overview":{"title":"系统总览","description":"查看 Customize Agent 运行状态与关键指标","status":"服务状态","statusRunning":"运行中","statusError":"异常","knowledgeBase":"知识库","modelConfig":"模型配置","filesCount":"文件总数","chunksCount":"分块总数","storageSize":"存储空间","providersCount":"已配置模型","quickActions":"快捷操作","goToKnowledge":"管理知识库","goToModels":"配置模型","goToSettings":"系统设置","cores":"核","memory":"内存","tokensUsed":"累计 Tokens","tasksTotal":"总任务数","successRate":"成功率","topModel":"调用最多模型","taskTypes":"任务类型","calls":"次调用"},"knowledge":{"title":"知识库管理","description":"管理本地文件和知识库索引","manageTitle":"知识库管理","manageDesc":"查看知识库统计、分类和功能状态","stats":"统计概览","files":"文件管理","settings":"知识库设置","totalFiles":"文件总数","totalChunks":"分块总数","totalSize":"存储大小","lastIndexed":"上次索引","categories":"文件分类","fileCount":"文件数量","search":"搜索文件","searchPlaceholder":"输入文件名或内容关键词...","filterCategory":"筛选分类","allCategories":"全部类型","upload":"上传文件","uploadHint":"点击或拖拽上传 (PDF, Word, Excel, 图片, 代码等)","uploading":"上传中...","reindex":"重新索引","reindexing":"正在重新索引...","delete":"删除","deleteConfirm":"确定要删除该文件吗?此操作不可恢复。","fileList":"文件列表","fileName":"文件名","fileSize":"大小","fileCategory":"分类","fileDate":"修改日期","noFiles":"暂无文件,请上传文件开始使用","loadError":"加载文件列表失败","emptySearch":"未找到匹配的文件","ignoreRules":"忽略规则","ignoreHint":"每行一个 glob 模式,匹配的文件将被跳过","saveIgnore":"保存规则","duplicates":"重复文件","noDuplicates":"未发现重复文件","duplicatesFound":"发现 {count} 组重复文件","features":"功能状态","featureName":"功能","featureDesc":"说明","featureValue":"实现","featureVectorStoreDesc":"向量数据库,存储文档向量索引","featureEmbeddingDesc":"文本嵌入模型,将文本转换为向量","featureDedup":"去重引擎","featureDedupDesc":"检测并移除重复/相似文档","featureChunker":"分块器","featureChunkerDesc":"将文档拆分为可检索的语义块","globalSearch":"全局搜索","projectSearch":"项目搜索","autoIndex":"自动索引","enabled":"已启用","disabled":"已禁用"},"models":{"title":"模型配置","description":"管理 LLM 模型与层级分配","modelList":"Model 列表","addModel":"添加模型","editModel":"编辑模型","providerName":"Provider 名称","modelName":"模型名称","apiKey":"API Key","baseUrl":"Base URL","protocol":"请求协议","testConnection":"测试连接","testing":"测试中...","connected":"已连接","connectionFailed":"连接失败","noProviders":"暂无模型,请添加一个","modelTiers":"模型层级分配","tierReader":"Reader(只读)","tierReaderDesc":"处理低风险、只读和成本敏感任务,例如读取文件、检索知识库、搜索文本、整理上下文。建议选择速度快、价格低、长上下文能力稳定的模型。","tierReasoning":"Reasoning(推理)","tierReasoningDesc":"处理需要深入分析、规划、代码理解和多步骤推理的任务。建议选择推理能力强、稳定性高的模型,必要时可使用更高阶模型。","tierAction":"Action(操作)","tierActionDesc":"处理会产生副作用的任务,例如写文件、修改代码、执行命令、调用外部工具。建议选择可靠、遵循指令能力强且经过验证的模型。","activeModel":"当前模型","deleteProvider":"删除","deleteProviderConfirm":"确定要删除此模型及其所有配置吗?","modelNamePlaceholder":"例如: gpt-4o / deepseek-chat","selectModelPlaceholder":"暂不配置","apiKeyEditHint":"已配置的 Key 会以掩码回显,聚焦后可输入新 Key;掩码不可复制,留空或保持掩码则不修改。","apiKeyEditPlaceholder":"输入新的 API Key,留空保持不变","embeddingConfig":"Embedding 配置","embeddingProvider":"Embedding Provider","embeddingProviderHash":"本地 Hash Embedding","embeddingProviderOpenAI":"OpenAI 兼容 Embedding","embeddingHint":"Embedding 用于知识库向量检索。修改 Embedding 模型或维度后,建议到知识库页面重新索引。","model":"Model","dimensions":"Dimensions","status":"状态","localHash":"本地 Hash","openAICompatible":"OpenAI 兼容","saveEmbedding":"保存 Embedding 配置","testEmbedding":"测试 Embedding","embeddingApiKeyHint":"留空或保持掩码表示不修改密钥","optional":"可选","save":"保存","cancel":"取消"},"context":{"title":"上下文工程管理","longTermDesc":"来自记忆库的持久化上下文(跨会话保留)","shortTermDesc":"来自最近会话日志的短期上下文","longTermSource":"数据来源: ~/.customize-agent/memory.db(记忆库)","shortTermSource":"数据来源: ~/.customize-agent/logs/(会话日志)","importance":"重要性","content":"内容","tags":"标签","source":"来源","sourceHint":"可选,额外的来源/上下文说明","updatedAt":"更新时间"},"prompt":{"title":"提示词管理","description":"管理各项目的 CUSTOMIZE.md 系统提示词文件","filePath":"文件路径","lastModified":"最后修改","hasFile":"已配置","noFile":"未配置","noProjects":"暂无项目,请先初始化 Customize Agent 项目"},"documents":{"title":"生成编辑","description":"基于模板库和本地知识库生成、编辑、校验业务文档","templateLibrary":"模板库","workflow":"模板工作流","template":"模板","selected":"已选择","boundPrompts":"绑定提示词","boundFiles":"绑定知识库文件","boundPromptsRequired":"请选择提示词","boundFilesRequired":"请选择知识库文件","promptRole":"提示词角色","fileRole":"文件角色","manageRoles":"管理角色","roleEditor":"角色编辑器","roleType":"角色类型","roleName":"角色名称","roleDescription":"角色说明","addPromptBinding":"添加提示词绑定","addFileBinding":"添加文件绑定","structuredFacts":"结构化事实","exportGate":"导出门禁","executionStages":"执行阶段","executionStatus":"执行状态","flowPrepare":"准备配置","flowPrepareDesc":"读取模板、项目角色配置、文件角色和提示词角色","flowPrepareDone":"配置读取完成","flowFactExtraction":"事实抽取","flowFactExtractionDesc":"按文件处理类型抽取 JSON 事实和表格结构","flowChapterGeneration":"章节生成","flowChapterGenerationDesc":"基于证据、事实和提示词生成章节草稿","flowValidation":"严格校验","flowValidationDesc":"检查事实完整性、来源追踪和章节证据","flowFormatting":"正式排版","flowFormattingDesc":"生成封面、目录、分页和正式文档结构","flowDone":"生成完成","flowDoneDesc":"流程完成,可进入编辑和导出","flowGateFailed":"生成完成,但导出门禁未通过,请检查校验结果","projectRoleConfig":"项目角色配置","documentSpec":"文档规范包","documentSpecPlaceholder":"请选择文档规范包","exportDocx":"导出 Word","projectRoleConfigRequired":"请选择项目角色配置","noRoleConfig":"未绑定项目角色配置","evidenceLimit":"每章证据数","requirement":"生成要求","requirementPlaceholder":"例如:根据上传的招标文件、图纸和清单,生成一份施工组织设计草稿。","generate":"开始生成","editor":"生成 / 编辑器","edit":"编辑","chapters":"章节","sources":"资料来源","missingItems":"缺失项","validation":"校验","evidenceCount":"证据数量","missingCount":"缺失事实","downloadMarkdown":"下载 Markdown","exportHtml":"导出 HTML","exportPdf":"导出 PDF","saveDraft":"保存草稿","draftHistory":"草稿历史","regenerateChapter":"重新生成本章","newTemplate":"新建模板","templateEditor":"模板编辑器","templateName":"模板名称","templateCategory":"模板分类","templateDescription":"模板说明","outputTitle":"输出标题","chapter":"章节","chapterTitle":"章节标题","chapterPurpose":"章节用途","chapterQueries":"检索 Query","requiredFacts":"必需事实","addChapter":"添加章节","builtIn":"内置","deleteTemplateConfirm":"确定删除该模板吗?","noDraft":"请选择模板并生成草稿"},"specs":{"title":"文档规范包","description":"配置事实字段、章节要求、强门禁规则和 Word 模板,让不同公司和项目可以自定义生产级约束。","newSpec":"新建规范包","list":"规范包列表","editor":"规范包编辑器","name":"规范包名称","specDescription":"规范包说明","wordTemplatePath":"Word 模板路径","facts":"事实字段","chapters":"章节规则","gates":"门禁规则","factName":"字段名称","factType":"字段类型","required":"必填/必需","sourceRoles":"来源文件角色","extractionHint":"抽取说明","validationHint":"校验说明","addFact":"添加事实字段","chapterTitle":"章节标题","order":"顺序","minWords":"最低字数","requiredFacts":"必需事实","requiredFileRoles":"必需文件角色","requiredPromptRoles":"必需提示词角色","generationHint":"生成说明","addChapter":"添加章节规则","gateName":"门禁名称","addGate":"添加门禁规则","plainGuideTitle":"大白话说明:文档规范包是干什么的?","plainGuideDesc":"文档规范包不是固定模板,而是一组可配置的生产规则:事实字段=这份文档必须知道哪些信息;章节规则=必须有哪些章节、最低写多少、需要哪些事实;门禁规则=导出前必须检查什么;Word 模板路径=导出 Word 时套用哪个企业模板。不同公司、不同项目可以复制一份规范包再微调。"},"guide":{"title":"学习说明:如何跑通文档生成全流程","description":"本页面用于指导用户从模型配置、知识库、提示词、角色配置、模板创建、生成、校验到导出的完整操作流程。建议第一次使用时按顺序完成每一步。","fullFlow":"全流程步骤","stepModel":"1. 配置模型","stepModelDesc":"进入模型配置页面,添加可用的大模型供应商和模型,并设置当前启用模型。LLM JSON 事实抽取会优先使用已启用模型;如果模型不可用,系统会回退到本地确定性抽取。","stepKnowledge":"2. 上传知识库文件","stepKnowledgeDesc":"进入知识库页面上传招标文件、工程说明、表格数据、图纸说明、规范文件等资料。上传后等待索引完成,确保文件能在知识库文件列表中看到。","stepPrompt":"3. 创建提示词","stepPromptDesc":"进入提示词页面创建事实抽取、章节生成、校验、格式化等提示词。提示词应明确输出要求、禁止编造、引用来源和格式规范。","stepRole":"4. 配置角色和项目角色配置","stepRoleDesc":"进入角色配置页面,创建文件角色并绑定知识库文件,创建提示词角色并绑定提示词,再创建项目角色配置,对文件角色和提示词角色排序。","stepTemplate":"5. 创建模板","stepTemplateDesc":"进入生成编辑页面,新建模板,填写名称、分类、输出标题,并绑定一个项目角色配置。模板不直接绑定文件和提示词,只绑定项目角色配置。","stepGenerate":"6. 执行生成","stepGenerateDesc":"点击生成后,执行状态 Card 会展示准备配置、事实抽取、章节生成、严格校验、正式排版和完成状态,方便用户感知当前进度。","stepReview":"7. 审查结果","stepReviewDesc":"生成后检查编辑器、章节、结构化事实、来源、缺失项、严格校验、导出门禁和执行阶段。校验错误需要先处理再导出正式 PDF。","stepExport":"8. 导出文件","stepExportDesc":"可以导出 Markdown、HTML、PDF。PDF 会启用导出门禁,门禁未通过时系统会阻止导出,避免未经校验的文档流出。","roleDesign":"角色设计说明","roleDesignDesc":"角色用于把用户自定义名称和系统可执行能力连接起来。用户可以完全自定义角色名称,但必须选择执行类型或处理类型,让系统知道如何使用它。","fileRole":"文件角色","fileRoleDesc":"文件角色绑定知识库文件,并选择处理类型,例如规则文件、项目事实文件、表格数据、图纸文件、规范文件或参考资料。","promptRole":"提示词角色","promptRoleDesc":"提示词角色绑定提示词,并选择执行类型,例如事实抽取、章节生成、校验、格式化或参考。","projectConfig":"项目角色配置","projectConfigDesc":"项目角色配置把多个文件角色和提示词角色组合起来,并定义执行顺序。模板只需要绑定项目角色配置。","generationEngine":"生成引擎说明","generationEngineDesc":"生成引擎会按角色配置组织资料和提示词,执行事实抽取、表格解析、章节生成、严格校验和正式排版。","prepareTitle":"准备资料时要注意什么?","prepareContent":"建议至少准备项目事实文件、规则文件和生成提示词。表格类资料应尽量使用清晰表头,图纸资料建议配套图纸目录或说明文件。","rolesTitle":"角色应该怎么命名?","rolesContent":"角色名称建议使用业务语义,例如“招标文件事实源”“劳动力计划表”“施工组织设计章节生成提示词”。系统不依赖名称判断能力,而是依赖处理类型和执行类型。","templateTitle":"模板应该怎么创建?","templateContent":"模板用于定义输出文档类型和标题,绑定项目角色配置即可。不同项目可以复用同一模板,但应创建不同的项目角色配置来绑定不同资料。","generateTitle":"生成过程中怎么看进度?","generateContent":"生成页会显示执行状态 Card。当前步骤会高亮,成功后变为完成;如果失败会显示错误。生成完成后,下方执行阶段会展示后端真实阶段结果。","qaTitle":"怎样判断能否正式导出?","qaContent":"重点查看导出门禁。只有无阻断级错误、基础事实齐全、事实具备来源、章节有证据且没有资料未提供章节时,才建议导出 PDF。"},"roles":{"title":"角色配置","description":"创建文件角色、提示词角色,并组合成可排序的项目角色配置供模板绑定使用","newFileRole":"新建文件角色","newPromptRole":"新建提示词角色","newConfig":"新建项目配置","fileRoles":"文件角色","promptRoles":"提示词角色","configs":"项目角色配置","roleEditor":"角色编辑器","configEditor":"项目角色配置编辑器","roleType":"角色类型","fileRole":"文件角色","promptRole":"提示词角色","roleName":"角色名称","roleDescription":"角色说明","bindFile":"绑定知识库文件","bindPrompt":"绑定提示词","executionType":"执行类型","processingType":"处理类型","factExtraction":"事实抽取","chapterGeneration":"章节生成","validation":"校验","formatting":"格式化","reference":"参考","ruleFile":"规则文件","projectFactFile":"项目事实文件","tableFile":"表格数据","drawingFile":"图纸文件","specificationFile":"规范文件","configName":"配置名称","configDescription":"配置说明","addRole":"添加角色","plainGuideTitle":"大白话说明:文件角色和提示词角色到底是什么?","plainGuideDesc":"文件角色就是给资料贴用途标签:规则文件=告诉系统必须遵守什么;项目事实文件=告诉系统项目真实信息;表格数据=清单、计划、数据表;图纸文件=图纸目录和设计说明;规范文件=国家/行业/企业标准;参考资料=可参考但不是强事实。提示词角色就是给提示词贴执行标签:事实抽取=先把资料变成事实;章节生成=写正文;校验=找问题;格式化=整理成正式文档。一个角色可以绑定多个文件或多个提示词,适合一个用途对应多份资料的情况。","executionTypeHelp":"大白话:这条提示词在哪个阶段用。事实抽取负责找资料里的真信息;章节生成负责写正文;校验负责挑错;格式化负责整理版式;参考只作为辅助说明。","processingTypeHelp":"大白话:这个文件在生成里扮演什么角色。规则文件是要求和评分规则;项目事实文件是真实项目资料;表格数据是 Excel/CSV/清单;图纸文件是图纸目录和设计说明;规范文件是标准规范;参考资料只做辅助参考。","multiBindFileHelp":"可以多选。比如“项目事实文件”可以同时绑定招标文件、合同摘要、项目概况。少量明确资料建议单绑;同一用途多份资料建议多绑。","multiBindPromptHelp":"可以多选。比如“章节生成”可以同时绑定通用写作要求、公司风格要求、甲方特殊要求。系统会按项目角色配置中的角色顺序使用。"},"settings":{"title":"系统设置","description":"管理语言、主题等偏好","language":"语言","languageDesc":"界面显示语言","theme":"主题","themeDesc":"浅色 / 深色模式","light":"浅色","dark":"深色","system":"跟随系统","about":"关于","version":"版本","port":"服务端口"},"common":{"save":"保存","cancel":"取消","confirm":"确认","delete":"删除","edit":"编辑","add":"添加","search":"搜索","loading":"加载中...","error":"出错了","success":"操作成功","retry":"重试","close":"关闭","back":"返回","more":"更多","noData":"暂无数据","bytes":"字节","kb":"KB","mb":"MB","gb":"GB","unknown":"未知","never":"从未"}}')},34924:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Y:()=>j});var e=c(8732),f=c(57312),g=c(94487),h=c(68329),i=a([f,g]);function j(){let{resolvedTheme:a,setTheme:b}=(0,f.useTheme)(),{locale:c,setLocale:d}=(0,g.x_)(),i=(0,g.Vr)("settings"),j="dark"===a;return(0,e.jsxs)("header",{className:"topbar",children:[(0,e.jsx)("div",{className:"flex-1"}),(0,e.jsxs)("button",{onClick:()=>b(j?"light":"dark"),className:"topbarBtn",children:[j?(0,e.jsx)(h.bd5,{size:14}):(0,e.jsx)(h.AX$,{size:14}),(0,e.jsx)("span",{children:i(j?"light":"dark")})]}),(0,e.jsxs)("button",{onClick:()=>{d("zh-CN"===c?"en-US":"zh-CN")},className:"topbarBtn",children:[(0,e.jsx)(h.ATU,{size:14}),(0,e.jsx)("span",{children:"zh-CN"===c?"English":"中文"})]})]})}[f,g]=i.then?(await i)():i,d()}catch(a){d(a)}})},54506:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"Admin Console"},"nav":{"overview":"Overview","knowledge":"Knowledge Base","knowledgeManage":"KB Management","fileManagement":"File Management","knowledgeSearch":"KB Search","documents":"Generate & Edit","documentRoles":"Role Config","documentSpecs":"Document Specs","guide":"Guide","models":"Model Config","settings":"Settings","contextEngineering":"Context Engineering","longTermContext":"Long-term Context","shortTermContext":"Short-term Context","promptManagement":"Prompt Management"},"overview":{"title":"System Overview","description":"Monitor Customize Agent status and key metrics","status":"Service Status","statusRunning":"Running","statusError":"Error","knowledgeBase":"Knowledge Base","modelConfig":"Model Config","filesCount":"Total Files","chunksCount":"Total Chunks","storageSize":"Storage Size","providersCount":"Models","quickActions":"Quick Actions","goToKnowledge":"Manage Knowledge Base","goToModels":"Configure Models","goToSettings":"System Settings","cores":"cores","memory":"Memory","tokensUsed":"Total Tokens","tasksTotal":"Total Tasks","successRate":"Success Rate","topModel":"Most Used Model","taskTypes":"Task Types","calls":"calls"},"knowledge":{"title":"Knowledge Base","description":"Manage local files and knowledge base index","manageTitle":"KB Management","manageDesc":"View knowledge base statistics, categories, and features","stats":"Statistics","files":"File Management","settings":"KB Settings","totalFiles":"Total Files","totalChunks":"Total Chunks","totalSize":"Total Size","lastIndexed":"Last Indexed","categories":"File Categories","fileCount":"File Count","search":"Search Files","searchPlaceholder":"Search by filename or content...","filterCategory":"Filter Category","allCategories":"All Types","upload":"Upload File","uploadHint":"Click or drag to upload (PDF, Word, Excel, images, code, etc.)","uploading":"Uploading...","reindex":"Reindex","reindexing":"Reindexing...","delete":"Delete","deleteConfirm":"Are you sure you want to delete this file? This action cannot be undone.","fileList":"File List","fileName":"File Name","fileSize":"Size","fileCategory":"Category","fileDate":"Modified","noFiles":"No files yet. Upload files to get started.","loadError":"Failed to load file list","emptySearch":"No matching files found","ignoreRules":"Ignore Rules","ignoreHint":"One glob pattern per line. Matching files will be skipped.","saveIgnore":"Save Rules","duplicates":"Duplicate Files","noDuplicates":"No duplicate files found","duplicatesFound":"Found {count} duplicate groups","features":"Feature Status","featureName":"Feature","featureDesc":"Description","featureValue":"Implementation","featureVectorStoreDesc":"Vector database for storing document embeddings","featureEmbeddingDesc":"Text embedding model for converting text to vectors","featureDedup":"Dedup Engine","featureDedupDesc":"Detects and removes duplicate/similar documents","featureChunker":"Chunker","featureChunkerDesc":"Splits documents into retrievable semantic chunks","globalSearch":"Global Search","projectSearch":"Project Search","autoIndex":"Auto Index","enabled":"Enabled","disabled":"Disabled"},"models":{"title":"Model Configuration","description":"Manage LLM models and tier assignments","modelList":"Model List","addModel":"Add Model","editModel":"Edit Model","providerName":"Provider Name","modelName":"Model Name","apiKey":"API Key","baseUrl":"Base URL","protocol":"Protocol","testConnection":"Test Connection","testing":"Testing...","connected":"Connected","connectionFailed":"Connection Failed","noProviders":"No models yet. Add one to get started.","modelTiers":"Model Tier Assignment","tierReader":"Reader (Read-only)","tierReaderDesc":"Handles low-risk, read-only, and cost-sensitive work such as reading files, searching the knowledge base, text search, and context organization. Prefer fast, inexpensive models with stable long-context support.","tierReasoning":"Reasoning (Analysis)","tierReasoningDesc":"Handles deeper analysis, planning, code understanding, and multi-step reasoning. Prefer models with stronger reasoning quality and reliability.","tierAction":"Action (Write/Execute)","tierActionDesc":"Handles side-effect operations such as writing files, changing code, running commands, and calling external tools. Prefer reliable models with strong instruction-following and verified behavior.","activeModel":"Active Model","deleteProvider":"Delete","deleteProviderConfirm":"Are you sure you want to delete this model and all its configs?","modelNamePlaceholder":"e.g. gpt-4o / deepseek-chat","selectModelPlaceholder":"No model selected","apiKeyEditHint":"Configured keys are shown as a masked value. Focus the field to enter a new key; the mask cannot be copied. Leave empty or keep the mask to avoid changes.","apiKeyEditPlaceholder":"Enter a new API key, or leave empty to keep current","embeddingConfig":"Embedding Configuration","embeddingProvider":"Embedding Provider","embeddingProviderHash":"Local Hash Embedding","embeddingProviderOpenAI":"OpenAI-compatible Embedding","embeddingHint":"Embedding is used for knowledge base vector retrieval. After changing the embedding model or dimensions, reindex the knowledge base.","model":"Model","dimensions":"Dimensions","status":"Status","localHash":"Local Hash","openAICompatible":"OpenAI-compatible","saveEmbedding":"Save Embedding Config","testEmbedding":"Test Embedding","embeddingApiKeyHint":"Leave empty or keep the masked value to avoid changing the key","optional":"Optional","save":"Save","cancel":"Cancel"},"context":{"title":"Context Engineering","longTermDesc":"Persistent context from memory store (cross-session)","shortTermDesc":"Short-term context from recent session logs","longTermSource":"Source: ~/.customize-agent/memory.db (Memory Store)","shortTermSource":"Source: ~/.customize-agent/logs/ (Session Logs)","importance":"Importance","content":"Content","tags":"Tags","source":"Source","sourceHint":"Optional additional source/context description","updatedAt":"Updated"},"prompt":{"title":"Prompt Management","description":"Manage CUSTOMIZE.md system prompt files per project","filePath":"File Path","lastModified":"Last Modified","hasFile":"Configured","noFile":"Not Configured","noProjects":"No projects found. Initialize a Customize Agent project first."},"documents":{"title":"Generate & Edit","description":"Generate, edit, and validate business documents from templates and the local knowledge base","templateLibrary":"Template Library","workflow":"Template Workflow","template":"Template","selected":"Selected","boundPrompts":"Bound Prompts","boundFiles":"Bound Knowledge Files","boundPromptsRequired":"Select prompts","boundFilesRequired":"Select knowledge files","promptRole":"Prompt Role","fileRole":"File Role","manageRoles":"Manage Roles","roleEditor":"Role Editor","roleType":"Role Type","roleName":"Role Name","roleDescription":"Role Description","addPromptBinding":"Add Prompt Binding","addFileBinding":"Add File Binding","structuredFacts":"Structured Facts","exportGate":"Export Gate","executionStages":"Execution Stages","executionStatus":"Execution Status","flowPrepare":"Prepare Config","flowPrepareDesc":"Load template, project role config, file roles, and prompt roles","flowPrepareDone":"Config loaded","flowFactExtraction":"Fact Extraction","flowFactExtractionDesc":"Extract JSON facts and table structures by file processing type","flowChapterGeneration":"Chapter Generation","flowChapterGenerationDesc":"Generate chapter drafts from evidence, facts, and prompts","flowValidation":"Strict Validation","flowValidationDesc":"Check fact completeness, source traceability, and chapter evidence","flowFormatting":"Formal Formatting","flowFormattingDesc":"Generate cover, table of contents, page breaks, and formal document structure","flowDone":"Completed","flowDoneDesc":"Generation completed; ready for editing and export","flowGateFailed":"Generation completed, but export gate failed. Check validation results","projectRoleConfig":"Project Role Config","documentSpec":"Document Spec Package","documentSpecPlaceholder":"Select a document spec package","exportDocx":"Export Word","projectRoleConfigRequired":"Select a project role config","noRoleConfig":"No project role config bound","evidenceLimit":"Evidence per Chapter","requirement":"Generation Requirement","requirementPlaceholder":"Example: Generate a construction organization design draft from uploaded tender files, drawings, and BOQ sheets.","generate":"Generate","editor":"Generate / Editor","edit":"Edit","chapters":"Chapters","sources":"Sources","missingItems":"Missing Items","validation":"Validation","evidenceCount":"Evidence Count","missingCount":"Missing Facts","downloadMarkdown":"Download Markdown","exportHtml":"Export HTML","exportPdf":"Export PDF","saveDraft":"Save Draft","draftHistory":"Draft History","regenerateChapter":"Regenerate Chapter","newTemplate":"New Template","templateEditor":"Template Editor","templateName":"Template Name","templateCategory":"Template Category","templateDescription":"Template Description","outputTitle":"Output Title","chapter":"Chapter","chapterTitle":"Chapter Title","chapterPurpose":"Chapter Purpose","chapterQueries":"Search Queries","requiredFacts":"Required Facts","addChapter":"Add Chapter","builtIn":"Built-in","deleteTemplateConfirm":"Delete this template?","noDraft":"Select a template and generate a draft"},"specs":{"title":"Document Spec Packages","description":"Configure fact fields, chapter rules, export gates, and Word templates for company/project-specific production constraints.","newSpec":"New Spec","list":"Spec List","editor":"Spec Editor","name":"Spec Name","specDescription":"Description","wordTemplatePath":"Word Template Path","facts":"Fact Fields","chapters":"Chapter Rules","gates":"Gate Rules","factName":"Field Name","factType":"Field Type","required":"Required","sourceRoles":"Source File Roles","extractionHint":"Extraction Hint","validationHint":"Validation Hint","addFact":"Add Fact Field","chapterTitle":"Chapter Title","order":"Order","minWords":"Min Words","requiredFacts":"Required Facts","requiredFileRoles":"Required File Roles","requiredPromptRoles":"Required Prompt Roles","generationHint":"Generation Hint","addChapter":"Add Chapter Rule","gateName":"Gate Name","addGate":"Add Gate Rule","plainGuideTitle":"Plain explanation: what is a document spec package?","plainGuideDesc":"A document spec package is not a fixed template. It is a configurable production rule set: fact fields define what must be known, chapter rules define required chapters and constraints, gate rules define checks before export, and Word template path controls DOCX output. Companies and projects can copy and adjust packages."},"guide":{"title":"Guide: Run the Full Document Generation Flow","description":"This guide walks users through model setup, knowledge files, prompts, role configuration, template creation, generation, validation, and export.","fullFlow":"Full Flow","stepModel":"1. Configure Models","stepModelDesc":"Open Model Config, add providers and models, set an active model, and run health checks.","stepKnowledge":"2. Upload Knowledge Files","stepKnowledgeDesc":"Upload tender files, project descriptions, tables, drawings, specifications, and standards, then wait for indexing.","stepPrompt":"3. Create Prompts","stepPromptDesc":"Create prompts for fact extraction, chapter generation, validation, and formatting.","stepRole":"4. Configure Roles","stepRoleDesc":"Create file roles and prompt roles, bind resources, then create an ordered project role config.","stepTemplate":"5. Create Template","stepTemplateDesc":"Create a template in Generate & Edit and bind a project role config.","stepGenerate":"6. Generate","stepGenerateDesc":"Click Generate and observe the execution status card for progress.","stepReview":"7. Review","stepReviewDesc":"Review facts, sources, missing items, validation, export gate, and execution stages.","stepExport":"8. Export","stepExportDesc":"Export Markdown, HTML, or PDF. PDF export enforces the export gate.","roleDesign":"Role Design","roleDesignDesc":"Roles connect user-defined names to executable system behavior through execution or processing types.","fileRole":"File Role","fileRoleDesc":"A file role binds a knowledge file and declares its processing type.","promptRole":"Prompt Role","promptRoleDesc":"A prompt role binds a prompt and declares its execution type.","projectConfig":"Project Role Config","projectConfigDesc":"A project role config combines and orders file roles and prompt roles. Templates bind configs directly.","generationEngine":"Generation Engine","generationEngineDesc":"The engine organizes resources by roles and runs fact extraction, table parsing, generation, validation, and formatting.","prepareTitle":"How should I prepare files?","prepareContent":"Prepare project facts, rules, tables, drawings, and specifications. Make table headers clear and include drawing descriptions when possible.","rolesTitle":"How should roles be named?","rolesContent":"Use business names such as Tender Fact Source, Labor Plan Table, or Chapter Generation Prompt. System behavior depends on types, not names.","templateTitle":"How should templates be created?","templateContent":"Templates define document entry and output title. Bind a project role config instead of selecting files and prompts directly.","generateTitle":"How do I see progress?","generateContent":"The generation page shows an execution status card. The current step is highlighted and final backend stages appear after completion.","qaTitle":"How do I know whether export is allowed?","qaContent":"Check the export gate. PDF export should only proceed when there are no blocking errors and facts/sources/chapters are complete."},"roles":{"title":"Role Config","description":"Create file roles and prompt roles, then combine them into ordered project role configs for templates","newFileRole":"New File Role","newPromptRole":"New Prompt Role","newConfig":"New Project Config","fileRoles":"File Roles","promptRoles":"Prompt Roles","configs":"Project Role Configs","roleEditor":"Role Editor","configEditor":"Project Role Config Editor","roleType":"Role Type","fileRole":"File Role","promptRole":"Prompt Role","roleName":"Role Name","roleDescription":"Role Description","bindFile":"Bind Knowledge File","bindPrompt":"Bind Prompt","executionType":"Execution Type","processingType":"Processing Type","factExtraction":"Fact Extraction","chapterGeneration":"Chapter Generation","validation":"Validation","formatting":"Formatting","reference":"Reference","ruleFile":"Rule File","projectFactFile":"Project Fact File","tableFile":"Table Data","drawingFile":"Drawing File","specificationFile":"Specification File","configName":"Config Name","configDescription":"Config Description","addRole":"Add Role","plainGuideTitle":"Plain explanation: what are file roles and prompt roles?","plainGuideDesc":"File roles label what files are used for. Rule files define requirements; project fact files contain real project info; table data means spreadsheets; drawing files mean drawing catalogs/descriptions; specification files are standards; references are only supporting materials. Prompt roles label when prompts are used. A role can bind multiple files or prompts when one purpose needs multiple resources.","executionTypeHelp":"Which stage this prompt is used in: fact extraction, chapter generation, validation, formatting, or reference.","processingTypeHelp":"What this file does in generation: rules, facts, tables, drawings, specifications, or references.","multiBindFileHelp":"Multiple files are allowed when one purpose has multiple source files.","multiBindPromptHelp":"Multiple prompts are allowed when one stage needs multiple prompt rules."},"settings":{"title":"System Settings","description":"Manage language, theme, and other preferences","language":"Language","languageDesc":"Interface display language","theme":"Theme","themeDesc":"Light / Dark mode","light":"Light","dark":"Dark","system":"System","about":"About","version":"Version","port":"Service Port"},"common":{"save":"Save","cancel":"Cancel","confirm":"Confirm","delete":"Delete","edit":"Edit","add":"Add","search":"Search","loading":"Loading...","error":"Something went wrong","success":"Success","retry":"Retry","close":"Close","back":"Back","more":"More","noData":"No data","bytes":"bytes","kb":"KB","mb":"MB","gb":"GB","unknown":"Unknown","never":"Never"}}')},66285:()=>{},93065:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>m});var e=c(8732),f=c(82015),g=c(21202),h=c(9328),i=c.n(h),j=c(94487),k=c(68329),l=a([j]);j=(l.then?(await l)():l)[0];let n=[{href:"/overview",icon:k.HxJ,labelKey:"nav.overview"},{icon:k.WmV,labelKey:"nav.knowledge",children:[{href:"/knowledge/manage",icon:k.BmN,labelKey:"nav.knowledgeManage"},{href:"/knowledge/files",icon:k.iUU,labelKey:"nav.fileManagement"},{href:"/knowledge/search",icon:k.vji,labelKey:"nav.knowledgeSearch"}]},{icon:k.jy9,labelKey:"nav.contextEngineering",children:[{href:"/context/long-term",icon:k.WmV,labelKey:"nav.longTermContext"},{href:"/context/short-term",icon:k.WmV,labelKey:"nav.shortTermContext"}]},{href:"/documents",icon:k.sv7,labelKey:"nav.documents"},{href:"/document-roles",icon:k.wB_,labelKey:"nav.documentRoles"},{href:"/document-specs",icon:k.iUU,labelKey:"nav.documentSpecs"},{href:"/guide",icon:k.Gyj,labelKey:"nav.guide"},{href:"/models",icon:k.fX,labelKey:"nav.models"},{href:"/prompt",icon:k.vEG,labelKey:"nav.promptManagement"},{href:"/settings",icon:k.wB_,labelKey:"nav.settings"}];function m(){let a=(0,g.usePathname)(),b=(0,j.Vr)(),c=(0,f.useMemo)(()=>{let b={};for(let c of n)c.children?.some(b=>a===b.href||a.startsWith(b.href+"/"))&&(b[c.labelKey]=!0);return b},[a]),[d,h]=(0,f.useState)({}),[l,m]=(0,f.useState)(!1);return(0,e.jsxs)("aside",{className:`sidebar${l?" sidebarCollapsedSelf":""}`,children:[(0,e.jsx)(i(),{href:"/overview",prefetch:!1,children:(0,e.jsx)("div",{className:"sidebarLogo",children:(0,e.jsxs)("div",{children:[(0,e.jsx)("div",{className:"sidebarLogoTitle",children:(0,e.jsx)("span",{className:"logoGradient",children:b("app.title")})}),(0,e.jsx)("div",{className:"sidebarLogoSub",children:b("app.subtitle")})]})})}),(0,e.jsx)("button",{className:"sidebarCollapseBtn",onClick:()=>m(a=>!a),"aria-label":l?"展开侧边栏":"收起侧边栏",children:l?(0,e.jsx)(k.wdi,{size:16}):(0,e.jsx)(k.ues,{size:16})}),(0,e.jsx)("nav",{className:"sidebarNav",children:n.map(f=>{if(f.children){let g=d[f.labelKey]??c[f.labelKey]??!1;return(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"sidebarItem sidebarParent",onClick:()=>{var a;return a=f.labelKey,void h(b=>({...b,[a]:!b[a]}))},children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)}),(0,e.jsx)("span",{className:"sidebarChevron",children:g?(0,e.jsx)(k.yQN,{size:14}):(0,e.jsx)(k.c_$,{size:14})})]}),g&&!l&&(0,e.jsx)("div",{className:"sidebarSubmenu",children:f.children.map(c=>{let d=a===c.href||a.startsWith(c.href+"/");return(0,e.jsx)(i(),{href:c.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem sidebarSubItem${d?" sidebarItemActive":""}`,children:[(0,e.jsx)(c.icon,{size:16}),(0,e.jsx)("span",{children:b(c.labelKey)})]})},c.href)})})]},f.labelKey)}let g=a===f.href||a.startsWith(f.href+"/");return(0,e.jsx)(i(),{href:f.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem${g?" sidebarItemActive":""}`,children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)})]})},f.href)})})]})}d()}catch(a){d(a)}})},94487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PE:()=>r,Vr:()=>p,x_:()=>o});var e=c(8732),f=c(82015),g=c(57312),h=c(60056),i=c(4823),j=c(93065),k=c(34924),l=c(13484),m=c(54506),n=a([g,j,k]);[g,j,k]=n.then?(await n)():n;let s=(0,f.createContext)(null);function o(){let a=(0,f.useContext)(s);if(!a)throw Error("useAppLocale must be used inside Layout");return a}function p(a){let{messages:b}=o();return(0,f.useCallback)(c=>(function(a,b){let c=b.split(".").reduce((a,b)=>{if(a&&"object"==typeof a&&b in a)return a[b]},a);return"string"==typeof c?c:b})(b,a?`${a}.${c}`:c),[b,a])}let t={"zh-CN":l,"en-US":m};function q({children:a}){let{resolvedTheme:b}=(0,g.useTheme)(),[c,d]=(0,f.useState)(!1),[l,m]=(0,f.useState)("zh-CN"),n="dark"===b,o=t[l]??t["zh-CN"],p=(0,f.useCallback)(a=>{document.cookie=`NEXT_LOCALE=${a};path=/;max-age=31536000;samesite=lax`,m(a)},[]),q=(0,f.useMemo)(()=>({locale:l,setLocale:p,messages:o}),[l,p,o]),r=(0,f.useMemo)(()=>(0,i.D)(n),[n]);return c?(0,e.jsx)(s.Provider,{value:q,children:(0,e.jsx)(h.sG,{theme:r,children:(0,e.jsxs)(h.qw,{children:[(0,e.jsx)(j.B,{}),(0,e.jsxs)("div",{className:"mainContent",children:[(0,e.jsx)(k.Y,{}),(0,e.jsx)("main",{className:"mainInner",children:a})]})]})})}):(0,e.jsx)("div",{className:"appShellPlaceholder"})}function r({children:a}){return(0,e.jsx)(g.ThemeProvider,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,children:(0,e.jsx)(q,{children:a})})}d()}catch(a){d(a)}})},97237:()=>{}};