@customize-agent/server 4.2.4 → 4.2.6

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 (147) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +65 -47
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/routes-manifest.json +6 -0
  5. package/.next/server/chunks/1936.js +1 -1
  6. package/.next/server/chunks/208.js +61 -0
  7. package/.next/server/chunks/2405.js +87 -0
  8. package/.next/server/chunks/2484.js +1 -0
  9. package/.next/server/chunks/4680.js +48 -0
  10. package/.next/server/chunks/5284.js +36 -154
  11. package/.next/server/chunks/8204.js +1 -1
  12. package/.next/server/chunks/8661.js +1 -1
  13. package/.next/server/chunks/9227.js +1 -0
  14. package/.next/server/middleware-build-manifest.js +1 -1
  15. package/.next/server/pages/404.html +1 -1
  16. package/.next/server/pages/500.html +1 -1
  17. package/.next/server/pages/api/assets/generated/preview.js +1 -1
  18. package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
  19. package/.next/server/pages/api/assets/generated.js +1 -1
  20. package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
  21. package/.next/server/pages/api/config/embedding/healthCheck.js.nft.json +1 -1
  22. package/.next/server/pages/api/documents/chapter/regenerate.js +1 -1
  23. package/.next/server/pages/api/documents/chapter/regenerate.js.nft.json +1 -1
  24. package/.next/server/pages/api/documents/export.js +3 -3
  25. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  26. package/.next/server/pages/api/documents/generate.js +2 -2
  27. package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
  28. package/.next/server/pages/api/documents/generated/[id].js +1 -1
  29. package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
  30. package/.next/server/pages/api/documents/generated.js +1 -1
  31. package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
  32. package/.next/server/pages/api/documents/templates.js +1 -1
  33. package/.next/server/pages/api/documents/templates.js.nft.json +1 -1
  34. package/.next/server/pages/api/jobs/[id].js +3 -3
  35. package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
  36. package/.next/server/pages/api/jobs.js +3 -3
  37. package/.next/server/pages/api/jobs.js.nft.json +1 -1
  38. package/.next/server/pages/api/kb/categories.js +2 -2
  39. package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
  40. package/.next/server/pages/api/kb/duplicates.js +2 -2
  41. package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
  42. package/.next/server/pages/api/kb/evaluate.js +2 -2
  43. package/.next/server/pages/api/kb/evaluate.js.nft.json +1 -1
  44. package/.next/server/pages/api/kb/files/detail.js +3 -3
  45. package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
  46. package/.next/server/pages/api/kb/files/open.js +2 -2
  47. package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
  48. package/.next/server/pages/api/kb/files/preview-pdf-page.js +2 -2
  49. package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
  50. package/.next/server/pages/api/kb/files/reindex.js +1 -1
  51. package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
  52. package/.next/server/pages/api/kb/files/search.js +2 -2
  53. package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
  54. package/.next/server/pages/api/kb/files/tree.js +2 -2
  55. package/.next/server/pages/api/kb/files/tree.js.nft.json +1 -1
  56. package/.next/server/pages/api/kb/files.js +3 -3
  57. package/.next/server/pages/api/kb/files.js.nft.json +1 -1
  58. package/.next/server/pages/api/kb/ignore.js +2 -2
  59. package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
  60. package/.next/server/pages/api/kb/intelligence.js +1 -1
  61. package/.next/server/pages/api/kb/intelligence.js.nft.json +1 -1
  62. package/.next/server/pages/api/kb/operations.js +3 -3
  63. package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
  64. package/.next/server/pages/api/kb/reindex.js +1 -1
  65. package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
  66. package/.next/server/pages/api/kb/search.js +2 -2
  67. package/.next/server/pages/api/kb/search.js.nft.json +1 -1
  68. package/.next/server/pages/api/kb/stats.js +2 -2
  69. package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
  70. package/.next/server/pages/api/kb/tags.js +2 -2
  71. package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
  72. package/.next/server/pages/api/kb/upload/complete.js +1 -1
  73. package/.next/server/pages/api/kb/upload/complete.js.nft.json +1 -1
  74. package/.next/server/pages/api/kb/upload/progress.js +3 -3
  75. package/.next/server/pages/api/kb/upload/progress.js.nft.json +1 -1
  76. package/.next/server/pages/api/kb/upload.js +1 -1
  77. package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
  78. package/.next/server/pages/api/prompt.js +1 -1
  79. package/.next/server/pages/api/prompt.js.nft.json +1 -1
  80. package/.next/server/pages/api/template-references.js +1 -0
  81. package/.next/server/pages/api/template-references.js.nft.json +1 -0
  82. package/.next/server/pages/asset-library.html +1 -1
  83. package/.next/server/pages/document-roles.html +1 -1
  84. package/.next/server/pages/documents.html +1 -1
  85. package/.next/server/pages/guide.html +1 -1
  86. package/.next/server/pages/index.html +1 -1
  87. package/.next/server/pages/knowledge/file-detail.html +1 -1
  88. package/.next/server/pages/knowledge/files.html +1 -1
  89. package/.next/server/pages/knowledge/manage.html +1 -1
  90. package/.next/server/pages/knowledge.html +1 -1
  91. package/.next/server/pages/models.html +1 -1
  92. package/.next/server/pages/overview.html +1 -1
  93. package/.next/server/pages/prompt.html +1 -1
  94. package/.next/server/pages/settings.html +1 -1
  95. package/.next/server/pages/system/logs.html +1 -1
  96. package/.next/server/pages/template-references.html +1 -0
  97. package/.next/server/pages/template-references.js.nft.json +1 -0
  98. package/.next/server/pages-manifest.json +28 -26
  99. package/.next/static/XgGKtqmwpahXYicc2ieXW/_buildManifest.js +1 -0
  100. package/.next/static/chunks/102-881dcc464f983c89.js +41 -0
  101. package/.next/static/chunks/{7-20bcc985742a9ae1.js → 224-790cf01fcf6820ee.js} +2 -2
  102. package/.next/static/chunks/260-244c94eacd903620.js +1 -0
  103. package/.next/static/chunks/289-42781fb699646699.js +38 -0
  104. package/.next/static/chunks/592-c667dfd191c1ea0c.js +24 -0
  105. package/.next/static/chunks/69-34d57b77fd2eed20.js +1 -0
  106. package/.next/static/chunks/700-5d29b0475311f590.js +1 -0
  107. package/.next/static/chunks/788-e98701da4d6ca319.js +1 -0
  108. package/.next/static/chunks/{795-cd94e8d4e9768eb9.js → 795-61fe67c7203b6001.js} +1 -1
  109. package/.next/static/chunks/930-0436dcaa92fb41f6.js +1 -0
  110. package/.next/static/chunks/986-771dc425e7b25964.js +8 -0
  111. package/.next/static/chunks/pages/{_app-1511aa64f9299003.js → _app-55467a8f660aa065.js} +17 -17
  112. package/.next/static/chunks/pages/{asset-library-a1047694e888e655.js → asset-library-f6319fc04559e43d.js} +1 -1
  113. package/.next/static/chunks/pages/document-roles-4ccb2db16dc4b63c.js +1 -0
  114. package/.next/static/chunks/pages/documents-f9880371363a534c.js +1 -0
  115. package/.next/static/chunks/pages/guide-a73d8eea2cba97e1.js +1 -0
  116. package/.next/static/chunks/pages/knowledge/{file-detail-02cd5d87cd1d1c5d.js → file-detail-3a04722f7720abf5.js} +1 -1
  117. package/.next/static/chunks/pages/knowledge/files-3ba329d8e6335929.js +1 -0
  118. package/.next/static/chunks/pages/knowledge/manage-558987c599dc4cd5.js +1 -0
  119. package/.next/static/chunks/pages/{models-aa250428e72433df.js → models-e6f755b68bff8515.js} +1 -1
  120. package/.next/static/chunks/pages/prompt-839287c514595765.js +1 -0
  121. package/.next/static/chunks/pages/{settings-810eb1a6cf1a6b02.js → settings-17632b1471b4862f.js} +1 -1
  122. package/.next/static/chunks/pages/system/logs-2e849bcdf371d791.js +1 -0
  123. package/.next/static/chunks/pages/template-references-68b9bd99fc910922.js +1 -0
  124. package/.next/static/css/10c378422f47671a.css +1 -0
  125. package/messages/en-US.json +57 -1
  126. package/messages/zh-CN.json +57 -1
  127. package/package.json +10 -11
  128. package/scripts/kb-index-worker.cjs +8 -90
  129. package/.next/package.json +0 -1
  130. package/.next/server/chunks/6071.js +0 -69
  131. package/.next/static/QO5Rc5Wqv5M0mKhed3tM3/_buildManifest.js +0 -1
  132. package/.next/static/chunks/187-358527d7061417bf.js +0 -1
  133. package/.next/static/chunks/230-8184e70eae35f2bb.js +0 -1
  134. package/.next/static/chunks/289-35ac595388bbd018.js +0 -78
  135. package/.next/static/chunks/563-b12f299d34bb9e44.js +0 -1
  136. package/.next/static/chunks/665-88e20299084b9e73.js +0 -1
  137. package/.next/static/chunks/788-3afeb069ed706ac0.js +0 -1
  138. package/.next/static/chunks/957-7c7f05f1c2ccfb96.js +0 -8
  139. package/.next/static/chunks/pages/document-roles-5620a98d6312f81c.js +0 -1
  140. package/.next/static/chunks/pages/documents-a2ccb31a69a78d98.js +0 -1
  141. package/.next/static/chunks/pages/guide-b847733a9a832c2c.js +0 -1
  142. package/.next/static/chunks/pages/knowledge/files-0d9a0d407b38a0a3.js +0 -1
  143. package/.next/static/chunks/pages/knowledge/manage-a00bb7fc6a76f820.js +0 -1
  144. package/.next/static/chunks/pages/prompt-224af05519ef8304.js +0 -1
  145. package/.next/static/chunks/pages/system/logs-6f45ef8d862759a2.js +0 -1
  146. package/.next/static/css/3f9e41b5c0ba95f7.css +0 -1
  147. /package/.next/static/{QO5Rc5Wqv5M0mKhed3tM3 → XgGKtqmwpahXYicc2ieXW}/_ssgManifest.js +0 -0
