@customize-agent/server 4.60.35 → 4.60.36

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 (342) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +197 -297
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/required-server-files.json +3 -7
  5. package/.next/routes-manifest.json +19 -30
  6. package/.next/server/chunks/{8645.js → 1026.js} +1 -1
  7. package/.next/server/chunks/1146.js +1 -0
  8. package/.next/server/chunks/1547.js +385 -0
  9. package/.next/server/chunks/3074.js +1 -0
  10. package/.next/server/chunks/3750.js +2 -0
  11. package/.next/server/chunks/407.js +1 -0
  12. package/.next/server/chunks/5037.js +46 -0
  13. package/.next/server/chunks/5304.js +2 -2
  14. package/.next/server/chunks/5599.js +1 -0
  15. package/.next/server/chunks/5763.js +159 -0
  16. package/.next/server/chunks/6138.js +5 -0
  17. package/.next/server/chunks/6355.js +1 -0
  18. package/.next/server/chunks/6822.js +1 -1
  19. package/.next/server/chunks/702.js +3 -0
  20. package/.next/server/chunks/7296.js +1 -0
  21. package/.next/server/chunks/8176.js +1 -0
  22. package/.next/server/chunks/8204.js +1 -1
  23. package/.next/server/chunks/8459.js +11 -0
  24. package/.next/server/chunks/8570.js +1 -0
  25. package/.next/server/chunks/9270.js +1 -0
  26. package/.next/server/chunks/9283.js +7 -0
  27. package/.next/server/chunks/9301.js +2 -2
  28. package/.next/server/chunks/9522.js +5 -0
  29. package/.next/server/chunks/9559.js +1 -0
  30. package/.next/server/chunks/9688.js +10 -0
  31. package/.next/server/middleware-build-manifest.js +1 -1
  32. package/.next/server/pages/404.html +1 -1
  33. package/.next/server/pages/500.html +1 -1
  34. package/.next/server/pages/_app.js +1 -1
  35. package/.next/server/pages/_app.js.nft.json +1 -1
  36. package/.next/server/pages/_document.js +1 -1
  37. package/.next/server/pages/_document.js.nft.json +1 -1
  38. package/.next/server/pages/_error.js +1 -1
  39. package/.next/server/pages/_error.js.nft.json +1 -1
  40. package/.next/server/pages/api/assets/generated/preview.js +2 -1
  41. package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
  42. package/.next/server/pages/api/assets/generated.js +2 -1
  43. package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
  44. package/.next/server/pages/api/config/embedding/healthCheck.js +2 -3
  45. package/.next/server/pages/api/config/embedding/healthCheck.js.nft.json +1 -1
  46. package/.next/server/pages/api/config/embedding.js +2 -3
  47. package/.next/server/pages/api/config/embedding.js.nft.json +1 -1
  48. package/.next/server/pages/api/config/healthCheck.js +2 -3
  49. package/.next/server/pages/api/config/healthCheck.js.nft.json +1 -1
  50. package/.next/server/pages/api/config/models.js +2 -3
  51. package/.next/server/pages/api/config/models.js.nft.json +1 -1
  52. package/.next/server/pages/api/config/providers/[provider].js +2 -3
  53. package/.next/server/pages/api/config/providers/[provider].js.nft.json +1 -1
  54. package/.next/server/pages/api/config/providers.js +2 -3
  55. package/.next/server/pages/api/config/providers.js.nft.json +1 -1
  56. package/.next/server/pages/api/config/reset.js +2 -3
  57. package/.next/server/pages/api/config/reset.js.nft.json +1 -1
  58. package/.next/server/pages/api/config/web-access.js +2 -3
  59. package/.next/server/pages/api/config/web-access.js.nft.json +1 -1
  60. package/.next/server/pages/api/documents/canvas/[id].js +2 -1
  61. package/.next/server/pages/api/documents/canvas/[id].js.nft.json +1 -1
  62. package/.next/server/pages/api/documents/delivery-review.js +2 -0
  63. package/.next/server/pages/api/documents/delivery-review.js.nft.json +1 -0
  64. package/.next/server/pages/api/documents/export.js +5 -2
  65. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  66. package/.next/server/pages/api/documents/generate/preview.js +6 -1
  67. package/.next/server/pages/api/documents/generate/preview.js.nft.json +1 -1
  68. package/.next/server/pages/api/documents/generate.js +2 -1
  69. package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
  70. package/.next/server/pages/api/documents/generated/[id]/events.js +4 -3
  71. package/.next/server/pages/api/documents/generated/[id]/events.js.nft.json +1 -1
  72. package/.next/server/pages/api/documents/generated/[id]/figure/[name].js +2 -1
  73. package/.next/server/pages/api/documents/generated/[id]/figure/[name].js.nft.json +1 -1
  74. package/.next/server/pages/api/documents/generated/[id]/instruction.js +4 -2
  75. package/.next/server/pages/api/documents/generated/[id]/instruction.js.nft.json +1 -1
  76. package/.next/server/pages/api/documents/generated/[id]/messages.js +2 -0
  77. package/.next/server/pages/api/documents/generated/[id]/messages.js.nft.json +1 -0
  78. package/.next/server/pages/api/documents/generated/[id]/nodes/[nodeId].js +2 -1
  79. package/.next/server/pages/api/documents/generated/[id]/nodes/[nodeId].js.nft.json +1 -1
  80. package/.next/server/pages/api/documents/generated/[id]/nodes.js +2 -1
  81. package/.next/server/pages/api/documents/generated/[id]/nodes.js.nft.json +1 -1
  82. package/.next/server/pages/api/documents/generated/[id]/pause.js +2 -1
  83. package/.next/server/pages/api/documents/generated/[id]/pause.js.nft.json +1 -1
  84. package/.next/server/pages/api/documents/generated/[id]/preview.js +2 -1
  85. package/.next/server/pages/api/documents/generated/[id]/preview.js.nft.json +1 -1
  86. package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/confirm.js +2 -1
  87. package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/confirm.js.nft.json +1 -1
  88. package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/rollback.js +2 -1
  89. package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/rollback.js.nft.json +1 -1
  90. package/.next/server/pages/api/documents/generated/[id]/repair.js +2 -1
  91. package/.next/server/pages/api/documents/generated/[id]/repair.js.nft.json +1 -1
  92. package/.next/server/pages/api/documents/generated/[id]/report.js +2 -1
  93. package/.next/server/pages/api/documents/generated/[id]/report.js.nft.json +1 -1
  94. package/.next/server/pages/api/documents/generated/[id]/resume-generate.js +2 -1
  95. package/.next/server/pages/api/documents/generated/[id]/resume-generate.js.nft.json +1 -1
  96. package/.next/server/pages/api/documents/generated/[id].js +2 -1
  97. package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
  98. package/.next/server/pages/api/documents/generated.js +2 -1
  99. package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
  100. package/.next/server/pages/api/health.js +1 -1
  101. package/.next/server/pages/api/health.js.nft.json +1 -1
  102. package/.next/server/pages/api/jobs/[id].js +2 -2
  103. package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
  104. package/.next/server/pages/api/kb/categories.js +2 -1
  105. package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
  106. package/.next/server/pages/api/kb/duplicates.js +2 -1
  107. package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
  108. package/.next/server/pages/api/kb/features.js +2 -3
  109. package/.next/server/pages/api/kb/features.js.nft.json +1 -1
  110. package/.next/server/pages/api/kb/files/detail.js +2 -1
  111. package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
  112. package/.next/server/pages/api/kb/files/export.js +2 -1
  113. package/.next/server/pages/api/kb/files/export.js.nft.json +1 -1
  114. package/.next/server/pages/api/kb/files/open.js +2 -1
  115. package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
  116. package/.next/server/pages/api/kb/files/preview-pdf-page.js +2 -1
  117. package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
  118. package/.next/server/pages/api/kb/files/reindex.js +1 -2
  119. package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
  120. package/.next/server/pages/api/kb/files/search.js +2 -1
  121. package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
  122. package/.next/server/pages/api/kb/files/source-preview.js +2 -1
  123. package/.next/server/pages/api/kb/files/source-preview.js.nft.json +1 -1
  124. package/.next/server/pages/api/kb/files.js +2 -2
  125. package/.next/server/pages/api/kb/files.js.nft.json +1 -1
  126. package/.next/server/pages/api/kb/ignore.js +2 -1
  127. package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
  128. package/.next/server/pages/api/kb/material-groups.js +2 -1
  129. package/.next/server/pages/api/kb/material-groups.js.nft.json +1 -1
  130. package/.next/server/pages/api/kb/operations.js +2 -2
  131. package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
  132. package/.next/server/pages/api/kb/reindex.js +1 -2
  133. package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
  134. package/.next/server/pages/api/kb/stats.js +2 -1
  135. package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
  136. package/.next/server/pages/api/kb/tags.js +2 -1
  137. package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
  138. package/.next/server/pages/api/kb/upload/complete.js +1 -2
  139. package/.next/server/pages/api/kb/upload/complete.js.nft.json +1 -1
  140. package/.next/server/pages/api/kb/upload.js +1 -2
  141. package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
  142. package/.next/server/pages/api/prompt/chat.js +3 -4
  143. package/.next/server/pages/api/prompt/chat.js.nft.json +1 -1
  144. package/.next/server/pages/api/skills/[id].js +2 -1
  145. package/.next/server/pages/api/skills/[id].js.nft.json +1 -1
  146. package/.next/server/pages/api/skills/validate.js +2 -1
  147. package/.next/server/pages/api/skills/validate.js.nft.json +1 -1
  148. package/.next/server/pages/api/skills.js +2 -1
  149. package/.next/server/pages/api/skills.js.nft.json +1 -1
  150. package/.next/server/pages/api/system/data-health.js +2 -2
  151. package/.next/server/pages/api/system/data-health.js.nft.json +1 -1
  152. package/.next/server/pages/api/system/reset.js +1 -1
  153. package/.next/server/pages/api/system/reset.js.nft.json +1 -1
  154. package/.next/server/pages/documents.html +1 -1
  155. package/.next/server/pages/documents.js.nft.json +1 -1
  156. package/.next/server/pages/generation/[id].html +1 -0
  157. package/.next/server/pages/generation/[id].js.nft.json +1 -0
  158. package/.next/server/pages/generation.html +1 -0
  159. package/.next/server/pages/generation.js.nft.json +1 -0
  160. package/.next/server/pages/index.js +1 -0
  161. package/.next/server/pages/index.js.nft.json +1 -1
  162. package/.next/server/pages/jobs.html +1 -1
  163. package/.next/server/pages/jobs.js.nft.json +1 -1
  164. package/.next/server/pages/knowledge/file-detail.html +1 -1
  165. package/.next/server/pages/knowledge/file-detail.js.nft.json +1 -1
  166. package/.next/server/pages/knowledge/files.html +1 -1
  167. package/.next/server/pages/knowledge/files.js.nft.json +1 -1
  168. package/.next/server/pages/knowledge/manage.html +1 -1
  169. package/.next/server/pages/knowledge/manage.js.nft.json +1 -1
  170. package/.next/server/pages/knowledge/source-preview.html +1 -1
  171. package/.next/server/pages/knowledge/source-preview.js.nft.json +1 -1
  172. package/.next/server/pages/knowledge.html +1 -1
  173. package/.next/server/pages/knowledge.js.nft.json +1 -1
  174. package/.next/server/pages/models.html +1 -1
  175. package/.next/server/pages/models.js.nft.json +1 -1
  176. package/.next/server/pages/settings.html +1 -1
  177. package/.next/server/pages/settings.js.nft.json +1 -1
  178. package/.next/server/pages/skills/[id]/edit.html +1 -1
  179. package/.next/server/pages/skills/[id]/edit.js.nft.json +1 -1
  180. package/.next/server/pages/skills/[id].html +1 -1
  181. package/.next/server/pages/skills/[id].js.nft.json +1 -1
  182. package/.next/server/pages/skills/new.html +1 -1
  183. package/.next/server/pages/skills/new.js.nft.json +1 -1
  184. package/.next/server/pages/skills.html +1 -1
  185. package/.next/server/pages/skills.js.nft.json +1 -1
  186. package/.next/server/pages-manifest.json +31 -36
  187. package/.next/static/chunks/112-9eacc7c0686813d6.js +1 -0
  188. package/.next/static/chunks/127-5ee1899eef559281.js +1 -0
  189. package/.next/static/chunks/{1210-703ad87eaeee1e4e.js → 210-71eaf9de9aa92051.js} +1 -1
  190. package/.next/static/chunks/325-45106bb003a2c5ce.js +4 -0
  191. package/.next/static/chunks/326-a3915e61888b0dbf.js +1 -0
  192. package/.next/static/chunks/333-7642e65bff6b8465.js +1 -0
  193. package/.next/static/chunks/338-19ccbaec57a7bf9c.js +4 -0
  194. package/.next/static/chunks/350-87b9c900a356d9b9.js +1 -0
  195. package/.next/static/chunks/359-f87c659236e0e0fe.js +1 -0
  196. package/.next/static/chunks/{8399-a001bb2a0cb1640b.js → 399-aa8a45d80e989621.js} +1 -1
  197. package/.next/static/chunks/430-f288e16301b9aea5.js +1 -0
  198. package/.next/static/chunks/465-80fbb245d43232c8.js +6 -0
  199. package/.next/static/chunks/499-2233cadc6d4da647.js +10 -0
  200. package/.next/static/chunks/551-fd86e95935b0957f.js +16 -0
  201. package/.next/static/chunks/576-6699fed6c88502fe.js +1 -0
  202. package/.next/static/chunks/61-de1dd9c104680470.js +1 -0
  203. package/.next/static/chunks/665-0634aa49137defc4.js +1 -0
  204. package/.next/static/chunks/681-e31b13114497e058.js +1 -0
  205. package/.next/static/chunks/687-644a12a5b584e19f.js +1 -0
  206. package/.next/static/chunks/702-4d9cc8d4d7775ea9.js +1 -0
  207. package/.next/static/chunks/748-9e5bf4181d7482f3.js +1 -0
  208. package/.next/static/chunks/759-280cf4040fae83af.js +25 -0
  209. package/.next/static/chunks/855-cbf7cd1db33198f0.js +17 -0
  210. package/.next/static/chunks/862-13d1c84d0938b824.js +1 -0
  211. package/.next/static/chunks/937-ccd3ceb1b3739535.js +1 -0
  212. package/.next/static/chunks/{8964-e959915ecfae86b2.js → 964-82cc4701f08f7351.js} +1 -1
  213. package/.next/static/chunks/992-8032f477230baaaf.js +1 -0
  214. package/.next/static/chunks/framework-4b565b3ddc94cdac.js +1 -0
  215. package/.next/static/chunks/main-0c91f573696223ca.js +1 -0
  216. package/.next/static/chunks/pages/_app-a70de062f1be1c59.js +140 -0
  217. package/.next/static/chunks/pages/_error-282257fbdcc167b4.js +1 -0
  218. package/.next/static/chunks/pages/documents-2d99ae9287f9739b.js +1 -0
  219. package/.next/static/chunks/pages/generation/[id]-1f97e47ce545bd11.js +1 -0
  220. package/.next/static/chunks/pages/generation-043e325d635c96af.js +1 -0
  221. package/.next/static/chunks/pages/index-24d1f8f39ae0beb0.js +1 -0
  222. package/.next/static/chunks/pages/jobs-ff2f899a081b616e.js +1 -0
  223. package/.next/static/chunks/pages/knowledge/file-detail-9a9a89e4fa33c0d9.js +1 -0
  224. package/.next/static/chunks/pages/knowledge/files-b3ef5324e4b74c4a.js +1 -0
  225. package/.next/static/chunks/pages/knowledge/manage-d9eaebf3a8307953.js +1 -0
  226. package/.next/static/chunks/pages/knowledge/{source-preview-24936b9a746ed07f.js → source-preview-f000b4d63cd65a54.js} +1 -1
  227. package/.next/static/chunks/pages/knowledge-8fa842d21892e2c3.js +1 -0
  228. package/.next/static/chunks/pages/models-6d9b301009f82395.js +1 -0
  229. package/.next/static/chunks/pages/settings-08893ba8afa1a486.js +1 -0
  230. package/.next/static/chunks/pages/skills/[id]/edit-378249e662ebf31f.js +1 -0
  231. package/.next/static/chunks/pages/skills/[id]-0ca4cde22e4a518b.js +1 -0
  232. package/.next/static/chunks/pages/skills/new-c1eb16d98fad4e02.js +1 -0
  233. package/.next/static/chunks/pages/skills-9fb1fa2b669ad4e3.js +1 -0
  234. package/.next/static/chunks/{webpack-2da1769ff35eb1ed.js → webpack-6224d37324e372cb.js} +1 -1
  235. package/.next/static/css/1f6d2a1bf5e15e0f.css +1 -0
  236. package/.next/static/css/b420c193e0e99857.css +1 -0
  237. package/.next/static/e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2/_buildManifest.js +1 -0
  238. package/README.md +14 -4
  239. package/messages/en-US.json +46 -100
  240. package/messages/zh-CN.json +44 -98
  241. package/next.config.ts +6 -5
  242. package/package.json +14 -16
  243. package/scripts/build-identity.cjs +16 -5
  244. package/scripts/check-workspace-deps.cjs +3 -3
  245. package/scripts/purge-next-artifacts.cjs +8 -5
  246. package/scripts/upload-matrix.cjs +1 -2
  247. package/scripts/verify-next-static.js +1 -1
  248. package/.next/package.json +0 -1
  249. package/.next/server/chunks/1001.js +0 -2
  250. package/.next/server/chunks/1243.js +0 -3
  251. package/.next/server/chunks/1928.js +0 -1
  252. package/.next/server/chunks/1936.js +0 -385
  253. package/.next/server/chunks/2328.js +0 -6
  254. package/.next/server/chunks/2434.js +0 -3
  255. package/.next/server/chunks/3806.js +0 -1
  256. package/.next/server/chunks/4974.js +0 -2
  257. package/.next/server/chunks/5746.js +0 -5
  258. package/.next/server/chunks/6321.js +0 -1
  259. package/.next/server/chunks/7848.js +0 -144
  260. package/.next/server/chunks/9666.js +0 -146
  261. package/.next/server/instrumentation.js +0 -1
  262. package/.next/server/instrumentation.js.nft.json +0 -1
  263. package/.next/server/pages/api/prompt.js +0 -2
  264. package/.next/server/pages/api/prompt.js.nft.json +0 -1
  265. package/.next/server/pages/api/system/logs.js +0 -2
  266. package/.next/server/pages/api/system/logs.js.nft.json +0 -1
  267. package/.next/server/pages/api/system/stats.js +0 -2
  268. package/.next/server/pages/api/system/stats.js.nft.json +0 -1
  269. package/.next/server/pages/canvas/[id].html +0 -1
  270. package/.next/server/pages/canvas/[id].js.nft.json +0 -1
  271. package/.next/server/pages/canvas.html +0 -1
  272. package/.next/server/pages/canvas.js.nft.json +0 -1
  273. package/.next/server/pages/guide.html +0 -1
  274. package/.next/server/pages/guide.js.nft.json +0 -1
  275. package/.next/server/pages/index.html +0 -1
  276. package/.next/server/pages/overview.html +0 -1
  277. package/.next/server/pages/overview.js.nft.json +0 -1
  278. package/.next/server/pages/prompt.html +0 -1
  279. package/.next/server/pages/prompt.js.nft.json +0 -1
  280. package/.next/server/pages/system/logs.html +0 -1
  281. package/.next/server/pages/system/logs.js.nft.json +0 -1
  282. package/.next/static/chunks/1141-d420a7685bc3623c.js +0 -1
  283. package/.next/static/chunks/1499-ff8f02f6bb6f3d45.js +0 -10
  284. package/.next/static/chunks/1702-f5e99af7aface475.js +0 -1
  285. package/.next/static/chunks/2864-b040f2bffa08c139.js +0 -6
  286. package/.next/static/chunks/3456-70bb03a39473f693.js +0 -1
  287. package/.next/static/chunks/3980-73841c40d55ddfa1.js +0 -1
  288. package/.next/static/chunks/4052-199e61ca9e6a33e7.js +0 -1
  289. package/.next/static/chunks/4337-a670a1a94ab505d9.js +0 -1
  290. package/.next/static/chunks/4530-8b9788da40548ec6.js +0 -1
  291. package/.next/static/chunks/4565-3c5ff667062ccec9.js +0 -21
  292. package/.next/static/chunks/4665-1984a3d8b0573fa1.js +0 -1
  293. package/.next/static/chunks/5061-80765d4a612286e0.js +0 -1
  294. package/.next/static/chunks/5544-d77b8289662b4c28.js +0 -4
  295. package/.next/static/chunks/5760-f4191aac081b12d4.js +0 -11
  296. package/.next/static/chunks/6409-5a3bb0fbad4f64b1.js +0 -14
  297. package/.next/static/chunks/6506-ac0ba7338cc84b7d.js +0 -1
  298. package/.next/static/chunks/6748-07b0b05bf03c72f0.js +0 -1
  299. package/.next/static/chunks/7217-416b8488e0d2d498.js +0 -1
  300. package/.next/static/chunks/7576-ba6fc03060415b0e.js +0 -1
  301. package/.next/static/chunks/7646-159733564c7eb8dc.js +0 -1
  302. package/.next/static/chunks/7795-c11ff1a81c67c5aa.js +0 -1
  303. package/.next/static/chunks/8318-cb3a94de1617f983.js +0 -1
  304. package/.next/static/chunks/8338-b2ea00050048ba9f.js +0 -4
  305. package/.next/static/chunks/8564-ac3e2f1bf87765b3.js +0 -1
  306. package/.next/static/chunks/8569-1d5c61a3f4fa0e26.js +0 -16
  307. package/.next/static/chunks/8715-ee013bd7f5ba38e8.js +0 -1
  308. package/.next/static/chunks/8750-a3c55a576effb3a6.js +0 -1
  309. package/.next/static/chunks/8787-49b1f35eb4acfac9.js +0 -10
  310. package/.next/static/chunks/9551-f4b09bf2213ad571.js +0 -16
  311. package/.next/static/chunks/9605-3dee531f8a7ecbe0.js +0 -4
  312. package/.next/static/chunks/9937-e4b2deadd24e3962.js +0 -1
  313. package/.next/static/chunks/framework-9cde5013cd555765.js +0 -1
  314. package/.next/static/chunks/main-b313efde54fa6d2e.js +0 -1
  315. package/.next/static/chunks/pages/_app-51c48c5efcf5c721.js +0 -140
  316. package/.next/static/chunks/pages/_error-c01b6fb772028676.js +0 -1
  317. package/.next/static/chunks/pages/canvas/[id]-18865f1b7e3a4696.js +0 -1
  318. package/.next/static/chunks/pages/canvas-1d3589790493e955.js +0 -1
  319. package/.next/static/chunks/pages/documents-a1af5c6be26daed2.js +0 -1
  320. package/.next/static/chunks/pages/guide-fdf0822dc1d28813.js +0 -1
  321. package/.next/static/chunks/pages/index-c572e9caa60cb278.js +0 -1
  322. package/.next/static/chunks/pages/jobs-ebd1877dbf788a83.js +0 -1
  323. package/.next/static/chunks/pages/knowledge/file-detail-3d1ffd43f4f0e47b.js +0 -1
  324. package/.next/static/chunks/pages/knowledge/files-b796702bb5f8ac50.js +0 -1
  325. package/.next/static/chunks/pages/knowledge/manage-6d7b21cdca1255f2.js +0 -1
  326. package/.next/static/chunks/pages/knowledge-2a776c1740386874.js +0 -1
  327. package/.next/static/chunks/pages/models-8a89dd5bf0f81242.js +0 -1
  328. package/.next/static/chunks/pages/overview-7e8018014009682e.js +0 -1
  329. package/.next/static/chunks/pages/prompt-11f87694feb6514c.js +0 -1
  330. package/.next/static/chunks/pages/settings-e8dcaba1551a0b2b.js +0 -1
  331. package/.next/static/chunks/pages/skills/[id]/edit-99e616d5019e80b1.js +0 -1
  332. package/.next/static/chunks/pages/skills/[id]-71f696be252bbf0d.js +0 -1
  333. package/.next/static/chunks/pages/skills/new-00886ea4c676f927.js +0 -1
  334. package/.next/static/chunks/pages/skills-8ad2577b4aa17f3b.js +0 -1
  335. package/.next/static/chunks/pages/system/logs-0856f7c65432befb.js +0 -1
  336. package/.next/static/css/2da1c822e3bdb4bb.css +0 -1
  337. package/.next/static/css/9eb02c1a401fd278.css +0 -1
  338. package/.next/static/e598c2bda8274fb1bb8f7e00f0f36fd4deae91b11929c9f04f17e1ae36b34697/_buildManifest.js +0 -1
  339. package/scripts/half-built-scan.allow.json +0 -152
  340. package/scripts/half-built-scan.baseline.json +0 -190
  341. package/scripts/half-built-scan.mjs +0 -287
  342. /package/.next/static/{e598c2bda8274fb1bb8f7e00f0f36fd4deae91b11929c9f04f17e1ae36b34697 → e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2}/_ssgManifest.js +0 -0
