@customize-agent/server 4.0.71 → 4.0.73

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (52) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +6 -6
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/server/chunks/1936.js +3 -3
  5. package/.next/server/chunks/5247.js +49 -47
  6. package/.next/server/chunks/8204.js +1 -1
  7. package/.next/server/chunks/9301.js +3 -3
  8. package/.next/server/middleware-build-manifest.js +1 -1
  9. package/.next/server/pages/404.html +1 -1
  10. package/.next/server/pages/500.html +1 -1
  11. package/.next/server/pages/_error.js +1 -1
  12. package/.next/server/pages/api/assets/generated/preview.js +1 -1
  13. package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
  14. package/.next/server/pages/api/assets/generated.js +1 -1
  15. package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
  16. package/.next/server/pages/api/documents/export.js +2 -2
  17. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  18. package/.next/server/pages/api/documents/generate.js +2 -2
  19. package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
  20. package/.next/server/pages/api/documents/generated/[id].js +1 -1
  21. package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
  22. package/.next/server/pages/api/documents/generated.js +1 -1
  23. package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
  24. package/.next/server/pages/api/kb/files.js +1 -1
  25. package/.next/server/pages/asset-library.html +1 -1
  26. package/.next/server/pages/context/long-term.html +1 -1
  27. package/.next/server/pages/context/short-term.html +1 -1
  28. package/.next/server/pages/document-roles.html +1 -1
  29. package/.next/server/pages/documents.html +1 -1
  30. package/.next/server/pages/guide.html +1 -1
  31. package/.next/server/pages/index.html +1 -1
  32. package/.next/server/pages/knowledge/file-detail.html +1 -1
  33. package/.next/server/pages/knowledge/files.html +1 -1
  34. package/.next/server/pages/knowledge/manage.html +1 -1
  35. package/.next/server/pages/knowledge/search.html +1 -1
  36. package/.next/server/pages/knowledge.html +1 -1
  37. package/.next/server/pages/models.html +1 -1
  38. package/.next/server/pages/overview.html +1 -1
  39. package/.next/server/pages/prompt.html +1 -1
  40. package/.next/server/pages/settings.html +1 -1
  41. package/.next/server/pages/system/logs.html +1 -1
  42. package/.next/server/pages-manifest.json +21 -21
  43. package/.next/static/chunks/{317-18aac52df5551e76.js → 767-e97ea5dee1ab87b5.js} +1 -1
  44. package/.next/static/chunks/pages/{_app-dd841161c7d0b39e.js → _app-1eef3e5fadd36ac2.js} +1 -1
  45. package/.next/static/chunks/pages/asset-library-37f844cb358f5457.js +1 -0
  46. package/.next/static/chunks/pages/{guide-61bea94f27710467.js → guide-c00be7803483b703.js} +1 -1
  47. package/.next/static/{G2viAcdgjbPEipVUbf4jw → fi3WmBxX1wUpcv3jgZ9mu}/_buildManifest.js +1 -1
  48. package/package.json +2 -2
  49. package/scripts/verify-next-static.js +20 -1
  50. package/.next/server/chunks/8661.js +0 -1
  51. package/.next/static/chunks/pages/asset-library-91bd2baa09727e0a.js +0 -1
  52. /package/.next/static/{G2viAcdgjbPEipVUbf4jw → fi3WmBxX1wUpcv3jgZ9mu}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- exports.id=8204,exports.ids=[8204],exports.modules={4823:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(60056);function e(a){return{algorithm:a?d.w4.darkAlgorithm:d.w4.defaultAlgorithm,token:{colorPrimary:a?"#0a84ff":"#007aff",colorInfo:a?"#0a84ff":"#007aff",colorSuccess:a?"#30d158":"#34c759",colorWarning:a?"#ff9f0a":"#ff9500",colorError:a?"#ff453a":"#ff3b30",colorBgBase:a?"#1c1c1e":"#f5f5f7",colorBgContainer:a?"rgba(44,44,46,0.78)":"rgba(255,255,255,0.78)",colorBgElevated:a?"rgba(44,44,46,0.92)":"rgba(255,255,255,0.94)",colorBorder:a?"rgba(255,255,255,0.12)":"rgba(60,60,67,0.16)",colorText:a?"#f5f5f7":"#1d1d1f",colorTextSecondary:a?"#98989d":"#6e6e73",fontFamily:"var(--fontSans)",fontSize:14,borderRadius:14,borderRadiusLG:20,borderRadiusSM:10,controlHeight:36,lineWidth:1,boxShadow:a?"0 8px 24px rgba(0,0,0,0.24)":"0 8px 24px rgba(0,0,0,0.06)",boxShadowSecondary:a?"0 4px 12px rgba(0,0,0,0.2)":"0 4px 12px rgba(0,0,0,0.04)",motionDurationMid:"0.2s",motionEaseInOut:"cubic-bezier(0.25, 0.1, 0.25, 1)"},components:{Card:{borderRadiusLG:20,paddingLG:24,headerFontSize:13,headerFontSizeSM:12},Button:{borderRadius:14,borderRadiusLG:18,borderRadiusSM:10,fontWeight:600,primaryShadow:"var(--shadowButton)"},Input:{borderRadius:14,controlHeight:36,activeShadow:"0 0 0 3px rgba(0,122,255,0.12)"},Select:{borderRadius:14},Modal:{borderRadiusLG:20,titleFontSize:17,fontWeightStrong:700},Tag:{borderRadiusSM:100,defaultBg:a?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.04)"},Table:{borderRadiusLG:20,headerBg:a?"rgba(255,255,255,0.04)":"rgba(0,0,0,0.02)",headerColor:"var(--colorTextSecondary)",headerSplitColor:"transparent",headerBorderRadius:12},Spin:{dotSize:28,dotSizeLG:40},Upload:{borderRadiusLG:20}}}}},8204:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>h});var e=c(8732),f=c(94487);c(66285),c(97237);var g=a([f]);function h({Component:a,pageProps:b}){return(0,e.jsx)(f.PE,{children:(0,e.jsx)(a,{...b})})}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},13484:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"管理控制台"},"nav":{"overview":"总览","knowledge":"知识库","knowledgeManage":"知识库管理","fileManagement":"文件管理","knowledgeSearch":"知识库搜索","documents":"工作流模版库","assetLibrary":"生成资源","documentRoles":"角色配置","documentSpecs":"文档规范包","guide":"指引","models":"模型配置","settings":"设置","contextEngineering":"上下文工程","longTermContext":"长期上下文","shortTermContext":"短期上下文","promptManagement":"提示词管理","systemLogs":"系统日志"},"overview":{"title":"系统总览","description":"查看 Customize Agent 运行状态与关键指标","status":"服务状态","statusRunning":"运行中","statusError":"异常","knowledgeBase":"知识库","modelConfig":"模型配置","filesCount":"文件总数","chunksCount":"分块总数","storageSize":"存储空间","providersCount":"已配置模型","quickActions":"快捷操作","goToKnowledge":"管理知识库","goToModels":"配置模型","goToSettings":"系统设置","cores":"核","memory":"内存","tokensUsed":"累计 Tokens","tasksTotal":"总任务数","successRate":"成功率","topModel":"调用最多模型","taskTypes":"任务类型","calls":"次调用"},"knowledge":{"title":"知识库管理","description":"管理本地文件和知识库索引","manageTitle":"知识库管理","manageDesc":"查看知识库统计、分类和功能状态","stats":"统计概览","files":"文件管理","settings":"知识库设置","totalFiles":"文件总数","totalChunks":"分块总数","totalSize":"存储大小","lastIndexed":"上次索引","categories":"文件分类","fileCount":"文件数量","search":"搜索文件","searchPlaceholder":"输入文件名或内容关键词...","filterCategory":"筛选分类","allCategories":"全部类型","upload":"上传文件","uploadHint":"点击或拖拽上传 (PDF, Word, Excel, 图片, 代码等)","uploading":"上传中...","reindex":"重新索引","reindexing":"正在重新索引...","delete":"删除","deleteConfirm":"确定要删除该文件吗?此操作不可恢复。","fileList":"文件列表","fileName":"文件名","fileSize":"大小","fileCategory":"分类","fileDate":"修改日期","noFiles":"暂无文件,请上传文件开始使用","loadError":"加载文件列表失败","emptySearch":"未找到匹配的文件","ignoreRules":"忽略规则","ignoreHint":"每行一个 glob 模式,匹配的文件将被跳过","saveIgnore":"保存规则","duplicates":"重复文件","noDuplicates":"未发现重复文件","duplicatesFound":"发现 {count} 组重复文件","features":"功能状态","featureName":"功能","featureDesc":"说明","featureValue":"实现","featureVectorStoreDesc":"向量数据库,存储文档向量索引","featureEmbeddingDesc":"文本嵌入模型,将文本转换为向量","featureDedup":"去重引擎","featureDedupDesc":"检测并移除重复/相似文档","featureChunker":"分块器","featureChunkerDesc":"将文档拆分为可检索的语义块","globalSearch":"全局搜索","projectSearch":"项目搜索","autoIndex":"自动索引","enabled":"已启用","disabled":"已禁用","parentChunks":"父级切片","childChunks":"子级切片","parentChunkId":"父级 ID","chunkIndex":"切片序号","chunkType":"类型","sectionOrRange":"章节/范围","chunkContent":"内容","parentChunkHint":"父级切片是同一 parentId 下子级切片的上下文合集;当一个父级只包含一个子级时,两处内容相同是正常现象。","parentMatches":"父级命中","childMatches":"子级命中","filterTerm":"筛选词","searchTitle":"知识库搜索","searchDesc":"查看混合检索、父级回填、分块来源和评分明细;文档工作台会使用同一套检索链路按章节自动召回证据。","goToDocuments":"进入文档工作台","autoSearchFirst":"自动检索为主,人工确认为辅","autoSearchFirstDesc":"文档工作台会自动按章节检索证据;只有当必须指定官方资料、图纸或表格时,才需要复制文件路径作为高级优先证据。","searchContentPlaceholder":"输入要搜索的知识库内容","searchAction":"搜索","searchFailed":"搜索失败","recallWeightTuning":"召回权重调节","debugPanel":"检索调试面板","originalQuery":"原始查询","reranker":"重排器","rewrittenQueries":"查询改写","recallCounts":"召回数量","recallWeights":"召回权重","searchResults":"搜索结果","noSearchResults":"暂无结果","resultIndex":"序号","rowRange":"行","copyAsPriorityEvidence":"复制为高级优先证据","copyPriorityEvidenceSuccess":"已复制文件路径;仅在需要人工指定证据时粘贴到章节的高级优先证据中","expand":"展开","weights":{"keyword":"关键词权重","vector":"向量权重","rewrite":"改写权重","hybridBonus":"混合加成"},"recallSources":{"keyword":"关键词检索","vector":"向量检索","rewrite":"查询改写","hybrid":"混合检索","rerank":"重排"},"scopes":{"project":"当前项目","global":"全局"},"scoreDetails":{"keywordScore":"关键词分","bm25Score":"BM25 分","vectorScore":"向量分","rerankBoost":"重排加成","hybridScore":"混合分"}},"models":{"title":"模型配置","description":"管理 LLM 模型与层级分配","modelList":"Model 列表","addModel":"添加模型","editModel":"编辑模型","providerName":"Provider 名称","modelName":"模型名称","apiKey":"API Key","baseUrl":"Base URL","protocol":"请求协议","testConnection":"测试连接","testing":"测试中...","connected":"已连接","connectionFailed":"连接失败","noProviders":"暂无模型,请添加一个","modelTiers":"模型层级分配","tierReader":"Reader(只读)","tierReaderDesc":"处理低风险、只读和成本敏感任务,例如读取文件、检索知识库、搜索文本、整理上下文。建议选择速度快、价格低、长上下文能力稳定的模型。","tierReasoning":"Reasoning(推理)","tierReasoningDesc":"处理需要深入分析、规划、代码理解和多步骤推理的任务。建议选择推理能力强、稳定性高的模型,必要时可使用更高阶模型。","tierAction":"Action(操作)","tierActionDesc":"处理会产生副作用的任务,例如写文件、修改代码、执行命令、调用外部工具。建议选择可靠、遵循指令能力强且经过验证的模型。","activeModel":"当前模型","deleteProvider":"删除","deleteProviderConfirm":"确定要删除此模型及其所有配置吗?","modelNamePlaceholder":"例如: gpt-4o / deepseek-chat","selectModelPlaceholder":"暂不配置","apiKeyEditHint":"已配置的 Key 会以掩码回显,聚焦后可输入新 Key;掩码不可复制,留空或保持掩码则不修改。","apiKeyEditPlaceholder":"输入新的 API Key,留空保持不变","embeddingConfig":"Embedding 配置","embeddingProvider":"Embedding Provider","embeddingProviderHash":"本地语义模型","embeddingProviderOpenAI":"OpenAI 兼容 Embedding","embeddingHint":"Embedding 用于知识库向量检索。修改 Embedding 模型或维度后,建议到知识库页面重新索引。","model":"Model","dimensions":"Dimensions","status":"状态","localHash":"本地语义模型","openAICompatible":"OpenAI 兼容","saveEmbedding":"保存 Embedding 配置","testEmbedding":"测试 Embedding","embeddingApiKeyHint":"留空或保持掩码表示不修改密钥","optional":"可选","save":"保存","cancel":"取消"},"context":{"title":"上下文工程管理","longTermDesc":"来自记忆库的持久化上下文(跨会话保留)","shortTermDesc":"来自最近会话日志的短期上下文","longTermSource":"数据来源: ~/.customize-agent/memory.db(记忆库)","shortTermSource":"数据来源: ~/.customize-agent/logs/(会话日志)","importance":"重要性","content":"内容","tags":"标签","source":"来源","sourceHint":"可选,额外的来源/上下文说明","updatedAt":"更新时间"},"prompt":{"title":"提示词管理","description":"管理各项目的 CUSTOMIZE.md 系统提示词文件","filePath":"文件路径","lastModified":"最后修改","hasFile":"已配置","noFile":"未配置","noProjects":"暂无项目,请先初始化 Customize Agent 项目"},"documents":{"title":"工作流模版库","description":"基于模板库和本地知识库生成、编辑、校验业务文档","templateLibrary":"模板库","workflow":"模板工作流","template":"模板","selected":"已选择","boundPrompts":"绑定提示词","boundFiles":"绑定知识库文件","boundPromptsRequired":"请选择提示词","boundFilesRequired":"请选择知识库文件","promptRole":"提示词角色","fileRole":"文件角色","manageRoles":"管理角色","roleEditor":"角色编辑器","roleType":"角色类型","roleName":"角色名称","roleDescription":"角色说明","addPromptBinding":"添加提示词绑定","addFileBinding":"添加文件绑定","structuredFacts":"结构化事实","exportGate":"导出门禁","executionStages":"执行阶段","executionStatus":"执行状态","flowPrepare":"准备配置","flowPrepareDesc":"读取模板、项目角色配置、文件角色和提示词角色","flowPrepareDone":"配置读取完成","flowFactExtraction":"事实抽取","flowFactExtractionDesc":"按文件处理类型抽取 JSON 事实和表格结构","flowChapterGeneration":"章节生成","flowChapterGenerationDesc":"基于证据、事实和提示词生成章节草稿","flowValidation":"严格校验","flowValidationDesc":"检查事实完整性、来源追踪和章节证据","flowFormatting":"正式排版","flowFormattingDesc":"生成封面、目录、分页和正式文档结构","flowDone":"生成完成","flowDoneDesc":"流程完成,可进入编辑和导出","flowGateFailed":"生成完成,但导出门禁未通过,请检查校验结果","projectRoleConfig":"项目角色配置","documentSpec":"文档规范包","documentSpecPlaceholder":"请选择文档规范包","exportDocx":"导出 Word","projectRoleConfigRequired":"请选择项目角色配置","noRoleConfig":"未绑定项目角色配置","evidenceLimit":"每章证据数","requirement":"生成要求","requirementPlaceholder":"例如:根据上传的招标文件、图纸和清单,生成一份施工组织设计草稿。","generate":"开始生成","editor":"生成 / 编辑器","edit":"编辑","chapters":"章节","sources":"资料来源","missingItems":"缺失项","validation":"校验","evidenceCount":"证据数量","missingCount":"缺失事实","downloadMarkdown":"下载 Markdown","exportHtml":"导出 HTML","exportPdf":"导出 PDF","saveDraft":"保存草稿","draftHistory":"草稿历史","regenerateChapter":"重新生成本章","newTemplate":"新建模板","templateEditor":"模板编辑器","templateName":"模板名称","templateCategory":"模板分类","templateDescription":"模板说明","outputTitle":"输出标题","chapter":"章节","chapterTitle":"章节标题","chapterPurpose":"章节用途","chapterQueries":"检索 Query","requiredFacts":"必需事实","addChapter":"添加章节","builtIn":"内置","deleteTemplateConfirm":"确定删除该模板吗?","noDraft":"请选择模板并生成草稿"},"specs":{"title":"文档规范包","description":"配置事实字段、章节要求和可执行门禁规则。系统门禁和自定义门禁都会参与生成校验。","newSpec":"新建规范包","list":"规范包列表","editor":"规范包编辑器","name":"规范包名称","specDescription":"规范包说明","wordTemplatePath":"Word 模板路径","facts":"事实字段","chapters":"章节规则","gates":"门禁规则","factName":"字段名称","factType":"字段类型","required":"必填/必需","sourceRoles":"来源文件角色","extractionHint":"抽取说明","validationHint":"校验说明","addFact":"添加事实字段","chapterTitle":"章节标题","order":"顺序","minWords":"最低字数","requiredFacts":"必需事实","requiredFileRoles":"必需文件角色","requiredPromptRoles":"必需提示词角色","generationHint":"生成说明","addChapter":"添加章节规则","gateName":"门禁名称","addGate":"添加门禁规则","plainGuideTitle":"大白话说明:文档规范包是干什么的?","plainGuideDesc":"文档规范包不是固定模板,而是一组可配置的生产规则:事实字段=这份文档必须知道哪些信息;章节规则=必须有哪些章节、最低写多少、需要哪些事实;门禁规则=生成和导出前必须检查什么。用户可以创建自定义门禁类型,并为它选择校验对象和校验方式;保存后会和系统门禁类型一样执行。不同公司、不同项目可以复制一份规范包再微调。"},"guide":{"title":"学习说明:如何跑通文档生成全流程","description":"本页面用于指导用户从模型配置、上传我的资料、提示词、角色配置、规范包、模板创建、生成校验到导出的完整流程。建议第一次使用时按顺序完成每一步。","fullFlow":"全流程步骤","stepModel":"1. 配置模型","stepModelDesc":"进入模型配置页面,添加可用的大模型供应商和模型,并设置当前启用模型。LLM JSON 事实抽取会优先使用已启用模型;如果模型不可用,系统会回退到本地确定性抽取。","stepKnowledge":"2. 上传知识库文件","stepKnowledgeDesc":"进入知识库页面上传招标文件、工程说明、表格数据、图纸说明、规范文件等资料。上传后等待索引完成,确保文件能在知识库文件列表中看到。","stepPrompt":"3. 创建提示词","stepPromptDesc":"进入提示词页面创建事实抽取、章节生成、校验、格式化等提示词。提示词应明确输出要求、禁止编造、引用来源和格式规范。","stepRole":"4. 配置角色和项目角色配置","stepRoleDesc":"进入角色配置页面,创建文件角色并绑定知识库文件,创建提示词角色并绑定提示词,再创建项目角色配置,对文件角色和提示词角色排序。","stepTemplate":"5. 创建模板","stepTemplateDesc":"进入工作流模版库页面,新建模板,填写名称、分类、输出标题,并绑定一个项目角色配置。模板不直接绑定文件和提示词,只绑定项目角色配置。","stepGenerate":"6. 执行生成","stepGenerateDesc":"点击生成后,执行状态 Card 会展示准备配置、事实抽取、章节生成、严格校验、正式排版和完成状态,方便用户感知当前进度。","stepReview":"7. 审查结果","stepReviewDesc":"生成后检查编辑器、章节、结构化事实、来源、缺失项、严格校验、导出门禁和执行阶段。校验错误需要先处理再导出正式 PDF。","stepExport":"8. 导出文件","stepExportDesc":"可以导出 Markdown、HTML、PDF。PDF 会启用导出门禁,门禁未通过时系统会阻止导出,避免未经校验的文档流出。","roleDesign":"角色设计说明","roleDesignDesc":"角色用于把用户自定义名称和系统可执行能力连接起来。用户可以完全自定义角色名称,但必须选择执行类型或处理类型,让系统知道如何使用它。","fileRole":"文件角色","fileRoleDesc":"文件角色绑定知识库文件,并选择处理类型,例如规则文件、项目事实文件、表格数据、图纸文件、规范文件或参考资料。","promptRole":"提示词角色","promptRoleDesc":"提示词角色绑定提示词,并选择执行类型,例如事实抽取、章节生成、校验、格式化或参考。","projectConfig":"项目角色配置","projectConfigDesc":"项目角色配置把多个文件角色和提示词角色组合起来,并定义执行顺序。模板只需要绑定项目角色配置。","generationEngine":"生成引擎说明","generationEngineDesc":"生成引擎会按角色配置组织资料和提示词,执行事实抽取、表格解析、章节生成、严格校验和正式排版。","prepareTitle":"准备资料时要注意什么?","prepareContent":"建议至少准备项目事实文件、规则文件和生成提示词。表格类资料应尽量使用清晰表头,图纸资料建议配套图纸目录或说明文件。","rolesTitle":"角色应该怎么命名?","rolesContent":"角色名称建议使用业务语义,例如“招标文件事实源”“劳动力计划表”“施工组织设计章节生成提示词”。系统不依赖名称判断能力,而是依赖处理类型和执行类型。","templateTitle":"模板应该怎么创建?","templateContent":"模板用于定义输出文档类型和标题,绑定项目角色配置即可。不同项目可以复用同一模板,但应创建不同的项目角色配置来绑定不同资料。","generateTitle":"生成过程中怎么看进度?","generateContent":"生成页会显示执行状态 Card。当前步骤会高亮,成功后变为完成;如果失败会显示错误。生成完成后,下方执行阶段会展示后端真实阶段结果。","qaTitle":"怎样判断能否正式导出?","qaContent":"重点查看导出门禁。只有无阻断级错误、基础事实齐全、事实具备来源、章节有证据且没有资料未提供章节时,才建议导出 PDF。"},"roles":{"title":"角色配置","description":"创建文件角色、提示词角色,并组合成可排序的项目角色配置供模板绑定使用","newFileRole":"新建文件角色","newPromptRole":"新建提示词角色","newConfig":"新建项目配置","fileRoles":"文件角色","promptRoles":"提示词角色","configs":"项目角色配置","roleEditor":"角色编辑器","configEditor":"项目角色配置编辑器","roleType":"角色类型","fileRole":"文件角色","promptRole":"提示词角色","roleName":"角色名称","roleDescription":"角色说明","bindFile":"绑定知识库文件","bindPrompt":"绑定提示词","executionType":"执行类型","processingType":"处理类型","factExtraction":"事实抽取","chapterGeneration":"章节生成","validation":"校验","formatting":"格式化","llmReview":"LLM审阅","reference":"参考","ruleFile":"规则文件","projectFactFile":"项目事实文件","tableFile":"表格数据","drawingFile":"图纸文件","specificationFile":"规范文件","configName":"配置名称","configDescription":"配置说明","addRole":"添加角色","plainGuideTitle":"大白话说明:文件角色和提示词角色到底是什么?","plainGuideDesc":"文件角色就是给资料贴用途标签:规则文件=告诉系统必须遵守什么;项目事实文件=告诉系统项目真实信息;表格数据=清单、计划、数据表;图纸文件=图纸目录和设计说明;规范文件=国家/行业/企业标准;参考资料=可参考但不是强事实。提示词角色就是给提示词贴执行标签:事实抽取=先把资料变成事实;章节生成=写正文;校验=找问题;格式化=整理成正式文档。一个角色可以绑定多个文件或多个提示词,适合一个用途对应多份资料的情况。","executionTypeHelp":"大白话:这条提示词在哪个阶段用。事实抽取负责找资料里的真信息;章节生成负责写正文;校验负责挑错;格式化负责整理版式;参考只作为辅助说明。","processingTypeHelp":"大白话:这个文件在生成里扮演什么角色。规则文件是要求和评分规则;项目事实文件是真实项目资料;表格数据是 Excel/CSV/清单;图纸文件是图纸目录和设计说明;规范文件是标准规范;参考资料只做辅助参考。","multiBindFileHelp":"可以多选。比如“项目事实文件”可以同时绑定招标文件、合同摘要、项目概况。少量明确资料建议单绑;同一用途多份资料建议多绑。","multiBindPromptHelp":"可以多选。比如“章节生成”可以同时绑定通用写作要求、公司风格要求、甲方特殊要求。系统会按项目角色配置中的角色顺序使用。"},"settings":{"title":"系统设置","description":"管理语言、主题等偏好","language":"语言","languageDesc":"界面显示语言","theme":"主题","themeDesc":"浅色 / 深色模式","light":"浅色","dark":"深色","system":"跟随系统","about":"关于","version":"版本","port":"服务端口"},"common":{"save":"保存","cancel":"取消","confirm":"确认","delete":"删除","edit":"编辑","add":"添加","search":"搜索","loading":"加载中...","error":"出错了","success":"操作成功","retry":"重试","close":"关闭","back":"返回","more":"更多","noData":"暂无数据","bytes":"字节","kb":"KB","mb":"MB","gb":"GB","unknown":"未知","never":"从未"}}')},22147:(a,b,c)=>{"use strict";async function d(a,b){let c=await fetch(a,b);if(!c.ok){let a=await c.text(),b=a||`HTTP ${c.status}`;try{let c=JSON.parse(a);b=c.error||c.message||b}catch{}throw Error(b)}return c.json()}async function e(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/kb/stats${b}`)}async function f(a){let b=new URLSearchParams;return a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.category&&b.set("category",a.category),a?.page&&b.set("page",String(a.page??1)),a?.limit&&b.set("limit",String(a.limit??50)),d(`/api/kb/files?${b}`)}async function g(a){let b=new URLSearchParams;return a?.query&&b.set("q",a.query),a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.category&&b.set("category",a.category),a?.limit&&b.set("limit",String(a.limit)),a?.includeContent===!1&&b.set("includeContent","0"),d(`/api/kb/files/search?${b}`)}async function h(a,b){let c=new URLSearchParams({relativePath:a});return b&&c.set("projectRoot",b),d(`/api/kb/files/detail?${c}`)}async function i(a,b){return d("/api/kb/files/reindex",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,projectRoot:b})})}async function j(a,b,c){return d("/api/kb/files/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,target:b,projectRoot:c})})}async function k(a,b,c,e){let f=Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_FILES||500),g=Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_BYTES||0x8000000),h=[],i=[],j=0;for(let b of a)i.length>0&&(i.length>=f||j+b.size>g)&&(h.push(i),i=[],j=0),i.push(b),j+=b.size;i.length>0&&h.push(i);let k=[],l=0;for(let f=0;f<h.length;f++){let g=h[f],i=new URLSearchParams({batchIndex:String(f),totalBatches:String(h.length)});c&&i.set("uploadId",c);let j=await d(`/api/kb/upload?${i}`,{method:"POST",body:function(a,b){let c=new FormData;for(let d of(b.projectRoot&&c.append("projectRoot",b.projectRoot),b.uploadId&&c.append("uploadId",b.uploadId),c.append("batchIndex",String(b.batchIndex)),c.append("totalBatches",String(b.totalBatches)),c.append("fileOffset",String(b.fileOffset)),c.append("startIndex",b.startIndex?"1":"0"),c.append("uploadComplete",b.batchIndex===b.totalBatches-1?"1":"0"),a))c.append("files",d,d.name),c.append("relativePaths",d.webkitRelativePath||d.name);return c}(g,{projectRoot:b,uploadId:c,batchIndex:f,totalBatches:h.length,fileOffset:l,startIndex:0===f})});k.push(j),l+=g.length,e?.({uploadedFiles:l,totalFiles:a.length,batchIndex:f,totalBatches:h.length})}return k[k.length-1]??{success:!0}}async function l(a){let b=new URLSearchParams({limit:"50"});return a&&b.set("projectRoot",a),d(`/api/kb/operations?${b}`)}async function m(a){let b=new URLSearchParams({limit:String(a?.limit??50)});return a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.active&&b.set("active","1"),d(`/api/jobs?${b}`)}async function n(a,b){let c=new URLSearchParams;return b&&c.set("projectRoot",b),d(`/api/jobs/${encodeURIComponent(a)}?${c}`)}async function o(a){let b=new URLSearchParams;return a&&b.set("projectRoot",a),d(`/api/kb/operations?${b}`,{method:"DELETE"})}async function p(a,b){let c=new URLSearchParams({id:a});return b&&c.set("projectRoot",b),d(`/api/kb/operations?${c}`,{method:"DELETE"})}async function q(a,b){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,projectRoot:b})})}async function r(a,b){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePaths:a,projectRoot:b})})}async function s(a,b,c){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePaths:a,folderPaths:b,projectRoot:c})})}async function t(a){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({all:!0,projectRoot:a})})}async function u(a){return d("/api/kb/reindex",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectRoot:a})})}async function v(){return d("/api/kb/features")}async function w(a,b){let c=new URLSearchParams({q:a});return b?.projectRoot&&c.set("projectRoot",b.projectRoot),b?.category&&c.set("category",b.category),b?.limit&&c.set("limit",String(b.limit??20)),b?.weights?.keyword!=null&&c.set("keywordWeight",String(b.weights.keyword)),b?.weights?.vector!=null&&c.set("vectorWeight",String(b.weights.vector)),b?.weights?.rewrite!=null&&c.set("rewriteWeight",String(b.weights.rewrite)),b?.weights?.hybridBonus!=null&&c.set("hybridBonus",String(b.weights.hybridBonus)),d(`/api/kb/search?${c}`)}async function x(){return d("/api/prompt")}async function y(a){return d(`/api/documents/roles${a?`?type=${a}`:""}`)}async function z(a){return d("/api/documents/roles",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function A(a,b){return d(`/api/documents/roles?type=${a}&id=${encodeURIComponent(b)}`,{method:"DELETE"})}async function B(a){return d("/api/documents/roles?mode=config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function C(a){return d(`/api/documents/roles?mode=config&id=${encodeURIComponent(a)}`,{method:"DELETE"})}async function D(){return d("/api/documents/templates")}async function E(a,b){let c=b?`&projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/documents/templates?validate=${encodeURIComponent(a)}${c}`)}async function F(a){return d("/api/documents/templates",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function G(a){return d(`/api/documents/templates?templateId=${encodeURIComponent(a)}`,{method:"DELETE"})}async function H(a){return d("/api/documents/templates",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:a})})}async function I(a){return d("/api/documents/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function J(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/documents/generated${b}`)}async function K(a,b=!1,c,e){let f=new URLSearchParams;b&&f.set("lite","1"),c&&f.set("projectRoot",c);let g=f.toString()?`?${f.toString()}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${g}`,{signal:e})}async function L(a,b,c){let e=c?`?projectRoot=${encodeURIComponent(c)}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}async function M(a,b){let c=b?`?projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${c}`,{method:"DELETE"})}async function N(a,b){return d("/api/documents/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"abort",documentId:a,projectRoot:b})})}async function O(a,b){return d("/api/documents/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"resume",documentId:a,projectRoot:b})})}async function P(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/assets/generated${b}`)}async function Q(a,b){let c=b?`&projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/assets/generated?id=${encodeURIComponent(a)}${c}`,{method:"DELETE"})}async function R(a,b){return d("/api/assets/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,action:"index",projectRoot:b})})}async function S(a,b,c){return d("/api/assets/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,action:"open",target:b,projectRoot:c})})}async function T(a){return d("/api/documents/refine",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function U(a,b){return d("/api/documents/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({draft:a,id:b})})}async function V(a){let b=await fetch("/api/documents/export",{method:"POST",headers:{"Content-Type":"application/json",Accept:"pdf"===a.format?"application/pdf":"*/*"},body:JSON.stringify(a)}),c=b.headers.get("content-type")||"",d=async()=>{let a=await b.text(),c=a||"导出失败";try{let b=JSON.parse(a),d=b.issues?.map(a=>a.message).filter(Boolean).slice(0,3).join(";");c=d?`${b.error||"导出失败"}:${d}`:b.message||b.error||c}catch{}throw Error(c.length>300?`${c.slice(0,300)}...`:c)};return b.ok||await d(),"pdf"!==a.format||c.includes("application/pdf")||await d(),"docx"!==a.format||c.includes("officedocument.wordprocessingml.document")||await d(),b.blob()}async function W(){return d("/api/config/providers")}async function X(a,b){return d("/api/config/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a,...b})})}async function Y(a){return d(`/api/config/providers/${encodeURIComponent(a)}`,{method:"DELETE"})}async function Z(){return d("/api/config/models")}async function $(a){return d("/api/config/models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function _(){return d("/api/config/embedding")}async function aa(a){return d("/api/config/embedding",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function ab(){return d("/api/config/embedding/healthCheck",{method:"POST"})}async function ac(a){return d("/api/config/healthCheck",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a})})}async function ad(){return d("/api/health")}async function ae(){return d("/api/system/stats")}async function af(a=200){return d(`/api/system/logs?limit=${a}`)}async function ag(){return d("/api/system/logs",{method:"DELETE"})}async function ah(a,b){let c=b?`?type=${a}&search=${encodeURIComponent(b)}`:`?type=${a}`;return d(`/api/context${c}`)}async function ai(a){return d(`/api/context?type=${a}&stats=1`)}async function aj(a){return d("/api/context",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"compress",type:a})})}async function ak(a){return d("/api/context",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"clear",type:a})})}async function al(a){return d(`/api/context?id=${encodeURIComponent(a)}`,{method:"DELETE"})}async function am(a,b){return d("/api/context",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,...b})})}async function an(a){return d(`/api/config/providers/${encodeURIComponent(a)}`)}c.d(b,{Af:()=>U,Bh:()=>an,CU:()=>p,Dl:()=>D,E:()=>ak,FC:()=>ae,FV:()=>A,Gi:()=>T,H1:()=>u,H7:()=>o,HC:()=>i,HT:()=>f,II:()=>_,JU:()=>Q,NR:()=>B,OX:()=>I,PH:()=>aj,QG:()=>M,Qx:()=>l,SJ:()=>r,SM:()=>E,UE:()=>V,UQ:()=>O,VW:()=>v,W2:()=>w,X8:()=>t,Z3:()=>W,_m:()=>X,a6:()=>L,aP:()=>$,ax:()=>n,bV:()=>H,bZ:()=>ac,c1:()=>k,cQ:()=>J,dd:()=>aa,dg:()=>z,dw:()=>C,dx:()=>x,f$:()=>P,h0:()=>G,h1:()=>Y,hH:()=>ag,hc:()=>e,hn:()=>ah,l2:()=>F,le:()=>ad,lv:()=>y,nU:()=>g,oH:()=>af,oS:()=>S,p:()=>ai,r:()=>N,tZ:()=>s,tn:()=>j,u6:()=>ab,uc:()=>R,v7:()=>K,xC:()=>h,xq:()=>q,xw:()=>al,zA:()=>m,zo:()=>am,zr:()=>Z})},26588:(a,b,c)=>{"use strict";c.d(b,{A:()=>i});var d=c(8732),e=c(82015),f=c(60056),g=c(79270),h=c(22147);function i(){let[a,b]=(0,e.useState)(!1),[c,i]=(0,e.useState)([]),j=async()=>{i((await (0,h.zA)({limit:50})).jobs||[])},k=(0,e.useMemo)(()=>c.filter(a=>"processing"===a.status).length,[c]),l=c[0];return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.Ex,{count:k,size:"small",children:(0,d.jsx)(f.$n,{className:"topbarBtn",onClick:()=>b(!0),icon:k?(0,d.jsx)(g.SyncOutlined,{spin:!0}):(0,d.jsx)(g.ClockCircleOutlined,{}),children:"后台任务"})}),l&&!a&&k>0&&(0,d.jsxs)("span",{style:{maxWidth:260,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"var(--colorTextSecondary)"},children:[l.title," \xb7 ",l.percent,"%"]}),(0,d.jsx)(f._s,{title:"后台任务",placement:"right",width:420,open:a,onClose:()=>b(!1),extra:(0,d.jsx)(f.$n,{size:"small",onClick:()=>void j(),children:"刷新"}),children:0===c.length?(0,d.jsx)(f.Sv,{description:"暂无后台任务"}):(0,d.jsx)(f.B8,{dataSource:c,renderItem:a=>{var b,c;return(0,d.jsx)(f.B8.Item,{children:(0,d.jsx)(f.B8.Item.Meta,{avatar:"processing"===(b=a.status)?(0,d.jsx)(g.SyncOutlined,{spin:!0}):"success"===b?(0,d.jsx)(g.CheckCircleOutlined,{}):"warning"===b?(0,d.jsx)(g.ClockCircleOutlined,{}):(0,d.jsx)(g.CloseCircleOutlined,{}),title:(0,d.jsxs)(f.$x,{children:[(0,d.jsx)(f.o5.Text,{strong:!0,children:a.title}),(0,d.jsx)(f.vw,{color:"processing"===(c=a.status)?"processing":"success"===c?"success":"warning"===c?"warning":"error",children:a.status})]}),description:(0,d.jsxs)(f.$x,{direction:"vertical",style:{width:"100%"},size:6,children:[(0,d.jsx)(f.o5.Text,{type:"error"===a.status?"danger":void 0,children:a.error||a.message}),(0,d.jsx)(f.ke,{percent:Math.max(0,Math.min(100,Math.round(a.percent||0))),status:"error"===a.status?"exception":"success"===a.status?"success":"active"}),a.chunkCount?(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["切片数:",a.chunkCount]}):null,a.filePath&&(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["文件:",a.filePath]}),(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["更新时间:",new Date(a.updatedAt).toLocaleString()]})]})})})}})})]})}},34924:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Y:()=>k});var e=c(8732),f=c(57312),g=c(94487),h=c(68329),i=c(26588),j=a([f,g]);function k(){let{resolvedTheme:a,setTheme:b}=(0,f.useTheme)(),{locale:c,setLocale:d}=(0,g.x_)(),j=(0,g.Vr)("settings"),k="dark"===a;return(0,e.jsxs)("header",{className:"topbar",children:[(0,e.jsx)("div",{className:"flex-1"}),(0,e.jsx)(i.A,{}),(0,e.jsxs)("button",{onClick:()=>b(k?"light":"dark"),className:"topbarBtn",children:[k?(0,e.jsx)(h.bd5,{size:14}):(0,e.jsx)(h.AX$,{size:14}),(0,e.jsx)("span",{children:j(k?"light":"dark")})]}),(0,e.jsxs)("button",{onClick:()=>{d("zh-CN"===c?"en-US":"zh-CN")},className:"topbarBtn",children:[(0,e.jsx)(h.ATU,{size:14}),(0,e.jsx)("span",{children:"zh-CN"===c?"English":"中文"})]})]})}[f,g]=j.then?(await j)():j,d()}catch(a){d(a)}})},54506:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"Admin Console"},"nav":{"overview":"Overview","knowledge":"Knowledge Base","knowledgeManage":"KB Management","fileManagement":"File Management","knowledgeSearch":"KB Search","documents":"Workflow Templates","assetLibrary":"Generated Assets","documentRoles":"Role Config","documentSpecs":"Document Specs","guide":"Guide","models":"Model Config","settings":"Settings","contextEngineering":"Context Engineering","longTermContext":"Long-term Context","shortTermContext":"Short-term Context","promptManagement":"Prompt Management","systemLogs":"System Logs"},"overview":{"title":"System Overview","description":"Monitor Customize Agent status and key metrics","status":"Service Status","statusRunning":"Running","statusError":"Error","knowledgeBase":"Knowledge Base","modelConfig":"Model Config","filesCount":"Total Files","chunksCount":"Total Chunks","storageSize":"Storage Size","providersCount":"Models","quickActions":"Quick Actions","goToKnowledge":"Manage Knowledge Base","goToModels":"Configure Models","goToSettings":"System Settings","cores":"cores","memory":"Memory","tokensUsed":"Total Tokens","tasksTotal":"Total Tasks","successRate":"Success Rate","topModel":"Most Used Model","taskTypes":"Task Types","calls":"calls"},"knowledge":{"title":"Knowledge Base","description":"Manage local files and knowledge base index","manageTitle":"KB Management","manageDesc":"View knowledge base statistics, categories, and features","stats":"Statistics","files":"File Management","settings":"KB Settings","totalFiles":"Total Files","totalChunks":"Total Chunks","totalSize":"Total Size","lastIndexed":"Last Indexed","categories":"File Categories","fileCount":"File Count","search":"Search Files","searchPlaceholder":"Search by filename or content...","filterCategory":"Filter Category","allCategories":"All Types","upload":"Upload File","uploadHint":"Click or drag to upload (PDF, Word, Excel, images, code, etc.)","uploading":"Uploading...","reindex":"Reindex","reindexing":"Reindexing...","delete":"Delete","deleteConfirm":"Are you sure you want to delete this file? This action cannot be undone.","fileList":"File List","fileName":"File Name","fileSize":"Size","fileCategory":"Category","fileDate":"Modified","noFiles":"No files yet. Upload files to get started.","loadError":"Failed to load file list","emptySearch":"No matching files found","ignoreRules":"Ignore Rules","ignoreHint":"One glob pattern per line. Matching files will be skipped.","saveIgnore":"Save Rules","duplicates":"Duplicate Files","noDuplicates":"No duplicate files found","duplicatesFound":"Found {count} duplicate groups","features":"Feature Status","featureName":"Feature","featureDesc":"Description","featureValue":"Implementation","featureVectorStoreDesc":"Vector database for storing document embeddings","featureEmbeddingDesc":"Text embedding model for converting text to vectors","featureDedup":"Dedup Engine","featureDedupDesc":"Detects and removes duplicate/similar documents","featureChunker":"Chunker","featureChunkerDesc":"Splits documents into retrievable semantic chunks","globalSearch":"Global Search","projectSearch":"Project Search","autoIndex":"Auto Index","enabled":"Enabled","disabled":"Disabled","parentChunks":"Parent Chunks","childChunks":"Child Chunks","parentChunkId":"Parent ID","chunkIndex":"Chunk Index","chunkType":"Type","sectionOrRange":"Section / Range","chunkContent":"Content","parentChunkHint":"A parent chunk is the context bundle of child chunks with the same parentId. If a parent contains only one child, identical content in both tables is expected.","parentMatches":"Parent Matches","childMatches":"Child Matches","filterTerm":"Filter","searchTitle":"Knowledge Base Search","searchDesc":"Inspect hybrid retrieval, parent backfill, chunk sources, and score details. The document workspace uses the same retrieval pipeline to automatically recall chapter evidence.","goToDocuments":"Open Document Workspace","autoSearchFirst":"Automatic retrieval first, manual confirmation second","autoSearchFirstDesc":"The document workspace automatically retrieves evidence by chapter. Copy file paths as advanced priority evidence only when official documents, drawings, or tables must be specified.","searchContentPlaceholder":"Enter knowledge base content to search","searchAction":"Search","searchFailed":"Search failed","recallWeightTuning":"Recall Weight Tuning","debugPanel":"Retrieval Debug Panel","originalQuery":"Original Query","reranker":"Reranker","rewrittenQueries":"Query Rewrites","recallCounts":"Recall Counts","recallWeights":"Recall Weights","searchResults":"Search Results","noSearchResults":"No results","resultIndex":"No.","rowRange":"Rows","copyAsPriorityEvidence":"Copy as Priority Evidence","copyPriorityEvidenceSuccess":"File path copied. Paste it into advanced priority evidence only when manual evidence selection is required.","expand":"Expand","weights":{"keyword":"Keyword Weight","vector":"Vector Weight","rewrite":"Rewrite Weight","hybridBonus":"Hybrid Bonus"},"recallSources":{"keyword":"Keyword Retrieval","vector":"Vector Retrieval","rewrite":"Query Rewrite","hybrid":"Hybrid Retrieval","rerank":"Rerank"},"scopes":{"project":"Current Project","global":"Global"},"scoreDetails":{"keywordScore":"Keyword Score","bm25Score":"BM25 Score","vectorScore":"Vector Score","rerankBoost":"Rerank Boost","hybridScore":"Hybrid Score"}},"models":{"title":"Model Configuration","description":"Manage LLM models and tier assignments","modelList":"Model List","addModel":"Add Model","editModel":"Edit Model","providerName":"Provider Name","modelName":"Model Name","apiKey":"API Key","baseUrl":"Base URL","protocol":"Protocol","testConnection":"Test Connection","testing":"Testing...","connected":"Connected","connectionFailed":"Connection Failed","noProviders":"No models yet. Add one to get started.","modelTiers":"Model Tier Assignment","tierReader":"Reader (Read-only)","tierReaderDesc":"Handles low-risk, read-only, and cost-sensitive work such as reading files, searching the knowledge base, text search, and context organization. Prefer fast, inexpensive models with stable long-context support.","tierReasoning":"Reasoning (Analysis)","tierReasoningDesc":"Handles deeper analysis, planning, code understanding, and multi-step reasoning. Prefer models with stronger reasoning quality and reliability.","tierAction":"Action (Write/Execute)","tierActionDesc":"Handles side-effect operations such as writing files, changing code, running commands, and calling external tools. Prefer reliable models with strong instruction-following and verified behavior.","activeModel":"Active Model","deleteProvider":"Delete","deleteProviderConfirm":"Are you sure you want to delete this model and all its configs?","modelNamePlaceholder":"e.g. gpt-4o / deepseek-chat","selectModelPlaceholder":"No model selected","apiKeyEditHint":"Configured keys are shown as a masked value. Focus the field to enter a new key; the mask cannot be copied. Leave empty or keep the mask to avoid changes.","apiKeyEditPlaceholder":"Enter a new API key, or leave empty to keep current","embeddingConfig":"Embedding Configuration","embeddingProvider":"Embedding Provider","embeddingProviderHash":"Local Semantic Embedding","embeddingProviderOpenAI":"OpenAI-compatible Embedding","embeddingHint":"Embedding is used for knowledge base vector retrieval. After changing the embedding model or dimensions, reindex the knowledge base.","model":"Model","dimensions":"Dimensions","status":"Status","localHash":"Local Semantic Embedding","openAICompatible":"OpenAI-compatible","saveEmbedding":"Save Embedding Config","testEmbedding":"Test Embedding","embeddingApiKeyHint":"Leave empty or keep the masked value to avoid changing the key","optional":"Optional","save":"Save","cancel":"Cancel"},"context":{"title":"Context Engineering","longTermDesc":"Persistent context from memory store (cross-session)","shortTermDesc":"Short-term context from recent session logs","longTermSource":"Source: ~/.customize-agent/memory.db (Memory Store)","shortTermSource":"Source: ~/.customize-agent/logs/ (Session Logs)","importance":"Importance","content":"Content","tags":"Tags","source":"Source","sourceHint":"Optional additional source/context description","updatedAt":"Updated"},"prompt":{"title":"Prompt Management","description":"Manage CUSTOMIZE.md system prompt files per project","filePath":"File Path","lastModified":"Last Modified","hasFile":"Configured","noFile":"Not Configured","noProjects":"No projects found. Initialize a Customize Agent project first."},"documents":{"title":"Workflow Templates","description":"Generate, edit, and validate business documents from templates and the local knowledge base","templateLibrary":"Template Library","workflow":"Template Workflow","template":"Template","selected":"Selected","boundPrompts":"Bound Prompts","boundFiles":"Bound Knowledge Files","boundPromptsRequired":"Select prompts","boundFilesRequired":"Select knowledge files","promptRole":"Prompt Role","fileRole":"File Role","manageRoles":"Manage Roles","roleEditor":"Role Editor","roleType":"Role Type","roleName":"Role Name","roleDescription":"Role Description","addPromptBinding":"Add Prompt Binding","addFileBinding":"Add File Binding","structuredFacts":"Structured Facts","exportGate":"Export Gate","executionStages":"Execution Stages","executionStatus":"Execution Status","flowPrepare":"Prepare Config","flowPrepareDesc":"Load template, project role config, file roles, and prompt roles","flowPrepareDone":"Config loaded","flowFactExtraction":"Fact Extraction","flowFactExtractionDesc":"Extract JSON facts and table structures by file processing type","flowChapterGeneration":"Chapter Generation","flowChapterGenerationDesc":"Generate chapter drafts from evidence, facts, and prompts","flowValidation":"Strict Validation","flowValidationDesc":"Check fact completeness, source traceability, and chapter evidence","flowFormatting":"Formal Formatting","flowFormattingDesc":"Generate cover, table of contents, page breaks, and formal document structure","flowDone":"Completed","flowDoneDesc":"Generation completed; ready for editing and export","flowGateFailed":"Generation completed, but export gate failed. Check validation results","projectRoleConfig":"Project Role Config","documentSpec":"Document Spec Package","documentSpecPlaceholder":"Select a document spec package","exportDocx":"Export Word","projectRoleConfigRequired":"Select a project role config","noRoleConfig":"No project role config bound","evidenceLimit":"Evidence per Chapter","requirement":"Generation Requirement","requirementPlaceholder":"Example: Generate a construction organization design draft from uploaded tender files, drawings, and BOQ sheets.","generate":"Generate","editor":"Generate / Editor","edit":"Edit","chapters":"Chapters","sources":"Sources","missingItems":"Missing Items","validation":"Validation","evidenceCount":"Evidence Count","missingCount":"Missing Facts","downloadMarkdown":"Download Markdown","exportHtml":"Export HTML","exportPdf":"Export PDF","saveDraft":"Save Draft","draftHistory":"Draft History","regenerateChapter":"Regenerate Chapter","newTemplate":"New Template","templateEditor":"Template Editor","templateName":"Template Name","templateCategory":"Template Category","templateDescription":"Template Description","outputTitle":"Output Title","chapter":"Chapter","chapterTitle":"Chapter Title","chapterPurpose":"Chapter Purpose","chapterQueries":"Search Queries","requiredFacts":"Required Facts","addChapter":"Add Chapter","builtIn":"Built-in","deleteTemplateConfirm":"Delete this template?","noDraft":"Select a template and generate a draft"},"specs":{"title":"Document Spec Packages","description":"Configure fact fields, chapter rules, and executable gate rules. Both system and custom gate types participate in validation.","newSpec":"New Spec","list":"Spec List","editor":"Spec Editor","name":"Spec Name","specDescription":"Description","wordTemplatePath":"Word Template Path","facts":"Fact Fields","chapters":"Chapter Rules","gates":"Gate Rules","factName":"Field Name","factType":"Field Type","required":"Required","sourceRoles":"Source File Roles","extractionHint":"Extraction Hint","validationHint":"Validation Hint","addFact":"Add Fact Field","chapterTitle":"Chapter Title","order":"Order","minWords":"Min Words","requiredFacts":"Required Facts","requiredFileRoles":"Required File Roles","requiredPromptRoles":"Required Prompt Roles","generationHint":"Generation Hint","addChapter":"Add Chapter Rule","gateName":"Gate Name","addGate":"Add Gate Rule","plainGuideTitle":"Plain explanation: what is a document spec package?","plainGuideDesc":"A document spec package is not a fixed template. It is a configurable production rule set: fact fields define what must be known, chapter rules define required chapters and constraints, and gate rules define checks before generation and export. Users can create custom gate types by choosing a validation subject and operator; saved custom types run just like system gate types."},"guide":{"title":"Guide: Run the Full Document Generation Flow","description":"This guide walks users through model setup, uploading their own files, prompts, role configuration, spec packages, template creation, generation, validation, and export.","fullFlow":"Full Flow","stepModel":"1. Configure Models","stepModelDesc":"Open Model Config, add providers and models, set an active model, and run health checks.","stepKnowledge":"2. Upload Knowledge Files","stepKnowledgeDesc":"Upload tender files, project descriptions, tables, drawings, specifications, and standards, then wait for indexing.","stepPrompt":"3. Create Prompts","stepPromptDesc":"Create prompts for fact extraction, chapter generation, validation, and formatting.","stepRole":"4. Configure Roles","stepRoleDesc":"Create file roles and prompt roles, bind resources, then create an ordered project role config.","stepTemplate":"5. Create Template","stepTemplateDesc":"Create a template in Workflow Templates and bind a project role config.","stepGenerate":"6. Generate","stepGenerateDesc":"Click Generate and observe the execution status card for progress.","stepReview":"7. Review","stepReviewDesc":"Review facts, sources, missing items, validation, export gate, and execution stages.","stepExport":"8. Export","stepExportDesc":"Export Markdown, HTML, or PDF. PDF export enforces the export gate.","roleDesign":"Role Design","roleDesignDesc":"Roles connect user-defined names to executable system behavior through execution or processing types.","fileRole":"File Role","fileRoleDesc":"A file role binds a knowledge file and declares its processing type.","promptRole":"Prompt Role","promptRoleDesc":"A prompt role binds a prompt and declares its execution type.","projectConfig":"Project Role Config","projectConfigDesc":"A project role config combines and orders file roles and prompt roles. Templates bind configs directly.","generationEngine":"Generation Engine","generationEngineDesc":"The engine organizes resources by roles and runs fact extraction, table parsing, generation, validation, and formatting.","prepareTitle":"How should I prepare files?","prepareContent":"Prepare project facts, rules, tables, drawings, and specifications. Make table headers clear and include drawing descriptions when possible.","rolesTitle":"How should roles be named?","rolesContent":"Use business names such as Tender Fact Source, Labor Plan Table, or Chapter Generation Prompt. System behavior depends on types, not names.","templateTitle":"How should templates be created?","templateContent":"Templates define document entry and output title. Bind a project role config instead of selecting files and prompts directly.","generateTitle":"How do I see progress?","generateContent":"The generation page shows an execution status card. The current step is highlighted and final backend stages appear after completion.","qaTitle":"How do I know whether export is allowed?","qaContent":"Check the export gate. PDF export should only proceed when there are no blocking errors and facts/sources/chapters are complete."},"roles":{"title":"Role Config","description":"Create file roles and prompt roles, then combine them into ordered project role configs for templates","newFileRole":"New File Role","newPromptRole":"New Prompt Role","newConfig":"New Project Config","fileRoles":"File Roles","promptRoles":"Prompt Roles","configs":"Project Role Configs","roleEditor":"Role Editor","configEditor":"Project Role Config Editor","roleType":"Role Type","fileRole":"File Role","promptRole":"Prompt Role","roleName":"Role Name","roleDescription":"Role Description","bindFile":"Bind Knowledge File","bindPrompt":"Bind Prompt","executionType":"Execution Type","processingType":"Processing Type","factExtraction":"Fact Extraction","chapterGeneration":"Chapter Generation","validation":"Validation","formatting":"Formatting","llmReview":"LLM Review","reference":"Reference","ruleFile":"Rule File","projectFactFile":"Project Fact File","tableFile":"Table Data","drawingFile":"Drawing File","specificationFile":"Specification File","configName":"Config Name","configDescription":"Config Description","addRole":"Add Role","plainGuideTitle":"Plain explanation: what are file roles and prompt roles?","plainGuideDesc":"File roles label what files are used for. Rule files define requirements; project fact files contain real project info; table data means spreadsheets; drawing files mean drawing catalogs/descriptions; specification files are standards; references are only supporting materials. Prompt roles label when prompts are used. A role can bind multiple files or prompts when one purpose needs multiple resources.","executionTypeHelp":"Which stage this prompt is used in: fact extraction, chapter generation, validation, formatting, or reference.","processingTypeHelp":"What this file does in generation: rules, facts, tables, drawings, specifications, or references.","multiBindFileHelp":"Multiple files are allowed when one purpose has multiple source files.","multiBindPromptHelp":"Multiple prompts are allowed when one stage needs multiple prompt rules."},"settings":{"title":"System Settings","description":"Manage language, theme, and other preferences","language":"Language","languageDesc":"Interface display language","theme":"Theme","themeDesc":"Light / Dark mode","light":"Light","dark":"Dark","system":"System","about":"About","version":"Version","port":"Service Port"},"common":{"save":"Save","cancel":"Cancel","confirm":"Confirm","delete":"Delete","edit":"Edit","add":"Add","search":"Search","loading":"Loading...","error":"Something went wrong","success":"Success","retry":"Retry","close":"Close","back":"Back","more":"More","noData":"No data","bytes":"bytes","kb":"KB","mb":"MB","gb":"GB","unknown":"Unknown","never":"Never"}}')},66285:()=>{},93065:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>m});var e=c(8732),f=c(82015),g=c(21202),h=c(9328),i=c.n(h),j=c(94487),k=c(68329),l=a([j]);j=(l.then?(await l)():l)[0];let n=[{href:"/overview",icon:k.HxJ,labelKey:"nav.overview"},{icon:k.WmV,labelKey:"nav.knowledge",children:[{href:"/knowledge/manage",icon:k.BmN,labelKey:"nav.knowledgeManage"},{href:"/knowledge/files",icon:k.iUU,labelKey:"nav.fileManagement"},{href:"/knowledge/search",icon:k.vji,labelKey:"nav.knowledgeSearch"}]},{href:"/models",icon:k.fX,labelKey:"nav.models"},{href:"/prompt",icon:k.vEG,labelKey:"nav.promptManagement"},{href:"/document-roles",icon:k.wB_,labelKey:"nav.documentRoles"},{href:"/documents",icon:k.sv7,labelKey:"nav.documents"},{href:"/asset-library",icon:k.BmN,labelKey:"nav.assetLibrary"},{icon:k.jy9,labelKey:"nav.contextEngineering",children:[{href:"/context/long-term",icon:k.WmV,labelKey:"nav.longTermContext"},{href:"/context/short-term",icon:k.WmV,labelKey:"nav.shortTermContext"}]},{href:"/system/logs",icon:k.zPv,labelKey:"nav.systemLogs"},{href:"/guide",icon:k.Gyj,labelKey:"nav.guide"},{href:"/settings",icon:k.wB_,labelKey:"nav.settings"}];function m(){let a=(0,g.usePathname)(),b=(0,j.Vr)(),c=(0,f.useMemo)(()=>{let b={};for(let c of n)c.children?.some(b=>a===b.href||a.startsWith(b.href+"/"))&&(b[c.labelKey]=!0);return b},[a]),[d,h]=(0,f.useState)({}),[l,m]=(0,f.useState)(!1);return(0,e.jsxs)("aside",{className:`sidebar${l?" sidebarCollapsedSelf":""}`,children:[(0,e.jsx)(i(),{href:"/overview",prefetch:!1,children:(0,e.jsx)("div",{className:"sidebarLogo",children:(0,e.jsx)("div",{className:"sidebarLogoTitle",style:{fontSize:20,fontWeight:800,letterSpacing:"0.5px"},children:(0,e.jsx)("span",{className:"logoGradient",children:b("app.title")})})})}),(0,e.jsx)("button",{className:"sidebarCollapseBtn",onClick:()=>m(a=>!a),"aria-label":l?"展开侧边栏":"收起侧边栏",children:l?(0,e.jsx)(k.wdi,{size:16}):(0,e.jsx)(k.ues,{size:16})}),(0,e.jsx)("nav",{className:"sidebarNav",children:n.map(f=>{if(f.children){let g=d[f.labelKey]??c[f.labelKey]??!1;return(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"sidebarItem sidebarParent",onClick:()=>{var a;return a=f.labelKey,void h(b=>({...b,[a]:!b[a]}))},children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)}),(0,e.jsx)("span",{className:"sidebarChevron",children:g?(0,e.jsx)(k.yQN,{size:14}):(0,e.jsx)(k.c_$,{size:14})})]}),g&&!l&&(0,e.jsx)("div",{className:"sidebarSubmenu",children:f.children.map(c=>{let d=a===c.href||a.startsWith(c.href+"/");return(0,e.jsx)(i(),{href:c.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem sidebarSubItem${d?" sidebarItemActive":""}`,children:[(0,e.jsx)(c.icon,{size:16}),(0,e.jsx)("span",{children:b(c.labelKey)})]})},c.href)})})]},f.labelKey)}let g=a===f.href||a.startsWith(f.href+"/");return(0,e.jsx)(i(),{href:f.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem${g?" sidebarItemActive":""}`,children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)})]})},f.href)})})]})}d()}catch(a){d(a)}})},94487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PE:()=>x,Vr:()=>v,x_:()=>t});var e=c(8732),f=c(82015),g=c(49702),h=c.n(g),i=c(42583),j=c(57312),k=c(60056),l=c(2973),m=c(40107),n=c(4823),o=c(93065),p=c(34924),q=c(13484),r=c(54506),s=a([j,o,p]);[j,o,p]=s.then?(await s)():s;let y=(0,f.createContext)(null);function t(){let a=(0,f.useContext)(y);if(!a)throw Error("useAppLocale must be used inside Layout");return a}function u(a,b){let c=b.split(".").reduce((a,b)=>{if(a&&"object"==typeof a&&b in a)return a[b]},a);return"string"==typeof c?c:b}function v(a){let{messages:b}=t();return(0,f.useCallback)(c=>{if(!a)return u(b,c);let d=`${a}.${c}`,e=u(b,d);return e===d?u(b,c):e},[b,a])}let z={"zh-CN":q,"en-US":r};function w({children:a}){let{resolvedTheme:b}=(0,j.useTheme)();(0,i.useRouter)();let[c,d]=(0,f.useState)("zh-CN"),[g,q]=(0,f.useState)(!1),r="dark"===b,s=z[c]??z["zh-CN"],t=(0,f.useCallback)(a=>{document.cookie=`NEXT_LOCALE=${a};path=/;max-age=31536000;samesite=lax`,d(a)},[]),u=(0,f.useMemo)(()=>({locale:c,setLocale:t,messages:s}),[c,t,s]),v=(0,f.useMemo)(()=>(0,n.D)(r),[r]),w="en-US"===c?m.default:l.A;return(0,e.jsx)(y.Provider,{value:u,children:(0,e.jsx)(k.sG,{theme:v,locale:w,children:(0,e.jsxs)(k.qw,{children:[(0,e.jsx)(h(),{children:(0,e.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1, viewport-fit=cover"})}),(0,e.jsx)(o.B,{}),(0,e.jsxs)("div",{className:"mainContent",children:[(0,e.jsx)(p.Y,{}),(0,e.jsx)("main",{className:`mainInner${g?" pageTransitioning":""}`,children:a})]})]})})})}function x({children:a}){return(0,e.jsx)(j.ThemeProvider,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,children:(0,e.jsx)(w,{children:a})})}d()}catch(a){d(a)}})},97237:()=>{}};
1
+ exports.id=8204,exports.ids=[8204],exports.modules={4823:(a,b,c)=>{"use strict";c.d(b,{D:()=>e});var d=c(60056);function e(a){return{algorithm:a?d.w4.darkAlgorithm:d.w4.defaultAlgorithm,token:{colorPrimary:a?"#0a84ff":"#007aff",colorInfo:a?"#0a84ff":"#007aff",colorSuccess:a?"#30d158":"#34c759",colorWarning:a?"#ff9f0a":"#ff9500",colorError:a?"#ff453a":"#ff3b30",colorBgBase:a?"#1c1c1e":"#f5f5f7",colorBgContainer:a?"rgba(44,44,46,0.78)":"rgba(255,255,255,0.78)",colorBgElevated:a?"rgba(44,44,46,0.92)":"rgba(255,255,255,0.94)",colorBorder:a?"rgba(255,255,255,0.12)":"rgba(60,60,67,0.16)",colorText:a?"#f5f5f7":"#1d1d1f",colorTextSecondary:a?"#98989d":"#6e6e73",fontFamily:"var(--fontSans)",fontSize:14,borderRadius:14,borderRadiusLG:20,borderRadiusSM:10,controlHeight:36,lineWidth:1,boxShadow:a?"0 8px 24px rgba(0,0,0,0.24)":"0 8px 24px rgba(0,0,0,0.06)",boxShadowSecondary:a?"0 4px 12px rgba(0,0,0,0.2)":"0 4px 12px rgba(0,0,0,0.04)",motionDurationMid:"0.2s",motionEaseInOut:"cubic-bezier(0.25, 0.1, 0.25, 1)"},components:{Card:{borderRadiusLG:20,paddingLG:24,headerFontSize:13,headerFontSizeSM:12},Button:{borderRadius:14,borderRadiusLG:18,borderRadiusSM:10,fontWeight:600,primaryShadow:"var(--shadowButton)"},Input:{borderRadius:14,controlHeight:36,activeShadow:"0 0 0 3px rgba(0,122,255,0.12)"},Select:{borderRadius:14},Modal:{borderRadiusLG:20,titleFontSize:17,fontWeightStrong:700},Tag:{borderRadiusSM:100,defaultBg:a?"rgba(255,255,255,0.08)":"rgba(0,0,0,0.04)"},Table:{borderRadiusLG:20,headerBg:a?"rgba(255,255,255,0.04)":"rgba(0,0,0,0.02)",headerColor:"var(--colorTextSecondary)",headerSplitColor:"transparent",headerBorderRadius:12},Spin:{dotSize:28,dotSizeLG:40},Upload:{borderRadiusLG:20}}}}},8204:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{default:()=>h});var e=c(8732),f=c(94487);c(66285),c(97237);var g=a([f]);function h({Component:a,pageProps:b}){return(0,e.jsx)(f.PE,{children:(0,e.jsx)(a,{...b})})}f=(g.then?(await g)():g)[0],d()}catch(a){d(a)}})},13484:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"管理控制台"},"nav":{"overview":"总览","knowledge":"知识库","knowledgeManage":"知识库管理","fileManagement":"文件管理","knowledgeSearch":"知识库搜索","documents":"工作流模版库","assetLibrary":"生成资源","documentRoles":"角色配置","documentSpecs":"文档规范包","guide":"指引","models":"模型配置","settings":"设置","contextEngineering":"上下文工程","longTermContext":"长期上下文","shortTermContext":"短期上下文","promptManagement":"提示词管理","systemLogs":"系统日志"},"overview":{"title":"系统总览","description":"查看 Customize Agent 运行状态与关键指标","status":"服务状态","statusRunning":"运行中","statusError":"异常","knowledgeBase":"知识库","modelConfig":"模型配置","filesCount":"文件总数","chunksCount":"分块总数","storageSize":"存储空间","providersCount":"已配置模型","quickActions":"快捷操作","goToKnowledge":"管理知识库","goToModels":"配置模型","goToSettings":"系统设置","cores":"核","memory":"内存","tokensUsed":"累计 Tokens","tasksTotal":"总任务数","successRate":"成功率","topModel":"调用最多模型","taskTypes":"任务类型","calls":"次调用"},"knowledge":{"title":"知识库管理","description":"管理本地文件和知识库索引","manageTitle":"知识库管理","manageDesc":"查看知识库统计、分类和功能状态","stats":"统计概览","files":"文件管理","settings":"知识库设置","totalFiles":"文件总数","totalChunks":"分块总数","totalSize":"存储大小","lastIndexed":"上次索引","categories":"文件分类","fileCount":"文件数量","search":"搜索文件","searchPlaceholder":"输入文件名或内容关键词...","filterCategory":"筛选分类","allCategories":"全部类型","upload":"上传文件","uploadHint":"点击或拖拽上传 (PDF, Word, Excel, 图片, 代码等)","uploading":"上传中...","reindex":"重新索引","reindexing":"正在重新索引...","delete":"删除","deleteConfirm":"确定要删除该文件吗?此操作不可恢复。","fileList":"文件列表","fileName":"文件名","fileSize":"大小","fileCategory":"分类","fileDate":"修改日期","noFiles":"暂无文件,请上传文件开始使用","loadError":"加载文件列表失败","emptySearch":"未找到匹配的文件","ignoreRules":"忽略规则","ignoreHint":"每行一个 glob 模式,匹配的文件将被跳过","saveIgnore":"保存规则","duplicates":"重复文件","noDuplicates":"未发现重复文件","duplicatesFound":"发现 {count} 组重复文件","features":"功能状态","featureName":"功能","featureDesc":"说明","featureValue":"实现","featureVectorStoreDesc":"向量数据库,存储文档向量索引","featureEmbeddingDesc":"文本嵌入模型,将文本转换为向量","featureDedup":"去重引擎","featureDedupDesc":"检测并移除重复/相似文档","featureChunker":"分块器","featureChunkerDesc":"将文档拆分为可检索的语义块","globalSearch":"全局搜索","projectSearch":"项目搜索","autoIndex":"自动索引","enabled":"已启用","disabled":"已禁用","parentChunks":"父级切片","childChunks":"子级切片","parentChunkId":"父级 ID","chunkIndex":"切片序号","chunkType":"类型","sectionOrRange":"章节/范围","chunkContent":"内容","parentChunkHint":"父级切片是同一 parentId 下子级切片的上下文合集;当一个父级只包含一个子级时,两处内容相同是正常现象。","parentMatches":"父级命中","childMatches":"子级命中","filterTerm":"筛选词","searchTitle":"知识库搜索","searchDesc":"查看混合检索、父级回填、分块来源和评分明细;文档工作台会使用同一套检索链路按章节自动召回证据。","goToDocuments":"进入文档工作台","autoSearchFirst":"自动检索为主,人工确认为辅","autoSearchFirstDesc":"文档工作台会自动按章节检索证据;只有当必须指定官方资料、图纸或表格时,才需要复制文件路径作为高级优先证据。","searchContentPlaceholder":"输入要搜索的知识库内容","searchAction":"搜索","searchFailed":"搜索失败","recallWeightTuning":"召回权重调节","debugPanel":"检索调试面板","originalQuery":"原始查询","reranker":"重排器","rewrittenQueries":"查询改写","recallCounts":"召回数量","recallWeights":"召回权重","searchResults":"搜索结果","noSearchResults":"暂无结果","resultIndex":"序号","rowRange":"行","copyAsPriorityEvidence":"复制为高级优先证据","copyPriorityEvidenceSuccess":"已复制文件路径;仅在需要人工指定证据时粘贴到章节的高级优先证据中","expand":"展开","weights":{"keyword":"关键词权重","vector":"向量权重","rewrite":"改写权重","hybridBonus":"混合加成"},"recallSources":{"keyword":"关键词检索","vector":"向量检索","rewrite":"查询改写","hybrid":"混合检索","rerank":"重排"},"scopes":{"project":"当前项目","global":"全局"},"scoreDetails":{"keywordScore":"关键词分","bm25Score":"BM25 分","vectorScore":"向量分","rerankBoost":"重排加成","hybridScore":"混合分"}},"models":{"title":"模型配置","description":"管理 LLM 模型与层级分配","modelList":"Model 列表","addModel":"添加模型","editModel":"编辑模型","providerName":"Provider 名称","modelName":"模型名称","apiKey":"API Key","baseUrl":"Base URL","protocol":"请求协议","testConnection":"测试连接","testing":"测试中...","connected":"已连接","connectionFailed":"连接失败","noProviders":"暂无模型,请添加一个","modelTiers":"模型层级分配","tierReader":"Reader(只读)","tierReaderDesc":"处理低风险、只读和成本敏感任务,例如读取文件、检索知识库、搜索文本、整理上下文。建议选择速度快、价格低、长上下文能力稳定的模型。","tierReasoning":"Reasoning(推理)","tierReasoningDesc":"处理需要深入分析、规划、代码理解和多步骤推理的任务。建议选择推理能力强、稳定性高的模型,必要时可使用更高阶模型。","tierAction":"Action(操作)","tierActionDesc":"处理会产生副作用的任务,例如写文件、修改代码、执行命令、调用外部工具。建议选择可靠、遵循指令能力强且经过验证的模型。","activeModel":"当前模型","deleteProvider":"删除","deleteProviderConfirm":"确定要删除此模型及其所有配置吗?","modelNamePlaceholder":"例如: gpt-4o / deepseek-chat","selectModelPlaceholder":"暂不配置","apiKeyEditHint":"已配置的 Key 会以掩码回显,聚焦后可输入新 Key;掩码不可复制,留空或保持掩码则不修改。","apiKeyEditPlaceholder":"输入新的 API Key,留空保持不变","embeddingConfig":"Embedding 配置","embeddingProvider":"Embedding Provider","embeddingProviderHash":"本地语义模型","embeddingProviderOpenAI":"OpenAI 兼容 Embedding","embeddingHint":"Embedding 用于知识库向量检索。修改 Embedding 模型或维度后,建议到知识库页面重新索引。","model":"Model","dimensions":"Dimensions","status":"状态","localHash":"本地语义模型","openAICompatible":"OpenAI 兼容","saveEmbedding":"保存 Embedding 配置","testEmbedding":"测试 Embedding","embeddingApiKeyHint":"留空或保持掩码表示不修改密钥","optional":"可选","save":"保存","cancel":"取消"},"context":{"title":"上下文工程管理","longTermDesc":"来自记忆库的持久化上下文(跨会话保留)","shortTermDesc":"来自最近会话日志的短期上下文","longTermSource":"数据来源: ~/.customize-agent/memory.db(记忆库)","shortTermSource":"数据来源: ~/.customize-agent/logs/(会话日志)","importance":"重要性","content":"内容","tags":"标签","source":"来源","sourceHint":"可选,额外的来源/上下文说明","updatedAt":"更新时间"},"prompt":{"title":"提示词管理","description":"管理各项目的 CUSTOMIZE.md 系统提示词文件","filePath":"文件路径","lastModified":"最后修改","hasFile":"已配置","noFile":"未配置","noProjects":"暂无项目,请先初始化 Customize Agent 项目"},"documents":{"title":"工作流模版库","description":"基于模板库和本地知识库生成、编辑、校验业务文档","templateLibrary":"模板库","workflow":"模板工作流","template":"模板","selected":"已选择","boundPrompts":"绑定提示词","boundFiles":"绑定知识库文件","boundPromptsRequired":"请选择提示词","boundFilesRequired":"请选择知识库文件","promptRole":"提示词角色","fileRole":"文件角色","manageRoles":"管理角色","roleEditor":"角色编辑器","roleType":"角色类型","roleName":"角色名称","roleDescription":"角色说明","addPromptBinding":"添加提示词绑定","addFileBinding":"添加文件绑定","structuredFacts":"结构化事实","exportGate":"导出门禁","executionStages":"执行阶段","executionStatus":"执行状态","flowPrepare":"准备配置","flowPrepareDesc":"读取模板、项目角色配置、文件角色和提示词角色","flowPrepareDone":"配置读取完成","flowFactExtraction":"事实抽取","flowFactExtractionDesc":"按文件处理类型抽取 JSON 事实和表格结构","flowChapterGeneration":"章节生成","flowChapterGenerationDesc":"基于证据、事实和提示词生成章节草稿","flowValidation":"严格校验","flowValidationDesc":"检查事实完整性、来源追踪和章节证据","flowFormatting":"正式排版","flowFormattingDesc":"生成封面、目录、分页和正式文档结构","flowDone":"生成完成","flowDoneDesc":"流程完成,可进入编辑和导出","flowGateFailed":"生成完成,但导出门禁未通过,请检查校验结果","projectRoleConfig":"项目角色配置","documentSpec":"文档规范包","documentSpecPlaceholder":"请选择文档规范包","exportDocx":"导出 Word","projectRoleConfigRequired":"请选择项目角色配置","noRoleConfig":"未绑定项目角色配置","evidenceLimit":"每章证据数","requirement":"生成要求","requirementPlaceholder":"例如:根据上传的招标文件、图纸和清单,生成一份施工组织设计草稿。","generate":"开始生成","editor":"生成 / 编辑器","edit":"编辑","chapters":"章节","sources":"资料来源","missingItems":"缺失项","validation":"校验","evidenceCount":"证据数量","missingCount":"缺失事实","downloadMarkdown":"下载 Markdown","exportHtml":"导出 HTML","exportPdf":"导出 PDF","saveDraft":"保存草稿","draftHistory":"草稿历史","regenerateChapter":"重新生成本章","newTemplate":"新建模板","templateEditor":"模板编辑器","templateName":"模板名称","templateCategory":"模板分类","templateDescription":"模板说明","outputTitle":"输出标题","chapter":"章节","chapterTitle":"章节标题","chapterPurpose":"章节用途","chapterQueries":"检索 Query","requiredFacts":"必需事实","addChapter":"添加章节","builtIn":"内置","deleteTemplateConfirm":"确定删除该模板吗?","noDraft":"请选择模板并生成草稿"},"specs":{"title":"文档规范包","description":"配置事实字段、章节要求和可执行门禁规则。系统门禁和自定义门禁都会参与生成校验。","newSpec":"新建规范包","list":"规范包列表","editor":"规范包编辑器","name":"规范包名称","specDescription":"规范包说明","wordTemplatePath":"Word 模板路径","facts":"事实字段","chapters":"章节规则","gates":"门禁规则","factName":"字段名称","factType":"字段类型","required":"必填/必需","sourceRoles":"来源文件角色","extractionHint":"抽取说明","validationHint":"校验说明","addFact":"添加事实字段","chapterTitle":"章节标题","order":"顺序","minWords":"最低字数","requiredFacts":"必需事实","requiredFileRoles":"必需文件角色","requiredPromptRoles":"必需提示词角色","generationHint":"生成说明","addChapter":"添加章节规则","gateName":"门禁名称","addGate":"添加门禁规则","plainGuideTitle":"大白话说明:文档规范包是干什么的?","plainGuideDesc":"文档规范包不是固定模板,而是一组可配置的生产规则:事实字段=这份文档必须知道哪些信息;章节规则=必须有哪些章节、最低写多少、需要哪些事实;门禁规则=生成和导出前必须检查什么。用户可以创建自定义门禁类型,并为它选择校验对象和校验方式;保存后会和系统门禁类型一样执行。不同公司、不同项目可以复制一份规范包再微调。"},"guide":{"title":"学习说明:如何跑通文档生成全流程","description":"本页面用于指导用户从模型配置、上传我的资料、提示词、角色配置、规范包、模板创建、生成校验到导出的完整流程。建议第一次使用时按顺序完成每一步。","fullFlow":"全流程步骤","stepModel":"1. 配置模型","stepModelDesc":"进入模型配置页面,添加可用的大模型供应商和模型,并设置当前启用模型。LLM JSON 事实抽取会优先使用已启用模型;如果模型不可用,系统会回退到本地确定性抽取。","stepKnowledge":"2. 上传知识库文件","stepKnowledgeDesc":"进入知识库页面上传招标文件、工程说明、表格数据、图纸说明、规范文件等资料。上传后等待索引完成,确保文件能在知识库文件列表中看到。","stepPrompt":"3. 创建提示词","stepPromptDesc":"进入提示词页面创建事实抽取、章节生成、校验、格式化等提示词。提示词应明确输出要求、禁止编造、引用来源和格式规范。","stepRole":"4. 配置角色和项目角色配置","stepRoleDesc":"进入角色配置页面,创建文件角色并绑定知识库文件,创建提示词角色并绑定提示词,再创建项目角色配置,对文件角色和提示词角色排序。","stepTemplate":"5. 创建模板","stepTemplateDesc":"进入工作流模版库页面,新建模板,填写名称、分类、输出标题,并绑定一个项目角色配置。模板不直接绑定文件和提示词,只绑定项目角色配置。","stepGenerate":"6. 执行生成","stepGenerateDesc":"点击生成后,执行状态 Card 会展示准备配置、事实抽取、章节生成、严格校验、正式排版和完成状态,方便用户感知当前进度。","stepReview":"7. 审查结果","stepReviewDesc":"生成后检查编辑器、章节、结构化事实、来源、缺失项、严格校验、导出门禁和执行阶段。校验错误需要先处理再导出正式 PDF。","stepExport":"8. 导出文件","stepExportDesc":"可以导出 Markdown、HTML、PDF。PDF 会启用导出门禁,门禁未通过时系统会阻止导出,避免未经校验的文档流出。","roleDesign":"角色设计说明","roleDesignDesc":"角色用于把用户自定义名称和系统可执行能力连接起来。用户可以完全自定义角色名称,但必须选择执行类型或处理类型,让系统知道如何使用它。","fileRole":"文件角色","fileRoleDesc":"文件角色绑定知识库文件,并选择处理类型,例如规则文件、项目事实文件、表格数据、图纸文件、规范文件或参考资料。","promptRole":"提示词角色","promptRoleDesc":"提示词角色绑定提示词,并选择执行类型,例如事实抽取、章节生成、校验、格式化或参考。","projectConfig":"项目角色配置","projectConfigDesc":"项目角色配置把多个文件角色和提示词角色组合起来,并定义执行顺序。模板只需要绑定项目角色配置。","generationEngine":"生成引擎说明","generationEngineDesc":"生成引擎会按角色配置组织资料和提示词,执行事实抽取、表格解析、章节生成、严格校验和正式排版。","prepareTitle":"准备资料时要注意什么?","prepareContent":"建议至少准备项目事实文件、规则文件和生成提示词。表格类资料应尽量使用清晰表头,图纸资料建议配套图纸目录或说明文件。","rolesTitle":"角色应该怎么命名?","rolesContent":"角色名称建议使用业务语义,例如“招标文件事实源”“劳动力计划表”“施工组织设计章节生成提示词”。系统不依赖名称判断能力,而是依赖处理类型和执行类型。","templateTitle":"模板应该怎么创建?","templateContent":"模板用于定义输出文档类型和标题,绑定项目角色配置即可。不同项目可以复用同一模板,但应创建不同的项目角色配置来绑定不同资料。","generateTitle":"生成过程中怎么看进度?","generateContent":"生成页会显示执行状态 Card。当前步骤会高亮,成功后变为完成;如果失败会显示错误。生成完成后,下方执行阶段会展示后端真实阶段结果。","qaTitle":"怎样判断能否正式导出?","qaContent":"重点查看导出门禁。只有无阻断级错误、基础事实齐全、事实具备来源、章节有证据且没有资料未提供章节时,才建议导出 PDF。"},"roles":{"title":"角色配置","description":"创建文件角色、提示词角色,并组合成可排序的项目角色配置供模板绑定使用","newFileRole":"新建文件角色","newPromptRole":"新建提示词角色","newConfig":"新建项目配置","fileRoles":"文件角色","promptRoles":"提示词角色","configs":"项目角色配置","roleEditor":"角色编辑器","configEditor":"项目角色配置编辑器","roleType":"角色类型","fileRole":"文件角色","promptRole":"提示词角色","roleName":"角色名称","roleDescription":"角色说明","bindFile":"绑定知识库文件","bindPrompt":"绑定提示词","executionType":"执行类型","processingType":"处理类型","factExtraction":"事实抽取","chapterGeneration":"章节生成","validation":"校验","formatting":"格式化","llmReview":"LLM审阅","reference":"参考","ruleFile":"规则文件","projectFactFile":"项目事实文件","tableFile":"表格数据","drawingFile":"图纸文件","specificationFile":"规范文件","configName":"配置名称","configDescription":"配置说明","addRole":"添加角色","plainGuideTitle":"大白话说明:文件角色和提示词角色到底是什么?","plainGuideDesc":"文件角色就是给资料贴用途标签:规则文件=告诉系统必须遵守什么;项目事实文件=告诉系统项目真实信息;表格数据=清单、计划、数据表;图纸文件=图纸目录和设计说明;规范文件=国家/行业/企业标准;参考资料=可参考但不是强事实。提示词角色就是给提示词贴执行标签:事实抽取=先把资料变成事实;章节生成=写正文;校验=找问题;格式化=整理成正式文档。一个角色可以绑定多个文件或多个提示词,适合一个用途对应多份资料的情况。","executionTypeHelp":"大白话:这条提示词在哪个阶段用。事实抽取负责找资料里的真信息;章节生成负责写正文;校验负责挑错;格式化负责整理版式;参考只作为辅助说明。","processingTypeHelp":"大白话:这个文件在生成里扮演什么角色。规则文件是要求和评分规则;项目事实文件是真实项目资料;表格数据是 Excel/CSV/清单;图纸文件是图纸目录和设计说明;规范文件是标准规范;参考资料只做辅助参考。","multiBindFileHelp":"可以多选。比如“项目事实文件”可以同时绑定招标文件、合同摘要、项目概况。少量明确资料建议单绑;同一用途多份资料建议多绑。","multiBindPromptHelp":"可以多选。比如“章节生成”可以同时绑定通用写作要求、公司风格要求、甲方特殊要求。系统会按项目角色配置中的角色顺序使用。"},"settings":{"title":"系统设置","description":"管理语言、主题等偏好","language":"语言","languageDesc":"界面显示语言","theme":"主题","themeDesc":"浅色 / 深色模式","light":"浅色","dark":"深色","system":"跟随系统","about":"关于","version":"版本","port":"服务端口"},"common":{"save":"保存","cancel":"取消","confirm":"确认","delete":"删除","edit":"编辑","add":"添加","search":"搜索","loading":"加载中...","error":"出错了","success":"操作成功","retry":"重试","close":"关闭","back":"返回","more":"更多","noData":"暂无数据","bytes":"字节","kb":"KB","mb":"MB","gb":"GB","unknown":"未知","never":"从未"}}')},22147:(a,b,c)=>{"use strict";async function d(a,b){let c=await fetch(a,b);if(!c.ok){let a=await c.text(),b=a||`HTTP ${c.status}`;try{let c=JSON.parse(a);b=c.error||c.message||b}catch{}throw Error(b)}return c.json()}async function e(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/kb/stats${b}`)}async function f(a){let b=new URLSearchParams;return a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.category&&b.set("category",a.category),a?.page&&b.set("page",String(a.page??1)),a?.limit&&b.set("limit",String(a.limit??50)),d(`/api/kb/files?${b}`)}async function g(a){let b=new URLSearchParams;return a?.query&&b.set("q",a.query),a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.category&&b.set("category",a.category),a?.limit&&b.set("limit",String(a.limit)),a?.includeContent===!1&&b.set("includeContent","0"),d(`/api/kb/files/search?${b}`)}async function h(a,b){let c=new URLSearchParams({relativePath:a});return b&&c.set("projectRoot",b),d(`/api/kb/files/detail?${c}`)}async function i(a,b){return d("/api/kb/files/reindex",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,projectRoot:b})})}async function j(a,b,c){return d("/api/kb/files/open",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,target:b,projectRoot:c})})}async function k(a,b,c,e){let f=Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_FILES||500),g=Number(process.env.NEXT_PUBLIC_CUSTOMIZE_KB_UPLOAD_BATCH_BYTES||0x8000000),h=[],i=[],j=0;for(let b of a)i.length>0&&(i.length>=f||j+b.size>g)&&(h.push(i),i=[],j=0),i.push(b),j+=b.size;i.length>0&&h.push(i);let k=[],l=0;for(let f=0;f<h.length;f++){let g=h[f],i=new URLSearchParams({batchIndex:String(f),totalBatches:String(h.length)});c&&i.set("uploadId",c);let j=await d(`/api/kb/upload?${i}`,{method:"POST",body:function(a,b){let c=new FormData;for(let d of(b.projectRoot&&c.append("projectRoot",b.projectRoot),b.uploadId&&c.append("uploadId",b.uploadId),c.append("batchIndex",String(b.batchIndex)),c.append("totalBatches",String(b.totalBatches)),c.append("fileOffset",String(b.fileOffset)),c.append("startIndex",b.startIndex?"1":"0"),c.append("uploadComplete",b.batchIndex===b.totalBatches-1?"1":"0"),a))c.append("files",d,d.name),c.append("relativePaths",d.webkitRelativePath||d.name);return c}(g,{projectRoot:b,uploadId:c,batchIndex:f,totalBatches:h.length,fileOffset:l,startIndex:0===f})});k.push(j),l+=g.length,e?.({uploadedFiles:l,totalFiles:a.length,batchIndex:f,totalBatches:h.length})}return k[k.length-1]??{success:!0}}async function l(a){let b=new URLSearchParams({limit:"50"});return a&&b.set("projectRoot",a),d(`/api/kb/operations?${b}`)}async function m(a){let b=new URLSearchParams({limit:String(a?.limit??50)});return a?.projectRoot&&b.set("projectRoot",a.projectRoot),a?.active&&b.set("active","1"),d(`/api/jobs?${b}`)}async function n(a,b){let c=new URLSearchParams;return b&&c.set("projectRoot",b),d(`/api/jobs/${encodeURIComponent(a)}?${c}`)}async function o(a){let b=new URLSearchParams;return a&&b.set("projectRoot",a),d(`/api/kb/operations?${b}`,{method:"DELETE"})}async function p(a,b){let c=new URLSearchParams({id:a});return b&&c.set("projectRoot",b),d(`/api/kb/operations?${c}`,{method:"DELETE"})}async function q(a,b){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePath:a,projectRoot:b})})}async function r(a,b){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePaths:a,projectRoot:b})})}async function s(a,b,c){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({relativePaths:a,folderPaths:b,projectRoot:c})})}async function t(a){return d("/api/kb/files",{method:"DELETE",headers:{"Content-Type":"application/json"},body:JSON.stringify({all:!0,projectRoot:a})})}async function u(a){return d("/api/kb/reindex",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectRoot:a})})}async function v(){return d("/api/kb/features")}async function w(a,b){let c=new URLSearchParams({q:a});return b?.projectRoot&&c.set("projectRoot",b.projectRoot),b?.category&&c.set("category",b.category),b?.limit&&c.set("limit",String(b.limit??20)),b?.weights?.keyword!=null&&c.set("keywordWeight",String(b.weights.keyword)),b?.weights?.vector!=null&&c.set("vectorWeight",String(b.weights.vector)),b?.weights?.rewrite!=null&&c.set("rewriteWeight",String(b.weights.rewrite)),b?.weights?.hybridBonus!=null&&c.set("hybridBonus",String(b.weights.hybridBonus)),d(`/api/kb/search?${c}`)}async function x(){return d("/api/prompt")}async function y(a){return d(`/api/documents/roles${a?`?type=${a}`:""}`)}async function z(a){return d("/api/documents/roles",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function A(a,b){return d(`/api/documents/roles?type=${a}&id=${encodeURIComponent(b)}`,{method:"DELETE"})}async function B(a){return d("/api/documents/roles?mode=config",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function C(a){return d(`/api/documents/roles?mode=config&id=${encodeURIComponent(a)}`,{method:"DELETE"})}async function D(){return d("/api/documents/templates")}async function E(a,b){let c=b?`&projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/documents/templates?validate=${encodeURIComponent(a)}${c}`)}async function F(a){return d("/api/documents/templates",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function G(a){return d(`/api/documents/templates?templateId=${encodeURIComponent(a)}`,{method:"DELETE"})}async function H(a){return d("/api/documents/templates",{method:"PATCH",headers:{"Content-Type":"application/json"},body:JSON.stringify({templateId:a})})}async function I(a){return d("/api/documents/generate",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function J(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/documents/generated${b}`)}async function K(a,b=!1,c,e){let f=new URLSearchParams;b&&f.set("lite","1"),c&&f.set("projectRoot",c);let g=f.toString()?`?${f.toString()}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${g}`,{signal:e})}async function L(a,b,c){let e=c?`?projectRoot=${encodeURIComponent(c)}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${e}`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(b)})}async function M(a,b){let c=b?`?projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/documents/generated/${encodeURIComponent(a)}${c}`,{method:"DELETE"})}async function N(a,b){return d("/api/documents/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"abort",documentId:a,projectRoot:b})})}async function O(a,b){return d("/api/documents/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"resume",documentId:a,projectRoot:b})})}async function P(a){let b=a?`?projectRoot=${encodeURIComponent(a)}`:"";return d(`/api/assets/generated${b}`)}async function Q(a,b){let c=b?`&projectRoot=${encodeURIComponent(b)}`:"";return d(`/api/assets/generated?id=${encodeURIComponent(a)}${c}`,{method:"DELETE"})}async function R(a,b,c){return d("/api/assets/generated",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,action:"open",target:b,projectRoot:c})})}async function S(a){return d("/api/documents/refine",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function T(a,b){return d("/api/documents/drafts",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({draft:a,id:b})})}async function U(a){let b=await fetch("/api/documents/export",{method:"POST",headers:{"Content-Type":"application/json",Accept:"pdf"===a.format?"application/pdf":"*/*"},body:JSON.stringify(a)}),c=b.headers.get("content-type")||"",d=async()=>{let a=await b.text(),c=a||"导出失败";try{let b=JSON.parse(a),d=b.issues?.map(a=>a.message).filter(Boolean).slice(0,3).join(";");c=d?`${b.error||"导出失败"}:${d}`:b.message||b.error||c}catch{}throw Error(c.length>300?`${c.slice(0,300)}...`:c)};return b.ok||await d(),"pdf"!==a.format||c.includes("application/pdf")||await d(),"docx"!==a.format||c.includes("officedocument.wordprocessingml.document")||await d(),b.blob()}async function V(){return d("/api/config/providers")}async function W(a,b){return d("/api/config/providers",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({name:a,...b})})}async function X(a){return d(`/api/config/providers/${encodeURIComponent(a)}`,{method:"DELETE"})}async function Y(){return d("/api/config/models")}async function Z(a){return d("/api/config/models",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function $(){return d("/api/config/embedding")}async function _(a){return d("/api/config/embedding",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(a)})}async function aa(){return d("/api/config/embedding/healthCheck",{method:"POST"})}async function ab(a){return d("/api/config/healthCheck",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({provider:a})})}async function ac(){return d("/api/health")}async function ad(){return d("/api/system/stats")}async function ae(a=200){return d(`/api/system/logs?limit=${a}`)}async function af(){return d("/api/system/logs",{method:"DELETE"})}async function ag(a,b){let c=b?`?type=${a}&search=${encodeURIComponent(b)}`:`?type=${a}`;return d(`/api/context${c}`)}async function ah(a){return d(`/api/context?type=${a}&stats=1`)}async function ai(a){return d("/api/context",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"compress",type:a})})}async function aj(a){return d("/api/context",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({action:"clear",type:a})})}async function ak(a){return d(`/api/context?id=${encodeURIComponent(a)}`,{method:"DELETE"})}async function al(a,b){return d("/api/context",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:a,...b})})}async function am(a){return d(`/api/config/providers/${encodeURIComponent(a)}`)}c.d(b,{Af:()=>T,Bh:()=>am,CU:()=>p,Dl:()=>D,E:()=>aj,FC:()=>ad,FV:()=>A,Gi:()=>S,H1:()=>u,H7:()=>o,HC:()=>i,HT:()=>f,II:()=>$,JU:()=>Q,NR:()=>B,OX:()=>I,PH:()=>ai,QG:()=>M,Qx:()=>l,SJ:()=>r,SM:()=>E,UE:()=>U,UQ:()=>O,VW:()=>v,W2:()=>w,X8:()=>t,Z3:()=>V,_m:()=>W,a6:()=>L,aP:()=>Z,ax:()=>n,bV:()=>H,bZ:()=>ab,c1:()=>k,cQ:()=>J,dd:()=>_,dg:()=>z,dw:()=>C,dx:()=>x,f$:()=>P,h0:()=>G,h1:()=>X,hH:()=>af,hc:()=>e,hn:()=>ag,l2:()=>F,le:()=>ac,lv:()=>y,nU:()=>g,oH:()=>ae,oS:()=>R,p:()=>ah,r:()=>N,tZ:()=>s,tn:()=>j,u6:()=>aa,v7:()=>K,xC:()=>h,xq:()=>q,xw:()=>ak,zA:()=>m,zo:()=>al,zr:()=>Y})},26588:(a,b,c)=>{"use strict";c.d(b,{A:()=>i});var d=c(8732),e=c(82015),f=c(60056),g=c(79270),h=c(22147);function i(){let[a,b]=(0,e.useState)(!1),[c,i]=(0,e.useState)([]),j=async()=>{i((await (0,h.zA)({limit:50})).jobs||[])},k=(0,e.useMemo)(()=>c.filter(a=>"processing"===a.status).length,[c]),l=c[0];return(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(f.Ex,{count:k,size:"small",children:(0,d.jsx)(f.$n,{className:"topbarBtn",onClick:()=>b(!0),icon:k?(0,d.jsx)(g.SyncOutlined,{spin:!0}):(0,d.jsx)(g.ClockCircleOutlined,{}),children:"后台任务"})}),l&&!a&&k>0&&(0,d.jsxs)("span",{style:{maxWidth:260,overflow:"hidden",textOverflow:"ellipsis",whiteSpace:"nowrap",color:"var(--colorTextSecondary)"},children:[l.title," \xb7 ",l.percent,"%"]}),(0,d.jsx)(f._s,{title:"后台任务",placement:"right",width:420,open:a,onClose:()=>b(!1),extra:(0,d.jsx)(f.$n,{size:"small",onClick:()=>void j(),children:"刷新"}),children:0===c.length?(0,d.jsx)(f.Sv,{description:"暂无后台任务"}):(0,d.jsx)(f.B8,{dataSource:c,renderItem:a=>{var b,c;return(0,d.jsx)(f.B8.Item,{children:(0,d.jsx)(f.B8.Item.Meta,{avatar:"processing"===(b=a.status)?(0,d.jsx)(g.SyncOutlined,{spin:!0}):"success"===b?(0,d.jsx)(g.CheckCircleOutlined,{}):"warning"===b?(0,d.jsx)(g.ClockCircleOutlined,{}):(0,d.jsx)(g.CloseCircleOutlined,{}),title:(0,d.jsxs)(f.$x,{children:[(0,d.jsx)(f.o5.Text,{strong:!0,children:a.title}),(0,d.jsx)(f.vw,{color:"processing"===(c=a.status)?"processing":"success"===c?"success":"warning"===c?"warning":"error",children:a.status})]}),description:(0,d.jsxs)(f.$x,{direction:"vertical",style:{width:"100%"},size:6,children:[(0,d.jsx)(f.o5.Text,{type:"error"===a.status?"danger":void 0,children:a.error||a.message}),(0,d.jsx)(f.ke,{percent:Math.max(0,Math.min(100,Math.round(a.percent||0))),status:"error"===a.status?"exception":"success"===a.status?"success":"active"}),a.chunkCount?(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["切片数:",a.chunkCount]}):null,a.filePath&&(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["文件:",a.filePath]}),(0,d.jsxs)(f.o5.Text,{type:"secondary",children:["更新时间:",new Date(a.updatedAt).toLocaleString()]})]})})})}})})]})}},34924:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{Y:()=>k});var e=c(8732),f=c(57312),g=c(94487),h=c(68329),i=c(26588),j=a([f,g]);function k(){let{resolvedTheme:a,setTheme:b}=(0,f.useTheme)(),{locale:c,setLocale:d}=(0,g.x_)(),j=(0,g.Vr)("settings"),k="dark"===a;return(0,e.jsxs)("header",{className:"topbar",children:[(0,e.jsx)("div",{className:"flex-1"}),(0,e.jsx)(i.A,{}),(0,e.jsxs)("button",{onClick:()=>b(k?"light":"dark"),className:"topbarBtn",children:[k?(0,e.jsx)(h.bd5,{size:14}):(0,e.jsx)(h.AX$,{size:14}),(0,e.jsx)("span",{children:j(k?"light":"dark")})]}),(0,e.jsxs)("button",{onClick:()=>{d("zh-CN"===c?"en-US":"zh-CN")},className:"topbarBtn",children:[(0,e.jsx)(h.ATU,{size:14}),(0,e.jsx)("span",{children:"zh-CN"===c?"English":"中文"})]})]})}[f,g]=j.then?(await j)():j,d()}catch(a){d(a)}})},54506:a=>{"use strict";a.exports=JSON.parse('{"app":{"title":"Customize Agent","subtitle":"Admin Console"},"nav":{"overview":"Overview","knowledge":"Knowledge Base","knowledgeManage":"KB Management","fileManagement":"File Management","knowledgeSearch":"KB Search","documents":"Workflow Templates","assetLibrary":"Generated Assets","documentRoles":"Role Config","documentSpecs":"Document Specs","guide":"Guide","models":"Model Config","settings":"Settings","contextEngineering":"Context Engineering","longTermContext":"Long-term Context","shortTermContext":"Short-term Context","promptManagement":"Prompt Management","systemLogs":"System Logs"},"overview":{"title":"System Overview","description":"Monitor Customize Agent status and key metrics","status":"Service Status","statusRunning":"Running","statusError":"Error","knowledgeBase":"Knowledge Base","modelConfig":"Model Config","filesCount":"Total Files","chunksCount":"Total Chunks","storageSize":"Storage Size","providersCount":"Models","quickActions":"Quick Actions","goToKnowledge":"Manage Knowledge Base","goToModels":"Configure Models","goToSettings":"System Settings","cores":"cores","memory":"Memory","tokensUsed":"Total Tokens","tasksTotal":"Total Tasks","successRate":"Success Rate","topModel":"Most Used Model","taskTypes":"Task Types","calls":"calls"},"knowledge":{"title":"Knowledge Base","description":"Manage local files and knowledge base index","manageTitle":"KB Management","manageDesc":"View knowledge base statistics, categories, and features","stats":"Statistics","files":"File Management","settings":"KB Settings","totalFiles":"Total Files","totalChunks":"Total Chunks","totalSize":"Total Size","lastIndexed":"Last Indexed","categories":"File Categories","fileCount":"File Count","search":"Search Files","searchPlaceholder":"Search by filename or content...","filterCategory":"Filter Category","allCategories":"All Types","upload":"Upload File","uploadHint":"Click or drag to upload (PDF, Word, Excel, images, code, etc.)","uploading":"Uploading...","reindex":"Reindex","reindexing":"Reindexing...","delete":"Delete","deleteConfirm":"Are you sure you want to delete this file? This action cannot be undone.","fileList":"File List","fileName":"File Name","fileSize":"Size","fileCategory":"Category","fileDate":"Modified","noFiles":"No files yet. Upload files to get started.","loadError":"Failed to load file list","emptySearch":"No matching files found","ignoreRules":"Ignore Rules","ignoreHint":"One glob pattern per line. Matching files will be skipped.","saveIgnore":"Save Rules","duplicates":"Duplicate Files","noDuplicates":"No duplicate files found","duplicatesFound":"Found {count} duplicate groups","features":"Feature Status","featureName":"Feature","featureDesc":"Description","featureValue":"Implementation","featureVectorStoreDesc":"Vector database for storing document embeddings","featureEmbeddingDesc":"Text embedding model for converting text to vectors","featureDedup":"Dedup Engine","featureDedupDesc":"Detects and removes duplicate/similar documents","featureChunker":"Chunker","featureChunkerDesc":"Splits documents into retrievable semantic chunks","globalSearch":"Global Search","projectSearch":"Project Search","autoIndex":"Auto Index","enabled":"Enabled","disabled":"Disabled","parentChunks":"Parent Chunks","childChunks":"Child Chunks","parentChunkId":"Parent ID","chunkIndex":"Chunk Index","chunkType":"Type","sectionOrRange":"Section / Range","chunkContent":"Content","parentChunkHint":"A parent chunk is the context bundle of child chunks with the same parentId. If a parent contains only one child, identical content in both tables is expected.","parentMatches":"Parent Matches","childMatches":"Child Matches","filterTerm":"Filter","searchTitle":"Knowledge Base Search","searchDesc":"Inspect hybrid retrieval, parent backfill, chunk sources, and score details. The document workspace uses the same retrieval pipeline to automatically recall chapter evidence.","goToDocuments":"Open Document Workspace","autoSearchFirst":"Automatic retrieval first, manual confirmation second","autoSearchFirstDesc":"The document workspace automatically retrieves evidence by chapter. Copy file paths as advanced priority evidence only when official documents, drawings, or tables must be specified.","searchContentPlaceholder":"Enter knowledge base content to search","searchAction":"Search","searchFailed":"Search failed","recallWeightTuning":"Recall Weight Tuning","debugPanel":"Retrieval Debug Panel","originalQuery":"Original Query","reranker":"Reranker","rewrittenQueries":"Query Rewrites","recallCounts":"Recall Counts","recallWeights":"Recall Weights","searchResults":"Search Results","noSearchResults":"No results","resultIndex":"No.","rowRange":"Rows","copyAsPriorityEvidence":"Copy as Priority Evidence","copyPriorityEvidenceSuccess":"File path copied. Paste it into advanced priority evidence only when manual evidence selection is required.","expand":"Expand","weights":{"keyword":"Keyword Weight","vector":"Vector Weight","rewrite":"Rewrite Weight","hybridBonus":"Hybrid Bonus"},"recallSources":{"keyword":"Keyword Retrieval","vector":"Vector Retrieval","rewrite":"Query Rewrite","hybrid":"Hybrid Retrieval","rerank":"Rerank"},"scopes":{"project":"Current Project","global":"Global"},"scoreDetails":{"keywordScore":"Keyword Score","bm25Score":"BM25 Score","vectorScore":"Vector Score","rerankBoost":"Rerank Boost","hybridScore":"Hybrid Score"}},"models":{"title":"Model Configuration","description":"Manage LLM models and tier assignments","modelList":"Model List","addModel":"Add Model","editModel":"Edit Model","providerName":"Provider Name","modelName":"Model Name","apiKey":"API Key","baseUrl":"Base URL","protocol":"Protocol","testConnection":"Test Connection","testing":"Testing...","connected":"Connected","connectionFailed":"Connection Failed","noProviders":"No models yet. Add one to get started.","modelTiers":"Model Tier Assignment","tierReader":"Reader (Read-only)","tierReaderDesc":"Handles low-risk, read-only, and cost-sensitive work such as reading files, searching the knowledge base, text search, and context organization. Prefer fast, inexpensive models with stable long-context support.","tierReasoning":"Reasoning (Analysis)","tierReasoningDesc":"Handles deeper analysis, planning, code understanding, and multi-step reasoning. Prefer models with stronger reasoning quality and reliability.","tierAction":"Action (Write/Execute)","tierActionDesc":"Handles side-effect operations such as writing files, changing code, running commands, and calling external tools. Prefer reliable models with strong instruction-following and verified behavior.","activeModel":"Active Model","deleteProvider":"Delete","deleteProviderConfirm":"Are you sure you want to delete this model and all its configs?","modelNamePlaceholder":"e.g. gpt-4o / deepseek-chat","selectModelPlaceholder":"No model selected","apiKeyEditHint":"Configured keys are shown as a masked value. Focus the field to enter a new key; the mask cannot be copied. Leave empty or keep the mask to avoid changes.","apiKeyEditPlaceholder":"Enter a new API key, or leave empty to keep current","embeddingConfig":"Embedding Configuration","embeddingProvider":"Embedding Provider","embeddingProviderHash":"Local Semantic Embedding","embeddingProviderOpenAI":"OpenAI-compatible Embedding","embeddingHint":"Embedding is used for knowledge base vector retrieval. After changing the embedding model or dimensions, reindex the knowledge base.","model":"Model","dimensions":"Dimensions","status":"Status","localHash":"Local Semantic Embedding","openAICompatible":"OpenAI-compatible","saveEmbedding":"Save Embedding Config","testEmbedding":"Test Embedding","embeddingApiKeyHint":"Leave empty or keep the masked value to avoid changing the key","optional":"Optional","save":"Save","cancel":"Cancel"},"context":{"title":"Context Engineering","longTermDesc":"Persistent context from memory store (cross-session)","shortTermDesc":"Short-term context from recent session logs","longTermSource":"Source: ~/.customize-agent/memory.db (Memory Store)","shortTermSource":"Source: ~/.customize-agent/logs/ (Session Logs)","importance":"Importance","content":"Content","tags":"Tags","source":"Source","sourceHint":"Optional additional source/context description","updatedAt":"Updated"},"prompt":{"title":"Prompt Management","description":"Manage CUSTOMIZE.md system prompt files per project","filePath":"File Path","lastModified":"Last Modified","hasFile":"Configured","noFile":"Not Configured","noProjects":"No projects found. Initialize a Customize Agent project first."},"documents":{"title":"Workflow Templates","description":"Generate, edit, and validate business documents from templates and the local knowledge base","templateLibrary":"Template Library","workflow":"Template Workflow","template":"Template","selected":"Selected","boundPrompts":"Bound Prompts","boundFiles":"Bound Knowledge Files","boundPromptsRequired":"Select prompts","boundFilesRequired":"Select knowledge files","promptRole":"Prompt Role","fileRole":"File Role","manageRoles":"Manage Roles","roleEditor":"Role Editor","roleType":"Role Type","roleName":"Role Name","roleDescription":"Role Description","addPromptBinding":"Add Prompt Binding","addFileBinding":"Add File Binding","structuredFacts":"Structured Facts","exportGate":"Export Gate","executionStages":"Execution Stages","executionStatus":"Execution Status","flowPrepare":"Prepare Config","flowPrepareDesc":"Load template, project role config, file roles, and prompt roles","flowPrepareDone":"Config loaded","flowFactExtraction":"Fact Extraction","flowFactExtractionDesc":"Extract JSON facts and table structures by file processing type","flowChapterGeneration":"Chapter Generation","flowChapterGenerationDesc":"Generate chapter drafts from evidence, facts, and prompts","flowValidation":"Strict Validation","flowValidationDesc":"Check fact completeness, source traceability, and chapter evidence","flowFormatting":"Formal Formatting","flowFormattingDesc":"Generate cover, table of contents, page breaks, and formal document structure","flowDone":"Completed","flowDoneDesc":"Generation completed; ready for editing and export","flowGateFailed":"Generation completed, but export gate failed. Check validation results","projectRoleConfig":"Project Role Config","documentSpec":"Document Spec Package","documentSpecPlaceholder":"Select a document spec package","exportDocx":"Export Word","projectRoleConfigRequired":"Select a project role config","noRoleConfig":"No project role config bound","evidenceLimit":"Evidence per Chapter","requirement":"Generation Requirement","requirementPlaceholder":"Example: Generate a construction organization design draft from uploaded tender files, drawings, and BOQ sheets.","generate":"Generate","editor":"Generate / Editor","edit":"Edit","chapters":"Chapters","sources":"Sources","missingItems":"Missing Items","validation":"Validation","evidenceCount":"Evidence Count","missingCount":"Missing Facts","downloadMarkdown":"Download Markdown","exportHtml":"Export HTML","exportPdf":"Export PDF","saveDraft":"Save Draft","draftHistory":"Draft History","regenerateChapter":"Regenerate Chapter","newTemplate":"New Template","templateEditor":"Template Editor","templateName":"Template Name","templateCategory":"Template Category","templateDescription":"Template Description","outputTitle":"Output Title","chapter":"Chapter","chapterTitle":"Chapter Title","chapterPurpose":"Chapter Purpose","chapterQueries":"Search Queries","requiredFacts":"Required Facts","addChapter":"Add Chapter","builtIn":"Built-in","deleteTemplateConfirm":"Delete this template?","noDraft":"Select a template and generate a draft"},"specs":{"title":"Document Spec Packages","description":"Configure fact fields, chapter rules, and executable gate rules. Both system and custom gate types participate in validation.","newSpec":"New Spec","list":"Spec List","editor":"Spec Editor","name":"Spec Name","specDescription":"Description","wordTemplatePath":"Word Template Path","facts":"Fact Fields","chapters":"Chapter Rules","gates":"Gate Rules","factName":"Field Name","factType":"Field Type","required":"Required","sourceRoles":"Source File Roles","extractionHint":"Extraction Hint","validationHint":"Validation Hint","addFact":"Add Fact Field","chapterTitle":"Chapter Title","order":"Order","minWords":"Min Words","requiredFacts":"Required Facts","requiredFileRoles":"Required File Roles","requiredPromptRoles":"Required Prompt Roles","generationHint":"Generation Hint","addChapter":"Add Chapter Rule","gateName":"Gate Name","addGate":"Add Gate Rule","plainGuideTitle":"Plain explanation: what is a document spec package?","plainGuideDesc":"A document spec package is not a fixed template. It is a configurable production rule set: fact fields define what must be known, chapter rules define required chapters and constraints, and gate rules define checks before generation and export. Users can create custom gate types by choosing a validation subject and operator; saved custom types run just like system gate types."},"guide":{"title":"Guide: Run the Full Document Generation Flow","description":"This guide walks users through model setup, uploading their own files, prompts, role configuration, spec packages, template creation, generation, validation, and export.","fullFlow":"Full Flow","stepModel":"1. Configure Models","stepModelDesc":"Open Model Config, add providers and models, set an active model, and run health checks.","stepKnowledge":"2. Upload Knowledge Files","stepKnowledgeDesc":"Upload tender files, project descriptions, tables, drawings, specifications, and standards, then wait for indexing.","stepPrompt":"3. Create Prompts","stepPromptDesc":"Create prompts for fact extraction, chapter generation, validation, and formatting.","stepRole":"4. Configure Roles","stepRoleDesc":"Create file roles and prompt roles, bind resources, then create an ordered project role config.","stepTemplate":"5. Create Template","stepTemplateDesc":"Create a template in Workflow Templates and bind a project role config.","stepGenerate":"6. Generate","stepGenerateDesc":"Click Generate and observe the execution status card for progress.","stepReview":"7. Review","stepReviewDesc":"Review facts, sources, missing items, validation, export gate, and execution stages.","stepExport":"8. Export","stepExportDesc":"Export Markdown, HTML, or PDF. PDF export enforces the export gate.","roleDesign":"Role Design","roleDesignDesc":"Roles connect user-defined names to executable system behavior through execution or processing types.","fileRole":"File Role","fileRoleDesc":"A file role binds a knowledge file and declares its processing type.","promptRole":"Prompt Role","promptRoleDesc":"A prompt role binds a prompt and declares its execution type.","projectConfig":"Project Role Config","projectConfigDesc":"A project role config combines and orders file roles and prompt roles. Templates bind configs directly.","generationEngine":"Generation Engine","generationEngineDesc":"The engine organizes resources by roles and runs fact extraction, table parsing, generation, validation, and formatting.","prepareTitle":"How should I prepare files?","prepareContent":"Prepare project facts, rules, tables, drawings, and specifications. Make table headers clear and include drawing descriptions when possible.","rolesTitle":"How should roles be named?","rolesContent":"Use business names such as Tender Fact Source, Labor Plan Table, or Chapter Generation Prompt. System behavior depends on types, not names.","templateTitle":"How should templates be created?","templateContent":"Templates define document entry and output title. Bind a project role config instead of selecting files and prompts directly.","generateTitle":"How do I see progress?","generateContent":"The generation page shows an execution status card. The current step is highlighted and final backend stages appear after completion.","qaTitle":"How do I know whether export is allowed?","qaContent":"Check the export gate. PDF export should only proceed when there are no blocking errors and facts/sources/chapters are complete."},"roles":{"title":"Role Config","description":"Create file roles and prompt roles, then combine them into ordered project role configs for templates","newFileRole":"New File Role","newPromptRole":"New Prompt Role","newConfig":"New Project Config","fileRoles":"File Roles","promptRoles":"Prompt Roles","configs":"Project Role Configs","roleEditor":"Role Editor","configEditor":"Project Role Config Editor","roleType":"Role Type","fileRole":"File Role","promptRole":"Prompt Role","roleName":"Role Name","roleDescription":"Role Description","bindFile":"Bind Knowledge File","bindPrompt":"Bind Prompt","executionType":"Execution Type","processingType":"Processing Type","factExtraction":"Fact Extraction","chapterGeneration":"Chapter Generation","validation":"Validation","formatting":"Formatting","llmReview":"LLM Review","reference":"Reference","ruleFile":"Rule File","projectFactFile":"Project Fact File","tableFile":"Table Data","drawingFile":"Drawing File","specificationFile":"Specification File","configName":"Config Name","configDescription":"Config Description","addRole":"Add Role","plainGuideTitle":"Plain explanation: what are file roles and prompt roles?","plainGuideDesc":"File roles label what files are used for. Rule files define requirements; project fact files contain real project info; table data means spreadsheets; drawing files mean drawing catalogs/descriptions; specification files are standards; references are only supporting materials. Prompt roles label when prompts are used. A role can bind multiple files or prompts when one purpose needs multiple resources.","executionTypeHelp":"Which stage this prompt is used in: fact extraction, chapter generation, validation, formatting, or reference.","processingTypeHelp":"What this file does in generation: rules, facts, tables, drawings, specifications, or references.","multiBindFileHelp":"Multiple files are allowed when one purpose has multiple source files.","multiBindPromptHelp":"Multiple prompts are allowed when one stage needs multiple prompt rules."},"settings":{"title":"System Settings","description":"Manage language, theme, and other preferences","language":"Language","languageDesc":"Interface display language","theme":"Theme","themeDesc":"Light / Dark mode","light":"Light","dark":"Dark","system":"System","about":"About","version":"Version","port":"Service Port"},"common":{"save":"Save","cancel":"Cancel","confirm":"Confirm","delete":"Delete","edit":"Edit","add":"Add","search":"Search","loading":"Loading...","error":"Something went wrong","success":"Success","retry":"Retry","close":"Close","back":"Back","more":"More","noData":"No data","bytes":"bytes","kb":"KB","mb":"MB","gb":"GB","unknown":"Unknown","never":"Never"}}')},66285:()=>{},93065:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{B:()=>m});var e=c(8732),f=c(82015),g=c(21202),h=c(9328),i=c.n(h),j=c(94487),k=c(68329),l=a([j]);j=(l.then?(await l)():l)[0];let n=[{href:"/overview",icon:k.HxJ,labelKey:"nav.overview"},{icon:k.WmV,labelKey:"nav.knowledge",children:[{href:"/knowledge/manage",icon:k.BmN,labelKey:"nav.knowledgeManage"},{href:"/knowledge/files",icon:k.iUU,labelKey:"nav.fileManagement"},{href:"/knowledge/search",icon:k.vji,labelKey:"nav.knowledgeSearch"}]},{href:"/models",icon:k.fX,labelKey:"nav.models"},{href:"/prompt",icon:k.vEG,labelKey:"nav.promptManagement"},{href:"/document-roles",icon:k.wB_,labelKey:"nav.documentRoles"},{href:"/documents",icon:k.sv7,labelKey:"nav.documents"},{href:"/asset-library",icon:k.BmN,labelKey:"nav.assetLibrary"},{icon:k.jy9,labelKey:"nav.contextEngineering",children:[{href:"/context/long-term",icon:k.WmV,labelKey:"nav.longTermContext"},{href:"/context/short-term",icon:k.WmV,labelKey:"nav.shortTermContext"}]},{href:"/system/logs",icon:k.zPv,labelKey:"nav.systemLogs"},{href:"/guide",icon:k.Gyj,labelKey:"nav.guide"},{href:"/settings",icon:k.wB_,labelKey:"nav.settings"}];function m(){let a=(0,g.usePathname)(),b=(0,j.Vr)(),c=(0,f.useMemo)(()=>{let b={};for(let c of n)c.children?.some(b=>a===b.href||a.startsWith(b.href+"/"))&&(b[c.labelKey]=!0);return b},[a]),[d,h]=(0,f.useState)({}),[l,m]=(0,f.useState)(!1);return(0,e.jsxs)("aside",{className:`sidebar${l?" sidebarCollapsedSelf":""}`,children:[(0,e.jsx)(i(),{href:"/overview",prefetch:!1,children:(0,e.jsx)("div",{className:"sidebarLogo",children:(0,e.jsx)("div",{className:"sidebarLogoTitle",style:{fontSize:20,fontWeight:800,letterSpacing:"0.5px"},children:(0,e.jsx)("span",{className:"logoGradient",children:b("app.title")})})})}),(0,e.jsx)("button",{className:"sidebarCollapseBtn",onClick:()=>m(a=>!a),"aria-label":l?"展开侧边栏":"收起侧边栏",children:l?(0,e.jsx)(k.wdi,{size:16}):(0,e.jsx)(k.ues,{size:16})}),(0,e.jsx)("nav",{className:"sidebarNav",children:n.map(f=>{if(f.children){let g=d[f.labelKey]??c[f.labelKey]??!1;return(0,e.jsxs)("div",{children:[(0,e.jsxs)("div",{className:"sidebarItem sidebarParent",onClick:()=>{var a;return a=f.labelKey,void h(b=>({...b,[a]:!b[a]}))},children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)}),(0,e.jsx)("span",{className:"sidebarChevron",children:g?(0,e.jsx)(k.yQN,{size:14}):(0,e.jsx)(k.c_$,{size:14})})]}),g&&!l&&(0,e.jsx)("div",{className:"sidebarSubmenu",children:f.children.map(c=>{let d=a===c.href||a.startsWith(c.href+"/");return(0,e.jsx)(i(),{href:c.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem sidebarSubItem${d?" sidebarItemActive":""}`,children:[(0,e.jsx)(c.icon,{size:16}),(0,e.jsx)("span",{children:b(c.labelKey)})]})},c.href)})})]},f.labelKey)}let g=a===f.href||a.startsWith(f.href+"/");return(0,e.jsx)(i(),{href:f.href,prefetch:!1,children:(0,e.jsxs)("div",{className:`sidebarItem${g?" sidebarItemActive":""}`,children:[(0,e.jsx)(f.icon,{size:18}),(0,e.jsx)("span",{children:b(f.labelKey)})]})},f.href)})})]})}d()}catch(a){d(a)}})},94487:(a,b,c)=>{"use strict";c.a(a,async(a,d)=>{try{c.d(b,{PE:()=>x,Vr:()=>v,x_:()=>t});var e=c(8732),f=c(82015),g=c(49702),h=c.n(g),i=c(42583),j=c(57312),k=c(60056),l=c(2973),m=c(40107),n=c(4823),o=c(93065),p=c(34924),q=c(13484),r=c(54506),s=a([j,o,p]);[j,o,p]=s.then?(await s)():s;let y=(0,f.createContext)(null);function t(){let a=(0,f.useContext)(y);if(!a)throw Error("useAppLocale must be used inside Layout");return a}function u(a,b){let c=b.split(".").reduce((a,b)=>{if(a&&"object"==typeof a&&b in a)return a[b]},a);return"string"==typeof c?c:b}function v(a){let{messages:b}=t();return(0,f.useCallback)(c=>{if(!a)return u(b,c);let d=`${a}.${c}`,e=u(b,d);return e===d?u(b,c):e},[b,a])}let z={"zh-CN":q,"en-US":r};function w({children:a}){let{resolvedTheme:b}=(0,j.useTheme)();(0,i.useRouter)();let[c,d]=(0,f.useState)("zh-CN"),[g,q]=(0,f.useState)(!1),r="dark"===b,s=z[c]??z["zh-CN"],t=(0,f.useCallback)(a=>{document.cookie=`NEXT_LOCALE=${a};path=/;max-age=31536000;samesite=lax`,d(a)},[]),u=(0,f.useMemo)(()=>({locale:c,setLocale:t,messages:s}),[c,t,s]),v=(0,f.useMemo)(()=>(0,n.D)(r),[r]),w="en-US"===c?m.default:l.A;return(0,e.jsx)(y.Provider,{value:u,children:(0,e.jsx)(k.sG,{theme:v,locale:w,children:(0,e.jsxs)(k.qw,{children:[(0,e.jsx)(h(),{children:(0,e.jsx)("meta",{name:"viewport",content:"width=device-width, initial-scale=1, viewport-fit=cover"})}),(0,e.jsx)(o.B,{}),(0,e.jsxs)("div",{className:"mainContent",children:[(0,e.jsx)(p.Y,{}),(0,e.jsx)("main",{className:`mainInner${g?" pageTransitioning":""}`,children:a})]})]})})})}function x({children:a}){return(0,e.jsx)(j.ThemeProvider,{attribute:"class",defaultTheme:"system",enableSystem:!0,disableTransitionOnChange:!0,children:(0,e.jsx)(w,{children:a})})}d()}catch(a){d(a)}})},97237:()=>{}};