@@ -17,7 +17,8 @@
17
17
  "models": "模型配置",
18
18
  "settings": "设置",
19
19
  "promptManagement": "提示词管理",
20
- "systemLogs": "系统日志"
20
+ "systemLogs": "系统日志",
21
+ "templateReferences": "模板参考"
21
22
  },
22
23
  "overview": {
23
24
  "title": "系统总览",
@@ -693,5 +694,60 @@
693
694
  "gb": "GB",
694
695
  "unknown": "未知",
695
696
  "never": "从未"
697
+ },
698
+ "refs": {
699
+ "title": "模板参考库",
700
+ "description": "上传优秀入围施组文件作为质量对标基准。系统自动解析质量画像(参数密度、工序链、结构等),生成文档后按工程类型对标。参考文件仅用于质量对标与结构参考,绝不作为项目事实材料参与生成。",
701
+ "uploadTitle": "点击或拖拽上传参考文件",
702
+ "uploadHint": "支持 PDF / Word 文档,可上传多份不同类型的入围文件累积沉淀",
703
+ "uploading": "正在上传并解析…",
704
+ "uploaded": "参考文件已入库并完成画像解析",
705
+ "uploadFailed": "上传失败",
706
+ "operationFailed": "操作失败",
707
+ "projectType": "工程类型",
708
+ "autoClassify": "不选则自动分类",
709
+ "statusParsing": "解析中…",
710
+ "statusFailed": "解析失败",
711
+ "setPrimary": "设为主参考",
712
+ "unsetPrimary": "取消主参考",
713
+ "changeType": "改为",
714
+ "typeChanged": "类型已更新",
715
+ "delete": "删除",
716
+ "deleteConfirm": "删除该参考文件?原文将一并移除",
717
+ "paramDensity": "参数密度",
718
+ "arrowChain": "工序链覆盖率",
719
+ "duplication": "段落重复率",
720
+ "tables": "表格数",
721
+ "sections": "章节数",
722
+ "sectionSubsection": "章节/小节",
723
+ "subsections": "小节数",
724
+ "subitems": "子目数",
725
+ "words": "字数",
726
+ "more": "展开",
727
+ "noReferences": "暂无该类型的参考文件",
728
+ "redLineTitle": "红线说明",
729
+ "redLine": "参考文件独立存储,永不进入知识库检索、永不作为生成事实材料。",
730
+ "profileTitle": "类型画像",
731
+ "profileSamples": "份样本",
732
+ "profileUpdated": "更新于",
733
+ "profileDetail": "查看画像详情",
734
+ "profileDetailTitle": "类型画像详情",
735
+ "profileMetrics": "指标区间(最小 - 均值 - 最大)",
736
+ "profileTypicalHeadings": "典型章节结构(样本覆盖率)",
737
+ "profileCommonTables": "常见表格",
738
+ "profileFrequentParams": "高频工艺参数",
739
+ "profileSources": "画像来源文件",
740
+ "profileNoSamples": "该类型暂无样本,上传参考文件后自动沉淀画像",
741
+ "profilePrimaryBadge": "主参考",
742
+ "totalSamples": "有效样本",
743
+ "coveredTypes": "覆盖类型",
744
+ "primaryCount": "主参考",
745
+ "uploadSection": "上传参考文件",
746
+ "autoClassified": "自动分类",
747
+ "fileLibrary": "文件库",
748
+ "allFiles": "全部",
749
+ "profileSubtitle": "类型级累积画像,随参考文件持续沉淀",
750
+ "headingPreview": "章节结构",
751
+ "avgSectionWords": "平均每章字数"
696
752
  }