@@ -0,0 +1,11 @@
1
+ "use strict";exports.id=8459,exports.ids=[8459],exports.modules={73005:(a,b,c)=>{function d(a,b){let c=a.match(/[≤≥±]?[A-Za-z0-9][A-Za-z0-9._%/+−-]*|[\s\S]/gu)??[],d=[],e="";for(let a of c)e&&Array.from(e+a).length>b&&(d.push(e),e=""),e+=a;return e&&d.push(e),d}c.d(b,{rZ:()=>B,D1:()=>A,yE:()=>z});var e=c(16208);let f=(a,b)=>{let c=RegExp(`\\b${b}="(-?[\\d.]+)"`,"u").exec(a);return c?Number(c[1]):void 0},g=(a,b)=>RegExp(`\\b${b}="([^"]*)"`,"u").exec(a)?.[1];function h(a,b,c=8){return Array.from({length:c+1},(d,e)=>({x:a.x+(b.x-a.x)*e/c,y:a.y+(b.y-a.y)*e/c}))}function i(a){let b=[],c={x:0,y:0},d={x:0,y:0};for(let e of a.matchAll(/([MLHVCQZmlhvcqz])([^MLHVCQZmlhvcqz]*)/gu)){let a=e[1],f=(e[2].match(/-?\d*\.?\d+(?:e[-+]?\d+)?/giu)??[]).map(Number),g=a===a.toLowerCase(),i=()=>g?c:{x:0,y:0};switch(a.toUpperCase()){case"M":for(let a=0;a+1<f.length;a+=2){let e=i(),g={x:e.x+f[a],y:e.y+f[a+1]};0===a?(c=g,d=g,b.push(g)):(b.push(...h(c,g)),c=g)}break;case"L":for(let a=0;a+1<f.length;a+=2){let d=i(),e={x:d.x+f[a],y:d.y+f[a+1]};b.push(...h(c,e)),c=e}break;case"H":for(let a of f){let d={x:(g?c.x:0)+a,y:c.y};b.push(...h(c,d)),c=d}break;case"V":for(let a of f){let d={x:c.x,y:(g?c.y:0)+a};b.push(...h(c,d)),c=d}break;case"C":for(let a=0;a+5<f.length;a+=6){let d=i(),e={x:d.x+f[a],y:d.y+f[a+1]},g={x:d.x+f[a+2],y:d.y+f[a+3]},h={x:d.x+f[a+4],y:d.y+f[a+5]};for(let a=1;a<=16;a+=1){let d=a/16,f=1-d;b.push({x:f*f*f*c.x+3*f*f*d*e.x+3*f*d*d*g.x+d*d*d*h.x,y:f*f*f*c.y+3*f*f*d*e.y+3*f*d*d*g.y+d*d*d*h.y})}c=h}break;case"Q":for(let a=0;a+3<f.length;a+=4){let d=i(),e={x:d.x+f[a],y:d.y+f[a+1]},g={x:d.x+f[a+2],y:d.y+f[a+3]};for(let a=1;a<=12;a+=1){let d=a/12,f=1-d;b.push({x:f*f*c.x+2*f*d*e.x+d*d*g.x,y:f*f*c.y+2*f*d*e.y+d*d*g.y})}c=g}break;case"Z":b.push(...h(c,d)),c=d}}return b}var j=c(1623);let k=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;"),l=a=>String(a).padStart(2,"0");function m(a){let b=/^(\d{4})-(\d{2})-(\d{2})$/u.exec(a);return b?`${b[1]}.${b[2]}.${b[3]}`:a}function n(a,b){let c=[],d="";for(let e of Array.from(a)){let a=Array.from(d+=e).length,f=/[\s、,,。;;::—\-/()()]/u.test(e);a>=b&&f?(c.push(d.trim()),d=""):a>=b+4&&(c.push(d.trim()),d="")}return(d.trim()||!c.length)&&c.push(d.trim()),c}var o=c(67001);function p(a,b,c=0){return a.x+c<b.x+b.width&&b.x+c<a.x+a.width&&a.y+c<b.y+b.height&&b.y+c<a.y+a.height}let q=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;");var r=c(77598),s=c(73024),t=c.n(s),u=c(76760),v=c.n(u);let w=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;"),x=a=>(0,r.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),y={org:"层级=汇报关系;方框=岗位/部门;暗标只写岗位不写姓名",deployment:"区段/工作面 → 施工阶段 → 顺序与穿插 → 专业移交;箭头表示实际组织关系","risk-control":"识别 → 对策 → 责任岗位 → 验证节点;每条关系须来自风险清单/专项方案",process:"工序先后与接口;箭头表示实际流转关系",generic:"方框=对象/岗位;箭头=实际关系;不表示未声明的时间或空间坐标"};function z(a,b={}){let c=String(a.figureSemantics??""),r=a.planBaseline?[{name:"plan"}]:a.layout?[{name:"spatial"}]:"tree"===a.graphLayout||"org"===c?[{name:"tree",force:"tree"},{name:"layered",force:"layered"},{name:"default",force:"default"},{name:"safe",force:"safe"}]:["deployment","risk-control","process"].includes(c)||"grid"===a.graphLayout?[{name:"layered",force:"layered"},{name:"default",force:"default"},{name:"safe",force:"safe"}]:[{name:"default",force:"default"},{name:"layered",force:"layered"},{name:"safe",force:"safe"}],s=[];for(let c of r)try{let r=function(a,b={},c){if(a.planBaseline)return"network"===a.planView?function(a,b={}){let c=!0===b.monoColor,d=b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif",e=c?"#000000":"#0f172a",f=c?"#666666":"#94a3b8",g=c?"#333333":"#475569",h=new Map(a.milestones.map(a=>[a.id,a])),i=new Map;for(let b of a.milestones)for(let a of b.predecessors??[])h.has(a)&&i.set(a,[...i.get(a)??[],b.id]);let l=new Map,n=a=>{let b=l.get(a);if(void 0!==b)return b;let c=h.get(a),d=(c.predecessors??[]).filter(a=>h.has(a)),e=d.length?Math.max(...d.map(a=>n(a)+Math.max(0,c.day-h.get(a).day))):c.day;return l.set(a,e),e},o=new Map,p=a=>{let b=o.get(a);if(void 0!==b)return b;let c=(h.get(a)?.predecessors??[]).filter(a=>h.has(a)),d=c.length?Math.max(...c.map(a=>p(a)))+1:0;return o.set(a,d),d},q=Math.max(...a.milestones.map(a=>n(a.id)),a.totalDays),r=[...a.milestones].sort((a,b)=>p(a.id)-p(b.id)||a.day-b.day),s=Math.max(...r.map(a=>p(a.id)),0)+1,t=Array.from({length:s},(a,b)=>r.filter(a=>p(a.id)===b)),u=Math.max(...t.map(a=>a.length),1),v=Math.max(1e3,120+(s-1)*300+230),w=150+96*u+80,x=new Map;t.forEach((a,b)=>a.forEach((a,c)=>{x.set(a.id,{x:60+300*b,y:150+96*c+(b%2?18:0)})}));let y=a=>q-n(a)==0,z=r.flatMap(a=>(a.predecessors??[]).filter(a=>h.has(a)).map(b=>{let c=x.get(b),d=x.get(a.id),g=y(b)&&y(a.id)&&n(a.id)===n(b)+Math.max(0,a.day-h.get(b).day),i=c.x+230,j=c.y+33,l=d.x,m=d.y+33;return`<path data-edge="${k(b)}->${k(a.id)}"${g?' data-critical="true"':""} d="M${i},${j} H${(i+l)/2} V${m} H${l}" fill="none" stroke="${g?e:f}" stroke-width="${g?2.4:1.3}" marker-end="url(#planArrow${g?"Critical":""})"/>`})).join(""),A=r.map(a=>{let{x:b,y:c}=x.get(a.id),d=y(a.id),f=q-n(a.id),h=a.title.length>16?[a.title.slice(0,16),a.title.slice(16)]:[a.title];return`<g data-milestone="${k(a.id)}" data-day="${a.day}" data-date="${k(a.date)}" data-float="${f}" data-critical="${d?"true":"false"}"><rect x="${b}" y="${c}" width="230" height="66" rx="6" fill="white" stroke="${e}" stroke-width="${d?3:1.4}"/>`+h.map((a,d)=>`<text x="${b+115}" y="${c+19+15*d}" font-size="12" text-anchor="middle">${k(a)}</text>`).join("")+`<text x="${b+115}" y="${c+50}" font-size="10.5" text-anchor="middle" fill="${g}">第${a.day}天 \xb7 ${k(m(a.date))} \xb7 时差 ${f} 天</text>`+"</g>"}).join("");return`<svg xmlns="http://www.w3.org/2000/svg" width="${v}" height="${w}" viewBox="0 0 ${v} ${w}" role="img" data-chart-view="plan-network" data-critical-path="${r.some(a=>y(a.id))?"present":"none"}" data-figure-legend="true"><defs><marker id="planArrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="${f}"/></marker><marker id="planArrowCritical" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="${e}"/></marker></defs><title>施工总进度计划网络图(里程碑逻辑)</title><desc>${k(JSON.stringify({startDate:a.startDate,totalDays:a.totalDays,milestones:a.milestones}))}</desc><rect width="100%" height="100%" fill="white"/><g font-family="${k(d)}" fill="${e}">`+(b.hideCaption?"":`<text x="${v/2}" y="38" font-size="20" text-anchor="middle">施工总进度计划网络图(里程碑逻辑)</text>`)+`<text x="${v/2}" y="62" font-size="13" text-anchor="middle">${k(m(a.startDate))} 至 ${k(m((0,j.u9)(a.startDate,a.totalDays)))},共 ${a.totalDays} 日历天</text>`+`<text x="${v/2}" y="86" font-size="11" text-anchor="middle" fill="${g}">节点=里程碑;箭头=前置关系;粗线=关键线路;时差=相对最长链的余量</text>`+z+A+`<g font-size="11" fill="${g}"><rect x="60" y="${w-46}" width="26" height="8" fill="none" stroke="${e}" stroke-width="2.4"/>`+`<text x="94" y="${w-37}">关键线路(时差 0)</text>`+`<line x1="230" y1="${w-42}" x2="256" y2="${w-42}" stroke="${f}" stroke-width="1.3" marker-end="url(#planArrow)"/>`+`<text x="264" y="${w-37}">非关键前置关系</text></g>`+"</g></svg>"}(a.planBaseline,b):function(a,b={}){let c=!0===b.monoColor,d=b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif",e=c?"#000000":"#0f172a",f=c?"#333333":"#475569",g=c?"#cccccc":"#e5e7eb",h=b=>250+Math.max(0,Math.min(a.totalDays,b))/a.totalDays*810,i=a.phases.length,o=a.tasks??[],p=new Map(o.map(a=>[a.id,a])),q=new Map,r=a=>{let b=q.get(a);if(void 0!==b)return b;let c=p.get(a),d=c.predecessors.filter(a=>p.has(a)),e=d.length?Math.max(...d.map(a=>r(a)+Math.max(0,c.startDay-p.get(a).endDay))):c.startDay;return q.set(a,e),e},s=Math.max(0,...o.map(a=>r(a.id))),t=a=>o.length>0&&s-r(a)==0,u=o.some(a=>t(a.id)),v=o.map(a=>n(a.title,22)),w=v.map(a=>Math.max(34,14*a.length+20)),x=150+46*i,y=new Map,z=x;for(let[a,b]of o.entries())y.set(b.id,z),z+=w[a];let A=a.milestones.map(a=>n(a.title,18)),B=14*Math.max(0,...A.map(a=>a.length-2)),C=x+(z-x)+68,D=C+120+B,E=[],F=new Date(`${a.startDate}T00:00:00Z`);for(let b=0;;b+=1){let c=new Date(Date.UTC(F.getUTCFullYear(),F.getUTCMonth()+b,1)),d=Math.round((c.getTime()-F.getTime())/864e5);if(d>a.totalDays)break;d<0||E.push({day:d,label:`${c.getUTCFullYear()}.${l(c.getUTCMonth()+1)}`})}let G=E.map(a=>`<line x1="${h(a.day)}" y1="126" x2="${h(a.day)}" y2="${C+36}" stroke="${g}"/><text x="${h(a.day)}" y="120" font-size="12" text-anchor="middle">${k(a.label)}</text>`).join(""),H=a.phases.map((a,b)=>{let d=150+46*b,e=h(a.startDay),f=h(a.endDay+1),g=(e+f)/2,i=g>990?"end":g<90?"start":"middle",j="end"===i?Math.min(1092,g):"start"===i?Math.max(8,g):g;return`<rect data-phase="${k(a.id)}" x="${e}" y="${d}" width="${Math.max(2,f-e)}" height="24" fill="${c?"#ffffff":b%2?"#dbeafe":"#bfdbfe"}" stroke="${c?"#000000":"#1e3a8a"}" stroke-width="1"/><text x="20" y="${d+17}" font-size="13">${k(a.title)}(第${a.startDay}—${a.endDay}天)</text><text x="${j}" y="${d+17}" font-size="11" text-anchor="${i}">${k(m(a.startDate))} — ${k(m(a.endDate))}</text>`}).join(""),I=o.map((a,b)=>{let d=y.get(a.id),e=w[b],f=v[b],g=h(a.startDay),i=h(a.endDay+1),j=d+(e-16)/2,l=t(a.id);return`<g data-task="${k(a.id)}" data-work-package="${k(a.workPackageId)}" data-start-day="${a.startDay}" data-end-day="${a.endDay}"${l?' data-critical="true"':""}>`+f.map((a,b)=>`<text x="20" y="${d+14+13*b}" font-size="11">${k(a)}</text>`).join("")+`<rect x="${g}" y="${j}" width="${Math.max(2,i-g)}" height="16" fill="${c?"#ffffff":l?"#fecaca":"#e0e7ff"}" stroke="${c?"#000000":l?"#991b1b":"#3730a3"}" stroke-width="${l?2.2:1}"/>`+`<text x="${(g+i)/2}" y="${j+12}" font-size="9.5" text-anchor="middle">第${a.startDay}—${a.endDay}天</text>`+"</g>"}).join(""),J=o.flatMap(a=>a.predecessors.filter(a=>p.has(a)).map(b=>{let c=p.get(b),d=y.get(b),g=y.get(a.id),i=h(c.endDay+1),j=h(a.startDay),l=d+w[o.indexOf(c)]/2,m=g+w[o.indexOf(a)]/2,n=t(b)&&t(a.id)&&r(a.id)===r(b)+Math.max(0,a.startDay-c.endDay),q=Math.max(i+10,(i+j)/2),s=j>=i?`M${i},${l} H${q} V${m} H${j}`:`M${i},${l} V${(l+m)/2} H${j} V${m}`;return`<path data-edge="${k(b)}->${k(a.id)}"${n?' data-critical="true"':""} d="${s}" fill="none" stroke="${n?e:f}" stroke-width="${n?2.2:1.1}" marker-end="url(#planTaskArrow${n?"Critical":""})"/>`})).join(""),K=a.milestones.map((a,b)=>{let d=h(a.day),f=A[b],g=d>980?"end":d<120?"start":"middle",i="end"===g?Math.min(1092,d):"start"===g?Math.max(8,d):d;return`<g data-milestone="${k(a.id)}" data-day="${a.day}" data-date="${k(a.date)}"><line x1="${d}" y1="${x+16}" x2="${d}" y2="${C-8}" stroke="${c?"#333333":"#64748b"}" stroke-dasharray="3 3"/><polygon points="${d},${C-7} ${d+7},${C} ${d},${C+7} ${d-7},${C}" fill="${e}"/><text x="${i}" y="${C+24}" font-size="11" text-anchor="${g}">第${a.day}天</text><text x="${i}" y="${C+39}" font-size="10" text-anchor="${g}">${k(m(a.date))}</text>`+f.map((a,b)=>`<text x="${i}" y="${C+58+14*b}" font-size="10" text-anchor="${g}">${k(a)}</text>`).join("")+"</g>"}).join("");return`<svg xmlns="http://www.w3.org/2000/svg" width="1100" height="${D}" viewBox="0 0 1100 ${D}" role="img" data-chart-view="plan-schedule" data-axis="true" data-critical-path="${u?"present":"none"}" data-figure-legend="true"><title>施工总进度计划横道图</title><desc>${k(JSON.stringify({version:a.version,startDate:a.startDate,totalDays:a.totalDays,phases:a.phases,milestones:a.milestones,tasks:a.tasks??[]}))}</desc><defs><marker id="planTaskArrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="${f}"/></marker><marker id="planTaskArrowCritical" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="${e}"/></marker></defs><rect width="100%" height="100%" fill="white"/><g font-family="${k(d)}" fill="${e}">`+(b.hideCaption?"":`<text x="550" y="34" font-size="20" text-anchor="middle">施工总进度计划横道图</text>`)+`<text x="550" y="58" font-size="13" text-anchor="middle">${k(m(a.startDate))} 至 ${k(m((0,j.u9)(a.startDate,a.totalDays)))},共 ${a.totalDays} 日历天(开工日为第0天)</text>`+G+H+(o.length?`<text x="20" y="${150+46*i+14}" font-size="13">任务</text>${I}${J}`:"")+`<text x="20" y="${C+10}" font-size="13">里程碑</text>${K}`+`<text x="250" y="${D-30}" font-size="11" fill="${f}">阶段条=施工阶段;任务条=工作项/工序(${o.length} 行);粗线=关键线路;◆=里程碑;日期按开工日0起算。</text>`+`<text x="250" y="${D-14}" font-size="11" fill="${f}">依赖关系来自执行基准前置;进场后按经批准的总进度计划复核。</text>`+"</g></svg>"}(a.planBaseline,b);if(a.layout)return function(a,b={}){let c=(0,o.Q)(a.layout,a.nodes.map(a=>a.id),a.edges),e=d(a.caption,40),f=27*Math.max(0,e.length-2),g={x:35,y:95+f,width:930,height:590},h=[],i=a=>({x:g.x+a.x*g.width,y:g.y+a.y*g.height}),j=(function(a){let b=new Map(a.nodes.map(a=>[a.id,a])),c=function(a,b){let c=(a,b,c)=>Math.min(c,Math.max(b,Math.round(100*a)/100)),d=new Set([a.x,a.x+a.width]),e=new Set([a.y,a.y+a.height]);for(let f of b){for(let b of[f.x-12,f.x,f.x+f.width,f.x+f.width+12])d.add(c(b,a.x,a.x+a.width));for(let b of[f.y-12,f.y,f.y+f.height,f.y+f.height+12])e.add(c(b,a.y,a.y+a.height))}let f=[...d].sort((a,b)=>a-b),g=[...e].sort((a,b)=>a-b),h=[];for(let a=1;a<f.length;a+=1)h.push(Math.round((f[a-1]+f[a])*50)/100);let i=[];for(let a=1;a<g.length;a+=1)i.push(Math.round((g[a-1]+g[a])*50)/100);let j=[...new Set([...f,...h].sort((a,b)=>a-b))],k=[...new Set([...g,...i].sort((a,b)=>a-b))],l=j.length,m=new Uint8Array(l*k.length);for(let a=0;a<l;a+=1)for(let c=0;c<k.length;c+=1){let d={x:j[a],y:k[c],width:0,height:0};b.some(a=>d.x>a.x-12&&d.x<a.x+a.width+12&&d.y>a.y-12&&d.y<a.y+a.height+12)&&(m[c*l+a]=1)}return{xs:j,ys:k,blocked:m}}(a.plot,a.nodes);return a.edges.map((d,e)=>{let f=b.get(d.from),g=b.get(d.to);if(!f||!g)throw Error(`图件关系端点缺失:${d.from}→${d.to}`);let h={x:f.x+f.width/2,y:f.y+f.height/2},i={x:g.x+g.width/2,y:g.y+g.height/2},j=new Set([f.id,g.id]),k=function(a,b,c){let d=(a,b)=>a.x>b.x&&a.x<b.x+b.width&&a.y>b.y&&a.y<b.y+b.height,e=(a,b,c)=>{let e=d(a,c);return a.x===b.x?{x:a.x,y:e?b.y<a.y?c.y:c.y+c.height:b.y>a.y?c.y:c.y+c.height}:{x:e?b.x<a.x?c.x:c.x+c.width:b.x>a.x?c.x:c.x+c.width,y:a.y}},f=[...a];for(let a=f.length-1;a>0;a-=1)if(d(f[a],c)&&!d(f[a-1],c)){f.splice(a,f.length-a,e(f[a-1],f[a],c));break}for(let a=0;a+1<f.length;a+=1)if(d(f[a],b)&&!d(f[a+1],b)){f.splice(0,a+1,e(f[a],f[a+1],b));break}return f}(function(a,b,c,d,e){let f=b.find(a=>e.has(a.id)&&c.x>a.x&&c.x<a.x+a.width&&c.y>a.y&&c.y<a.y+a.height),g=b.find(a=>e.has(a.id)&&d.x>a.x&&d.x<a.x+a.width&&d.y>a.y&&d.y<a.y+a.height),h=a=>[f,g].filter(a=>!!a).some(b=>a.x>=b.x-12&&a.x<=b.x+b.width+12&&a.y>=b.y-12&&a.y<=b.y+b.height+12),i=(b,c)=>{let d=a.xs.findIndex(a=>1e-6>Math.abs(a-b)),e=a.ys.findIndex(a=>1e-6>Math.abs(a-c));return d>=0&&e>=0?e*a.xs.length+d:-1},j=b=>({x:a.xs.reduce((a,c)=>Math.abs(c-b.x)<Math.abs(a-b.x)?c:a,a.xs[0]),y:a.ys.reduce((a,c)=>Math.abs(c-b.y)<Math.abs(a-b.y)?c:a,a.ys[0])}),k=j(c),l=j(d),m=i(k.x,k.y),n=i(l.x,l.y);if(m<0||n<0)return[c,d];let o=a.xs.length,q=[{x:k.x,y:k.y,cost:0,heuristic:Math.abs(k.x-l.x)+Math.abs(k.y-l.y),previous:null}],r=new Set,s=new Map,t=null;for(;q.length;){q.sort((a,b)=>a.cost+a.heuristic-(b.cost+b.heuristic));let c=q.shift(),d=i(c.x,c.y);if(d===n){t=c;break}if(!r.has(d))for(let[f,g]of(r.add(d),[[1,0],[-1,0],[0,1],[0,-1]])){let i=a.xs.findIndex(a=>1e-6>Math.abs(a-c.x))+f,j=a.ys.findIndex(a=>1e-6>Math.abs(a-c.y))+g;if(i<0||i>=o||j<0||j>=a.ys.length)continue;let k=j*o+i;if(r.has(k))continue;let m={x:a.xs[i],y:a.ys[j]};if(a.blocked[k]&&!h(m)||!function(a,b,c,d,e,f){for(let g of a)if(!b.has(g.id)&&p({x:Math.min(c,e)-1e-9,y:Math.min(d,f)-1e-9,width:Math.abs(e-c)+2e-9,height:Math.abs(f-d)+2e-9},g,-12))return!1;return!0}(b,e,c.x,c.y,m.x,m.y))continue;let n=c.cost+Math.abs(m.x-c.x)+Math.abs(m.y-c.y),t=q.find(a=>a.x===m.x&&a.y===m.y);t&&t.cost<=n||(t?(t.cost=n,t.previous=d):q.push({...m,cost:n,heuristic:Math.abs(m.x-l.x)+Math.abs(m.y-l.y),previous:d}),s.set(k,d))}}if(!t){let b=a.xs.at(-1);return[c,{x:b,y:c.y},{x:b,y:d.y},d]}let u=[],v=i(t.x,t.y);for(;v>=0;){let b=Math.floor(v/o),c=v%o;u.push({x:a.xs[c],y:a.ys[b]});let d=s.get(v);if(void 0===d)break;v=d}u.reverse(),(u[0].x!==c.x||u[0].y!==c.y)&&u.unshift({x:c.x,y:c.y}),(u.at(-1).x!==d.x||u.at(-1).y!==d.y)&&u.push({x:d.x,y:d.y});let w=[];for(let a of u){let b=w.at(-1),c=w.at(-2);b&&b.x===a.x&&b.y===a.y||(b&&c&&(a.x===b.x&&b.x===c.x||a.y===b.y&&b.y===c.y)&&w.pop(),w.push(a))}return w}(c,a.nodes,h,i,j),f,g),l=a.labelSize(d.label);return{edgeIndex:e,points:k,label:function(a,b,c,d){let e=a.slice(1).reduce((b,c,d)=>b+Math.hypot(c.x-a[d].x,c.y-a[d].y),0),f=[];for(let b=e/2,c=0;c<24&&b<e;c+=1,b+=32){let c=b;for(let b=0;b+1<a.length;b+=1){let d=Math.hypot(a[b+1].x-a[b].x,a[b+1].y-a[b].y);if(c<=d){let e=d?c/d:0;f.push({x:a[b].x+(a[b+1].x-a[b].x)*e,y:a[b].y+(a[b+1].y-a[b].y)*e});break}c-=d}}let g=a=>({x:a.x-c/2,y:a.y-d/2,width:c,height:d});for(let a of f){let c=g(a);if(!b.some(a=>p(c,a)))return a}return f.at(-1)??a[Math.floor(a.length/2)]}(k,a.nodes,l.width,l.height)}})})({plot:g,nodes:c.placements.map(a=>({id:a.nodeId,...i(a),width:a.width*g.width,height:a.height*g.height})),edges:a.edges,labelSize:a=>{let b=d(a??"",40);return{width:Math.min(600,Math.max(0,...b.map(a=>15*Array.from(a).length)))+6,height:20*b.length}}}).map(c=>{let e=c.points,f=d(a.edges[c.edgeIndex].label??"",40),h=20*f.length;if(h>g.height)throw Error("空间路线完整标签无法在图中清晰显示,须调整图件布局");let i=Math.min(600,Math.max(0,...f.map(a=>15*Array.from(a).length))),j=Math.max(g.x+i/2,Math.min(g.x+g.width-i/2,c.label.x)),k=Math.max(g.y+h,Math.min(g.y+g.height-10,c.label.y-8)),l="",m=e.at(-1),n=e.at(-2);if(m&&n){let a=Math.hypot(m.x-n.x,m.y-n.y);if(a>.5){let c=(m.x-n.x)/a,d=(m.y-n.y)/a,e=-(5*d),f=5*c,g={x:m.x-9*c,y:m.y-9*d};l=`<polygon points="${m.x},${m.y} ${g.x+e},${g.y+f} ${g.x-e},${g.y-f}" fill="${b.monoColor?"#000000":"#475569"}"/>`}}return`<g data-source-edge="${c.edgeIndex}" data-from="${q(a.edges[c.edgeIndex].from)}" data-to="${q(a.edges[c.edgeIndex].to)}"><polyline points="${e.map(a=>`${a.x},${a.y}`).join(" ")}" fill="none" stroke="${b.monoColor?"#000000":"#475569"}" stroke-width="2"/>${l}${f.length?`<rect x="${j-i/2-3}" y="${k-h+3}" width="${i+6}" height="${h}" fill="white"/><text x="${j}" y="${k-h+20}" text-anchor="middle" font-size="15" fill="${b.monoColor?"#000000":"#334155"}">${f.map((a,b)=>`<tspan x="${j}" dy="${20*!!b}">${q(a)}</tspan>`).join("")}</text>`:""}</g>`}),k=c.placements.map(c=>{let e=a.nodes.find(a=>a.id===c.nodeId),f=i(c),j=c.width*g.width,k=c.height*g.height,l=20,m=[];for(;l>=12;l--){let a=Math.max(1,Math.floor((j-16)/l));if((m=d(e.label,a)).length*(l+5)+12<=k&&m.every(a=>Array.from(a).length*l<=j-16))break}if(l<12){let c=a.nodes.findIndex(a=>a.id===e.id)+1,g=d(e.label,48);return h.push({nodeId:e.id,number:c,lines:g}),`<g data-source-node="${q(e.id)}"><title>${q(e.label)}</title><rect x="${f.x}" y="${f.y}" width="${j}" height="${k}" fill="${b.monoColor?"#ffffff":"#f8fafc"}" stroke="${b.monoColor?"#000000":"#334155"}" stroke-width="1.5"/><text x="${f.x+j/2}" y="${f.y+k/2+4}" font-size="12" text-anchor="middle" fill="${b.monoColor?"#000000":"#0f172a"}" stroke="white" stroke-width="3" paint-order="stroke" data-legend-marker="${c}">${c}</text></g>`}return`<g data-source-node="${q(e.id)}"><title>${q(e.label)}</title><rect x="${f.x}" y="${f.y}" width="${j}" height="${k}" fill="${b.monoColor?"#ffffff":"#f8fafc"}" stroke="${b.monoColor?"#000000":"#334155"}" stroke-width="1.5"/>${m.map((a,b)=>`<text x="${f.x+j/2}" y="${f.y+(k-m.length*(l+5))/2+l+b*(l+5)}" font-size="${l}" text-anchor="middle">${q(a)}</text>`).join("")}</g>`}),l=g.y+g.height+28,m=h.map(a=>{let b=a.lines.map((b,c)=>`<text x="35" y="${l+24*c}" font-size="16">${c?"":`${a.number}&#160;&#160;`}${q(b)}</text>`).join("");return l+=24*a.lines.length+8,`<g data-label-legend-for="${q(a.nodeId)}">${b}</g>`}).join(""),n=Math.max(760+f,l+62),r=`<g data-north-arrow="true"><line x1="${g.x+g.width-56}" y1="${g.y+72}" x2="${g.x+g.width-56}" y2="${g.y+26}" stroke="${b.monoColor?"#000000":"#0f172a"}" stroke-width="2"/><polygon points="${g.x+g.width-56},${g.y+16} ${g.x+g.width-66},${g.y+34} ${g.x+g.width-46},${g.y+34}" fill="${b.monoColor?"#000000":"#0f172a"}"/><text x="${g.x+g.width-56}" y="${g.y+88}" font-size="13" text-anchor="middle">N(示意)</text></g>`;return`<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="${n}" viewBox="0 0 1000 ${n}" role="img" aria-label="${q(a.caption)}" data-coordinate-system="relative-schematic" data-north-arrow="true" data-figure-legend="true"><title>${q(a.caption)}</title><desc>${q(JSON.stringify({layout:"relative-schematic",coordinateSystem:"relative-schematic",nodeCount:a.nodes.length,edgeCount:a.edges.length,routing:"renderer-orthogonal"}))}</desc><rect width="100%" height="100%" fill="white"/><g font-family="${q(b.fontFamily||"Noto Sans CJK SC,Microsoft YaHei,SimSun,sans-serif")}" fill="${b.monoColor?"#000000":"#0f172a"}">${b.hideCaption?"":e.map((a,b)=>`<text x="500" y="${32+27*b}" text-anchor="middle" font-size="22">${q(a)}</text>`).join("")}<rect x="${g.x}" y="${g.y}" width="${g.width}" height="${g.height}" fill="none" stroke="${b.monoColor?"#000000":"#94a3b8"}"/>${r}${j.join("")}${k.join("")}${m}<text x="35" y="${n-35}" font-size="16">相对位置布置示意${h.length?";编号与设施名称图例对应":""};尺寸与方位以图纸/现场为准</text></g></svg>`}(a,b);if(!a.nodes.length||a.edges.some(b=>!a.nodes.some(a=>a.id===b.from)||!a.nodes.some(a=>a.id===b.to)))throw Error("图件必须具有真实节点,关系端点不能缺席");if("tree"===c)return D(a,b);if("layered"===c)return E(a,b);if("safe"===c)return function(a,b){let c=C(a),e=new Map(c.map(a=>[a.id,d(a.label,24)])),f=Math.max(54,20+18*Math.max(1,...[...e.values()].map(a=>a.length))),g=new Map(c.map((a,b)=>[a.id,{x:270,y:130+b*(f+28)}])),h=130+c.length*(f+28)+100,i=a.edges.map((a,b)=>{let c=g.get(a.from),d=g.get(a.to);if(!c||!d)throw Error(`图件关系端点缺失:${a.from}→${a.to}`);let e=870-b%4*18,h=c.y+f/2,i=d.y+f/2,j=`M${c.x+360},${h} H${e} V${i} H${d.x+360}`;return`<g data-source-edge="${w(a.from)}->${w(a.to)}" data-edge-index="${b}"><path d="${j}" fill="none" stroke="black" stroke-width="1.5" marker-end="url(#safeArrow)"/>`+(a.label?.trim()?`<text x="${e-6}" y="${(h+i)/2}" font-size="12" text-anchor="end">${w(a.label.trim())}</text>`:"")+"</g>"}).join(""),j=c.map(a=>{let b=g.get(a.id),c=e.get(a.id),d=b.y+Math.max(18,(f-18-18*c.length)/2+14);return`<g data-source-node="${w(a.id)}"><rect x="${b.x}" y="${b.y}" width="360" height="${f}" rx="5" fill="white" stroke="black" stroke-width="1.4"/>`+c.map((a,c)=>`<text x="${b.x+180}" y="${d+18*c}" font-size="14" text-anchor="middle">${w(a)}</text>`).join("")+(a.lane?.trim()?`<text x="${b.x+180}" y="${b.y+f-8}" font-size="10" text-anchor="middle" fill="#555">${w(a.lane)}</text>`:"")+"</g>"}).join(""),k=d(a.caption,45),l=y[a.figureSemantics??"generic"]??y.generic;return`<svg xmlns="http://www.w3.org/2000/svg" width="900" height="${h}" viewBox="0 0 900 ${h}" role="img" data-figure-legend="true" data-layout="safe"><title>${w(a.caption)}</title><desc>${w(JSON.stringify({nodes:a.nodes,edges:a.edges,layout:"safe",semantics:a.figureSemantics??"generic",legend:l}))}</desc><defs><marker id="safeArrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="black"/></marker></defs><rect width="100%" height="100%" fill="white"/><g font-family="${w(b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif")}" fill="${b.monoColor?"#000000":"#0f172a"}">`+(b.hideCaption?"":k.map((a,b)=>`<text x="450" y="${30+22*b}" text-anchor="middle" font-size="19">${w(a)}</text>`).join(""))+`${j}${i}</g></svg>`}(a,b);if(!c){if(["deployment","risk-control","process"].includes(String(a.figureSemantics??"")))return E(a,b);if("org"===a.figureSemantics||"tree"===a.graphLayout)return D(a,b)}let e=a.nodes.map(a=>d(a.label,10)),f=Math.min(3,a.nodes.length),g=Math.max(66,...e.map(a=>24*a.length+24)),h=new Map(a.nodes.map((a,b)=>[a.id,Math.floor(b/f)])),i=new Map;for(let b of a.edges)h.get(b.from)<h.get(b.to)&&i.set(h.get(b.from),(i.get(h.get(b.from))??0)+1);let r=g+Math.max(105,22*Math.max(0,...i.values())+45),s=125+Math.ceil(a.nodes.length/f)*r,t=new Map(a.nodes.map((a,b)=>[a.id,{x:40+b%f*295,y:110+Math.floor(b/f)*r}])),u=new Map,v=0,x=[{x:450-19*Array.from(a.caption).length/2,y:10,width:19*Array.from(a.caption).length,height:32}],z=[],A=a.edges.map((a,c)=>{let d,e,f,h,i=t.get(a.from),j=t.get(a.to),k=i.x+115,l=i.y+g,m=j.x+115,n=j.y,o=!1;if(i.y===j.y&&j.x>i.x&&j.x-i.x<320){let a=i.y+g/2,b=i.y-20;d=`M${i.x+230},${a} H${i.x+230+14} V${b} H${j.x-14} V${a} H${j.x-9}`,e=`${j.x-2},${a} ${j.x-11},${a-5} ${j.x-11},${a+5}`,f=(i.x+230+j.x)/2,h=b-7}else if(i.y<j.y){let a=u.get(i.y)??0;u.set(i.y,a+1);let b=l+28+22*a;d=`M${k},${l} V${b} H${m} V${n-9}`,e=`${m},${n-2} ${m-5},${n-11} ${m+5},${n-11}`,f=(k+m)/2,h=b-8}else{let a=12-28*v++,b=Math.max(52,j.y-(24+c%3*12));d=`M${k},${i.y} V${i.y-20} H${a} V${b} H${m} V${n-9}`,e=`${m},${n-2} ${m-5},${n-11} ${m+5},${n-11}`,f=a-12,h=(i.y-20+b)/2,o=!0}let p=a.label?16*Array.from(a.label).length+12:0;a.label&&x.push(o?{x:f-18,y:h-p/2,width:24,height:p}:{x:f-p/2,y:h-18,width:p,height:24});let q=a.label?`<g ${o?`transform="rotate(-90 ${f} ${h})"`:""}><rect x="${f-p/2}" y="${h-18}" width="${p}" height="24" fill="white"/><text x="${f}" y="${h}" text-anchor="middle" font-size="16" fill="${b.monoColor?"#000000":"#334155"}">${w(a.label)}</text></g>`:"";return z.push(q),`<g data-source-edge="${c}" data-from="${w(a.from)}" data-to="${w(a.to)}"><path d="${d}" fill="none" stroke="${b.monoColor?"#000000":"#475569"}" stroke-width="1.6"/><polygon points="${e}" fill="${b.monoColor?"#000000":"#475569"}"/></g>`}),B=a.nodes.map((a,c)=>{let{x:d,y:f}=t.get(a.id);return`<g data-source-node="${w(a.id)}"><rect x="${d}" y="${f}" width="230" height="${g}" rx="6" fill="${b.monoColor?"#ffffff":"#f8fafc"}" stroke="${b.monoColor?"#000000":"#334155"}" stroke-width="1.5"/>${e[c].map((a,b)=>`<text x="${d+115}" y="${f+(g-24*e[c].length)/2+20+24*b}" font-size="20" text-anchor="middle">${w(a)}</text>`).join("")}</g>`}),F=Math.floor(Math.min(0,...x.map(a=>a.x-10))),G=Math.ceil(Math.max(900,...x.map(a=>a.x+a.width+10))),H=Math.floor(Math.min(0,...x.map(a=>a.y-10))),I=Math.ceil(Math.max(s,...x.map(a=>a.y+a.height+10))),J=G-F,K=I-H;return`<svg xmlns="http://www.w3.org/2000/svg" width="${J}" height="${K}" viewBox="0 0 ${J} ${K}" data-source-offset-y="${-H}" data-figure-legend="true" role="img"><title>${w(a.caption)}</title><desc>${w(JSON.stringify({nodes:a.nodes,edges:a.edges,semantics:a.figureSemantics??"generic",legend:y[a.figureSemantics??"generic"]??y.generic}))}</desc><rect width="100%" height="100%" fill="white"/><g transform="translate(${-F} ${-H})" font-family="${w(b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif")}" fill="${b.monoColor?"#000000":"#0f172a"}">${b.hideCaption?"":`<text x="450" y="35" text-anchor="middle" font-size="19">${w(a.caption)}</text>`}${A.join("")}${z.join("")}${B.join("")}</g></svg>`}(a,b,c.force),t=function(a){let b=[],c=/^<svg\b([^>]*)>([\s\S]*)<\/svg>$/u.exec(a.trim());if(!c)return[{code:"figure-svg-invalid",message:"图件不是完整 SVG"}];let d=c[1],j=c[2],k=f(d,"width"),l=f(d,"height");if(!k||!l||k<=0||l<=0)return[{code:"figure-canvas-invalid",message:"图件缺少真实画布尺寸(width/height)"}];/<title>([\s\S]*?)<\/title>/u.exec(j)?.[1]?.trim()||b.push({code:"figure-title-missing",message:"图件缺少题注 <title>"}),"true"!==g(d,"data-figure-legend")&&b.push({code:"figure-legend-missing",message:'图件缺少图例(须声明 data-figure-legend="true" 并在图内写明关系语义)'});let m=g(d,"data-chart-view"),n="none"===g(d,"data-critical-path");"plan-network"!==m||n||/data-critical="true"/u.test(j)||b.push({code:"figure-critical-path-missing",message:'网络图没有关键线路标记(data-critical="true")'}),"plan-schedule"===m&&("true"!==g(d,"data-axis")&&b.push({code:"figure-axis-missing",message:'横道图缺少日历轴标记(data-axis="true")'}),/data-task=/u.test(j)&&/data-edge=/u.test(j)&&!n&&!/data-critical="true"/u.test(j)&&b.push({code:"figure-critical-path-missing",message:'横道图没有任务关键线路标记(data-critical="true")'})),"relative-schematic"===g(d,"data-coordinate-system")&&"true"!==g(d,"data-north-arrow")&&b.push({code:"figure-north-arrow-missing",message:'施工总平面缺少指北针(示意)标记(data-north-arrow="true")'});let o=function(a){let b=[];for(let c of a.matchAll(/<g\b[^>]*data-(?:source-node|milestone)="([^"]+)"[^>]*>([\s\S]*?)<\/g>/gu)){let a=/<rect\b([^>]*)\/?>/u.exec(c[2]);if(!a)continue;let d=f(a[1],"x"),e=f(a[1],"y"),g=f(a[1],"width"),h=f(a[1],"height");void 0!==d&&void 0!==e&&void 0!==g&&void 0!==h&&b.push({id:c[1],x:d,y:e,width:g,height:h})}return b}(j),p=function(a){let b=[];for(let c of a.matchAll(/<text\b([^>]*)>([\s\S]*?)<\/text>/gu)){let d=c[1],e=a.slice(Math.max(0,(c.index??0)-400),c.index??0);if(/transform="rotate/u.test(d)||e.lastIndexOf("rotate(")>e.lastIndexOf("</g>"))continue;let h=f(d,"x"),i=f(d,"y");if(void 0===h||void 0===i)continue;let j=f(d,"font-size")??16,k=c[2].replace(/<[^>]*>/gu,"").replace(/&lt;/gu,"<").replace(/&gt;/gu,">").replace(/&amp;/gu,"&").replace(/&quot;/gu,'"').replace(/&#160;/gu," ").replace(/&apos;/gu,"'").trim();if(!k)continue;let l=function(a,b){let c=0;for(let b of Array.from(a))/\s/u.test(b)?c+=.3:/[⺀-鿿豈-﫿\u3000-〿＀-￯]/u.test(b)?c+=1:c+=.55;return c*b}(k,j),m=g(d,"text-anchor")??"start",n=function(a,b){let c=[];for(let d of a.slice(0,b).matchAll(/<(\/?)g\b([^>]*)>/gu)){if("/"===d[1]){c.pop();continue}let a=c.at(-1)??{x:0,y:0},b=/translate\(\s*(-?[\d.]+)[ ,]+(-?[\d.]+)\s*\)/u.exec(d[2]);c.push({x:a.x+(b?Number(b[1]):0),y:a.y+(b?Number(b[2]):0)})}return c.at(-1)??{x:0,y:0}}(a,c.index??0),o=h+n.x,p=i+n.y,q="middle"===m?o-l/2:"end"===m?o-l:o;b.push({x:q,y:p-j,width:l,height:1.3*j,text:k})}return b}(j),q=function(a){let b=[];for(let c of a.matchAll(/<g\b([^>]*data-source-edge="([^"]+)"[^>]*)>([\s\S]*?)<\/g>/gu)){let a=c[1],d=c[2],e=c[3],f=g(a,"data-from")??d.split("->")[0],j=g(a,"data-to")??d.split("->")[1],k=/<path\b[^>]*\bd="([^"]+)"/u.exec(e),l=/<polyline\b[^>]*\bpoints="([^"]+)"/u.exec(e);if(k)b.push({id:d,...f?{from:f}:{},...j?{to:j}:{},points:i(k[1])});else if(l){let a=l[1].trim().split(/\s+/u).map(a=>a.split(",").map(Number)).filter(a=>2===a.length&&a.every(Number.isFinite)).map(([a,b])=>({x:a,y:b})),c=[];for(let b=1;b<a.length;b+=1)c.push(...h(a[b-1],a[b]));b.push({id:d,...f?{from:f}:{},...j?{to:j}:{},points:c})}}for(let c of a.matchAll(/<path\b([^>]*data-edge="([^"]+)"[^>]*)\bd="([^"]+)"/gu)){let a=c[2];b.push({id:a,from:a.split("->")[0],to:a.split("->")[1],points:i(c[3])})}return b}(j);for(let a of p)for(let c of((a.x<-2||a.y<-2||a.x+a.width>k+2||a.y+a.height>l+2)&&b.push({code:"figure-text-out-of-bounds",message:`文本「${a.text.slice(0,24)}」越出画布(${Math.round(a.x)},${Math.round(a.y)};画布 ${k}\xd7${l})`}),/[..]{2,}|…/u.test(a.text)&&b.push({code:"figure-label-truncated",message:`图内标签「${a.text.slice(0,24)}」被截断;标签必须按宽度换行,不得用省略号`}),e.ig))if(a.text.includes(c)){b.push({code:"figure-internal-term",message:`图内文字「${a.text.slice(0,24)}」出现系统内部词「${c}」,不得出现在交付图件`});break}for(let a=0;a<o.length;a+=1)for(let c=a+1;c<o.length;c+=1){let d=o[a],e=o[c];d.x+2<e.x+e.width&&e.x+2<d.x+d.width&&d.y+2<e.y+e.height&&e.y+2<d.y+d.height&&b.push({code:"figure-node-overlap",message:`节点「${d.id}」与「${e.id}」矩形重叠`})}for(let a of q)for(let c of a.points){let d=o.find(b=>(function(a,b,c=3){return a.x>b.x+c&&a.x<b.x+b.width-c&&a.y>b.y+c&&a.y<b.y+b.height-c})(c,b)&&b.id!==a.from&&b.id!==a.to);if(d){b.push({code:"figure-edge-crosses-node",message:`关系「${a.id}」穿越节点「${d.id}」`});break}}return[...new Map(b.map(a=>[`${a.code}\u0000${a.message}`,a])).values()]}(r);if(!t.length)return r;s.push(`${c.name}: ${t.slice(0,4).map(a=>a.message).join(";")}`)}catch(a){if("spatial"===c.name||"plan"===c.name)throw a;s.push(`${c.name}: ${a instanceof Error?a.message:String(a)}`)}throw Error(`FIGURE_GEOMETRY_INVALID:${s.slice(0,6).join(";")}`)}function A(a,b=1200){let c=/^<svg\b[^>]*width="(\d+)"[^>]*height="(\d+)"[^>]*>([\s\S]*)<\/svg>$/u.exec(a);if(!c)throw Error("原生图件缺少完整画布尺寸");let d=Number(c[1]),e=Number(c[2]),f=c[3],g=Number(/data-source-offset-y="(\d+)"/u.exec(a)?.[1]??0);if(e<=b)return[a];let h=[...f.matchAll(/<rect\b[^>]*\bx="([\d.-]+)"[^>]*\by="([\d.-]+)"[^>]*\bwidth="([\d.]+)"[^>]*\bheight="([\d.]+)"/gu)].map(a=>({y:Number(a[2]),height:Number(a[4])})),i=[...h,...[...f.matchAll(/transform="rotate\(-90\s+[\d.-]+\s+([\d.-]+)\)"[^>]*><rect\b[^>]*width="([\d.]+)"/gu)].map(a=>({y:Number(a[1])-Number(a[2])/2,height:Number(a[2])})),...[...f.matchAll(/<polygon points="([^"]+)"/gu)].map(a=>{let b=a[1].split(/\s+/u).map(a=>Number(a.split(",")[1]));return{y:Math.min(...b),height:Math.max(...b)-Math.min(...b)}})].map(a=>({...a,y:a.y+g})),j=[...f.matchAll(/data-source-node="[^"]+"><rect\b[^>]*\by="(\d+)"/gu)].map(a=>Number(a[1])+g),k=[...f.matchAll(/data-row-start="(\d+)"/gu)].map(a=>Number(a[1])+g-8),l=[...new Set([...j.flatMap(a=>[a-55,a-45,a-10]),...k])].filter(a=>a>50&&a<e&&!i.some(b=>a>b.y-3&&a<b.y+b.height+3)).sort((a,b)=>a-b),m=[...f.matchAll(/data-resource-start="(\d+)" data-resource-end="(\d+)"/gu)].map(a=>({start:Number(a[1])+g,end:Number(a[2])+g})),n=[0];for(;e-n[n.length-1]>b;){let c=n[n.length-1],d=l.filter(a=>a>c+100&&a<=c+b-50*!!c).at(-1);if(void 0===d)return[a];let e=m.find(a=>a.start<d&&a.end>d&&a.end-a.start<=b-50);if(e&&m.some(a=>a.end<=e.start&&a.end>c)){let a=e.start-8;l.includes(a)&&a>c+100&&(d=a)}n.push(d)}return n.push(e),n.slice(0,-1).map((a,b)=>{let c=n[b+1]-a,e=50*!!b,g=/<title>([\s\S]*?)<\/title>/u.exec(f)?.[1]??"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${d}" height="${c+e}" viewBox="0 0 ${d} ${c+e}" data-source-range="${a}:${n[b+1]}"><rect width="100%" height="100%" fill="white"/><defs><clipPath id="panelClip"><rect x="0" y="${e}" width="${d}" height="${c}"/></clipPath></defs><g clip-path="url(#panelClip)"><g transform="translate(0 ${e-a})">${f}</g></g>${b?`<text x="${d/2}" y="32" text-anchor="middle" font-family="Noto Sans CJK SC, PingFang SC, sans-serif" font-size="19">${g}(续)</text>`:""}</svg>`})}function B(a){if(!/^[A-Za-z0-9_-]+$/u.test(a.documentId))throw Error("图件文档身份无效");let b=new Map;return{renderer:c=>{let d=x(c),e=z(c,{...a,hideCaption:a.hideCaption}),f=(0,r.createHash)("sha256").update(e).digest("hex");if((e.match(/data-source-node=/gu)??[]).length!==c.nodes.length||(e.match(/data-source-edge=/gu)??[]).length!==c.edges.length)throw Error("图件节点或关系渲染不守恒");let g=A(e),h=g.map((h,i)=>{let j=(0,r.createHash)("sha256").update(h).digest("hex"),k=`author-graph-${j}.svg`,l=v().join(a.generatedDir,"assets","figures",k);if(t().mkdirSync(v().dirname(l),{recursive:!0}),t().existsSync(l)){if(t().readFileSync(l,"utf8")!==h)throw Error("既有图件资产与原结构化单元身份不一致")}else{let a=`${l}.${process.pid}.tmp`;t().writeFileSync(a,h),t().renameSync(a,l)}let m=/data-source-range="(\d+):(\d+)"/u.exec(h),n=Number(/data-source-offset-y="(\d+)"/u.exec(e)?.[1]??0),o=m?[...e.matchAll(/data-source-node="([^"]+)"><rect\b[^>]*\by="(\d+)"/gu)].filter(a=>Number(a[2])+n>=Number(m[1])&&Number(a[2])+n<Number(m[2])).map(a=>a[1]):c.nodes.map(a=>a.id);return b.set(`${c.id}:${i}`,{unitId:c.id,sourceHash:d,sourceSvgHash:f,svgHash:j,file:l,nodes:c.nodes.length,edges:c.edges.length,...c.planBaseline?{planBaselineHash:x(c.planBaseline),milestones:c.planBaseline.milestones.length}:{},...g.length>1?{panels:g.length,panelIndex:i,visibleNodeIds:o}:{}}),`/api/documents/generated/${a.documentId}/figure/${k}?projectRoot=${encodeURIComponent(a.projectRoot)}`});return 1===h.length?h[0]:h},receipts:()=>[...b.values()]}}let C=a=>a.nodes.map(a=>({...a,...a.group?{group:String(a.group)}:{},...a.lane?{lane:String(a.lane)}:{}}));function D(a,b){let c=C(a),e=new Map(c.map(a=>[a.id,a])),f=new Map(c.map(a=>[a.id,0]));for(let b of a.edges)f.set(b.to,(f.get(b.to)??0)+1);let g=c.filter(a=>(f.get(a.id)??0)===0).map(a=>a.id),h=new Map;for(let b of a.edges)h.set(b.from,[...h.get(b.from)??[],b.to]);let i=new Map,j=[...g.length?g:[c[0].id]];for(let a of j)i.set(a,0);for(let a=0;a<j.length;a+=1){let b=j[a];for(let a of h.get(b)??[])i.has(a)||(i.set(a,(i.get(b)??0)+1),j.push(a))}let k=Math.max(0,...i.values())+1;for(let a of c)i.has(a.id)||i.set(a.id,k++);let l=new Map,m=(a,b=new Set)=>{if(l.has(a))return l.get(a);if(b.has(a))return 1;b.add(a);let c=(h.get(a)??[]).filter(a=>e.has(a)),d=c.length?c.reduce((a,c)=>a+m(c,b),0):1;return l.set(a,Math.max(1,d)),l.get(a)};for(let a of g.length?g:[c[0].id])m(a);for(let a of c)m(a.id);let n=new Map,o=(a,b,c=new Set)=>{if(c.has(a))return b+1;c.add(a);let d=(h.get(a)??[]).filter(a=>e.has(a));if(!d.length)return n.set(a,b+.5),b+1;let f=b,g=[];for(let a of d)f=o(a,f,c),g.push(n.get(a)??f);return n.set(a,(g[0]+g.at(-1))/2),f},p=0;for(let a of g.length?g:[c[0].id])p=o(a,p);for(let a of c)n.has(a.id)||(p=o(a.id,p));let q=Math.max(1,p),r=[...new Map([...i.values()].map(a=>[a,[]])).entries()];for(let a of c)r.find(([b])=>b===i.get(a.id))?.[1].push(a.id);let s=new Map(c.map(a=>[a.id,d(a.label,11)])),t=Math.max(58,18+19*Math.max(1,...[...s.values()].map(a=>a.length))),u=t+38,v=Math.max(900,100+210*q),x=150+r.length*u+40,z=new Map(c.map(a=>[a.id,{x:50+(n.get(a.id)??0)*210-95,y:140+(i.get(a.id)??0)*u}])),A=a.edges.map((a,b)=>{let c=z.get(a.from),d=z.get(a.to);if(!c||!d)throw Error("树形图关系端点缺失:"+a.from+"→"+a.to);let e=c.x+95,f=c.y+t,g=d.x+95,h=d.y,j=i.get(a.from)===i.get(a.to)?`M${c.x+190},${c.y+t/2} C${c.x+190+35},${c.y+t/2} ${d.x-35},${d.y+t/2} ${d.x},${d.y+t/2}`:`M${e},${f} C${e},${f+26} ${g},${h-26} ${g},${h}`;return`<g data-source-edge="${w(a.from)}->${w(a.to)}" data-edge-index="${b}"><path d="${j}" fill="none" stroke="black" stroke-width="1.5" marker-end="url(#treeArrow)"/>`+(a.label?.trim()?`<text x="${(e+g)/2}" y="${(f+h)/2}" font-size="12" text-anchor="middle">${w(a.label.trim())}</text>`:"")+"</g>"}).join(""),B=c.map(a=>{let b=z.get(a.id),c=s.get(a.id);return`<g data-source-node="${w(a.id)}"><rect x="${b.x}" y="${b.y}" width="190" height="${t}" rx="4" fill="white" stroke="black" stroke-width="1.3"/>`+c.map((a,d)=>`<text x="${b.x+95}" y="${b.y+(t-19*c.length)/2+15+19*d}" font-size="14" text-anchor="middle">${w(a)}</text>`).join("")+"</g>"}).join(""),D=r.map(([a])=>`<g data-row-start="${140+a*u-12}"><line x1="24" y1="${140+a*u-12}" x2="${v-24}" y2="${140+a*u-12}" stroke="#d0d0d0" stroke-width="1"/></g>`).join(""),E=d(a.caption,45),F=y[a.figureSemantics??"org"]??y.org;return`<svg xmlns="http://www.w3.org/2000/svg" width="${v}" height="${x}" viewBox="0 0 ${v} ${x}" data-source-offset-y="0" data-figure-legend="true" role="img">
2
+ <title>${w(a.caption)}</title><desc>${w(JSON.stringify({nodes:a.nodes,edges:a.edges,layout:"tree",semantics:a.figureSemantics??"org",legend:F}))}</desc>
3
+ <defs><marker id="treeArrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="black"/></marker></defs>
4
+ <rect width="100%" height="100%" fill="white"/><g font-family="${w(b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif")}" fill="${b.monoColor?"#000000":"#0f172a"}">
5
+ ${b.hideCaption?"":E.map((a,b)=>`<text x="${v/2}" y="${32+22*b}" text-anchor="middle" font-size="19">${w(a)}</text>`).join("")}
6
+ ${D}${A}${B}</g></svg>`}function E(a,b){let c=C(a),e=[...new Set(c.map(a=>a.group?.trim()).filter(a=>!!a))];if(!e.length){let b=new Map(c.map(a=>[a.id,0]));for(let c of a.edges)b.set(c.to,(b.get(c.to)??0)+1);let d=c.filter(a=>(b.get(a.id)??0)===0).map(a=>a.id).sort(),f=new Map;for(let a of d)f.set(a,0);for(let b=0;b<d.length;b+=1){let c=d[b];for(let b of a.edges.filter(a=>a.from===c))f.has(b.to)||(f.set(b.to,(f.get(c)??0)+1),d.push(b.to))}for(let a of(e=Array.from({length:Math.max(0,...f.values())+1},(a,b)=>`阶段${b+1}`),c))a.group=void 0!==f.get(a.id)?`阶段${(f.get(a.id)??0)+1}`:"阶段1"}let f=new Map(e.map((a,b)=>[a,b])),g=[...new Set(c.map(a=>a.lane?.trim()).filter(a=>!!a))],h=new Map(c.map(a=>[a.id,d(a.label,12)])),i=Math.max(62,20+19*Math.max(1,...[...h.values()].map(a=>a.length))),j=Math.max(900,120+270*e.length),k=new Map,l=new Map,m=new Map,n=150;if(g.length){for(let a of g){let b=new Map;for(let d of c)if(d.lane?.trim()===a){let a=f.get(d.group)??0;b.set(a,(b.get(a)??0)+1)}let d=Math.max(100,Math.max(1,...b.values())*(i+18)+24);l.set(a,n),m.set(a,d),n+=d}for(let a of c){if(!a.lane?.trim())continue;let b=a.lane.trim(),d=f.get(a.group)??0,e=c.filter(a=>a.lane?.trim()===b&&(f.get(a.group)??0)===d).findIndex(b=>b.id===a.id);k.set(a.id,{x:60+270*d+135,y:(l.get(b)??150)+12+e*(i+18)})}}else{let a=new Map;for(let b of c){let c=f.get(b.group)??0,d=a.get(c)??0;k.set(b.id,{x:60+270*c+135,y:162+d*(i+30)}),a.set(c,d+1)}n=150+Math.max(1,...a.values())*(i+30)+24}let o=n+30,p=e.map(a=>`<g data-column="${w(a)}"></g>`).join(""),q=g.map(a=>{let b=l.get(a)??150,c=m.get(a)??100;return`<g data-lane="${w(a)}" data-row-start="${b}"><rect x="14" y="${b+4}" width="36" height="${c-8}" fill="white" stroke="#999"/>${d(a,6).slice(0,3).map((a,c)=>`<text x="39" y="${b+26+18*c}" font-size="12" text-anchor="middle">${w(a)}</text>`).join("")}</g>`}).join(""),r=a.edges.map((a,b)=>{let c,d,e,f=k.get(a.from),g=k.get(a.to);if(!f||!g)throw Error("分层图关系端点缺失:"+a.from+"→"+a.to);if(1>Math.abs(g.x-f.x)){let a=Math.min(j-12,f.x+111+14),b=f.y+i/2,h=g.y+i/2;c=`M${f.x+111},${b} H${a} V${h} H${g.x+111}`,d=Math.min(j-70,a+10),e=(b+h)/2}else{let a=g.x>f.x,b=a?f.x+111:f.x-111,h=a?g.x-111:g.x+111,j=f.y+i/2,k=g.y+i/2,l=a?f.x+135:f.x-135,m=a?g.x-135:g.x+135,n=Math.max(156,g.y-9);c=`M${b},${j} H${l} V${n} H${m} V${k} H${h}`,d=(l+m)/2,e=n-6}return`<g data-source-edge="${w(a.from)}->${w(a.to)}" data-edge-index="${b}"><path d="${c}" fill="none" stroke="black" stroke-width="1.5" marker-end="url(#flowArrow)"/>`+(a.label?.trim()?`<text x="${d}" y="${e}" font-size="12" text-anchor="middle">${w(a.label.trim())}</text>`:"")+"</g>"}).join(""),s=c.map(a=>{let b=k.get(a.id),c=h.get(a.id),d=b.y+Math.max(18,(i-18-19*c.length)/2+15);return`<g data-source-node="${w(a.id)}"><rect x="${b.x-111}" y="${b.y}" width="222" height="${i}" rx="5" fill="white" stroke="black" stroke-width="1.4"/>`+c.map((a,c)=>`<text x="${b.x}" y="${d+19*c}" font-size="14" text-anchor="middle">${w(a)}</text>`).join("")+(a.lane?.trim()?`<text x="${b.x}" y="${b.y+i-8}" font-size="10" text-anchor="middle" fill="#555">${w(a.lane)}</text>`:"")+"</g>"}).join(""),t=d(a.caption,45),u=y[a.figureSemantics??"generic"]??y.generic;return`<svg xmlns="http://www.w3.org/2000/svg" width="${j}" height="${o}" viewBox="0 0 ${j} ${o}" data-source-offset-y="0" data-figure-legend="true" role="img">
7
+ <title>${w(a.caption)}</title><desc>${w(JSON.stringify({nodes:a.nodes,edges:a.edges,layout:"layered",semantics:a.figureSemantics??"generic",legend:u}))}</desc>
8
+ <defs><marker id="flowArrow" markerWidth="9" markerHeight="9" refX="8" refY="4.5" orient="auto"><path d="M0,0 L9,4.5 L0,9 z" fill="black"/></marker></defs>
9
+ <rect width="100%" height="100%" fill="white"/><g font-family="${w(b.fontFamily||"Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif")}" fill="${b.monoColor?"#000000":"#0f172a"}">
10
+ ${b.hideCaption?"":t.map((a,b)=>`<text x="${j/2}" y="${30+22*b}" text-anchor="middle" font-size="19">${w(a)}</text>`).join("")}
11
+ ${p}${q}${r}${s}</g></svg>`}},98459:(a,b,c)=>{c.d(b,{b:()=>o});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(77598),i=c(45408),j=c(745),k=c(19045),l=c(61485),m=c(28013),n=c(73005);function o(a){let b=a.units.map(a=>({unit:a.unit,entityId:a.entityId,sectionIds:a.sectionIds})),c=(0,m.ut)({contract:a.contract,units:b}),d=(0,m.Lz)({units:b,carriers:c});return(a.plan?.sections??[]).filter(b=>!a.scopeSectionIds?.length||a.scopeSectionIds.includes(b.sectionId)).flatMap(a=>a.requiredOutputs.filter(a=>a.applicability?.delivery.originalForm==="required").map(b=>({sectionId:a.sectionId,output:b}))).map(({sectionId:b,output:c})=>{let f=a.units.map((a,b)=>({unit:a,index:b})).filter(d=>d.unit.unit.outputId===c.id&&d.unit.sectionIds[0]===b&&(!a.scopeSectionIds?.length||a.scopeSectionIds.includes(b))),m=1===f.length?f[0]:void 0,o=m?.unit,p={outputId:c.id,obligationId:c.obligationId??"",contractHash:c.originalForm?.hash??"",entityId:o?.entityId??"",...o?.entityVersion?{entityVersion:o.entityVersion}:{},...o?.entityHash?{entityHash:o.entityHash}:{},unitHash:o?(0,j.Fu)(o.unit):"",compositionHash:a.composition.documentHash,status:"unmeasured",checks:[]},q=(a,b,c)=>p.checks.push({id:a,status:b,reason:c});if(c.originalForm&&c.applicability&&(0,k.do)(c.originalForm,c.applicability)||q("current-template","unmeasured","必交原格式缺少与当前冻结来源及适用性绑定的独立审定契约"),m&&o||q("actual-carrier","not-met","原表没有唯一实际载体,缺失或被多个单元重复认领"),m&&o&&c.originalForm){let b=(0,k.O9)({contract:c.originalForm,unit:d.units[m.index]});p.checks.push(...b.checks),p.htmlHash=b.htmlHash;let f=a.composition.deliveryPlacements.units.find(a=>a.entityId===o.entityId);if("figure"===o.unit.kind){let b=(a.figureAssets??[]).filter(a=>a.entityId===o.entityId&&a.entityVersion===o.entityVersion&&a.entityHash===o.entityHash),c=f?.figure?.assetUrls??[],j=f?a.composition.markdown.slice(f.range.start,f.range.end):"",k=(0,i.sX)(o.unit.notes),l=!k||j.includes(k)&&c.every(a=>j.indexOf(k)>j.indexOf(a)),r,s=[];try{let b=d.units[m.index];b.planChart||(r=(0,n.yE)({...b,id:o.entityId,kind:"figure",caption:(b.caption??"").replace(/^图\s*\d+(?:[-—–]\d+)?\s*/u,""),criterionIds:b.criterionIds??[],nodes:b.nodes??[],edges:b.edges??[]},a.figureStyle),s=(0,n.D1)(r))}catch{}let t=void 0===r?void 0:(0,h.createHash)("sha256").update(r).digest("hex"),u=f?.figure&&f.figure.semanticHash===(0,i.CA)(o.unit)&&f.figure.notesHash===(0,i.Zc)(o.unit.notes??[])&&c.length>0&&b.length===c.length&&s.length===b.length&&new Set(c).size===c.length&&new Set(b.map(a=>g().resolve(a.file))).size===b.length&&l&&b.every((b,d)=>c.some(a=>a.includes(g().basename(b.file)))&&g().basename(b.file)===`author-graph-${b.svgHash}.svg`&&((b,c)=>{let d=a.verifiedFigureBytes?a.verifiedFigureBytes.get(g().resolve(b.file)):e().existsSync(b.file)?e().readFileSync(b.file):void 0,f=s[c];return!!d&&void 0!==f&&d.equals(Buffer.from(f))&&(0,h.createHash)("sha256").update(d).digest("hex")===b.svgHash&&b.sourceSvgHash===t})(b,d)&&b.nodes===(o.unit.nodes??[]).length&&b.edges===(o.unit.edges??[]).length)&&(1===b.length||b.every((a,c)=>a.panels===b.length&&a.panelIndex===c));q("composed-original-figure",u?"met":"unmeasured",u?"当前原图语义、说明、实际SVG全部面板及同稿位置相符":o.unit.planChart?"原格式计划图尚不能按当前执行基准完整重建,保留未测":"原图未取得当前语义、说明、全部真实SVG面板及同稿位置的逐字节重建验身"),p.figureAssets=b.map(a=>({svgHash:a.svgHash,sourceSvgHash:a.sourceSvgHash,panelIndex:a.panelIndex,panels:a.panels}))}else f&&b.html&&a.composition.markdown.slice(f.range.start,f.range.end).includes(b.html)?q("composed-original-form","met","当前原表字段、顺序、分组与说明已实际装配到同稿范围"):q("composed-original-form","not-met","实际同稿载体不包含当前受控原表,不能用提交前结构或普通同名表充抵");let j=a.assessments.find(b=>1===b.value.unitRefs.length&&b.value.unitRefs[0].id===o.entityId&&(0,l.O4)(a.reviewStore,b.value,void 0,a.expectedBidCompositionHash,a.plan)&&b.value.originalFormReviews?.some(a=>a.outputId===c.id&&a.contractHash===c.originalForm.hash)),r=j?.value.originalFormReviews?.find(a=>a.outputId===c.id&&a.contractHash===c.originalForm.hash);j&&r?(p.review={assessmentId:j.id,invocationId:j.value.reviewInvocationId,status:r.status,reason:r.reason,evidence:r.evidence},q("independent-filled-form-review",r.status,r.reason)):q("independent-filled-form-review","unmeasured","实际填表尚无当前单元、来源与原格式契约绑定的独立审查")}return p.status=p.checks.some(a=>"not-met"===a.status)?"not-met":p.checks.some(a=>"unmeasured"===a.status)?"unmeasured":"met",p})}}};
@@ -0,0 +1 @@
1
+ "use strict";exports.id=8570,exports.ids=[8570],exports.modules={78570:(a,b,c)=>{c.d(b,{ConstructionEarlyDrafts:()=>x});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(38210),i=c(5468),j=c(88390),k=c(55037),l=c(49303),m=c(6906),n=c(13577),o=c(45532),p=c(45002),q=c(40123),r=c(33074),s=c(60702),t=c(45946),u=c(54050),v=c(85254),w=c(745);class x{constructor(a){this.input=a,this.records=new Map,this.failures=[],this.retries=new Map,this.attempts=new Map,this.closed=!1,this.controller=new AbortController,this.adopting=new Map,this.sectionOfActor=a=>[...this.records.values()].find(b=>b.actorId===a)?.sectionId,this.authorAttempts=a=>{let b=this.contracts.snapshot().find(b=>b.sectionId===a)?.referenceId;if(!b)throw Error("SECTION_ATTEMPT_IDENTITY_REQUIRED");return this.attempts.has(b)||this.attempts.set(b,{used:0}),this.attempts.get(b)},this.adopt=async a=>{if(!this.closed||!a.structurePlan||!a.sectionPlans)throw Error("EARLY_DRAFT_ADOPTION_NOT_SEALED");for(let b of(this.contracts.assertGlobal(a.structurePlan.planHash),a.authority.sectionIds)){let c=[...this.records.values()].find(a=>a.sectionId===b);if(!c||"ready"!==c.status)continue;if(this.adopting.has(b)){await this.adopting.get(b);continue}let d=this.adoptOne(a,c);this.adopting.set(b,d),await d}},this.contracts=new p.G((0,w.Fu)(JSON.parse(JSON.stringify({project:a.project,planningContext:a.planningContext,confirmed:a.confirmed})))),this.unsubscribe=this.contracts.subscribe(()=>this.dispatch())}snapshot(){return structuredClone([...this.records.values()])}save(){e().mkdirSync(this.input.directory,{recursive:!0}),e().writeFileSync(g().join(this.input.directory,"early-drafts.json"),JSON.stringify({runId:this.input.runId,documentId:this.input.documentId,records:this.snapshot(),failures:this.failures,authorAttempts:Object.fromEntries(this.attempts),deliveryApproved:!1},null,2))}dispatch(){let a=!1;for(let b of this.records.values()){let c=this.contracts.snapshot().find(a=>a.referenceId===b.referenceId);"ready"!==b.status||c&&c.contractHash===b.contractHash&&["draft-approved","global-approved"].includes(c.status)&&c.sourceOnlyDraft||(b.status="invalidated",a=!0,this.attempts.delete(b.referenceId))}if(a)try{this.save()}catch(a){this.fatal=a}if(this.closed||this.task||this.fatal)return;for(let[a,b]of[...this.records])(function(a,b,c){if("failed"!==a.status||c>=1||!b||"draft-approved"!==b.status||!b.sourceOnlyDraft)return!1;let d=b.contractHash!==a.contractHash,e=/SECTION_SOURCE_DRAFT_NOT_APPROVED|SECTION_CONTRACT_STALE/u.test(a.error??"");return d||e})(b,this.contracts.snapshot().find(b=>b.referenceId===a),this.retries.get(a)??0)&&(this.retries.set(a,(this.retries.get(a)??0)+1),this.failures.push(b),this.records.delete(a),this.attempts.delete(a));let b=this.contracts.snapshot().find(a=>"draft-approved"===a.status&&a.sourceOnlyDraft&&!this.records.has(a.referenceId)&&(!this.input.scope?.sectionIds?.length||this.input.scope.sectionIds.includes(a.sectionId))),c=this.contracts.currentPlan();if(!b||!c)return;let d={referenceId:b.referenceId,sectionId:b.sectionId,contractHash:b.contractHash,actorId:"early-draft-"+(0,w.Fu)([b.referenceId,b.contractHash,this.retries.get(b.referenceId)??0]).slice(0,20),originalStructure:c,status:"running"};this.records.set(b.referenceId,d),this.task=Promise.resolve().then(async()=>{this.save();try{d.result=await this.write(d,b),this.contracts.assertSourceDraft(c,b.sectionId),d.status="ready"}catch(a){d.status="failed",d.error=a instanceof Error?a.message:String(a),this.attempts.delete(d.referenceId)}this.save()}).catch(a=>{this.fatal=a}).finally(()=>{this.task=void 0,this.dispatch()}),this.task.catch(()=>{})}async seal(){if(this.closed=!0,this.unsubscribe(),this.task&&await this.task,this.fatal)throw this.fatal;this.save()}async cancel(a){if(this.closed=!0,this.unsubscribe(),this.controller.abort(a),this.contracts.cancel(a),this.task&&await this.task,this.fatal)throw this.fatal;this.save()}assertBudget(a){let b=(0,l.En)(this.input.budget);if("report-only"===b.enforcement)return;let c=(0,l.r0)({sections:[a],calls:(this.input.diagnostics.llm.callLog??[]).map(a=>({inputTokens:a.inputTokens,providerAttempts:a.transportActivities?.filter(a=>"not-started"!==a.providerInvocation).length??a.providerAttempts,unknownAttempts:a.transportActivities?.filter(a=>"not-started"!==a.providerInvocation&&!a.usage).length??0,sectionId:a.sectionId??this.sectionOfActor(a.actorId),role:a.kind?.includes("review")?"review":"reasoning"===a.taskKind?"think":"author"}))},{unknownCallUpperBound:b.perSection.maxInputTokens});if((0,l.Ag)(c,b).violations.length)throw Error("EARLY_DRAFT_SHARED_BUDGET_EXHAUSTED")}async write(a,b){let c=this.input,d=a.originalStructure;this.contracts.assertSourceDraft(d,b.sectionId);let e=(0,r.documentOutlineFromStructurePlan)(d,{planningContext:c.planningContext,confirmed:c.confirmed}),f=(0,q.compileContractFromConfirmedChapters)({confirmed:c.confirmed,project:c.project,title:c.title,requirement:c.requirement,runId:c.runId,documentId:c.documentId,outline:e}),i=g().join(c.directory,a.actorId),{store:p}=(0,k.openConstructionWorkspace)({projectRoot:c.projectRoot,directory:i,identity:{projectId:c.projectRoot,documentId:c.documentId,sourceSnapshotId:c.project.snapshotId,contractId:f.id},project:c.project,contract:f,workspace:(0,n.emptyConstructionWorkspace)(f,c.project,"局部批准的提前草稿;尚无全局交付资格"),sourceRunId:c.sourceRunId,sourceBuildId:c.sourceBuildId,evidence:c.evidence}),v=new Map,w=!1,x=AbortSignal.any([this.controller.signal,...c.signal?[c.signal]:[]]),y=(...a)=>(this.assertBudget(b.sectionId),c.caller(...a)),z=(d,e,f)=>(this.assertBudget(b.sectionId),c.jsonCaller(d,e,{...f,actorId:a.actorId,sectionId:b.sectionId}));try{if(await (0,h.p)({store:p,project:c.project,contract:f,buildId:c.buildId,authority:{actorId:a.actorId,sectionIds:[b.sectionId],memberIndices:c.scope?.memberIndices??(0,o.BI)(c.project).map(a=>a.index),canManageSharedResources:!1},clock:{timelineId:`document-run-${c.documentId}`,timeUnit:{unit:"hour",ticksPerUnit:1},horizon:8760},permissions:["read-current","writing"],sourceDraftOnly:!0,sectionContracts:this.contracts,sectionAuthorAttempts:this.authorAttempts,sectionPlans:v,structurePlan:d,planningContext:c.planningContext,confirmed:c.confirmed,tenderResponsePlan:(0,s.buildConstructionTenderResponsePlan)({confirmed:c.confirmed,contract:f,outline:e,planningContext:c.planningContext,bidComposition:c.bidComposition,runId:c.runId}),bidComposition:c.bidComposition,bidCompositionSources:c.bidCompositionSources,generatedDir:c.artifactDir,nodeLogBaseDir:c.artifactDir,runId:c.runId,diagnostics:c.diagnostics,signal:x,evidence:{projectRoot:c.projectRoot,scopeRootNames:[...c.scopeRootNames],skills:c.skills??[],toolNames:[...m.n]},authorizeRead:()=>!0,caller:y,jsonCaller:z,budget:(0,l.En)(c.budget),system:(0,j.gh)({permissions:["read-current","writing"],responsibilityKey:"source-draft",purpose:"writing",structurePlanning:!0})+"\n本次仅起草已经明确获准、无需待定专业决定/工法/生产计算/执行基准的当前节。先 plan_section,读真实来源,再 write_subsection。所有引用仅能是冻结来源 evidence;不能编造专业决定或填写尚未确定的计算。写完调用 finish_draft,遇未就绪依赖用 wait 如实说明。此稿不锁节、不代表正文独审或交付通过。",goal:`按当前局部合同起草 ${b.sectionId};完成后 finish_draft,等待全局通过后正式正文独审`,initialFocus:{purpose:"writing",entityIds:[]},extraTools:[{name:"finish_draft",description:"保留本节完整提前草稿,结束本次起草;不批准正文或交付。",terminal:!0,parameters:{type:"object",properties:{},additionalProperties:!1},invoke:()=>{this.contracts.assertSourceDraft(d,b.sectionId);let c=v.get(b.sectionId);if(!c)throw Error("EARLY_DRAFT_SECTION_PLAN_REQUIRED");let e=(0,u.Z1)(p,a.actorId,[b.sectionId]).map(a=>a.unit),f=(0,t._J)({structurePlan:d,sectionPlan:c,submitted:[],sectionUnits:e,sourceDraftContracts:this.contracts});return f.passed?(w=!0,{data:{draftReady:!0,professionalAccepted:!1,deliveryApproved:!1},finished:!0}):{data:{draftReady:!1,check:f},feedbackRequired:!0}}}]}),!w)throw Error("EARLY_DRAFT_INCOMPLETE");let g=v.get(b.sectionId),i=p.entity(`section-plan:${b.sectionId}`)?.value?.review;return{plan:g,review:i,units:(0,u.Z1)(p,a.actorId,[b.sectionId]).map(a=>a.unit)}}finally{p.close()}}async adoptOne(a,b){let c=this.contracts.snapshot().find(a=>a.referenceId===b.referenceId);if(!c||c.contractHash!==b.contractHash||"global-approved"!==c.status||!c.sourceOnlyDraft){b.status="invalidated",this.save();return}let d=b.result,e=d.review;if(e?.verdict!=="pass"||e.sectionPlanHash!==d.plan.sectionPlanHash||e.planId!==d.plan.planId)throw Error("EARLY_DRAFT_ORIGINAL_PLAN_REVIEW_REQUIRED");let f=(0,v.Av)({structurePlan:a.structurePlan,sectionId:b.sectionId,confirmed:a.confirmed,planningContext:a.planningContext,caller:a.jsonCaller,contracts:this.contracts,originalStructure:b.originalStructure,original:d.plan});if(a.sectionPlans.has(b.sectionId)||(0,u.Z1)(a.store,a.authority.actorId,[b.sectionId]).length)throw Error("EARLY_DRAFT_ADOPTION_TARGET_OCCUPIED");a.sectionPlans.set(b.sectionId,f);let g=(0,i.F)({...a,deferBodyReview:!0,reusedSectionReview:a=>a===b.sectionId?{originalReview:d.review,originalStructureHash:b.originalStructure.planHash,originalSectionPlanHash:d.plan.sectionPlanHash,currentSectionPlanHash:f.sectionPlanHash,localContractHash:b.contractHash,referenceId:b.referenceId,reuse:"same-reviewed-local-contract",newSemanticApproval:!1,bodyReviewRequired:!0}:void 0}),h=g.find(a=>"plan_section"===a.name),j=g.find(a=>"write_subsection"===a.name);if(!h||!j)throw Error("EARLY_DRAFT_ADOPTION_CAPABILITY_REQUIRED");for(let c of(await h.invoke({sectionId:b.sectionId},`early-plan:${b.referenceId}:${f.sectionPlanHash}`),d.units)){let{planHash:d,sectionPlanHash:e,contentContractHash:g,subsectionId:h,sectionIds:i,purpose:k,responsibilityId:l,...m}=c,n=await j.invoke({sectionId:b.sectionId,subsectionId:h,units:[m],reason:"同一运行中已明确批准的相同局部合同草稿转入;正文仍待当前独审"},`early-unit:${b.referenceId}:${c.id}:${f.sectionPlanHash}`);if(n.data?.submitted!==!0)throw Error("EARLY_DRAFT_ADOPTION_REJECTED:"+JSON.stringify(n.data));let o=(0,u.Z1)(a.store,a.authority.actorId,[b.sectionId]).find(a=>a.unit.id===c.id)?.unit,p=a=>{if(!a)return null;let b={...a};for(let a of["planHash","sectionPlanHash","contentContractHash","purpose","responsibilityId","sectionIds"])delete b[a];return b};if((0,w.Fu)(p(o))!==(0,w.Fu)(p(c)))throw Error("EARLY_DRAFT_AUTHORED_VALUE_CHANGED")}let k={referenceId:b.referenceId,contractHash:b.contractHash,originalPlanHash:d.plan.sectionPlanHash,currentPlanHash:f.sectionPlanHash,originalReviewHash:(0,w.Fu)(d.review),authoredUnitsHash:(0,w.Fu)(d.units),bodyReviewRequired:!0};a.onReceipt?.("early-draft-adopted",k),b.status="adopted",b.adoptedBy=a.authority.actorId,this.save()}}}};