@customize-agent/server 4.60.36 → 4.61.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/build-manifest.json +3 -3
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/routes-manifest.json +1 -1
- package/.next/server/chunks/1710.js +1 -0
- package/.next/server/chunks/3074.js +1 -1
- package/.next/server/chunks/3239.js +7 -0
- package/.next/server/chunks/5037.js +6 -6
- package/.next/server/chunks/5763.js +7 -7
- package/.next/server/chunks/9270.js +1 -1
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/api/assets/generated/preview.js.nft.json +1 -1
- package/.next/server/pages/api/assets/generated.js.nft.json +1 -1
- package/.next/server/pages/api/config/embedding/healthCheck.js.nft.json +1 -1
- package/.next/server/pages/api/config/embedding.js.nft.json +1 -1
- package/.next/server/pages/api/config/healthCheck.js.nft.json +1 -1
- package/.next/server/pages/api/config/models.js.nft.json +1 -1
- package/.next/server/pages/api/config/providers/[provider].js.nft.json +1 -1
- package/.next/server/pages/api/config/providers.js.nft.json +1 -1
- package/.next/server/pages/api/config/reset.js.nft.json +1 -1
- package/.next/server/pages/api/config/web-access.js.nft.json +1 -1
- package/.next/server/pages/api/documents/canvas/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/delivery-review.js.nft.json +1 -1
- package/.next/server/pages/api/documents/export.js +1 -1
- package/.next/server/pages/api/documents/export.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate/preview.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/events.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/figure/[name].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/instruction.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/messages.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/nodes/[nodeId].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/nodes.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/pause.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/preview.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/confirm.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair/[rid]/rollback.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/repair.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/report.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id]/resume-generate.js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated/[id].js.nft.json +1 -1
- package/.next/server/pages/api/documents/generated.js.nft.json +1 -1
- package/.next/server/pages/api/health.js.nft.json +1 -1
- package/.next/server/pages/api/jobs/[id].js.nft.json +1 -1
- package/.next/server/pages/api/kb/categories.js.nft.json +1 -1
- package/.next/server/pages/api/kb/duplicates.js.nft.json +1 -1
- package/.next/server/pages/api/kb/features.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/detail.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/export.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/open.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/preview-pdf-page.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/search.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files/source-preview.js.nft.json +1 -1
- package/.next/server/pages/api/kb/files.js.nft.json +1 -1
- package/.next/server/pages/api/kb/ignore.js.nft.json +1 -1
- package/.next/server/pages/api/kb/material-groups.js.nft.json +1 -1
- package/.next/server/pages/api/kb/operations.js.nft.json +1 -1
- package/.next/server/pages/api/kb/reindex.js.nft.json +1 -1
- package/.next/server/pages/api/kb/stats.js.nft.json +1 -1
- package/.next/server/pages/api/kb/tags.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload/complete.js.nft.json +1 -1
- package/.next/server/pages/api/kb/upload.js.nft.json +1 -1
- package/.next/server/pages/api/prompt/chat.js.nft.json +1 -1
- package/.next/server/pages/api/skills/[id].js.nft.json +1 -1
- package/.next/server/pages/api/skills/validate.js.nft.json +1 -1
- package/.next/server/pages/api/skills.js.nft.json +1 -1
- package/.next/server/pages/api/system/data-health.js.nft.json +1 -1
- package/.next/server/pages/api/system/reset.js.nft.json +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/generation/[id].html +1 -1
- package/.next/server/pages/generation.html +1 -1
- package/.next/server/pages/jobs.html +1 -1
- package/.next/server/pages/knowledge/file-detail.html +1 -1
- package/.next/server/pages/knowledge/files.html +1 -1
- package/.next/server/pages/knowledge/manage.html +1 -1
- package/.next/server/pages/knowledge/source-preview.html +1 -1
- package/.next/server/pages/knowledge.html +1 -1
- package/.next/server/pages/models.html +1 -1
- package/.next/server/pages/settings.html +1 -1
- package/.next/server/pages/skills/[id]/edit.html +1 -1
- package/.next/server/pages/skills/[id].html +1 -1
- package/.next/server/pages/skills/new.html +1 -1
- package/.next/server/pages/skills.html +1 -1
- package/.next/server/pages-manifest.json +32 -32
- package/.next/static/{e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2 → 317fea8baac62973504b896cd4a4949fbe758b61932a9d7bd265b7891a57e0ff}/_buildManifest.js +1 -1
- package/.next/static/chunks/pages/generation/[id]-83db154d46fd7aeb.js +1 -0
- package/package.json +2 -2
- package/.next/server/chunks/9283.js +0 -7
- package/.next/static/chunks/pages/generation/[id]-1f97e47ce545bd11.js +0 -1
- /package/.next/static/{e5c2576dc1ab66edac22c9534755509cc2e1354bd840260e3154f2c95cf8bbf2 → 317fea8baac62973504b896cd4a4949fbe758b61932a9d7bd265b7891a57e0ff}/_ssgManifest.js +0 -0
|
@@ -28,4 +28,4 @@ pre{white-space:pre-wrap;font-family:${a.bodyFontFamily};font-size:${a.bodyCss};
|
|
|
28
28
|
@media print{body{-webkit-print-color-adjust:exact;print-color-adjust:exact}a{text-decoration:none;color:${b?"#000":"#111827"}}}
|
|
29
29
|
`}(e,d)}</style></head><body>${f}</body></html>`}(a,g,c,e),d,f)}async function bg(a,b,d,e=[]){let{chromium:f}=await Promise.resolve().then(c.bind(c,83237)),g=[{label:"playwright-bundled-chromium",options:{headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]}},{label:"system-chrome-channel",options:{channel:"chrome",headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]}},{label:"system-msedge-channel",options:{channel:"msedge",headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]}},...(function(){let a=[process.env.PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH,process.env.CHROME_PATH].filter(Boolean),b=U.homedir();return[...new Set([...a,..."darwin"===process.platform?["/Applications/Google Chrome.app/Contents/MacOS/Google Chrome","/Applications/Chromium.app/Contents/MacOS/Chromium","/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge","/Applications/Brave Browser.app/Contents/MacOS/Brave Browser",k.join(b,"Applications/Google Chrome.app/Contents/MacOS/Google Chrome"),k.join(b,"Applications/Chromium.app/Contents/MacOS/Chromium")]:"win32"===process.platform?[k.join(process.env.PROGRAMFILES||"C:\\Program Files","Google/Chrome/Application/chrome.exe"),k.join(process.env["PROGRAMFILES(X86)"]||"C:\\Program Files (x86)","Google/Chrome/Application/chrome.exe"),k.join(process.env.LOCALAPPDATA||"","Google/Chrome/Application/chrome.exe"),k.join(process.env.PROGRAMFILES||"C:\\Program Files","Microsoft/Edge/Application/msedge.exe")]:["/usr/bin/google-chrome","/usr/bin/google-chrome-stable","/usr/bin/chromium","/usr/bin/chromium-browser","/snap/bin/chromium","/usr/bin/microsoft-edge"]].filter(a=>a&&i.existsSync(a)))]})().map(a=>({label:a,options:{executablePath:a,headless:!0,args:["--no-sandbox","--disable-setuid-sandbox"]}}))],h=[];for(let c of g)try{let g=await f.launch(c.options);try{let c=await g.newPage({locale:"zh-CN"});if(await c.setContent(a,{waitUntil:"load"}),e.length){let a=e.map(a=>({contractHash:a.contractHash,...function(a){return{caption:a.caption,rows:[...a.headerRows,...a.rows,...a.notes.map(b=>({cells:[{text:b,colSpan:a.columnWidths?.length??Math.max(1,...a.headerRows.map(a=>a.cells.reduce((a,b)=>a+b.colSpan,0))),rowSpan:1}]}))].map(a=>a.cells.map(a=>({text:a.text,colSpan:a.colSpan,rowSpan:a.rowSpan})))}}(a.projection)}));if(await c.evaluate(a=>{let b=[...document.querySelectorAll("table[data-tender-original-form]")],c=a=>String(a??"").replace(/\s+/gu,"");return b.length!==a.length||a.some((a,d)=>{let e=b[d],f=e.getBoundingClientRect();return e.dataset.tenderOriginalForm!==a.contractHash||c(e.caption?.textContent??"")!==c(a.caption)||f.width<=0||f.height<=0||e.rows.length!==a.rows.length||a.rows.some((a,b)=>{let d=[...e.rows[b].cells];return d.length!==a.length||a.some((a,b)=>{let e=d[b],f=e.getBoundingClientRect();return c(e.textContent)!==c(a.text)||e.colSpan!==a.colSpan||e.rowSpan!==a.rowSpan||f.width<=0||f.height<=0||e.scrollWidth>e.clientWidth+2||e.scrollHeight>e.clientHeight+2})})})},a))throw Error("ORIGINAL_FORM_RENDER_INVALID:PDF实际DOM的原格式表头、合并、固定行、说明或可见布局不符")}await c.evaluate(async()=>{await document.fonts.ready}),await c.waitForFunction(()=>Array.from(document.images).every(a=>a.complete),void 0,{timeout:1e4}).catch(()=>void 0),await c.emulateMedia({media:"print"});let f=aN(b),h=d?.headersFooters==="forbidden"?{displayHeaderFooter:!1}:{displayHeaderFooter:!0,headerTemplate:"<div></div>",footerTemplate:`<div style="font-family:${f.fontFamily};font-size:10.5pt;line-height:12pt;width:100%;text-align:center;color:#666;">第 <span class="pageNumber"></span> 页 / 共 <span class="totalPages"></span> 页</div>`},i=async()=>Buffer.from(await c.pdf({format:f.paper,printBackground:!0,preferCSSPageSize:!0,outline:!0,tagged:!0,margin:{top:f.marginTop,right:f.marginRight,bottom:f.marginBottom,left:f.marginLeft},...h})),j=await i();for(let a=0;a<3;a+=1){let a=await (0,Y.GA)(j);if(!a)throw Error("PDF实际页树/章节书签无法读取,不能编造目录页码");if(!await c.evaluate(a=>{let b=!1;for(let c of document.querySelectorAll("[data-toc-title]")){let d=c.dataset.tocTitle,e=void 0===a[d]?"":String(a[d]);c.textContent!==e&&(c.textContent=e,b=!0)}return b},a))return j;j=await i()}throw Error("PDF目录页码实际排版校验未收敛")}finally{await g.close()}}catch(a){if(a instanceof Error&&a.message.startsWith("ORIGINAL_FORM_RENDER_"))throw a;h.push(`${c.label}: ${a instanceof Error?a.message:String(a)}`)}throw Error(h.join("\n"))}function bh(a,b,c,d,e=[],f,g,h,i){if(a)try{let j=a.draft,k=j?.reviewMetadata?.diagnostics?.quality,l=a.completedAt?Math.max(0,a.completedAt-a.createdAt):Math.max(0,Date.now()-a.createdAt),n=(a.draft?.exportGate?.manualReviewIssues||[]).map(a=>({...a,level:a.level??"warning"})),o=[...e,...n],p=o.length>0?function(a,b,c){let d=a.map((a,c)=>({index:c+1,category:a.category?ab[a.category]:"其他",location:function(a,b){if(a.chapterId){let c=b?.find(b=>b.id===a.chapterId);if(c?.title)return a.sectionTitle?`${c.title} / ${a.sectionTitle}`:c.title}if(a.sectionTitle)return a.sectionTitle;let c=a.message.match(/^(\d{1,2}(?:\.\d{1,2}){1,3}[\s\u00a0]*[^\s::]{2,24})[^::]{0,24}[::]/u);return c?c[1].trim():"全文"}(a,b),problem:a.message,action:a.suggestion||"人工核对后修订正文;修订必须同步导出源(doc.json.markdown)并复核守恒,或基于检查点续修重试。",repairPath:a.repairability?ac[a.repairability]:"自动修复链已执行(残留待人工定位)",detectorId:a.provenance?.detectorId}));return{suspended:!0,generatedAt:Date.now(),total:d.length,repairChainSummary:"已保存逐项问题与依据;实际自动处理范围以本轮执行回执为准",items:d,...{}}}(o,j?.chapters):void 0,q={format:b,exportPurpose:h,reviewReport:i,exportedAt:Date.now(),durationMs:l,ruleSummary:(j?.promptRules?.executionSummary||[]).slice(0,12),repairedCount:k?.repairedCount,blockingCount:k?.blockingCount,gatePassed:j?.exportGate?.passed===!0&&0===e.length&&(d?.blockerCount??0)===0,...a.runId&&j?.reviewMetadata?.contractQuality?{sourceIdentity:{runId:a.runId,documentHash:j.reviewMetadata.contractQuality.documentHash,contractId:j.reviewMetadata.contractQuality.contractId,buildId:(0,S.S)()?.sourceFingerprint}}:{},...g?{artifact:{sha256:(0,m.createHash)("sha256").update(g.content).digest("hex"),bytes:Buffer.byteLength(g.content)},renderDurationMs:Math.max(0,Date.now()-g.startedAt)}:{},healthAlerts:j?.reviewMetadata?.telemetry?.healthAlerts,repairHeat:j?.reviewMetadata?.telemetry?.repairHeat,...d?{renderAudit:d}:{},...p?{gateIssueCount:e.length,gateChecklist:p}:{},...f?{realPages:f}:{}};a.runId&&(0,x.tv)((0,X.Gl)(c),`export-receipt-${(0,m.createHash)("sha256").update(JSON.stringify(q)).digest("hex")}.json`,q,a.runId);let r=(0,X.v7)(a.id,c),s=[...r?.exportReports||a.exportReports||[],q].slice(-20);(0,X.a6)(a.id,{exportReports:s},c)}catch(a){console.warn(`[export] 渲染审计报告归档失败(不影响本次导出,但该次导出不会进历史对照):${a instanceof Error?a.message:String(a)}`)}}async function bi(a,b){let c,d,e=Date.now();if("POST"!==a.method&&"GET"!==a.method)return b.status(405).json({error:"Method not allowed"});if("GET"===a.method&&("string"!=typeof a.query?.reviewReportId||Object.values(a.query).some(a=>"string"!=typeof a)))return b.status(400).json({error:"REVIEW_REPORT_REQUEST_REQUIRED"});let f="GET"===a.method?a.query:a.body;if(!f||"object"!=typeof f||Array.isArray(f))return b.status(400).json({error:"INVALID_EXPORT_REQUEST"});let g=new Set(["documentId","title","markdown","format","exportPurpose","reviewReportId","reviewRunId","useClientMarkdown","exportGate","wordTemplatePath","projectRoot"]);if(Object.keys(f).some(a=>!g.has(a)))return b.status(400).json({error:"INVALID_EXPORT_OPTION",message:"存在不受支持的导出参数,请使用明确的 exportPurpose。"});if(void 0!==f.exportPurpose&&"review"!==f.exportPurpose&&"delivery"!==f.exportPurpose)return b.status(400).json({error:"INVALID_EXPORT_PURPOSE"});let h=f.exportPurpose??"review",i=f.projectRoot||(0,Z.aY)(),p=f.documentId?(0,X.v7)(f.documentId,i):null;if(f.documentId&&(!p||p.id!==f.documentId))return b.status(404).json({error:"Document not found"});if(f.reviewReportId){if(!/^[a-f0-9]{64}$/u.test(f.reviewReportId))return b.status(400).json({error:"INVALID_REVIEW_REPORT_ID"});let a=function(a,b,c){if(!/^[a-f0-9]{64}$/u.test(b))throw Error("INVALID_REVIEW_REPORT_ID");let d=(0,x.HM)(a,`review-export-${b}.json`,c);if(!j().existsSync(d))return;let e=j().readFileSync(d);if(ae(e)!==b)throw Error("REVIEW_REPORT_IDENTITY_MISMATCH");let f=JSON.parse(e.toString("utf8"));if(f.runId!==(c??null))throw Error("REVIEW_REPORT_RUN_MISMATCH");return f}((0,X.Gl)(i),f.reviewReportId,f.reviewRunId);return a&&a.documentId===(p?.id??null)?(b.setHeader("Content-Type","application/json; charset=utf-8"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${aq(a.title)}_审阅问题报告_${a.body.sha256.slice(0,12)}.json`)}`),b.status(200).send(JSON.stringify(a))):b.status(404).json({error:"REVIEW_REPORT_NOT_FOUND"})}let r=p?.draft?.bidComposition,t=f.title||p?.title||"document",u=(0,_.b2)(r?.formatRules);u&&r?.identityMarksForbidden&&(u.anonymize=!0);let B=function(a,b){if(void 0!==b)return b;if(a?.editedMarkdown!==void 0)return a.editedMarkdown;let c=a?.markdown||a?.draft?.markdown;return c?.trim()?c:(a?.checkpointChapters??[]).filter(a=>(0,Q.a1)(a.content??"")).map(a=>a.content).join("\n\n")}(p,f.useClientMarkdown&&"string"==typeof f.markdown?f.markdown:p?void 0:f.markdown),D=B;if("review"!==h||f.useClientMarkdown||p?.editedMarkdown||(B=function(a,b,c,d){if(!a?.runId||!a.id||!d.includes("```mermaid"))return d;let e=l().dirname((0,x.HM)(b,"document-model-author.json",a.runId));if(!j().existsSync(e))return d;let f=j().readdirSync(e).filter(a=>/^document-model-checkpoint-\d+\.json$/u.test(a)).sort().at(-1);if(!f)return d;let g=JSON.parse(j().readFileSync(l().join(e,f),"utf8"));if(!g||"object"!=typeof g||!g.tasks||"object"!=typeof g.tasks)throw Error("当前审阅结构化稿无法读取,不能把图源假装渲染成功");let h=(0,q.rZ)({generatedDir:b,projectRoot:c,documentId:a.id}),i=d;for(let a of Object.values(g.tasks))for(let b of a.current?.output?.units??[]){if("figure"!==b.kind)continue;let a={...b,heading:void 0},c=function(a,b=4,c,d,e){let f=function(a,b){let c=a=>a?.trim().replace(/^\d+(?:[..]\d+)*[\s、..]+/u,"").trim(),d=c(a.heading),e="paragraph"===a.kind?void 0:a.caption.replace(/^(?:表|图)\s*\d+(?:[.-—-]\d+)*\s*[::.、]?\s*/u,"").trim();return d&&d!==c(b)&&d!==e?d:void 0}(a,void 0),g=f?`${"#".repeat(b)} ${f}
|
|
30
30
|
|
|
31
|
-
`:"";if("paragraph"===a.kind)return g+a.text;if("table"===a.kind)return g+[a.caption,"",`| ${a.columns.map(a=>v(a.title+(a.unit?`(${a.unit})`:""))).join(" | ")} |`,`| ${a.columns.map(()=>"---").join(" | ")} |`,...a.rows.map(b=>`| ${a.columns.map(a=>v(b.cells[a.key])).join(" | ")} |`)].join("\n");let h=new Map(a.nodes.map((a,b)=>[a.id,`n${b}`]));return g+[a.caption,"","```mermaid","flowchart TD",...a.nodes.map(a=>` ${h.get(a.id)}[${w(a.label)}]`),...a.edges.map(a=>` ${h.get(a.from)} -->${a.label?`|${w(a.label)}|`:""} ${h.get(a.to)}`),"```"].join("\n")}(a),d=c.indexOf("```mermaid");if(d<0)continue;let e=c.slice(d);if(!i.includes(e))continue;let f=h.renderer(a),g=("string"==typeof f?[f]:f).map((b,c)=>`![${a.caption.replaceAll("[","").replaceAll("]","")}${c?"(续)":""}](${b})`).join("\n\n");i=i.replace(e,g)}let k=h.receipts();if(k.length){let c=(0,m.createHash)("sha256").update(d).digest("hex"),e=(0,m.createHash)("sha256").update(i).digest("hex"),g=(0,m.createHash)("sha256").update(JSON.stringify([c,e,f])).digest("hex");(0,x.tv)(b,`review-figure-assets-${g}.json`,{runId:a.runId,documentId:a.id,modelFile:f,sourceHash:c,renderedHash:e,renderedFromExistingUnitsOnly:!0,receipts:k},a.runId)}return i}(p,(0,X.Gl)(i),i,B)),!(0,Q.a1)(B))return b.status(422).json({error:"EMPTY_EXPORT_BODY",message:"当前没有已写入的正文,不能生成空白审阅文件。"});let E=p?.reviewMetadata?.contractQuality??p?.draft?.reviewMetadata?.contractQuality,F=p?.draft?.markdown||p?.markdown||"",R=be(B,F===D?B:F),{markdown:T,audit:U}=R,V=f.format;if(!V||!["markdown","html","pdf","docx"].includes(V))return b.status(400).json({error:"INVALID_EXPORT_FORMAT",message:"请选择有效的导出格式。"});R.issues.length>0&&b.setHeader(an.contentIssues,encodeURIComponent(JSON.stringify(R.issues.slice(0,20))));let W=ap(U);W&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(W)));let ab=p?.draft?.exportGate||f.exportGate,ac=(ab?.blockingIssues||[]).map(a=>({level:"error",...a})),ai=ab?.passed===!1&&0===ac.length?[{level:"error",message:"导出门禁未通过:存在未完成的检查项"}]:[],ak=[...ac,...ai],al=[p?.draft?.exportGate?.deliveryFingerprint,p?.draft?.exportGate?.textFingerprint].find(a=>"string"==typeof a&&a.length>0),am=(0,$.c6)(B),ao=al?al===am?"matched":"mismatch":"absent";"matched"!==ao&&b.setHeader(an.gateBinding,ao);let ar="mismatch"===ao?[{level:"error",severity:"blocker",message:"将交付的正文与门禁判定时的正文**不是同一份**(收口后被编辑/替换):放行依据对不上这份文本,本份正文尚未取得交付资格。",suggestion:"若改动是有意的:重新生成或重跑校验后再导出;若只是留档:请用审阅导出。"}]:[],as=E&&(E.documentHash!==(0,A.Sl)(p?.draft?.chapters??[],B)||!(0,A.R3)(E))?[{level:"error",severity:"blocker",message:E.documentHash!==(0,A.Sl)(p?.draft?.chapters??[],B)?"正文已经变更,冻结合同的七维评价回执属于旧版本,须重新评价后交付。":"当前协议的七维职责核验及专业档位尚未达标,历史回执和客户端门禁声明不能替代。"}]:[],at=p&&p.draft?.exportGate?.passed===!0&&"absent"!==ao||ak.length||ar.length||as.length?[]:[{level:"error",severity:"blocker",message:"未取得服务端对本份正文的已通过评价及绑定回执;本次仅可作审阅导出,客户端声明不能替代评价。"}],au=[...ak,...ar,...as,...E?(0,A.ie)(E):[],...at,...(function(a,b,c){if(!a?.runId)return["交付导出缺少当前生成运行身份"];let d=ag(b,a.runId,"run-inputs.json").data,e=ag(b,a.runId,"document-contract.json").data,f=ag(b,a.runId,"project-model.json").data,g=ag(b,a.runId,"contract-quality.json").data,h=ag(b,a.runId,"construction-source-coverage.json").data,i=a.reviewMetadata?.contractQuality??a.draft?.reviewMetadata?.contractQuality,j=(0,A.Sl)(a.draft?.chapters??[],c),k=[];if(i&&i.documentHash===j&&(0,A.R3)(i)&&g&&JSON.stringify(g)===JSON.stringify(i)||k.push("缺少本份正文的当前实际冻结合同七维评价回执"),e&&f&&i&&i.contractId===e.id&&i.projectSnapshotId===f.snapshotId||k.push("评价回执与冻结合同、项目来源身份未绑定"),e){e.version!==s.GM&&k.push("冻结合同属于历史协议,须按当前写作及评价协议重新生成");let{id:a,...b}=e;a!==ae(JSON.stringify(b))&&k.push("冻结合同原始内容与身份不一致")}if(f){let{snapshotId:a,...b}=f;a!==ae(JSON.stringify(b))&&k.push("项目来源快照原始内容与身份不一致")}d&&d.runId===a.runId&&d.documentId===a.id&&Array.isArray(d.sources)&&d.sources.length||k.push("缺少本次运行的完整来源输入绑定");let l=af(h);if(l?.version!=="construction-source-coverage-ledger-v1")k.push("缺少本份正文的来源覆盖账(construction-source-coverage.json);未测不等于没问题,交付不就绪");else{let b=Array.isArray(l.sources)?l.sources.map(a=>String(af(a)?.filePath??"")):[],c=Array.isArray(l.missingOpinions)?l.missingOpinions.map(String):[],d=Array.isArray(l.omissions)?l.omissions:[],e=f?Object.keys(af(f.sources)??{}).length:b.length;"measured"!==l.status&&k.push("来源覆盖账未达就绪:"+(Array.isArray(l.reasons)?l.reasons.join(";"):"未测")),l.documentHash!==j&&k.push("来源覆盖账绑定的是另一版正文(账与同稿不同源)"),(b.length!==e||c.length||d.length)&&k.push("来源覆盖账没有覆盖全部冻结来源(或有未处置的未引用来源/漏项)");let g=a.draft?.exportGate?.checklist?.filter(a=>"source-coverage-ledger"===a.key);g&&1===g.length&&!0===g[0].passed||k.push("导出清单里没有通过的本份来源覆盖账检查项")}if(i){let a=Array.isArray(i.batches)?i.batches:[];a.length?(a.some(a=>"executed"!==a.status)&&k.push("七维回执存在未执行的审查批次(档位绑定旧版本或缺审)"),a.some(a=>!a.id.trim())&&k.push("审查批次缺少 review-invocation 身份")):k.push("七维回执没有独立审查批次(review-invocation);未审正文不得交付"),(!i.reviewAssessments||i.reviewAssessments.applied<1)&&k.push("七维回执没有可采纳的当前审查档位(review-assessment 为空或全部过期)")}return k})(p,(0,X.Gl)(i),B).map(a=>({level:"error",severity:"blocker",message:a}))],aw=0===au.length&&0===U.blockers.length,ax=(a,d,e)=>{let f=function(a){let{record:b}=a,c=ag(a.generatedDir,b?.runId,"run-inputs.json"),d=ag(a.generatedDir,b?.runId,"document-contract.json").data,e=ag(a.generatedDir,b?.runId,"document-model-final.json"),f=e.data?e:ag(a.generatedDir,b?.runId,"document-model-author.json"),g=f.data,h=Array.isArray(c.data?.sources)?c.data.sources:void 0,i=ah(d?.chapters??b?.draft?.chapters),j=(b?.draft?.chapters??b?.checkpointChapters??[]).filter(a=>(0,Q.a1)(a.content??"")),k=ah(j).filter(b=>j.some(c=>c.id===b.id&&a.markdown.includes(c.content))),l=i.length>0&&k.length===j.length,m=b?.reviewMetadata?.contractQuality??b?.draft?.reviewMetadata?.contractQuality,n=af(c.data?.buildIdentity),o=!!(h&&c.sha256&&c.data?.runId===b?.runId&&c.data?.documentId===b?.id);return{version:1,purpose:a.purpose,capturedAt:Date.now(),documentId:b?.id??null,runId:b?.runId??null,title:a.title,format:a.format??"unmeasured",body:{sha256:ae(a.markdown),bytes:Buffer.byteLength(a.markdown),chars:a.markdown.length},identity:{exportBuildId:a.buildId??null,generationBuildId:"string"==typeof n?.sourceFingerprint?n.sourceFingerprint:null,runInputsSha256:c.sha256??null,sourceSnapshotSha256:h?ae(JSON.stringify(h)):null,sourceCount:h?.length??null,status:o?"bound":"unmeasured"},generation:{status:b?.status??"editor",error:b?.error??null,warnings:b?.warningIssues??[]},chapters:{status:l?"measured":"unmeasured",expected:i,written:k,missing:l?i.filter(a=>!k.some(b=>b.id===a.id)):[],...!l?{reason:"缺少完整章计划,或编辑后正文无法与原章节快照逐字对位;不把无法对位冒充已证缺章"}:{}},acceptance:{passed:a.acceptancePassed,issues:[...a.issues]},sourceCompleteness:function(a,b,c,d){let e=ag(b,a?.runId,"construction-source-coverage.json"),f=e.data,g=[];if(a?.runId&&d?.runId===a.runId&&d.documentId===a.id||g.push("来源覆盖账缺少本运行及本稿的输入身份绑定"),f?.version!==ad.YU)g.push("缺少当前来源覆盖账(construction-source-coverage.json)");else{f.documentHash!==(0,A.Sl)(a?.draft?.chapters??[],c)&&g.push("来源覆盖账属于另一版正文,不能显示为当前证据");let b=a=>{if(!Array.isArray(a)||!a.length)return;let b=a.map(af);if(b.some(a=>"string"!=typeof a?.filePath||!a.filePath||"string"!=typeof a.sha256||!a.sha256))return;let c=b.map(a=>[a.filePath,a.sha256]);if(new Set(c.map(([a])=>a)).size===c.length)return c.sort(([a],[b])=>a.localeCompare(b))},e=b(d?.sources),h=b(f.sources);e&&h&&JSON.stringify(e)===JSON.stringify(h)||g.push("来源覆盖账与本次冻结输入的来源文件/SHA不一致"),(!["measured","unmeasured"].includes(String(f.status))||["unreferenced","opinions","missingOpinions","conflicts","omissions","reasons"].some(a=>!Array.isArray(f[a])))&&g.push("当前来源覆盖账字段不完整,不能把旧审查摘要当作来源覆盖测量")}let h=0===g.length;return{status:h?"bound":"unmeasured",issues:g,checklist:h?a?.draft?.exportGate?.checklist?.find(a=>"source-coverage-ledger"===a.key)??null:null,receipt:h?f:null,receiptSha256:h?e.sha256:null}}(b,a.generatedDir,a.markdown,c.data),quality:{status:m?m.documentHash===(0,A.Sl)(b?.draft?.chapters??[],a.markdown)?"current":"historical":"unmeasured",receipt:m??null},rework:{status:g?"recorded":"unmeasured",modelSha256:f.sha256??null,authorPassSealed:"boolean"==typeof g?.authorPassSealed?g.authorPassSealed:null,c0ReferenceChars:"number"==typeof g?.c0ReferenceChars?g.c0ReferenceChars:null,ledger:g?.rework??null,revisionCount:Array.isArray(g?.revisions)?g.revisions.length:null,userRevisionCount:b?.revisionLog?.length??0},render:a.render??{status:"pending"}}}({record:p,generatedDir:(0,X.Gl)(i),markdown:B,title:t,purpose:h,format:V,buildId:(0,S.S)()?.sourceFingerprint,acceptancePassed:aw&&0===au.length&&0===U.blockers.length,issues:[...au.map(a=>a.message),...R.issues],render:{status:a,...d?{error:d}:{},audit:ap(U),...void 0!==e?{artifact:{sha256:(0,m.createHash)("sha256").update(e).digest("hex"),bytes:Buffer.byteLength(e)}}:{}}});c={...function(a,b){let c=ae(JSON.stringify(b)),d=(0,x.tv)(a,`review-export-${c}.json`,b,b.runId??void 0);return{id:c,sha256:d.sha256,bodySha256:b.body.sha256}}((0,X.Gl)(i),f),...p?.runId?{runId:p.runId}:{}},b.setHeader(an.issuesReport,encodeURIComponent(JSON.stringify(c))),b.setHeader(an.bodySha256,f.body.sha256),b.setHeader(an.exportPurpose,h),b.setHeader(an.gatePassed,f.acceptance.passed?"true":"false")};try{let a=await G(p,i,(0,X.Gl)(i),B);U.verifiedFigures=a.bytes,d=a.receipts,U.verifiedFigures.size&&U.notices.push({code:"figure-inline",message:`原生图件验身:${U.verifiedFigures.size}份实际字节及所引源版本已核,本次渲染固定采用这些字节;不是专业资格。`})}catch(c){let a=c instanceof Error?c.message:String(c);return au.push({level:"error",severity:"blocker",message:a}),ax("failed",a),b.setHeader(an.notDeliverable,"true"),b.status(422).json({error:"CONSTRUCTION_FIGURE_IDENTITY_INVALID",message:a})}try{if(U.verifiedDelivery=function(a,b,c,d,e={}){if(!a?.runId)return{bodyMarkdown:d,appendixMarkdown:""};let f=(0,x.HM)(c,"document-delivery-placements.json",a.runId),g=a.reviewMetadata?.contractQuality??a.draft?.reviewMetadata?.contractQuality,h=g&&g.deliveryPlacements;if(!j().existsSync(f)){let b=(0,x.HM)(c,"planning-context.json",a.runId),e=j().existsSync(b)?JSON.parse(j().readFileSync(b,"utf8")):void 0,f=e?.outputObligations?.some(a=>a.applicability?.delivery?.location==="technical-appendix"||a.applicability?.delivery?.originalForm==="required");return(h?.units.some(a=>"technical-appendix"===a.location||a.binding?.originalFormContractHash)||f)&&P("本运行交付位置原始回执缺失,原格式或技术附表不得借删除回执绕过"),{bodyMarkdown:d,appendixMarkdown:""}}try{let g=JSON.parse(j().readFileSync(f,"utf8")),i=(0,H.loadConstructionFrozenInputs)(b,a.runId,a.id,void 0,{requirePlanningContext:!0}),k=i.planningContext,m=(0,A.Sl)(a.draft?.chapters??[],d),n={projectId:b,documentId:a.id,sourceSnapshotId:i.project.snapshotId,contractId:i.contract.id};(g.runId!==a.runId||g.documentId!==a.id||g.workspaceId!==(0,z.qX)(n)||g.planningContextHash!==(0,z.Fu)(k)||g.documentHash!==m)&&P("交付位置回执与运行、冻结规划、合同工作库或本份全文不符"),h&&(0,z.Fu)(h)===(0,z.Fu)(g.placements)||P("交付位置原始回执与当前合同七维回执不同源");let o=i.tenderResponsePlan;o||P("交付位置回执缺少本运行冻结响应计划");let p=i.runStart.tenderResponsePlanHash;for(let a of(p&&(0,z.Fu)(o)===p||P("冻结响应计划与本运行起始身份不符"),o.sections.flatMap(a=>a.requiredOutputs))){if(!a.applicability&&!a.obligationId)continue;let b=k.outputObligations.find(b=>b.id===a.obligationId);b&&(0,J.oY)(b)&&(0,z.Fu)(a.applicability)===(0,z.Fu)(b.applicability)&&(0,z.Fu)(a.originalForm??null)===(0,z.Fu)(b.originalForm??null)||P("响应计划输出的适用性或原格式不属于当前冻结义务")}for(let a of k.outputObligations.filter(J.oY))("technical-appendix"===a.applicability.delivery.location||"required"===a.applicability.delivery.originalForm)&&1!==o.sections.flatMap(a=>a.requiredOutputs).filter(b=>b.obligationId===a.id).length&&P("原格式或技术附表义务没有唯一的当前输出承接");let q=(0,I.rL)(o),r=l().join(c,"construction","workflow-state.sqlite"),s=j().realpathSync(r),t=j().realpathSync(c),u=l().relative(t,s);return(!u||u.startsWith("..")||l().isAbsolute(u))&&P("交付源工作库不在本项目生成根内"),y.l.inspectEntityHeads(s,n,[],(a,b)=>{let c=i.runStart.scope?.sectionIds,f=b.entityHeads("writing-unit").filter(a=>!a.deleted&&(0,C.iC)(a)).filter(a=>!c?.length||(0,C.iC)(a).sectionIds?.some(a=>c.includes(a))),h=f.map(a=>{let b=(0,C.iC)(a);return{entityId:a.id,entityVersion:a.version,entityHash:(0,z.Fu)(a),...b.originalFormContractHash?{originalFormContractHash:b.originalFormContractHash}:{},..."figure"===b.kind?{figure:{semanticHash:(0,K.CA)(b),notesHash:(0,K.Zc)(b.notes??[])}}:{}}}),j=(0,K.$H)(d,g.placements,{outputPlacements:q,units:h});j.valid||P(j.issues.join(";"));let k=f.map(a=>(0,C.iC)(a));for(let a of k){let b=(0,I.B$)(a,o,a.sectionIds);b.length&&P("实际单元的交付位置/原格式已失效:"+b.join(";"))}(0,C.YK)({units:k.map(a=>({...a,references:a.references.filter(a=>"evidence"!==a.kind),assertions:a.assertions.filter(a=>"evidence"!==a.reference.kind)})),currentEntityVersion:b.currentEntityVersion,certificateValid:b.certificateCurrent,evidenceExists:()=>!1}).some(a=>a.needsRecheck)&&P("交付所引决定或计算证书已失效");let l=f.map((a,b)=>({entityId:a.id,unit:k[b],sectionIds:k[b].sectionIds??[]})),n=(0,M.ut)({contract:i.contract,units:l}),p=(0,M.Lz)({units:l,carriers:n}),r={entity:a=>{let c=b.currentEntityVersion(a);return void 0===c?void 0:b.entityVersion(a,c)},certificate:b.certificate},s=b.entityHeads("review-assessment").filter(a=>!a.deleted).flatMap(a=>{let{value:b}=(0,N.fv)(a.value);return b?[{id:a.id,value:b}]:[]}).filter(a=>(0,N.O4)(r,a.value,void 0,(0,N.IQ)(i.bidComposition,i.bidCompositionSources),o)&&(0,N.O0)(r,a.value)),t=(0,O.b)({contract:i.contract,plan:o,units:f.map((a,b)=>({...l[b],responsibilityId:String(a.value?.responsibilityId??""),purpose:String(a.value?.purpose??""),sectionIds:[...l[b].sectionIds],entityVersion:a.version,entityHash:(0,z.Fu)(a)})),composition:{markdown:d,documentHash:m,deliveryPlacements:g.placements},assessments:s,reviewStore:r,figureAssets:e.figureAssets,verifiedFigureBytes:e.verifiedFigureBytes,figureStyle:{monoColor:i.bidComposition?.formatRules.monoColor,fontFamily:i.bidComposition?.formatRules.bodyFont||i.bidComposition?.formatRules.fontFamily},expectedBidCompositionHash:(0,N.IQ)(i.bidComposition,i.bidCompositionSources),scopeSectionIds:c}).find(a=>"met"!==a.status);t&&P("原格式实际载体未通过当前结构与独审核验:"+t.checks.filter(a=>"met"!==a.status).map(a=>a.reason).join(";"));let u=[];for(let a=0;a<f.length;a++){let b=f[a],c=k[a],e=(0,I.nI)(c,o,c.sectionIds);if(!e?.originalForm||e.applicability?.delivery.originalForm!=="required"||"figure"===e.originalForm.kind)continue;let h=(0,L.O9)({contract:e.originalForm,unit:p.units[a]});"met"===h.status&&h.html&&h.projection||P("原格式实际产物不能按已审完整结构渲染");let i=g.placements.units.find(a=>a.entityId===b.id).range,j=d.slice(i.start,i.end);2!==j.split(h.html).length&&P("原格式实际HTML与当前单元、发布编号或冻结母版不同源"),u.push({contractHash:e.originalForm.hash,unitEntityId:b.id,html:h.html,projection:h.projection})}return u.sort((a,b)=>g.placements.units.find(b=>b.entityId===a.unitEntityId).range.start-g.placements.units.find(a=>a.entityId===b.unitEntityId).range.start),{bodyMarkdown:j.bodyMarkdown,appendixMarkdown:j.appendixMarkdown,placements:g.placements,outputPlacements:q,originalForms:u}})}catch(a){if(a instanceof Error&&a.message.startsWith("CONSTRUCTION_DELIVERY_IDENTITY_INVALID"))throw a;return P(a instanceof Error?a.message:String(a))}}(p,i,(0,X.Gl)(i),B,{figureAssets:d,verifiedFigureBytes:U.verifiedFigures}),U.verifiedDelivery.placements&&T!==B)throw Error("CONSTRUCTION_DELIVERY_IDENTITY_INVALID:导出预处理改变了已冻结位置的全文,请先重新装配核验")}catch(c){let a=c instanceof Error?c.message:String(c);return au.push({level:"error",severity:"blocker",message:a}),ax("failed",a),b.setHeader(an.notDeliverable,"true"),b.status(422).json({error:"CONSTRUCTION_DELIVERY_IDENTITY_INVALID",message:a})}if((0,aa.Kf)(r)){let a=await (0,aa.m3)();au.push(...a({markdown:B,spec:r,...U.verifiedDelivery?.placements?{deliveryPlacements:U.verifiedDelivery.placements,outputPlacements:U.verifiedDelivery.outputPlacements}:{},isVerifiedDiagram:a=>{let b=av(a,i,U.verifiedFigures);return!!(b&&U.verifiedFigures?.has(k.resolve(b)))}}))}if(aw=0===au.length&&0===U.blockers.length,ax("pending"),"delivery"===h&&U.blockers.length>0)return ax("failed",U.blockers.map(a=>a.message).join(";")),b.status(422).json({error:"EXPORT_SOURCE_STRUCTURAL_DEFECT",message:`导出源存在结构性缺陷,已按纯渲染模式阻断(不再补造表头):${U.blockers.slice(0,3).map(a=>a.message).join(";")}`,issues:U.blockers.slice(0,20)});if(!aw&&"delivery"===h)return ax("failed","当前正文尚未通过交付验收"),b.status(422).json({error:"EXPORT_GATE_BLOCKED",message:`导出门禁未通过(${au.length} 项阻断),文档未达交付标准,已阻止导出。请先使用审阅导出供专业人员核对,交付导出须通过本份正文的验收。`,issues:au.slice(0,20)});b.setHeader(an.gatePassed,aw?"true":"false"),b.setHeader(an.notDeliverable,"review"===h?"true":"false"),aw||(b.setHeader(an.gateIssues,encodeURIComponent(JSON.stringify(au.map(a=>a.message).slice(0,20)))),b.setHeader(an.gateIssueCount,String(au.length)));let ay="review"===h?function(a){let b=a.lastIndexOf("."),c=b>0?a.slice(0,b):a;return c.endsWith("_审阅稿")?a:b>0?`${c}_审阅稿${a.slice(b)}`:`${a}_审阅稿`}(aq(t)):aq(t),az=a=>{let c=function(a,b,c="enforce"){let d=b?.pageMin,e=b?.pageLimit;if("informational"===c)return{status:"informational",passed:!0,reason:"本轮按专业内容验收,真实页数仅供后续人工排版参考",pages:a??null,min:d??null,max:e??null};if(void 0===d&&void 0===e)return{status:"not-applicable",passed:!0,reason:"本轮没有页数上下限义务",pages:a??null,min:null,max:null};if(void 0!==d&&(!Number.isInteger(d)||d<=0)||void 0!==e&&(!Number.isInteger(e)||e<=0)||void 0!==d&&void 0!==e&&d>e)return{status:"unmeasured",passed:!1,reason:"冻结的页数义务不完整或上下限冲突,须回到合同编译处理",pages:a??null,min:d??null,max:e??null};if(void 0===a||!Number.isInteger(a)||a<=0)return{status:"unmeasured",passed:!1,reason:"实际渲染页数未完成测量,不能以字数或估算页数代替",pages:null,min:d??null,max:e??null};let f=(void 0===d||a>=d)&&(void 0===e||a<=e);return{status:f?"met":"not-met",passed:f,reason:f?`实际${a}页满足页数义务`:`实际${a}页未满足${void 0===d?"":`不少于${d}页`}${void 0!==d&&void 0!==e?"、":""}${void 0===e?"":`不超过${e}页`}`,pages:a,min:d??null,max:e??null}}(a,r?.formatRules,"informational"),d=r?.formatRules.pageLimit;if(d&&a&&a>d){let e=r?.formatRules.pageEvidence?.filter(a=>"max"===a.kind&&a.value===d),f=e?.length&&e.every(a=>"recommendation"===a.status)?"来源篇幅建议":"尚未核定适用范围的篇幅候选";b.setHeader(an.pageLimit,encodeURIComponent(`${f}:当前${a}页,参考${d}页;${c.reason}`))}};try{if("markdown"===V){let a=aD(T,i,U),d=ap(U);return d&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(d))),b.setHeader(an.figureInline,encodeURIComponent(JSON.stringify({inlined:a.report.inlined,failed:a.report.failed.map(a=>`${a.name}:${a.reason}`).slice(0,20)}))),ax("succeeded",void 0,a.markdown),bh(p,V,i,d||W,au,void 0,{content:a.markdown,startedAt:e},h,c),b.setHeader("Content-Type","text/markdown; charset=utf-8"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${ay}.md`)}`),b.status(200).send(a.markdown)}if("docx"===V){let a=U.blockers.length,d=await a_(t,T,u,"review"===h?void 0:f.wordTemplatePath,i,U,r?.formatRules,!1,"review"===h),g=d.buffer;if(await aU(g,U.verifiedDelivery?.originalForms??[],u,U.verifiedDelivery?.outputPlacements?.some(a=>a.originalFormContractHash)?T:void 0),d.imageReceipt.embedded!==d.imageReceipt.expected||d.imageReceipt.layoutIssues?.length){let a=d.imageReceipt.layoutIssues?.join(";")??`DOCX图件未完整进包:应有${d.imageReceipt.expected}处,实际${d.imageReceipt.embedded}处;不能以文字占位代替图件交付`;if(au.push({level:"error",severity:"blocker",message:a}),"delivery"===h)return ax("failed",a),b.status(422).json({error:"EXPORT_FIGURE_NOT_CONSERVED",message:a});b.setHeader(an.gatePassed,"false"),b.setHeader(an.notDeliverable,"true"),b.setHeader(an.gateIssues,encodeURIComponent(JSON.stringify(au.map(a=>a.message).slice(0,20)))),b.setHeader(an.gateIssueCount,String(au.length))}d.templateWarning&&(b.setHeader(an.templateWarning,encodeURIComponent(d.templateWarning)),console.error(`[export] ${d.templateWarning}`));let j=ap(U);if(j&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(j))),"delivery"===h&&U.blockers.length>a){let c=U.blockers.slice(a);return ax("failed",c.map(a=>a.message).join(";")),b.status(422).json({error:"EXPORT_RENDER_NOT_PURE",message:`docx 渲染阶段存在未声明的正文改动,已按纯渲染模式阻断:${c.slice(0,3).map(a=>a.message).join(";")}`,issues:c.slice(0,20)})}let k=await (0,Y.Dx)(g).catch(a=>({unavailableReason:`渲染器异常:${a instanceof Error?a.message.split("\n")[0]:String(a)}`})),l=void 0!==k.pages&&null!==k.pages?{pages:k.pages,renderer:k.renderer||"unknown"}:{unavailableReason:k.unavailableReason||"未知原因"};return az(k.pages),ax("succeeded",void 0,g),bh(p,V,i,j||W,au,l,{content:g,startedAt:e},h,c),b.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${ay}.docx`)}`),b.status(200).send(g)}let d=await bf(t,T,u,i,r?.formatRules.monoColor===!0,U);"review"===h&&(d=function(a){let b=j().readFileSync(o()).toString("base64"),c=`<style>@font-face{font-family:"${n}";src:url(data:font/otf;base64,${b}) format("opentype");font-weight:400;font-style:normal;}body,body *{font-family:"${n}",sans-serif!important;}</style>`;if(!a.includes("</head>"))throw Error("审阅HTML缺少文档头,无法可靠嵌入中文字体");return a.replace("</head>",`${c}</head>`)}(d),U.notices.push({code:"review-font-fallback",message:"审阅HTML/PDF嵌入Noto Sans CJK SC,保证跨环境中文可读;字体替代未认定为指定投标字体达标"}));let g=ap(U);if(g&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(g))),"html"===V)return ax("succeeded",void 0,d),bh(p,V,i,g||W,au,void 0,{content:d,startedAt:e},h,c),b.setHeader("Content-Type","text/html; charset=utf-8"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${ay}.html`)}`),b.status(200).send(d);try{let a=await bg(d,u,r?.formatRules,U.verifiedDelivery?.originalForms),f=await (0,Y.kN)(a);return az(f),ax("succeeded",void 0,a),bh(p,V,i,g||W,au,f?{pages:f,renderer:"chromium-pdf-page-tree"}:{unavailableReason:"PDF页树解析失败,实际页数未完成验收"},{content:a,startedAt:e},h,c),b.setHeader("Content-Type","application/pdf"),f&&b.setHeader(an.pdfPageCount,String(f)),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${ay}.pdf`)}`),b.status(200).send(a)}catch(c){if(ax("failed",c instanceof Error?c.message:String(c)),c instanceof Error&&c.message.startsWith("ORIGINAL_FORM_RENDER_"))return b.status(422).json({error:c.message.split(":")[0],message:c.message});return(0,aj.wF)({level:"error",source:"api/documents/export",functionName:"pdfExportChromium",error:c,req:a,meta:{fallback:"system-browser-attempted"}}),b.status(500).json({error:"PDF_RENDER_FAILED",message:"PDF 渲染失败:未找到或无法启动可用的 Chrome/Chromium/Edge。请安装 Chrome,或设置 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH 后重试。"})}}catch(a){if(ax("failed",a instanceof Error?a.message:String(a)),a instanceof Error&&a.message.startsWith("ORIGINAL_FORM_RENDER_"))return b.status(422).json({error:a.message.split(":")[0],message:a.message});return b.status(500).json({error:"EXPORT_RENDER_FAILED",message:"渲染失败,独立审阅报告已保留。"})}}let bj={inlineLocalImages:ax,inlineMarkdownFigures:aD,createInlineImageResolver:aw,resolveLocalImagePath:av,rasterizeMarkdownSvgFigures:aR,buildDocxInternal:a1,createExportRenderAudit:ao,exportRenderAuditReport:ap,canonicalExportText:a9,exportConservationDiff:function(a,b){return ba(a9(a),a9(b))},diffCanonicalText:ba,docxVisibleText:bb,canonicalDocxText:bc,docxStageConservationDiff:bd,prepareExportMarkdown:be,stripInlineMarkdown:aH,enhanceTocHtml:a4,buildExportHtml:bf,renderPdfBuffer:bg,resolveExportStyle:aN,buildDocx:a_,markdownToDocxXml:aZ,validateExportMarkdown:a8,isTableCaptionLine:aV,DOCX_TOC_FIELD_PLACEHOLDER:aW,verifyOriginalFormDocxPackage:aU},bk=(0,ak.j)("api/documents/export",bi);var bl=c(68970),bm=c(50296);let bn=(0,h.M)(d,"default"),bo=(0,h.M)(d,"config"),bp=new g.PagesAPIRouteModule({definition:{kind:f.A.PAGES_API,page:"/api/documents/export",pathname:"/api/documents/export",bundlePath:"",filename:""},userland:d,distDir:".next",relativeProjectDir:""});async function bq(a,b,c){let d=await bp.prepare(a,b,{srcPage:"/api/documents/export"});if(!d){b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve());return}let{query:f,params:g,prerenderManifest:h,routerServerContext:i}=d;try{let c=a.method||"GET",d=(0,bl.getTracer)(),e=d.getActiveScopeSpan(),j=bp.instrumentationOnRequestError.bind(bp),k=async e=>bp.render(a,b,{query:{...f,...g},params:g,allowedRevalidateHeaderKeys:[],multiZoneDraftMode:!1,trustHostHeader:!1,previewProps:h.preview,propagateError:!1,dev:bp.isDev,page:"/api/documents/export",internalRevalidate:null==i?void 0:i.revalidate,onError:(...b)=>j(a,...b)}).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let f=d.getRootSpanAttributes();if(!f)return;if(f.get("next.span_type")!==bm.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${f.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let g=f.get("next.route");if(g){let a=`${c} ${g}`;e.setAttributes({"next.route":g,"http.route":g,"next.span_name":a}),e.updateName(a)}else e.updateName(`${c} ${a.url}`)});e?await k(e):await d.withPropagatedContext(a.headers,()=>d.trace(bm.BaseServerSpan.handleRequest,{spanName:`${c} ${a.url}`,kind:bl.SpanKind.SERVER,attributes:{"http.method":c,"http.target":a.url}},k))}catch(a){if(bp.isDev)throw a;(0,e.sendError)(b,500,"Internal Server Error")}finally{null==c.waitUntil||c.waitUntil.call(c,Promise.resolve())}}},56766:(a,b,c)=>{c.d(b,{Dx:()=>t,GA:()=>s,kN:()=>r});var d=c(19898),e=c(31421),f=c(73024),g=c.n(f),h=c(48161),i=c.n(h),j=c(76760),k=c.n(j),l=c(73136),m=c(57975),n=c(88194),o=c.n(n);let p=(0,m.promisify)(e.execFile);async function q(a,b=!1,c=!1){let e;if(a.length)try{if(e=await (0,d.loadPdfDocument)(a),!Number.isInteger(e.pageCount)||e.pageCount<=0)return;let f=[];if(b)for(let a=0;a<e.pageCount;a+=1){let b=await e.getPage(a);try{f.push(await b.getText())}finally{await b.close()}}let g=new Map,h=a=>{for(let b of a)void 0!==b.page&&Number.isInteger(b.page)&&b.page>0&&b.page<=e.pageCount&&g.set(b.title,[...g.get(b.title)??[],b.page]),b.children.length&&h(b.children)};return c&&h(await e.getOutline()),{pages:e.pageCount,text:f.join(""),...c?{headingPages:Object.fromEntries([...g].filter(([,a])=>1===a.length).map(([a,b])=>[a,b[0]]))}:{}}}catch{return}finally{await e?.close()}}async function r(a){return(await q(a))?.pages}async function s(a){return(await q(a,!1,!0))?.headingPages}async function t(a,b={}){let c,d,e;if(!a||0===a.length)return{unavailableReason:"docx 为空"};try{let b=await o().loadAsync(a),d=await b.file("word/document.xml")?.async("string");if(!d)throw Error("正文缺席");c=[...d.matchAll(/<w:t(?:\s[^>]*)?>([\s\S]*?)<\/w:t>/gu)].map(a=>a[1]).join("")}catch{return{unavailableReason:"DOCX正文无法解析,不能验证真实渲染页数"}}let f=async a=>{let e=await q(a,!0,!0);if(!e)return;let f=function(a,b){let c=new Map,d=new Map;for(let b of a.match(/\p{Script=Han}/gu)??[])c.set(b,(c.get(b)??0)+1);let e=[...c.values()].reduce((a,b)=>a+b,0);if(e<20)return null;for(let a of b.match(/\p{Script=Han}/gu)??[])d.set(a,(d.get(a)??0)+1);return[...c].reduce((a,[b,c])=>a+Math.min(c,d.get(b)??0),0)/e}(c,e.text);if(null!==f&&f<.98)throw Error(`中文文字渲染未保留(覆盖率${(100*f).toFixed(1)}%),请核查渲染器中文字体;不能将缺字版式计为合格页数`);return d=e.headingPages,await b.onRenderedPdf?.(a),e.pages},h=g().mkdtempSync(k().join(i().tmpdir(),"real-pages-")),j={...process.env};if("darwin"===process.platform&&!j.FONTCONFIG_FILE){let a=["/System/Library/Fonts","/System/Library/Fonts/Supplemental","/Library/Fonts"].filter(a=>g().existsSync(a));if(a.length){let b=k().join(h,"fonts.conf"),c=a=>a.replace(/&/gu,"&").replace(/</gu,"<").replace(/>/gu,">");g().writeFileSync(b,`<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><fontconfig>${a.map(a=>`<dir>${c(a)}</dir>`).join("")}<cachedir>${c(k().join(h,"font-cache"))}</cachedir><alias><family>SimSun</family><prefer><family>Songti SC</family></prefer></alias><alias><family>宋体</family><prefer><family>Songti SC</family></prefer></alias></fontconfig>`),j.FONTCONFIG_FILE=b}}let m=k().join(h,"document.docx");g().writeFileSync(m,a);try{for(let a of function(){let a=[],b=process.env.CUSTOMIZE_DOCX_RENDERER;if(b){let c=g().existsSync(b.trim())?[b.trim()]:b.trim().split(/\s+/u);a.push({name:`env:${c[0]}`,command:c[0],args:c.slice(1)})}for(let b of["soffice","libreoffice"])a.push({name:b,command:b,args:[]});return a}()){let c,i=k().join(h,`out-${a.name.replace(/[^\w.-]/gu,"_")}`);g().mkdirSync(i,{recursive:!0});let n=a=>a.replace(/\{in\}/gu,m).replace(/\{out\}/gu,i).replace(/\{outfile\}/gu,k().join(i,"document.pdf")),o=a.args.length>0?a.args.map(n):[`-env:UserInstallation=${(0,l.pathToFileURL)(k().join(i,"profile")).href}`,"--headless","--convert-to","pdf","--outdir",i,m];try{await p(a.command,o,{timeout:b.timeoutMs??12e4,env:j})}catch(c){let b=c.code;if("ENOENT"===b)continue;e=`${a.name}:${c instanceof Error?c.message.split("\n")[0]:String(c)}`;continue}let q=k().join(i,"document.pdf");if(!g().existsSync(q)){let b,c=g().readdirSync(i).filter(a=>a.toLowerCase().endsWith(".pdf"));if(0===c.length){e=`${a.name}没有产生PDF`;continue}try{b=1===c.length?await f(g().readFileSync(k().join(i,c[0]))):void 0}catch(a){e=a instanceof Error?a.message:String(a);continue}if(void 0!==b)return{pages:b,renderer:a.name,headingPages:d};e=c.length>1?`${a.name}产生多个PDF,无法确认对应文档`:`${a.name}的PDF页树解析失败`;continue}try{c=await f(g().readFileSync(q))}catch(a){e=a instanceof Error?a.message:String(a);continue}if(void 0!==c)return{pages:c,renderer:a.name,headingPages:d};e=`${a.name}的PDF页树解析失败`}return{unavailableReason:e?`渲染器失败(${e})`:"未配置外部渲染器(CUSTOMIZE_DOCX_RENDERER 或 PATH 中的 soffice/libreoffice)——真页数待真渲染"}}finally{g().rmSync(h,{recursive:!0,force:!0})}}},57975:a=>{a.exports=require("node:util")},73024:a=>{a.exports=require("node:fs")},73136:a=>{a.exports=require("node:url")},75600:a=>{a.exports=require("next/dist/compiled/next-server/pages-api.runtime.prod.js")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},83142:a=>{a.exports=import("marked")},83237:a=>{a.exports=import("playwright")},88194:a=>{a.exports=require("jszip")},95393:a=>{a.exports=require("@customize-agent/llm")},96770:a=>{a.exports=require("@customize-agent/runtime")}};var b=require("../../../webpack-api-runtime.js");b.C(a);var c=b.X(0,[9705,5763,3074,702,9522,8459],()=>b(b.s=55540));module.exports=c})();
|
|
31
|
+
`:"";if("paragraph"===a.kind)return g+a.text;if("table"===a.kind)return g+[a.caption,"",`| ${a.columns.map(a=>v(a.title+(a.unit?`(${a.unit})`:""))).join(" | ")} |`,`| ${a.columns.map(()=>"---").join(" | ")} |`,...a.rows.map(b=>`| ${a.columns.map(a=>v(b.cells[a.key])).join(" | ")} |`)].join("\n");let h=new Map(a.nodes.map((a,b)=>[a.id,`n${b}`]));return g+[a.caption,"","```mermaid","flowchart TD",...a.nodes.map(a=>` ${h.get(a.id)}[${w(a.label)}]`),...a.edges.map(a=>` ${h.get(a.from)} -->${a.label?`|${w(a.label)}|`:""} ${h.get(a.to)}`),"```"].join("\n")}(a),d=c.indexOf("```mermaid");if(d<0)continue;let e=c.slice(d);if(!i.includes(e))continue;let f=h.renderer(a),g=("string"==typeof f?[f]:f).map((b,c)=>`![${a.caption.replaceAll("[","").replaceAll("]","")}${c?"(续)":""}](${b})`).join("\n\n");i=i.replace(e,g)}let k=h.receipts();if(k.length){let c=(0,m.createHash)("sha256").update(d).digest("hex"),e=(0,m.createHash)("sha256").update(i).digest("hex"),g=(0,m.createHash)("sha256").update(JSON.stringify([c,e,f])).digest("hex");(0,x.tv)(b,`review-figure-assets-${g}.json`,{runId:a.runId,documentId:a.id,modelFile:f,sourceHash:c,renderedHash:e,renderedFromExistingUnitsOnly:!0,receipts:k},a.runId)}return i}(p,(0,X.Gl)(i),i,B)),!(0,Q.a1)(B))return b.status(422).json({error:"EMPTY_EXPORT_BODY",message:"当前没有已写入的正文,不能生成空白审阅文件。"});let E=p?.reviewMetadata?.contractQuality??p?.draft?.reviewMetadata?.contractQuality,F=p?.draft?.markdown||p?.markdown||"",R=be(B,F===D?B:F),{markdown:T,audit:U}=R,V=f.format;if(!V||!["markdown","html","pdf","docx"].includes(V))return b.status(400).json({error:"INVALID_EXPORT_FORMAT",message:"请选择有效的导出格式。"});R.issues.length>0&&b.setHeader(an.contentIssues,encodeURIComponent(JSON.stringify(R.issues.slice(0,20))));let W=ap(U);W&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(W)));let ab=p?.draft?.exportGate||f.exportGate,ac=(ab?.blockingIssues||[]).map(a=>({level:"error",...a})),ai=ab?.passed===!1&&0===ac.length?[{level:"error",message:"导出门禁未通过:存在未完成的检查项"}]:[],ak=[...ac,...ai],al=[p?.draft?.exportGate?.deliveryFingerprint,p?.draft?.exportGate?.textFingerprint].find(a=>"string"==typeof a&&a.length>0),am=(0,$.c6)(B),ao=al?al===am?"matched":"mismatch":"absent";"matched"!==ao&&b.setHeader(an.gateBinding,ao);let ar="mismatch"===ao?[{level:"error",severity:"blocker",message:"将交付的正文与门禁判定时的正文**不是同一份**(收口后被编辑/替换):放行依据对不上这份文本,本份正文尚未取得交付资格。",suggestion:"若改动是有意的:重新生成或重跑校验后再导出;若只是留档:请用审阅导出。"}]:[],as=E&&(E.documentHash!==(0,A.Sl)(p?.draft?.chapters??[],B)||!(0,A.pT)(E))?[{level:"error",severity:"blocker",message:E.documentHash!==(0,A.Sl)(p?.draft?.chapters??[],B)?"正文已经变更,冻结合同的七维评价回执属于旧版本,须重新评价后交付。":"当前协议回执不属于当前正文,历史回执和客户端门禁声明不能替代。"}]:[],at=E?(0,A.ie)(E):[],au=p&&p.draft?.exportGate?.passed===!0&&"absent"!==ao||ak.length||ar.length||as.length?[]:[{level:"error",severity:"blocker",message:"未取得服务端对本份正文的已通过评价及绑定回执;本次仅可作审阅导出,客户端声明不能替代评价。"}],aw=[...ak,...ar,...as,...au,...(function(a,b,c){if(!a?.runId)return["交付导出缺少当前生成运行身份"];let d=ag(b,a.runId,"run-inputs.json").data,e=ag(b,a.runId,"document-contract.json").data,f=ag(b,a.runId,"project-model.json").data,g=ag(b,a.runId,"contract-quality.json").data,h=ag(b,a.runId,"construction-source-coverage.json").data,i=a.reviewMetadata?.contractQuality??a.draft?.reviewMetadata?.contractQuality,j=(0,A.Sl)(a.draft?.chapters??[],c),k=[];if(i&&i.documentHash===j&&(0,A.pT)(i)&&g&&JSON.stringify(g)===JSON.stringify(i)||k.push("缺少本份正文的当前实际冻结合同评价回执"),e&&f&&i&&i.contractId===e.id&&i.projectSnapshotId===f.snapshotId||k.push("评价回执与冻结合同、项目来源身份未绑定"),e){e.version!==s.GM&&k.push("冻结合同属于历史协议,须按当前写作及评价协议重新生成");let{id:a,...b}=e;a!==ae(JSON.stringify(b))&&k.push("冻结合同原始内容与身份不一致")}if(f){let{snapshotId:a,...b}=f;a!==ae(JSON.stringify(b))&&k.push("项目来源快照原始内容与身份不一致")}d&&d.runId===a.runId&&d.documentId===a.id&&Array.isArray(d.sources)&&d.sources.length||k.push("缺少本次运行的完整来源输入绑定");let l=af(h);if(l?.version!=="construction-source-coverage-ledger-v1")k.push("缺少本份正文的来源覆盖账(construction-source-coverage.json);未测不等于没问题,交付不就绪");else{let b=Array.isArray(l.sources)?l.sources.map(a=>String(af(a)?.filePath??"")):[],c=f?Object.keys(af(f.sources)??{}).length:b.length;l.documentHash!==j&&k.push("来源覆盖账绑定的是另一版正文(账与同稿不同源)"),b.length!==c&&k.push("来源覆盖账没有覆盖全部冻结来源");let d=a.draft?.exportGate?.checklist?.filter(a=>"source-coverage-ledger"===a.key);d&&1===d.length&&!0===d[0].passed||k.push("导出清单里没有通过的本份来源覆盖账检查项")}if(i){let a=Array.isArray(i.batches)?i.batches:[];a.length?(a.some(a=>"executed"!==a.status)&&k.push("七维回执存在未执行的审查批次(档位绑定旧版本或缺审)"),a.some(a=>!a.id.trim())&&k.push("审查批次缺少 review-invocation 身份")):k.push("七维回执没有独立审查批次(review-invocation);未审正文不得交付"),(!i.reviewAssessments||i.reviewAssessments.applied<1)&&k.push("七维回执没有可采纳的当前审查档位(review-assessment 为空或全部过期)")}return k})(p,(0,X.Gl)(i),B).map(a=>({level:"error",severity:"blocker",message:a}))];at.length&&U.notices.push(...at.map(a=>({code:"semantic-pending",message:a.message})));let ax=0===aw.length&&0===U.blockers.length,ay=(a,d,e)=>{let f=function(a){let{record:b}=a,c=ag(a.generatedDir,b?.runId,"run-inputs.json"),d=ag(a.generatedDir,b?.runId,"document-contract.json").data,e=ag(a.generatedDir,b?.runId,"document-model-final.json"),f=e.data?e:ag(a.generatedDir,b?.runId,"document-model-author.json"),g=f.data,h=Array.isArray(c.data?.sources)?c.data.sources:void 0,i=ah(d?.chapters??b?.draft?.chapters),j=(b?.draft?.chapters??b?.checkpointChapters??[]).filter(a=>(0,Q.a1)(a.content??"")),k=ah(j).filter(b=>j.some(c=>c.id===b.id&&a.markdown.includes(c.content))),l=i.length>0&&k.length===j.length,m=b?.reviewMetadata?.contractQuality??b?.draft?.reviewMetadata?.contractQuality,n=af(c.data?.buildIdentity),o=!!(h&&c.sha256&&c.data?.runId===b?.runId&&c.data?.documentId===b?.id);return{version:1,purpose:a.purpose,capturedAt:Date.now(),documentId:b?.id??null,runId:b?.runId??null,title:a.title,format:a.format??"unmeasured",body:{sha256:ae(a.markdown),bytes:Buffer.byteLength(a.markdown),chars:a.markdown.length},identity:{exportBuildId:a.buildId??null,generationBuildId:"string"==typeof n?.sourceFingerprint?n.sourceFingerprint:null,runInputsSha256:c.sha256??null,sourceSnapshotSha256:h?ae(JSON.stringify(h)):null,sourceCount:h?.length??null,status:o?"bound":"unmeasured"},generation:{status:b?.status??"editor",error:b?.error??null,warnings:b?.warningIssues??[]},chapters:{status:l?"measured":"unmeasured",expected:i,written:k,missing:l?i.filter(a=>!k.some(b=>b.id===a.id)):[],...!l?{reason:"缺少完整章计划,或编辑后正文无法与原章节快照逐字对位;不把无法对位冒充已证缺章"}:{}},acceptance:{passed:a.acceptancePassed,issues:[...a.issues]},sourceCompleteness:function(a,b,c,d){let e=ag(b,a?.runId,"construction-source-coverage.json"),f=e.data,g=[];if(a?.runId&&d?.runId===a.runId&&d.documentId===a.id||g.push("来源覆盖账缺少本运行及本稿的输入身份绑定"),f?.version!==ad.YU)g.push("缺少当前来源覆盖账(construction-source-coverage.json)");else{f.documentHash!==(0,A.Sl)(a?.draft?.chapters??[],c)&&g.push("来源覆盖账属于另一版正文,不能显示为当前证据");let b=a=>{if(!Array.isArray(a)||!a.length)return;let b=a.map(af);if(b.some(a=>"string"!=typeof a?.filePath||!a.filePath||"string"!=typeof a.sha256||!a.sha256))return;let c=b.map(a=>[a.filePath,a.sha256]);if(new Set(c.map(([a])=>a)).size===c.length)return c.sort(([a],[b])=>a.localeCompare(b))},e=b(d?.sources),h=b(f.sources);e&&h&&JSON.stringify(e)===JSON.stringify(h)||g.push("来源覆盖账与本次冻结输入的来源文件/SHA不一致"),(!["measured","unmeasured"].includes(String(f.status))||["unreferenced","opinions","missingOpinions","conflicts","omissions","reasons"].some(a=>!Array.isArray(f[a])))&&g.push("当前来源覆盖账字段不完整,不能把旧审查摘要当作来源覆盖测量")}let h=0===g.length;return{status:h?"bound":"unmeasured",issues:g,checklist:h?a?.draft?.exportGate?.checklist?.find(a=>"source-coverage-ledger"===a.key)??null:null,receipt:h?f:null,receiptSha256:h?e.sha256:null}}(b,a.generatedDir,a.markdown,c.data),quality:{status:m?m.documentHash===(0,A.Sl)(b?.draft?.chapters??[],a.markdown)?"current":"historical":"unmeasured",receipt:m??null},rework:{status:g?"recorded":"unmeasured",modelSha256:f.sha256??null,authorPassSealed:"boolean"==typeof g?.authorPassSealed?g.authorPassSealed:null,c0ReferenceChars:"number"==typeof g?.c0ReferenceChars?g.c0ReferenceChars:null,ledger:g?.rework??null,revisionCount:Array.isArray(g?.revisions)?g.revisions.length:null,userRevisionCount:b?.revisionLog?.length??0},render:a.render??{status:"pending"}}}({record:p,generatedDir:(0,X.Gl)(i),markdown:B,title:t,purpose:h,format:V,buildId:(0,S.S)()?.sourceFingerprint,acceptancePassed:ax&&0===aw.length&&0===U.blockers.length,issues:[...aw.map(a=>a.message),...R.issues],render:{status:a,...d?{error:d}:{},audit:ap(U),...void 0!==e?{artifact:{sha256:(0,m.createHash)("sha256").update(e).digest("hex"),bytes:Buffer.byteLength(e)}}:{}}});c={...function(a,b){let c=ae(JSON.stringify(b)),d=(0,x.tv)(a,`review-export-${c}.json`,b,b.runId??void 0);return{id:c,sha256:d.sha256,bodySha256:b.body.sha256}}((0,X.Gl)(i),f),...p?.runId?{runId:p.runId}:{}},b.setHeader(an.issuesReport,encodeURIComponent(JSON.stringify(c))),b.setHeader(an.bodySha256,f.body.sha256),b.setHeader(an.exportPurpose,h),b.setHeader(an.gatePassed,f.acceptance.passed?"true":"false")};try{let a=await G(p,i,(0,X.Gl)(i),B);U.verifiedFigures=a.bytes,d=a.receipts,U.verifiedFigures.size&&U.notices.push({code:"figure-inline",message:`原生图件验身:${U.verifiedFigures.size}份实际字节及所引源版本已核,本次渲染固定采用这些字节;不是专业资格。`})}catch(c){let a=c instanceof Error?c.message:String(c);return aw.push({level:"error",severity:"blocker",message:a}),ay("failed",a),b.setHeader(an.notDeliverable,"true"),b.status(422).json({error:"CONSTRUCTION_FIGURE_IDENTITY_INVALID",message:a})}try{if(U.verifiedDelivery=function(a,b,c,d,e={}){if(!a?.runId)return{bodyMarkdown:d,appendixMarkdown:""};let f=(0,x.HM)(c,"document-delivery-placements.json",a.runId),g=a.reviewMetadata?.contractQuality??a.draft?.reviewMetadata?.contractQuality,h=g&&g.deliveryPlacements;if(!j().existsSync(f)){let b=(0,x.HM)(c,"planning-context.json",a.runId),e=j().existsSync(b)?JSON.parse(j().readFileSync(b,"utf8")):void 0,f=e?.outputObligations?.some(a=>a.applicability?.delivery?.location==="technical-appendix"||a.applicability?.delivery?.originalForm==="required");return(h?.units.some(a=>"technical-appendix"===a.location||a.binding?.originalFormContractHash)||f)&&P("本运行交付位置原始回执缺失,原格式或技术附表不得借删除回执绕过"),{bodyMarkdown:d,appendixMarkdown:""}}try{let g=JSON.parse(j().readFileSync(f,"utf8")),i=(0,H.loadConstructionFrozenInputs)(b,a.runId,a.id,void 0,{requirePlanningContext:!0}),k=i.planningContext,m=(0,A.Sl)(a.draft?.chapters??[],d),n={projectId:b,documentId:a.id,sourceSnapshotId:i.project.snapshotId,contractId:i.contract.id};(g.runId!==a.runId||g.documentId!==a.id||g.workspaceId!==(0,z.qX)(n)||g.planningContextHash!==(0,z.Fu)(k)||g.documentHash!==m)&&P("交付位置回执与运行、冻结规划、合同工作库或本份全文不符"),h&&(0,z.Fu)(h)===(0,z.Fu)(g.placements)||P("交付位置原始回执与当前合同七维回执不同源");let o=i.tenderResponsePlan;o||P("交付位置回执缺少本运行冻结响应计划");let p=i.runStart.tenderResponsePlanHash;for(let a of(p&&(0,z.Fu)(o)===p||P("冻结响应计划与本运行起始身份不符"),o.sections.flatMap(a=>a.requiredOutputs))){if(!a.applicability&&!a.obligationId)continue;let b=k.outputObligations.find(b=>b.id===a.obligationId);b&&(0,J.oY)(b)&&(0,z.Fu)(a.applicability)===(0,z.Fu)(b.applicability)&&(0,z.Fu)(a.originalForm??null)===(0,z.Fu)(b.originalForm??null)||P("响应计划输出的适用性或原格式不属于当前冻结义务")}for(let a of k.outputObligations.filter(J.oY))("technical-appendix"===a.applicability.delivery.location||"required"===a.applicability.delivery.originalForm)&&1!==o.sections.flatMap(a=>a.requiredOutputs).filter(b=>b.obligationId===a.id).length&&P("原格式或技术附表义务没有唯一的当前输出承接");let q=(0,I.rL)(o),r=l().join(c,"construction","workflow-state.sqlite"),s=j().realpathSync(r),t=j().realpathSync(c),u=l().relative(t,s);return(!u||u.startsWith("..")||l().isAbsolute(u))&&P("交付源工作库不在本项目生成根内"),y.l.inspectEntityHeads(s,n,[],(a,b)=>{let c=i.runStart.scope?.sectionIds,f=b.entityHeads("writing-unit").filter(a=>!a.deleted&&(0,C.iC)(a)).filter(a=>!c?.length||(0,C.iC)(a).sectionIds?.some(a=>c.includes(a))),h=f.map(a=>{let b=(0,C.iC)(a);return{entityId:a.id,entityVersion:a.version,entityHash:(0,z.Fu)(a),...b.originalFormContractHash?{originalFormContractHash:b.originalFormContractHash}:{},..."figure"===b.kind?{figure:{semanticHash:(0,K.CA)(b),notesHash:(0,K.Zc)(b.notes??[])}}:{}}}),j=(0,K.$H)(d,g.placements,{outputPlacements:q,units:h});j.valid||P(j.issues.join(";"));let k=f.map(a=>(0,C.iC)(a));for(let a of k){let b=(0,I.B$)(a,o,a.sectionIds);b.length&&P("实际单元的交付位置/原格式已失效:"+b.join(";"))}(0,C.YK)({units:k.map(a=>({...a,references:a.references.filter(a=>"evidence"!==a.kind),assertions:a.assertions.filter(a=>"evidence"!==a.reference.kind)})),currentEntityVersion:b.currentEntityVersion,certificateValid:b.certificateCurrent,evidenceExists:()=>!1}).some(a=>a.needsRecheck)&&P("交付所引决定或计算证书已失效");let l=f.map((a,b)=>({entityId:a.id,unit:k[b],sectionIds:k[b].sectionIds??[]})),n=(0,M.ut)({contract:i.contract,units:l}),p=(0,M.Lz)({units:l,carriers:n}),r={entity:a=>{let c=b.currentEntityVersion(a);return void 0===c?void 0:b.entityVersion(a,c)},certificate:b.certificate},s=b.entityHeads("review-assessment").filter(a=>!a.deleted).flatMap(a=>{let{value:b}=(0,N.fv)(a.value);return b?[{id:a.id,value:b}]:[]}).filter(a=>(0,N.O4)(r,a.value,void 0,(0,N.IQ)(i.bidComposition,i.bidCompositionSources),o)&&(0,N.O0)(r,a.value)),t=(0,O.b)({contract:i.contract,plan:o,units:f.map((a,b)=>({...l[b],responsibilityId:String(a.value?.responsibilityId??""),purpose:String(a.value?.purpose??""),sectionIds:[...l[b].sectionIds],entityVersion:a.version,entityHash:(0,z.Fu)(a)})),composition:{markdown:d,documentHash:m,deliveryPlacements:g.placements},assessments:s,reviewStore:r,figureAssets:e.figureAssets,verifiedFigureBytes:e.verifiedFigureBytes,figureStyle:{monoColor:i.bidComposition?.formatRules.monoColor,fontFamily:i.bidComposition?.formatRules.bodyFont||i.bidComposition?.formatRules.fontFamily},expectedBidCompositionHash:(0,N.IQ)(i.bidComposition,i.bidCompositionSources),scopeSectionIds:c}).find(a=>"met"!==a.status);t&&P("原格式实际载体未通过当前结构与独审核验:"+t.checks.filter(a=>"met"!==a.status).map(a=>a.reason).join(";"));let u=[];for(let a=0;a<f.length;a++){let b=f[a],c=k[a],e=(0,I.nI)(c,o,c.sectionIds);if(!e?.originalForm||e.applicability?.delivery.originalForm!=="required"||"figure"===e.originalForm.kind)continue;let h=(0,L.O9)({contract:e.originalForm,unit:p.units[a]});"met"===h.status&&h.html&&h.projection||P("原格式实际产物不能按已审完整结构渲染");let i=g.placements.units.find(a=>a.entityId===b.id).range,j=d.slice(i.start,i.end);2!==j.split(h.html).length&&P("原格式实际HTML与当前单元、发布编号或冻结母版不同源"),u.push({contractHash:e.originalForm.hash,unitEntityId:b.id,html:h.html,projection:h.projection})}return u.sort((a,b)=>g.placements.units.find(b=>b.entityId===a.unitEntityId).range.start-g.placements.units.find(a=>a.entityId===b.unitEntityId).range.start),{bodyMarkdown:j.bodyMarkdown,appendixMarkdown:j.appendixMarkdown,placements:g.placements,outputPlacements:q,originalForms:u}})}catch(a){if(a instanceof Error&&a.message.startsWith("CONSTRUCTION_DELIVERY_IDENTITY_INVALID"))throw a;return P(a instanceof Error?a.message:String(a))}}(p,i,(0,X.Gl)(i),B,{figureAssets:d,verifiedFigureBytes:U.verifiedFigures}),U.verifiedDelivery.placements&&T!==B)throw Error("CONSTRUCTION_DELIVERY_IDENTITY_INVALID:导出预处理改变了已冻结位置的全文,请先重新装配核验")}catch(c){let a=c instanceof Error?c.message:String(c);return aw.push({level:"error",severity:"blocker",message:a}),ay("failed",a),b.setHeader(an.notDeliverable,"true"),b.status(422).json({error:"CONSTRUCTION_DELIVERY_IDENTITY_INVALID",message:a})}if((0,aa.Kf)(r)){let a=await (0,aa.m3)();aw.push(...a({markdown:B,spec:r,...U.verifiedDelivery?.placements?{deliveryPlacements:U.verifiedDelivery.placements,outputPlacements:U.verifiedDelivery.outputPlacements}:{},isVerifiedDiagram:a=>{let b=av(a,i,U.verifiedFigures);return!!(b&&U.verifiedFigures?.has(k.resolve(b)))}}))}if(ax=0===aw.length&&0===U.blockers.length,ay("pending"),"delivery"===h&&U.blockers.length>0)return ay("failed",U.blockers.map(a=>a.message).join(";")),b.status(422).json({error:"EXPORT_SOURCE_STRUCTURAL_DEFECT",message:`导出源存在结构性缺陷,已按纯渲染模式阻断(不再补造表头):${U.blockers.slice(0,3).map(a=>a.message).join(";")}`,issues:U.blockers.slice(0,20)});if(!ax&&"delivery"===h)return ay("failed","当前正文尚未通过交付验收"),b.status(422).json({error:"EXPORT_GATE_BLOCKED",message:`导出门禁未通过(${aw.length} 项阻断),文档未达交付标准,已阻止导出。请先使用审阅导出供专业人员核对,交付导出须通过本份正文的验收。`,issues:aw.slice(0,20)});b.setHeader(an.gatePassed,ax?"true":"false"),b.setHeader(an.notDeliverable,"review"===h?"true":"false"),ax||(b.setHeader(an.gateIssues,encodeURIComponent(JSON.stringify(aw.map(a=>a.message).slice(0,20)))),b.setHeader(an.gateIssueCount,String(aw.length)));let az="review"===h?function(a){let b=a.lastIndexOf("."),c=b>0?a.slice(0,b):a;return c.endsWith("_审阅稿")?a:b>0?`${c}_审阅稿${a.slice(b)}`:`${a}_审阅稿`}(aq(t)):aq(t),aA=a=>{let c=function(a,b,c="enforce"){let d=b?.pageMin,e=b?.pageLimit;if("informational"===c)return{status:"informational",passed:!0,reason:"本轮按专业内容验收,真实页数仅供后续人工排版参考",pages:a??null,min:d??null,max:e??null};if(void 0===d&&void 0===e)return{status:"not-applicable",passed:!0,reason:"本轮没有页数上下限义务",pages:a??null,min:null,max:null};if(void 0!==d&&(!Number.isInteger(d)||d<=0)||void 0!==e&&(!Number.isInteger(e)||e<=0)||void 0!==d&&void 0!==e&&d>e)return{status:"unmeasured",passed:!1,reason:"冻结的页数义务不完整或上下限冲突,须回到合同编译处理",pages:a??null,min:d??null,max:e??null};if(void 0===a||!Number.isInteger(a)||a<=0)return{status:"unmeasured",passed:!1,reason:"实际渲染页数未完成测量,不能以字数或估算页数代替",pages:null,min:d??null,max:e??null};let f=(void 0===d||a>=d)&&(void 0===e||a<=e);return{status:f?"met":"not-met",passed:f,reason:f?`实际${a}页满足页数义务`:`实际${a}页未满足${void 0===d?"":`不少于${d}页`}${void 0!==d&&void 0!==e?"、":""}${void 0===e?"":`不超过${e}页`}`,pages:a,min:d??null,max:e??null}}(a,r?.formatRules,"informational"),d=r?.formatRules.pageLimit;if(d&&a&&a>d){let e=r?.formatRules.pageEvidence?.filter(a=>"max"===a.kind&&a.value===d),f=e?.length&&e.every(a=>"recommendation"===a.status)?"来源篇幅建议":"尚未核定适用范围的篇幅候选";b.setHeader(an.pageLimit,encodeURIComponent(`${f}:当前${a}页,参考${d}页;${c.reason}`))}};try{if("markdown"===V){let a=aD(T,i,U),d=ap(U);return d&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(d))),b.setHeader(an.figureInline,encodeURIComponent(JSON.stringify({inlined:a.report.inlined,failed:a.report.failed.map(a=>`${a.name}:${a.reason}`).slice(0,20)}))),ay("succeeded",void 0,a.markdown),bh(p,V,i,d||W,aw,void 0,{content:a.markdown,startedAt:e},h,c),b.setHeader("Content-Type","text/markdown; charset=utf-8"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${az}.md`)}`),b.status(200).send(a.markdown)}if("docx"===V){let a=U.blockers.length,d=await a_(t,T,u,"review"===h?void 0:f.wordTemplatePath,i,U,r?.formatRules,!1,"review"===h),g=d.buffer;if(await aU(g,U.verifiedDelivery?.originalForms??[],u,U.verifiedDelivery?.outputPlacements?.some(a=>a.originalFormContractHash)?T:void 0),d.imageReceipt.embedded!==d.imageReceipt.expected||d.imageReceipt.layoutIssues?.length){let a=d.imageReceipt.layoutIssues?.join(";")??`DOCX图件未完整进包:应有${d.imageReceipt.expected}处,实际${d.imageReceipt.embedded}处;不能以文字占位代替图件交付`;if(aw.push({level:"error",severity:"blocker",message:a}),"delivery"===h)return ay("failed",a),b.status(422).json({error:"EXPORT_FIGURE_NOT_CONSERVED",message:a});b.setHeader(an.gatePassed,"false"),b.setHeader(an.notDeliverable,"true"),b.setHeader(an.gateIssues,encodeURIComponent(JSON.stringify(aw.map(a=>a.message).slice(0,20)))),b.setHeader(an.gateIssueCount,String(aw.length))}d.templateWarning&&(b.setHeader(an.templateWarning,encodeURIComponent(d.templateWarning)),console.error(`[export] ${d.templateWarning}`));let j=ap(U);if(j&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(j))),"delivery"===h&&U.blockers.length>a){let c=U.blockers.slice(a);return ay("failed",c.map(a=>a.message).join(";")),b.status(422).json({error:"EXPORT_RENDER_NOT_PURE",message:`docx 渲染阶段存在未声明的正文改动,已按纯渲染模式阻断:${c.slice(0,3).map(a=>a.message).join(";")}`,issues:c.slice(0,20)})}let k=await (0,Y.Dx)(g).catch(a=>({unavailableReason:`渲染器异常:${a instanceof Error?a.message.split("\n")[0]:String(a)}`})),l=void 0!==k.pages&&null!==k.pages?{pages:k.pages,renderer:k.renderer||"unknown"}:{unavailableReason:k.unavailableReason||"未知原因"};return aA(k.pages),ay("succeeded",void 0,g),bh(p,V,i,j||W,aw,l,{content:g,startedAt:e},h,c),b.setHeader("Content-Type","application/vnd.openxmlformats-officedocument.wordprocessingml.document"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${az}.docx`)}`),b.status(200).send(g)}let d=await bf(t,T,u,i,r?.formatRules.monoColor===!0,U);"review"===h&&(d=function(a){let b=j().readFileSync(o()).toString("base64"),c=`<style>@font-face{font-family:"${n}";src:url(data:font/otf;base64,${b}) format("opentype");font-weight:400;font-style:normal;}body,body *{font-family:"${n}",sans-serif!important;}</style>`;if(!a.includes("</head>"))throw Error("审阅HTML缺少文档头,无法可靠嵌入中文字体");return a.replace("</head>",`${c}</head>`)}(d),U.notices.push({code:"review-font-fallback",message:"审阅HTML/PDF嵌入Noto Sans CJK SC,保证跨环境中文可读;字体替代未认定为指定投标字体达标"}));let g=ap(U);if(g&&b.setHeader(an.renderAudit,encodeURIComponent(JSON.stringify(g))),"html"===V)return ay("succeeded",void 0,d),bh(p,V,i,g||W,aw,void 0,{content:d,startedAt:e},h,c),b.setHeader("Content-Type","text/html; charset=utf-8"),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${az}.html`)}`),b.status(200).send(d);try{let a=await bg(d,u,r?.formatRules,U.verifiedDelivery?.originalForms),f=await (0,Y.kN)(a);return aA(f),ay("succeeded",void 0,a),bh(p,V,i,g||W,aw,f?{pages:f,renderer:"chromium-pdf-page-tree"}:{unavailableReason:"PDF页树解析失败,实际页数未完成验收"},{content:a,startedAt:e},h,c),b.setHeader("Content-Type","application/pdf"),f&&b.setHeader(an.pdfPageCount,String(f)),b.setHeader("Content-Disposition",`attachment; filename*=UTF-8''${encodeURIComponent(`${az}.pdf`)}`),b.status(200).send(a)}catch(c){if(ay("failed",c instanceof Error?c.message:String(c)),c instanceof Error&&c.message.startsWith("ORIGINAL_FORM_RENDER_"))return b.status(422).json({error:c.message.split(":")[0],message:c.message});return(0,aj.wF)({level:"error",source:"api/documents/export",functionName:"pdfExportChromium",error:c,req:a,meta:{fallback:"system-browser-attempted"}}),b.status(500).json({error:"PDF_RENDER_FAILED",message:"PDF 渲染失败:未找到或无法启动可用的 Chrome/Chromium/Edge。请安装 Chrome,或设置 PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH 后重试。"})}}catch(a){if(ay("failed",a instanceof Error?a.message:String(a)),a instanceof Error&&a.message.startsWith("ORIGINAL_FORM_RENDER_"))return b.status(422).json({error:a.message.split(":")[0],message:a.message});return b.status(500).json({error:"EXPORT_RENDER_FAILED",message:"渲染失败,独立审阅报告已保留。"})}}let bj={inlineLocalImages:ax,inlineMarkdownFigures:aD,createInlineImageResolver:aw,resolveLocalImagePath:av,rasterizeMarkdownSvgFigures:aR,buildDocxInternal:a1,createExportRenderAudit:ao,exportRenderAuditReport:ap,canonicalExportText:a9,exportConservationDiff:function(a,b){return ba(a9(a),a9(b))},diffCanonicalText:ba,docxVisibleText:bb,canonicalDocxText:bc,docxStageConservationDiff:bd,prepareExportMarkdown:be,stripInlineMarkdown:aH,enhanceTocHtml:a4,buildExportHtml:bf,renderPdfBuffer:bg,resolveExportStyle:aN,buildDocx:a_,markdownToDocxXml:aZ,validateExportMarkdown:a8,isTableCaptionLine:aV,DOCX_TOC_FIELD_PLACEHOLDER:aW,verifyOriginalFormDocxPackage:aU},bk=(0,ak.j)("api/documents/export",bi);var bl=c(68970),bm=c(50296);let bn=(0,h.M)(d,"default"),bo=(0,h.M)(d,"config"),bp=new g.PagesAPIRouteModule({definition:{kind:f.A.PAGES_API,page:"/api/documents/export",pathname:"/api/documents/export",bundlePath:"",filename:""},userland:d,distDir:".next",relativeProjectDir:""});async function bq(a,b,c){let d=await bp.prepare(a,b,{srcPage:"/api/documents/export"});if(!d){b.statusCode=400,b.end("Bad Request"),null==c.waitUntil||c.waitUntil.call(c,Promise.resolve());return}let{query:f,params:g,prerenderManifest:h,routerServerContext:i}=d;try{let c=a.method||"GET",d=(0,bl.getTracer)(),e=d.getActiveScopeSpan(),j=bp.instrumentationOnRequestError.bind(bp),k=async e=>bp.render(a,b,{query:{...f,...g},params:g,allowedRevalidateHeaderKeys:[],multiZoneDraftMode:!1,trustHostHeader:!1,previewProps:h.preview,propagateError:!1,dev:bp.isDev,page:"/api/documents/export",internalRevalidate:null==i?void 0:i.revalidate,onError:(...b)=>j(a,...b)}).finally(()=>{if(!e)return;e.setAttributes({"http.status_code":b.statusCode,"next.rsc":!1});let f=d.getRootSpanAttributes();if(!f)return;if(f.get("next.span_type")!==bm.BaseServerSpan.handleRequest)return void console.warn(`Unexpected root span type '${f.get("next.span_type")}'. Please report this Next.js issue https://github.com/vercel/next.js`);let g=f.get("next.route");if(g){let a=`${c} ${g}`;e.setAttributes({"next.route":g,"http.route":g,"next.span_name":a}),e.updateName(a)}else e.updateName(`${c} ${a.url}`)});e?await k(e):await d.withPropagatedContext(a.headers,()=>d.trace(bm.BaseServerSpan.handleRequest,{spanName:`${c} ${a.url}`,kind:bl.SpanKind.SERVER,attributes:{"http.method":c,"http.target":a.url}},k))}catch(a){if(bp.isDev)throw a;(0,e.sendError)(b,500,"Internal Server Error")}finally{null==c.waitUntil||c.waitUntil.call(c,Promise.resolve())}}},56766:(a,b,c)=>{c.d(b,{Dx:()=>t,GA:()=>s,kN:()=>r});var d=c(19898),e=c(31421),f=c(73024),g=c.n(f),h=c(48161),i=c.n(h),j=c(76760),k=c.n(j),l=c(73136),m=c(57975),n=c(88194),o=c.n(n);let p=(0,m.promisify)(e.execFile);async function q(a,b=!1,c=!1){let e;if(a.length)try{if(e=await (0,d.loadPdfDocument)(a),!Number.isInteger(e.pageCount)||e.pageCount<=0)return;let f=[];if(b)for(let a=0;a<e.pageCount;a+=1){let b=await e.getPage(a);try{f.push(await b.getText())}finally{await b.close()}}let g=new Map,h=a=>{for(let b of a)void 0!==b.page&&Number.isInteger(b.page)&&b.page>0&&b.page<=e.pageCount&&g.set(b.title,[...g.get(b.title)??[],b.page]),b.children.length&&h(b.children)};return c&&h(await e.getOutline()),{pages:e.pageCount,text:f.join(""),...c?{headingPages:Object.fromEntries([...g].filter(([,a])=>1===a.length).map(([a,b])=>[a,b[0]]))}:{}}}catch{return}finally{await e?.close()}}async function r(a){return(await q(a))?.pages}async function s(a){return(await q(a,!1,!0))?.headingPages}async function t(a,b={}){let c,d,e;if(!a||0===a.length)return{unavailableReason:"docx 为空"};try{let b=await o().loadAsync(a),d=await b.file("word/document.xml")?.async("string");if(!d)throw Error("正文缺席");c=[...d.matchAll(/<w:t(?:\s[^>]*)?>([\s\S]*?)<\/w:t>/gu)].map(a=>a[1]).join("")}catch{return{unavailableReason:"DOCX正文无法解析,不能验证真实渲染页数"}}let f=async a=>{let e=await q(a,!0,!0);if(!e)return;let f=function(a,b){let c=new Map,d=new Map;for(let b of a.match(/\p{Script=Han}/gu)??[])c.set(b,(c.get(b)??0)+1);let e=[...c.values()].reduce((a,b)=>a+b,0);if(e<20)return null;for(let a of b.match(/\p{Script=Han}/gu)??[])d.set(a,(d.get(a)??0)+1);return[...c].reduce((a,[b,c])=>a+Math.min(c,d.get(b)??0),0)/e}(c,e.text);if(null!==f&&f<.98)throw Error(`中文文字渲染未保留(覆盖率${(100*f).toFixed(1)}%),请核查渲染器中文字体;不能将缺字版式计为合格页数`);return d=e.headingPages,await b.onRenderedPdf?.(a),e.pages},h=g().mkdtempSync(k().join(i().tmpdir(),"real-pages-")),j={...process.env};if("darwin"===process.platform&&!j.FONTCONFIG_FILE){let a=["/System/Library/Fonts","/System/Library/Fonts/Supplemental","/Library/Fonts"].filter(a=>g().existsSync(a));if(a.length){let b=k().join(h,"fonts.conf"),c=a=>a.replace(/&/gu,"&").replace(/</gu,"<").replace(/>/gu,">");g().writeFileSync(b,`<?xml version="1.0"?><!DOCTYPE fontconfig SYSTEM "fonts.dtd"><fontconfig>${a.map(a=>`<dir>${c(a)}</dir>`).join("")}<cachedir>${c(k().join(h,"font-cache"))}</cachedir><alias><family>SimSun</family><prefer><family>Songti SC</family></prefer></alias><alias><family>宋体</family><prefer><family>Songti SC</family></prefer></alias></fontconfig>`),j.FONTCONFIG_FILE=b}}let m=k().join(h,"document.docx");g().writeFileSync(m,a);try{for(let a of function(){let a=[],b=process.env.CUSTOMIZE_DOCX_RENDERER;if(b){let c=g().existsSync(b.trim())?[b.trim()]:b.trim().split(/\s+/u);a.push({name:`env:${c[0]}`,command:c[0],args:c.slice(1)})}for(let b of["soffice","libreoffice"])a.push({name:b,command:b,args:[]});return a}()){let c,i=k().join(h,`out-${a.name.replace(/[^\w.-]/gu,"_")}`);g().mkdirSync(i,{recursive:!0});let n=a=>a.replace(/\{in\}/gu,m).replace(/\{out\}/gu,i).replace(/\{outfile\}/gu,k().join(i,"document.pdf")),o=a.args.length>0?a.args.map(n):[`-env:UserInstallation=${(0,l.pathToFileURL)(k().join(i,"profile")).href}`,"--headless","--convert-to","pdf","--outdir",i,m];try{await p(a.command,o,{timeout:b.timeoutMs??12e4,env:j})}catch(c){let b=c.code;if("ENOENT"===b)continue;e=`${a.name}:${c instanceof Error?c.message.split("\n")[0]:String(c)}`;continue}let q=k().join(i,"document.pdf");if(!g().existsSync(q)){let b,c=g().readdirSync(i).filter(a=>a.toLowerCase().endsWith(".pdf"));if(0===c.length){e=`${a.name}没有产生PDF`;continue}try{b=1===c.length?await f(g().readFileSync(k().join(i,c[0]))):void 0}catch(a){e=a instanceof Error?a.message:String(a);continue}if(void 0!==b)return{pages:b,renderer:a.name,headingPages:d};e=c.length>1?`${a.name}产生多个PDF,无法确认对应文档`:`${a.name}的PDF页树解析失败`;continue}try{c=await f(g().readFileSync(q))}catch(a){e=a instanceof Error?a.message:String(a);continue}if(void 0!==c)return{pages:c,renderer:a.name,headingPages:d};e=`${a.name}的PDF页树解析失败`}return{unavailableReason:e?`渲染器失败(${e})`:"未配置外部渲染器(CUSTOMIZE_DOCX_RENDERER 或 PATH 中的 soffice/libreoffice)——真页数待真渲染"}}finally{g().rmSync(h,{recursive:!0,force:!0})}}},57975:a=>{a.exports=require("node:util")},73024:a=>{a.exports=require("node:fs")},73136:a=>{a.exports=require("node:url")},75600:a=>{a.exports=require("next/dist/compiled/next-server/pages-api.runtime.prod.js")},76760:a=>{a.exports=require("node:path")},77598:a=>{a.exports=require("node:crypto")},83142:a=>{a.exports=import("marked")},83237:a=>{a.exports=import("playwright")},88194:a=>{a.exports=require("jszip")},95393:a=>{a.exports=require("@customize-agent/llm")},96770:a=>{a.exports=require("@customize-agent/runtime")}};var b=require("../../../webpack-api-runtime.js");b.C(a);var c=b.X(0,[9705,5763,3074,702,9522,8459],()=>b(b.s=55540));module.exports=c})();
|