697
753
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@customize-agent/server",
3
- "version": "4.2.4",
3
+ "version": "4.2.6",
4
4
  "description": "Customize Agent Web 管理控制台",
5
5
  "exports": {
6
6
  "./package.json": "./package.json"
@@ -9,14 +9,6 @@
9
9
  "customize-web": "scripts/start-server.cjs",
10
10
  "customize-dashboard": "scripts/start-server.cjs"
11
11
  },
12
- "scripts": {
13
- "dev": "node -e \"require('fs').rmSync('.next', { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && next dev -p 17321",
14
- "build": "node -e \"require('fs').rmSync('.next', { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && next build && node -e \"const fs=require('fs'); for (const p of ['.next/cache','.next/static/development','.next/static/webpack']) fs.rmSync(p, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && node scripts/verify-next-static.js",
15
- "prepack": "node -e \"const fs=require('fs'); for (const p of ['.next/cache','.next/static/development','.next/static/webpack']) fs.rmSync(p, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && node scripts/verify-next-static.js --silent",
16
- "prestart": "node scripts/verify-next-static.js",
17
- "start": "next start -p 17321",
18
- "lint": "eslint src/"
19
- },
20
12
  "files": [
21
13
  ".next/BUILD_ID",
22
14
  ".next/app-build-manifest.json",
@@ -44,7 +36,7 @@
44
36
  },
