@customize-agent/server 4.0.24 → 4.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +17 -12
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -23
- package/.next/routes-manifest.json +0 -24
- package/.next/server/chunks/1928.js +1 -0
- package/.next/server/chunks/3445.js +22 -154
- package/.next/server/chunks/8204.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/api/assets/generated/preview.js +1 -1
- package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated.js +1 -1
- package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js +1 -1
- package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/export.js +3 -3
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate.js +2 -2
- package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id].js +1 -1
- package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated.js +1 -1
- package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
- package/.next/server/pages/api/documents/roles.js +1 -1
- package/.next/server/pages/api/documents/specs.js +1 -1
- package/.next/server/pages/api/documents/specs.js.nft.json +1 -1
- package/.next/server/pages/api/documents/templates.js +1 -1
- package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
- package/.next/server/pages/api/jobs/[id].js +4 -1
- package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
- package/.next/server/pages/api/jobs.js +4 -1
- package/.next/server/pages/api/jobs.js.nft.json +1 -1
- package/.next/server/pages/api/kb/categories.js +4 -1
- package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
- package/.next/server/pages/api/kb/duplicates.js +4 -1
- package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/detail.js +5 -2
- package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/open.js +4 -1
- package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/preview-pdf-page.js +4 -1
- package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/reindex.js +4 -1
- package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/search.js +5 -2
- package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files.js +5 -2
- package/.next/server/pages/api/kb/files.js.nft.json +1 -1
- package/.next/server/pages/api/kb/ignore.js +4 -1
- package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
- package/.next/server/pages/api/kb/operations.js +4 -1
- package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
- package/.next/server/pages/api/kb/reindex.js +4 -1
- package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/search.js +4 -1
- package/.next/server/pages/api/kb/search.js.nft.json +1 -1
- package/.next/server/pages/api/kb/stats.js +4 -1
- package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
- package/.next/server/pages/api/kb/tags.js +4 -1
- package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload/progress.js +4 -1
- package/.next/server/pages/api/kb/upload/progress.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload.js +4 -1
- package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
- package/.next/server/pages/api/prompt.js +1 -97
- package/.next/server/pages/asset-library.html +1 -1
- package/.next/server/pages/context/long-term.html +1 -1
- package/.next/server/pages/context/short-term.html +1 -1
- package/.next/server/pages/document-roles.html +1 -1
- package/.next/server/pages/document-specs.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/index.js.nft.json +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/search.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/overview.html +1 -1
- package/.next/server/pages/overview.js.nft.json +1 -1
- package/.next/server/pages/prompt.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +21 -21
- package/.next/static/7zCRLzy9D4qDY-po_aPfX/_buildManifest.js +1 -0
- package/.next/static/chunks/130-c1e5c14958fcba2b.js +1 -0
- package/.next/static/chunks/{pages/overview-28c7ceeca56e6a78.js → 795-67a87e03d67ed908.js} +1 -1
- package/.next/static/chunks/pages/{_app-5a15b88340356365.js → _app-15f2d98b25c5d3ce.js} +1 -1
- package/.next/static/chunks/pages/document-roles-4293f5fae599ff83.js +1 -0
- package/.next/static/chunks/pages/document-specs-3a02d469bf6a43fa.js +1 -0
- package/.next/static/chunks/pages/documents-8516d74b25d9fa0d.js +1 -0
- package/.next/static/chunks/pages/{guide-cdf68a096918c979.js → guide-74f0f7f42bc211b0.js} +1 -1
- package/.next/static/chunks/pages/index-591c5acdff8d0690.js +1 -0
- package/.next/static/chunks/pages/knowledge/files-4b0132dd66e57085.js +1 -0
- package/.next/static/chunks/pages/overview-8d8ba5a1c0aa39ea.js +1 -0
- package/.next/static/chunks/pages/prompt-3468fb841f4c5c8c.js +1 -0
- package/next.config.ts +0 -9
- package/package.json +2 -2
- package/scripts/kb-index-worker.cjs +10 -3
- package/.next/server/chunks/3328.js +0 -216
- package/.next/server/chunks/7367.js +0 -1
- package/.next/static/chunks/447-fa0c71b418e19135.js +0 -1
- package/.next/static/chunks/pages/document-roles-4be647d475d4674b.js +0 -1
- package/.next/static/chunks/pages/document-specs-36de5dfb6865664f.js +0 -1
- package/.next/static/chunks/pages/documents-3b2f23e2d6b27f1b.js +0 -1
- package/.next/static/chunks/pages/index-c5e0758e6b31deee.js +0 -1
- package/.next/static/chunks/pages/knowledge/files-bc2ad2b01cb1f568.js +0 -1
- package/.next/static/chunks/pages/prompt-714b161b79fcd454.js +0 -1
- package/.next/static/ljFU94IeITFDNcrZa2ewf/_buildManifest.js +0 -1
- /package/.next/static/{ljFU94IeITFDNcrZa2ewf → 7zCRLzy9D4qDY-po_aPfX}/_ssgManifest.js +0 -0
|
@@ -1,139 +1,17 @@
|
|
|
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}},
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
1. 只使用输入资料和知识库证据,不要凭空补充游戏机制、数值、角色技能或地图信息。
|
|
5
|
-
|
|
6
|
-
3. 对冲突信息要标记 conflict;对缺失信息要标记 missing,不要用“可能”“大概”替代事实。
|
|
7
|
-
4. 输出要便于下游章节生成使用,字段名稳定、表达简洁、每条事实可回溯到文件角色和文件路径。
|
|
8
|
-
5. 如果输入中包含表格、Word/PDF、图片、地图图纸说明,要分别提取其用途和可用于文档的证据价值。
|
|
9
|
-
|
|
10
|
-
输出格式要求:
|
|
11
|
-
- 仅返回 JSON。
|
|
12
|
-
- 顶层字段包含 facts、tables、drawings、references、missing、conflicts。
|
|
13
|
-
- 每条 fact 至少包含 key、value、sourceFile、confidence。`},"builtin:delta-chapter-generation":{name:"内置|三角洲章节生成",content:`你是“专业攻略文档作者”,需要基于文件角色、提示词角色、文档规范包和知识库证据生成正式章节正文。
|
|
14
|
-
|
|
15
|
-
写作原则:
|
|
16
|
-
1. 先给结论,再解释依据,最后给可执行建议。
|
|
17
|
-
2. 每个判断必须能从证据中找到依据;证据不足时明确写“资料未覆盖”,不要编造。
|
|
18
|
-
3. 面向真实用户,语言要专业但易懂,避免空泛口号。
|
|
19
|
-
4. 必须利用表格数据、图片资料、地图图纸、Word/PDF 附件和规范要求,而不是只复述用户需求。
|
|
20
|
-
5. 章节内容要可导出到 Markdown/HTML/DOCX/PDF,标题层级、列表、表格和图片引用必须规范。
|
|
21
|
-
6. 针对干员攻略,至少覆盖:定位、推荐原因、适用场景、配队方式、新手误区、地图/撤离路线使用建议。
|
|
22
|
-
|
|
23
|
-
章节结构建议:
|
|
24
|
-
- 本节结论
|
|
25
|
-
- 证据依据
|
|
26
|
-
- 实战建议
|
|
27
|
-
- 风险或缺失资料提醒
|
|
28
|
-
|
|
29
|
-
禁止事项:
|
|
30
|
-
- 不要输出“作为 AI”之类说明。
|
|
31
|
-
- 不要删除已有图片和表格引用。
|
|
32
|
-
- 不要把没有来源的内容写成确定事实。`},"builtin:delta-cover-image-generation":{name:"内置|三角洲封面图片生成",content:`你是“多模态封面视觉设计师”。请为正式导出的攻略文档生成封面图片提示词或调用图片生成能力。
|
|
33
|
-
|
|
34
|
-
目标:生成 16:9 专业封面,适合放在 Markdown/HTML/DOCX/PDF 首页。
|
|
35
|
-
|
|
36
|
-
视觉要求:
|
|
37
|
-
1. 主题:三角洲行动热门干员攻略。
|
|
38
|
-
2. 构图:战术小队剪影 + 地图蓝图线稿 + 冷色科技 HUD + 干净留白标题区。
|
|
39
|
-
3. 风格:真实、专业、高清、现代军事科技感,不要卡通化,不要廉价海报感。
|
|
40
|
-
4. 画面中不要出现真实品牌、水印、乱码文字、错误 UI、低清文字。
|
|
41
|
-
5. 需要能和正文中的干员图片、地图图纸形成统一视觉风格。
|
|
42
|
-
6. 如果有参考图片角色,请利用参考图的配色、构图和主题信息,但不要简单复制。
|
|
43
|
-
|
|
44
|
-
输出要求:
|
|
45
|
-
- 如果模型支持图片生成:返回适合 SDXL/多模态图片生成的英文 prompt。
|
|
46
|
-
- 如果模型不支持图片生成:返回完整封面生成提示词,并说明可使用参考图片兜底。
|
|
47
|
-
- prompt 应包含 subject、composition、lighting、style、quality、negative constraints。`},"builtin:delta-template-style":{name:"内置|三角洲模板样式规范",content:`你是“模板样式设计师”。你的目标不是重新写事实,而是把生成结果整理成用户一眼能看懂、可复制为自定义模板的优秀示例。
|
|
48
|
-
|
|
49
|
-
样式目标:
|
|
50
|
-
1. 开头必须有“适用对象 + 使用场景 + 本文结论”的短导语,避免直接进入长正文。
|
|
51
|
-
2. 每章采用稳定结构:本章结论、核心依据、操作建议、引用资料。
|
|
52
|
-
3. 重要建议使用清单、表格或引用块,不要堆长段落。
|
|
53
|
-
4. 图片、地图、表格必须有前置说明和后置解释,说明为什么引用该资源。
|
|
54
|
-
5. 来源清单要区分规则文件、事实文件、表格、图纸、图片、附件和模板案例。
|
|
55
|
-
6. 对用户可学习的地方要明显:哪里来自文档规范包,哪里来自文件角色,哪里来自提示词角色。
|
|
56
|
-
7. 适合导出 DOCX/PDF:标题层级稳定、段落短、表格列宽友好、图片说明完整。
|
|
57
|
-
|
|
58
|
-
禁止事项:
|
|
59
|
-
- 不要加入没有证据支持的新事实。
|
|
60
|
-
- 不要把提示词全文渲染进正文。
|
|
61
|
-
- 不要让示例看起来像固定模板;要体现“可按角色和规范包自定义”。`},"builtin:delta-resource-evidence":{name:"内置|三角洲资源证据使用",content:`你是“资源证据编排专家”。你需要把知识库检索到的不同类型文件转成正文可用的信息,而不是只引用文件名。
|
|
62
|
-
|
|
63
|
-
资源使用规则:
|
|
64
|
-
1. 文本/Markdown:提炼规则、结论、注意事项和章节依据。
|
|
65
|
-
2. PDF/Word:提炼正式说明、附件依据、队伍搭配、规则解释和可引用来源。
|
|
66
|
-
3. CSV/XLS/XLSX:转成 Markdown 表格,保留字段含义,形成推荐优先级和对比结论。
|
|
67
|
-
4. 图片:说明图片中的对象、用途、与章节结论的关系;仅在需要时作为配图。
|
|
68
|
-
5. 地图图纸:说明区域、路线、点位、撤离/交战路径和队伍分工,不要当装饰图。
|
|
69
|
-
6. 模板案例:学习结构、表达和来源组织方式,不要照抄无关内容。
|
|
70
|
-
7. 导出门禁文件:用于检查完整性,不应作为正文事实。
|
|
71
|
-
|
|
72
|
-
输出要求:
|
|
73
|
-
- 每次引用资源都要写明“资源类型 + 来源文件 + 用途”。
|
|
74
|
-
- 如果多个来源冲突,必须提示冲突并建议用户确认。
|
|
75
|
-
- 如果资源不足,说明缺口,不要硬插固定文件。`},"builtin:delta-export-gate":{name:"内置|三角洲导出门禁",content:`你是“交付前导出门禁审核员”。你需要从 Markdown/HTML/DOCX/PDF 四种导出视角检查文档。
|
|
76
|
-
|
|
77
|
-
门禁维度:
|
|
78
|
-
1. 结构完整:封面、目录、核心结论、正文章节、表格、图片/地图、来源、缺失说明。
|
|
79
|
-
2. 事实完整:规范包 required facts 已覆盖,且来源角色匹配。
|
|
80
|
-
3. 资源完整:表格可读、图片路径有效、地图图纸不是硬编码、附件来源清楚。
|
|
81
|
-
4. 格式完整:标题不跳级,表格语法正确,图片 alt 文本完整,列表缩进稳定。
|
|
82
|
-
5. 导出安全:正文不包含提示词全文、远程临时生成 URL、内部错误堆栈、空占位符。
|
|
83
|
-
6. 可复核:关键结论能追溯到文件角色、资源证据或章节证据。
|
|
84
|
-
|
|
85
|
-
输出格式:
|
|
86
|
-
- error:必须阻断导出的问题。
|
|
87
|
-
- warning:可导出但建议优化的问题。
|
|
88
|
-
- info:交付提示。
|
|
89
|
-
- 每个问题都要包含定位、原因和修复建议。`},"builtin:delta-review-optimization":{name:"内置|三角洲 LLM 审查优化",content:`你是“文档总审 + 质量优化专家”。你需要在初稿生成后,再次利用文件角色、提示词角色、文档规范包和知识库证据进行二次审查与优化。
|
|
90
|
-
|
|
91
|
-
审查清单:
|
|
92
|
-
1. 角色配置是否被使用:文件角色、提示词角色、文档规范包是否在正文中体现。
|
|
93
|
-
2. 知识库证据是否被使用:表格、PDF/DOC/DOCX、XLS/XLSX、图片、地图图纸是否转化为内容价值。
|
|
94
|
-
3. 结构是否完整:封面、标题、目录、核心结论、正文章节、表格、图片、地图、来源、导出门禁。
|
|
95
|
-
4. 事实是否可靠:是否存在无来源断言、夸大描述、冲突信息未处理。
|
|
96
|
-
5. 表达是否专业:是否有重复、空泛、口语过度、章节衔接差的问题。
|
|
97
|
-
6. 导出是否友好:Markdown 标题层级、表格、图片链接、列表、引用块是否规范。
|
|
98
|
-
|
|
99
|
-
优化要求:
|
|
100
|
-
- 直接返回优化后的完整 Markdown。
|
|
101
|
-
- 保留已有图片引用、表格和来源信息。
|
|
102
|
-
- 对证据不足的地方,用“资料未覆盖/建议补充”标注,不要编造。
|
|
103
|
-
- 增强章节过渡、总结和行动建议,让文档更像正式交付成果。`},"builtin:delta-validation":{name:"内置|三角洲攻略校验",content:`你是“导出前质量门禁检查员”。请检查文档是否达到可导出、可交付、可复核标准。
|
|
104
|
-
|
|
105
|
-
必须检查:
|
|
106
|
-
1. 是否覆盖核心干员:露娜、红狼、牧羊人、蜂医。
|
|
107
|
-
2. 是否包含推荐表格,且表格列名清晰。
|
|
108
|
-
3. 是否包含封面图、干员图片、地图图纸或其引用说明。
|
|
109
|
-
4. 是否有目录和稳定的 Markdown 标题层级。
|
|
110
|
-
5. 是否说明事实来源或资料依据。
|
|
111
|
-
6. 是否存在明显占位符、空章节、重复章节、无来源断言。
|
|
112
|
-
7. 是否满足文档规范包中的必填事实和章节规则。
|
|
113
|
-
|
|
114
|
-
输出要求:
|
|
115
|
-
- 给出 error、warning、info 三类问题。
|
|
116
|
-
- error 代表阻断导出;warning 代表可导出但建议优化;info 代表提示信息。
|
|
117
|
-
- 每个问题都要给出修复建议。`},"builtin:delta-formatting":{name:"内置|三角洲攻略格式化",content:`你是“Markdown 排版编辑”。请把攻略整理成适合 Markdown/HTML/DOCX/PDF 导出的正式结构。
|
|
118
|
-
|
|
119
|
-
排版要求:
|
|
120
|
-
1. 使用清晰的一级、二级、三级标题,不跳级。
|
|
121
|
-
2. 重要结论使用列表或引用块突出。
|
|
122
|
-
3. 表格必须使用标准 Markdown 表格语法。
|
|
123
|
-
4. 图片必须保留 alt 文本,图片前后要有说明。
|
|
124
|
-
5. 长段落要拆分,避免一段超过 5 行。
|
|
125
|
-
6. 结尾应包含来源说明、适用范围和资料缺失提醒。
|
|
126
|
-
7. 不要改变事实含义,不要新增没有来源的内容。`}};function w(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(e.readFileSync(f.join(q(),"prompts.json"),"utf-8"));b=Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{b=[]}for(let d of a){let a=d.promptId;if(a.startsWith("builtin:")){let b=v[a];b&&c.push({id:a,roleId:d.roleId,name:b.name,content:b.content});continue}if(a.startsWith("custom:")){let e=b.find(b=>b.id===a);e&&c.push({id:a,roleId:d.roleId,name:e.name,content:e.content});continue}if(a.startsWith("file:")){let b=a.slice(5);e.existsSync(b)&&c.push({id:a,roleId:d.roleId,name:f.basename(f.dirname(b))||b,content:e.readFileSync(b,"utf-8")})}}return c}function x(){return[...p,...t()]}function y(a){return x().find(b=>b.id===a)}function z(a){let b=s(a);if(p.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=t().filter(a=>a.id!==b.id);return c.push(b),u(c),b}async function A(a,b=(0,k.aY)()){let c=y(a);if(!c)throw Error("Document template not found");let d=[],e=(0,n.XB)("prompt"),f=(0,n.XB)("file"),g=c.projectRoleConfigId?(0,n.Mu)(c.projectRoleConfigId):void 0;c.projectRoleConfigId||d.push({level:"error",message:"模板未绑定项目角色配置"}),c.projectRoleConfigId&&!g&&d.push({level:"error",message:"项目角色配置不存在或已删除"});let h=T(c),i=U(c);0===h.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"}),0===i.length&&d.push({level:"error",message:"模板未绑定知识库文件角色"});let j=c.documentSpecId?(0,o.py)(c.documentSpecId):void 0;if(c.documentSpecId&&!j&&d.push({level:"error",message:"文档规范包不存在或已删除"}),j?.chapterMode==="fixed"){let a=new Set(c.chapters.map(a=>a.id)),b=new Set(c.chapters.map(a=>a.title));for(let c of j.chapterRules.filter(a=>a.required))a.has(c.id)||b.has(c.title)||d.push({level:"error",message:`模板章节不满足规范包要求:${c.title}`})}j?.chapterMode==="dynamic"&&j.dynamicChapterRule.maxChapters&&j.dynamicChapterRule.minChapters&&j.dynamicChapterRule.maxChapters<j.dynamicChapterRule.minChapters&&d.push({level:"error",message:"动态章节规则的最多章节不能小于最少章节"});let l=(0,k.T4)(b),m=await (0,k.Qh)().getProject(l);c.builtIn&&await m.incrementalIndex();let p=new Map((0,k.Yy)(l).map(a=>[a.relativePath,a])),q=i.map(a=>{let b=f.find(b=>b.id===a.roleId),c=p.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),r=w(h),s=h.map(a=>{let b=e.find(b=>b.id===a.roleId),c=r.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});return{templateId:a,projectRoleConfigId:c.projectRoleConfigId,documentSpecId:c.documentSpecId,fileDiagnostics:q,promptDiagnostics:s,spec:j?{id:j.id,name:j.name,factFields:j.factFields.length,gateRules:j.gateRules.length}:void 0,issues:d}}function B(a){if(p.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");u(t().filter(b=>b.id!==a))}function C(a){let b=y(a);if(!b)throw Error("Document template not found");let c=s({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=t();return d.push(c),u(d),c}function D(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=f.extname(a).toLowerCase();return[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(c)?`资料文件:${f.basename(a)},文件类型:${c}。该文件作为来源附件参与生成,正文只引用其文件名、类型和角色,不直接混入二进制内容。`:[...b].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").slice(0,4e3)}(a.filePath,a.content)})).sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}:${a.content.slice(0,100)}`;return!c.has(b)&&(c.add(b),!0)}).slice(0,b)}function E(a,b,c,d,g){let h=f.isAbsolute(a)?a:e.existsSync(f.join(g,"knowledgeBase",a))?f.join(g,"knowledgeBase",a):f.join(g,a);if(!e.existsSync(h)||e.statSync(h).isDirectory())return[];let i=f.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`内置示例资料文件:${f.basename(a)},用于三角洲热门干员攻略生成,文件类型:${i}。`:e.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((e,f)=>({chapterId:d,filePath:a,score:1,content:e,roleId:b,processingType:c,sectionTitle:`文件片段 ${f+1}`,source:"bound-file-direct"}))}function F(a){return`- ${a.filePath}(score=${a.score.toFixed(3)}):${a.content.replace(/\s+/gu," ").slice(0,260)}`}function G(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=f.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),e=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=f.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-官方完整地图图纸$/u,"官方完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明区域、路线、点位、撤离/交战路径和队伍分工。":"image"===b?c.roleId?.includes("operator")||/干员|露娜|红狼|牧羊人|蜂医/u.test(c.filePath)?"作为干员或对象图片证据,用于对应角色形象、定位和正文配图。":"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、优先级、清单和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};e.score=Math.max(e.score,c.score),e.relatedFacts=[...new Set([...e.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
127
|
-
${a.content}`;return[...new Set([...b?.requiredFacts||[],"地图图纸","官方地图工具","路线理解","干员图片","表格数据","规范要求","项目事实","附件资料","队伍搭配","推荐指数"].filter(b=>J(a,b)||c.includes(b)))]}(c,a)])],e.relatedChapters=[...new Set([...e.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&e.snippets.length<3&&!e.snippets.includes(g)&&e.snippets.push(g),d.set(c.filePath,e)}let e=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of e)g[a.kind].push(a);let h=[`本章证据包:文本片段 ${c.length} 条、资源文件 ${e.length} 个。`,`资源类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、地图图纸 ${g.map.length}、其他附件 ${g.attachment.length}。`,e.length?`关键资源:${e.slice(0,10).map(a=>`${a.semanticTitle}(${a.kind}:${a.filePath})`).join(";")}`:""].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:e,byKind:g,summary:h}}function H(a){let b=a.resources.slice(0,20).map(a=>[`- 文件:${a.filePath}`,` 资源类型:${a.kind}`,` 语义标题:${a.semanticTitle}`,a.roleId?` 文件角色:${a.roleId}`:"",a.processingType?` 处理类型:${a.processingType}`:"",` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 关联事实:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 证据片段:${a.snippets.join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.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:()=>l,VS:()=>p,Yy:()=>o,aY:()=>n});var d=c(19898),e=c(87550),f=c.n(e),g=c(33873),h=c(21820),i=c(29021);let j=null;function k(){return g.join(h.homedir(),".customize-agent")}function l(){return j||(j=new d.MultiProjectManager(k())),j}function m(a){let b=g.resolve(a),c=g.resolve(g.join(h.homedir(),".customize-agent"));return!(i.existsSync(g.join(b,"pnpm-workspace.yaml"))&&i.existsSync(g.join(b,"apps","server")))&&(b===c||b.includes(`${g.sep}.customize-agent${g.sep}`)||b.endsWith(`${g.sep}apps${g.sep}server`)||b.endsWith(`${g.sep}apps${g.sep}cli`))}function n(){let a=process.env.CUSTOMIZE_PROJECT_ROOT??process.env.INIT_CWD;if(a&&i.existsSync(a)&&!m(a))return g.resolve(a);let b=function(){let a=g.join(k(),"projects","registry.db");if(!i.existsSync(a))return[];let b=new(f())(a,{readonly:!0});try{return b.prepare("SELECT project_root FROM project_registry ORDER BY last_opened_at DESC").all().map(a=>g.resolve(a.project_root)).filter(a=>!m(a))}finally{b.close()}}();return b.length>0?b[0]:process.env.INIT_CWD&&!m(process.env.INIT_CWD)?process.env.INIT_CWD:g.resolve(process.cwd(),"../..")}function o(a,b={}){let c=new Map;for(let b of function(a){let b=g.join(h.homedir(),".customize-agent","projects",(0,d.computeProjectId)(g.resolve(a)),"kb.db");if(!i.existsSync(b))return[];let c=new d.IndexStateStore(b);try{return c.listRecords().map(a=>({...a,matchedBy:"metadata"}))}finally{c.close()}}(a))c.set(b.relativePath,b);for(let b of function(a){let b=g.join(a,"knowledgeBase");if(!i.existsSync(b))return[];let c=[],d=a=>{for(let e of i.readdirSync(a,{withFileTypes:!0})){let f=g.join(a,e.name);if(e.isDirectory()){d(f);continue}if(e.name.endsWith(".source.txt"))continue;let h=i.statSync(f),j=g.relative(b,f).split(g.sep).join("/");c.push({relativePath:j,category:j.includes("表格数据/")?"spreadsheet":j.includes("图片素材/")?"image":j.includes("图纸文件/")?"cad":j.includes("文档资料/")?"document":"other",format:g.extname(j).slice(1).toLowerCase()||"text",contentHash:"",fileSize:h.size,mtime:h.mtimeMs,chunkCount:0,collectionName:"",indexedAt:0,lastVerifiedAt:0,status:"disk",matchedBy:"disk"})}};return d(b),c}(a)){let a=c.get(b.relativePath);c.set(b.relativePath,a?{...a,fileSize:b.fileSize,mtime:b.mtime,matchedBy:"metadata"}:b)}return Array.from(c.values()).filter(a=>!b.category||a.category===b.category).sort((a,b)=>b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN"))}async function p(a,b={}){let c=(b.query||"").trim(),d=Math.max(1,Math.min(500,b.limit??50)),e=new Map,f=o(a,{category:b.category});for(let a of f)(!c||`${a.relativePath}
|
|
2
|
+
${a.category}
|
|
3
|
+
${a.format}
|
|
4
|
+
${a.status}`.toLowerCase().includes(c.toLowerCase()))&&e.set(a.relativePath,{...a,matchedBy:c?"path":a.matchedBy});if(c&&!1!==b.includeContent)try{for(let b of(await l().search(a,c,{limit:Math.max(20,d)})).results){let a=b.filePath,c=e.get(a)||f.find(b=>b.relativePath===a);e.set(a,{...c||{relativePath:a,category:"content",format:"knowledge",fileSize:0,mtime:0,chunkCount:0,indexedAt:0,lastVerifiedAt:0,status:"active"},matchedBy:"content",score:b.score})}}catch{}let g=Array.from(e.values()).sort((a,b)=>{let c=a=>"content"===a.matchedBy?3:"path"===a.matchedBy?2:+("metadata"===a.matchedBy);return c(b)-c(a)||(b.score??0)-(a.score??0)||b.mtime-a.mtime||a.relativePath.localeCompare(b.relativePath,"zh-CN")});return{files:g.slice(0,d),total:g.length}}},57367:(a,b,c)=>{c.d(b,{Co:()=>z,EK:()=>B,ER:()=>C,_q:()=>w,py:()=>A,uD:()=>x,ug:()=>y});var d=c(73024),e=c(48161),f=c(76760);let g=[{id:"required_fact",name:"必需事实",description:"检查指定事实字段是否存在。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"fact",operator:"exists"}},{id:"required_chapter",name:"必需章节",description:"检查指定章节是否存在。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"chapter",operator:"exists"}},{id:"required_file_role",name:"必需文件角色",description:"检查项目角色配置是否绑定指定文件角色。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"file_role",operator:"exists"}},{id:"required_prompt_role",name:"必需提示词角色",description:"检查项目角色配置是否绑定指定提示词角色。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"prompt_role",operator:"exists"}},{id:"source_required",name:"事实必须有来源",description:"检查结构化事实是否都有资料来源。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"source",operator:"all_have_source"}},{id:"forbidden_text",name:"禁止出现文本",description:"检查全文是否出现禁用文本。",builtIn:!0,defaultLevel:"error",evaluator:{subject:"document",operator:"not_contains"}},{id:"min_chapter_length",name:"章节最低字数",description:"检查指定章节是否达到最低字数。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"chapter",operator:"min_length"}},{id:"table_required",name:"必须有表格",description:"检查文档是否包含结构化表格。",builtIn:!0,defaultLevel:"warning",evaluator:{subject:"table",operator:"min_count",min:1}}],h=new Map(g.map(a=>[a.id,a])),i=["document","chapter","fact","file_role","prompt_role","table","image","source"],j=["exists","contains","not_contains","regex_match","regex_not_match","min_count","min_length","all_have_source","image_caption_required","table_explanation_required"];function k(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function l(){return f.join(k(),"document-specs.json")}function m(){return f.join(k(),"document-gate-types.json")}function n(a){return(a||`spec-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function o(a,b=""){return String(a||b).trim().slice(0,500)}function p(a,b){let c=a||b||{subject:"document",operator:"contains"},d=i.includes(c.subject)?c.subject:"document",e=j.includes(c.operator)?c.operator:"contains",f=Number(c.min);return{subject:d,operator:e,target:o(c.target),value:o(c.value),min:Number.isFinite(f)&&f>0?f:void 0}}function q(a){let b=n(a.id||a.name||`gate-type-${Date.now()}`);if(h.has(b))throw Error("不能覆盖系统内置门禁类型");return{id:b,name:o(a.name,"自定义门禁类型"),description:o(a.description),builtIn:!1,defaultLevel:"warning"===a.defaultLevel||"info"===a.defaultLevel?a.defaultLevel:"error",evaluator:p(a.evaluator)}}function r(a){return{id:n(a.id),name:a.name||"未命名规范包",description:a.description||"",factFields:Array.isArray(a.factFields)?a.factFields.filter(a=>a.name).map(a=>({id:n(a.id),name:a.name,type:"auto",required:!!a.required,sourceRoleIds:Array.isArray(a.sourceRoleIds)?a.sourceRoleIds.filter(Boolean):[],extractionHint:a.extractionHint||"",validationHint:a.validationHint||""})):[],chapterMode:"fixed"===a.chapterMode?"fixed":"dynamic",chapterRules:Array.isArray(a.chapterRules)?a.chapterRules.filter(a=>a.title).map((a,b)=>({id:n(a.id),title:a.title,required:!!a.required,order:Number.isFinite(a.order)?a.order:b,minWords:Number.isFinite(a.minWords)?a.minWords:0,requiredFactIds:Array.isArray(a.requiredFactIds)?a.requiredFactIds.filter(Boolean):[],requiredFileRoleIds:Array.isArray(a.requiredFileRoleIds)?a.requiredFileRoleIds.filter(Boolean):[],requiredPromptRoleIds:Array.isArray(a.requiredPromptRoleIds)?a.requiredPromptRoleIds.filter(Boolean):[],generationHint:a.generationHint||""})):[],dynamicChapterRule:{source:["file_outline","file_role","fact_group","table_rows"].includes(a.dynamicChapterRule?.source)?a.dynamicChapterRule.source:"ai_plan",sourceRoleIds:Array.isArray(a.dynamicChapterRule?.sourceRoleIds)?a.dynamicChapterRule.sourceRoleIds.filter(Boolean):[],minChapters:Number.isFinite(a.dynamicChapterRule?.minChapters)?a.dynamicChapterRule.minChapters:void 0,maxChapters:Number.isFinite(a.dynamicChapterRule?.maxChapters)?a.dynamicChapterRule.maxChapters:void 0,titleStrategy:["source_title","field_value","template"].includes(a.dynamicChapterRule?.titleStrategy||"")?a.dynamicChapterRule?.titleStrategy:"ai_summary",titleTemplate:a.dynamicChapterRule?.titleTemplate||"",minWordsPerChapter:Number.isFinite(a.dynamicChapterRule?.minWordsPerChapter)?a.dynamicChapterRule.minWordsPerChapter:void 0,requiredFactIds:Array.isArray(a.dynamicChapterRule?.requiredFactIds)?a.dynamicChapterRule.requiredFactIds.filter(Boolean):[],requiredFileRoleIds:Array.isArray(a.dynamicChapterRule?.requiredFileRoleIds)?a.dynamicChapterRule.requiredFileRoleIds.filter(Boolean):[],requiredPromptRoleIds:Array.isArray(a.dynamicChapterRule?.requiredPromptRoleIds)?a.dynamicChapterRule.requiredPromptRoleIds.filter(Boolean):[],generationHint:a.dynamicChapterRule?.generationHint||""},gateRules:Array.isArray(a.gateRules)?a.gateRules.filter(a=>a.name).map(a=>{var b;let c=n(a.type||a.name||"custom_gate");return{id:n(a.id),name:a.name,type:c,level:"warning"===a.level||"info"===a.level?a.level:"error",target:a.target||"",value:a.value||"",evaluator:p((b={...a,type:c}).evaluator,h.get(b.type)?.evaluator)}}):[],wordTemplatePath:a.wordTemplatePath||"",builtIn:!!a.builtIn}}function s(){try{let a=l();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(l(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(){try{let a=m();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(q)}catch{return[]}}function v(a){d.writeFileSync(m(),JSON.stringify(a.map(q),null,2),"utf-8")}function w(){return[...new Map([...g,...u()].map(a=>[a.id,a])).values()]}function x(a){let b=q(a),c=u().filter(a=>a.id!==b.id);return c.push(b),v(c),b}function y(a){if(h.has(a))throw Error("系统内置门禁类型不可删除");v(u().filter(b=>b.id!==a))}function z(){return[...new Map(s().map(a=>[a.id,a])).values()]}function A(a){if(a)return s().find(b=>b.id===a)}function B(a){let b=r(a),c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}function C(a){t(s().filter(b=>b.id!==a))}},73445:(a,b,c)=>{c.d(b,{Bh:()=>x,OX:()=>aj,R1:()=>ak,bV:()=>A,h0:()=>z,jG:()=>v,xm:()=>y});var d=c(73024),e=c(76760),f=c(15751),g=c(48161),h=c(95393),i=c(96770),j=c(23328),k=c(99842),l=c(2323),m=c(89952),n=c(57367);let o=[];function p(){let a=e.join(g.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),a}function q(){return e.join(p(),"document-templates.json")}function r(a){return{...a,id:a.id.replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)||`template-${Date.now()}`,name:a.name||"未命名模板",description:a.description||"",category:a.category||"自定义",outputTitle:a.outputTitle||a.name||"业务文档",projectRoleConfigId:a.projectRoleConfigId||void 0,documentSpecId:a.documentSpecId||void 0,chapters:Array.isArray(a.chapters)&&a.chapters.length>0?a.chapters.map((a,b)=>({id:(a.id||`chapter-${b+1}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80),title:a.title||`第 ${b+1} 章`,purpose:a.purpose||"",queries:Array.isArray(a.queries)?a.queries.filter(Boolean):[],requiredFacts:Array.isArray(a.requiredFacts)?a.requiredFacts.filter(Boolean):[],pinnedEvidenceFilePaths:Array.isArray(a.pinnedEvidenceFilePaths)?a.pinnedEvidenceFilePaths.filter(Boolean):[]})):[{id:"document",title:a.outputTitle||a.name||"业务文档",purpose:a.description||"",queries:[],requiredFacts:[]}],promptIds:Array.isArray(a.promptIds)?a.promptIds.filter(Boolean):[],boundFilePaths:Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean):[],promptBindings:Array.isArray(a.promptBindings)?a.promptBindings.filter(a=>a.promptId&&a.roleId):Array.isArray(a.promptIds)?a.promptIds.filter(Boolean).map(a=>({promptId:a,roleId:"chapter_generation"})):[],fileBindings:Array.isArray(a.fileBindings)?a.fileBindings.filter(a=>a.filePath&&a.roleId):Array.isArray(a.boundFilePaths)?a.boundFilePaths.filter(Boolean).map(a=>({filePath:a,roleId:"project_fact"})):[],builtIn:!1}}function s(){try{let a=q();if(!d.existsSync(a))return[];return JSON.parse(d.readFileSync(a,"utf-8")).map(r)}catch{return[]}}function t(a){d.writeFileSync(q(),JSON.stringify(a.map(r),null,2),"utf-8")}function u(a=[]){let b;if(0===a.length)return[];let c=[];try{let a=JSON.parse(d.readFileSync(e.join(p(),"prompts.json"),"utf-8"));b=Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{b=[]}for(let f of a){let a=f.promptId;if(a.startsWith("custom:")){let d=b.find(b=>b.id===a);d&&c.push({id:a,roleId:f.roleId,name:d.name,content:d.content});continue}if(a.startsWith("file:")){let b=a.slice(5);d.existsSync(b)&&c.push({id:a,roleId:f.roleId,name:e.basename(e.dirname(b))||b,content:d.readFileSync(b,"utf-8")})}}return c}function v(){return[...o,...s()]}function w(a){return v().find(b=>b.id===a)}function x(a){let b=r(a);if(o.some(a=>a.id===b.id))throw Error("Built-in template cannot be overwritten");let c=s().filter(a=>a.id!==b.id);return c.push(b),t(c),b}async function y(a,b=(0,j.aY)()){let c=w(a),d=[];if(!c)return{issues:[{level:"error",message:"文档模板不存在或已删除"}],fileDiagnostics:[],promptDiagnostics:[],spec:void 0,config:void 0};let f=(0,m.XB)("prompt"),g=(0,m.XB)("file"),h=c.projectRoleConfigId?(0,m.Mu)(c.projectRoleConfigId):void 0;c.projectRoleConfigId||d.push({level:"error",message:"模板未绑定项目角色配置"}),c.projectRoleConfigId&&!h&&d.push({level:"error",message:"项目角色配置不存在或已删除"});let i=X(c),k=Y(c);0===i.length&&d.push({level:"warning",message:"模板未绑定提示词角色,生成会缺少说明提示词约束"}),0===k.length&&d.push({level:"error",message:"模板未绑定知识库文件角色"});let l=c.documentSpecId?(0,n.py)(c.documentSpecId):void 0;if(c.documentSpecId&&!l&&d.push({level:"error",message:"文档规范包不存在或已删除"}),l?.chapterMode==="fixed"){let a=new Set(c.chapters.map(a=>a.id)),b=new Set(c.chapters.map(a=>a.title));for(let c of l.chapterRules.filter(a=>a.required))a.has(c.id)||b.has(c.title)||d.push({level:"error",message:`模板章节不满足规范包要求:${c.title}`})}l?.chapterMode==="dynamic"&&l.dynamicChapterRule.maxChapters&&l.dynamicChapterRule.minChapters&&l.dynamicChapterRule.maxChapters<l.dynamicChapterRule.minChapters&&d.push({level:"error",message:"动态章节规则的最多章节不能小于最少章节"});let o=e.resolve(b),p=await (0,j.Qh)().getProject(o);c.builtIn&&await p.incrementalIndex();let q=new Map((0,j.Yy)(o).map(a=>[a.relativePath,a])),r=k.map(a=>{let b=g.find(b=>b.id===a.roleId),c=q.get(a.filePath);return b||d.push({level:"error",message:`文件角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`知识库文件不存在:${a.filePath}`}),c&&("disk"===c.status||0===c.indexedAt)&&d.push({level:"warning",message:`知识库文件存在但尚未完成索引:${a.filePath}`}),c?.status==="error"&&d.push({level:"warning",message:`知识库文件索引失败:${a.filePath}${c.errorMessage?`,${c.errorMessage}`:""}`}),c&&0===c.chunkCount&&d.push({level:"warning",message:`知识库文件暂无可检索内容切片:${a.filePath}`}),{...a,roleName:b?.name,exists:!!c,indexed:!!(c&&c.indexedAt>0&&"disk"!==c.status),chunkCount:c?.chunkCount??0,vectorReady:!!(c&&c.chunkCount>0)}}),s=u(i),t=i.map(a=>{let b=f.find(b=>b.id===a.roleId),c=s.find(b=>b.id===a.promptId);return b||d.push({level:"error",message:`提示词角色不存在:${a.roleId}`}),c||d.push({level:"error",message:`提示词不存在:${a.promptId}`}),c&&!c.content.trim()&&d.push({level:"warning",message:`提示词为空:${c.name}`}),{...a,roleName:b?.name,promptTitle:c?.name,exists:!!c,contentLength:c?.content.length??0}});return{templateId:a,projectRoleConfigId:c.projectRoleConfigId,documentSpecId:c.documentSpecId,fileDiagnostics:r,promptDiagnostics:t,spec:l?{id:l.id,name:l.name,factFields:l.factFields.length,gateRules:l.gateRules.length}:void 0,issues:d}}function z(a){if(o.some(b=>b.id===a))throw Error("Built-in template cannot be deleted");t(s().filter(b=>b.id!==a))}function A(a){let b=w(a);if(!b)throw Error("Document template not found");let c=r({...b,id:`${b.id}-copy-${Date.now()}`,name:`${b.name} Copy`,builtIn:!1}),d=s();return d.push(c),t(d),c}function B(a,b){let c=new Set;return a.map(a=>({...a,content:function(a,b){let c=e.extname(a).toLowerCase();return[".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(c)?`资料文件:${e.basename(a)},文件类型:${c}。该文件作为来源附件参与生成,正文只引用其文件名、类型和角色,不直接混入二进制内容。`:[...b].filter(a=>{let b=a.charCodeAt(0);return 9===b||10===b||13===b||b>=32}).join("").slice(0,4e3)}(a.filePath,a.content)})).sort((a,b)=>b.score-a.score).filter(a=>{let b=`${a.filePath}:${a.content.slice(0,100)}`;return!c.has(b)&&(c.add(b),!0)}).slice(0,b)}function C(a,b,c,f,g){let h=e.isAbsolute(a)?a:d.existsSync(e.join(g,"knowledgeBase",a))?e.join(g,"knowledgeBase",a):e.join(g,a);if(!d.existsSync(h)||d.statSync(h).isDirectory())return[];let i=e.extname(h).toLowerCase();return(([".pdf",".doc",".docx",".xls",".xlsx",".png",".jpg",".jpeg",".webp"].includes(i)?`资料文件:${e.basename(a)},文件类型:${i}。`:d.readFileSync(h,"utf-8")).match(/[\s\S]{1,1800}/gu)||[]).slice(0,12).map((d,e)=>({chapterId:f,filePath:a,score:1,content:d,roleId:b,processingType:c,sectionTitle:`文件片段 ${e+1}`,source:"bound-file-direct"}))}function D(a){return`- ${a.filePath}(score=${a.score.toFixed(3)}):${a.content.replace(/\s+/gu," ").slice(0,260)}`}function E(a,b){let c=b.slice(0,16),d=new Map;for(let c of b){let b=function(a,b){let c=e.extname(a).toLowerCase();return"drawing"===b||/地图|图纸|map/iu.test(a)?"map":[".png",".jpg",".jpeg",".webp"].includes(c)?"image":"table"===b?"table":[".xls",".xlsx",".csv"].includes(c)?"spreadsheet":[".pdf",".doc",".docx"].includes(c)?"document":c&&![".md",".txt"].includes(c)?"attachment":"text"}(c.filePath,c.processingType),f=d.get(c.filePath)||{filePath:c.filePath,kind:b,roleId:c.roleId,processingType:c.processingType,score:c.score,semanticTitle:function(a,b){let c=e.basename(a).replace(/\.[^.]+$/u,"");return"map"===b?c.replace(/^地图图纸-/u,"").replace(/-完整地图图纸$/u,"完整地图图纸"):"image"===b?c.replace(/-/gu," "):"spreadsheet"===b?`${c}(结构化表格)`:"document"===b?`${c}(文档附件)`:c}(c.filePath,b),contentUse:"map"===b?"作为地图/图纸证据,用于说明空间关系、区域划分、点位、路线或专业布置。":"image"===b?"作为图片证据,用于视觉说明、参考图或章节配图。":"spreadsheet"===b||"table"===b?"作为表格/数据证据,用于字段对比、清单、数量和结构化结论。":"document"===b?"作为 PDF/Word 文档证据,用于提取规范、事实、说明、约束和附件来源。":"attachment"===b?"作为附件证据,用于提供补充来源、文件级约束或可追溯引用。":"作为文本证据,用于事实抽取、章节论据和来源引用。",relatedFacts:[],relatedChapters:[],snippets:[]};f.score=Math.max(f.score,c.score),f.relatedFacts=[...new Set([...f.relatedFacts,...function(a,b){let c=`${a.filePath}
|
|
5
|
+
${a.content}`;return[...new Set([...b?.requiredFacts||[],"表格数据","规范要求","项目事实","附件资料","图纸资料","图片资料"].filter(b=>H(a,b)||c.includes(b)))]}(c,a)])],f.relatedChapters=[...new Set([...f.relatedChapters,a.title])];let g=c.content.replace(/\s+/gu," ").slice(0,320);g&&f.snippets.length<3&&!f.snippets.includes(g)&&f.snippets.push(g),d.set(c.filePath,f)}let f=[...d.values()].sort((a,b)=>b.score-a.score),g={map:[],image:[],table:[],document:[],spreadsheet:[],text:[],attachment:[]};for(let a of f)g[a.kind].push(a);let h=[`本章证据包:文本片段 ${c.length} 条、资源文件 ${f.length} 个。`,`资源类型分布:文本 ${g.text.length}、文档 ${g.document.length}、表格 ${g.spreadsheet.length+g.table.length}、图片 ${g.image.length}、地图图纸 ${g.map.length}、其他附件 ${g.attachment.length}。`,f.length?`关键资源:${f.slice(0,10).map(a=>`${a.semanticTitle}(${a.kind}:${a.filePath})`).join(";")}`:""].filter(Boolean).join("\n");return{chapterId:a.id,textEvidence:c,resources:f,byKind:g,summary:h}}function F(a){let b=a.resources.slice(0,20).map(a=>[`- 文件:${a.filePath}`,` 资源类型:${a.kind}`,` 语义标题:${a.semanticTitle}`,a.roleId?` 文件角色:${a.roleId}`:"",a.processingType?` 处理类型:${a.processingType}`:"",` 正文用途:${a.contentUse}`,a.relatedFacts.length?` 关联事实:${a.relatedFacts.join("、")}`:"",a.snippets.length?` 证据片段:${a.snippets.join(" / ")}`:""].filter(Boolean).join("\n")).join("\n"),c=a.textEvidence.map(a=>`文件:${a.filePath}
|
|
128
6
|
角色:${a.roleId||"未标注"}
|
|
129
7
|
类型:${a.processingType||"reference"}
|
|
130
8
|
章节/片段:${a.sectionTitle||"未标注"}
|
|
131
9
|
内容:${a.content.replace(/\s+/gu," ").slice(0,900)}`).join("\n\n---\n\n");return[a.summary,b?`结构化资源证据:
|
|
132
10
|
${b}`:"",c?`文本/附件片段证据:
|
|
133
|
-
${c}`:""].filter(Boolean).join("\n\n")}function
|
|
134
|
-
${a.content}`;return
|
|
11
|
+
${c}`:""].filter(Boolean).join("\n\n")}function G(a,b,c=[]){if(!b)return a.chapters;if("fixed"===b.chapterMode)return b.chapterRules.length>0?[...b.chapterRules].sort((a,b)=>a.order-b.order).map(a=>({id:a.id,title:a.title,purpose:a.generationHint||a.title,requiredFacts:a.requiredFactIds||[],queries:[a.title,a.generationHint||"",...a.requiredFactIds||[]].filter(Boolean),pinnedEvidenceFilePaths:[]})):a.chapters;let d=b.dynamicChapterRule,f=Math.max(1,Math.min(20,d.minChapters||3)),g=Math.max(f,Math.min(30,d.maxChapters||Math.max(f,8))),h=new Set([...d.sourceRoleIds||[],...d.requiredFileRoleIds||[]]),i=c.filter(a=>0===h.size||a.roleId&&h.has(a.roleId)).filter((a,b,c)=>c.findIndex(b=>`${b.filePath}:${b.sectionTitle||""}`==`${a.filePath}:${a.sectionTitle||""}`)===b).slice(0,g).map((a,b)=>{let c=function(a,b,c){let d=(a.sectionTitle||e.basename(a.filePath).replace(/\.[^.]+$/u,"")||`资料片段 ${b+1}`).replace(/\s+/gu," ").slice(0,60);return c?c.replaceAll("{{index}}",String(b+1)).replaceAll("{{sourceTitle}}",d):d}(a,b,d.titleTemplate);return{id:`dynamic-${b+1}`,title:c,purpose:d.generationHint||`根据 ${a.filePath} 动态生成章节`,requiredFacts:d.requiredFactIds||[],queries:[c,a.filePath,a.sectionTitle||"",d.generationHint||""].filter(Boolean),pinnedEvidenceFilePaths:[a.filePath]}});if(i.length>=f)return i;let j=a.chapters.length>0?a.chapters.map(a=>a.title):["背景与目标","资料分析","结论与建议"];for(;i.length<f;){let a=i.length,b=j[a]||`动态章节 ${a+1}`;i.push({id:`dynamic-${a+1}`,title:b,purpose:d.generationHint||b,requiredFacts:d.requiredFactIds||[],queries:[b,d.generationHint||"",(d.sourceRoleIds||[]).filter(Boolean).join(" ")].filter(Boolean),pinnedEvidenceFilePaths:[]})}return i}function H(a,b){let c=`${a.filePath}
|
|
12
|
+
${a.content}`;return(function(a){let b=a.replace(/要求|计划|目标|标准|内容|信息|事实|依据|参数|范围|要点/gu,"");return[a,b].filter(Boolean)})(b).some(a=>c.includes(a))}function I(a,b){let c=G(a,b,[]).flatMap(a=>a.requiredFacts).map(a=>({id:a,name:a,required:!0,sourceRoleIds:[],extractionHint:""})),d=b?.factFields.map(a=>({id:a.id,name:a.name,required:a.required,sourceRoleIds:a.sourceRoleIds||[],extractionHint:a.extractionHint||""}))||[],e=new Map;for(let a of[...c,...d])e.set(a.id,{...e.get(a.id)||a,...a,required:a.required||e.get(a.id)?.required||!1});return[...e.values()]}function J(a,b){return(!b.sourceRoleIds?.length||!!(a.roleId&&b.sourceRoleIds.includes(a.roleId)))&&H(a,b.name)}function K(a){return a.toLowerCase()}function L(a,b){return(a||b).replace(/[^a-zA-Z0-9\u4e00-\u9fa5_-]/gu,"-").slice(0,80)||b}function M(a){return"string"==typeof a?a:null==a?"":Array.isArray(a)?a.map(a=>M(a)).filter(Boolean).join(";"):"object"==typeof a?Object.entries(a).map(([a,b])=>`${a}:${M(b)}`).filter(Boolean).join(";"):String(a)}async function N(a,b){let c=b.slice(0,36).map(a=>`文件:${a.filePath}
|
|
135
13
|
片段:${a.sectionTitle||""}
|
|
136
|
-
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),d=a.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",e=c.trim()?await
|
|
14
|
+
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n"),d=a.promptTexts.join("\n\n")||"请读取绑定文件角色,抽取可用于文档生成的结构化信息。",e=c.trim()?await aa(d,`你正在执行一个“文件角色 \xd7 提示词角色”的读取节点。
|
|
137
15
|
节点类型:${a.outputType}
|
|
138
16
|
文件角色:${a.fileRoleName}(${a.fileRoleId})
|
|
139
17
|
要求:严格按该节点绑定的提示词读取该文件角色的内容,不要读取其他角色。
|
|
@@ -141,42 +19,32 @@ ${a.content}`;return[b,b.replace(/要求|计划|目标|标准/gu,""),...{定位:
|
|
|
141
19
|
请返回 JSON,字段包括 chapters、facts、outputRequirements、forbidImageInsertion、warnings。chapters 中每项包含 title、sourceRequirement、requiredContents、writingRules、evidenceNeeds、minWords、requirements;requirements 中每项包含 title、requirementText、requiredContents、writingRules、evidenceNeeds、preferredSourceRoleIds;facts 中每项包含 key、value、sourceFile、relatedChapterHints。
|
|
142
20
|
|
|
143
21
|
绑定文件片段:
|
|
144
|
-
${c}`):void 0,f=(e?.chapters||[]).filter(a=>a.title).map((a,b)=>({id:
|
|
145
|
-
${a.value}
|
|
146
|
-
${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function
|
|
22
|
+
${c}`):void 0,f=(e?.chapters||[]).filter(a=>a.title).map((a,b)=>({id:L(a.title,`chapter-${b+1}`),title:a.title,order:b,sourceRequirement:a.sourceRequirement||a.title,requiredContents:Array.isArray(a.requiredContents)?a.requiredContents.filter(Boolean):[],writingRules:Array.isArray(a.writingRules)?a.writingRules.filter(Boolean):[],evidenceNeeds:Array.isArray(a.evidenceNeeds)?a.evidenceNeeds.filter(Boolean):[],minWords:Math.max(800,Math.min(3500,Number(a.minWords)||1200)),requirements:Array.isArray(a.requirements)?a.requirements.map((c,d)=>({id:L(`${a.title}-${c.title||d+1}`,`req-${b+1}-${d+1}`),title:c.title||`要求 ${d+1}`,requirementText:c.requirementText||c.title||"",requiredContents:Array.isArray(c.requiredContents)?c.requiredContents.filter(Boolean):[],writingRules:Array.isArray(c.writingRules)?c.writingRules.filter(Boolean):[],evidenceNeeds:Array.isArray(c.evidenceNeeds)?c.evidenceNeeds.filter(Boolean):[],preferredSourceRoleIds:Array.isArray(c.preferredSourceRoleIds)?c.preferredSourceRoleIds.filter(Boolean):[]})):[]})),g=(e?.facts||[]).filter(a=>a.key&&a.value).map(c=>({key:c.key,value:M(c.value),sourceFile:c.sourceFile||b.find(a=>a.filePath)?.filePath||"",roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:Array.isArray(c.relatedChapterHints)?c.relatedChapterHints.filter(Boolean):[]}));return{node:a,evidence:b,chapters:f.length>0?f:function(a,b){if("template_requirements"!==a.outputType)return[];let c=[],d=new Set;for(let a of b){for(let b of a.content.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean)){if(!/^(?:第[一二三四五六七八九十百千万\d]+[章节]|[一二三四五六七八九十]+、|\d+(?:\.\d+)*[、..])/.test(b))continue;let e=b.replace(/^\d+(?:\.\d+)*[、..]\s*/u,"").slice(0,80);if(!(e.length<4||d.has(e))&&(d.add(e),c.push({id:L(e,`chapter-${c.length+1}`),title:e,order:c.length,sourceRequirement:a.content.replace(/\s+/gu," ").slice(0,500),requiredContents:[],writingRules:[],evidenceNeeds:[],minWords:1200,requirements:[]}),c.length>=18))break}if(c.length>=18)break}return c}(a,b),facts:g.length>0?g:b.slice(0,20).map((b,c)=>({key:`${a.fileRoleName}事实${c+1}`,value:b.content.replace(/\s+/gu," ").slice(0,360),sourceFile:b.filePath,roleId:a.fileRoleId,processingType:a.processingType,relatedChapterHints:b.sectionTitle?[b.sectionTitle]:[]})).filter(a=>a.value.length>20),outputRequirements:Array.isArray(e?.outputRequirements)?e.outputRequirements.filter(Boolean):[],warnings:Array.isArray(e?.warnings)?e.warnings.filter(Boolean):[],forbidImageInsertion:e?.forbidImageInsertion??"drawing_facts"===a.outputType}}function O(a,b,c){let d=[b.title,...b.requiredFacts||[],...c?.requiredContents||[],...c?.evidenceNeeds||[],...c?.requirements.flatMap(a=>[a.title,...a.requiredContents,...a.evidenceNeeds])||[]].filter(Boolean);return a.flatMap(a=>a.facts.map(b=>({artifact:a,fact:b}))).filter(({fact:a})=>{let b=`${a.key}
|
|
23
|
+
${M(a.value)}
|
|
24
|
+
${a.relatedChapterHints.join("\n")}`;return 0===d.length||d.some(c=>b.includes(c)||c.includes(a.key))}).slice(0,80)}function P(a,b){return a.some(a=>a.forbidImageInsertion||"drawing_facts"===a.node.outputType)}function Q(a,b){return b?a.replace(/^!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)\s*$/gimu,"").replace(/\n{3,}/gu,"\n\n"):a}let R=/^##\s*(?:编制依据与证据来源|资料来源清单|缺失项与需确认事项|校验结果|严格校验清单|项目基础信息与响应原则|工程概况与图纸依据)[\s\S]*?(?=^##\s|$(?![\s\S]))/gmu,S=/.*(?:本章补充|动态章节|知识库证据|文件角色|提示词角色|文档规范包|规范包|事实字段|资料未提供|未检索到|待确认事项|证据来源|来源清单).*(?:\n|$)/gu,T=/^\s*(?:[│┃┆┊┌┐└┘├┤┬┴┼─━╭╮╰╯]|[↓↑→←⇒⇨➡])+\s*$/gmu;function U(a){return a.replace(R,"").replace(S,"").replace(T,"").replace(/第\s*\d+\s*页\s*\/\s*共\s*\d+\s*页/gu,"").replace(/\n{3,}/gu,"\n\n").trim()}let V="你正在生成正式施工组织设计正文,不是分析报告、证据报告或系统调试报告。\n禁止出现“知识库、证据、来源清单、检索、文件角色、提示词角色、规范包、事实字段、动态章节、缺失项、校验结果、资料未提供、未检索到、本章补充”等系统工作流话术。\n所有招标文件、清单、图纸信息必须内化为正式投标文件表达,不单列资料来源、证据来源或校验清单。\n组织机构、职责分工、关键线路、流程、资源配置、风险控制必须优先使用 Markdown 表格,不得使用由 │、─、↓、→ 等字符组成的文本图或箭头流程链。\n语言应正式、专业、克制,可直接用于投标技术标正文。";async function W(a){if(0===a.issues.length)return{markdown:a.markdown,stage:void 0};let b=await _(["你是招标文件质量补写和纠偏专家。必须严格按照示范文本节点产出的章节计划补齐内容,使用清单、图纸文本事实和项目资料事实,禁止编造。",a.forbidDrawingImages?"图纸资料只作为文本事实来源,禁止插入图纸图片或 Markdown 图片语法。":"","保持 Markdown 标题层级、目录和已有来源信息;直接返回修复后的完整 Markdown。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",`需要修复的问题:
|
|
147
25
|
${a.issues.map(a=>`- ${a}`).join("\n")}`,`章节计划:
|
|
148
|
-
${a.plan.map(a=>`- ${a.title}:${a.requiredContents.join("、")};要求=${a.sourceRequirement.slice(0,200)}`).join("\n")}`,"角色节点产物摘要:",a.artifacts.map(a=>{let b=a.chapters.slice(0,18).map(a=>`- ${a.title}:${a.requiredContents.join("、")||a.sourceRequirement.slice(0,120)}`).join("\n"),c=a.facts.slice(0,30).map(a=>`- ${a.key}:${a.value.slice(0,220)}(来源:${a.sourceFile},角色:${a.roleId})`).join("\n");return[`## ${a.node.fileRoleName} / ${a.node.outputType}`,b?`章节/要求:
|
|
26
|
+
${a.plan.map(a=>`- ${a.title}:${a.requiredContents.join("、")};要求=${a.sourceRequirement.slice(0,200)}`).join("\n")}`,"角色节点产物摘要:",a.artifacts.map(a=>{let b=a.chapters.slice(0,18).map(a=>`- ${a.title}:${a.requiredContents.join("、")||a.sourceRequirement.slice(0,120)}`).join("\n"),c=a.facts.slice(0,30).map(a=>`- ${a.key}:${M(a.value).slice(0,220)}(来源:${a.sourceFile},角色:${a.roleId})`).join("\n");return[`## ${a.node.fileRoleName} / ${a.node.outputType}`,b?`章节/要求:
|
|
149
27
|
${b}`:"",c?`事实:
|
|
150
|
-
${c}`:"",a.outputRequirements.length?`输出要求:${a.outputRequirements.join(";")}`:""].filter(Boolean).join("\n")}).join("\n\n"),"待修复 Markdown:",a.markdown].filter(Boolean).join("\n\n"));return b&&!(b.length<.85*a.markdown.length)&&b.includes("#")?{markdown:
|
|
151
|
-
只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:.3*!c})).content.trim()}catch{return}}async function
|
|
28
|
+
${c}`:"",a.outputRequirements.length?`输出要求:${a.outputRequirements.join(";")}`:""].filter(Boolean).join("\n")}).join("\n\n"),"待修复 Markdown:",a.markdown].filter(Boolean).join("\n\n"));return b&&!(b.length<.85*a.markdown.length)&&b.includes("#")?{markdown:Q(b,a.forbidDrawingImages),stage:{type:"llm_review",roleId:"quality-repair",status:"success",message:`已按角色节点和章节计划完成质量补写,修复 ${a.issues.length} 项`}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"quality-repair",status:"fallback",message:`质量补写未返回有效结果:${a.issues.slice(0,5).join(";")}`}}}function X(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("prompt");if(b)return[...b.promptRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({promptId:b,roleId:a.id})))}return a.promptBindings?.length?a.promptBindings:(a.promptIds??[]).map(a=>({promptId:a,roleId:"chapter_generation"}))}function Y(a){if(a.projectRoleConfigId){let b=(0,m.Mu)(a.projectRoleConfigId),c=(0,m.XB)("file");if(b)return[...b.fileRoles].sort((a,b)=>a.order-b.order).map(a=>c.find(b=>b.id===a.roleId)).filter(a=>!!a).flatMap(a=>(a.resourceIds?.length?a.resourceIds:a.resourceId?[a.resourceId]:[]).map(b=>({filePath:b,roleId:a.id})))}return a.fileBindings?.length?a.fileBindings:(a.boundFilePaths??[]).map(a=>({filePath:a,roleId:"project_fact"}))}function Z(a,b){let c=(0,i.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":"openai"}function $(){let a=(0,l.I)().load(),b=a.models.reasoning.active||a.models.action.active||a.models.reader.active,c=[...a.models.reasoning.list,...a.models.action.list,...a.models.reader.list].find(a=>a.name===b);if(!c)return;let d=a.providers[c.provider];if(d)return{model:c,provider:d}}async function _(a,b,c=!1){try{let d=$();if(!d)return;let{model:e,provider:f}=d,g=(0,h.createProvider)(Z(e.provider,f),{baseUrl:f.baseUrl,apiKey:f.apiKey,modelName:e.name,directEndpoint:f.directEndpoint});return(await g.chat([{role:"system",content:c?`${a}
|
|
29
|
+
只返回 JSON,不要返回 markdown。`:a},{role:"user",content:b}],{temperature:.3*!c})).content.trim()}catch{return}}async function aa(a,b){let c=await _(a,b,!0);if(c)try{let a=c.replace(/^```json\s*/u,"").replace(/^```\s*/u,"").replace(/```$/u,"").trim();return JSON.parse(a)}catch{return}}async function ab(a,b){let c=$();if(!c?.provider.capabilities?.fileUnderstanding&&!c?.provider.capabilities?.imageUnderstanding)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前模型未开启文件理解/图片理解能力"}};let f=(0,h.createProvider)(Z(c.model.provider,c.provider),{baseUrl:c.provider.baseUrl,apiKey:c.provider.apiKey,modelName:c.model.name,directEndpoint:c.provider.directEndpoint});if(!f.understandFiles)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"当前 Provider 未实现文件理解接口"}};let g=[...new Set(b.map(a=>a.filePath).filter(a=>/\.(png|jpe?g|webp|pdf|docx|xlsx)$/iu.test(a)))].slice(0,6).map(b=>{let c=e.join(a,"knowledgeBase",b);return d.existsSync(c)?{name:e.basename(b),mimeType:function(a){let b=e.extname(a).toLowerCase();return".png"===b?"image/png":".jpg"===b||".jpeg"===b?"image/jpeg":".webp"===b?"image/webp":".pdf"===b?"application/pdf":".docx"===b?"application/vnd.openxmlformats-officedocument.wordprocessingml.document":".xlsx"===b?"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet":"application/octet-stream"}(b),data:d.readFileSync(c)}:void 0}).filter(Boolean);if(0===g.length)return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"没有可发送给多模态模型的参考文件"}};try{let a=(await f.understandFiles(g,"请阅读这些参考图片/文件,提炼可用于文档生成和审查的事实、视觉要点、地图信息和封面设计建议。请用中文要点输出。",{maxTokens:1200})).content.trim();return{notes:a?[a]:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:a?"success":"fallback",message:a?`已理解 ${g.length} 个多模态参考文件`:"多模态模型未返回有效文件理解结果"}}}catch{return{notes:[],stage:{type:"file_understanding",roleId:"multimodal-files",status:"fallback",message:"文件理解调用失败,继续使用本地解析内容"}}}}async function ac(a,b,c,d){let e=[{type:"fact_extraction",roleId:"llm-json",status:"skipped",message:"LLM JSON 抽取未启用或无可用模型"}],f=a.slice(0,24).map(a=>`文件:${a.filePath}
|
|
152
30
|
角色:${a.roleId||""}
|
|
153
31
|
处理:${a.processingType||""}
|
|
154
|
-
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!f.trim())return{facts:[],stages:e};let g=
|
|
32
|
+
内容:${a.content.slice(0,1200)}`).join("\n\n---\n\n");if(!f.trim())return{facts:[],stages:e};let g=I(c,d),h=g.map(a=>`- id=${a.id} name=${a.name} type=auto required=${a.required} sourceRoleIds=${a.sourceRoleIds.join(",")||"不限"} hint=${a.extractionHint||"无"}`).join("\n"),i=await aa(b||"你是文档事实抽取器。",`请严格按下面的动态事实 schema 从资料中抽取事实。只抽取资料明确支持的内容;如果字段限定 sourceRoleIds,必须优先来自对应文件角色。返回 {"facts":[{"fieldId":"...","fieldName":"...","key":"...","value":"...","sourceFile":"...","roleId":"...","processingType":"project_fact","confidence":0.8}]}。
|
|
155
33
|
|
|
156
34
|
动态事实 schema:
|
|
157
35
|
${h}
|
|
158
36
|
|
|
159
37
|
资料:
|
|
160
|
-
${f}`);return i?.facts?.length?{facts:i.facts.filter(a=>a.key&&a.value).map(a=>{let b=g.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:a.value,sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${i.facts.length} 条事实`}]}:{facts:[],stages:e}}function
|
|
161
|
-
|
|
162
|
-
${aj(a.filePath,a.semanticTitle)}`).join("\n\n")}async function al(a,b,c,d,e,f,g,h="",i={}){let j=H(G(b,c));if(!j.trim()&&!h.trim())return;let k=["你是专业项目文档生成专家,必须严格使用知识库证据、文件角色、提示词角色、角色节点结构化产物和文档规范包生成正式文档章节。","准确性优先级:章节计划/示范文本节点产物 > 规范包事实字段 > 角色节点结构化事实 > 知识库证据 > 项目上下文/历史记忆。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。",i.forbidDrawingImages?"图纸资料只作为文本、标注、规格、位置、材料、数量等事实依据;禁止插入图纸图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块;不要输出“资料不足”等调试话术。",e].filter(Boolean).join("\n\n"),l=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
163
|
-
${f}`:"",h||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的招标文件章节,要求:","- 保留章节二级标题,并按章节计划逐项响应;","- 必须使用示范文本节点提取的章节要求和输出规范;","- 必须结合清单、图纸文本事实、项目事实、技术规范等角色节点产物;","- 图纸默认只作为文本事实来源,不要插入图纸图片;","- 有编制依据、项目适配分析、具体措施、实施要点、风险与注意事项;","- 引用表格、PDF/Word、文本、附件等资料时写清楚来源文件名;",`- 内容不少于 ${i.minWords||1e3} 字,避免空泛口号。`,"",j?"知识库证据:":"",j].filter(Boolean).join("\n"),m=await X(k,l);if(m&&!(m.length<120))return R(m.startsWith("## ")?m:`## ${b.title}
|
|
38
|
+
${f}`);return i?.facts?.length?{facts:i.facts.filter(a=>a.key&&a.value).map(a=>{let b=g.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key);return{key:b?.name||a.key,fieldId:b?.id||a.fieldId,fieldName:b?.name||a.fieldName,value:M(a.value),sourceFile:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType,confidence:a.confidence??.8,sourceRef:{filePath:a.sourceFile||"",roleId:a.roleId||"llm",processingType:a.processingType}}}),stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${i.facts.length} 条事实`}]}:{facts:[],stages:e}}function ad(a){return/出现禁用文本|资料未提供|导出|临时|无效|占位/iu.test(a.message)}function ae(a,b){return`${a.name}:${b}`}async function af(a,b,c,d,e,f,g,h="",i={}){let j=F(E(b,c));if(!j.trim()&&!h.trim())return;let k=["你是专业项目文档生成专家,必须严格使用已提供的内部资料生成正式文档章节。",V,"准确性优先级:章节计划/示范文本节点产物 > 规范包事实字段 > 角色节点结构化事实 > 知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能作为用户偏好、历史纠偏和连续性参考;不得覆盖、替代或改写知识库证据中的事实。",i.forbidDrawingImages?"图纸资料只作为文本、标注、规格、位置、材料、数量等事实依据;禁止插入图纸图片或 Markdown 图片语法。":"","不要编造资料;可以基于证据做合理归纳;输出 Markdown;不要输出代码块。",e].filter(Boolean).join("\n\n"),l=[`文档模板:${a.name}`,`章节标题:${b.title}`,`章节目的:${b.purpose}`,g?`用户要求:${g}`:"",f?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
39
|
+
${f}`:"",h||"",d.length?`需要特别补足的事实:${d.join("、")}`:"","请生成一个专业、充实、可直接导出的正式施工组织设计章节,要求:","- 保留章节二级标题,并按章节计划逐项响应;","- 必须使用示范文本节点提取的章节要求和输出规范;","- 必须结合清单、图纸文本事实、项目事实、技术规范等内部资料;","- 图纸默认只作为文本事实来源,不要插入图纸图片;","- 将项目概况、施工范围、图纸和清单要点自然融入施工措施,不单列证据或来源章节;","- 组织架构、关键线路、施工流程、职责分工、资源配置、重难点分析必须优先表格化表达;",`- 内容不少于 ${i.minWords||1e3} 字,避免空泛口号。`,"",j?"知识库证据:":"",j].filter(Boolean).join("\n"),m=await _(k,l);if(m&&!(m.length<120))return U(Q(m.startsWith("## ")?m:`## ${b.title}
|
|
164
40
|
|
|
165
|
-
${m}`,!!i.forbidDrawingImages)}async function
|
|
166
|
-
${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","
|
|
167
|
-
${a.content}`).join("\n\n"),
|
|
168
|
-
${c.requirements.map(a=>`- ${a.title}:${a.requirementText||a.requiredContents.join("、")}`).join("\n")}`:""].filter(Boolean).join("\n"):"",f=new Map;for(let{artifact:a,fact:b}of d){let c=`${a.node.fileRoleName}(${a.node.outputType})`;f.set(c,[...f.get(c)||[],`- ${b.key}:${b.value}(来源:${b.sourceFile})`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
|
|
41
|
+
${m}`,!!i.forbidDrawingImages))}async function ag(a){let b=F(E({id:"review",title:"全文审查",purpose:"审查全文证据和资源关系",queries:[],requiredFacts:[]},a.evidence)),c=a.spec?[`规范包:${a.spec.name}`,`事实字段:${a.spec.factFields.map(a=>`${a.name}${a.required?"(必需)":""}`).join("、")}`,"dynamic"===a.spec.chapterMode?`章节规则:动态章节|来源=${a.spec.dynamicChapterRule.source}|标题=${a.spec.dynamicChapterRule.titleStrategy||"ai_summary"}|${a.spec.dynamicChapterRule.generationHint||"由资料自动规划"}`:`章节规则:${a.spec.chapterRules.map(a=>`${a.title}${a.minWords?`≥${a.minWords}字`:""}`).join("、")}`,`门禁规则:${a.spec.gateRules.map(a=>`${a.name}:${a.type}`).join("、")}`].join("\n"):"未绑定文档规范包。",d=await _(["你是文档质量审查与优化专家。你要基于内部资料对初稿进行二次审查和优化,使其成为正式施工组织设计正文。",V,"准确性优先级:文档规范包/模板要求 > 已绑定或人工确认的知识库证据 > 自动检索知识库证据 > 项目上下文/历史记忆。内部优先级只用于判断事实,不得写入正文。","项目上下文/历史记忆只能用于风格偏好、历史纠偏和连续性检查;如果与知识库证据冲突,必须以知识库证据为准。","必须保持 Markdown 输出;保留已有正式标题层级和表格;不得保留或新增证据来源、资料来源、缺失项、校验结果等后台信息。","图纸资料默认只作为文本事实依据,除非用户明确要求插图,否则不要插入图纸图片或 Markdown 图片语法。","重点检查:正式章节完整性、清单和图纸事实内化使用、表格呈现、表达专业性、导出友好性。",a.promptTexts].filter(Boolean).join("\n\n"),[`模板:${a.template.name}`,a.requirement?`用户要求:${a.requirement}`:"",a.projectContext?`项目上下文/历史记忆(仅作偏好、历史纠偏和连续性参考;如与知识库证据冲突,以知识库证据为准):
|
|
42
|
+
${a.projectContext}`:"",c,"","知识库证据摘要:",b,"","待审查初稿:",a.markdown,"","请直接返回优化后的完整正式 Markdown,不要附加解释。"].filter(Boolean).join("\n"));return d&&!(d.length<.7*a.markdown.length)&&d.includes("#")?{markdown:U(d),stage:{type:"llm_review",roleId:"llm-review",status:"success",message:"已完成 LLM 二次审查与优化"}}:{markdown:a.markdown,stage:{type:"llm_review",roleId:"llm-review",status:"skipped",message:"无可用模型或审查结果不可用,保留生成初稿"}}}function ah(a){let b=a.chapters.map(a=>U(a.content)).filter(Boolean).join("\n\n");return U(['<div class="document-cover">',`# ${a.title}`,"","</div>","",'<div class="page-break"></div>',"","## 目录","",...a.chapters.map((a,b)=>`${b+1}. ${a.title}`),"",'<div class="page-break"></div>',"",b].join("\n"))}function ai(a){if(a?.aborted)throw Error("用户中止")}async function aj(a){ai(a.signal);let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=e.resolve(a.projectRoot||(0,j.aY)());if(!c)throw Error("No knowledge base project found");let g=(0,j.Qh)(),h=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),i=X(b),l=Y(b),o=(0,n.py)(b.documentSpecId),p=u(i).map(a=>`## [${a.roleId}] ${a.name}
|
|
43
|
+
${a.content}`).join("\n\n"),q=a=>[a,e.isAbsolute(a)?e.relative(c,a):e.join(c,a)],r=new Set(l.flatMap(a=>q(a.filePath))),s=(0,m.XB)("file"),t=new Map(l.flatMap(a=>q(a.filePath).map(b=>[b,a.roleId]))),v=new Map(l.flatMap(a=>q(a.filePath).map(b=>[b,s.find(b=>b.id===a.roleId)?.processingType||"reference"]))),x=await g.getProject(c);await x.incrementalIndex(),ai(a.signal);let y=[],z=[],A=[],D=[],E=[],F=function(a,b){let c=(0,m.XB)("file"),d=(0,m.XB)("prompt"),e=u(b),f=Y(a),g=new Map;for(let a of f)g.set(a.roleId,[...g.get(a.roleId)||[],a.filePath]);let h=c.filter(a=>g.has(a.id)),i=d.filter(a=>e.some(b=>b.roleId===a.id));return h.map((a,b)=>{let c=i.map(b=>{let c=e.filter(a=>a.roleId===b.id).map(a=>a.content);return{promptRole:b,texts:c,score:function(a,b,c){let d=K(`${a} ${c.join(" ")}`),e=0;for(let a of(/fact|抽取|读取|提取|理解|reference/u.test(d)&&(e+=5),/chapter_generation|章节生成|正文生成/u.test(d)&&(e+=1),[b.id,b.name,b.processingType||""].filter(Boolean)))d.includes(K(a))&&(e+=4);return/示范文本|招标文件|章节|目录|输出要求/u.test(`${b.name} ${c.join(" ")}`)&&/示范文本|章节|目录|输出要求|编制要求/u.test(d)&&(e+=6),/清单|工程量/u.test(`${b.name} ${c.join(" ")}`)&&/清单|工程量|项目特征/u.test(d)&&(e+=6),/图纸|drawing|cad/u.test(`${b.name} ${c.join(" ")}`)&&/图纸|drawing|cad|文本|标注/u.test(d)&&(e+=6),e}(b.id,a,c)}}).sort((a,b)=>b.score-a.score),d=c.filter(a=>a.score>=5).slice(0,2),f=c[b]||c[0],h=d.length>0?d:f?[f]:[],j=h.map(a=>a.promptRole.id),k=h.flatMap(a=>a.texts);return{id:`node-${a.id}`,fileRoleId:a.id,fileRoleName:a.name,filePaths:g.get(a.id)||[],processingType:a.processingType,promptRoleIds:j,promptTexts:k,outputType:function(a,b=[]){let c=K(`${a.id} ${a.name} ${a.processingType||""} ${b.join(" ")}`);return/示范文本|招标文件|章节|目录|输出要求|编制要求|template|tender/u.test(c)?"template_requirements":/清单|工程量|bill|boq|quantity/u.test(c)?"bill_facts":/图纸|drawing|cad|设计图|图纸解析/u.test(c)?"drawing_facts":/规范|标准|spec|technical/u.test(c)?"technical_facts":/项目|工程概况|事实|fact/u.test(c)?"project_facts":"reference_facts"}(a,k)}})}(b,i),R=[];for(let b of F){ai(a.signal);let d=function(a,b,c){let d=[];for(let e of b.filePaths){let f=a.getFileDetail(e);if(f){d.push(...f.chunks.slice(0,120).map(a=>({chapterId:b.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:b.fileRoleId,processingType:b.processingType,sectionTitle:a.sectionTitle,source:"role-node"})));continue}d.push(...C(e,b.fileRoleId,b.processingType,b.id,c))}return B(d,120)}(x,b,c);z.push(...d);let e=await N(b,d);R.push(e),E.push({type:"file_understanding",roleId:b.fileRoleId,promptId:b.promptRoleIds[0],status:d.length>0?"success":"fallback",message:`${b.fileRoleName} 节点已按绑定提示词读取,产出章节 ${e.chapters.length} 个、事实 ${e.facts.length} 条`}),a.onProgress?.([...E])}let S=function(a){let b=a.filter(a=>"template_requirements"===a.node.outputType).flatMap(a=>a.chapters),c=new Map;for(let a of b.sort((a,b)=>a.order-b.order))c.has(a.title)||c.set(a.title,a);return[...c.values()]}(R),T=[b.name,b.outputTitle,a.requirement,o?.dynamicChapterRule?.generationHint,...o?.dynamicChapterRule?.sourceRoleIds||[]].filter(Boolean).join(" "),V=o?.chapterMode==="dynamic"&&0===S.length?(await g.search(c,T||b.name,{scope:"project",limit:20,weights:{keyword:.45,vector:.35,rewrite:.65,hybridBonus:.1}})).results.map(a=>({chapterId:"dynamic-planning",filePath:a.filePath,score:a.score,content:a.content,roleId:t.get(a.filePath),processingType:v.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})):[],Z=o?.chapterMode==="dynamic"&&S.length>0?S.map((a,b)=>({id:L(a.id,`dynamic-${b+1}`),title:a.title,purpose:[a.sourceRequirement,...a.writingRules].filter(Boolean).join("\n").slice(0,1200),requiredFacts:[...new Set([...a.requiredContents,...a.evidenceNeeds])],queries:[...new Set([a.title,...a.requiredContents,...a.evidenceNeeds,...a.requirements.flatMap(a=>[a.title,a.requirementText,...a.evidenceNeeds])].filter(Boolean))],pinnedEvidenceFilePaths:[]})):G(b,o,V),$=[b.name,b.outputTitle,a.requirement,...Z.flatMap(a=>[a.title,a.purpose])].filter(Boolean).join(" "),_=(0,k.Hh)($,8,c),aa=_.length>0?_.map((a,b)=>`${b+1}. [${a.type}/${a.importance}] ${a.content}${a.source?`(来源:${a.source})`:""}`).join("\n"):"",aj={type:"context_recall",roleId:"project-memory",status:_.length>0?"success":"skipped",message:_.length>0?`已注入 ${_.length} 条短期/长期上下文`:"未召回可用项目上下文"};for(let d of(E.push({type:"role_binding",roleId:b.projectRoleConfigId||"none",status:"success",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`}),E.push(aj),a.onProgress?.([...E]),Z)){ai(a.signal);try{let e=[],f=function(a,b){return b.find(b=>b.id===a.id||b.title===a.title)}(d,S),j=f?[f.title,...f.requiredContents,...f.evidenceNeeds,...f.requirements.flatMap(a=>[a.title,a.requirementText,...a.requiredContents,...a.evidenceNeeds])].filter(Boolean):[];for(let a of[...new Set([...d.queries.length>0?d.queries:[b.name,b.outputTitle,d.title],...j])]){let b=await g.search(c,a,{scope:"project",limit:Math.max(h,r.size>0?30:h),weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});e.push(...b.results.filter(a=>0===r.size||r.has(a.filePath)).map(a=>({chapterId:d.id,filePath:a.filePath,score:a.score,content:a.content,roleId:t.get(a.filePath),processingType:v.get(a.filePath),sectionTitle:a.sectionTitle,source:a.source})))}let k=new Set(d.pinnedEvidenceFilePaths||[]),l=O(R,d,f);for(let a of(e.push(...l.flatMap(({artifact:a})=>a.evidence.slice(0,8).map(a=>({...a,chapterId:d.id,source:"role-node"})))),new Set([...k]))){let b=k.has(a),f=x.getFileDetail(a);if(!f){e.push(...C(a,t.get(a),v.get(a),d.id,c).map(a=>({...a,source:b?"pinned-evidence":a.source})));continue}e.push(...f.chunks.slice(0,Math.max(h,20)).map(a=>({chapterId:d.id,filePath:f.file.relativePath,score:1,content:a.content,roleId:t.get(f.file.relativePath),processingType:v.get(f.file.relativePath),sectionTitle:a.sectionTitle,source:b?"pinned-evidence":"bound-file"})))}let m=B(e,h);z.push(...m);let n=d.requiredFacts.filter(a=>!m.some(b=>H(b,a)));for(let a of(0===m.length&&A.push(`${d.title}:未检索到明确资料依据`),n))A.push(`${d.title}:${a} 未检索到明确依据`);E.some(a=>"knowledge_retrieval"===a.type)||(E.push({type:"knowledge_retrieval",roleId:"knowledge-base",status:z.length>0?"success":"fallback",message:`已检索/绑定 ${z.length} 条证据`}),a.onProgress?.([...E])),ai(a.signal);let o=P(R,b),q=function(a,b,c){let d=O(a,b,c),e=c?[`章节来源要求:${c.sourceRequirement}`,c.requiredContents.length?`必须包含:${c.requiredContents.join("、")}`:"",c.writingRules.length?`写作规范:${c.writingRules.join("、")}`:"",c.evidenceNeeds.length?`需要证据:${c.evidenceNeeds.join("、")}`:"",c.requirements.length?`要求项:
|
|
44
|
+
${c.requirements.map(a=>`- ${a.title}:${a.requirementText||a.requiredContents.join("、")}`).join("\n")}`:""].filter(Boolean).join("\n"):"",f=new Map;for(let{artifact:a,fact:b}of d){let c=`${a.node.fileRoleName}(${a.node.outputType})`;f.set(c,[...f.get(c)||[],`- ${b.key}:${M(b.value)}(来源:${b.sourceFile})`])}let g=[...f.entries()].map(([a,b])=>`### ${a}
|
|
169
45
|
${b.slice(0,18).join("\n")}`).join("\n\n");return[e?`【本章章节计划】
|
|
170
46
|
${e}`:"",g?`【角色节点结构化产物】
|
|
171
|
-
${g}`:""].filter(Boolean).join("\n\n")}(V,e,g),t=await Promise.race([al(c,e,n,o,q,ae,a.requirement,r,{forbidDrawingImages:p,minWords:g?.minWords||1200}),new Promise(a=>setTimeout(()=>a(null),6e4))]);ao(a.signal);let w=t||(b=c.id,"delta-force-hot-operators-guide"===b?function(a,b,c){var d;let e=function(a){let b=a.find(a=>a.filePath.endsWith(".csv")&&a.content.includes("干员名称"));if(!b)return"";let c=b.content.trim().split(/\r?\n/u).filter(Boolean);return c.length<2?"":["| 干员 | 定位 | 推荐指数 | 上手难度 | 推荐场景 |","|---|---|---:|---|---|",...c.slice(1).map(a=>a.split(",").map(a=>a.trim())).map(a=>`| ${a[0]||""} | ${a[1]||""} | ${a[2]||""} | ${a[3]||""} | ${a[4]||""} |`)].join("\n")}(b),f=G(a,b),g=0===(d=f.resources).length?"- 未从知识库检索到可引用资源。":d.slice(0,12).map(a=>`- ${a.semanticTitle}(${a.kind}):${a.filePath};用途:${a.contentUse}`).join("\n"),h=ak(f.resources,"map"),i=ak(f.resources,"image"),j={overview:[`## ${a.title}`,"","这份攻略面向刚开始接触《三角洲行动》的玩家,以及想快速理解队伍分工的进阶玩家。核心目标是:先知道热门干员各自负责什么,再根据地图和队伍需求选择合适组合。","","建议阅读方式:先看推荐表,再看队伍搭配,最后结合官方完整地图图纸理解路线。"],operators:[`## ${a.title}`,"",e||"| 干员 | 定位 | 推荐场景 |\n|---|---|---|\n| 露娜 | 侦察 | 信息侦察和路线判断 |\n| 红狼 | 突击 | 突破和正面交火 |\n| 牧羊人 | 工程 | 防守控场和区域封锁 |\n| 蜂医 | 支援 | 治疗救援和续航 |","","### 干员配图","",i||[["露娜","图片素材/干员图片/露娜.png"],["红狼","图片素材/干员图片/红狼.png"],["牧羊人","图片素材/干员图片/牧羊人.png"],["蜂医","图片素材/干员图片/蜂医.png"]].map(([a,b])=>`### ${a}
|
|
172
|
-
|
|
173
|
-
${aj(b,`${a}干员形象`)}`).join("\n\n"),"","- 露娜:适合先手获取信息,帮队伍判断推进方向。","- 红狼:适合打开突破口,但不要脱离队伍单人深入。","- 牧羊人:适合守点、卡入口和限制敌方推进。","- 蜂医:适合新手优先练习,能显著提高队伍容错。"],loadout:[`## ${a.title}`,"","推荐新手队伍至少包含一名侦察和一名支援。侦察负责信息,支援负责救援和续航。需要主动进攻时加入红狼,需要防守或卡点时加入牧羊人。","","常见组合:露娜 + 蜂医 + 红狼,适合主动推进;露娜 + 蜂医 + 牧羊人,适合稳扎稳打和守关键区域。"],tables:[`## ${a.title}`,"",e||"推荐表暂未生成,请检查表格数据。","","推荐指数用于新手决策参考,不代表绝对强度。实际选择还要结合地图、队友位置和任务目标。"],maps:[`## ${a.title}`,"","本章不会硬插固定地图,而是根据知识库检索到的地图、图片、表格、文档附件等资源证据组织内容。","",g,"",h?"### 官方完整地图图纸预览":"","",h,"","使用建议:先在完整地图上确认主要区域和撤离/交战路线,再决定侦察位观察点、突击位推进线、工程位控场点和支援位救援路线。"],tips:[`## ${a.title}`,"","- 不要只看干员强度,先看队伍缺什么位置。","- 新手优先保证“侦察信息 + 支援续航”,再考虑高风险突破。","- 推进前先用地图确认路线,避免全队挤在同一入口。","- 防守时让工程位处理关键入口,支援位保持在能救人的安全距离。"]}[a.id]||[`## ${a.title}`,"",b.length?`本章根据已绑定知识库资料整理:${a.purpose}`:"本章缺少明确资料。"];return c.length>0&&j.push("","### 需人工复核",...c.map(a=>`- ${a}`)),j.join("\n")}(e,n,o):[`## ${e.title}`,"",n.length>0?`本章根据知识库资料整理:${e.purpose}`:"模板绑定资料未检索到明确内容,需进一步确认。","",...n.slice(0,5).map(a=>`- ${a.filePath}:${a.content.replace(/\s+/gu," ").slice(0,180)}`),...o.length>0?["","### 待确认事项",...o.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)]:[]].join("\n"));C.push({type:"chapter_generation",roleId:"chapter_generation",promptId:j.find(a=>"chapter_generation"===a.roleId)?.promptId,status:t?"success":"fallback",message:t?`${e.title} 已由大模型生成`:`${e.title} 使用本地专业兜底生成`}),z.push({id:e.id,title:e.title,content:w,evidence:n,missingFacts:o})}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${e.title} failed:`,b),C.push({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${e.title} 生成失败`})}F.some(a=>"chapter_generation"===a.type&&a.message===C[C.length-1]?.message)||F.push(C[C.length-1]),a.onProgress?.([...F])}ao(a.signal);let ag={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{ag=await Z(d,A)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(ao(a.signal),ag.notes))A.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let ah=function(a,b,c){let d={};for(let e of K(a,c)){let a=b.find(a=>L(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(c,A,p);for(let a of V)for(let b of a.facts)ah[b.key]=`${b.value}(来源:${b.sourceFile},角色:${b.roleId})`;let ap=function(a,b,c){let d=[["工程名称",/工程名称[::\s]+([^\n,。;;]+)/u],["工程地点",/(?:工程地点|建设地点)[::\s]+([^\n,。;;]+)/u],["建设单位",/建设单位[::\s]+([^\n,。;;]+)/u],["工期要求",/(?:工期|计划工期)[::\s]+([^\n,。;;]+)/u],["质量目标",/质量目标[::\s]+([^\n,。;;]+)/u],["安全目标",/安全目标[::\s]+([^\n,。;;]+)/u],["施工范围",/(?:施工范围|招标范围)[::\s]+([^\n]+)/u],["攻略目标",/攻略目标[::\s]+([^\n]+)/u],["适用人群",/适用人群[::\s]+([^\n]+)/u],["干员名称",/(?:热门干员|干员)[::\s\n-]+([^\n]+)/u],["定位",/(?:定位|职责)[::\s]+([^\n,。;;]+)/u],["推荐指数",/推荐指数[::\s,,]+([^\n,。;;]+)/u],["实战技巧",/实战技巧[::\s]+([^\n]+)/u]],e=K(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),f=[];for(let b of a){for(let{field:a,pattern:c}of e){if(!L(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],e=d?.[1]?.trim();e&&!f.some(b=>b.fieldId===a.id&&b.value===e)&&f.push({key:a.name,fieldId:a.id,fieldName:a.name,value:e.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}for(let[a,c]of d){let d=b.content.match(c);d?.[1]&&!f.some(b=>b.key===a&&b.value===d[1].trim())&&f.push({key:a,value:d[1].trim().slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}}return f}(A,c,p),aq={facts:[],stages:[]};try{aq=await $(A,q,c,p)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}ao(a.signal);let ar=[...V.flatMap(a=>a.facts.map(a=>({key:a.key,value:a.value,sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...ap,...aq.facts];for(let a of(F.some(a=>a.type===ag.stage.type)||F.push(ag.stage),aq.stages))F.some(b=>b.type===a.type)||F.push(a);a.onProgress?.([...F]);let as=function(a){let b=[],c=new Set;for(let d of a.filter(a=>"table"===a.processingType)){if(c.has(d.filePath))continue;c.add(d.filePath);let a=(0,k.aY)(),h=f.isAbsolute(d.filePath)?d.filePath:e.existsSync(f.join(a,"knowledgeBase",d.filePath))?f.join(a,"knowledgeBase",d.filePath):f.join(a,d.filePath),i=f.extname(d.filePath).toLowerCase();if(e.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=g.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let e=a.Sheets[c],f=g.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let h=f.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=f[h].filter(Boolean),j=f.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:d.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:d.filePath,sourceRange:e["!ref"]})}continue}catch{}let j=d.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(j.length<2)continue;let l=j[0].includes("|")?"|":j[0].includes(" ")?" ":",",m=j.map(a=>a.split(l).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:d.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:d.filePath,sourceRange:d.sectionTitle})}return b}(A),at=A.filter(a=>"pinned-evidence"===a.source).length,au=A.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,av={type:"reference",roleId:"quality-enhancement",status:A.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${A.length} 条,人工确认/固定证据 ${at} 条,项目上下文 ${ad.length} 条,自动检索证据 ${au} 条`};for(let b of(F.push(av),a.onProgress?.([...F]),ar))ah[b.key]=`${b.value}(来源:${b.sourceFile},角色:${b.roleId})`;let aw=new Map;for(let a of A)aw.set(a.filePath,(aw.get(a.filePath)??0)+1);let ax=[...aw.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),ay=function(a,b=[],c=[],d){let e=b=>a.filter(a=>b.some(b=>a.key.includes(b))),f=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b));return{project:e(["工程名称","工程地点","建设单位","施工范围","攻略目标","适用人群","干员名称","定位","推荐指数"]),schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),rules:f("rule"),specifications:f("specification"),schemaFacts:function(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}(a,d),missing:[...new Set(c)],conflicts:function(a,b){let c=b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.key))],d=[];for(let b of c){let c=a.filter(a=>a.key===b||a.fieldName===b),e=new Map;for(let a of c){let b=a.value.replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(ar,as,B,p),az=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} 内容较短,建议人工补充或重新生成`);if(!d?.documentSpecId)for(let a of["工程名称","工期要求","质量目标","施工范围"])b[a]||c.some(b=>b.key===a)||e.push(`${a} 未形成明确事实,请人工确认`);d&&0===U(d).length&&f.push("模板未绑定任何知识库文件"),d&&0===T(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}}(z,ah,ar,c),aA=function(a,b,c,d){let e=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return d?.documentSpecId||0!==b.project.length||e.push({level:"error",message:"项目基础事实缺失",suggestion:"请在项目事实文件角色中绑定包含工程概况的资料。"}),c.some(a=>a.content.includes("资料未提供"))&&e.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&e.push(...b.conflicts.map(a=>({level:"error",message:a}))),e}(az,ay,z,c),aB="delta-force-hot-operators-guide"===c.id?[await ai(c,j,A,d)]:[],aC=[{type:"role_binding",roleId:c.projectRoleConfigId||"none",status:m.length>0?"success":"fallback",message:`已绑定 ${m.length} 个文件角色、${j.length} 个提示词角色`},af,{type:"knowledge_retrieval",roleId:"knowledge-base",status:A.length>0?"success":"fallback",message:`已检索/绑定 ${A.length} 条证据`},av,ag.stage,...aq.stages,...C,...aB.map(a=>({type:"asset_generation",roleId:"delta-cover-image-prompt",status:"fallback"===a.status?"fallback":"success",message:a.message})),{type:"validation",roleId:"document-workflow",status:az.errors.length>0?"failed":"success",message:`错误 ${az.errors.length},警告 ${az.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"},{type:"export_ready",roleId:"document-workflow",status:az.errors.length>0?"failed":"success",message:az.errors.length>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"}],aD={templateId:c.id,templateName:c.name,title:c.outputTitle,requirement:a.requirement||"",facts:ah,structuredFacts:ar,factsModel:ay,chapters:z,sources:ax,missingItems:[...new Set(B)],validation:az,validationIssues:aA,executionStages:aC,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:aB,generatedAt:Date.now()},aE=an(aD);ao(a.signal);let aF=await am({template:c,spec:p,markdown:aE,evidence:A,promptTexts:q,projectContext:ae,requirement:a.requirement});ao(a.signal);let aG=Q(V,c),aH=R(aF.markdown===aE?an({...aD,validationIssues:aA,exportGate:aD.exportGate,executionStages:aC}):aF.markdown,aG),aI=function(a,b,c,d,e){let f=[];for(let b of c)for(let c of(a.includes(b.title)||f.push(`缺少动态章节:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&f.push(`${b.title} 未覆盖必写内容:${c}`);for(let a of b){let b=c.find(b=>b.title===a.title),d=b?.minWords||1e3;a.content.length<d&&f.push(`${a.title} 内容深度不足:${a.content.length}/${d}`)}return d.some(a=>"bill_facts"===a.node.outputType)&&!/清单|工程量|项目特征|数量|单位/u.test(a)&&f.push("未体现清单文件读取结果"),d.some(a=>"drawing_facts"===a.node.outputType)&&!/图纸|设计|标注|材料|规格|位置|系统|构件/u.test(a)&&f.push("未体现图纸文本事实"),e&&/!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)/iu.test(a)&&f.push("正文包含不应插入的图纸图片"),[...new Set(f)].slice(0,40)}(aH,z,W,V,aG),aJ=await S({markdown:aH,template:c,plan:W,artifacts:V,promptTexts:q,requirement:a.requirement,issues:aI,forbidDrawingImages:aG});ao(a.signal);let aK=aJ.stage?[...aC,aF.stage,aJ.stage]:[...aC,aF.stage],aL=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&_(a))},{key:"project_facts",label:"项目基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))}],e=a.filter(a=>"error"===a.level&&_(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(aA=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>L(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>L(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}if("fixed"===a.chapterMode)for(let b of a.chapterRules.filter(a=>a.required)){k.has(b.title)||h.push({level:"error",message:`必需章节缺失:${b.title}`,suggestion:"请在模板或规范包章节规则中补齐章节。"});let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&h.push({level:"warning",message:`章节内容低于最低字数:${b.title}`,suggestion:`建议不少于 ${b.minWords} 字。`})}else{let b=a.dynamicChapterRule;if(b.minChapters&&d.length<b.minChapters&&h.push({level:"warning",message:`动态章节数量低于最少章节:${d.length}/${b.minChapters}`,suggestion:"请补充资料或降低最少章节数。"}),b.maxChapters&&d.length>b.maxChapters&&h.push({level:"warning",message:`动态章节数量超过最多章节:${d.length}/${b.maxChapters}`,suggestion:"请收紧来源文件角色或降低召回范围。"}),b.minWordsPerChapter)for(let a of d)a.content.length<b.minWordsPerChapter&&h.push({level:"warning",message:`动态章节内容低于最低字数:${a.title}`,suggestion:`建议不少于 ${b.minWordsPerChapter} 字。`})}let l=e.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a)),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0}));for(let b of a.gateRules){let a=b.level,n=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},o=n.target||b.target||"",p=n.value||b.value||o,q=n.min||Number(b.value)||1,r=d.find(a=>a.title===o),s="chapter"===n.subject&&r?r.content:e,t=p?function(a){try{return RegExp(a,"iu")}catch{return}}(p):void 0;"fact"===n.subject&&"exists"===n.operator&&o&&!j.has(o)&&h.push({level:a,message:aa(b,`缺少事实 ${o}`)}),"chapter"===n.subject&&"exists"===n.operator&&o&&!k.has(o)&&h.push({level:a,message:aa(b,`缺少章节 ${o}`)}),"file_role"===n.subject&&"exists"===n.operator&&o&&!f.some(a=>a.roleId===o)&&h.push({level:a,message:aa(b,`缺少文件角色 ${o}`)}),"prompt_role"===n.subject&&"exists"===n.operator&&o&&!g.some(a=>a.roleId===o)&&h.push({level:a,message:aa(b,`缺少提示词角色 ${o}`)}),"document"===n.subject&&"contains"===n.operator&&p&&!e.includes(p)&&h.push({level:a,message:aa(b,`全文必须包含 ${p}`)}),"document"===n.subject&&"not_contains"===n.operator&&p&&e.includes(p)&&h.push({level:a,message:aa(b,`出现禁用文本 ${p}`)}),"document"!==n.subject&&"chapter"!==n.subject||"regex_match"!==n.operator||!p||t&&t.test(s)||h.push({level:a,message:aa(b,`未匹配正则 ${p}`)}),("document"===n.subject||"chapter"===n.subject)&&"regex_not_match"===n.operator&&t?.test(s)&&h.push({level:a,message:aa(b,`匹配到禁止正则 ${p}`)}),"chapter"===n.subject&&"contains"===n.operator&&o&&p&&(!r||!r.content.includes(p))&&h.push({level:a,message:aa(b,`章节 ${o} 必须包含 ${p}`)}),"chapter"===n.subject&&"not_contains"===n.operator&&r?.content.includes(p)&&h.push({level:a,message:aa(b,`章节 ${o} 出现禁用文本 ${p}`)}),"chapter"===n.subject&&"min_length"===n.operator&&o&&(!r||r.content.length<q)&&h.push({level:a,message:aa(b,`章节 ${o} 低于 ${q} 字`)}),"table"===n.subject&&"min_count"===n.operator&&c.tables.length+l.length<q&&h.push({level:a,message:aa(b,`表格数量少于 ${q}`)}),"table"===n.subject&&"table_explanation_required"===n.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:aa(b,"存在缺少说明文字的表格")}),"image"===n.subject&&"min_count"===n.operator&&m.length<q&&h.push({level:a,message:aa(b,`图片数量少于 ${q}`)}),"image"===n.subject&&"image_caption_required"===n.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:aa(b,"存在缺少说明文字的图片")}),"source"===n.subject&&"all_have_source"===n.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:aa(b,"存在无来源事实")}),"source"===n.subject&&"min_count"===n.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<q&&h.push({level:a,message:aa(b,`来源数量少于 ${q}`)})}return h}(p,[...aA,...aI.map(a=>({level:"warning",message:a}))],ay,z,aJ.markdown,m,j),ay,z),aM={...aD,validationIssues:aA,exportGate:aL,executionStages:aK},aN="delta-force-hot-operators-guide"===c.id?function(a,b,c){if("delta-force-hot-operators-guide"!==b.id||/!\[[^\]]*(?:地图|图纸|零号大坝|航天基地|巴克什|潮汐监狱|AZ3|攀升)[^\]]*\]\([^)]*地图图纸-[^)]*\)/u.test(a))return a;let d=ak(G({id:"maps",title:"第五章 官方地图图纸和路线理解",purpose:"补齐地图图纸预览",queries:[],requiredFacts:["地图图纸"]},c).resources,"map");if(!d)return a;let e=`
|
|
174
|
-
|
|
175
|
-
### 官方完整地图图纸预览
|
|
176
|
-
|
|
177
|
-
${d}
|
|
178
|
-
`,f=a.match(/^## 第五章 官方地图图纸和路线理解\s*$/mu);if(!f||void 0===f.index)return`${a.trimEnd()}${e}
|
|
179
|
-
`;let g=f.index+f[0].length;return`${a.slice(0,g)}${e}${a.slice(g)}`}(aJ.markdown,c,A):R(aJ.markdown,aG);return{...aM,markdown:aN}}async function aq(a){let b=y(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,k.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,k.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=D(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",j=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!j.has(a)&&!h.some(b=>J(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(F),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>r,FV:()=>q,Mu:()=>s,NR:()=>t,XB:()=>o,dg:()=>p,dw:()=>u});var d=c(73024),e=c(48161),f=c(76760);let g=[{id:"delta-rule-files",name:"三角洲攻略规则文件",description:"大白话:告诉系统这篇攻略要遵守什么写作规则和输出要求。",type:"file",processingType:"rule",resourceIds:["文档资料/规则文件-攻略写作要求.md"]},{id:"delta-fact-files",name:"三角洲干员事实文件",description:"大白话:存放干员、定位、地图和打法这些真实攻略资料。",type:"file",processingType:"project_fact",resourceIds:["文档资料/项目事实-热门干员资料.md"]},{id:"delta-table-files",name:"三角洲干员表格数据",description:"大白话:存放可以被解析成表格的数据,比如推荐指数、难度、职责。",type:"file",processingType:"table",resourceIds:["表格数据/表格数据-热门干员推荐.csv","表格数据/表格数据-热门干员推荐.xlsx","表格数据/表格数据-热门干员推荐.xls"]},{id:"delta-drawing-files",name:"三角洲官方地图图纸文件",description:"大白话:绑定官方地图工具里的真实地图底图/图纸瓦片,用来在攻略和 PDF 中展示地图,并说明地图来源。",type:"file",processingType:"drawing",resourceIds:["图纸文件/图纸文件-官方地图图纸来源.md","图片素材/干员图片/地图图纸-零号大坝-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-航天基地-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-巴克什-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-潮汐监狱-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-AZ3-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-全面战场-攀升官方完整地图图纸.jpg"]},{id:"delta-spec-files",name:"三角洲攻略规范文件",description:"大白话:告诉系统攻略应该包含哪些章节、怎么写、怎么校验。",type:"file",processingType:"specification",resourceIds:["文档资料/规范文件-攻略结构规范.md"]},{id:"delta-doc-files",name:"三角洲 Word/PDF 附件资料",description:"大白话:覆盖 PDF、DOC、DOCX 等常见文档格式,验证用户上传文档类资料也能参与生成。",type:"file",processingType:"reference",resourceIds:["文档资料/PDF资料-官方攻略摘录.pdf","文档资料/Word资料-队伍搭配说明.doc","文档资料/Word资料-队伍搭配说明.docx"]},{id:"delta-image-files",name:"三角洲干员图片资料",description:"大白话:存放干员图片来源和本地图片文件,生成攻略时用于说明配图来源。",type:"file",processingType:"reference",resourceIds:["图片素材/图片文件-干员图片来源.md","图片素材/干员图片/露娜.png","图片素材/干员图片/红狼.png","图片素材/干员图片/牧羊人.png","图片素材/干员图片/蜂医.png"]},{id:"delta-reference-image-files",name:"三角洲参考图片文件角色",description:"大白话:把封面参考、干员图、地图截图作为多模态模型可理解的参考图片。",type:"file",processingType:"reference",resourceIds:["图片素材/干员图片/露娜.png","图片素材/干员图片/红狼.png","图片素材/干员图片/地图图纸-零号大坝-官方完整地图图纸.jpg","图片素材/干员图片/地图图纸-航天基地-官方完整地图图纸.jpg"]},{id:"delta-case-reference-files",name:"三角洲模板案例参考文件",description:"大白话:作为内置模板案例参考,告诉用户一篇合格示例应如何组织结论、章节、表格、来源和提醒。",type:"file",processingType:"reference",resourceIds:["文档资料/模板案例-热门干员攻略示例.md","文档资料/模板案例-导出样式参考.md"]},{id:"delta-style-reference-files",name:"三角洲模板样式参考文件",description:"大白话:提供模板样式、标题层级、表格写法、图片说明、来源清单和导出排版参考。",type:"file",processingType:"specification",resourceIds:["文档资料/模板样式-攻略文档排版规范.md","文档资料/规范文件-攻略结构规范.md"]},{id:"delta-export-gate-files",name:"三角洲导出门禁参考文件",description:"大白话:说明 Markdown、HTML、DOCX、PDF 导出前需要满足的完整性、来源和格式检查项。",type:"file",processingType:"rule",resourceIds:["文档资料/导出门禁-攻略文档检查清单.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-cover-image-prompt",name:"三角洲封面图片生成提示词",description:"指导多模态模型生成专业封面图,要求主题、构图、氛围、比例和不可出现的信息。",type:"prompt",executionType:"reference",resourceIds:["builtin:delta-cover-image-generation"]},{id:"delta-template-style-prompt",name:"三角洲模板样式提示词",description:"规范内置模板案例的标题层级、导语、卡片式结论、表格、图片说明、来源清单和导出样式。",type:"prompt",executionType:"formatting",resourceIds:["builtin:delta-template-style"]},{id:"delta-resource-evidence-prompt",name:"三角洲资源证据使用提示词",description:"指导模型把文本、表格、PDF/Word、图片、地图图纸和附件正确转化为章节内容。",type:"prompt",executionType:"chapter_generation",resourceIds:["builtin:delta-resource-evidence"]},{id:"delta-export-gate-prompt",name:"三角洲导出门禁提示词",description:"按 Markdown/HTML/DOCX/PDF 交付要求检查结构、来源、图片、表格和阻断项。",type:"prompt",executionType:"validation",resourceIds:["builtin:delta-export-gate"]},{id:"delta-review-prompt",name:"三角洲 LLM 审查优化提示词",description:"生成后再次使用文件角色、提示词角色和文档规范包审查初稿并优化。",type:"prompt",executionType:"llm_review",resourceIds:["builtin:delta-review-optimization"]},{id:"delta-validation-prompt",name:"三角洲校验提示词",description:"检查是否缺少热门干员、表格和实战注意事项。",type:"prompt",executionType:"validation",resourceIds:["builtin:delta-validation"]},{id:"delta-formatting-prompt",name:"三角洲收尾润色提示词",description:"对最终攻略进行格式整理、标题优化和结尾收束。",type:"prompt",executionType:"formatting",resourceIds:["builtin:delta-formatting"]}].map(a=>({...a,builtIn:!0})),h={id:"delta-force-demo-config",name:"三角洲热门干员攻略项目配置",description:"内置示例配置:文件角色和提示词角色已排好顺序,用户可直接选择内置模板生成。",builtIn:!0,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},{roleId:"delta-doc-files",order:5},{roleId:"delta-image-files",order:6},{roleId:"delta-reference-image-files",order:7},{roleId:"delta-case-reference-files",order:8},{roleId:"delta-style-reference-files",order:9},{roleId:"delta-export-gate-files",order:10}],promptRoles:[{roleId:"delta-fact-prompt",order:0},{roleId:"delta-generation-prompt",order:1},{roleId:"delta-resource-evidence-prompt",order:2},{roleId:"delta-cover-image-prompt",order:3},{roleId:"delta-template-style-prompt",order:4},{roleId:"delta-review-prompt",order:5},{roleId:"delta-export-gate-prompt",order:6},{roleId:"delta-validation-prompt",order:7},{roleId:"delta-formatting-prompt",order:8}]};function i(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function j(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function k(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:j(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,resourceId:a.resourceId||a.resourceIds?.[0]||void 0,resourceIds:Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds.filter(Boolean):a.resourceId?[a.resourceId]:[],executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function l(a){return{id:j(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[],promptRoles:Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]}}function m(){try{let a=i();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(k),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(k):[],configs:Array.isArray(b.configs)?b.configs.map(l):[]}}catch{return{roles:[],configs:[]}}}function n(a){d.writeFileSync(i(),JSON.stringify({roles:a.roles.map(k),configs:a.configs.map(l)},null,2),"utf-8")}function o(a){let b=[...new Map([...g,...m().roles].map(a=>[a.id,a])).values()];return a?b.filter(b=>b.type===a):b}function p(a){let b=k(a);if(g.some(a=>a.id===b.id&&a.type===b.type))throw Error("Built-in demo role cannot be overwritten");let c=m();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),n(c),b}function q(a,b){if(g.some(c=>c.id===b&&c.type===a))throw Error("Built-in demo role cannot be deleted");let c=m();c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(a=>({...a,fileRoles:a.fileRoles.filter(a=>a.roleId!==b),promptRoles:a.promptRoles.filter(a=>a.roleId!==b)})),n(c)}function r(){return[...new Map([h,...m().configs].map(a=>[a.id,a])).values()]}function s(a){return a===h.id?h:m().configs.find(b=>b.id===a)}function t(a){let b={...l(a),builtIn:!1};if(b.id===h.id)throw Error("Built-in demo config cannot be overwritten");let c=m();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),n(c),b}function u(a){if(a===h.id)throw Error("Built-in demo config cannot be deleted");let b=m();b.configs=b.configs.filter(b=>b.id!==a),n(b)}},99842:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>n,PH:()=>u,dg:()=>l,h0:()=>p,i3:()=>o,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
|
|
47
|
+
${g}`:""].filter(Boolean).join("\n\n")}(R,d,f),s=await Promise.race([af(b,d,m,n,p,aa,a.requirement,q,{forbidDrawingImages:o,minWords:f?.minWords||1200}),new Promise(a=>setTimeout(()=>a(null),6e4))]);ai(a.signal);let u=s||function(a,b,c,d){let e=c.slice(0,8).map((a,b)=>`| ${b+1} | ${a.content.replace(/\s+/gu," ").replace(/\|/gu," ").slice(0,160)} | ${a.processingType||"文本资料"} |`);return U([`## ${b.title}`,"",`本章围绕${b.purpose||b.title}展开,结合工程范围、专业施工条件和现场组织要求,形成可执行的施工组织安排。`,"",e.length?"| 序号 | 施工组织要点 | 适用类型 |":"",e.length?"|---:|---|---|":"",...e,"","施工过程中,项目部将按照招标文件要求和经审批的施工方案组织实施,强化技术交底、过程检查、工序验收和整改闭环,确保各专业施工内容衔接有序、质量安全受控。"].filter(Boolean).join("\n"))}(b.id,d,m,0);D.push({type:"chapter_generation",roleId:"chapter_generation",promptId:i.find(a=>"chapter_generation"===a.roleId)?.promptId,status:s?"success":"fallback",message:s?`${d.title} 已由大模型生成`:`${d.title} 使用本地专业兜底生成`}),y.push({id:d.id,title:d.title,content:u,evidence:m,missingFacts:n})}catch(b){if(a.signal?.aborted)throw b;console.error(`[gen] chapter ${d.title} failed:`,b),D.push({type:"chapter_generation",roleId:"chapter_generation",status:"failed",message:`${d.title} 生成失败`})}E.some(a=>"chapter_generation"===a.type&&a.message===D[D.length-1]?.message)||E.push(D[D.length-1]),a.onProgress?.([...E])}ai(a.signal);let ak={stage:{type:"file_understanding",roleId:"multimodal-files",status:"skipped",message:"文件理解跳过"},notes:[]};try{ak=await ab(c,z)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fileUnderstanding failed:",b)}for(let b of(ai(a.signal),ak.notes))z.push({chapterId:"multimodal-file-understanding",filePath:"多模态模型文件理解结果",score:1,content:b,roleId:"multimodal-files",processingType:"reference",source:"multimodal"});let al=function(a,b,c){let d={};for(let e of I(a,c)){let a=b.find(a=>J(a,e));a&&(d[e.name]=`${a.content.replace(/\s+/gu," ").slice(0,180)}(来源:${a.filePath},角色:${a.roleId||"未标注"})`)}return d}(b,z,o);for(let a of R)for(let b of a.facts)al[b.key]=`${M(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let am=function(a,b,c){let d=I(b,c).map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&");return RegExp(`${b}[::\\s]+([^\\n,。;;]+)`,"u")}(a.name)})),e=[];for(let b of a)for(let{field:a,pattern:c}of d){if(!J(b,a))continue;let d=b.content.match(c)||[void 0,b.content.replace(/\s+/gu," ").slice(0,220)],f=d?.[1]?.trim();f&&!e.some(b=>b.fieldId===a.id&&b.value===f)&&e.push({key:a.name,fieldId:a.id,fieldName:a.name,value:f.slice(0,300),sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:b.score,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle}})}return e}(z,b,o),an={facts:[],stages:[]};try{an=await ac(z,p,b,o)}catch(b){if(a.signal?.aborted)throw b;console.error("[gen] fact extraction failed:",b)}ai(a.signal);let ao=[...R.flatMap(a=>a.facts.map(a=>({key:a.key,value:M(a.value),sourceFile:a.sourceFile,roleId:a.roleId,confidence:.9}))),...am,...an.facts];for(let a of(E.some(a=>a.type===ak.stage.type)||E.push(ak.stage),an.stages))E.some(b=>b.type===a.type)||E.push(a);a.onProgress?.([...E]);let ap=function(a){let b=[],c=new Set;for(let g of a.filter(a=>"table"===a.processingType)){if(c.has(g.filePath))continue;c.add(g.filePath);let a=(0,j.aY)(),h=e.isAbsolute(g.filePath)?g.filePath:d.existsSync(e.join(a,"knowledgeBase",g.filePath))?e.join(a,"knowledgeBase",g.filePath):e.join(a,g.filePath),i=e.extname(g.filePath).toLowerCase();if(d.existsSync(h)&&[".xlsx",".xls",".csv"].includes(i))try{let a=f.readFile(h,{cellDates:!0,sheetStubs:!1});for(let c of a.SheetNames){let d=a.Sheets[c],e=f.utils.sheet_to_json(d,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(e.length<2)continue;let h=e.findIndex(a=>a.filter(Boolean).length>=2);if(h<0)continue;let i=e[h].filter(Boolean),j=e.slice(h+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&b.push({tableType:g.roleId||"table",sheet:c,headers:i,rows:j.slice(0,200),sourceFile:g.filePath,sourceRange:d["!ref"]})}continue}catch{}let k=g.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(k.length<2)continue;let l=k[0].includes("|")?"|":k[0].includes(" ")?" ":",",m=k.map(a=>a.split(l).map(a=>a.trim()).filter(Boolean)).filter(a=>a.length>1);m.length<2||b.push({tableType:g.roleId||"table",headers:m[0],rows:m.slice(1,80),sourceFile:g.filePath,sourceRange:g.sectionTitle})}return b}(z),aq=z.filter(a=>"pinned-evidence"===a.source).length,ar=z.filter(a=>"pinned-evidence"!==a.source&&"bound-file"!==a.source).length,as={type:"reference",roleId:"quality-enhancement",status:z.length>0?"success":"skipped",message:`增强贡献:知识库证据 ${z.length} 条,人工确认/固定证据 ${aq} 条,项目上下文 ${_.length} 条,自动检索证据 ${ar} 条`};for(let b of(E.push(as),a.onProgress?.([...E]),ao))al[b.key]=`${M(b.value)}(来源:${b.sourceFile},角色:${b.roleId})`;let at=new Map;for(let a of z)at.set(a.filePath,(at.get(a.filePath)??0)+1);let au=[...at.entries()].sort((a,b)=>b[1]-a[1]).map(([a,b])=>({filePath:a,count:b})),av=function(a,b=[],c=[],d){let e=b=>a.filter(a=>b.some(b=>a.key.includes(b))),f=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b));return{project:a,schedule:e(["工期","开工","竣工","节点"]),quality:e(["质量"]),safety:e(["安全"]),resources:e(["劳动力","材料","机械","设备"]),tables:b,drawings:f("drawing"),rules:f("rule"),specifications:f("specification"),schemaFacts:function(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}(a,d),missing:[...new Set(c)],conflicts:function(a,b){let c=b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.key))],d=[];for(let b of c){let c=a.filter(a=>a.key===b||a.fieldName===b),e=new Map;for(let a of c){let b=M(a.value).replace(/\s+/gu,"").replace(/[,。,.;;::]/gu,"").toLowerCase();b&&e.set(b,[...e.get(b)||[],a])}if(e.size>1){let a=[...e.values()].map(a=>`${a[0].value}(${a.map(a=>a.sourceFile).join("、")})`).join(" vs ");d.push(`事实冲突:${b} 存在多个来源值:${a}`)}}return d}(a,d)}}(ao,ap,A,o),aw=function(a,b=[],c){let d=[],e=[];for(let b of a)0===b.evidence.length&&d.push(`${b.title} 未检索到资料证据`),b.content.length<80&&d.push(`${b.title} 内容较短,建议人工补充或重新生成`);c&&0===Y(c).length&&e.push("模板未绑定任何知识库文件"),c&&0===X(c).length&&e.push("模板未绑定任何提示词");let f=new Set(b.map(a=>a.roleId));for(let a of["project_fact","rule"])c?.fileBindings?.some(b=>b.roleId===a)&&!f.has(a)&&d.push(`${a} 角色未抽取到结构化事实`);return{passed:0===e.length,warnings:d,errors:e}}(y,ao,b),ax=function(a,b,c){let d=[...a.errors.map(a=>({level:"error",message:a,suggestion:"请补充配置或资料后重新生成。"})),...a.warnings.map(a=>({level:"warning",message:a,suggestion:"建议人工确认或补充对应资料。"}))];return c.some(a=>a.content.includes("资料未提供"))&&d.push({level:"warning",message:"存在资料未提供章节",suggestion:"请检查项目角色配置中的文件绑定和顺序。"}),b.conflicts.length>0&&d.push(...b.conflicts.map(a=>({level:"error",message:a}))),d}(aw,av,y),ay=[{type:"role_binding",roleId:b.projectRoleConfigId||"none",status:l.length>0?"success":"fallback",message:`已绑定 ${l.length} 个文件角色、${i.length} 个提示词角色`},aj,{type:"knowledge_retrieval",roleId:"knowledge-base",status:z.length>0?"success":"fallback",message:`已检索/绑定 ${z.length} 条证据`},as,ak.stage,...an.stages,...D,{type:"validation",roleId:"document-workflow",status:aw.errors.length>0?"failed":"success",message:`错误 ${aw.errors.length},警告 ${aw.warnings.length}`},{type:"formatting",roleId:"document-workflow",status:"success",message:"已生成正式排版 Markdown"},{type:"export_ready",roleId:"document-workflow",status:aw.errors.length>0?"failed":"success",message:aw.errors.length>0?"导出门禁存在阻断项":"已准备好导出 Markdown/HTML/DOCX/PDF"}],az={templateId:b.id,templateName:b.name,title:b.outputTitle,requirement:a.requirement||"",facts:al,structuredFacts:ao,factsModel:av,chapters:y,sources:au,missingItems:[...new Set(A)],validation:aw,validationIssues:ax,executionStages:ay,exportGate:{passed:!0,blockingIssues:[],checklist:[]},assets:[],generatedAt:Date.now()},aA=ah(az);ai(a.signal);let aB=await ag({template:b,spec:o,markdown:aA,evidence:z,promptTexts:p,projectContext:aa,requirement:a.requirement});ai(a.signal);let aC=P(R,b),aD=Q(aB.markdown===aA?ah({...az,validationIssues:ax,exportGate:az.exportGate,executionStages:ay}):aB.markdown,aC),aE=function(a,b,c,d,e){let f=[];for(let b of c)for(let c of(a.includes(b.title)||f.push(`缺少动态章节:${b.title}`),b.requiredContents.slice(0,12)))c&&!a.includes(c)&&f.push(`${b.title} 未覆盖必写内容:${c}`);for(let a of b){let b=c.find(b=>b.title===a.title),d=b?.minWords||1e3;a.content.length<d&&f.push(`${a.title} 内容深度不足:${a.content.length}/${d}`)}return d.some(a=>"bill_facts"===a.node.outputType)&&!/清单|工程量|项目特征|数量|单位/u.test(a)&&f.push("未体现清单文件读取结果"),d.some(a=>"drawing_facts"===a.node.outputType)&&!/图纸|设计|标注|材料|规格|位置|系统|构件/u.test(a)&&f.push("未体现图纸文本事实"),e&&/!\[[^\]]*(?:图纸|drawing|cad|地图|平面|剖面|立面)[^\]]*\]\([^)]*\)/iu.test(a)&&f.push("正文包含不应插入的图纸图片"),[...new Set(f)].slice(0,40)}(aD,y,S,R,aC),aF=await W({markdown:aD,template:b,plan:S,artifacts:R,promptTexts:p,requirement:a.requirement,issues:aE,forbidDrawingImages:aC});ai(a.signal);let aG=aF.stage?[...ay,aB.stage,aF.stage]:[...ay,aB.stage],aH=function(a,b,c){let d=[{key:"no_errors",label:"无阻断级校验错误",passed:!a.some(a=>"error"===a.level&&ad(a))},{key:"project_facts",label:"项目基础事实齐全",passed:b.project.length>0},{key:"source_traceability",label:"事实具备来源追踪",passed:[...b.project,...b.schedule,...b.quality,...b.safety].every(a=>!!a.sourceFile)},{key:"chapter_evidence",label:"章节均具备证据",passed:c.every(a=>a.evidence.length>0)},{key:"no_missing_content",label:"无资料未提供章节",passed:c.every(a=>!a.content.includes("资料未提供"))}],e=a.filter(a=>"error"===a.level&&ad(a));return{passed:0===e.length&&d.every(a=>a.passed),blockingIssues:e,checklist:d}}(ax=function(a,b,c,d,e,f,g){if(!a)return b;let h=[...b],i=[...c.project,...c.schedule,...c.quality,...c.safety,...c.resources,...Object.values(c.schemaFacts).flat()],j=new Set([...i.map(a=>a.key),...i.map(a=>a.fieldName).filter(Boolean),...c.tables.flatMap(a=>[...a.headers,...a.rows.flat()])]),k=new Set(d.map(a=>a.title));for(let b of a.factFields.filter(a=>a.required)){let a=c.schemaFacts[b.id]||[],e=d.some(a=>!a.missingFacts.includes(b.name)&&a.evidence.some(a=>J(a,b))),f=!b.sourceRoleIds?.length||a.some(a=>b.sourceRoleIds?.includes(a.roleId))||d.some(a=>a.evidence.some(a=>J(a,b)));0!==a.length||j.has(b.name)||e||h.push({level:"warning",message:`必需事实缺失:${b.name}`,suggestion:b.extractionHint||"请补充资料或调整事实字段配置。"}),f||h.push({level:"warning",message:`必需事实来源角色不匹配:${b.name}`,suggestion:`请确认该事实来自角色:${b.sourceRoleIds?.join("、")}`})}if("fixed"===a.chapterMode)for(let b of a.chapterRules.filter(a=>a.required)){k.has(b.title)||h.push({level:"error",message:`必需章节缺失:${b.title}`,suggestion:"请在模板或规范包章节规则中补齐章节。"});let a=d.find(a=>a.title===b.title);a&&b.minWords&&a.content.length<b.minWords&&h.push({level:"warning",message:`章节内容低于最低字数:${b.title}`,suggestion:`建议不少于 ${b.minWords} 字。`})}else{let b=a.dynamicChapterRule;if(b.minChapters&&d.length<b.minChapters&&h.push({level:"warning",message:`动态章节数量低于最少章节:${d.length}/${b.minChapters}`,suggestion:"请补充资料或降低最少章节数。"}),b.maxChapters&&d.length>b.maxChapters&&h.push({level:"warning",message:`动态章节数量超过最多章节:${d.length}/${b.maxChapters}`,suggestion:"请收紧来源文件角色或降低召回范围。"}),b.minWordsPerChapter)for(let a of d)a.content.length<b.minWordsPerChapter&&h.push({level:"warning",message:`动态章节内容低于最低字数:${a.title}`,suggestion:`建议不少于 ${b.minWordsPerChapter} 字。`})}let l=e.split(/\n{2,}/u).filter(a=>/\|.+\|/u.test(a)&&/\n\s*\|?\s*:?-{3,}:?/u.test(a)),m=[...e.matchAll(/!\[([^\]]*)\]\(([^)]+)\)/gu)].map(a=>({alt:a[1]||"",url:a[2]||"",index:a.index??0}));for(let b of a.gateRules){let a=b.level,n=b.evaluator?b.evaluator:"required_fact"===b.type?{subject:"fact",operator:"exists",target:b.target}:"required_chapter"===b.type?{subject:"chapter",operator:"exists",target:b.target}:"required_file_role"===b.type?{subject:"file_role",operator:"exists",target:b.target}:"required_prompt_role"===b.type?{subject:"prompt_role",operator:"exists",target:b.target}:"source_required"===b.type?{subject:"source",operator:"all_have_source"}:"forbidden_text"===b.type?{subject:"document",operator:"not_contains",value:b.value}:"min_chapter_length"===b.type?{subject:"chapter",operator:"min_length",target:b.target,min:Number(b.value)||void 0}:"table_required"===b.type?{subject:"table",operator:"min_count",min:1}:{subject:"document",operator:"contains",value:b.value||b.target},o=n.target||b.target||"",p=n.value||b.value||o,q=n.min||Number(b.value)||1,r=d.find(a=>a.title===o),s="chapter"===n.subject&&r?r.content:e,t=p?function(a){try{return RegExp(a,"iu")}catch{return}}(p):void 0;"fact"===n.subject&&"exists"===n.operator&&o&&!j.has(o)&&h.push({level:a,message:ae(b,`缺少事实 ${o}`)}),"chapter"===n.subject&&"exists"===n.operator&&o&&!k.has(o)&&h.push({level:a,message:ae(b,`缺少章节 ${o}`)}),"file_role"===n.subject&&"exists"===n.operator&&o&&!f.some(a=>a.roleId===o)&&h.push({level:a,message:ae(b,`缺少文件角色 ${o}`)}),"prompt_role"===n.subject&&"exists"===n.operator&&o&&!g.some(a=>a.roleId===o)&&h.push({level:a,message:ae(b,`缺少提示词角色 ${o}`)}),"document"===n.subject&&"contains"===n.operator&&p&&!e.includes(p)&&h.push({level:a,message:ae(b,`全文必须包含 ${p}`)}),"document"===n.subject&&"not_contains"===n.operator&&p&&e.includes(p)&&h.push({level:a,message:ae(b,`出现禁用文本 ${p}`)}),"document"!==n.subject&&"chapter"!==n.subject||"regex_match"!==n.operator||!p||t&&t.test(s)||h.push({level:a,message:ae(b,`未匹配正则 ${p}`)}),("document"===n.subject||"chapter"===n.subject)&&"regex_not_match"===n.operator&&t?.test(s)&&h.push({level:a,message:ae(b,`匹配到禁止正则 ${p}`)}),"chapter"===n.subject&&"contains"===n.operator&&o&&p&&(!r||!r.content.includes(p))&&h.push({level:a,message:ae(b,`章节 ${o} 必须包含 ${p}`)}),"chapter"===n.subject&&"not_contains"===n.operator&&r?.content.includes(p)&&h.push({level:a,message:ae(b,`章节 ${o} 出现禁用文本 ${p}`)}),"chapter"===n.subject&&"min_length"===n.operator&&o&&(!r||r.content.length<q)&&h.push({level:a,message:ae(b,`章节 ${o} 低于 ${q} 字`)}),"table"===n.subject&&"min_count"===n.operator&&c.tables.length+l.length<q&&h.push({level:a,message:ae(b,`表格数量少于 ${q}`)}),"table"===n.subject&&"table_explanation_required"===n.operator&&l.some(a=>e.indexOf(a)>=0&&e.slice(e.indexOf(a)+a.length,e.indexOf(a)+a.length+120).trim().length<10)&&h.push({level:a,message:ae(b,"存在缺少说明文字的表格")}),"image"===n.subject&&"min_count"===n.operator&&m.length<q&&h.push({level:a,message:ae(b,`图片数量少于 ${q}`)}),"image"===n.subject&&"image_caption_required"===n.operator&&m.some(a=>!a.alt&&e.slice(a.index+a.url.length,a.index+a.url.length+120).trim().length<10)&&h.push({level:a,message:ae(b,"存在缺少说明文字的图片")}),"source"===n.subject&&"all_have_source"===n.operator&&i.some(a=>!a.sourceFile)&&h.push({level:a,message:ae(b,"存在无来源事实")}),"source"===n.subject&&"min_count"===n.operator&&new Set(i.map(a=>a.sourceFile).filter(Boolean)).size<q&&h.push({level:a,message:ae(b,`来源数量少于 ${q}`)})}return h}(o,[...ax,...aE.map(a=>({level:"warning",message:a}))],av,y,aF.markdown,l,i),av,y),aI={...az,validationIssues:ax,exportGate:aH,executionStages:aG},aJ=Q(aF.markdown,aC);return{...aI,markdown:aJ}}async function ak(a){let b=w(a.templateId);if(!b)throw Error("Document template not found");let c=b.chapters.find(b=>b.id===a.chapterId);if(!c)throw Error("Document chapter not found");let d=a.projectRoot||(0,j.aY)();if(!d)throw Error("No knowledge base project found");let e=(0,j.Qh)(),f=Math.max(5,Math.min(30,a.maxEvidencePerChapter??12)),g=[];for(let a of c.queries){let b=await e.search(d,a,{scope:"project",limit:f,weights:{keyword:.4,vector:.45,rewrite:.75,hybridBonus:.15}});g.push(...b.results.map(a=>({chapterId:c.id,filePath:a.filePath,score:a.score,content:a.content,sectionTitle:a.sectionTitle,source:a.source})))}let h=B(g,f),i=a.currentMarkdown?a.currentMarkdown.slice(0,4e3):"",k=new Set(a.existingFacts??[]),l=c.requiredFacts.filter(a=>!k.has(a)&&!h.some(b=>H(b,a))),m=[`## ${c.title}`,"",a.requirement?`> 生成要求:${a.requirement}`:"",i?`> 当前文档上下文摘要:${i.replace(/\s+/gu," ").slice(0,800)}`:"",h.length>0?`本章根据知识库资料围绕“${c.purpose}”重新整理,并与当前文档上下文保持一致。`:"建议补充更多资料后复核。","",h.length>0?"### 资料依据":"",...h.map(D),"",l.length>0?"### 待确认事项":"",...l.map(a=>`- ${a}:建议人工复核或补充更明确资料。`)].filter(Boolean).join("\n");return{id:c.id,title:c.title,content:m,evidence:h,missingFacts:l}}},89952:(a,b,c)=>{c.d(b,{DZ:()=>p,FV:()=>o,Mu:()=>q,NR:()=>r,XB:()=>m,dg:()=>n,dw:()=>s});var d=c(73024),e=c(48161),f=c(76760);function g(){let a=f.join(e.homedir(),".customize-agent");return d.mkdirSync(a,{recursive:!0}),f.join(a,"document-roles.json")}function h(a){return(a||`item-${Date.now()}`).replace(/[^a-zA-Z0-9_-]/gu,"-").slice(0,80)}function i(a){var b,c;let d="prompt"===a.type?"prompt":"file";return{id:h(a.id),name:a.name||"未命名角色",description:a.description||"",type:d,resourceId:a.resourceId||a.resourceIds?.[0]||void 0,resourceIds:Array.isArray(a.resourceIds)&&a.resourceIds.length>0?a.resourceIds.filter(Boolean):a.resourceId?[a.resourceId]:[],executionType:"prompt"===d?"fact_extraction"===(b=a.executionType)||"chapter_generation"===b||"llm_review"===b||"validation"===b||"formatting"===b||"reference"===b?b:"reference":void 0,processingType:"file"===d?"rule"===(c=a.processingType)||"project_fact"===c||"table"===c||"drawing"===c||"specification"===c||"reference"===c?c:"reference":void 0}}function j(a){return{id:h(a.id),name:a.name||"未命名配置",description:a.description||"",builtIn:!!a.builtIn,fileRoles:Array.isArray(a.fileRoles)?a.fileRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[],promptRoles:Array.isArray(a.promptRoles)?a.promptRoles.filter(a=>a.roleId).map((a,b)=>({roleId:a.roleId,order:Number.isFinite(a.order)?a.order:b})):[]}}function k(){try{let a=g();if(!d.existsSync(a))return{roles:[],configs:[]};let b=JSON.parse(d.readFileSync(a,"utf-8"));if(Array.isArray(b))return{roles:b.map(i),configs:[]};return{roles:Array.isArray(b.roles)?b.roles.map(i):[],configs:Array.isArray(b.configs)?b.configs.map(j):[]}}catch{return{roles:[],configs:[]}}}function l(a){d.writeFileSync(g(),JSON.stringify({roles:a.roles.map(i),configs:a.configs.map(j)},null,2),"utf-8")}function m(a){let b=k().roles;return a?b.filter(b=>b.type===a):b}function n(a){let b=i(a),c=k();return c.roles=c.roles.filter(a=>a.id!==b.id||a.type!==b.type),c.roles.push(b),l(c),b}function o(a,b){let c=k();c.roles=c.roles.filter(c=>c.id!==b||c.type!==a),c.configs=c.configs.map(a=>({...a,fileRoles:a.fileRoles.filter(a=>a.roleId!==b),promptRoles:a.promptRoles.filter(a=>a.roleId!==b)})),l(c)}function p(){return k().configs}function q(a){return k().configs.find(b=>b.id===a)}function r(a){let b={...j(a),builtIn:!1},c=k();return c.configs=c.configs.filter(a=>a.id!==b.id),c.configs.push(b),l(c),b}function s(a){let b=k();b.configs=b.configs.filter(b=>b.id!==a),l(b)}},99842:(a,b,c)=>{c.d(b,{E:()=>t,Hh:()=>n,PH:()=>u,dg:()=>l,h0:()=>p,i3:()=>o,jk:()=>q,p:()=>s,pJ:()=>m});var d=c(87550),e=c.n(d),f=c(33873),g=c(21820),h=c(29021);let i={project_fact:"项目知识",user_preference:"用户偏好",feedback:"历史纠偏",pattern:"解决方案"};function j(){let a=f.join(g.homedir(),".customize-agent","memory.db");return h.existsSync(a)?new(e())(a,{readonly:!0}):null}function k(a){let b=Number(a.access_count??0);return{id:String(a.id),title:String(a.content||"").slice(0,80),content:String(a.content||""),type:String(a.type||"project_fact"),importance:b>=5?"high":b>=2?"medium":"low",tags:[i[String(a.type)]||String(a.type)],source:String(a.context||"").slice(0,100),created_at:new Date(String(a.created_at)).getTime(),updated_at:new Date(String(a.updated_at)).getTime()}}function l(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count >= 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY access_count DESC, updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function m(a){let b=j();if(!b)return[];try{let c="SELECT * FROM memories WHERE access_count < 2",d=[];return a&&(c+=" AND (content LIKE ? OR context LIKE ?)",d.push(`%${a}%`,`%${a}%`)),c+=" ORDER BY updated_at DESC LIMIT 200",b.prepare(c).all(...d).map(k)}finally{b.close()}}function n(a,b=8,c){let d=j();if(!d)return[];try{let e=a.split(/[\s,,。;;::、/\\|]+/u).map(a=>a.trim()).filter(a=>a.length>=2).slice(0,8),g=c?`%Project: ${f.resolve(c)}%`:void 0;if(0===e.length)return(g?d.prepare("SELECT * FROM memories WHERE context LIKE ? ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(g,b):d.prepare("SELECT * FROM memories ORDER BY access_count DESC, updated_at DESC LIMIT ?").all(b)).map(k);let h=e.map(()=>"(content LIKE ? OR context LIKE ?)").join(" OR "),i=e.flatMap(a=>[`%${a}%`,`%${a}%`]);return(g?d.prepare(`
|
|
180
48
|
SELECT * FROM memories
|
|
181
49
|
WHERE context LIKE ? AND (${h})
|
|
182
50
|
ORDER BY access_count DESC, updated_at DESC
|