45
37
  "dependencies": {
46
38
  "@ant-design/icons": "^6.3.2",
47
- "@customize-agent/knowledge": "^4.0.42",
39
+ "@customize-agent/knowledge": "^4.0.43",
48
40
  "@customize-agent/llm": "^3.0.13",
49
41
  "@customize-agent/runtime": "^3.0.13",
50
42
  "@napi-rs/canvas": "^0.1.82",
@@ -78,5 +70,12 @@
78
70
  "postcss": "^8.4.49",
79
71
  "sass": "^1.101.0",
80
72
  "tailwindcss": "^4.3.2"
73
+ },
74
+ "scripts": {
75
+ "dev": "node -e \"require('fs').rmSync('.next', { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && next dev -p 17321",
76
+ "build": "node -e \"require('fs').rmSync('.next', { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && next build && node -e \"const fs=require('fs'); for (const p of ['.next/cache','.next/static/development','.next/static/webpack']) fs.rmSync(p, { recursive: true, force: true, maxRetries: 5, retryDelay: 200 })\" && node scripts/verify-next-static.js",
77
+ "prestart": "node scripts/verify-next-static.js",
78
+ "start": "next start -p 17321",
79
+ "lint": "eslint src/"
81
80
  }
82
- }
81
+ }
@@ -1,58 +1,13 @@
1
1
  #!/usr/bin/env node
2
- const crypto = require('node:crypto');
3
- const fs = require('node:fs');
4
- const os = require('node:os');
2
+ // 知识库后台索引子进程壳:索引主循环复用 @customize-agent/knowledge 的 runIndexLoop
3
+ // (与主进程 runInProcess 共用同一实现),本文件只负责参数解析、进程壳与日志 IPC 转发。
4
+ // 操作日志单写者为主进程:worker 不再直接读写 kb-operations.jsonl,
5
+ // 而是通过 process.send({ type: 'log', patch }) 把补丁交给主进程统一落盘,
6
+ // 避免父子进程同时读改写日志文件造成记录丢失。
5
7
  const path = require('node:path');
6
8
 
7
- function computeProjectId(projectRoot) {
8
- return crypto.createHash('sha256').update(path.resolve(projectRoot)).digest('hex').slice(0, 12);
9
- }
10
-
11
- function logPath(projectRoot) {
12
- return path.join(os.homedir(), '.customize-agent', 'projects', computeProjectId(path.resolve(projectRoot)), 'kb-operations.jsonl');
13
- }
14
-
15
- function readAll(projectRoot) {
16
- const file = logPath(projectRoot);
17
- if (!fs.existsSync(file)) return [];
18
- return fs.readFileSync(file, 'utf8').split('\n').filter(Boolean).flatMap(line => {
19
- try { return [JSON.parse(line)]; } catch { return []; }
20
- });
21
- }
22
-
23
- function writeAll(projectRoot, records) {
24
- const file = logPath(projectRoot);
25
- fs.mkdirSync(path.dirname(file), { recursive: true });
26
- fs.writeFileSync(file, `${records.slice(-200).map(record => JSON.stringify(record)).join('\n')}\n`, 'utf8');
27
- }
28
-
29
- function upsert(projectRoot, patch) {
30
- const now = Date.now();
31
- const records = readAll(projectRoot);
32
- const index = records.findIndex(record => record.id === patch.id);
33
- const current = index >= 0 ? records[index] : undefined;
34
- const next = {
35
- id: patch.id,
36
- type: patch.type,
37
- title: patch.title,
38
- stage: patch.stage ?? current?.stage ?? 'uploading',
39
- status: patch.status ?? current?.status ?? 'processing',
40
- message: patch.message ?? current?.message ?? '',
41
- percent: patch.percent ?? current?.percent ?? 0,
42
- fileName: patch.fileName ?? current?.fileName,
43
- filePath: patch.filePath ?? current?.filePath,
44
- chunkCount: patch.chunkCount ?? current?.chunkCount,
45
- textLength: patch.textLength ?? current?.textLength,
46
- extractionMode: patch.extractionMode ?? current?.extractionMode,
47
- error: patch.error ?? current?.error,
48
- createdAt: current?.createdAt ?? now,
49
- updatedAt: now,
50
- };
51
- if (index >= 0) records[index] = next;
52
- else records.push(next);
53
- writeAll(projectRoot, records);
54
- if (process.send) process.send({ type: 'progress', record: next });
55
- return next;
9
+ function upsert(_projectRoot, patch) {
10
+ if (process.send) process.send({ type: 'log', patch });
56
11
  }
57
12
 
58
13
  function toStage(stage) {
@@ -86,44 +41,7 @@ async function main() {
86
41
  error: progress.vectorStatus?.error,
87
42
  });
88
43
 
89
- let diff = job.relativePaths?.length
90
- ? await project.incrementalIndex({ vectorMode: job.vectorMode, onProgress, onlyRelativePaths: job.relativePaths })
91
- : job.relativePath
92
- ? await project.reindexFile(job.relativePath, { vectorMode: job.vectorMode, onProgress })
93
- : job.forceReindexAll
94
- ? await project.forceReindexAll({ vectorMode: job.vectorMode, onProgress })
95
- : await project.consumePendingIndexJobs({ vectorMode: job.vectorMode, onProgress, waitForUploadId: job.uploadOperationId });
96
-
97
- let idleChecks = 0;
98
- // 上传 session 空闲上限:批次间无新文件到达超过该时长即退出等待,避免前端中断后 worker 永久挂起
99
- const sessionIdleLimitMs = Math.max(60_000, Number(process.env.CUSTOMIZE_KB_UPLOAD_SESSION_IDLE_MS || 600_000));
100
- const maxIdleChecks = Math.max(10, Math.ceil(sessionIdleLimitMs / 1000));
101
- // 等待任何未关闭的上传 session(不限于本 operationId),避免重叠上传的后续批次文件无人消费
102
- while (!job.relativePath && !job.relativePaths?.length && (project.countPendingIndexJobs() > 0 || (project.hasOpenUploadSessions() && idleChecks < maxIdleChecks))) {
103
- if (project.countPendingIndexJobs() === 0) {
104
- idleChecks += 1;
105
- await new Promise(resolve => setTimeout(resolve, 1000));
106
- continue;
107
- }
108
- idleChecks = 0;
109
- const nextDiff = await project.consumePendingIndexJobs({ vectorMode: job.vectorMode, onProgress, waitForUploadId: job.uploadOperationId });
110
- diff = {
111
- newFiles: [...diff.newFiles, ...nextDiff.newFiles],
112
- modifiedFiles: [...diff.modifiedFiles, ...nextDiff.modifiedFiles],
113
- deletedFiles: [...diff.deletedFiles, ...nextDiff.deletedFiles],
114
- unchangedCount: diff.unchangedCount + nextDiff.unchangedCount,
115
- mtimeOnlyCount: diff.mtimeOnlyCount + nextDiff.mtimeOnlyCount,
116
- skippedFiles: [...diff.skippedFiles, ...nextDiff.skippedFiles],
117
- hasChanges: diff.hasChanges || nextDiff.hasChanges,
118
- diffTimeMs: diff.diffTimeMs + nextDiff.diffTimeMs,
119
- };
120
- }
121
-
122
- let vectorStatus = project.getVectorStatus();
123
- if (job.vectorMode === 'defer' && vectorStatus.status === 'pending') {
124
- await project.indexVectors();
125
- vectorStatus = project.getVectorStatus();
126
- }
44
+ const { vectorStatus } = await knowledge.runIndexLoop(project, job, onProgress);
127
45
  if (vectorStatus.status === 'error') {
128
46
  const error = vectorStatus.error || 'HNSWLib 向量入库失败';
129
47
  upsert(projectRoot, { id: operationId, type: operationType, title: operationTitle, stage: 'error', status: 'error', percent: 100, message: error, error });
@@ -1 +0,0 @@
1
- {"type": "commonjs"}