@customize-agent/server 4.60.11 → 4.60.13
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 +61 -61
- package/.next/prerender-manifest.json +3 -3
- package/.next/required-server-files.json +1 -1
- package/.next/server/chunks/1243.js +1 -1
- package/.next/server/chunks/1928.js +1 -1
- package/.next/server/chunks/1936.js +1 -1
- package/.next/server/chunks/4722.js +3 -3
- package/.next/server/chunks/6021.js +1 -0
- package/.next/server/chunks/6321.js +1 -1
- package/.next/server/chunks/6822.js +1 -1
- package/.next/server/chunks/8204.js +1 -1
- package/.next/server/chunks/9666.js +2 -2
- package/.next/server/instrumentation.js.nft.json +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/documents/canvas/[id].js.nft.json +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]/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 +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/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/system/reset.js.nft.json +1 -1
- package/.next/server/pages/canvas/[id].html +1 -1
- package/.next/server/pages/canvas.html +1 -1
- package/.next/server/pages/documents.html +1 -1
- package/.next/server/pages/guide.html +1 -1
- package/.next/server/pages/index.html +1 -1
- package/.next/server/pages/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/overview.html +1 -1
- package/.next/server/pages/prompt.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]/edit.js.nft.json +1 -1
- package/.next/server/pages/skills/[id].html +1 -1
- package/.next/server/pages/skills/[id].js.nft.json +1 -1
- package/.next/server/pages/skills/new.html +1 -1
- package/.next/server/pages/skills/new.js.nft.json +1 -1
- package/.next/server/pages/skills.html +1 -1
- package/.next/server/pages/system/logs.html +1 -1
- package/.next/server/pages-manifest.json +40 -40
- package/.next/static/c097c482b89445ecd5af066c8dcae41fe044bfa13f1e971756cbd620b20de70d/_buildManifest.js +1 -0
- package/.next/static/chunks/162-36b2a3e6ee7d9717.js +8 -0
- package/.next/static/chunks/257-879f095890deadad.js +1 -0
- package/.next/static/chunks/313-4b3ff7075e0ff3c3.js +1 -0
- package/.next/static/chunks/530-98c3b3fbf3fcd8e3.js +1 -0
- package/.next/static/chunks/551-446a9d48add4944f.js +16 -0
- package/.next/static/chunks/715-6285c5942e5ec5ea.js +1 -0
- package/.next/static/chunks/717-743b697a417dd5ee.js +4 -0
- package/.next/static/chunks/748-e13db510f76568b1.js +1 -0
- package/.next/static/chunks/795-3edd02531a6d39ae.js +1 -0
- package/.next/static/chunks/955-f0542d4dea118b62.js +1 -0
- package/.next/static/chunks/{964-569c27befeaff602.js → 964-82cc4701f08f7351.js} +2 -2
- package/.next/static/chunks/pages/{_app-28228d95968c4d44.js → _app-4165169ba0fabd04.js} +1 -1
- package/.next/static/chunks/pages/canvas/[id]-792d02e3874c19c0.js +1 -0
- package/.next/static/chunks/pages/{canvas-ffb08963e5cf9558.js → canvas-e011bb88585d3441.js} +1 -1
- package/.next/static/chunks/pages/guide-3185f12fbcb5a6af.js +1 -0
- package/.next/static/chunks/pages/knowledge/file-detail-c34e1f995fb8316f.js +1 -0
- package/.next/static/chunks/pages/knowledge/source-preview-814c683fc3723177.js +1 -0
- package/.next/static/chunks/pages/knowledge-3afd4bc337d44550.js +1 -0
- package/.next/static/chunks/pages/models-e07b2e29595effd7.js +1 -0
- package/.next/static/chunks/pages/prompt-47a1ac955831dedb.js +1 -0
- package/.next/static/chunks/pages/settings-8879d8c90bee2025.js +1 -0
- package/.next/static/chunks/pages/skills/[id]/{edit-89bbed9a3a854b04.js → edit-88e2490a4190467b.js} +1 -1
- package/.next/static/chunks/pages/skills/[id]-4700cd743c5efe05.js +1 -0
- package/.next/static/chunks/pages/skills/{new-124599c772150a1d.js → new-b2204742b055565a.js} +1 -1
- package/.next/static/chunks/pages/skills-1f6bcb42cd90abeb.js +1 -0
- package/.next/static/chunks/pages/system/logs-8c5dd4d06fa9d8c9.js +1 -0
- package/.next/static/css/cb79b8022e718258.css +1 -0
- package/package.json +2 -2
- package/scripts/half-built-scan.baseline.json +3 -4
- package/.next/server/chunks/9399.js +0 -1
- package/.next/static/36956db6655c7ce7a67c9b6862b2ca1b6b5308f268b5595d430facff6c0f4152/_buildManifest.js +0 -1
- package/.next/static/chunks/162-a5be07e04aedf98a.js +0 -8
- package/.next/static/chunks/2-434e34e83819f4e4.js +0 -1
- package/.next/static/chunks/257-6938c7ab284ab21c.js +0 -1
- package/.next/static/chunks/280-3ce590d421b5c47d.js +0 -16
- package/.next/static/chunks/324-650dc02536b071bf.js +0 -4
- package/.next/static/chunks/425-42f2568bcdd98f4c.js +0 -1
- package/.next/static/chunks/530-7e79396d68742829.js +0 -1
- package/.next/static/chunks/564-d3426eef3e3e415b.js +0 -4
- package/.next/static/chunks/781-a6b83dbcd1a33cab.js +0 -1
- package/.next/static/chunks/795-1c1cb3bf1f600e99.js +0 -1
- package/.next/static/chunks/819-96247c9054ad9683.js +0 -1
- package/.next/static/chunks/pages/canvas/[id]-534b45f39f39630c.js +0 -1
- package/.next/static/chunks/pages/guide-82ae330966139191.js +0 -1
- package/.next/static/chunks/pages/knowledge/file-detail-dc1807f8ed32cd59.js +0 -1
- package/.next/static/chunks/pages/knowledge/source-preview-4309277bf497521c.js +0 -1
- package/.next/static/chunks/pages/knowledge-84e386d765ddd311.js +0 -1
- package/.next/static/chunks/pages/models-5eee2d09deb081fb.js +0 -1
- package/.next/static/chunks/pages/prompt-d75de6a6fead73c9.js +0 -1
- package/.next/static/chunks/pages/settings-f6dfff648cf9ac0e.js +0 -1
- package/.next/static/chunks/pages/skills/[id]-5130d68546be49cb.js +0 -1
- package/.next/static/chunks/pages/skills-476714776be63ce5.js +0 -1
- package/.next/static/chunks/pages/system/logs-40edb648d89b0749.js +0 -1
- package/.next/static/css/f4f2d386cfeae8e4.css +0 -1
- /package/.next/static/{36956db6655c7ce7a67c9b6862b2ca1b6b5308f268b5595d430facff6c0f4152 → c097c482b89445ecd5af066c8dcae41fe044bfa13f1e971756cbd620b20de70d}/_ssgManifest.js +0 -0
|
@@ -16,7 +16,7 @@ ${JSON.stringify(c.numericBindings)}`,`【本任务独立核定的来源用途
|
|
|
16
16
|
${JSON.stringify(c.sourceApplications)}`,`【同稿实际图件模型】
|
|
17
17
|
${JSON.stringify(c.figures)}`,`【原文与同稿图件证据库】
|
|
18
18
|
${JSON.stringify(c.evidence)}`].join("\n\n"),{maxTokens:Math.max(6e3,(b.criteria.length+(b.sourceAssertions?.length??0))*350),temperature:0,diagnostics:a.diagnostics,signal:a.signal,callKind:"chapter-review",taskKind:(0,h.TO)(),onAttempt:c=>a.onReviewAttempt?.({batchId:b.id,criterionIds:b.criteria.map(a=>a.id),...c}),prefixKey:`contract-review:${b.chapterId??"document"}`,schema:{type:"object",required:["findings",...b.sourceAssertions?.length?["sourceFindings"]:[]],properties:{findings:{type:"array",minItems:b.criteria.length,maxItems:b.criteria.length,items:{type:"object",properties:{criterionIndex:{type:"integer",required:!0},status:{type:"string",required:!0},reason:{type:"string",required:!0},qualityLevel:{type:"string",required:!0,enum:[...g.E3,"unmeasured"]},impact:{type:"string",enum:["blocking","major","minor"]},defectId:{type:"string"},evidenceIndices:{type:"array",required:!0,items:{type:"integer"}}}}},sourceFindings:{type:"array",minItems:b.sourceAssertions?.length??0,maxItems:b.sourceAssertions?.length??0,items:{type:"object",properties:{bindingIndex:{type:"integer",required:!0},status:{type:"string",required:!0},reason:{type:"string",required:!0},referenceOnly:{type:"boolean"},claimCategory:{type:"string",enum:["fact-assertion","conditional-duty","project-adoption","normative-control","unmeasured"]},semanticReview:{type:"object",required:!0,properties:{bodyPurpose:{type:"string",required:!0,enum:["technical","commercial","unmeasured"]},sourcePurpose:{type:"string",required:!0,enum:["technical","commercial","mixed","unmeasured"]},assertionState:{type:"string",required:!0,enum:["project-fact","required-action","planned-action","completed-action","reference-condition","unmeasured"]},sourceState:{type:"string",required:!0,enum:["project-fact","required-action","planned-action","completed-action","reference-condition","unmeasured"]},objectAndConditions:{type:"string",required:!0,enum:["preserved","changed","unmeasured"]},support:{type:"string",required:!0,enum:["supported","unsupported","unmeasured"]},reason:{type:"string",required:!0}}}}}}}}})});await Promise.all(Array.from({length:Math.min(i((0,h.Sq)(),a.contract.chapters.length),w.length)},async()=>{for(;B<w.length;){if(a.signal?.aborted)throw Error("用户中止");let b=B++,c=w[b],d={id:c.id,expectedIds:c.criteria.map(a=>a.id)};try{if(!c.text.trim()||c.missingAuthorContent){A[b]={findings:c.criteria.map(a=>({criterionId:a.id,status:/尚未确认|尚需确认|解析失败/u.test(a.source)?"unmeasured":"not-met",reason:"固定作者模型尚未取得该职责的完整结构化产物;预览占位文字不作为正文"})),receipt:{...d,status:"executed"}};continue}let a=await C(c),e=function(a,b){let c=b&&"object"==typeof b&&Array.isArray(b.findings)?b.findings:[];return a.criteria.map(b=>{let d=c.filter(c=>c&&"object"==typeof c&&(c.criterionId===b.id||c.criterionIndex===a.criteria.indexOf(b)));if(1!==d.length)return{criterionId:b.id,status:"unmeasured",reason:d.length?"评价响应重复该项,不能任选一个结论":"评价响应未返回该项,保留固定分母"};try{let c=d.map(a=>{if(void 0===a.criterionIndex)return a;let{criterionIndex:c,...d}=a;if(void 0!==d.criterionId&&d.criterionId!==b.id)throw Error("评价职责序号与身份不一致");return{...d,criterionId:b.id}});return function(a,b){if(!b||"object"!=typeof b||!Array.isArray(b.findings))throw Error("合同评价响应缺少 findings");let c=b.findings,d=new Map(a.criteria.map(a=>[a.id,a])),e=new Set,f=[];for(let b of c){let c;if(!b||"object"!=typeof b)throw Error("合同评价项不是对象");let h={...b};if(void 0!==b.criterionIndex){if(!Number.isSafeInteger(b.criterionIndex)||0>Number(b.criterionIndex)||Number(b.criterionIndex)>=a.criteria.length||void 0!==b.criterionId&&b.criterionId!==a.criteria[Number(b.criterionIndex)].id)throw Error("评价职责序号越界或与身份不一致");h.criterionId=a.criteria[Number(b.criterionIndex)].id}if(void 0!==b.evidenceIndices){if(void 0!==b.evidenceIds||!Array.isArray(b.evidenceIndices)||new Set(b.evidenceIndices).size!==b.evidenceIndices.length||b.evidenceIndices.some(b=>!Number.isSafeInteger(b)||b<0||b>=(a.evidence?.length??0)))throw Error("评价证据序号无效、重复或越过本份正文");h.evidenceIds=b.evidenceIndices.map(b=>a.evidence[b].id)}if("string"!=typeof h.criterionId||!d.has(h.criterionId)||e.has(h.criterionId))throw Error("合同评价响应包含未知或重复身份");if(!["met","not-met","unmeasured"].includes(h.status)||"string"!=typeof h.reason||!h.reason.trim())throw Error(`合同评价状态或理由不完整:${h.criterionId}`);let i=h.quote;if(void 0!==h.evidenceIds){if(!Array.isArray(h.evidenceIds)||h.evidenceIds.some(a=>"string"!=typeof a)||new Set(h.evidenceIds).size!==h.evidenceIds.length)throw Error(`合同证据ID不合法或重复:${h.criterionId}`);c=h.evidenceIds.map(b=>{let c=a.evidence?.find(a=>a.id===b);if(!c||!Y(a,c))throw Error(`合同评价证据ID不属于本份正文或同稿图件:${h.criterionId}`);return{...c}}),i=c[0]?.text}if(void 0!==i&&("string"!=typeof i||i.length>0&&!a.text.includes(i)&&!(c??[]).some(b=>b.text===i&&Y(a,b))))throw Error(`合同评价引用不在正文或同稿图件中:${h.criterionId}`);if("met"===h.status&&!i?.trim())throw Error(`满足评价项必须有正文证据:${h.criterionId}`);let j=d.get(h.criterionId),k=j.factIds?.some(b=>!a.facts.some(a=>(0,l.vg)(a)===b&&(0,m.j)(a))),n=j.factIds?.length===0||k,o=j.admission?.status==="unmeasured",p=a.authorUnitRanges?[...new Set((c??[]).flatMap(b=>a.authorUnitRanges.filter(a=>b.figureUnitId?b.figureUnitId===a.id:b.start>=a.start&&b.end<=a.end).map(a=>a.id)))]:void 0;f.push(n||o?{criterionId:h.criterionId,status:"unmeasured",reason:n?"必用事实缺少冻结快照中的可核身份,保留评价分母":"该核心维度尚未编译具体适用评价项,不能以正文自评代替规划确认"}:{criterionId:h.criterionId,status:h.status,reason:h.reason,...h.qualityLevel&&[...g.E3,"unmeasured"].includes(h.qualityLevel)?{qualityLevel:h.qualityLevel}:{},...h.defectId?.trim()?{defectId:`${a.sectionId??a.chapterId??"document"}:${h.defectId.trim()}`}:{},...h.impact&&["blocking","major","minor"].includes(h.impact)?{impact:h.impact}:{},...i?{quote:i}:{},...c?{evidenceSpans:c}:{},...p?{authorUnitIds:p}:{}}),e.add(h.criterionId)}if(e.size!==d.size)throw Error(`合同评价返回集合不完整:要求 ${d.size} 项,返回 ${e.size} 项`);return f}({...a,criteria:[b]},{findings:c})[0]}catch(a){return{criterionId:b.id,status:"unmeasured",reason:a instanceof Error?a.message:String(a)}}})}(c,a),f=$(c,a),h=e.filter(a=>"unmeasured"===a.status);A[b]={findings:e,sourceReviews:f,receipt:{...d,status:h.length||f.some(a=>"unmeasured"===a.status)?"unmeasured":"executed",...h.length?{reason:`${h.length}项未判定;其他已验证的单项结论保留`}:{}}}}catch(f){if(a.signal?.aborted)throw f;let e=f instanceof Error?f.message:String(f);A[b]={findings:c.criteria.map(a=>({criterionId:a.id,status:"unmeasured",reason:e})),sourceReviews:$(c,null),receipt:{...d,status:"unmeasured",reason:e}}}}}));let D=e?.findings.filter(a=>!j.has(a.criterionId))??[],E=[...D,...A.flatMap(a=>a.findings)],F=[...(e?.sourceReviews??[]).filter(a=>!w.some(b=>b.sectionId===a.taskId)),...A.flatMap(a=>a.sourceReviews??[])];for(let b of Object.values(a.authorTasks??{}))for(let a of b.decisionRequests)for(let b of a.criterionIds){let c=E.find(a=>a.criterionId===b);c&&"not-met"!==c.status&&(c.status="unmeasured",c.reason=`当前作者产物仍有未解决的技术决定:${a.question};${a.reason}`)}if(a.authorTasks)for(let b of a.contract.sections){let c=a.authorTasks[b.id];if(!c)continue;let d=a.contract.deliveryPolicy?c.units.flatMap(a=>{let b="paragraph"===a.kind?a.text:"table"===a.kind?a.rows.map(a=>Object.values(a.cells).join(" ")).join("\n"):a.nodes.map(a=>a.label).join(" ");return(0,o.G0)(b).map(b=>({message:b,unitId:a.id}))}):[],e=E.find(a=>a.criterionId===`${b.id}:understanding:substance`);if(e&&d.length&&(e.status="not-met",e.reason=d.map(a=>a.message).join(";"),e.authorUnitIds=[...new Set(d.map(a=>a.unitId))]),d.length&&b.contentTypes.includes("method")){let a=new Set([`${b.id}:methods:method:2`,`${b.id}:methods:method:4`,`${b.id}:methods:method:6`]);for(let b of E)a.has(b.criterionId)&&"met"===b.status&&(b.status="not-met",b.reason=`本节工法仍以出处或后续文件替代当前技术决定:${d.map(a=>a.message).join(";")}`,b.authorUnitIds=[...new Set(d.map(a=>a.unitId))])}let f=F.filter(a=>a.taskId===b.id&&"met"!==a.status),g=z[b.id],h=new Set(g?.pendingCriterionIds??[]),i=(g?.qualityIssues??[]).filter(a=>!/^(?:作者任务未覆盖完整评价集合|载体义务必须)/u.test(a));if(i.length)for(let c of a.contract.criteria.filter(a=>a.sectionId===b.id&&"methods"===a.dimension&&h.has(a.id)&&/控制点|参数与依据|控制参数|持续时间及推导依据/u.test(a.description))){let a=E.find(a=>a.criterionId===c.id);a?.status==="met"&&(a.status="unmeasured",a.reason=`本节实际控制或推导登记尚未通过,不能由模型预支依据满足:${i.join(";")}`)}if(f.length)for(let c of a.contract.criteria.filter(a=>a.sectionId===b.id&&"methods"===a.dimension&&/参数与依据|控制参数|持续时间及推导依据/u.test(a.description))){let a=E.find(a=>a.criterionId===c.id);a&&"met"===a.status&&(a.status=f.some(a=>"not-met"===a.status)?"not-met":"unmeasured",a.reason=`本节实际控制决定的来源适用性尚未通过:${f.map(a=>a.reason).join(";")}`)}}if(a.authorTasks&&a.contract.criteria.some(a=>"document:facts:assertions"===a.id&&a.applicable)){let a=[],b=new Map,c=(c,d)=>{let e=b.get(c)??[];e.push(d),b.set(c,e),a.push(`${c}:${d}`)};for(let[a,b]of Object.entries(z))for(let d of b.qualityIssues??[])/^(?:作者任务未覆盖完整评价集合|载体义务必须)/u.test(d)||c(a,d);for(let a of F.filter(a=>"met"!==a.status))c(a.taskId,`来源改写${"not-met"===a.status?"不满足":"未判定"};${a.reason}`);for(let[a,c]of b){let b=E.find(b=>b.criterionId===`${a}:facts:assertions`);b&&(b.status="unmeasured",b.reason=`该任务实际断言的来源核验未完成:${c.join(";")}`)}if(a.length){let b=E.find(a=>"document:facts:assertions"===a.criterionId);b&&(b.status="unmeasured",b.reason=`实际首稿的来源登记未通过核验,不能用模型自评分替代:${a.join(";")}`)}}if(a.authorTasks){let c=a.contract.sections.filter(a=>a.contentTypes.includes("basis"));if(c.length){let d=new Set(c.map(a=>a.id)),e={project:a.projectModel,tasks:Object.entries(a.authorTasks).filter(([a])=>!d.has(a)).map(([a,b])=>({taskId:a,output:b,contentHash:R(b)}))},f=J(e),g=[],h=a=>a.replace(/\s/gu,"").replace(/[-—]/gu,"-").toUpperCase();for(let b of f.uses)for(let c of b.sources){let d=F.find(d=>d.taskId===b.taskId&&d.unitId===b.unitId&&d.rowId===b.rowId&&d.columnKey===b.columnKey&&(d.factId===c.sourceId||d.sourceContextFactId===c.sourceId)&&b.code&&h(d.quote).includes(h(b.code.text))&&function(a,b,c){let d=c.units.find(b=>b.id===a.unitId);if(!d||b.taskId!==a.taskId||b.unitId!==a.unitId||b.rowId!==a.rowId||b.columnKey!==a.columnKey)return!1;let e="paragraph"===d.kind&&"text"===a.field?d.text:"table"===d.kind&&"cell"===a.field?d.rows.find(b=>b.id===a.rowId)?.cells[a.columnKey??""]:"caption"===a.field&&"paragraph"!==d.kind?d.caption:"figure"===d.kind&&a.field.startsWith("node:")?d.nodes.find(b=>`node:${b.id}`===a.field)?.label:"figure"===d.kind&&a.field.startsWith("edge:")?d.edges[Number(a.field.slice(5))]?.label:void 0,f=a.code??a.name;if(!f||void 0===e||e.slice(f.start,f.end)!==f.text)return!1;if(b.textRange)return Number.isSafeInteger(b.textRange.start)&&Number.isSafeInteger(b.textRange.end)&&b.textRange.start>=0&&b.textRange.end<=e.length&&b.textRange.start<=f.start&&b.textRange.end>=f.end;let g=e.indexOf(b.quote);return g>=0&&0>e.indexOf(b.quote,g+1)&&g<=f.start&&g+b.quote.length>=f.end}(b,d,a.authorTasks[b.taskId])&&"met"===d.status&&"normative-control"===d.claimCategory&&d.sourceVersionEligibility?.status==="eligible");d&&g.push({useId:b.id,sourceId:c.sourceId,status:"confirmed",reason:d.reason,reviewId:R([Q,T(a.chapters,a.markdown),d])})}let i=O(b=J({...e,qualifications:g}),c.flatMap(b=>a.authorTasks[b.id]?[a.authorTasks[b.id]]:[]));if(i.length)for(let a of c){let b=E.find(b=>b.criterionId===`${a.id}:facts:basis:1`);b&&(b.status=i.some(a=>"not-met"===a.status)?"not-met":"unmeasured",b.reason=i.map(a=>a.message).join(";"))}for(let a of new Set(b.issues.map(a=>a.taskId))){let c=E.find(b=>b.criterionId===`${a}:facts:assertions`);c&&"not-met"!==c.status&&(c.status="unmeasured",c.reason+=`;规范真实来源或现行适用资格未核定:${b.issues.filter(b=>b.taskId===a).map(a=>a.message).join(";")}`)}if(b.issues.length){let a=E.find(a=>"document:facts:assertions"===a.criterionId);a&&"not-met"!==a.status&&(a.status="unmeasured",a.reason+=`;正文规范引用仍有实际未核事项:${b.issues.map(a=>a.message).join(";")}`)}}}return{version:Q,contractId:a.contract.id,projectSnapshotId:a.projectModel.snapshotId,...a.contract.deliveryPolicy?{deliveryPolicy:a.contract.deliveryPolicy}:{},documentHash:T(a.chapters,a.markdown),modelIdentity:k(a.diagnostics),...a.authorTasks?{authorModelHash:U(a.authorTasks)}:{},scopeHashes:v,findings:E,...F.length?{sourceReviews:F}:{},...b?{normativeUses:b}:{},batches:A.map(a=>a.receipt),...e?{incremental:{previousDocumentHash:e.documentHash,reviewedCriterionIds:[...j],reusedCriterionIds:D.map(a=>a.criterionId)}}:{},score:(0,g._n)(a.contract,E),primary:!0,expertValidated:!1}}var ac=c(73024),ad=c.n(ac),ae=c(76760),af=c.n(ae),ag=c(19898),ah=c(10295);function ai(a,b){return(0,ah.VD)(a,a=>{let c=new Map(a.listIndexSourceStates(b).map(a=>[a.relativePath,a])),d=new Map(a.getPdfSourceCoverageStates(b).map(a=>[a.relativePath,a])),e=new Set(a.listActiveIndexJobPaths([...b])),f=[];for(let g of b){let b=a.getFileParseAttempt(g),h=c.get(g);if(e.has(g)||b?.status==="parsing")f.push({level:"error",message:`资料尚在解析或索引中:${g}`});else if(b?.status==="error")f.push({level:"error",message:`资料最近一次解析失败:${g};${b.error||"须重新解析成功后生成"}${b.recordRetained?"。已保留旧解析供追溯,不能冒充本次解析成功":""}`});else if(!h||"active"!==h.status||h.indexedAt<=0)f.push({level:"error",message:`资料没有有效解析结果:${g};请完成入库后生成`});else{let a=d.get(g);a?.internalPageCountConflict?f.push({level:"error",message:`PDF解析页数与实际引用页号不一致:${g};不能把部分页面当作完整资料,请重新解析`}):a&&!(0,ag.isCompletePdfSourceCoverage)(a.coverage,h.contentHash)?f.push({level:"error",message:`PDF全页读取尚未取得完整且同源的回执:${g};请重新解析当前文件,未处理或失败页面不能默认为成功`}):a&&!(0,ag.isCurrentPdfNativeLayout)(a.nativeLayoutVersion)&&f.push({level:"error",message:`PDF原生文字布局缺少当前版本回执:${g};请重新解析当前PDF,旧原文或OCR覆盖不能代替本次布局`})}}return f})}var aj=c(47262),ak=c(4001),al=c(70769);let am=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function an(a,b,c){let d=k(b),f=a=>{if(!/^[a-f0-9]{64}$/u.test(a))throw Error("当前模型响应缓存输入身份无效");return am({version:c,inputKey:a,model:d})};return{load(b){let d=f(b),e=af().join(a,`${d}.json`);if(!ad().existsSync(e))return;let g=JSON.parse(ad().readFileSync(e,"utf8"));if(g.version!==c||g.cacheKey!==d||am(g.response)!==g.responseSha256)throw Error("当前模型响应缓存身份或内容校验失败");return{response:g.response,receipt:{cacheKey:d,responseSha256:g.responseSha256}}},save(b,d){let g=f(b),h=af().join(a,`${g}.json`);ad().mkdirSync(a,{recursive:!0});let i=`${h}.${process.pid}.${(0,e.randomUUID)()}.tmp`;try{ad().writeFileSync(i,JSON.stringify({version:c,cacheKey:g,responseSha256:am(d),response:d})),ad().renameSync(i,h)}finally{ad().rmSync(i,{force:!0})}}}}let ao=["failed","paused","repairing","blocked","running","pending","completed"];function ap(a,b){return a.seq!==b.seq?a.seq-b.seq:a.id===b.id?0:a.id<b.id?-1:1}let aq=new Set(["prepare","understand","plan","blueprint","write","close","deliver","chapter","block","turn","round","round.decide","round.fix","repair.request","repair.localize","repair.impact","repair.transaction","repair.recheck","supervisor","resume.plan","skill.load"]),ar=new Set(["failed","paused","repairing","blocked","running","pending","completed"]);function as(a){return"string"==typeof a&&ar.has(a)}let at=["id","parentId","type","title","seq","status","startedAt","completedAt","progress","metrics","issues","payloadRef"];class au extends Error{constructor(a,b,c={},d){super(b,d),this.code=a,this.detail=c,this.name="NodeLogError"}}let av=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function aw(a,b){var c;return ae.join((c=b,ae.join(c??j_(),"drafts")),`${ax(a)}.nodes.jsonl`)}function ax(a){if("string"!=typeof a||!av.test(a))throw new au("node-log-doc-id-invalid",`文档 id 不合法:「${String(a)}」(须为字母数字开头、仅含字母数字/._-、长度 ≤128)`);return a}function ay(a){var b;if(!a||"object"!=typeof a)throw new au("node-log-node-invalid","节点必须是对象");let c=new Set(at),d=Object.keys(a).filter(a=>!c.has(a));if(d.length>0)throw new au("node-log-node-invalid",`节点 ${String(a.id)} 含 8.2 之外的字段:${d.join("/")}。硬禁止:节点不得携带载荷(agentWorkflow 已是 p50 2.2 MB / max 94.6 MB)——明细请落 artifacts/<sha256>,节点上只留 payloadRef(附录 F.2)。`);if("string"!=typeof a.id||0===a.id.length)throw new au("node-log-node-invalid","节点 id 不得为空(id 是 rollup 视图的聚合键)");if(void 0!==a.parentId&&("string"!=typeof a.parentId||0===a.parentId.length))throw new au("node-log-node-invalid",`节点 ${a.id} 的 parentId 必须是非空字符串`);if(a.parentId===a.id)throw new au("node-log-node-invalid",`节点 ${a.id} 的 parentId 指向自己(自环会让 children 派生进入死循环)`);if(!("string"==typeof(b=a.type)&&aq.has(b)))throw new au("node-log-node-invalid",`节点 ${a.id} 的 type「${String(a.type)}」不在 附录 D.1 的闭集内`);if(!as(a.status))throw new au("node-log-node-invalid",`节点 ${a.id} 的 status「${String(a.status)}」不是合法状态`);if("string"!=typeof a.title)throw new au("node-log-node-invalid",`节点 ${a.id} 缺 title(8.4 的"这个节点做了什么"要靠它)`);if(!Number.isFinite(a.seq))throw new au("node-log-node-invalid",`节点 ${a.id} 的 seq 必须是有限数(节流会 splice 掉数组位置,顺序只能靠它)`);if(!Number.isFinite(a.startedAt))throw new au("node-log-node-invalid",`节点 ${a.id} 的 startedAt 必须是有限数`);if(void 0!==a.completedAt&&!Number.isFinite(a.completedAt))throw new au("node-log-node-invalid",`节点 ${a.id} 的 completedAt 必须是有限数`)}function az(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||0===a.id.length)throw new au("node-log-node-invalid","status/rollup 事件必须带非空 id(补丁要打在谁身上)");if(void 0!==a.startedAt)throw new au("node-log-node-invalid",`补丁不得改写 ${a.id} 的 startedAt(存在事实,不是状态)`);if(void 0!==a.status&&!as(a.status))throw new au("node-log-node-invalid",`补丁 ${a.id} 的 status「${String(a.status)}」不是合法状态`);let b=new Set([...at,"id"]);b.delete("startedAt");let c=Object.keys(a).filter(a=>!b.has(a));if(c.length>0)throw new au("node-log-node-invalid",`补丁 ${a.id} 含 8.2 之外的字段:${c.join("/")}`)}function aA(a,b){let c,d=ax(a.docId),e=aw(d,b),f=a.t??Date.now();if("upsert"===a.op){var g;ay(a.node),c={v:1,t:f,op:"upsert",node:{id:(g=a.node).id,...void 0!==g.parentId?{parentId:g.parentId}:{},type:g.type,title:g.title,seq:g.seq,status:g.status,startedAt:g.startedAt,...void 0!==g.completedAt?{completedAt:g.completedAt}:{},...void 0!==g.progress?{progress:g.progress}:{},...void 0!==g.metrics?{metrics:g.metrics}:{},...void 0!==g.issues?{issues:g.issues}:{},...void 0!==g.payloadRef?{payloadRef:g.payloadRef}:{}}}}else az(a.node),c={v:1,t:f,op:a.op,node:{...a.node}};let h=`${JSON.stringify(c)}
|
|
19
|
-
`;try{ac.mkdirSync(ae.dirname(e),{recursive:!0}),ac.appendFileSync(e,h,"utf8")}catch(a){throw new au("node-log-write-failed",`节点日志写入失败(S3.2:节点日志是唯一真相源,不可静默丢 ⇒ 停止生成并上报):${e}:${a instanceof Error?a.message:String(a)}`,{docId:d,file:e},{cause:a})}return c}function aB(a,b,c={}){return aA({docId:a,op:"upsert",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function aC(a,b,c={}){return aA({docId:a,op:"status",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function aD(a,b){return function(a,b){let c,d=ax(a),e=aw(d,b);try{c=ac.readFileSync(e,"utf8")}catch(a){if("ENOENT"===a.code)return{nodes:[],records:[],lineCount:0,tornTail:!1};throw a}let f=c.endsWith("\n"),g=!f&&c.length>0,h=c.lastIndexOf("\n"),i=f?c.slice(0,-1):h>=0?c.slice(0,h):"",j=""===i?[]:i.split("\n"),k=[];for(let a=0;a<j.length;a+=1){let b,c=j[a];if(""!==c.trim()){try{b=JSON.parse(c)}catch(b){throw new au("node-log-corrupt",`节点日志第 ${a+1} 行不是合法 JSON(文件损坏或被外部改写):${e}`,{docId:d,file:e,line:a+1},{cause:b})}k.push(function(a,b,c,d){let e=(a,e)=>new au("node-log-corrupt",`节点日志第 ${d} 行${a}:${c}`,{docId:b,file:c,line:d},void 0===e?void 0:{cause:e});if(!a||"object"!=typeof a)throw e("不是对象");if(1!==a.v)throw e(`版本 v=${String(a.v)} 无法识别(本版本只认 1)`);if(!Number.isFinite(a.t))throw e("缺时间戳 t");if("upsert"!==a.op&&"status"!==a.op&&"rollup"!==a.op)throw e(`op「${String(a.op)}」未知`);if(!a.node||"object"!=typeof a.node)throw e("缺 node");try{if("upsert"===a.op)return ay(a.node),{v:1,t:a.t,op:"upsert",node:a.node};return az(a.node),{v:1,t:a.t,op:a.op,node:a.node}}catch(a){throw e(`的 node 不合法(${a instanceof Error?a.message:String(a)})`,a)}}(b,d,e,a+1))}}return{nodes:function(a,b,c){let d=new Map;for(let e of a){if("upsert"===e.op){d.set(e.node.id,{...e.node});continue}let a=d.get(e.node.id);if(!a)throw new au("node-log-patch-target-missing",`${e.op} 事件指向 ${e.node.id},但它没有 upsert(append-only 日志里节点必须先出现):${c}`,{docId:b,file:c});d.set(e.node.id,function(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),function(a){let b=a.progress;return!b||"completed"!==a.status||"number"!=typeof b.total||b.total<=0||"number"!=typeof b.current||b.current>=b.total?a:{...a,progress:{...b,current:b.total}}}(d)}(a,e.node))}return[...d.values()].sort(ap)}(k,d,e),records:k,lineCount:j.length,tornTail:g}}(a,b).nodes}let aE={role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",file_understanding:"项目资料理解",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",llm_review:"独立复核",validation:"规则与准入校验",reference:"资料增强"},aF={"knowledge-base":"知识库","document-readiness":"生成准备度检查","llm-json":"LLM 事实抽取"};function aG(a){return a?aF[a]:void 0}function aH(a,b={}){let c={executionVersion:2,group:a.type,...a,...b},d=c.roleName||aG(c.roleId),e=c.subtitle||d||aG(c.roleId);return{...c,roleName:d,subtitle:e,title:function(a){var b;let c=aE[b=a.type]??b,d=a.subtitle||a.roleName||aG(a.roleId),e=d&&!c.includes(d)?`${c} \xb7 ${d}`:c,f="string"==typeof a.title&&a.title.length>0?a.title:void 0;return f&&f!==c?f:e}({...c,roleName:d,subtitle:e})}}let aI="stage-details";function aJ(a){return a.source===aI}let aK={prepare:{type:"prepare",title:"准备"},understand:{type:"understand",title:"理解资料"},plan:{type:"plan",title:"规划结构"},blueprint:{type:"blueprint",title:"派生蓝图"},write:{type:"write",title:"逐章写作"},close:{type:"close",title:"全篇收口"},deliver:{type:"deliver",title:"交付"}};function aL(a,b,c="completed",d){let e=aK[b];a$(a,{batch:{prepare:"generation.prepare",understand:"generation.understanding",plan:"generation.planning",blueprint:"generation.blueprint",write:"generation.write",close:"finalize.pipeline",deliver:"finalize.delivery"}[b],id:aM(b),type:e.type,title:e.title,status:c,..."string"==typeof d&&d.length>0?{metrics:aZ(d)}:{}})}function aM(a){return`phase:${a}`}function aN(a){return`chapter:${a}`}let aO={running:"running",success:"completed",failed:"failed",partial:"repairing",skipped:"blocked"};function aP(a,b={}){let c;try{c=aD(a,b.baseDir)}catch{return 0}let d=new Map;for(let a of c){if(!a?.id)continue;let b=d.get(a.id);d.set(a.id,b?{...b,...a}:a)}let e=new Map;for(let a of d.values())a.parentId&&e.set(a.parentId,[...e.get(a.parentId)??[],a]);let f=new Set(["round.decide"]),g=0,h=Date.now(),i=[...d.values()].filter(a=>!aQ.has(a.status));if(0===i.length)return 0;let j=a=>{let b=0,c=a;for(;c.parentId&&d.has(c.parentId)&&b<64;)c=d.get(c.parentId),b+=1;return b},k=[...i].sort((a,b)=>j(b)-j(a)),l=new Map,m=a=>l.get(a.id)??a.status;for(let c of k){let d=e.get(c.id)??[];if(0===d.length){let d=b.documentOutcome?f.has(c.type)&&"completed"===b.documentOutcome?"completed":"completed"===b.documentOutcome?"blocked":b.documentOutcome:f.has(c.type)?"completed":"running";if("running"===d)continue;aC(a,{id:c.id,status:d,completedAt:h,metrics:b.documentOutcome?{closedBySweep:!0,closedAtDocumentEnd:!0,documentOutcome:b.documentOutcome}:{closedBySweep:!0,closedRecordNode:!0}},{baseDir:b.baseDir}),l.set(c.id,d),g+=1,b.documentOutcome;continue}if(d.some(a=>!aQ.has(m(a))))continue;let i=function(a){let b,c=1/0;for(let d of a){let a=function(a){let b=ao.indexOf(a);return b>=0?b:0}(d);a<c&&(c=a,b=d)}return b}(d.map(a=>m(a)))??"completed";aC(a,{id:c.id,status:i,completedAt:h,metrics:{closedBySweep:!0,closedChildren:d.length,...b.documentOutcome?{closedAtDocumentEnd:!0}:{}}},{baseDir:b.baseDir}),l.set(c.id,i),g+=1}return g}let aQ=new Set(["completed","failed","blocked","paused"]),aR={"generation.prepare":{phase:"prepare",typeByStageType:{role_binding:"prepare",validation:"prepare",file_understanding:"prepare"},fallbackType:"prepare"},"generation.understanding":{phase:"understand",typeByStageType:{knowledge_retrieval:"understand",file_understanding:"understand",fact_extraction:"understand",validation:"understand",reference:"understand"},fallbackType:"understand"},"generation.planning":{phase:"plan",typeByStageType:{validation:"plan",role_binding:"plan",knowledge_retrieval:"plan",fact_extraction:"plan"},fallbackType:"plan"},"generation.blueprint":{phase:"blueprint",typeByStageType:{validation:"blueprint",file_understanding:"blueprint",chapter_generation:"blueprint"},fallbackType:"blueprint"},"generation.write":{phase:"write",typeByStageType:{chapter_generation:"write",knowledge_retrieval:"understand"},fallbackType:"write"},"finalize.rebuild":{phase:"close",typeByStageType:{validation:"close",fact_extraction:"close",reference:"close",knowledge_retrieval:"close"},fallbackType:"close"},"finalize.delivery":{phase:"deliver",typeByStageType:{validation:"deliver",reference:"deliver",fact_extraction:"deliver"},fallbackType:"deliver"},"finalize.pipeline":{phase:"deliver",typeByStageType:{reference:"deliver",validation:"deliver",fact_extraction:"deliver"},fallbackType:"deliver"},"document.lifecycle":{phase:"prepare",typeByStageType:{validation:"prepare",reference:"prepare"},fallbackType:"prepare"}};function aS(a){let b=a.replace(/[^A-Za-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"");return b.length>0?b.slice(0,48):"none"}function aT(a){let b=0x811c9dc5;for(let c=0;c<a.length;c+=1)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193)>>>0;return b.toString(16).padStart(8,"0")}function aU(a){return"chapter_generation"===a.type||/^agent-chapter-task-/u.test(a.roleId||"")}let aV=globalThis,aW=aV.__customizeAgentNodeLedgers??=new Map;function aX(a,b){let c=aw(a,b),d=aW.get(c);if(d&&(0,ac.existsSync)(c))return d;let e=aD(a,b),f=new Map,g=0;for(let a of e)f.set(a.id,a.seq),Number.isFinite(a.seq)&&(g=Math.max(g,a.seq+1));let h={nodes:new Map(e.map(a=>[a.id,a])),seqById:f,nextSeq:g};return aW.set(c,h),h}function aY(a){return"string"==typeof a.title&&a.title.length>0?a.title:String(a.type)}function aZ(a){return"string"!=typeof a||0===a.length?{}:a.length<=160?{note:a,noteChars:a.length}:{note:`${a.slice(0,160)}…`,noteChars:a.length}}function a$(a,b){let c=function(a){let b=aR[a];if(!b)throw new au("node-log-node-invalid",`批次「${String(a)}」未在迁移台账内(S10.1:逐批迁移)。要迁移新的一批:先在 emitNode.ts 的台账注释与 EMIT_NODE_BATCHES 里登记,再改调用点——半个批次(同一事实两个写入者)比不迁移更糟。`);return b}(b.batch),d=b.stage,e=b.baseDir??a.nodeLogBaseDir??a.global?.nodeLogBaseDir,f=function(a){let b="string"==typeof a.documentId&&a.documentId.length>0?a.documentId:void 0,c=a.global?.input?.documentId;return b??("string"==typeof c&&c.length>0?c:void 0)}(a),g=f?aX(f,e):void 0,h=d?.roleId,i=b.round,j=b.type??(h&&void 0!==i?"round":void 0)??c.typeByStageType[d?.type??""]??c.fallbackType,k=b.title??(h&&void 0!==i?d?.subtitle??(d?aY(d):void 0):void 0)??(d?aY(d):void 0)??String(j),l=void 0!==i&&i>1&&!k.includes(`第 ${i} 轮`)?`${k} \xb7 第 ${i} 轮`:k,m=b.status??(d?aO[d.status]:void 0)??"running",n=b.progress??d?.progress,o=n&&"completed"===m&&"number"==typeof n.total&&n.total>0&&"number"==typeof n.current&&n.current<n.total?{...n,current:n.total}:n,p=b.issues??function(a){let b=a?.details;if(Array.isArray(b)&&0!==b.length)return b.map(a=>({level:"info",message:a,source:aI}))}(d),q={...aZ(d?.message),...d?{stageType:d.type,stageRoleId:d.roleId||"",...void 0!==d.promptId?{stagePromptId:d.promptId}:{},...void 0!==d.subtitle?{stageSubtitle:d.subtitle}:{},...void 0!==d.order?{stageOrder:d.order}:{}}:{},...void 0!==i?{roundIteration:i}:{},...b.metrics??{}};if(!f||!g)return{...void 0!==i?{round:i}:{},skippedNodes:"no-doc-id"};let r=b.id??(d?h&&void 0!==i?`round:${h}`:`st.${aS(d.type)}.${aS(d.roleId||"none")}.${aT(aU(d)?[d.type,d.roleId||"",d.promptId||"",d.subtitle||"",d.order??""].join("::"):[d.type,d.roleId||"",d.promptId||""].join("::"))}`:`${aS(j)}.${aT(`${b.parentId??aM(c.phase)}::${l}`)}`),s=b.chapterId??(d&&aU(d)?function(a){let b=/^agent-chapter-task-(.+)$/u.exec(a.roleId||"");return b?.[1]}(d):void 0),t=b.parentId??(s?aN(s):void 0)??aM(c.phase),u=e?{baseDir:e}:{},v=t.startsWith("chapter:")?b.chapterTitle:t.startsWith("round:")?b.parentTitle??d?.subtitle??d?.title:b.parentTitle;!function a(b,c,d,e){if(d.nodes.has(c))return;let f=function(a){let b=/^phase:(.+)$/u.exec(a);if(b){let a=aK[b[1]];if(a)return{type:a.type,title:a.title}}return a.startsWith("chapter:")?{type:"chapter",title:a.slice(8),parentId:aM("write")}:a.startsWith("round:")?{type:"round",title:a.slice(6),parentId:aM("close")}:void 0}(c);if(!f)throw new au("node-log-node-invalid",`parentId「${c}」不是本桥认识的结构化 id(phase:* / chapter:* / round:* 三种前缀)。裸 id 的父节点必须先由某个调用点自己 emit 出来——否则补丁会打在空气上(node-log-patch-target-missing)。要新增结构层:在 parseStructuralId 与 PHASE_ROOTS 里显式登记,不要就地拼字符串。`);f.parentId&&a(b,f.parentId,d,{baseDir:e.baseDir});let g=d.nextSeq;d.nextSeq+=1;let h={id:c,...void 0!==f.parentId?{parentId:f.parentId}:{},type:f.type,title:e.title??f.title,seq:g,status:"running",startedAt:Date.now()};aB(b,h,e.baseDir?{baseDir:e.baseDir}:{}),d.nodes.set(h.id,h),d.seqById.set(h.id,g)}(f,t,g,{...void 0!==v?{title:v}:{},...u});let w=g.nodes.get(r),x=b.startedAt??w?.startedAt??Date.now(),y=void 0!==w&&!aQ.has(w.status),z=aQ.has(m)&&!y,A=b.completedAt??(aQ.has(m)?z?x:Date.now():void 0),B=z?{...q,instantEvent:!0}:q;if(w){let a={id:r,status:m,...w.title!==l?{title:l}:{},...void 0!==o?{progress:o}:{},...Object.keys(B).length>0?{metrics:B}:{},...void 0!==p?{issues:p}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{},...void 0!==A?{completedAt:A}:{}};aC(f,a,u),g.nodes.set(r,a_(w,a))}else{let a={id:r,parentId:t,type:j,title:l,seq:g.nextSeq,status:m,startedAt:x,...void 0!==A?{completedAt:A}:{},...void 0!==o?{progress:o}:{},...Object.keys(B).length>0?{metrics:B}:{},...void 0!==p?{issues:p}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{}};return aB(f,a,u),g.seqById.set(r,a.seq),g.nextSeq+=1,g.nodes.set(r,a),{nodeId:r,seq:a.seq,status:m,...void 0!==i?{round:i}:{}}}return{nodeId:r,seq:g.seqById.get(r)??w.seq,status:m,...void 0!==i?{round:i}:{}}}function a_(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),d}var a0=c(42948),a1=c(73055),a2=c(86282),a3=c(5518),a4=c(9848);function a5(a,b,c){let d=a.readSnapshot(()=>{if(!Object.hasOwn(b.sources,c.filePath))throw Error("视图文件不属于冻结项目");let d=a.parsedFileFingerprint(c.filePath);if(d.sha256!==b.sources[c.filePath].sha256)throw Error("视图解析身份已经变化,不能与旧项目绑定");let e=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(e?.version!==ag.CAD_SCENE_VERSION)throw Error("视图场景版本不兼容");if(!a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload)throw Error("视图图框身份不存在");return{actual:d,scene:a.loadCadScene(c.filePath)}}),e=(0,ag.renderCadSourceView)(d.scene,c);return{...e,receipt:{...e.receipt,filePath:c.filePath,projectSnapshotId:b.snapshotId,parsedIdentity:d.actual.sha256,frameEntities:e.receipt.visibleAnnotations.length,recordsComplete:!0,completeScope:"projected-geometry-and-indexed-annotations-assigned-to-selected-frame",unassignedEntitiesIncluded:!1}}}function a6(a,b,c){return a.readSnapshot(()=>{if(!c||"string"!=typeof c.filePath||!Object.hasOwn(b.sources,c.filePath))throw Error("CAD证据文件不属于冻结项目");let d=a.parsedFileFingerprint(c.filePath);if(d.sha256!==b.sources[c.filePath].sha256)throw Error("CAD证据解析身份已经变化");let e=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(e?.version!==ag.CAD_SCENE_VERSION)throw Error("CAD证据结构版本不兼容");let f=a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload;if(!f)throw Error("CAD证据的真实图框不存在");if("string"!=typeof c.rawValue||!/^[+−-]?\d+(?:\.\d+)?$/u.test(c.rawValue.trim()))throw Error("CAD单值须为一个实际数字,不得取范围端点或解析显示字符串猜值");if("string"!=typeof c.valueEntityId||!Array.isArray(c.unitEntityIds)||!c.unitEntityIds.length||!Array.isArray(c.scopeEntityIds)||!c.scopeEntityIds.length)throw Error("CAD单值、单位和部位定位须完整且不重复");let g=[c.valueEntityId,...c.unitEntityIds,...c.scopeEntityIds];if(g.length>12||g.some(a=>"string"!=typeof a)||new Set(g).size!==g.length)throw Error("CAD单值、单位和部位定位须完整且不重复");let h=g.map(b=>{let d=a.queryMaterialEntityPage(c.filePath,{kind:"cad-entity",entityId:b,offset:0,limit:1}).records[0]?.payload;if(!d||d.sheet!==c.frameId||Array.isArray(d.sheetCandidates)&&d.sheetCandidates.length>1)throw Error("CAD实体不属于同一明确图框,不能跨图或跨歧义对象绑定");return d}),i=h[0];if("string"!=typeof i.text||i.text.trim()!==c.rawValue.trim())throw Error("CAD数值不是实际标注的完整原文;未确认格式码或复合值须先解释");return{projectSnapshotId:b.snapshotId,filePath:c.filePath,parsedIdentity:d.sha256,sceneVersion:e.version,frame:f,value:i,unitAnnotations:h.slice(1,1+c.unitEntityIds.length),scopeAnnotations:h.slice(1+c.unitEntityIds.length),sourceQuality:e.quality,drawingCoordinateUnits:e.units,applicability:"not-evaluated",approvedForWriting:!1}})}async function a7(a){let b=a.candidate;if(!b||!["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"].includes(b.attribute)||!["m","mm","cm"].includes(b.unit)||!b.objectName?.trim()||b.objectName.length>300||!b.condition?.trim()||b.condition.length>1e3)throw Error("几何候选属性、对象、工况或单位无效");if(/^(?:[\dA-Za-z\s\-—~~]+)?(?:剖面(?:图)?|截面(?:图)?|详图|平面图)(?:[((][^))]*[))])?$/u.test(b.objectName.trim())||/^(?:场地整平后高程|场地整平后标高|开挖面高程|开挖面标高|坑底标高|桩长|桩径)$/u.test(b.objectName.trim()))throw Error("图名、剖面编号或属性名不能代替实际施工部位,须继续核对区段/构件对应关系");let c=a.readEvidence(b.evidence);if(c.projectSnapshotId!==a.project.snapshotId||c.parsedIdentity!==a.project.sources[b.evidence.filePath]?.sha256)throw Error("几何证据与当前冻结项目不一致");if(!c.unitAnnotations.some(a=>"string"==typeof a.text&&a.text.trim()===b.unit))throw Error("候选单位没有实际单位文字实体支持,不能从INSUNITS或制图惯例猜值");if(!a.views.length||a.views.length>4||a.views.some(d=>d.receipt.parsedIdentity!==c.parsedIdentity||d.receipt.filePath!==c.filePath||d.receipt.frameId!==b.evidence.frameId||d.receipt.projectSnapshotId!==a.project.snapshotId))throw Error("几何复核视图不属于同一冻结来源身份");let d=new Set(a.views.flatMap(a=>a.receipt.visibleAnnotations.map(a=>a.id))),f=[b.evidence.valueEntityId,...b.evidence.unitEntityIds,...b.evidence.scopeEntityIds];if(f.some(a=>!d.has(a)))throw Error("数值、单位说明和部位实体必须在已提供视图中可核对,不能用未看的节点补成完整关系");let g=JSON.stringify({task:"独立审核图示工程属性,不代写正文",candidate:b,sourceEvidence:c,views:a.views.map(a=>({...a.receipt,sourceQuality:void 0,visibleAnnotations:a.receipt.visibleAnnotations.filter(a=>f.includes(a.id)),visibleAnnotationCount:a.receipt.visibleAnnotations.length,renderingLimitations:a.receipt.renderingLimitations})),instructions:'逐项确认实际数值、单位文字及其适用符号、真实施工部位、施工工况和属性。必须核对剖面编号与实际区段/构件的对应关系;只知道来源剖面、不知道施工部位不能confirmed。同图框相邻不证明属于同一对象,主体开挖面、板顶/支撑标高、垫层底和排水沟底不得混用;图框或图例无法辨认、单位只靠惯例、局部值推广全工程、阶段关系未核或被省略实体影响判断,返回unmeasured/rejected。不要由绘图坐标差计算工程值。只返回JSON {status:"confirmed"|"rejected"|"unmeasured",reason:"具体依据与限制"}。'}),h=await a.reviewer({prompt:g,images:a.views.map((a,b)=>({name:`同一真实图框局部${b+1}`,png:a.png}))});if(!h||!["confirmed","rejected","unmeasured"].includes(String(h.status))||"string"!=typeof h.reason||!h.reason.trim())throw Error("独立几何复核结果无效");return a.readEvidence(b.evidence),{candidate:b,proof:c,review:{status:h.status,reason:h.reason},sourceViewHashes:a.views.map(a=>(0,e.createHash)("sha256").update(a.png).digest("hex")),normalizedValue:"confirmed"===h.status?`${b.evidence.rawValue.trim()}${b.unit}`:null,approvedForWriting:"confirmed"===h.status,expertValidated:!1}}function a8(a){if(!a.approvedForWriting||"confirmed"!==a.review.status||!a.normalizedValue)return;let{candidate:b,proof:c}=a;if(a.normalizedValue!==`${b.evidence.rawValue.trim()}${b.unit}`||64!==c.parsedIdentity.length)throw Error("已复核CAD属性的值或解析身份不一致");let d={ground_elevation:"场地整平后地面标高",pit_bottom_elevation:"主体开挖面标高",foundation_elevation:"基础控制标高",pile_length:"桩长",pile_diameter:"桩径"},f={parsedIdentity:c.parsedIdentity,frameId:b.evidence.frameId,valueEntityId:b.evidence.valueEntityId,rawValue:b.evidence.rawValue,unit:b.unit,unitEntityIds:[...b.evidence.unitEntityIds],scopeEntityIds:[...b.evidence.scopeEntityIds],condition:b.condition,reviewReason:a.review.reason,sourceViewHashes:[...a.sourceViewHashes]};return{factId:`cad-reviewed:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,b.attribute,b.objectName,a.normalizedValue,f])).digest("hex").slice(0,24)}`,fieldId:b.attribute,fieldName:d[b.attribute],key:d[b.attribute],objectName:b.objectName,value:a.normalizedValue,sourceFile:c.filePath,roleId:"cad-reviewed-geometry",processingType:"drawing",confidence:.9,sourceRef:{filePath:c.filePath,roleId:"cad-reviewed-geometry",sourceSpan:b.evidence.rawValue,cadInterpretation:f}}}let a9=a=>a?JSON.parse(a.replace(/^\s*```(?:json)?\s*/u,"").replace(/\s*```\s*$/u,"")):void 0,ba=["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"],bb=(a,b,c)=>{if(!Object.hasOwn(b.sources,c)||a.parsedFileFingerprint(c).sha256!==b.sources[c].sha256)throw Error("CAD准备期间解析来源已变化")};async function bc(a){let b,c=[],d=[],f=a.caller??h.rI,g=ba.filter(b=>a.requestedAttributes.includes(b));if(!g.length||!a.filePaths.length)return{facts:c,readings:d,complete:!1};let i=a.read(b=>b.readSnapshot(()=>a.filePaths.map(c=>{bb(b,a.project,c);let d=b.loadMaterialEntities(c,"cad-scene-quality")[0]?.payload;if(d?.version!==ag.CAD_SCENE_VERSION)return{filePath:c,frames:[],complete:!1,reason:"结构版本尚未支持当前图示复核"};let e=b.queryMaterialEntityPage(c,{kind:"cad-frame",offset:0,limit:24}),f=[...e.records];for(let a=24;a<Math.min(e.total,96);a+=24)f.push(...b.queryMaterialEntityPage(c,{kind:"cad-frame",offset:a,limit:24}).records);return{filePath:c,frames:f.map(a=>{let b=a.payload;return{id:b.id,title:b.title,name:b.name,drawingNumber:b.drawingNumber}}),complete:f.length===e.total}})));if(i.every(a=>0===a.frames.length))return d.push(...i.map(a=>({filePath:a.filePath,status:"unmeasured",reason:a.reason??"当前解析没有可供图像复核的实际图框;须通过真实根实例读取标注并继续核对对象和工况,不能据此认定工程属性不存在",catalogComplete:a.complete}))),{facts:c,readings:d,complete:!1};let j=0;try{b=a9(await f("你是工程资料读图智能体,选择真实图框以准备施工控制属性。",JSON.stringify({requestedAttributes:g,catalog:i,instructions:"只选择与请求属性有关的真实图框,最多四个;剖面、详图和平面按实际图名及部位综合判断。目录截断或资料尚未理解不代表没有参数。仅返回JSON {frames:[{filePath,frameId,attributes:[]}]};不得自造ID,不取数字、不写施工正文。"}),!0,{diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:2e3}));let e=b?.frames;if(!Array.isArray(e)||e.length>4)throw Error("读图选择没有返回有限的实际图框");let h=e.map(a=>{if(!i.some(b=>b.filePath===a.filePath&&b.frames.some(b=>b.id===a.frameId))||!Array.isArray(a.attributes)||!a.attributes.length||a.attributes.some(a=>!g.includes(a)))throw Error("读图选择超出实际目录或请求属性");return a});if(new Set(h.map(a=>JSON.stringify([a.filePath,a.frameId]))).size!==h.length)throw Error("读图选择重复,不能对同图框重复消耗模型预算");let k=h.map(a=>({selection:a,status:"unmeasured"}));d.push(...k);let l=0;await Promise.all(Array.from({length:Math.min(2,h.length)},async()=>{for(;l<h.length;){let b=l++,d=h[b];a.signal?.throwIfAborted();let e=k[b];try{let b=a.read(b=>b.readSnapshot(()=>{bb(b,a.project,d.filePath);let c=b.queryMaterialEntityPage(d.filePath,{kind:"cad-frame",entityId:d.frameId,offset:0,limit:1}).records[0]?.payload,e=b.loadCadScene(d.filePath);if(!c)throw Error("图框身份失效,不能以不完整标注确认控制值");let f=c.polygon,g={minX:Math.min(...f.map(a=>a.x)),maxX:Math.max(...f.map(a=>a.x)),minY:Math.min(...f.map(a=>a.y)),maxY:Math.max(...f.map(a=>a.y))},h=e.annotations.filter(a=>a.sheet===d.frameId&&a.text.trim()).map(a=>({id:a.id,text:a.text,position:a.position}));return{bounds:g,annotations:h}}));if(JSON.stringify(b.annotations).length>16e4)throw Error("图框文字超过当前完整理解预算,需进一步分区取证");let g=a.read(b=>a5(b,a.project,{filePath:d.filePath,frameId:d.frameId,width:3200,fontPath:a.fontPath})),h=(b.bounds.minX+b.bounds.maxX)/2,i=(b.bounds.minY+b.bounds.maxY)/2,k=[{minX:b.bounds.minX,maxX:h,minY:i,maxY:b.bounds.maxY},{minX:h,maxX:b.bounds.maxX,minY:i,maxY:b.bounds.maxY},{minX:b.bounds.minX,maxX:h,minY:b.bounds.minY,maxY:i},{minX:h,maxX:b.bounds.maxX,minY:b.bounds.minY,maxY:i}].map(b=>a.read(c=>a5(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath}))),l=await f("你是施工技术资料读图智能体。候选必须指向实际原始实体,不能靠数字相邻猜工程属性。",JSON.stringify({selection:d,sourceView:{...g.receipt,sourceQuality:void 0,visibleAnnotations:void 0},annotations:b.annotations,actualScalarAnnotations:b.annotations.filter(a=>/^[+−-]?\d+(?:\.\d+)?$/u.test(String(a.text).trim())),partitions:k.map((a,b)=>({imageIndex:b,viewport:a.receipt.viewport})),instructions:"四张图按左上、右上、左下、右下完整分区读取,属于同一真实图框。结合图形、标高符号、单位说明和文字定位实际施工部位与工况;剖面编号只是来源定位,objectName须写对应区段/构件等实际工程对象,不得仅用“4-4剖面”或“开挖面高程”充当施工对象。scopeEntityIds须同时包含真实部位与解释施工工况的实体。主体垫层底、支撑、结构板、排水沟底及局部刻槽不能互换。每个对象分别提出明确属性候选,最多六条。图例xx.xxx是示意占位符,不是工程值。单位须有m/mm/cm实际独立文字实体;裸数值须完整标注原文,不取范围端点,不据绘图坐标相减。仅返回JSON {candidates:[{attribute,objectName,condition,unit,evidence:{valueEntityId,rawValue,unitEntityIds:[],scopeEntityIds:[]}}],unresolved:[]},文件和图框由当前读取上下文固定,不重复抄写地址。图像无法辨认或部位关系未核清时保留unresolved,不编造结论。"}),!0,{files:k.map((a,b)=>({name:`同一实际图框分区${b+1}`,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:6500});e.rawDiscovery=l;let m=a9(l);e.discovery=m;let n=m?.candidates;if(!Array.isArray(n)||n.length>6)throw Error("图示候选超出本次理解预算或协议");let o=a=>{if(!a.evidence||void 0!==a.evidence.filePath&&a.evidence.filePath!==d.filePath||void 0!==a.evidence.frameId&&a.evidence.frameId!==d.frameId)throw Error("候选声明了本次读取之外的来源");let b=a.objectName?.split(/[//]/u).map(a=>a.trim()).filter(Boolean)??[],c=b.filter(a=>!/^[\dA-Za-z\s\-—~~]+剖面(?:图)?$/u.test(a)),e=b.length>1&&c.length&&c.length<b.length?c.join("/"):a.objectName;return{...a,objectName:e,evidence:{...a.evidence,filePath:d.filePath,frameId:d.frameId}}},p=n.map(o),q=p.flatMap((b,c)=>{try{if(!a.read(c=>a6(c,a.project,b.evidence)).unitAnnotations.some(a=>String(a.text).trim()===b.unit))throw Error("单位未指向实际m/mm/cm文字实体");if(/^(?:[\dA-Za-z\s\-—~~]+)?剖面(?:图)?$/u.test(b.objectName))throw Error("仅定位来源剖面,尚未对应到实际施工区段");return[]}catch(a){return[{index:c,reason:a instanceof Error?a.message:String(a)}]}});if(q.length){let c=await f("你是工程读图智能体,纠正本次真实来源读取提案,不能编造数值、单位或部位。",JSON.stringify({selection:d,previousCandidates:p,rejectedCandidates:q,actualScalarAnnotations:b.annotations.filter(a=>/^[+−-]?\d+(?:\.\d+)?$/u.test(String(a.text).trim())),annotations:b.annotations,instruction:"只提出有实际图示支持的完整工程属性候选;xx.xxx是图例占位,范围不能取端点。剖面编号须对应实际区段/构件,单位须提供实际单位及说明实体,工况须区分主体和局部。无依据的保留unresolved;不要为补齐数量填数。仅返回JSON {candidates:[{attribute,objectName,condition,unit,evidence:{valueEntityId,rawValue,unitEntityIds:[],scopeEntityIds:[]}}],unresolved:[]}。"}),!0,{files:k.map((a,b)=>({name:`原实际图框分区${b+1}`,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:6500});e.refinement={defects:q,raw:c};let g=a9(c)?.candidates;if(!Array.isArray(g)||g.length>6)throw Error("写前图示纠正未返回完整候选,未执行属性准入");p=g.map(o)}let r=[];for(let g of(e.results=r,p))try{if(j>=12)throw Error("本轮图示候选复核预算已用完,该候选未测量");if(g.evidence?.filePath!==d.filePath||g.evidence?.frameId!==d.frameId||!d.attributes.includes(g.attribute))throw Error("图示候选跨来源、图框或属性");let e=a.read(b=>a6(b,a.project,g.evidence)),h=[e.value,...e.unitAnnotations,...e.scopeAnnotations].map(a=>a.position),i=(function(a,b){if(!b.length||b.some(a=>!Number.isFinite(a.x)||!Number.isFinite(a.y)))throw Error("局部阅读缺少实际实体位置");let c=Math.max(a.maxX-a.minX,a.maxY-a.minY);if(!Number.isFinite(c)||c<=0)throw Error("图框范围无效");let d=[];for(let a of b){let b=d.find(b=>b.every(b=>Math.hypot(b.x-a.x,b.y-a.y)<=.24*c));b?b.push(a):d.push([a])}if(d.length>4)throw Error("数值与单位、部位的图示关系需要超过四个局部,保留未决而不截去限定");return d.map(a=>{let b=Math.min(...a.map(a=>a.x)),d=Math.max(...a.map(a=>a.x)),e=Math.min(...a.map(a=>a.y)),f=Math.max(...a.map(a=>a.y)),g=Math.max(d-b+.08*c,.22*c),h=Math.max(f-e+.08*c,.28*g);return{minX:(b+d-(g=Math.max(g,.8*h)))/2,maxX:(b+d+g)/2,minY:(e+f-h)/2,maxY:(e+f+h)/2}})})(b.bounds,h).map(b=>a.read(c=>a5(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath})));j+=1;let k=await a7({project:a.project,candidate:g,views:i,readEvidence:b=>a.read(c=>a6(c,a.project,b)),reviewer:async b=>a9(await f("你是独立工程读图复核智能体,复验候选的真实适用关系。",b.prompt,!0,{files:b.images.map(a=>({name:a.name,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:3e3}))});r.push(k);let l=a8(k);l&&c.push(l)}catch(b){a.signal?.throwIfAborted(),r.push({candidate:g,status:"unmeasured",reason:b instanceof Error?b.message:String(b)})}e.status="reviewed"}catch(b){a.signal?.throwIfAborted(),e.reason=b instanceof Error?b.message:String(b)}}}))}catch(c){a.signal?.throwIfAborted(),d.push({status:"unmeasured",selection:b,reason:c instanceof Error?c.message:String(c)})}return{facts:[...new Map(c.map(a=>[(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),a])).values()].sort((a,b)=>a.factId.localeCompare(b.factId)),readings:d,complete:!1}}var bd=c(36594);let be=a=>!!a&&"object"==typeof a&&!Array.isArray(a),bf=a=>"string"==typeof a&&!!a.trim(),bg=a=>Array.isArray(a)?a.map(bg):be(a)?Object.fromEntries(Object.keys(a).sort().filter(b=>void 0!==a[b]).map(b=>[b,bg(a[b])])):a,bh=a=>{let b;return b=JSON.stringify(bg(a)),(0,e.createHash)("sha256").update(b).digest("hex")},bi="project-model-v11-shared-attributes-2026-10-13",bj=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function bk(a){let b=(0,l.nD)(a)?.key,c=a.value;if("schedule_requirement"===b){let a=[...c.matchAll(/\d+(?:\.\d+)?\s*(?:日历天|工作日|天|个月|月)/gu)];1===a.length&&(c=a[0][0].replace(/\s+/gu,""))}return"owner"===b&&(c=c.split(/(?:办公|联系)?地址\s*[::]/u)[0].replace(/[((]\s*$/u,"").trim()),c===a.value?a:{...a,value:c,sourceRef:a.sourceRef?{...a.sourceRef,sourceSpan:a.sourceRef.sourceSpan??a.value}:void 0}}async function bl(a){let b=a.global.input.signal;(0,a1.Te)(b);let c=[...new Set(a.prepare.materialFilePaths)].sort(),f=ai(a.prepare.projectRoot,c);if(f.length)throw Error(`项目资料解析检查未通过:${f.map(a=>a.message).join(";")}`);let g=await (0,ah.E8)(a.prepare.projectRoot,c,b),h=c.flatMap(b=>a.understanding.project.listEvidenceChunks({relativePath:b}).map(c=>({chapterId:"project-model",filePath:b,content:c.content,sectionTitle:c.sectionTitle,chunkIndex:c.chunkIndex,roleId:a.understanding.fileRoleByPath.get(b),processingType:a.understanding.fileProcessingByPath.get(b),score:1,source:"parsed-project-model"}))),i=(0,ah.VD)(a.prepare.projectRoot,a=>a.listIndexSourceStates(c)),j=(0,s.cW)(af().join(j_(a.prepare.projectRoot),"assets","source-editions")),m=(0,s.mb)(c.map(b=>({sourceFile:b,parsedSha256:g[b].sha256,sourceSha256:i.find(a=>a.relativePath===b).contentHash,sourceKind:a.prepare.kindByPath?.get(b),processingType:h.some(a=>a.filePath===b&&/(?:^|\n)\s*\|[^\n]+\|\s*\n\s*\|[ :|-]+\|/u.test(a.content))?"table":a.understanding.fileProcessingByPath.get(b),chunks:h.filter(a=>a.filePath===b).map(a=>({chunkIndex:a.chunkIndex,content:a.content}))})),j.confirmations,j.assets),n=(0,al.Zh)(a.prepare.template,a.prepare.documentSpec).filter(b=>{let c=a.planning.requiredContentNeeds?.[b.name];return!c||"project-fact"===c.kind}),o=k(a.planning.generationDiagnostics),p=(0,aj.C)("projectFacts"),q=af().join(j_(a.prepare.projectRoot),"assets","reviewed-cad"),r=ad().existsSync(q)?ad().readdirSync(q).filter(a=>/^[0-9a-f]{64}\.json$/u.test(a)).sort().map(a=>[a,(0,e.createHash)("sha256").update(ad().readFileSync(af().join(q,a))).digest("hex")]):[],t=bj({version:bi,targets:n,localFactTargets:(0,al.Uy)(a.prepare.template,a.prepare.documentSpec),domain:a.prepare.domainProfile,prompt:a.prepare.factExtractionPromptTexts,modelIdentity:o,algorithmIdentity:p,registeredCadAssets:r,extractionTuning:{maxChars:(0,a2.z)().factExtractionMaxChars}}),u=bj({sources:g,contextHash:t,sourceVersionPolicyId:m.policyId}),v=af().join(j_(a.prepare.projectRoot),"project-model-cache",`${u}.json`);if(p&&ad().existsSync(v))try{let a=JSON.parse(ad().readFileSync(v,"utf8")),b=a.data;if(!b||bj(b)!==a.sha256)throw Error("项目事实缓存内容校验不通过");if(b.version===bi&&b.inputHash===u&&bj(b.sources)===bj(g)&&b.sourceVersionPolicy?.policyId===m.policyId&&Array.isArray(b.facts)&&Array.isArray(b.tables)&&Array.isArray(b.unresolvedFields))return{...b,cacheHit:!0}}catch{}let w=(0,ak.d6)({evidence:h,template:a.prepare.template,spec:a.prepare.documentSpec,diagnostics:a.planning.generationDiagnostics,parsedOnly:!0}),x=a=>{let b=(0,l.nD)(a)?.key;return!b||!["project_name","project_scope","project_code","owner","project_location","foundation_support_form"].includes(b)||(0,ak.R7)(b,a.value)},y=(0,a1.lX)([...w.localFacts,...w.projectBasicFacts,...(0,l.UT)(h),...function(a){let b=new Map;for(let c of a){let a=c.content.replace(/\s+/gu," "),d=/R(\d+)C(\d+)\s+(?:材料\/设备名称|材料名称|设备名称)\s*[::]\s*(.+?)\s+R\1C(\d+)\s+推荐品牌\s*[::]\s*(.+?)(?=\s+R\d+C\d+\b|$)/giu;for(let f of a.matchAll(d)){let a=f[3].trim(),d=f[5].trim();if(!a||!d||/^(?:无|暂无|未指定|见.*)$/u.test(d))continue;let g=`source-brand:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f[1],f[4],a,d])).digest("hex").slice(0,24)}`;b.set(g,{factId:g,fieldId:"recommended_brand",fieldName:"推荐品牌",key:"推荐品牌",objectName:a,value:d,sourceFile:c.filePath,roleId:c.roleId||"parsed-table",processingType:c.processingType||"table",confidence:.9,sourceRef:{filePath:c.filePath,roleId:c.roleId||"parsed-table",chunkIndex:c.chunkIndex,sectionTitle:c.sectionTitle,cellRange:`R${f[1]}C${f[4]}`,sourceSpan:f[0]}})}}return[...b.values()]}(h),...function(a){let b=new Map;for(let c of a){let a=c.content.replace(/\s+/gu," ");for(let d of a.matchAll(/(?:新建|建设|建造)\s*(\d+)\s*栋\s*(\d+)\s*层(?:的)?\s*([\u4e00-\u9fff]{0,18}?(?:用房|厂房|住宅楼|教学楼|宿舍楼|办公楼|大厦))/gu)){if(/远期|设想|建议|目标/u.test(a.slice(Math.max(0,d.index-12),d.index)))continue;let f=d[3];for(let[a,g,h]of[["building_count","建设栋数",`${d[1]}栋`],["building_floors","建筑层数",`${d[2]}层`]]){let i=`source-scale:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f,a,h])).digest("hex").slice(0,24)}`;b.set(i,{factId:i,fieldId:a,fieldName:g,key:g,objectName:f,value:h,sourceFile:c.filePath,roleId:c.roleId||"parsed-project-scope",confidence:.9,sourceRef:{filePath:c.filePath,roleId:c.roleId||"parsed-project-scope",chunkIndex:c.chunkIndex,sectionTitle:c.sectionTitle,sourceSpan:d[0]}})}}}return[...b.values()]}(h)]).map(bk).filter(x);y.push(...(0,bd.Yn)(h,m));let z=y.filter(a=>(0,a4.p)(a).requiresTechnicalDecision&&/\.(?:dwg|dxf)$/iu.test(a.sourceFile)),A=!1;if(z.length){let c=[...new Set(z.flatMap(a=>{let b=(0,l.nD)(a)?.key??a.fieldId??a.key;return"excavation_depth"===b?["ground_elevation","pit_bottom_elevation"]:"foundation_depth"===b?["ground_elevation","foundation_elevation"]:[b]}))],d={snapshotId:bj({inputHash:u,sources:g,stage:"cad-before-freeze"}),sources:g},e=function(a){let b,c=(b=a.generatedDir,af().join(b,"assets","reviewed-cad")),d=new Map,e=[];if(!ad().existsSync(c))return{facts:[],reuseReceipts:e,complete:!1};for(let b of ad().readdirSync(c).filter(a=>/^[0-9a-f]{64}\.json$/u.test(a)).sort()){let f=af().join(c,b),g=b.slice(0,-5);try{let b=JSON.parse(ad().readFileSync(f,"utf8"));if(!be(b)||b.id!==g||!be(b.data)||"reusable-reviewed-cad-v1-2026-10-08"!==b.data.version||b.contentHash!==bh(b.data)||!be(b.data.provenance)||b.id!==bh({version:b.data.version,provenance:b.data.provenance}))throw Error("CAD历史资产完整性校验失败");let{audit:c,results:h,modelMetadata:i}=function(a){let b;if(!be(a)||!bf(a.kind)||!be(a.result))throw Error("历史CAD资产必须为完整审核envelope,不能仅提供事实或项目模型");if(bf(a.model))b={scope:"original-audit",model:a.model};else if(be(a.llm)&&Array.isArray(a.llm.modelChoices)&&a.llm.modelChoices.some(a=>be(a)&&bf(a.chosen)&&bf(a.provider)))b={scope:"original-audit-call-ledger",llm:a.llm,perResultReviewerModel:"not-recorded"};else throw Error("历史CAD审核缺少原模型来源元数据,不能冒称本轮重新视觉审核");let c=(Object.hasOwn(a.result,"candidate")?[a.result]:Array.isArray(a.result.readings)?a.result.readings.flatMap(a=>be(a)&&Array.isArray(a.results)?a.results:[]):[]).filter(a=>be(a)&&!0===a.approvedForWriting);if(!c.length)throw Error("历史CAD资产没有完整核准结果,裸事实和未决候选不能复用");for(let a of c){if(!be(a.candidate)||!be(a.candidate.evidence)||!be(a.proof)||!be(a.review)||"confirmed"!==a.review.status||!bf(a.review.reason)||!1!==a.expertValidated||!bf(a.candidate.objectName)||!bf(a.candidate.condition)||!["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"].includes(String(a.candidate.attribute))||!["m","mm","cm"].includes(String(a.candidate.unit))||!Array.isArray(a.sourceViewHashes)||!a.sourceViewHashes.length||a.sourceViewHashes.length>4||a.sourceViewHashes.some(a=>"string"!=typeof a||!/^[0-9a-f]{64}$/u.test(a))||!bf(a.proof.projectSnapshotId)||!bf(a.proof.parsedIdentity)||!/^[0-9a-f]{64}$/u.test(a.proof.parsedIdentity)||!be(a.proof.frame)||!be(a.proof.value)||!Array.isArray(a.proof.unitAnnotations)||!a.proof.unitAnnotations.length||!Array.isArray(a.proof.scopeAnnotations)||!a.proof.scopeAnnotations.length)throw Error("历史CAD核准缺少候选、图示证明、原审核或图像哈希");let b=a.candidate.evidence;if(!bf(b.filePath)||!bf(b.frameId)||!bf(b.valueEntityId)||!bf(b.rawValue)||!/^[+−-]?\d+(?:\.\d+)?$/u.test(b.rawValue.trim())||!Array.isArray(b.unitEntityIds)||!b.unitEntityIds.length||!Array.isArray(b.scopeEntityIds)||!b.scopeEntityIds.length||a.normalizedValue!==`${b.rawValue.trim()}${a.candidate.unit}`)throw Error("历史CAD核准的单值、单位或部位实体证据不完整");if(/^(?:[\dA-Za-z\s\-—~~]+)?(?:剖面(?:图)?|截面(?:图)?|详图|平面图)$/u.test(a.candidate.objectName.trim()))throw Error("历史核准尚未绑定实际施工对象,不能用来源图名代替")}return{audit:a,results:c,modelMetadata:b}}(b.data.originalAudit);if(b.data.provenance.originalAuditKind!==c.kind||bh(b.data.provenance.originalModelMetadata)!==bh(i))throw Error("历史审核来源或模型元数据与原始回执不一致");for(let[c,i]of h.entries()){if(a.requestedAttributes&&!a.requestedAttributes.includes(i.candidate.attribute))continue;let h=b.data.provenance,j={assetId:g,assetPath:f,...h,candidateIndex:c,originalProjectSnapshotId:i.proof.projectSnapshotId,status:"rejected",reason:"",currentVisionReviewPerformed:!1,expertValidated:!1};try{!function(a,b,c){let d=a.candidate.evidence,e=c(d),f=a.proof;if(e.projectSnapshotId!==b.snapshotId||e.parsedIdentity!==b.sources[d.filePath]?.sha256||f.parsedIdentity!==e.parsedIdentity||f.filePath!==d.filePath)throw Error("历史CAD审核的冻结解析指纹与当前来源不一致");let g=a=>({filePath:a.filePath,parsedIdentity:a.parsedIdentity,sceneVersion:a.sceneVersion,frame:a.frame,value:a.value,unitAnnotations:a.unitAnnotations,scopeAnnotations:a.scopeAnnotations,drawingCoordinateUnits:a.drawingCoordinateUnits});if(bh(g(e))!==bh(g(f)))throw Error("历史CAD审核的图框、量值、单位或范围实体与当前证明不一致");if(!e.unitAnnotations.some(b=>b.text===a.candidate.unit))throw Error("历史CAD单位没有当前实际单位文字实体支持");if(!a8(a))throw Error("历史审核没有准入可写事实")}(i,a.project,a.readEvidence);let b=a8(i);d.set(b.factId,b),j.status="reused",j.reason="当前冻结解析与实际实体证明均与历史完整图示审核一致;保留原审核,不宣称本轮模型重新看图",j.factId=b.factId,j.verification="current-entities-match-historical-review"}catch(a){j.reason=a instanceof Error?a.message:String(a)}e.push(j)}}catch(a){e.push({assetId:g,assetPath:f,status:"rejected",reason:a instanceof Error?a.message:String(a),currentVisionReviewPerformed:!1,expertValidated:!1})}}return{facts:[...d.values()],reuseReceipts:e,complete:!1}}({generatedDir:j_(a.prepare.projectRoot),project:d,requestedAttributes:c,readEvidence:b=>(0,ah.VD)(a.prepare.projectRoot,a=>a6(a,d,b))});y.push(...e.facts);let f=[...new Set(z.map(a=>a.sourceFile))].filter(a=>!c.every(b=>e.facts.some(c=>c.sourceFile===a&&c.fieldId===b)));a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"cad-historical-reuse.json",e,a.global.input.runId);let h=f.length?await bc({project:d,filePaths:f,requestedAttributes:c,diagnostics:a.planning.generationDiagnostics,signal:b,read:b=>(0,ah.VD)(a.prepare.projectRoot,b),fontPath:ad().existsSync("/System/Library/Fonts/STHeiti Light.ttc")?"/System/Library/Fonts/STHeiti Light.ttc":void 0}):void 0;h&&(y.push(...h.facts),A=!h.facts.length||!h.readings.length||h.readings.some(a=>"reviewed"!==a.status||Array.isArray(a.results)&&a.results.some(a=>"unmeasured"===a.status||a.review?.status==="unmeasured")),a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"cad-writing-preparation.json",h,a.global.input.runId))}let B=b=>af().join(j_(a.prepare.projectRoot),"project-model-cache",`source-${bj([b,g[b].sha256,t])}.json`),C=a=>{let b=(0,d.K3)(a.value);return!!b&&h.some(c=>c.filePath===a.sourceFile&&(a.sourceRef?.chunkIndex===void 0||a.sourceRef.chunkIndex===c.chunkIndex)&&(0,d.K3)(c.content).includes(b))};for(let a of c)if(p)try{let b=JSON.parse(ad().readFileSync(B(a),"utf8"));bj(b.data)===b.sha256&&Array.isArray(b.data)&&y.push(...b.data.filter(C).map(bk).filter(x))}catch{}let D=n.filter(a=>a.required&&!y.some(b=>(0,ak.PV)(b,a))),E=new Map;for(let b of D)E.set(b.id,h.filter(a=>(0,al.I2)(a,b)).sort((c,d)=>{let e=c=>(0,ag.carrierStrength)((0,ag.domainForAttribute)(b.name),(0,ag.resolveCarrier)({kind:a.prepare.kindByPath?.get(c.filePath)??c.processingType??"other",section:c.sectionTitle}));return e(d)-e(c)||d.content.split(b.name).length-c.content.split(b.name).length||c.filePath.localeCompare(d.filePath)||c.chunkIndex-d.chunkIndex}));let F=[...new Map(D.flatMap(a=>E.get(a.id)??[]).map(a=>[`${a.filePath}\0${a.chunkIndex}\0${a.sectionTitle}\0${a.content}`,a])).values()];a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"project-fact-extraction-scope.json",{projectAttributeTargets:n,missingAttributes:D.map(a=>({...a,candidateCount:E.get(a.id)?.length??0})),otherContentDuties:(0,al.Uy)(a.prepare.template,a.prepare.documentSpec).filter(a=>!n.some(b=>b.id===a.id)),selectedChunks:F.length,selectedSourceChars:F.reduce((a,b)=>a+b.content.length,0),sourceFiles:c.length,structuredTables:w.structuredTables.length,boundary:"完整解析来源、结构化表与非共同属性义务保留;非共同属性不是全局待填单值字段,也不表示正文已完成"},a.global.input.runId);let G=!1;if(F.length>0){let c={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>D.some(b=>b.id===a||b.name===a))}))},d=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>D.some(b=>b.id===a.id))}:void 0,e=await (0,ak.OQ)(F,a.prepare.factExtractionPromptTexts,c,d,b,a.planning.generationDiagnostics,b=>{a$(a,{batch:"generation.understanding",stage:{type:"fact_extraction",roleId:"project-attribute-extraction",status:"running",message:"done"===b.phase?`共同属性第${b.index}/${b.total}批已核验,累计${b.factsSoFar}条`:`共同属性第${b.index}/${b.total}批${"waiting"===b.phase?"仍在读取":"开始读取"},本批${b.batchChars}字符`}}),a.global.emitProgress()},{cache:an(af().join(j_(a.prepare.projectRoot),"source-fact-response-cache"),a.planning.generationDiagnostics,"literal-source-fact-response-v2"),sourceIdentities:g,onReceipt:b=>{a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),`source-fact-batch-${b.index}.json`,b,a.global.input.runId)}});(0,a1.Te)(b);let f=(0,a1.lX)(e.facts).filter(C).map(bk).filter(x);for(let a of(y.push(...f),G=e.stages.some(a=>"failed"===a.status),new Set(f.map(a=>a.sourceFile)))){if(!p||!g[a])continue;let b=[...new Map(y.filter(b=>b.sourceFile===a&&C(b)).map(a=>[bj([a.fieldId,a.key,a.objectName,a.value,a.sourceRef]),a])).values()],c=B(a);ad().mkdirSync(af().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.tmp`;ad().writeFileSync(d,JSON.stringify({data:b,sha256:bj(b)})),ad().renameSync(d,c)}}if(bj((0,ah.Y8)(a.prepare.projectRoot,c))!==bj(g))throw Error("写前理解期间解析资料已变化,不能将旧候选与新来源一起冻结");let H={version:bi,inputHash:u,sources:g,sourceVersionPolicy:m,facts:y,tables:w.structuredTables,unresolvedFields:D.filter(a=>!y.some(b=>(0,ak.PV)(b,a))).map(a=>({id:a.id,name:a.name,status:"unmeasured",candidateCount:E.get(a.id)?.length??0,phase:E.get(a.id)?.length?"attribute-extraction":"source-location",provesMissingSource:!1,candidateLocations:(E.get(a.id)??[]).map(a=>({sourceFile:a.filePath,chunkIndex:a.chunkIndex})),reason:E.get(a.id)?.length?"已有相关解析原文,属性理解尚未完成;不能凭抽取失败认定原文缺料":"当前字段关键词尚未定位原文,未据此判定全库缺料"})),cacheHit:!1};if(p&&!G&&!A){ad().mkdirSync(af().dirname(v),{recursive:!0});let a=`${v}.${process.pid}.tmp`;ad().writeFileSync(a,JSON.stringify({data:H,sha256:bj(H)})),ad().renameSync(a,v)}return H}function bm(a,b){if(b.version!==bi)throw Error("项目事实快照版本失配,须按当前语义属性重新准备,不能转换旧快照用于生成");if(!b.sourceVersionPolicy)throw Error("项目恢复缺少冻结来源版本用途账,须按当前来源重新准备");if((0,s.gM)(b.sourceVersionPolicy),(0,s.cW)(af().join(j_(a),"assets","source-editions")).fingerprint!==b.sourceVersionPolicy.assetFingerprint)throw Error("来源发行确认资产已变化,原项目快照不能继续复用");let{snapshotId:c,...d}=b;if(bj(d)!==c)throw Error("项目事实快照已被改写,不能沿用原快照身份");if(0===Object.keys(b.sources).length){if(b.facts.length>0)throw Error("项目事实没有解析来源身份,不能进入写作或交付评价");return}let e=ai(a,Object.keys(b.sources));if(e.length)throw Error(`写作资料当前解析状态未通过:${e.map(a=>a.message).join(";")};保留草稿,不能使用历史解析继续写作或交付评价`);if(bj((0,ah.Y8)(a,Object.keys(b.sources)))!==bj(b.sources))throw Error("写作期间解析资料已经变更,当前事实快照已过期;保留草稿并使用新快照重新规划受影响任务")}let bn={version:"professional-document-workflow-v121",rules:["registered-field-content-nature-is-shared-by-classification-and-attribute-extraction-without-model-reclassification","retired-unwired-fact-placement-tools-and-old-chapter-task-planner-without-compatibility-adapters","explicit-source-collection-content-kind-with-complete-membership-duty-and-without-scalar-value-admission","shared-project-attribute-preparation-separated-from-complete-source-collection-and-author-content-duties","current-source-bound-literal-extraction-batches-with-independent-validation-persistence-and-shared-provider-concurrency","shared-author-system-and-canonical-plan-prefix-with-task-specific-delegation-at-tail","same-selected-model-composition-separated-from-chief-engineering-reasoning-with-user-thinking-preference-preserved","explicit-full-document-normative-collection-dependency-with-local-basis-tasks-parallel","complete-spatial-region-label-legends-and-task-local-preview-failure-isolation","single-reference-discovery-owner-and-author-task-local-chief-question-indices","shared-provider-capacity-and-evidence-progress-without-cad-text-discard","semantic-project-facts-without-global-raw-numeric-token-expansion","namespaced-original-member-references-with-server-recorded-batch-responses","current-source-model-and-protocol-bound-completed-discovery-response-reuse","independent-persisted-parsed-documents-and-knowledge-internal-source-unit-identities","uploaded-original-disappearance-never-deletes-indexed-knowledge","text-conservation-preview-and-structural-query-without-original-file-dependency","vector-row-file-chunk-and-parsed-version-validation-before-sqlite-hydration","provider-default-output-and-selected-model-role-based-thinking-without-total-generation-ceilings","task-local-facts-and-source-use-dependencies-with-condition-aware-query-diagnostics","source-file-ownership-routing-without-per-section-model-repetition","strict-duplicate-json-key-rejection-before-body-or-tool-admission","per-transport-cancellation-request-and-actual-settlement-with-unknown-usage-preserved","preserved-original-failures-and-pause-at-reported-output-truncation-without-whole-input-retries","whole-run-token-anomaly-pause-and-same-project-queue-suspension-without-cost-or-time-ceilings","current-professional-grade-required-for-delivery-with-verification-quality-gaps-separated","first-candidate-professional-pass-metrics-without-retention-percentage-delivery-veto","removed-unused-client-reservations-and-inactive-node-payload-writing-pruning","full-per-call-usage-ledger-with-unreported-cancelled-usage","lossless-repeated-evidence-projection-with-intact-thinking-tool-protocol","quantity-purpose-and-partial-boundary-aware-construction-network","professional-execution-defects-in-first-candidate-with-preserved-original","spatial-layout-schematics-without-invented-survey-dimensions","partial-draft-figure-rendering-and-explicit-portable-review-fonts","task-located-excerpt-reading-without-speculative-whole-file-scans","complete-work-package-directory-and-explicit-member-selection-without-default-paging","project-resource-authors-inherit-planned-crews-without-false-derived-peaks","professional-first-draft-and-seven-anchored-diagnostics-without-aggregate-pass-score","complete-object-directory-and-on-demand-full-source-without-preflight-candidate-census","current-v7-submission-only-and-actual-rendered-figure-evidence-without-body-node-dumps","whole-source-purpose-and-completed-claim-state-validation","single-activity-network-and-typed-source-quantity-production-plan","server-owned-author-unit-row-and-section-reference-identities","retained-body-annotation-correction-with-cumulative-meaningful-raw-writing-ledger","actual-task-executions-preserved-through-final-render-and-honest-terminal-nodes","all-actual-normative-use-catalog-with-independent-official-metadata-and-adoption-status","source-bound-hazard-candidates-without-unknown-to-nonhazard-conclusions","faithful-technical-rendering-and-actual-bookmark-page-toc-cache","no-bid-type-page-quotas-or-client-wall-clock-generation-cutoffs","chapter-fair-dynamic-author-dispatch-through-single-shared-model-capacity","single-chief-whole-outline-and-table-plan-with-complete-raw-protocol-receipts","current-candidate-identity-bound-plan-reuse-without-repeated-chapter-routing","user-outline-preservation-without-tail-character-title-rejection-or-post-plan-mutations","actual-body-normative-use-register-before-first-compilation-basis-writing","source-bound-exact-normative-name-code-and-use-position-review","single-optional-explicit-process-concurrency-without-default-four-or-six","complete-typed-tool-output-without-generic-tail-clipping","task-owned-complete-evidence-without-repeated-whole-chapter-source-matrices","authenticated-deep-frozen-source-policy-with-independent-current-use-validation","server-owned-source-evidence-indices-without-model-quote-or-hash-copy","actual-task-progress-and-substantive-body-without-title-shell-completion","explicit-input-resource-limits-without-hidden-env-or-default-document-cutoffs","active-task-engineering-decisions-with-reviewed-qualitative-adoption","professional-process-coverage-without-character-density-point-collapse","complete-source-library-and-positive-technical-obligation-discovery-without-commercial-role-closure","typed-task-local-writing-readiness-and-preserved-unresolved-source-ledger","single-common-construction-organization-plan-with-on-demand-engineering-decisions","source-first-omission-audit-after-preserved-real-first-draft","review-draft-export-separated-from-delivery-acceptance-with-bound-issue-sidecar","actual-claim-fidelity-review-separated-from-engineering-adoption-permission","balanced-same-family-source-bracket-intervals-without-unclosed-tail-suppression-or-source-rewriting","complete-physical-source-question-continuations-before-answer-purpose-review","source-context-semantic-projection-with-complete-server-owned-provenance-and-frozen-application-qualification","complete-clarification-source-groups-with-unique-original-member-accounting-and-independent-projection-binding","source-explicit-length-units-without-bare-number-or-neighbor-line-default-meters","complete-local-knowledge-assumption","knowledge-coverage-recovery","fact-trace-placement","chapter-coverage-gate","structured-quality-report","post-repair-verification","immutable-run-inputs","user-cancellation-and-typed-progress-execution-receipts","pre-writing-frozen-project-model","frozen-prompt-skill-and-model-configuration","object-and-attribute-bound-fact-governance","pre-writing-document-contract","complete-json-results-without-tail-clipping","single-explicit-selected-model-for-all-agent-and-review-calls","selected-model-without-vendor-allowlist-and-glm53-valid-thinking-tool-history","scoped-preparation-cancellation-and-drain-before-terminal-with-source-before-model-planning","source-complete-chief-model-projection-with-authoritative-native-proof-ledger","native-json-with-explicit-shared-total-output-capacity","technical-structure-requirements-grounded-in-local-presentation-purpose","object-property-condition-and-adoption-constraints-without-onsite-verb-or-edition-shortcuts","signal-driven-generation-with-stream-progress-and-effective-source-worker-capacity","exact-decimal-value-equivalence-with-source-object-unit-and-application-conservation","strict-explicit-source-indices-without-positional-recovery-or-retired-anchor-acceptance","mutable-live-activity-snapshots-separated-from-immutable-run-evidence","physical-property-corrections-separated-from-price-and-document-description-procedures","source-row-and-header-bound-table-quantity-witnesses-without-unit-inference","engineering-interfaces-separated-from-supplier-service-entitlements-and-charge-conditions","minimal-source-bound-static-constraints-without-synthetic-performance-duties","schema-correction-bound-to-actual-prior-output-and-preserved-source-semantics","native-contract-evaluation-with-retired-density-and-legacy-score-entrypoints","explicit-shared-total-output-capacity-with-frozen-selected-thinking-policy","source-owned-edition-sections-without-whole-document-catalog-qualification","single-chief-outline-duty-coverage-without-score-keyword-module-injection","real-provider-calls-without-hidden-prefix-warmup-requests","ordered-whole-dimension-and-celsius-identity-without-invented-unit-or-currency","reusable-provider-owned-http2-pool-with-concurrent-streamed-posts-and-signal-driven-cancellation","source-bound-planned-start-date-and-trigger-preserved-through-schedule-authority","contract-bound-seven-dimension-review","structured-author-tasks-and-cumulative-rework","canonical-document-model-and-guarded-incremental-repair","fixed-outline-and-unique-task-responsibility","same-selected-model-retry-without-provider-or-model-fallback","actual-task-instances-and-shared-chapter-budget","generation-scoped-llm-context","source-grounded-project-type-and-required-content-semantics","source-analysis-without-formal-writing-quotas","parent-grounded-financial-performance-separated-from-engineering-compensation","canonical-verified-whitespace-gaps-and-failed-request-ledger-preservation","source-text-once-and-payload-bounded-original-parent-batches","complete-outline-candidates-without-density-derived-section-count-or-blind-title-deletion","project-specific-substance-without-history-driven-novelty-or-correct-content-rewriting","native-cad-literal-location-and-root-bound-annotation-reading","chief-read-scope-pagination-without-premature-human-source-deferral","versioned-native-pdf-ruled-cell-reading-with-original-glyph-conservation","painted-horizontal-cell-spans-with-physical-row-edge-conservation","explicit-native-ordinary-page-continuation-without-grid-or-canonical-inference","fact-extraction-output-capacity-bound-to-complete-source-payload","persistent-source-and-parameter-bound-ocr-cache-default","native-table-row-boundaries-and-source-preserved-physical-page-continuation","file-level-proof-once-and-scalar-source-evidence-without-child-metadata-duplication","producer-bound-metadata-excluded-with-complete-original-ledger","immutable-source-and-provenance-bound-effective-facts","chief-frozen-original-source-queries","preserved-author-annotations-without-inferred-criterion-binding","scoped-chief-engineering-controls-with-independent-applicability-review","dxf-declared-codepage-and-observable-source-judgments","unchecked-blind-means-open-and-content-only-front-matter","canonical-native-toc-without-cover-or-invented-page-numbers","question-answer-boundaries-and-independent-review-with-frozen-model","dimension-picture-blocks-and-honest-polyline-transforms","evidence-progress-driven-chief-source-and-cad-reading","native-writing-without-legacy-drawing-lock-preparation","native-writing-without-legacy-density-or-duplicate-bill-preparation","chief-reasoning-tools-with-provider-session-roundtrip","source-binding-defect-scopes-without-unrelated-writing-penalties","pre-writing-shared-construction-deployment-and-task-interfaces","no-unscoped-elevation-subtraction-in-frozen-facts","single-native-generation-and-finalization-pipeline","request-local-llm-failure-attribution","lazy-cad-instances-with-complete-source-definitions","atomic-per-file-reindex-with-preserved-valid-snapshots","explicit-user-section-protection-with-adjudicable-skill-candidates","whole-selected-material-pack-index-and-source-byte-admission","native-contract-required-for-archived-repair","source-content-page-read-closure-without-native-garbled-or-raster-shortcuts","independently-reviewed-project-source-application-and-selection-bridges","immutable-chief-source-application-receipts-and-resume-replay","native-skill-knowledge-without-retired-density-depth-or-example-contracts","preserved-technical-ocr-content-without-prose-density-page-discard","native-raster-resolution-with-verified-composite-fallback","no-whole-library-project-intelligence-preheat-or-shadow-model","preserved-original-material-without-destructive-business-text-cleaning","explicit-user-sections-and-adjudicable-skill-candidate-preview","preserved-cad-stacked-engineering-units-and-fractions","file-level-source-coverage-without-per-chunk-audit-duplication","signature-driven-cad-source-routing-for-mislabeled-files","actual-carrier-source-routing-without-binary-fragment-success","frozen-source-edition-domains-without-filename-or-model-confirmation-shortcuts","selected-source-fingerprint-worker-with-epoch-bound-complete-cache-admission","source-document-headings-without-incidental-clarification-reference-reclassification","scalar-knowledge-discovery-with-selected-parser-version-receipts","planned-arrangements-without-invented-project-geometry-or-design-properties"]},bo={prepare:["template","derivation","documentSpec","projectMaterialProfile","projectMaterialSummary","projectUnderstanding","domainProfile","readiness","promptTexts","nativeAuthorPromptTexts","nativeAuthorReferenceTexts","reviewPromptTexts","repairPromptTexts","factExtractionPromptTexts","promptDocumentRules","requirementSemantics","hasExplicitOutline"],understanding:["allEvidence","writerEvidence","indexHealth","requestedEvidencePerChapter","rolePoolRisk","retrievalCoverageReports","webResearchReport","missingItems","clarificationRequests","unfixableDeclarations","failedChapterMessages","chapterGenerationStages","chapterGenerationStagesByOrder","canonicalFacts","evaluationItems","agentWorkflow","bidComposition","hazardResolution"],planning:["generationStrategy","projectContext","tenderRequirements","clarificationOverrides","earlyTruthAudit","truthConstraint","conclusionTable","requiredContentNeeds","projectTypeDecision","sharedConstructionPlan"],blueprint:["integratedBlueprint","requirementAssignments","structureAssignments","structureUnattached"]},bp=a=>(0,e.createHash)("sha256").update(a).digest("hex");var bq=c(7258);let br=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),bs="native-execution-accounting-",bt=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function bu(a,b){let c=(0,aj.C)("documentGeneration");if(!c||!a.inputSnapshot)return;let d=b??{};return b||(0,j.er)(d,a.inputSnapshot),bt({inputHash:a.inputSnapshot.sha256,requirement:a.requirement??"",title:a.title??"",materialRoot:a.materialRoot??"",algorithm:c,models:k(d),workflowVersion:bn.version})}var bv=c(19668);c(20297);var bw=c(48161),bx=c.n(bw);class by extends Error{constructor(a,b,c){super(a),this.promptId=b,this.reason=c,this.name="PromptResolutionError"}}function bz(a,b={}){let c=[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))];if(0===c.length)throw new by("生成需要提示词:请在画布底部的输入框里用「+」选择至少一份提示词(\xa712.1 的三个输入字段:提示词、项目、文档名称)。","","empty");return c.map(a=>{var b;let c=function(a){if(a.startsWith("custom:")){let b=(function(){try{let a=JSON.parse(ac.readFileSync(ae.join(process.env.CUSTOMIZE_AGENT_HOME?ae.join(process.env.CUSTOMIZE_AGENT_HOME,".customize-agent"):ae.join(bw.homedir(),".customize-agent"),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}})().find(b=>b.id===a);return b?{id:a,name:b.name,content:b.content,source:"custom"}:void 0}}(a);if(!c)throw new by(`提示词不存在:${a}(可能已被删除)。请在画布上用「+」重新选择提示词后重试。`,a,"unknown-id");if(!c.name.trim())throw new by(`提示词没有名字,无法判定它进哪条链:${a}`,a,"unknown-id");if(!c.content.trim())throw new by(`提示词内容为空:${c.name}(${a})`,a,"empty");return{...c,contentHash:(b=c.content,(0,e.createHash)("sha256").update(b).digest("hex").slice(0,12)),contentPreview:c.content.replace(/\s+/gu," ").trim().slice(0,160),category:function(a){let b=String(a||"");return/extract|extraction|抽取|提取|清单|图纸|品牌|识别/iu.test(b)?"extraction":/format|排版|格式|暗标/iu.test(b)?"formatting":/总控|writer|写作主控|施工组织设计总控/iu.test(b)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/iu.test(b)?"chapter":"reference"}(c.name)}})}class bA{constructor(a){this.controller=new AbortController,this.pending=new Set,this.signal=a?AbortSignal.any([a,this.controller.signal]):this.controller.signal}fail(a,b="preparation"){if(this.firstFailure||(this.firstFailure={error:a,origin:b,at:Date.now()}),!this.controller.signal.aborted){let a=Error("本轮前置工作已失败,取消其余准备任务",{cause:this.firstFailure.error});a.name="AbortError",this.controller.abort(a)}}get failure(){return this.firstFailure?.error}get failed(){return void 0!==this.firstFailure}run(a){this.signal.throwIfAborted();let b=Promise.resolve().then(()=>(this.signal.throwIfAborted(),a()));return this.pending.add(b),b.then(()=>{this.pending.delete(b)},a=>{this.pending.delete(b),this.fail(a)}),b}async pool(a,b,c){if(this.failed)throw this.failure;if(this.signal.throwIfAborted(),!Number.isSafeInteger(c)||c<1)throw Error("准备任务并发数必须是正整数");let d=Array(a.length),e=0,f=Array.from({length:Math.max(0,Math.min(a.length,Math.floor(c)))},()=>this.run(async()=>{for(;!this.signal.aborted&&e<a.length;){let c=e++;d[c]=await b(a[c],c),this.signal.throwIfAborted()}}));if(await Promise.allSettled(f),this.failed)throw this.failure;return this.signal.throwIfAborted(),d}async drain(){for(;this.pending.size;)await Promise.allSettled([...this.pending])}receipt(){let a=this.firstFailure?.error;return{pending:this.pending.size,drained:0===this.pending.size,signalAborted:this.signal.aborted,firstFailure:this.firstFailure?{at:this.firstFailure.at,origin:this.firstFailure.origin,name:a instanceof Error?a.name:null,message:a instanceof Error?a.message:String(a)}:null}}}var bB=c(79704),bC=c(10059),bD=c(57268);let bE=["technical","source-control","document-delivery","bid-procedure","commercial","unmeasured"];function bF(a){let b=a.map(a=>({id:(0,bD.DS)(a),text:a.text,source:a.sources.map(a=>[a.file,a.location].filter(Boolean).join("|")).join(";"),...a.discoveryEvidence?{originalSource:a.discoveryEvidence.quotes.map(a=>a.quote).join("\n\n"),originalSourceSpans:a.discoveryEvidence.quotes.map(a=>a.quote),sourceIndex:a.discoveryEvidence.sourceIndex}:{}}));if(new Set(b.map(a=>a.id)).size!==b.length)throw Error("当前技术候选身份重复");return b}function bG(a,b,c){if(!c||"string"!=typeof c.version||!c.version.trim())throw Error("缺少当前全文主控计划");let d=bF(a);if(!Array.isArray(c.tenderRequirements)||c.tenderRequirements.length!==d.length||new Set(c.tenderRequirements.map(a=>a.id)).size!==d.length)throw Error("全文主控计划的技术候选集合不完整或重复");let e=new Map(c.tenderRequirements.map(a=>[a.id,a]));for(let a of d){let b=e.get(a.id);if(!b||b.text!==a.text||b.source!==a.source||b.originalSource!==a.originalSource||JSON.stringify(b.originalSourceSpans)!==JSON.stringify(a.originalSourceSpans)||b.sourceIndex!==a.sourceIndex)throw Error("全文主控计划不属于当前技术候选及原始来源")}let f=a=>a.map(a=>({id:a.id,title:a.title,sections:a.sections??[]}));if(!Array.isArray(c.chapters)||JSON.stringify(f(c.chapters))!==JSON.stringify(f(b)))throw Error("全文主控计划与当前章节及小节结构不一致");if(!Array.isArray(c.requirementAssignments)||c.requirementAssignments.length!==a.length||new Set(c.requirementAssignments.map(a=>a.requirementId)).size!==a.length)throw Error("全文主控技术职责承接漏项或重复");let g=new Map(c.requirementAssignments.map(a=>[a.requirementId,a]));return a.flatMap(a=>{let e=(0,bD.DS)(a),f=g.get(e);if(!f||!bE.includes(f.scope)||"string"!=typeof f.reason||!f.reason.trim())throw Error("全文主控计划缺少实际来源用途裁决");if("technical"!==f.scope){if(void 0!==f.chapterIndex||void 0!==f.sectionTitle||void 0!==f.responsibility)throw Error("非技术用途不得发布为技术作者职责");if("technical"!==f.scope&&"unmeasured"!==f.scope){let a=d.find(a=>a.id===e),b=c.requirementSourceUnits?.find(b=>b.index===a.sourceIndex);if(!a.originalSource?.trim()||!b?.text.trim()||!(a.originalSourceSpans??[a.originalSource]).every(a=>b.text.replace(/\s/gu,"").includes(a.replace(/\s/gu,""))))throw Error("非正文渠道分流缺少当前完整原源范围依据")}return[]}let h=Number.isSafeInteger(f.chapterIndex)&&f.chapterIndex>=0?b[f.chapterIndex]:void 0;if(!h||"string"!=typeof f.sectionTitle||!h.sections?.includes(f.sectionTitle)||"string"!=typeof f.responsibility||!f.responsibility.trim())throw Error("全文主控技术职责未承接到当前真实小节");let i=d.find(a=>a.id===e),j=c.requirementSourceUnits?.find(a=>a.index===i.sourceIndex),k=i.originalSourceSpans?.length?[...i.originalSourceSpans]:i.originalSource?[i.originalSource]:[];if(!k.length||!j?.text.trim()||k.some(a=>!j.text.replace(/\s/gu,"").includes(a.replace(/\s/gu,""))))throw Error("技术职责不是当前完整原源中的真实原字证据");let l=k.join("\n\n");if(f.responsibility!==l)throw Error("全文主控技术职责文本与当前原字证据不一致");return[{entry:{...a,scopeReview:{scope:"technical",responsibility:l,reason:f.reason}},requirementId:e,chapterId:h.id,chapterTitle:h.title,sectionTitle:f.sectionTitle,plannerVersion:c.version,reason:f.reason,status:"planned"}]})}function bH(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function bI(a){let b=[...a.blocks??[]];return{version:1,recordedAt:a.recordedAt,workflowVersion:a.workflowVersion,blocks:b,chapters:[...a.chapters??[]],readings:{...a.readings,firstPassRate:function(a){let b=a.filter(a=>!a.isolatedRetry);if(0===b.length)return{firstPass:0,primary:0,rate:null};let c=b.filter(a=>0===a.attempt&&a.passed).length;return{firstPass:c,primary:b.length,rate:c/b.length}}(b).rate},...a.chapterFailures&&a.chapterFailures.length>0?{chapterFailures:[...a.chapterFailures]}:{}}}function bJ(a){return"manual_review"===a.repairability||"user"===a.owner}function bK(a){let b=a.provenance?.detectorId?.trim();return b?[b]:a.category?[a.category]:[]}function bL(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}var bM=c(450);function bN(a){return a.replace(/\s+/gu,"").toLowerCase()}function bO(a){return[...new Set(a)]}c(86697),RegExp(`^.{2,36}?表`,"u");let bP="[\\d一二三四五六七八九十]+";RegExp(`^表\\s*${bP}(?:[--..—]\\s*${bP})?\\s*[::、..]?\\s`,"u");let bQ=[{pattern:/横道图|甘特图/u,instruction:"以表格式时间轴呈现(阶段与节点、起止时间、与工期目标的关系);表中时间节点必须与总工期及开工竣工日期一致"},{pattern:/网络图|关键线路/u,instruction:"以文字框图呈现(工作节点、先后衔接关系、关键线路标注),节点划分必须与本工程施工组织一致"},{pattern:/组织机构图|组织框图|机构框图|机构图/u,instruction:"以文字框图呈现组织机构层级(部门或岗位、隶属关系)"},{pattern:/平面布置图|布置图/u,instruction:"以分区布置的文字框图或布置要点表呈现(分区、布置内容、管控要求)"},{pattern:/流程图|工艺流程图/u,instruction:"以文字框图呈现流程步骤与衔接关系"}];function bR(a){return bN(a).replace(/[((][^))]*[))]/gu,"").replace(/[图表]+$/u,"")}let bS=/知识库|系统暂未|项目资料暂未|暂未明确|待确认|待资料复核|待系统|通用兜底(?:段落|模板)?|兜底(?:占位|模板|内容)|未检索到|资料不足|无法确认|建议补充|COL\d+|可核验信息|以本项目招标文件明确内容为准/u,bT=String.raw`(?:\d+[.、](?=\s|\*\*)\s*|[((]\d+[))]\s*|[-*+]\s+)`;RegExp(String.raw`\S.+(?:\s|[。;;])${bT}\S.+(?:\s|[。;;])${bT}\S`,"u"),RegExp(`\r?
|
|
19
|
+
`;try{ac.mkdirSync(ae.dirname(e),{recursive:!0}),ac.appendFileSync(e,h,"utf8")}catch(a){throw new au("node-log-write-failed",`节点日志写入失败(S3.2:节点日志是唯一真相源,不可静默丢 ⇒ 停止生成并上报):${e}:${a instanceof Error?a.message:String(a)}`,{docId:d,file:e},{cause:a})}return c}function aB(a,b,c={}){return aA({docId:a,op:"upsert",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function aC(a,b,c={}){return aA({docId:a,op:"status",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function aD(a,b){return function(a,b){let c,d=ax(a),e=aw(d,b);try{c=ac.readFileSync(e,"utf8")}catch(a){if("ENOENT"===a.code)return{nodes:[],records:[],lineCount:0,tornTail:!1};throw a}let f=c.endsWith("\n"),g=!f&&c.length>0,h=c.lastIndexOf("\n"),i=f?c.slice(0,-1):h>=0?c.slice(0,h):"",j=""===i?[]:i.split("\n"),k=[];for(let a=0;a<j.length;a+=1){let b,c=j[a];if(""!==c.trim()){try{b=JSON.parse(c)}catch(b){throw new au("node-log-corrupt",`节点日志第 ${a+1} 行不是合法 JSON(文件损坏或被外部改写):${e}`,{docId:d,file:e,line:a+1},{cause:b})}k.push(function(a,b,c,d){let e=(a,e)=>new au("node-log-corrupt",`节点日志第 ${d} 行${a}:${c}`,{docId:b,file:c,line:d},void 0===e?void 0:{cause:e});if(!a||"object"!=typeof a)throw e("不是对象");if(1!==a.v)throw e(`版本 v=${String(a.v)} 无法识别(本版本只认 1)`);if(!Number.isFinite(a.t))throw e("缺时间戳 t");if("upsert"!==a.op&&"status"!==a.op&&"rollup"!==a.op)throw e(`op「${String(a.op)}」未知`);if(!a.node||"object"!=typeof a.node)throw e("缺 node");try{if("upsert"===a.op)return ay(a.node),{v:1,t:a.t,op:"upsert",node:a.node};return az(a.node),{v:1,t:a.t,op:a.op,node:a.node}}catch(a){throw e(`的 node 不合法(${a instanceof Error?a.message:String(a)})`,a)}}(b,d,e,a+1))}}return{nodes:function(a,b,c){let d=new Map;for(let e of a){if("upsert"===e.op){d.set(e.node.id,{...e.node});continue}let a=d.get(e.node.id);if(!a)throw new au("node-log-patch-target-missing",`${e.op} 事件指向 ${e.node.id},但它没有 upsert(append-only 日志里节点必须先出现):${c}`,{docId:b,file:c});d.set(e.node.id,function(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),function(a){let b=a.progress;return!b||"completed"!==a.status||"number"!=typeof b.total||b.total<=0||"number"!=typeof b.current||b.current>=b.total?a:{...a,progress:{...b,current:b.total}}}(d)}(a,e.node))}return[...d.values()].sort(ap)}(k,d,e),records:k,lineCount:j.length,tornTail:g}}(a,b).nodes}let aE={role_binding:"项目角色配置绑定",knowledge_retrieval:"知识库证据检索",file_understanding:"项目资料理解",fact_extraction:"事实抽取",chapter_generation:"章节正文生成",llm_review:"独立复核",validation:"规则与准入校验",reference:"资料增强"},aF={"knowledge-base":"知识库","document-readiness":"生成准备度检查","llm-json":"LLM 事实抽取"};function aG(a){return a?aF[a]:void 0}function aH(a,b={}){let c={executionVersion:2,group:a.type,...a,...b},d=c.roleName||aG(c.roleId),e=c.subtitle||d||aG(c.roleId);return{...c,roleName:d,subtitle:e,title:function(a){var b;let c=aE[b=a.type]??b,d=a.subtitle||a.roleName||aG(a.roleId),e=d&&!c.includes(d)?`${c} \xb7 ${d}`:c,f="string"==typeof a.title&&a.title.length>0?a.title:void 0;return f&&f!==c?f:e}({...c,roleName:d,subtitle:e})}}let aI="stage-details";function aJ(a){return a.source===aI}let aK={prepare:{type:"prepare",title:"准备"},understand:{type:"understand",title:"理解资料"},plan:{type:"plan",title:"规划结构"},blueprint:{type:"blueprint",title:"派生蓝图"},write:{type:"write",title:"逐章写作"},close:{type:"close",title:"全篇收口"},deliver:{type:"deliver",title:"交付"}};function aL(a,b,c="completed",d){let e=aK[b];a$(a,{batch:{prepare:"generation.prepare",understand:"generation.understanding",plan:"generation.planning",blueprint:"generation.blueprint",write:"generation.write",close:"finalize.pipeline",deliver:"finalize.delivery"}[b],id:aM(b),type:e.type,title:e.title,status:c,..."string"==typeof d&&d.length>0?{metrics:aZ(d)}:{}})}function aM(a){return`phase:${a}`}function aN(a){return`chapter:${a}`}let aO={running:"running",success:"completed",failed:"failed",partial:"repairing",skipped:"blocked"};function aP(a,b={}){let c;try{c=aD(a,b.baseDir)}catch{return 0}let d=new Map;for(let a of c){if(!a?.id)continue;let b=d.get(a.id);d.set(a.id,b?{...b,...a}:a)}let e=new Map;for(let a of d.values())a.parentId&&e.set(a.parentId,[...e.get(a.parentId)??[],a]);let f=new Set(["round.decide"]),g=0,h=Date.now(),i=[...d.values()].filter(a=>!aQ.has(a.status));if(0===i.length)return 0;let j=a=>{let b=0,c=a;for(;c.parentId&&d.has(c.parentId)&&b<64;)c=d.get(c.parentId),b+=1;return b},k=[...i].sort((a,b)=>j(b)-j(a)),l=new Map,m=a=>l.get(a.id)??a.status;for(let c of k){let d=e.get(c.id)??[];if(0===d.length){let d=b.documentOutcome?f.has(c.type)&&"completed"===b.documentOutcome?"completed":"completed"===b.documentOutcome?"blocked":b.documentOutcome:f.has(c.type)?"completed":"running";if("running"===d)continue;aC(a,{id:c.id,status:d,completedAt:h,metrics:b.documentOutcome?{closedBySweep:!0,closedAtDocumentEnd:!0,documentOutcome:b.documentOutcome}:{closedBySweep:!0,closedRecordNode:!0}},{baseDir:b.baseDir}),l.set(c.id,d),g+=1,b.documentOutcome;continue}if(d.some(a=>!aQ.has(m(a))))continue;let i=function(a){let b,c=1/0;for(let d of a){let a=function(a){let b=ao.indexOf(a);return b>=0?b:0}(d);a<c&&(c=a,b=d)}return b}(d.map(a=>m(a)))??"completed";aC(a,{id:c.id,status:i,completedAt:h,metrics:{closedBySweep:!0,closedChildren:d.length,...b.documentOutcome?{closedAtDocumentEnd:!0}:{}}},{baseDir:b.baseDir}),l.set(c.id,i),g+=1}return g}let aQ=new Set(["completed","failed","blocked","paused"]),aR={"generation.prepare":{phase:"prepare",typeByStageType:{role_binding:"prepare",validation:"prepare",file_understanding:"prepare"},fallbackType:"prepare"},"generation.understanding":{phase:"understand",typeByStageType:{knowledge_retrieval:"understand",file_understanding:"understand",fact_extraction:"understand",validation:"understand",reference:"understand"},fallbackType:"understand"},"generation.planning":{phase:"plan",typeByStageType:{validation:"plan",role_binding:"plan",knowledge_retrieval:"plan",fact_extraction:"plan"},fallbackType:"plan"},"generation.blueprint":{phase:"blueprint",typeByStageType:{validation:"blueprint",file_understanding:"blueprint",chapter_generation:"blueprint"},fallbackType:"blueprint"},"generation.write":{phase:"write",typeByStageType:{chapter_generation:"write",knowledge_retrieval:"understand"},fallbackType:"write"},"finalize.rebuild":{phase:"close",typeByStageType:{validation:"close",fact_extraction:"close",reference:"close",knowledge_retrieval:"close"},fallbackType:"close"},"finalize.delivery":{phase:"deliver",typeByStageType:{validation:"deliver",reference:"deliver",fact_extraction:"deliver"},fallbackType:"deliver"},"finalize.pipeline":{phase:"deliver",typeByStageType:{reference:"deliver",validation:"deliver",fact_extraction:"deliver"},fallbackType:"deliver"},"document.lifecycle":{phase:"prepare",typeByStageType:{validation:"prepare",reference:"prepare"},fallbackType:"prepare"}};function aS(a){let b=a.replace(/[^A-Za-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"");return b.length>0?b.slice(0,48):"none"}function aT(a){let b=0x811c9dc5;for(let c=0;c<a.length;c+=1)b^=a.charCodeAt(c),b=Math.imul(b,0x1000193)>>>0;return b.toString(16).padStart(8,"0")}function aU(a){return"chapter_generation"===a.type||/^agent-chapter-task-/u.test(a.roleId||"")}let aV=globalThis,aW=aV.__customizeAgentNodeLedgers??=new Map;function aX(a,b){let c=aw(a,b),d=aW.get(c);if(d&&(0,ac.existsSync)(c))return d;let e=aD(a,b),f=new Map,g=0;for(let a of e)f.set(a.id,a.seq),Number.isFinite(a.seq)&&(g=Math.max(g,a.seq+1));let h={nodes:new Map(e.map(a=>[a.id,a])),seqById:f,nextSeq:g};return aW.set(c,h),h}function aY(a){return"string"==typeof a.title&&a.title.length>0?a.title:String(a.type)}function aZ(a){return"string"!=typeof a||0===a.length?{}:a.length<=160?{note:a,noteChars:a.length}:{note:`${a.slice(0,160)}…`,noteChars:a.length}}function a$(a,b){let c=function(a){let b=aR[a];if(!b)throw new au("node-log-node-invalid",`批次「${String(a)}」未在迁移台账内(S10.1:逐批迁移)。要迁移新的一批:先在 emitNode.ts 的台账注释与 EMIT_NODE_BATCHES 里登记,再改调用点——半个批次(同一事实两个写入者)比不迁移更糟。`);return b}(b.batch),d=b.stage,e=b.baseDir??a.nodeLogBaseDir??a.global?.nodeLogBaseDir,f=function(a){let b="string"==typeof a.documentId&&a.documentId.length>0?a.documentId:void 0,c=a.global?.input?.documentId;return b??("string"==typeof c&&c.length>0?c:void 0)}(a),g=f?aX(f,e):void 0,h=d?.roleId,i=b.round,j=b.type??(h&&void 0!==i?"round":void 0)??c.typeByStageType[d?.type??""]??c.fallbackType,k=b.title??(h&&void 0!==i?d?.subtitle??(d?aY(d):void 0):void 0)??(d?aY(d):void 0)??String(j),l=void 0!==i&&i>1&&!k.includes(`第 ${i} 轮`)?`${k} \xb7 第 ${i} 轮`:k,m=b.status??(d?aO[d.status]:void 0)??"running",n=b.progress??d?.progress,o=n&&"completed"===m&&"number"==typeof n.total&&n.total>0&&"number"==typeof n.current&&n.current<n.total?{...n,current:n.total}:n,p=b.issues??function(a){let b=a?.details;if(Array.isArray(b)&&0!==b.length)return b.map(a=>({level:"info",message:a,source:aI}))}(d),q={...aZ(d?.message),...d?{stageType:d.type,stageRoleId:d.roleId||"",...void 0!==d.promptId?{stagePromptId:d.promptId}:{},...void 0!==d.subtitle?{stageSubtitle:d.subtitle}:{},...void 0!==d.order?{stageOrder:d.order}:{}}:{},...void 0!==i?{roundIteration:i}:{},...b.metrics??{}};if(!f||!g)return{...void 0!==i?{round:i}:{},skippedNodes:"no-doc-id"};let r=b.id??(d?h&&void 0!==i?`round:${h}`:`st.${aS(d.type)}.${aS(d.roleId||"none")}.${aT(aU(d)?[d.type,d.roleId||"",d.promptId||"",d.subtitle||"",d.order??""].join("::"):[d.type,d.roleId||"",d.promptId||""].join("::"))}`:`${aS(j)}.${aT(`${b.parentId??aM(c.phase)}::${l}`)}`),s=b.chapterId??(d&&aU(d)?function(a){let b=/^agent-chapter-task-(.+)$/u.exec(a.roleId||"");return b?.[1]}(d):void 0),t=b.parentId??(s?aN(s):void 0)??aM(c.phase),u=e?{baseDir:e}:{},v=t.startsWith("chapter:")?b.chapterTitle:t.startsWith("round:")?b.parentTitle??d?.subtitle??d?.title:b.parentTitle;!function a(b,c,d,e){if(d.nodes.has(c))return;let f=function(a){let b=/^phase:(.+)$/u.exec(a);if(b){let a=aK[b[1]];if(a)return{type:a.type,title:a.title}}return a.startsWith("chapter:")?{type:"chapter",title:a.slice(8),parentId:aM("write")}:a.startsWith("round:")?{type:"round",title:a.slice(6),parentId:aM("close")}:void 0}(c);if(!f)throw new au("node-log-node-invalid",`parentId「${c}」不是本桥认识的结构化 id(phase:* / chapter:* / round:* 三种前缀)。裸 id 的父节点必须先由某个调用点自己 emit 出来——否则补丁会打在空气上(node-log-patch-target-missing)。要新增结构层:在 parseStructuralId 与 PHASE_ROOTS 里显式登记,不要就地拼字符串。`);f.parentId&&a(b,f.parentId,d,{baseDir:e.baseDir});let g=d.nextSeq;d.nextSeq+=1;let h={id:c,...void 0!==f.parentId?{parentId:f.parentId}:{},type:f.type,title:e.title??f.title,seq:g,status:"running",startedAt:Date.now()};aB(b,h,e.baseDir?{baseDir:e.baseDir}:{}),d.nodes.set(h.id,h),d.seqById.set(h.id,g)}(f,t,g,{...void 0!==v?{title:v}:{},...u});let w=g.nodes.get(r),x=b.startedAt??w?.startedAt??Date.now(),y=void 0!==w&&!aQ.has(w.status),z=aQ.has(m)&&!y,A=b.completedAt??(aQ.has(m)?z?x:Date.now():void 0),B=z?{...q,instantEvent:!0}:q;if(w){let a={id:r,status:m,...w.title!==l?{title:l}:{},...void 0!==o?{progress:o}:{},...Object.keys(B).length>0?{metrics:B}:{},...void 0!==p?{issues:p}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{},...void 0!==A?{completedAt:A}:{}};aC(f,a,u),g.nodes.set(r,a_(w,a))}else{let a={id:r,parentId:t,type:j,title:l,seq:g.nextSeq,status:m,startedAt:x,...void 0!==A?{completedAt:A}:{},...void 0!==o?{progress:o}:{},...Object.keys(B).length>0?{metrics:B}:{},...void 0!==p?{issues:p}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{}};return aB(f,a,u),g.seqById.set(r,a.seq),g.nextSeq+=1,g.nodes.set(r,a),{nodeId:r,seq:a.seq,status:m,...void 0!==i?{round:i}:{}}}return{nodeId:r,seq:g.seqById.get(r)??w.seq,status:m,...void 0!==i?{round:i}:{}}}function a_(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),d}var a0=c(42948),a1=c(73055),a2=c(86282),a3=c(5518),a4=c(9848);function a5(a,b,c){let d=a.readSnapshot(()=>{if(!Object.hasOwn(b.sources,c.filePath))throw Error("视图文件不属于冻结项目");let d=a.parsedFileFingerprint(c.filePath);if(d.sha256!==b.sources[c.filePath].sha256)throw Error("视图解析身份已经变化,不能与旧项目绑定");let e=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(e?.version!==ag.CAD_SCENE_VERSION)throw Error("视图场景版本不兼容");if(!a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload)throw Error("视图图框身份不存在");return{actual:d,scene:a.loadCadScene(c.filePath)}}),e=(0,ag.renderCadSourceView)(d.scene,c);return{...e,receipt:{...e.receipt,filePath:c.filePath,projectSnapshotId:b.snapshotId,parsedIdentity:d.actual.sha256,frameEntities:e.receipt.visibleAnnotations.length,recordsComplete:!0,completeScope:"projected-geometry-and-indexed-annotations-assigned-to-selected-frame",unassignedEntitiesIncluded:!1}}}function a6(a,b,c){return a.readSnapshot(()=>{if(!c||"string"!=typeof c.filePath||!Object.hasOwn(b.sources,c.filePath))throw Error("CAD证据文件不属于冻结项目");let d=a.parsedFileFingerprint(c.filePath);if(d.sha256!==b.sources[c.filePath].sha256)throw Error("CAD证据解析身份已经变化");let e=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(e?.version!==ag.CAD_SCENE_VERSION)throw Error("CAD证据结构版本不兼容");let f=a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload;if(!f)throw Error("CAD证据的真实图框不存在");if("string"!=typeof c.rawValue||!/^[+−-]?\d+(?:\.\d+)?$/u.test(c.rawValue.trim()))throw Error("CAD单值须为一个实际数字,不得取范围端点或解析显示字符串猜值");if("string"!=typeof c.valueEntityId||!Array.isArray(c.unitEntityIds)||!c.unitEntityIds.length||!Array.isArray(c.scopeEntityIds)||!c.scopeEntityIds.length)throw Error("CAD单值、单位和部位定位须完整且不重复");let g=[c.valueEntityId,...c.unitEntityIds,...c.scopeEntityIds];if(g.length>12||g.some(a=>"string"!=typeof a)||new Set(g).size!==g.length)throw Error("CAD单值、单位和部位定位须完整且不重复");let h=g.map(b=>{let d=a.queryMaterialEntityPage(c.filePath,{kind:"cad-entity",entityId:b,offset:0,limit:1}).records[0]?.payload;if(!d||d.sheet!==c.frameId||Array.isArray(d.sheetCandidates)&&d.sheetCandidates.length>1)throw Error("CAD实体不属于同一明确图框,不能跨图或跨歧义对象绑定");return d}),i=h[0];if("string"!=typeof i.text||(0,ag.decodeCadString)(i.text).trim()!==c.rawValue.trim())throw Error("CAD数值不是实际标注的完整原文;未确认格式码或复合值须先解释");return{projectSnapshotId:b.snapshotId,filePath:c.filePath,parsedIdentity:d.sha256,sceneVersion:e.version,frame:f,value:i,unitAnnotations:h.slice(1,1+c.unitEntityIds.length),scopeAnnotations:h.slice(1+c.unitEntityIds.length),sourceQuality:e.quality,drawingCoordinateUnits:e.units,applicability:"not-evaluated",approvedForWriting:!1}})}async function a7(a){let b=a.candidate;if(!b||!["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"].includes(b.attribute)||!["m","mm","cm"].includes(b.unit)||!b.objectName?.trim()||b.objectName.length>300||!b.condition?.trim()||b.condition.length>1e3)throw Error("几何候选属性、对象、工况或单位无效");if(/^(?:[\dA-Za-z\s\-—~~]+)?(?:剖面(?:图)?|截面(?:图)?|详图|平面图)(?:[((][^))]*[))])?$/u.test(b.objectName.trim())||/^(?:场地整平后高程|场地整平后标高|开挖面高程|开挖面标高|坑底标高|桩长|桩径)$/u.test(b.objectName.trim()))throw Error("图名、剖面编号或属性名不能代替实际施工部位,须继续核对区段/构件对应关系");let c=a.readEvidence(b.evidence);if(c.projectSnapshotId!==a.project.snapshotId||c.parsedIdentity!==a.project.sources[b.evidence.filePath]?.sha256)throw Error("几何证据与当前冻结项目不一致");if(!c.unitAnnotations.some(a=>"string"==typeof a.displayText&&a.displayText.trim()===b.unit))throw Error("候选单位没有实际单位文字实体支持,不能从INSUNITS或制图惯例猜值");if(!a.views.length||a.views.length>4||a.views.some(d=>d.receipt.parsedIdentity!==c.parsedIdentity||d.receipt.filePath!==c.filePath||d.receipt.frameId!==b.evidence.frameId||d.receipt.projectSnapshotId!==a.project.snapshotId))throw Error("几何复核视图不属于同一冻结来源身份");let d=new Set(a.views.flatMap(a=>a.receipt.visibleAnnotations.map(a=>a.id))),f=[b.evidence.valueEntityId,...b.evidence.unitEntityIds,...b.evidence.scopeEntityIds];if(f.some(a=>!d.has(a)))throw Error("数值、单位说明和部位实体必须在已提供视图中可核对,不能用未看的节点补成完整关系");let g=JSON.stringify({task:"独立审核图示工程属性,不代写正文",candidate:b,sourceEvidence:c,views:a.views.map(a=>({...a.receipt,sourceQuality:void 0,visibleAnnotations:a.receipt.visibleAnnotations.filter(a=>f.includes(a.id)),visibleAnnotationCount:a.receipt.visibleAnnotations.length,renderingLimitations:a.receipt.renderingLimitations})),instructions:'逐项确认实际数值、单位文字及其适用符号、真实施工部位、施工工况和属性。必须核对剖面编号与实际区段/构件的对应关系;只知道来源剖面、不知道施工部位不能confirmed。同图框相邻不证明属于同一对象,主体开挖面、板顶/支撑标高、垫层底和排水沟底不得混用;图框或图例无法辨认、单位只靠惯例、局部值推广全工程、阶段关系未核或被省略实体影响判断,返回unmeasured/rejected。不要由绘图坐标差计算工程值。只返回JSON {status:"confirmed"|"rejected"|"unmeasured",reason:"具体依据与限制"}。'}),h=await a.reviewer({prompt:g,images:a.views.map((a,b)=>({name:`同一真实图框局部${b+1}`,png:a.png}))});if(!h||!["confirmed","rejected","unmeasured"].includes(String(h.status))||"string"!=typeof h.reason||!h.reason.trim())throw Error("独立几何复核结果无效");return a.readEvidence(b.evidence),{candidate:b,proof:c,review:{status:h.status,reason:h.reason},sourceViewHashes:a.views.map(a=>(0,e.createHash)("sha256").update(a.png).digest("hex")),normalizedValue:"confirmed"===h.status?`${b.evidence.rawValue.trim()}${b.unit}`:null,approvedForWriting:"confirmed"===h.status,expertValidated:!1}}function a8(a){if(!a.approvedForWriting||"confirmed"!==a.review.status||!a.normalizedValue)return;let{candidate:b,proof:c}=a;if(a.normalizedValue!==`${b.evidence.rawValue.trim()}${b.unit}`||64!==c.parsedIdentity.length)throw Error("已复核CAD属性的值或解析身份不一致");let d={ground_elevation:"场地整平后地面标高",pit_bottom_elevation:"主体开挖面标高",foundation_elevation:"基础控制标高",pile_length:"桩长",pile_diameter:"桩径"},f={parsedIdentity:c.parsedIdentity,frameId:b.evidence.frameId,valueEntityId:b.evidence.valueEntityId,rawValue:b.evidence.rawValue,unit:b.unit,unitEntityIds:[...b.evidence.unitEntityIds],scopeEntityIds:[...b.evidence.scopeEntityIds],condition:b.condition,reviewReason:a.review.reason,sourceViewHashes:[...a.sourceViewHashes]};return{factId:`cad-reviewed:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,b.attribute,b.objectName,a.normalizedValue,f])).digest("hex").slice(0,24)}`,fieldId:b.attribute,fieldName:d[b.attribute],key:d[b.attribute],objectName:b.objectName,value:a.normalizedValue,sourceFile:c.filePath,roleId:"cad-reviewed-geometry",processingType:"drawing",confidence:.9,sourceRef:{filePath:c.filePath,roleId:"cad-reviewed-geometry",sourceSpan:b.evidence.rawValue,cadInterpretation:f}}}let a9=a=>a?JSON.parse(a.replace(/^\s*```(?:json)?\s*/u,"").replace(/\s*```\s*$/u,"")):void 0,ba=["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"],bb=(a,b,c)=>{if(!Object.hasOwn(b.sources,c)||a.parsedFileFingerprint(c).sha256!==b.sources[c].sha256)throw Error("CAD准备期间解析来源已变化")};async function bc(a){let b,c=[],d=[],f=a.caller??h.rI,g=ba.filter(b=>a.requestedAttributes.includes(b));if(!g.length||!a.filePaths.length)return{facts:c,readings:d,complete:!1};let i=a.read(b=>b.readSnapshot(()=>a.filePaths.map(c=>{bb(b,a.project,c);let d=b.loadMaterialEntities(c,"cad-scene-quality")[0]?.payload;if(d?.version!==ag.CAD_SCENE_VERSION)return{filePath:c,frames:[],complete:!1,reason:"结构版本尚未支持当前图示复核"};let e=b.queryMaterialEntityPage(c,{kind:"cad-frame",offset:0,limit:24}),f=[...e.records];for(let a=24;a<Math.min(e.total,96);a+=24)f.push(...b.queryMaterialEntityPage(c,{kind:"cad-frame",offset:a,limit:24}).records);return{filePath:c,frames:f.map(a=>{let b=a.payload;return{id:b.id,title:b.title,name:b.name,drawingNumber:b.drawingNumber}}),complete:f.length===e.total}})));if(i.every(a=>0===a.frames.length))return d.push(...i.map(a=>({filePath:a.filePath,status:"unmeasured",reason:a.reason??"当前解析没有可供图像复核的实际图框;须通过真实根实例读取标注并继续核对对象和工况,不能据此认定工程属性不存在",catalogComplete:a.complete}))),{facts:c,readings:d,complete:!1};let j=0;try{b=a9(await f("你是工程资料读图智能体,选择真实图框以准备施工控制属性。",JSON.stringify({requestedAttributes:g,catalog:i,instructions:"只选择与请求属性有关的真实图框,最多四个;剖面、详图和平面按实际图名及部位综合判断。目录截断或资料尚未理解不代表没有参数。仅返回JSON {frames:[{filePath,frameId,attributes:[]}]};不得自造ID,不取数字、不写施工正文。"}),!0,{diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:2e3}));let e=b?.frames;if(!Array.isArray(e)||e.length>4)throw Error("读图选择没有返回有限的实际图框");let h=e.map(a=>{if(!i.some(b=>b.filePath===a.filePath&&b.frames.some(b=>b.id===a.frameId))||!Array.isArray(a.attributes)||!a.attributes.length||a.attributes.some(a=>!g.includes(a)))throw Error("读图选择超出实际目录或请求属性");return a});if(new Set(h.map(a=>JSON.stringify([a.filePath,a.frameId]))).size!==h.length)throw Error("读图选择重复,不能对同图框重复消耗模型预算");let k=h.map(a=>({selection:a,status:"unmeasured"}));d.push(...k);let l=0;await Promise.all(Array.from({length:Math.min(2,h.length)},async()=>{for(;l<h.length;){let b=l++,d=h[b];a.signal?.throwIfAborted();let e=k[b];try{let b=a.read(b=>b.readSnapshot(()=>{bb(b,a.project,d.filePath);let c=b.queryMaterialEntityPage(d.filePath,{kind:"cad-frame",entityId:d.frameId,offset:0,limit:1}).records[0]?.payload,e=b.loadCadScene(d.filePath);if(!c)throw Error("图框身份失效,不能以不完整标注确认控制值");let f=c.polygon,g={minX:Math.min(...f.map(a=>a.x)),maxX:Math.max(...f.map(a=>a.x)),minY:Math.min(...f.map(a=>a.y)),maxY:Math.max(...f.map(a=>a.y))},h=e.annotations.filter(a=>a.sheet===d.frameId&&a.text.trim()).map(a=>({id:a.id,text:(0,ag.projectCadAnnotationText)(a.text,a.entityType),position:a.position}));return{bounds:g,annotations:h}}));if(JSON.stringify(b.annotations).length>16e4)throw Error("图框文字超过当前完整理解预算,需进一步分区取证");let g=a.read(b=>a5(b,a.project,{filePath:d.filePath,frameId:d.frameId,width:3200,fontPath:a.fontPath})),h=(b.bounds.minX+b.bounds.maxX)/2,i=(b.bounds.minY+b.bounds.maxY)/2,k=[{minX:b.bounds.minX,maxX:h,minY:i,maxY:b.bounds.maxY},{minX:h,maxX:b.bounds.maxX,minY:i,maxY:b.bounds.maxY},{minX:b.bounds.minX,maxX:h,minY:b.bounds.minY,maxY:i},{minX:h,maxX:b.bounds.maxX,minY:b.bounds.minY,maxY:i}].map(b=>a.read(c=>a5(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath}))),l=await f("你是施工技术资料读图智能体。候选必须指向实际原始实体,不能靠数字相邻猜工程属性。",JSON.stringify({selection:d,sourceView:{...g.receipt,sourceQuality:void 0,visibleAnnotations:void 0},annotations:b.annotations,actualScalarAnnotations:b.annotations.filter(a=>/^[+−-]?\d+(?:\.\d+)?$/u.test(String(a.text).trim())),partitions:k.map((a,b)=>({imageIndex:b,viewport:a.receipt.viewport})),instructions:"四张图按左上、右上、左下、右下完整分区读取,属于同一真实图框。结合图形、标高符号、单位说明和文字定位实际施工部位与工况;剖面编号只是来源定位,objectName须写对应区段/构件等实际工程对象,不得仅用“4-4剖面”或“开挖面高程”充当施工对象。scopeEntityIds须同时包含真实部位与解释施工工况的实体。主体垫层底、支撑、结构板、排水沟底及局部刻槽不能互换。每个对象分别提出明确属性候选,最多六条。图例xx.xxx是示意占位符,不是工程值。单位须有m/mm/cm实际独立文字实体;裸数值须完整标注原文,不取范围端点,不据绘图坐标相减。仅返回JSON {candidates:[{attribute,objectName,condition,unit,evidence:{valueEntityId,rawValue,unitEntityIds:[],scopeEntityIds:[]}}],unresolved:[]},文件和图框由当前读取上下文固定,不重复抄写地址。图像无法辨认或部位关系未核清时保留unresolved,不编造结论。"}),!0,{files:k.map((a,b)=>({name:`同一实际图框分区${b+1}`,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:6500});e.rawDiscovery=l;let m=a9(l);e.discovery=m;let n=m?.candidates;if(!Array.isArray(n)||n.length>6)throw Error("图示候选超出本次理解预算或协议");let o=a=>{if(!a.evidence||void 0!==a.evidence.filePath&&a.evidence.filePath!==d.filePath||void 0!==a.evidence.frameId&&a.evidence.frameId!==d.frameId)throw Error("候选声明了本次读取之外的来源");let b=a.objectName?.split(/[//]/u).map(a=>a.trim()).filter(Boolean)??[],c=b.filter(a=>!/^[\dA-Za-z\s\-—~~]+剖面(?:图)?$/u.test(a)),e=b.length>1&&c.length&&c.length<b.length?c.join("/"):a.objectName;return{...a,objectName:e,evidence:{...a.evidence,filePath:d.filePath,frameId:d.frameId}}},p=n.map(o),q=p.flatMap((b,c)=>{try{if(!a.read(c=>a6(c,a.project,b.evidence)).unitAnnotations.some(a=>String(a.displayText).trim()===b.unit))throw Error("单位未指向实际m/mm/cm文字实体");if(/^(?:[\dA-Za-z\s\-—~~]+)?剖面(?:图)?$/u.test(b.objectName))throw Error("仅定位来源剖面,尚未对应到实际施工区段");return[]}catch(a){return[{index:c,reason:a instanceof Error?a.message:String(a)}]}});if(q.length){let c=await f("你是工程读图智能体,纠正本次真实来源读取提案,不能编造数值、单位或部位。",JSON.stringify({selection:d,previousCandidates:p,rejectedCandidates:q,actualScalarAnnotations:b.annotations.filter(a=>/^[+−-]?\d+(?:\.\d+)?$/u.test(String(a.text).trim())),annotations:b.annotations,instruction:"只提出有实际图示支持的完整工程属性候选;xx.xxx是图例占位,范围不能取端点。剖面编号须对应实际区段/构件,单位须提供实际单位及说明实体,工况须区分主体和局部。无依据的保留unresolved;不要为补齐数量填数。仅返回JSON {candidates:[{attribute,objectName,condition,unit,evidence:{valueEntityId,rawValue,unitEntityIds:[],scopeEntityIds:[]}}],unresolved:[]}。"}),!0,{files:k.map((a,b)=>({name:`原实际图框分区${b+1}`,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:6500});e.refinement={defects:q,raw:c};let g=a9(c)?.candidates;if(!Array.isArray(g)||g.length>6)throw Error("写前图示纠正未返回完整候选,未执行属性准入");p=g.map(o)}let r=[];for(let g of(e.results=r,p))try{if(j>=12)throw Error("本轮图示候选复核预算已用完,该候选未测量");if(g.evidence?.filePath!==d.filePath||g.evidence?.frameId!==d.frameId||!d.attributes.includes(g.attribute))throw Error("图示候选跨来源、图框或属性");let e=a.read(b=>a6(b,a.project,g.evidence)),h=[e.value,...e.unitAnnotations,...e.scopeAnnotations].map(a=>a.position),i=(function(a,b){if(!b.length||b.some(a=>!Number.isFinite(a.x)||!Number.isFinite(a.y)))throw Error("局部阅读缺少实际实体位置");let c=Math.max(a.maxX-a.minX,a.maxY-a.minY);if(!Number.isFinite(c)||c<=0)throw Error("图框范围无效");let d=[];for(let a of b){let b=d.find(b=>b.every(b=>Math.hypot(b.x-a.x,b.y-a.y)<=.24*c));b?b.push(a):d.push([a])}if(d.length>4)throw Error("数值与单位、部位的图示关系需要超过四个局部,保留未决而不截去限定");return d.map(a=>{let b=Math.min(...a.map(a=>a.x)),d=Math.max(...a.map(a=>a.x)),e=Math.min(...a.map(a=>a.y)),f=Math.max(...a.map(a=>a.y)),g=Math.max(d-b+.08*c,.22*c),h=Math.max(f-e+.08*c,.28*g);return{minX:(b+d-(g=Math.max(g,.8*h)))/2,maxX:(b+d+g)/2,minY:(e+f-h)/2,maxY:(e+f+h)/2}})})(b.bounds,h).map(b=>a.read(c=>a5(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath})));j+=1;let k=await a7({project:a.project,candidate:g,views:i,readEvidence:b=>a.read(c=>a6(c,a.project,b)),reviewer:async b=>a9(await f("你是独立工程读图复核智能体,复验候选的真实适用关系。",b.prompt,!0,{files:b.images.map(a=>({name:a.name,mimeType:"image/png",data:a.png})),diagnostics:a.diagnostics,signal:a.signal,callKind:"fact-extraction",maxTokens:3e3}))});r.push(k);let l=a8(k);l&&c.push(l)}catch(b){a.signal?.throwIfAborted(),r.push({candidate:g,status:"unmeasured",reason:b instanceof Error?b.message:String(b)})}e.status="reviewed"}catch(b){a.signal?.throwIfAborted(),e.reason=b instanceof Error?b.message:String(b)}}}))}catch(c){a.signal?.throwIfAborted(),d.push({status:"unmeasured",selection:b,reason:c instanceof Error?c.message:String(c)})}return{facts:[...new Map(c.map(a=>[(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),a])).values()].sort((a,b)=>a.factId.localeCompare(b.factId)),readings:d,complete:!1}}var bd=c(36594);let be=a=>!!a&&"object"==typeof a&&!Array.isArray(a),bf=a=>"string"==typeof a&&!!a.trim(),bg=a=>Array.isArray(a)?a.map(bg):be(a)?Object.fromEntries(Object.keys(a).sort().filter(b=>void 0!==a[b]).map(b=>[b,bg(a[b])])):a,bh=a=>{let b;return b=JSON.stringify(bg(a)),(0,e.createHash)("sha256").update(b).digest("hex")},bi="project-model-v11-shared-attributes-2026-10-13",bj=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function bk(a){let b=(0,l.nD)(a)?.key,c=a.value;if("schedule_requirement"===b){let a=[...c.matchAll(/\d+(?:\.\d+)?\s*(?:日历天|工作日|天|个月|月)/gu)];1===a.length&&(c=a[0][0].replace(/\s+/gu,""))}return"owner"===b&&(c=c.split(/(?:办公|联系)?地址\s*[::]/u)[0].replace(/[((]\s*$/u,"").trim()),c===a.value?a:{...a,value:c,sourceRef:a.sourceRef?{...a.sourceRef,sourceSpan:a.sourceRef.sourceSpan??a.value}:void 0}}async function bl(a){let b=a.global.input.signal;(0,a1.Te)(b);let c=[...new Set(a.prepare.materialFilePaths)].sort(),f=ai(a.prepare.projectRoot,c);if(f.length)throw Error(`项目资料解析检查未通过:${f.map(a=>a.message).join(";")}`);let g=await (0,ah.E8)(a.prepare.projectRoot,c,b),h=c.flatMap(b=>a.understanding.project.listEvidenceChunks({relativePath:b}).map(c=>({chapterId:"project-model",filePath:b,content:c.content,sectionTitle:c.sectionTitle,chunkIndex:c.chunkIndex,roleId:a.understanding.fileRoleByPath.get(b),processingType:a.understanding.fileProcessingByPath.get(b),score:1,source:"parsed-project-model"}))),i=(0,ah.VD)(a.prepare.projectRoot,a=>a.listIndexSourceStates(c)),j=(0,s.cW)(af().join(j_(a.prepare.projectRoot),"assets","source-editions")),m=(0,s.mb)(c.map(b=>({sourceFile:b,parsedSha256:g[b].sha256,sourceSha256:i.find(a=>a.relativePath===b).contentHash,sourceKind:a.prepare.kindByPath?.get(b),processingType:h.some(a=>a.filePath===b&&/(?:^|\n)\s*\|[^\n]+\|\s*\n\s*\|[ :|-]+\|/u.test(a.content))?"table":a.understanding.fileProcessingByPath.get(b),chunks:h.filter(a=>a.filePath===b).map(a=>({chunkIndex:a.chunkIndex,content:a.content}))})),j.confirmations,j.assets),n=(0,al.Zh)(a.prepare.template,a.prepare.documentSpec).filter(b=>{let c=a.planning.requiredContentNeeds?.[b.name];return!c||"project-fact"===c.kind}),o=k(a.planning.generationDiagnostics),p=(0,aj.C)("projectFacts"),q=af().join(j_(a.prepare.projectRoot),"assets","reviewed-cad"),r=ad().existsSync(q)?ad().readdirSync(q).filter(a=>/^[0-9a-f]{64}\.json$/u.test(a)).sort().map(a=>[a,(0,e.createHash)("sha256").update(ad().readFileSync(af().join(q,a))).digest("hex")]):[],t=bj({version:bi,targets:n,localFactTargets:(0,al.Uy)(a.prepare.template,a.prepare.documentSpec),domain:a.prepare.domainProfile,prompt:a.prepare.factExtractionPromptTexts,modelIdentity:o,algorithmIdentity:p,registeredCadAssets:r,extractionTuning:{maxChars:(0,a2.z)().factExtractionMaxChars}}),u=bj({sources:g,contextHash:t,sourceVersionPolicyId:m.policyId}),v=af().join(j_(a.prepare.projectRoot),"project-model-cache",`${u}.json`);if(p&&ad().existsSync(v))try{let a=JSON.parse(ad().readFileSync(v,"utf8")),b=a.data;if(!b||bj(b)!==a.sha256)throw Error("项目事实缓存内容校验不通过");if(b.version===bi&&b.inputHash===u&&bj(b.sources)===bj(g)&&b.sourceVersionPolicy?.policyId===m.policyId&&Array.isArray(b.facts)&&Array.isArray(b.tables)&&Array.isArray(b.unresolvedFields))return{...b,cacheHit:!0}}catch{}let w=(0,ak.d6)({evidence:h,template:a.prepare.template,spec:a.prepare.documentSpec,diagnostics:a.planning.generationDiagnostics,parsedOnly:!0}),x=a=>{let b=(0,l.nD)(a)?.key;return!b||!["project_name","project_scope","project_code","owner","project_location","foundation_support_form"].includes(b)||(0,ak.R7)(b,a.value)},y=(0,a1.lX)([...w.localFacts,...w.projectBasicFacts,...(0,l.UT)(h),...function(a){let b=new Map;for(let c of a){let a=c.content.replace(/\s+/gu," "),d=/R(\d+)C(\d+)\s+(?:材料\/设备名称|材料名称|设备名称)\s*[::]\s*(.+?)\s+R\1C(\d+)\s+推荐品牌\s*[::]\s*(.+?)(?=\s+R\d+C\d+\b|$)/giu;for(let f of a.matchAll(d)){let a=f[3].trim(),d=f[5].trim();if(!a||!d||/^(?:无|暂无|未指定|见.*)$/u.test(d))continue;let g=`source-brand:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f[1],f[4],a,d])).digest("hex").slice(0,24)}`;b.set(g,{factId:g,fieldId:"recommended_brand",fieldName:"推荐品牌",key:"推荐品牌",objectName:a,value:d,sourceFile:c.filePath,roleId:c.roleId||"parsed-table",processingType:c.processingType||"table",confidence:.9,sourceRef:{filePath:c.filePath,roleId:c.roleId||"parsed-table",chunkIndex:c.chunkIndex,sectionTitle:c.sectionTitle,cellRange:`R${f[1]}C${f[4]}`,sourceSpan:f[0]}})}}return[...b.values()]}(h),...function(a){let b=new Map;for(let c of a){let a=c.content.replace(/\s+/gu," ");for(let d of a.matchAll(/(?:新建|建设|建造)\s*(\d+)\s*栋\s*(\d+)\s*层(?:的)?\s*([\u4e00-\u9fff]{0,18}?(?:用房|厂房|住宅楼|教学楼|宿舍楼|办公楼|大厦))/gu)){if(/远期|设想|建议|目标/u.test(a.slice(Math.max(0,d.index-12),d.index)))continue;let f=d[3];for(let[a,g,h]of[["building_count","建设栋数",`${d[1]}栋`],["building_floors","建筑层数",`${d[2]}层`]]){let i=`source-scale:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f,a,h])).digest("hex").slice(0,24)}`;b.set(i,{factId:i,fieldId:a,fieldName:g,key:g,objectName:f,value:h,sourceFile:c.filePath,roleId:c.roleId||"parsed-project-scope",confidence:.9,sourceRef:{filePath:c.filePath,roleId:c.roleId||"parsed-project-scope",chunkIndex:c.chunkIndex,sectionTitle:c.sectionTitle,sourceSpan:d[0]}})}}}return[...b.values()]}(h)]).map(bk).filter(x);y.push(...(0,bd.Yn)(h,m));let z=y.filter(a=>(0,a4.p)(a).requiresTechnicalDecision&&/\.(?:dwg|dxf)$/iu.test(a.sourceFile)),A=!1;if(z.length){let c=[...new Set(z.flatMap(a=>{let b=(0,l.nD)(a)?.key??a.fieldId??a.key;return"excavation_depth"===b?["ground_elevation","pit_bottom_elevation"]:"foundation_depth"===b?["ground_elevation","foundation_elevation"]:[b]}))],d={snapshotId:bj({inputHash:u,sources:g,stage:"cad-before-freeze"}),sources:g},e=function(a){let b,c=(b=a.generatedDir,af().join(b,"assets","reviewed-cad")),d=new Map,e=[];if(!ad().existsSync(c))return{facts:[],reuseReceipts:e,complete:!1};for(let b of ad().readdirSync(c).filter(a=>/^[0-9a-f]{64}\.json$/u.test(a)).sort()){let f=af().join(c,b),g=b.slice(0,-5);try{let b=JSON.parse(ad().readFileSync(f,"utf8"));if(!be(b)||b.id!==g||!be(b.data)||"reusable-reviewed-cad-v1-2026-10-08"!==b.data.version||b.contentHash!==bh(b.data)||!be(b.data.provenance)||b.id!==bh({version:b.data.version,provenance:b.data.provenance}))throw Error("CAD历史资产完整性校验失败");let{audit:c,results:h,modelMetadata:i}=function(a){let b;if(!be(a)||!bf(a.kind)||!be(a.result))throw Error("历史CAD资产必须为完整审核envelope,不能仅提供事实或项目模型");if(bf(a.model))b={scope:"original-audit",model:a.model};else if(be(a.llm)&&Array.isArray(a.llm.modelChoices)&&a.llm.modelChoices.some(a=>be(a)&&bf(a.chosen)&&bf(a.provider)))b={scope:"original-audit-call-ledger",llm:a.llm,perResultReviewerModel:"not-recorded"};else throw Error("历史CAD审核缺少原模型来源元数据,不能冒称本轮重新视觉审核");let c=(Object.hasOwn(a.result,"candidate")?[a.result]:Array.isArray(a.result.readings)?a.result.readings.flatMap(a=>be(a)&&Array.isArray(a.results)?a.results:[]):[]).filter(a=>be(a)&&!0===a.approvedForWriting);if(!c.length)throw Error("历史CAD资产没有完整核准结果,裸事实和未决候选不能复用");for(let a of c){if(!be(a.candidate)||!be(a.candidate.evidence)||!be(a.proof)||!be(a.review)||"confirmed"!==a.review.status||!bf(a.review.reason)||!1!==a.expertValidated||!bf(a.candidate.objectName)||!bf(a.candidate.condition)||!["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"].includes(String(a.candidate.attribute))||!["m","mm","cm"].includes(String(a.candidate.unit))||!Array.isArray(a.sourceViewHashes)||!a.sourceViewHashes.length||a.sourceViewHashes.length>4||a.sourceViewHashes.some(a=>"string"!=typeof a||!/^[0-9a-f]{64}$/u.test(a))||!bf(a.proof.projectSnapshotId)||!bf(a.proof.parsedIdentity)||!/^[0-9a-f]{64}$/u.test(a.proof.parsedIdentity)||!be(a.proof.frame)||!be(a.proof.value)||!Array.isArray(a.proof.unitAnnotations)||!a.proof.unitAnnotations.length||!Array.isArray(a.proof.scopeAnnotations)||!a.proof.scopeAnnotations.length)throw Error("历史CAD核准缺少候选、图示证明、原审核或图像哈希");let b=a.candidate.evidence;if(!bf(b.filePath)||!bf(b.frameId)||!bf(b.valueEntityId)||!bf(b.rawValue)||!/^[+−-]?\d+(?:\.\d+)?$/u.test(b.rawValue.trim())||!Array.isArray(b.unitEntityIds)||!b.unitEntityIds.length||!Array.isArray(b.scopeEntityIds)||!b.scopeEntityIds.length||a.normalizedValue!==`${b.rawValue.trim()}${a.candidate.unit}`)throw Error("历史CAD核准的单值、单位或部位实体证据不完整");if(/^(?:[\dA-Za-z\s\-—~~]+)?(?:剖面(?:图)?|截面(?:图)?|详图|平面图)$/u.test(a.candidate.objectName.trim()))throw Error("历史核准尚未绑定实际施工对象,不能用来源图名代替")}return{audit:a,results:c,modelMetadata:b}}(b.data.originalAudit);if(b.data.provenance.originalAuditKind!==c.kind||bh(b.data.provenance.originalModelMetadata)!==bh(i))throw Error("历史审核来源或模型元数据与原始回执不一致");for(let[c,i]of h.entries()){if(a.requestedAttributes&&!a.requestedAttributes.includes(i.candidate.attribute))continue;let h=b.data.provenance,j={assetId:g,assetPath:f,...h,candidateIndex:c,originalProjectSnapshotId:i.proof.projectSnapshotId,status:"rejected",reason:"",currentVisionReviewPerformed:!1,expertValidated:!1};try{!function(a,b,c){let d=a.candidate.evidence,e=c(d),f=a.proof;if(e.projectSnapshotId!==b.snapshotId||e.parsedIdentity!==b.sources[d.filePath]?.sha256||f.parsedIdentity!==e.parsedIdentity||f.filePath!==d.filePath)throw Error("历史CAD审核的冻结解析指纹与当前来源不一致");let g=a=>({filePath:a.filePath,parsedIdentity:a.parsedIdentity,sceneVersion:a.sceneVersion,frame:a.frame,value:a.value,unitAnnotations:a.unitAnnotations,scopeAnnotations:a.scopeAnnotations,drawingCoordinateUnits:a.drawingCoordinateUnits});if(bh(g(e))!==bh(g(f)))throw Error("历史CAD审核的图框、量值、单位或范围实体与当前证明不一致");if(!e.unitAnnotations.some(b=>"string"==typeof b.displayText&&b.displayText.trim()===a.candidate.unit))throw Error("历史CAD单位没有当前实际单位文字实体支持");if(!a8(a))throw Error("历史审核没有准入可写事实")}(i,a.project,a.readEvidence);let b=a8(i);d.set(b.factId,b),j.status="reused",j.reason="当前冻结解析与实际实体证明均与历史完整图示审核一致;保留原审核,不宣称本轮模型重新看图",j.factId=b.factId,j.verification="current-entities-match-historical-review"}catch(a){j.reason=a instanceof Error?a.message:String(a)}e.push(j)}}catch(a){e.push({assetId:g,assetPath:f,status:"rejected",reason:a instanceof Error?a.message:String(a),currentVisionReviewPerformed:!1,expertValidated:!1})}}return{facts:[...d.values()],reuseReceipts:e,complete:!1}}({generatedDir:j_(a.prepare.projectRoot),project:d,requestedAttributes:c,readEvidence:b=>(0,ah.VD)(a.prepare.projectRoot,a=>a6(a,d,b))});y.push(...e.facts);let f=[...new Set(z.map(a=>a.sourceFile))].filter(a=>!c.every(b=>e.facts.some(c=>c.sourceFile===a&&c.fieldId===b)));a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"cad-historical-reuse.json",e,a.global.input.runId);let h=f.length?await bc({project:d,filePaths:f,requestedAttributes:c,diagnostics:a.planning.generationDiagnostics,signal:b,read:b=>(0,ah.VD)(a.prepare.projectRoot,b),fontPath:ad().existsSync("/System/Library/Fonts/STHeiti Light.ttc")?"/System/Library/Fonts/STHeiti Light.ttc":void 0}):void 0;h&&(y.push(...h.facts),A=!h.facts.length||!h.readings.length||h.readings.some(a=>"reviewed"!==a.status||Array.isArray(a.results)&&a.results.some(a=>"unmeasured"===a.status||a.review?.status==="unmeasured")),a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"cad-writing-preparation.json",h,a.global.input.runId))}let B=b=>af().join(j_(a.prepare.projectRoot),"project-model-cache",`source-${bj([b,g[b].sha256,t])}.json`),C=a=>{let b=(0,d.K3)(a.value);return!!b&&h.some(c=>c.filePath===a.sourceFile&&(a.sourceRef?.chunkIndex===void 0||a.sourceRef.chunkIndex===c.chunkIndex)&&(0,d.K3)(c.content).includes(b))};for(let a of c)if(p)try{let b=JSON.parse(ad().readFileSync(B(a),"utf8"));bj(b.data)===b.sha256&&Array.isArray(b.data)&&y.push(...b.data.filter(C).map(bk).filter(x))}catch{}let D=n.filter(a=>a.required&&!y.some(b=>(0,ak.PV)(b,a))),E=new Map;for(let b of D)E.set(b.id,h.filter(a=>(0,al.I2)(a,b)).sort((c,d)=>{let e=c=>(0,ag.carrierStrength)((0,ag.domainForAttribute)(b.name),(0,ag.resolveCarrier)({kind:a.prepare.kindByPath?.get(c.filePath)??c.processingType??"other",section:c.sectionTitle}));return e(d)-e(c)||d.content.split(b.name).length-c.content.split(b.name).length||c.filePath.localeCompare(d.filePath)||c.chunkIndex-d.chunkIndex}));let F=[...new Map(D.flatMap(a=>E.get(a.id)??[]).map(a=>[`${a.filePath}\0${a.chunkIndex}\0${a.sectionTitle}\0${a.content}`,a])).values()];a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),"project-fact-extraction-scope.json",{projectAttributeTargets:n,missingAttributes:D.map(a=>({...a,candidateCount:E.get(a.id)?.length??0})),otherContentDuties:(0,al.Uy)(a.prepare.template,a.prepare.documentSpec).filter(a=>!n.some(b=>b.id===a.id)),selectedChunks:F.length,selectedSourceChars:F.reduce((a,b)=>a+b.content.length,0),sourceFiles:c.length,structuredTables:w.structuredTables.length,boundary:"完整解析来源、结构化表与非共同属性义务保留;非共同属性不是全局待填单值字段,也不表示正文已完成"},a.global.input.runId);let G=!1;if(F.length>0){let c={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>D.some(b=>b.id===a||b.name===a))}))},d=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>D.some(b=>b.id===a.id))}:void 0,e=await (0,ak.OQ)(F,a.prepare.factExtractionPromptTexts,c,d,b,a.planning.generationDiagnostics,b=>{a$(a,{batch:"generation.understanding",stage:{type:"fact_extraction",roleId:"project-attribute-extraction",status:"running",message:"done"===b.phase?`共同属性第${b.index}/${b.total}批已核验,累计${b.factsSoFar}条`:`共同属性第${b.index}/${b.total}批${"waiting"===b.phase?"仍在读取":"开始读取"},本批${b.batchChars}字符`}}),a.global.emitProgress()},{cache:an(af().join(j_(a.prepare.projectRoot),"source-fact-response-cache"),a.planning.generationDiagnostics,"literal-source-fact-response-v2"),sourceIdentities:g,onReceipt:b=>{a.global.input.runId&&(0,a0.tv)(j_(a.prepare.projectRoot),`source-fact-batch-${b.index}.json`,b,a.global.input.runId)}});(0,a1.Te)(b);let f=(0,a1.lX)(e.facts).filter(C).map(bk).filter(x);for(let a of(y.push(...f),G=e.stages.some(a=>"failed"===a.status),new Set(f.map(a=>a.sourceFile)))){if(!p||!g[a])continue;let b=[...new Map(y.filter(b=>b.sourceFile===a&&C(b)).map(a=>[bj([a.fieldId,a.key,a.objectName,a.value,a.sourceRef]),a])).values()],c=B(a);ad().mkdirSync(af().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.tmp`;ad().writeFileSync(d,JSON.stringify({data:b,sha256:bj(b)})),ad().renameSync(d,c)}}if(bj((0,ah.Y8)(a.prepare.projectRoot,c))!==bj(g))throw Error("写前理解期间解析资料已变化,不能将旧候选与新来源一起冻结");let H={version:bi,inputHash:u,sources:g,sourceVersionPolicy:m,facts:y,tables:w.structuredTables,unresolvedFields:D.filter(a=>!y.some(b=>(0,ak.PV)(b,a))).map(a=>({id:a.id,name:a.name,status:"unmeasured",candidateCount:E.get(a.id)?.length??0,phase:E.get(a.id)?.length?"attribute-extraction":"source-location",provesMissingSource:!1,candidateLocations:(E.get(a.id)??[]).map(a=>({sourceFile:a.filePath,chunkIndex:a.chunkIndex})),reason:E.get(a.id)?.length?"已有相关解析原文,属性理解尚未完成;不能凭抽取失败认定原文缺料":"当前字段关键词尚未定位原文,未据此判定全库缺料"})),cacheHit:!1};if(p&&!G&&!A){ad().mkdirSync(af().dirname(v),{recursive:!0});let a=`${v}.${process.pid}.tmp`;ad().writeFileSync(a,JSON.stringify({data:H,sha256:bj(H)})),ad().renameSync(a,v)}return H}function bm(a,b){if(b.version!==bi)throw Error("项目事实快照版本失配,须按当前语义属性重新准备,不能转换旧快照用于生成");if(!b.sourceVersionPolicy)throw Error("项目恢复缺少冻结来源版本用途账,须按当前来源重新准备");if((0,s.gM)(b.sourceVersionPolicy),(0,s.cW)(af().join(j_(a),"assets","source-editions")).fingerprint!==b.sourceVersionPolicy.assetFingerprint)throw Error("来源发行确认资产已变化,原项目快照不能继续复用");let{snapshotId:c,...d}=b;if(bj(d)!==c)throw Error("项目事实快照已被改写,不能沿用原快照身份");if(0===Object.keys(b.sources).length){if(b.facts.length>0)throw Error("项目事实没有解析来源身份,不能进入写作或交付评价");return}let e=ai(a,Object.keys(b.sources));if(e.length)throw Error(`写作资料当前解析状态未通过:${e.map(a=>a.message).join(";")};保留草稿,不能使用历史解析继续写作或交付评价`);if(bj((0,ah.Y8)(a,Object.keys(b.sources)))!==bj(b.sources))throw Error("写作期间解析资料已经变更,当前事实快照已过期;保留草稿并使用新快照重新规划受影响任务")}let bn={version:"professional-document-workflow-v123",rules:["registered-field-content-nature-is-shared-by-classification-and-attribute-extraction-without-model-reclassification","retired-unwired-fact-placement-tools-and-old-chapter-task-planner-without-compatibility-adapters","explicit-source-collection-content-kind-with-complete-membership-duty-and-without-scalar-value-admission","shared-project-attribute-preparation-separated-from-complete-source-collection-and-author-content-duties","current-source-bound-literal-extraction-batches-with-independent-validation-persistence-and-shared-provider-concurrency","shared-author-system-and-canonical-plan-prefix-with-task-specific-delegation-at-tail","same-selected-model-composition-separated-from-chief-engineering-reasoning-with-user-thinking-preference-preserved","explicit-full-document-normative-collection-dependency-with-local-basis-tasks-parallel","complete-spatial-region-label-legends-and-task-local-preview-failure-isolation","single-reference-discovery-owner-and-author-task-local-chief-question-indices","shared-provider-capacity-and-evidence-progress-without-cad-text-discard","semantic-project-facts-without-global-raw-numeric-token-expansion","namespaced-original-member-references-with-server-recorded-batch-responses","current-source-model-and-protocol-bound-completed-discovery-response-reuse","independent-persisted-parsed-documents-and-knowledge-internal-source-unit-identities","uploaded-original-disappearance-never-deletes-indexed-knowledge","text-conservation-preview-and-structural-query-without-original-file-dependency","vector-row-file-chunk-and-parsed-version-validation-before-sqlite-hydration","provider-default-output-and-selected-model-role-based-thinking-without-total-generation-ceilings","task-local-facts-and-source-use-dependencies-with-condition-aware-query-diagnostics","source-file-ownership-routing-without-per-section-model-repetition","strict-duplicate-json-key-rejection-before-body-or-tool-admission","per-transport-cancellation-request-and-actual-settlement-with-unknown-usage-preserved","preserved-original-failures-and-pause-at-reported-output-truncation-without-whole-input-retries","whole-run-token-anomaly-pause-and-same-project-queue-suspension-without-cost-or-time-ceilings","current-professional-grade-required-for-delivery-with-verification-quality-gaps-separated","first-candidate-professional-pass-metrics-without-retention-percentage-delivery-veto","removed-unused-client-reservations-and-inactive-node-payload-writing-pruning","full-per-call-usage-ledger-with-unreported-cancelled-usage","lossless-repeated-evidence-projection-with-intact-thinking-tool-protocol","quantity-purpose-and-partial-boundary-aware-construction-network","professional-execution-defects-in-first-candidate-with-preserved-original","spatial-layout-schematics-without-invented-survey-dimensions","partial-draft-figure-rendering-and-explicit-portable-review-fonts","task-located-excerpt-reading-without-speculative-whole-file-scans","complete-work-package-directory-and-explicit-member-selection-without-default-paging","project-resource-authors-inherit-planned-crews-without-false-derived-peaks","professional-first-draft-and-seven-anchored-diagnostics-without-aggregate-pass-score","complete-object-directory-and-on-demand-full-source-without-preflight-candidate-census","current-v7-submission-only-and-actual-rendered-figure-evidence-without-body-node-dumps","whole-source-purpose-and-completed-claim-state-validation","single-activity-network-and-typed-source-quantity-production-plan","server-owned-author-unit-row-and-section-reference-identities","retained-body-annotation-correction-with-cumulative-meaningful-raw-writing-ledger","actual-task-executions-preserved-through-final-render-and-honest-terminal-nodes","all-actual-normative-use-catalog-with-independent-official-metadata-and-adoption-status","source-bound-hazard-candidates-without-unknown-to-nonhazard-conclusions","faithful-technical-rendering-and-actual-bookmark-page-toc-cache","no-bid-type-page-quotas-or-client-wall-clock-generation-cutoffs","chapter-fair-dynamic-author-dispatch-through-single-shared-model-capacity","single-chief-whole-outline-and-table-plan-with-complete-raw-protocol-receipts","current-candidate-identity-bound-plan-reuse-without-repeated-chapter-routing","user-outline-preservation-without-tail-character-title-rejection-or-post-plan-mutations","actual-body-normative-use-register-before-first-compilation-basis-writing","source-bound-exact-normative-name-code-and-use-position-review","single-optional-explicit-process-concurrency-without-default-four-or-six","complete-typed-tool-output-without-generic-tail-clipping","task-owned-complete-evidence-without-repeated-whole-chapter-source-matrices","authenticated-deep-frozen-source-policy-with-independent-current-use-validation","server-owned-source-evidence-indices-without-model-quote-or-hash-copy","actual-task-progress-and-substantive-body-without-title-shell-completion","explicit-input-resource-limits-without-hidden-env-or-default-document-cutoffs","active-task-engineering-decisions-with-reviewed-qualitative-adoption","professional-process-coverage-without-character-density-point-collapse","complete-source-library-and-positive-technical-obligation-discovery-without-commercial-role-closure","typed-task-local-writing-readiness-and-preserved-unresolved-source-ledger","single-common-construction-organization-plan-with-on-demand-engineering-decisions","source-first-omission-audit-after-preserved-real-first-draft","review-draft-export-separated-from-delivery-acceptance-with-bound-issue-sidecar","actual-claim-fidelity-review-separated-from-engineering-adoption-permission","balanced-same-family-source-bracket-intervals-without-unclosed-tail-suppression-or-source-rewriting","complete-physical-source-question-continuations-before-answer-purpose-review","source-context-semantic-projection-with-complete-server-owned-provenance-and-frozen-application-qualification","complete-clarification-source-groups-with-unique-original-member-accounting-and-independent-projection-binding","source-explicit-length-units-without-bare-number-or-neighbor-line-default-meters","complete-local-knowledge-assumption","knowledge-coverage-recovery","fact-trace-placement","chapter-coverage-gate","structured-quality-report","post-repair-verification","immutable-run-inputs","user-cancellation-and-typed-progress-execution-receipts","pre-writing-frozen-project-model","frozen-prompt-skill-and-model-configuration","object-and-attribute-bound-fact-governance","pre-writing-document-contract","complete-json-results-without-tail-clipping","single-explicit-selected-model-for-all-agent-and-review-calls","selected-model-without-vendor-allowlist-and-glm53-valid-thinking-tool-history","scoped-preparation-cancellation-and-drain-before-terminal-with-source-before-model-planning","source-complete-chief-model-projection-with-authoritative-native-proof-ledger","native-json-with-explicit-shared-total-output-capacity","technical-structure-requirements-grounded-in-local-presentation-purpose","object-property-condition-and-adoption-constraints-without-onsite-verb-or-edition-shortcuts","signal-driven-generation-with-stream-progress-and-effective-source-worker-capacity","exact-decimal-value-equivalence-with-source-object-unit-and-application-conservation","strict-explicit-source-indices-without-positional-recovery-or-retired-anchor-acceptance","mutable-live-activity-snapshots-separated-from-immutable-run-evidence","physical-property-corrections-separated-from-price-and-document-description-procedures","source-row-and-header-bound-table-quantity-witnesses-without-unit-inference","engineering-interfaces-separated-from-supplier-service-entitlements-and-charge-conditions","minimal-source-bound-static-constraints-without-synthetic-performance-duties","schema-correction-bound-to-actual-prior-output-and-preserved-source-semantics","native-contract-evaluation-with-retired-density-and-legacy-score-entrypoints","explicit-shared-total-output-capacity-with-frozen-selected-thinking-policy","source-owned-edition-sections-without-whole-document-catalog-qualification","single-chief-outline-duty-coverage-without-score-keyword-module-injection","real-provider-calls-without-hidden-prefix-warmup-requests","ordered-whole-dimension-and-celsius-identity-without-invented-unit-or-currency","reusable-provider-owned-http2-pool-with-concurrent-streamed-posts-and-signal-driven-cancellation","source-bound-planned-start-date-and-trigger-preserved-through-schedule-authority","contract-bound-seven-dimension-review","structured-author-tasks-and-cumulative-rework","canonical-document-model-and-guarded-incremental-repair","fixed-outline-and-unique-task-responsibility","same-selected-model-retry-without-provider-or-model-fallback","actual-task-instances-and-shared-chapter-budget","generation-scoped-llm-context","source-grounded-project-type-and-required-content-semantics","source-analysis-without-formal-writing-quotas","parent-grounded-financial-performance-separated-from-engineering-compensation","canonical-verified-whitespace-gaps-and-failed-request-ledger-preservation","source-text-once-and-payload-bounded-original-parent-batches","complete-outline-candidates-without-density-derived-section-count-or-blind-title-deletion","project-specific-substance-without-history-driven-novelty-or-correct-content-rewriting","native-cad-literal-location-and-root-bound-annotation-reading","chief-read-scope-pagination-without-premature-human-source-deferral","versioned-native-pdf-ruled-cell-reading-with-original-glyph-conservation","painted-horizontal-cell-spans-with-physical-row-edge-conservation","explicit-native-ordinary-page-continuation-without-grid-or-canonical-inference","fact-extraction-output-capacity-bound-to-complete-source-payload","persistent-source-and-parameter-bound-ocr-cache-default","native-table-row-boundaries-and-source-preserved-physical-page-continuation","file-level-proof-once-and-scalar-source-evidence-without-child-metadata-duplication","producer-bound-metadata-excluded-with-complete-original-ledger","immutable-source-and-provenance-bound-effective-facts","chief-frozen-original-source-queries","preserved-author-annotations-without-inferred-criterion-binding","scoped-chief-engineering-controls-with-independent-applicability-review","dxf-declared-codepage-and-observable-source-judgments","unchecked-blind-means-open-and-content-only-front-matter","canonical-native-toc-without-cover-or-invented-page-numbers","question-answer-boundaries-and-independent-review-with-frozen-model","dimension-picture-blocks-and-honest-polyline-transforms","evidence-progress-driven-chief-source-and-cad-reading","native-writing-without-legacy-drawing-lock-preparation","native-writing-without-legacy-density-or-duplicate-bill-preparation","chief-reasoning-tools-with-provider-session-roundtrip","source-binding-defect-scopes-without-unrelated-writing-penalties","pre-writing-shared-construction-deployment-and-task-interfaces","no-unscoped-elevation-subtraction-in-frozen-facts","single-native-generation-and-finalization-pipeline","request-local-llm-failure-attribution","lazy-cad-instances-with-complete-source-definitions","atomic-per-file-reindex-with-preserved-valid-snapshots","explicit-user-section-protection-with-adjudicable-skill-candidates","whole-selected-material-pack-index-and-source-byte-admission","native-contract-required-for-archived-repair","source-content-page-read-closure-without-native-garbled-or-raster-shortcuts","independently-reviewed-project-source-application-and-selection-bridges","immutable-chief-source-application-receipts-and-resume-replay","native-skill-knowledge-without-retired-density-depth-or-example-contracts","preserved-technical-ocr-content-without-prose-density-page-discard","native-raster-resolution-with-verified-composite-fallback","no-whole-library-project-intelligence-preheat-or-shadow-model","preserved-original-material-without-destructive-business-text-cleaning","explicit-user-sections-and-adjudicable-skill-candidate-preview","preserved-cad-stacked-engineering-units-and-fractions","file-level-source-coverage-without-per-chunk-audit-duplication","signature-driven-cad-source-routing-for-mislabeled-files","actual-carrier-source-routing-without-binary-fragment-success","frozen-source-edition-domains-without-filename-or-model-confirmation-shortcuts","selected-source-fingerprint-worker-with-epoch-bound-complete-cache-admission","source-document-headings-without-incidental-clarification-reference-reclassification","scalar-knowledge-discovery-with-selected-parser-version-receipts","planned-arrangements-without-invented-project-geometry-or-design-properties"]},bo={prepare:["template","derivation","documentSpec","projectMaterialProfile","projectMaterialSummary","projectUnderstanding","domainProfile","readiness","promptTexts","nativeAuthorPromptTexts","nativeAuthorReferenceTexts","reviewPromptTexts","repairPromptTexts","factExtractionPromptTexts","promptDocumentRules","requirementSemantics","hasExplicitOutline"],understanding:["allEvidence","writerEvidence","indexHealth","requestedEvidencePerChapter","rolePoolRisk","retrievalCoverageReports","webResearchReport","missingItems","clarificationRequests","unfixableDeclarations","failedChapterMessages","chapterGenerationStages","chapterGenerationStagesByOrder","canonicalFacts","evaluationItems","agentWorkflow","bidComposition","hazardResolution"],planning:["generationStrategy","projectContext","tenderRequirements","clarificationOverrides","earlyTruthAudit","truthConstraint","conclusionTable","requiredContentNeeds","projectTypeDecision","sharedConstructionPlan"],blueprint:["integratedBlueprint","requirementAssignments","structureAssignments","structureUnattached"]},bp=a=>(0,e.createHash)("sha256").update(a).digest("hex");var bq=c(7258);let br=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),bs="native-execution-accounting-",bt=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function bu(a,b){let c=(0,aj.C)("documentGeneration");if(!c||!a.inputSnapshot)return;let d=b??{};return b||(0,j.er)(d,a.inputSnapshot),bt({inputHash:a.inputSnapshot.sha256,requirement:a.requirement??"",title:a.title??"",materialRoot:a.materialRoot??"",algorithm:c,models:k(d),workflowVersion:bn.version})}var bv=c(19668);c(20297);var bw=c(48161),bx=c.n(bw);class by extends Error{constructor(a,b,c){super(a),this.promptId=b,this.reason=c,this.name="PromptResolutionError"}}function bz(a,b={}){let c=[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))];if(0===c.length)throw new by("生成需要提示词:请在画布底部的输入框里用「+」选择至少一份提示词(\xa712.1 的三个输入字段:提示词、项目、文档名称)。","","empty");return c.map(a=>{var b;let c=function(a){if(a.startsWith("custom:")){let b=(function(){try{let a=JSON.parse(ac.readFileSync(ae.join(process.env.CUSTOMIZE_AGENT_HOME?ae.join(process.env.CUSTOMIZE_AGENT_HOME,".customize-agent"):ae.join(bw.homedir(),".customize-agent"),"prompts.json"),"utf-8"));return Array.isArray(a.customPrompts)?a.customPrompts:[]}catch{return[]}})().find(b=>b.id===a);return b?{id:a,name:b.name,content:b.content,source:"custom"}:void 0}}(a);if(!c)throw new by(`提示词不存在:${a}(可能已被删除)。请在画布上用「+」重新选择提示词后重试。`,a,"unknown-id");if(!c.name.trim())throw new by(`提示词没有名字,无法判定它进哪条链:${a}`,a,"unknown-id");if(!c.content.trim())throw new by(`提示词内容为空:${c.name}(${a})`,a,"empty");return{...c,contentHash:(b=c.content,(0,e.createHash)("sha256").update(b).digest("hex").slice(0,12)),contentPreview:c.content.replace(/\s+/gu," ").trim().slice(0,160),category:function(a){let b=String(a||"");return/extract|extraction|抽取|提取|清单|图纸|品牌|识别/iu.test(b)?"extraction":/format|排版|格式|暗标/iu.test(b)?"formatting":/总控|writer|写作主控|施工组织设计总控/iu.test(b)?"writer":/chapter_generation|method|schedule|quality|resource|safety|dangerous|施工|进度|质量|资源|安全|危大/iu.test(b)?"chapter":"reference"}(c.name)}})}class bA{constructor(a){this.controller=new AbortController,this.pending=new Set,this.signal=a?AbortSignal.any([a,this.controller.signal]):this.controller.signal}fail(a,b="preparation"){if(this.firstFailure||(this.firstFailure={error:a,origin:b,at:Date.now()}),!this.controller.signal.aborted){let a=Error("本轮前置工作已失败,取消其余准备任务",{cause:this.firstFailure.error});a.name="AbortError",this.controller.abort(a)}}get failure(){return this.firstFailure?.error}get failed(){return void 0!==this.firstFailure}run(a){this.signal.throwIfAborted();let b=Promise.resolve().then(()=>(this.signal.throwIfAborted(),a()));return this.pending.add(b),b.then(()=>{this.pending.delete(b)},a=>{this.pending.delete(b),this.fail(a)}),b}async pool(a,b,c){if(this.failed)throw this.failure;if(this.signal.throwIfAborted(),!Number.isSafeInteger(c)||c<1)throw Error("准备任务并发数必须是正整数");let d=Array(a.length),e=0,f=Array.from({length:Math.max(0,Math.min(a.length,Math.floor(c)))},()=>this.run(async()=>{for(;!this.signal.aborted&&e<a.length;){let c=e++;d[c]=await b(a[c],c),this.signal.throwIfAborted()}}));if(await Promise.allSettled(f),this.failed)throw this.failure;return this.signal.throwIfAborted(),d}async drain(){for(;this.pending.size;)await Promise.allSettled([...this.pending])}receipt(){let a=this.firstFailure?.error;return{pending:this.pending.size,drained:0===this.pending.size,signalAborted:this.signal.aborted,firstFailure:this.firstFailure?{at:this.firstFailure.at,origin:this.firstFailure.origin,name:a instanceof Error?a.name:null,message:a instanceof Error?a.message:String(a)}:null}}}var bB=c(79704),bC=c(10059),bD=c(57268);let bE=["technical","source-control","document-delivery","bid-procedure","commercial","unmeasured"];function bF(a){let b=a.map(a=>({id:(0,bD.DS)(a),text:a.text,source:a.sources.map(a=>[a.file,a.location].filter(Boolean).join("|")).join(";"),...a.discoveryEvidence?{originalSource:a.discoveryEvidence.quotes.map(a=>a.quote).join("\n\n"),originalSourceSpans:a.discoveryEvidence.quotes.map(a=>a.quote),sourceIndex:a.discoveryEvidence.sourceIndex}:{}}));if(new Set(b.map(a=>a.id)).size!==b.length)throw Error("当前技术候选身份重复");return b}function bG(a,b,c){if(!c||"string"!=typeof c.version||!c.version.trim())throw Error("缺少当前全文主控计划");let d=bF(a);if(!Array.isArray(c.tenderRequirements)||c.tenderRequirements.length!==d.length||new Set(c.tenderRequirements.map(a=>a.id)).size!==d.length)throw Error("全文主控计划的技术候选集合不完整或重复");let e=new Map(c.tenderRequirements.map(a=>[a.id,a]));for(let a of d){let b=e.get(a.id);if(!b||b.text!==a.text||b.source!==a.source||b.originalSource!==a.originalSource||JSON.stringify(b.originalSourceSpans)!==JSON.stringify(a.originalSourceSpans)||b.sourceIndex!==a.sourceIndex)throw Error("全文主控计划不属于当前技术候选及原始来源")}let f=a=>a.map(a=>({id:a.id,title:a.title,sections:a.sections??[]}));if(!Array.isArray(c.chapters)||JSON.stringify(f(c.chapters))!==JSON.stringify(f(b)))throw Error("全文主控计划与当前章节及小节结构不一致");if(!Array.isArray(c.requirementAssignments)||c.requirementAssignments.length!==a.length||new Set(c.requirementAssignments.map(a=>a.requirementId)).size!==a.length)throw Error("全文主控技术职责承接漏项或重复");let g=new Map(c.requirementAssignments.map(a=>[a.requirementId,a]));return a.flatMap(a=>{let e=(0,bD.DS)(a),f=g.get(e);if(!f||!bE.includes(f.scope)||"string"!=typeof f.reason||!f.reason.trim())throw Error("全文主控计划缺少实际来源用途裁决");if("technical"!==f.scope){if(void 0!==f.chapterIndex||void 0!==f.sectionTitle||void 0!==f.responsibility)throw Error("非技术用途不得发布为技术作者职责");if("technical"!==f.scope&&"unmeasured"!==f.scope){let a=d.find(a=>a.id===e),b=c.requirementSourceUnits?.find(b=>b.index===a.sourceIndex);if(!a.originalSource?.trim()||!b?.text.trim()||!(a.originalSourceSpans??[a.originalSource]).every(a=>b.text.replace(/\s/gu,"").includes(a.replace(/\s/gu,""))))throw Error("非正文渠道分流缺少当前完整原源范围依据")}return[]}let h=Number.isSafeInteger(f.chapterIndex)&&f.chapterIndex>=0?b[f.chapterIndex]:void 0;if(!h||"string"!=typeof f.sectionTitle||!h.sections?.includes(f.sectionTitle)||"string"!=typeof f.responsibility||!f.responsibility.trim())throw Error("全文主控技术职责未承接到当前真实小节");let i=d.find(a=>a.id===e),j=c.requirementSourceUnits?.find(a=>a.index===i.sourceIndex),k=i.originalSourceSpans?.length?[...i.originalSourceSpans]:i.originalSource?[i.originalSource]:[];if(!k.length||!j?.text.trim()||k.some(a=>!j.text.replace(/\s/gu,"").includes(a.replace(/\s/gu,""))))throw Error("技术职责不是当前完整原源中的真实原字证据");let l=k.join("\n\n");if(f.responsibility!==l)throw Error("全文主控技术职责文本与当前原字证据不一致");return[{entry:{...a,scopeReview:{scope:"technical",responsibility:l,reason:f.reason}},requirementId:e,chapterId:h.id,chapterTitle:h.title,sectionTitle:f.sectionTitle,plannerVersion:c.version,reason:f.reason,status:"planned"}]})}function bH(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function bI(a){let b=[...a.blocks??[]];return{version:1,recordedAt:a.recordedAt,workflowVersion:a.workflowVersion,blocks:b,chapters:[...a.chapters??[]],readings:{...a.readings,firstPassRate:function(a){let b=a.filter(a=>!a.isolatedRetry);if(0===b.length)return{firstPass:0,primary:0,rate:null};let c=b.filter(a=>0===a.attempt&&a.passed).length;return{firstPass:c,primary:b.length,rate:c/b.length}}(b).rate},...a.chapterFailures&&a.chapterFailures.length>0?{chapterFailures:[...a.chapterFailures]}:{}}}function bJ(a){return"manual_review"===a.repairability||"user"===a.owner}function bK(a){let b=a.provenance?.detectorId?.trim();return b?[b]:a.category?[a.category]:[]}function bL(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}var bM=c(450);function bN(a){return a.replace(/\s+/gu,"").toLowerCase()}function bO(a){return[...new Set(a)]}c(86697),RegExp(`^.{2,36}?表`,"u");let bP="[\\d一二三四五六七八九十]+";RegExp(`^表\\s*${bP}(?:[--..—]\\s*${bP})?\\s*[::、..]?\\s`,"u");let bQ=[{pattern:/横道图|甘特图/u,instruction:"以表格式时间轴呈现(阶段与节点、起止时间、与工期目标的关系);表中时间节点必须与总工期及开工竣工日期一致"},{pattern:/网络图|关键线路/u,instruction:"以文字框图呈现(工作节点、先后衔接关系、关键线路标注),节点划分必须与本工程施工组织一致"},{pattern:/组织机构图|组织框图|机构框图|机构图/u,instruction:"以文字框图呈现组织机构层级(部门或岗位、隶属关系)"},{pattern:/平面布置图|布置图/u,instruction:"以分区布置的文字框图或布置要点表呈现(分区、布置内容、管控要求)"},{pattern:/流程图|工艺流程图/u,instruction:"以文字框图呈现流程步骤与衔接关系"}];function bR(a){return bN(a).replace(/[((][^))]*[))]/gu,"").replace(/[图表]+$/u,"")}let bS=/知识库|系统暂未|项目资料暂未|暂未明确|待确认|待资料复核|待系统|通用兜底(?:段落|模板)?|兜底(?:占位|模板|内容)|未检索到|资料不足|无法确认|建议补充|COL\d+|可核验信息|以本项目招标文件明确内容为准/u,bT=String.raw`(?:\d+[.、](?=\s|\*\*)\s*|[((]\d+[))]\s*|[-*+]\s+)`;RegExp(String.raw`\S.+(?:\s|[。;;])${bT}\S.+(?:\s|[。;;])${bT}\S`,"u"),RegExp(`\r?
|
|
20
20
|
`,"u"),RegExp(`
|
|
21
21
|
{3,}`,"gu");let bU=/(?<=^|[。;;\n])(?:本方案|本施工组织设计|本工程|本项目|项目部|我方|我公司|投标人)?(?:根据|依据|结合|按照)?(?:本项目|项目)?(?:招标文件|补疑澄清文件|补遗澄清文件|补疑补遗|答疑(?:回复)?文件|答疑修正口径|补充答疑修正口径|澄清文件|工程量清单|设计图纸|施工图纸|图纸资料|设计修改通知单)(?:[、,,及和与\s]*(?:招标文件|补疑澄清文件|补遗澄清文件|补疑补遗|答疑(?:回复)?文件|答疑修正口径|补充答疑修正口径|澄清文件|工程量清单|设计图纸|施工图纸|图纸资料|设计修改通知单|现行规范|规范)){1,}(?:[^。;;\n]{0,40})?[,,]/gmu,bV=RegExp(bU.source,"mu"),bW=/编制依据|编制说明|法律法规|规范标准|标准依据/u,bX=/(?:安全|管理|施工|质量|工期|进度|保障|体系|措施|控制|工程|项目|技术|方案|计划|组织|标准|规范|验收|方法|工艺|文明|绿色)/u,bY=/(?:工程施工方案|安装工程施工方案|专业工程施工方案|专项施工方案)$/u;async function bZ(a,b,c,d){let e=Date.now();try{return await c()}finally{let c=Date.now();a.metrics.push({name:b,startedAt:e,endedAt:c,durationMs:c-e,meta:d})}}function b$(a){return a.map(a=>`## [${a.category}] ${a.name}
|
|
22
22
|
${function(a){let b=a.replace(/```([\s\S]*?)```/gu,(a,b)=>/<OUTLINE>|\|\s*[^\n]+\s*\||#{1,6}\s+|必须|禁止|不得|应当|要求|规则|格式|输出|表格|章节|小节|正文/u.test(b)?`
|
|
@@ -27,7 +27,7 @@ ${j}`:"",generationProgress:p,evidence:g?.evidence??[],missingFacts:g?.missingFa
|
|
|
27
27
|
${dJ(a.data)}`}return`[${a.tool}] 失败 \xb7 ${a.error.code}${a.error.retryable?"(可重试)":"(不可重试)"}
|
|
28
28
|
${a.error.message}`}function dM(a,b,c="路径"){let d=(b??[]).map(a=>String(a??"").trim()).filter(Boolean);if(0===d.length)throw dE(`${c}被拒绝:本次运行未授予任何可读根(fail-closed,见 4.6 域表)`);let e=String(a??"").trim();if(!e)throw dD(`${c}不能为空`);if(ae.isAbsolute(e)){let a=function(a,b,c={}){let d=String(a??"");if(!d||d.includes("\0"))return{ok:!1,reason:d.includes("\0")?"nul_byte":"empty"};let e=ae.resolve(d),f=b.map(a=>ae.resolve(a)).filter(Boolean);if(0===f.length)return{ok:!1,reason:"escapes_root"};let g=null;try{g=ac.realpathSync(e)}catch{g=null}return f.some(a=>{let b;if(!dy(e,a))return!1;if(null===g)return!0;try{b=ac.realpathSync(a)}catch{return!0}return dy(g,b)})?c.mustExist&&!ac.existsSync(e)||c.requireFile&&ac.existsSync(e)&&!ac.statSync(e).isFile()?{ok:!1,reason:"empty"}:{ok:!0,relative:ae.relative(f[0],e),absolute:e}:{ok:!1,reason:"escapes_root"}}(e,d);if(!a.ok)throw dE(`${c}被拒绝:${dA(a.reason)}(${e})`);return{absolute:a.absolute,relative:a.relative,root:d.find(b=>a.absolute.startsWith(b))??d[0]}}let f=[];for(let a of d){let b=dz(a,e);if(b.ok)return{absolute:b.absolute,relative:b.relative,root:a};f.push(`${a}:${dA(b.reason)}`)}throw dE(`${c}被拒绝:不在本项目资料范围内(${e})—— ${f.join(";")}`)}function dN(a,b){let c="string"==typeof a?a.trim():"";if(!c)throw dD(`字段 ${b} 不能为空`);return c}function dO(a,b,c,d){let e="number"==typeof a?a:Number(a);return Number.isFinite(e)?Math.min(d,Math.max(c,Math.trunc(e))):b}function dP(a,b,c){return`${a}
|
|
29
29
|
用:${b}
|
|
30
|
-
别用:${c}`}let dQ={str:(a,b={})=>({type:"string",description:a,...b}),num:(a,b={})=>({type:"number",description:a,...b}),int:(a,b={})=>({type:"integer",description:a,...b}),bool:(a,b={})=>({type:"boolean",description:a,...b}),arr:(a,b,c={})=>({type:"array",description:a,items:b,...c}),obj:(a,b,c=[],d={})=>({type:"object",description:a,properties:b,required:c,...d}),enumStr:(a,b)=>({type:"string",description:a,enum:b}),anyObj:a=>({type:"object",description:a}),object:(a,b=[])=>({type:"object",properties:a,required:b,additionalProperties:!1})};var dR=c(23313);let dS=new WeakMap;function dT(a,b){let c=a&&dS.get(a);if(!c)return;let d=c.tasks.get(JSON.stringify([b.chapterId,b.blockTitle])),f=d??`unplanned:${(0,e.createHash)("sha256").update(JSON.stringify([b.chapterId,b.blockTitle])).digest("hex").slice(0,24)}`,g=c.records.filter(a=>a.taskId===f).length,h=(0,e.randomUUID)();for(let a of Array.isArray(b.response?.rawToolCalls)?b.response.rawToolCalls:b.response?.toolCalls??[]){let b;if(a?.name!=="submit_author_task"||"string"!=typeof a.arguments)continue;try{b=(0,du.parseJsonWithoutDuplicateKeys)(a.arguments).output}catch{}let d=c.previousDrafts.get(f),e=(0,dR.Br)(d,b),g=b&&"object"==typeof b?b.revisionReason:void 0;c.rawDrafts.push({taskId:f,callId:h,toolCallId:"string"==typeof a.id?a.id:null,ordinal:c.rawDrafts.filter(a=>a.taskId===f).length,declaredReason:"string"==typeof g?g:null,comparison:e}),(0,dR.IO)(b)&&c.previousDrafts.set(f,structuredClone(b))}let i=(0,a0.tv)(c.generatedDir,`author-response-${h}.json`,{version:1,runId:c.runId,contractId:c.contractId,projectSnapshotId:c.projectSnapshotId,taskId:f,belongsToFrozenTask:!!d,callId:h,ordinal:g,turn:b.turn,firstResponse:0===g,responseReceived:!!b.response,rawText:b.response?.rawContent??b.response?.content??null,request:b.request??null,rawToolCalls:b.response?.rawToolCalls??null,droppedToolCalls:b.response?.droppedToolCalls??null,appliedRequest:b.response?.requestMetadata??null,toolCalls:b.response?.toolCalls??[],modelResponse:b.response?.responseMetadata??null,c0Qualification:"unmeasured"},c.runId);return c.records.push({taskId:f,callId:h,ordinal:g,responseReceived:!!b.response,...i}),h}function dU(a){return String(a??"").replace(/[!-~]/gu,a=>String.fromCharCode(a.charCodeAt(0)-65248)).replace(/[\s\u3000,。、;:!?!?…·—\--~~"'`“”‘’()()【】[\]《》<>「」]/gu,"").toLowerCase()}function dV(a){return String(a??"").replace(/[,。;:!?]/gu,a=>({",":",","。":".",";":";",":":":","!":"!","?":"?"})[a]??a).replace(/\s+/gu,"")}function dW(a,b=()=>""){return{recordEvidenceCall:({tool:b,term:c})=>{if(!a.evidenceCallLog)return;let d=String(c??"").trim();d&&a.evidenceCallLog.push({tool:b,term:d})},declareMissing:({item:c,reason:d,evidence:e})=>{let f=a.evidenceCallLog,g=f?e.filter(a=>!function(a,b){let c=dU(a);return!!c&&b.some(a=>{let b=dU(a.term);return!!b&&(b.includes(c)||c.includes(b))})}(a,f)):[],h=f&&e.length>0&&g.length===e.length?`;⚠未取证:所列 ${e.length} 处均对不上本块取证记录(本块取证调用 ${f.length} 次)`:"",i=`${b()?`${b()}:`:""}${c}(${d}${e.length>0?`;证据:${e.slice(0,3).join("、")}`:""}${h})`;a.missingItems.push(i),a.missingItemDetails?.push({item:c,reason:d,evidence:[...e],location:b(),at:Date.now()}),a.onIssue?.([((a,b,c,d=a)=>({level:b,severity:c,category:"evidence_coverage",message:a,suggestion:'按缺口说明补资料或在正文中显式声明(`declare_missing` 的出口是"如实说不知道",不是"略过")',provenance:{detectorId:"agent-declare",fingerprint:d}}))(`写作期声明缺料:${i}`,"warning","warning",`declare-missing\u0000${c}`)])},declareUnfixable:({issue:c,reason:d})=>{a.unfixableDeclarations.push({issue:c,reason:d,declaredAt:b(),declaredAtMs:Date.now()}),a.onIssue?.([{...c,message:`写作期声明不可修:${c.message}(${d})`}])},requestClarification:({question:c,blocking:d})=>{let e=dV(c);a.clarificationRequests.some(a=>dV(a.question)===e)||a.clarificationRequests.push({question:e,blocking:d,askedAt:b(),askedAtMs:Date.now(),status:"pending"}),a.onIssue?.([{level:d?"error":"info",severity:d?"blocker":"suggestion",category:"professional_chain",message:`待答口径裁决(${d?"已挂起等人":"记账继续"}):${e}`,suggestion:"按 A5.2「让人选」形态给出候选与来源后,由人点选;未答前按权威阶梯最高候选先写并复查",provenance:{detectorId:"agent-request-clarification",fingerprint:`clarification\u0000${e}`}}])},listDefects:()=>a.defects()}}var dX=c(45455),dY=c(63007),dZ=c(41240),d$=c(44616),d_=c(68417),d0=c(89249),d1=c(83653);function d2(a,b){let c=d3(a,b).geometryGraph.entities[0],d=a=>c.pairs.find(b=>b[0]===a)?.[1],e=d("5"),f=e??`ordinal-${c.ordinal}`;if(e&&1!==a.geometryGraph.entities.filter(a=>a.pairs.some(a=>"5"===a[0]&&a[1]===e)).length)throw Error("CAD根源handle不唯一,不能猜所属实例标注");return{rootInstanceId:b,sourceOrdinal:c.ordinal,entityType:c.type,sourceHandle:e??null,ownerHandle:d("330")??null,blockName:["INSERT","DIMENSION"].includes(c.type)?d("2")??null:null,instancePrefix:["INSERT","DIMENSION"].includes(c.type)?[f]:[],reference:f}}function d3(a,b){if(!/^(?:0|[1-9]\d*)$/u.test(b)||!Number.isSafeInteger(Number(b)))throw Error("CAD根实例身份无效");let c=a.geometryGraph.entities.findIndex(a=>String(a.ordinal)===b);if(c<0)throw Error("CAD根实例不属于该冻结图纸");let d=a.geometryGraph.entities[c];if(["SECTION","ENDSEC","ENDBLK","SEQEND","VERTEX"].includes(d.type))throw Error("源marker或序列成员不是独立几何根,须定位实际POLYLINE等根实例");let e=[d];if("POLYLINE"===d.type){let b=c+1;for(;a.geometryGraph.entities[b]?.type==="VERTEX";)e.push(a.geometryGraph.entities[b++]);if(a.geometryGraph.entities[b]?.type!=="SEQEND")throw Error("POLYLINE源序列未闭合,不能截去后续顶点冒充完整几何");e.push(a.geometryGraph.entities[b])}return{...a,geometryGraph:{...a.geometryGraph,entities:e}}}class d4 extends Error{constructor(...a){super(...a),this.name="CadQueryInputError"}}function d5(a,b,c){return a.readSnapshot(()=>{let d=b.sources[c.filePath];if(!d)throw Error("图纸不属于本轮冻结项目");let f=a.parsedFileFingerprint(c.filePath);if(f.sha256!==d.sha256)throw Error("图纸解析资产已变化,不能把新图框或坐标绑定到旧项目快照;须重新冻结项目");let g=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(!g?.version)throw Error("该图纸尚未按实际块实例与图框解析;旧图带不能作为图框身份,须重新解析");if(g.version!==ag.CAD_SCENE_VERSION)throw Error("图纸结构版本与当前读取协议不兼容,须重新解析并冻结项目");let h=c.kind??"frames";if(!["frames","annotations","geometry","instances"].includes(h))throw new d4("CAD查询类型无效");if(void 0!==c.rootInstanceId&&(!["geometry","annotations"].includes(h)||"string"!=typeof c.rootInstanceId))throw new d4("rootInstanceId只用于定位目录返回的实际几何或标注根");if("instances"===h&&(c.frameId||c.entityId||c.query||c.placement||void 0!==c.textOnly||c.order||"full"===c.detail))throw new d4("instances仅分页读取实际根目录,不接受图框、标注或全文筛选");if(c.rootInstanceId&&c.placement)throw new d4("根实例几何投影不使用图框块归属筛选");if(void 0!==c.detail&&(!["full","catalog"].includes(c.detail)||"catalog"===c.detail&&!["frames","instances"].includes(h)))throw new d4("目录投影只用于frames或instances,不能省略标注或几何细节");let i="annotations"===h&&!c.frameId&&!c.entityId&&!c.rootInstanceId&&"string"==typeof c.query&&!!c.query.trim();if(["annotations","geometry"].includes(h)&&!c.frameId&&!c.entityId&&!c.rootInstanceId&&!i)throw new d4("标注与几何查询须明确实际frameId或entityId;无图框时按instances真实根或非空实际字面query定位标注候选,不能全图猜对象");let j=c.frameId?a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload:void 0;if(c.frameId&&!j)throw new d4("图框身份不属于该冻结图纸");if(void 0!==c.placement&&!["all","drawing-space","frame-instance"].includes(c.placement))throw new d4("CAD块归属筛选无效");if(c.placement&&"all"!==c.placement&&(!c.frameId||"frames"===h))throw new d4("块归属筛选须选择实际图框的标注或几何");if(void 0!==c.textOnly&&("boolean"!=typeof c.textOnly||"annotations"!==h))throw new d4("文字筛选只用于标注");if(void 0!==c.order&&(!["source","position"].includes(c.order)||"annotations"!==h))throw new d4("位置排序只用于标注");let k=j?.source,l=c.placement&&"all"!==c.placement?{path:k?.instancePath,handle:k?.handle,included:"frame-instance"===c.placement}:void 0;if(l&&(!Array.isArray(l.path)||!l.path.length||l.path.some(a=>"string"!=typeof a)))throw Error("图框实际块路径不完整,不能猜筛选归属");let m=c.offset??0,n=c.limit??8,o="instances"===h?function(a,b,c,d){let e=a.queryMaterialEntityPage(b,{kind:"cad-geometry-root",offset:c,limit:d});return{...e,records:e.records.map(a=>{let b=a.payload,c=b.pairs;if(!Number.isSafeInteger(b.ordinal)||0>Number(b.ordinal)||a.entityKey!==String(b.ordinal)||!Array.isArray(c)||c.some(a=>!Array.isArray(a)||2!==a.length||a.some(a=>"string"!=typeof a)))throw Error("CAD根实例身份或原始组码不完整,须重新解析");let d=a=>c.find(b=>b[0]===a)?.[1]??null;return{...a,payload:{rootInstanceId:a.entityKey,sourceOrdinal:b.ordinal,entityType:b.type,sourceHandle:d("5"),ownerHandle:d("330"),blockName:["INSERT","DIMENSION"].includes(String(b.type))?d("2"):null,layout:d("410"),sourceMarker:["SECTION","ENDSEC","ENDBLK","SEQEND"].includes(String(b.type)),sequenceMember:["VERTEX","SEQEND"].includes(String(b.type))}}})}}(a,c.filePath,m,n):i?function(a,b,c){if("string"!=typeof c.query||!c.query.trim())throw Error("无图框标注定位须提供非空实际字面query");let d=a.loadCadScene(b),e=a.queryMaterialEntityPage(b,{kind:"cad-entity",...c});return{...e,records:e.records.map(a=>{let b=a.payload,c=b.source,e=d.geometryGraph.entities.filter(a=>{if(["SECTION","ENDSEC","ENDBLK","SEQEND","VERTEX"].includes(a.type))return!1;let d=a.pairs.find(a=>"5"===a[0])?.[1],e=d??`ordinal-${a.ordinal}`;return 0===c.instancePath.length&&c.ordinal===a.ordinal||["INSERT","DIMENSION"].includes(a.type)&&c.instancePath[0]===e||"INSERT"===a.type&&"ATTRIB"===b.entityType&&0===c.instancePath.length&&void 0!==d&&c.ownerHandle===d}).flatMap(a=>{try{let{reference:b,...c}=d2(d,String(a.ordinal));return[c]}catch{return[]}});return{...a,rootBindings:e,rootBindingStatus:e.length?"source-bound":"unmeasured"}})}}(a,c.filePath,{query:c.query,textOnly:c.textOnly,order:c.order,offset:m,limit:n}):"annotations"===h&&void 0!==c.rootInstanceId?function(a,b,c){if(!Number.isSafeInteger(c.offset)||c.offset<0||!Number.isSafeInteger(c.limit)||c.limit<1||c.limit>24)throw Error("结构记录分页范围无效");let d=a.loadCadScene(b),e=d2(d,c.rootInstanceId),f=d.annotations.filter(a=>{let b=a.source,d=b.ordinal===e.sourceOrdinal&&0===b.instancePath.length,f=e.instancePrefix.length>0&&b.instancePath[0]===e.reference,g="INSERT"===e.entityType&&"ATTRIB"===a.entityType&&0===b.instancePath.length&&null!==e.sourceHandle&&b.ownerHandle===e.sourceHandle;return(d||f||g)&&(!c.frameId||a.sheet===c.frameId)&&(!c.entityId||a.id===c.entityId)&&(!c.query||a.text.includes(c.query))&&(!c.textOnly||!!a.text.trim())});"position"===c.order&&(f=f.map((a,b)=>({annotation:a,index:b})).sort((a,b)=>(b.annotation.position.y??0)-(a.annotation.position.y??0)||(a.annotation.position.x??0)-(b.annotation.position.x??0)||a.index-b.index).map(a=>a.annotation));let{reference:g,...h}=e;return{total:f.length,rootBinding:h,records:f.slice(c.offset,c.offset+c.limit).map(a=>({entityKind:"cad-entity",entityKey:a.id,payload:a}))}}(a,c.filePath,{rootInstanceId:c.rootInstanceId,frameId:c.frameId,entityId:c.entityId,query:c.query,textOnly:c.textOnly,order:c.order,offset:m,limit:n}):"geometry"===h&&void 0!==c.rootInstanceId?function(a,b,c){if(!Number.isSafeInteger(c.offset)||c.offset<0||!Number.isSafeInteger(c.limit)||c.limit<1||c.limit>24)throw Error("结构记录分页范围无效");let d=d3(a.loadCadScene(b),c.rootInstanceId),e=[],f=0;for(let a of(0,ag.iterateCadSceneGeometry)(d))if((!c.frameId||a.sheet===c.frameId)&&(!c.entityId||a.id===c.entityId)&&!c.query&&!(f++<c.offset)){if(e.length===c.limit)return{total:null,records:e};e.push({entityKind:"cad-geometry",entityKey:a.id,payload:a})}return{total:f,records:e}}(a,c.filePath,{rootInstanceId:c.rootInstanceId,frameId:c.frameId,entityId:c.entityId,query:c.query,offset:m,limit:n}):"geometry"===h?a.queryCadGeometryPage(c.filePath,{frameId:c.frameId,entityId:c.entityId,query:c.query,offset:m,limit:n,framePlacement:l}):a.queryMaterialEntityPage(c.filePath,{kind:"frames"===h?"cad-frame":"cad-entity",..."frames"!==h&&c.frameId?{frameId:c.frameId}:{},entityId:c.entityId,query:c.query,offset:m,limit:n,framePlacement:l,textOnly:c.textOnly,order:c.order}),p=o.records.map(a=>"frames"===h&&"catalog"===c.detail?{...a,payload:Object.fromEntries(["id","name","title","drawingNumber","layout"].filter(b=>Object.hasOwn(a.payload,b)).map(b=>[b,a.payload[b]]))}:a),q=m+p.length;return{projectSnapshotId:b.snapshotId,filePath:c.filePath,parsedIdentity:f.sha256,sceneVersion:g.version,kind:h,frameId:c.frameId??null,rootInstanceId:c.rootInstanceId??null,projection:"instances"===h?"catalog":c.detail??"full",selection:{placement:c.placement??"all",textOnly:c.textOnly??!1,order:c.order??"source"},sceneQuality:g.quality?{...g.quality,issues:void 0,issueCount:g.quality.issues?.length??0,issueReasons:[...new Set(g.quality.issues?.map(a=>a.reason)??[])],detailsComplete:!1}:null,units:g.units,records:p,..."frames"===h||"instances"===h?{directoryState:{scope:"indexed-cad-directory",complete:0===m&&null!==o.total&&q>=o.total&&!c.frameId&&!c.entityId&&!c.query,recordCount:o.total}}:{},...o.rootBinding?{rootBinding:o.rootBinding}:{},..."annotations"===h?{readingSourceIds:p.map(a=>({entityId:a.payload.id,sourceId:`cad-read:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f.sha256,c.rootInstanceId,a.payload.id,a.payload.source])).digest("hex")}`}))}:{},total:o.total,totalMeasured:null!==o.total,offset:m,nextOffset:null===o.total||q<o.total?q:null,complete:0===m&&null!==o.total&&q>=o.total,completeScope:i?"matching-literal-candidates":"geometry"===h?"matching-block-instance-projection":void 0!==c.rootInstanceId?"matching-root-instance-annotations":"matching-indexed-records",sourceInterpretationComplete:g.quality?.complete===!0,engineeringDecision:"not-evaluated",note:"query是单条记录的字面子串,不是语义检索或多关键词并集;数字标注常没有属性名,零命中应取消筛选读取所选图框,不证明没有该参数。分页按实际nextOffset继续,不能按limit自行跳页。坐标、图框及尺寸尚未判定工程属性、部位和工况;范围与约数不能据此变成准确施工值。未返回或尚未支持的结构不代表图纸没有。"}})}function d6(a){try{let b=ae.join((0,ah.a2)(),"projects",(0,ag.computeProjectId)(ae.resolve(a.projectRoot)),"kb.db");if(!ac.existsSync(b))return;return new ag.IndexStateStore(b,{readonly:!0})}catch{return}}function d7(a,b){let c=(a.scopeRoots??[]).filter(Boolean);if(0===c.length)return!1;let d=dz((0,ah.NW)(a.projectRoot),b);return!!d.ok&&c.some(a=>dx(d.absolute,a))}function d8(a,b){if(0===(a.scopeRoots??[]).filter(Boolean).length)throw dE(`工具「${b}」被拒绝:本次运行未授予任何资料范围(fail-closed,见 4.6 域表)`)}let d9=new Set([".md",".markdown",".txt",".csv",".json",".tsv",".log"]),ea=new Set([".xlsx",".xls"]),eb={name:"read_raw",description:dP("读取已入库解析全文,按库内页码、字符区间或工作表定位;不访问或依赖原文件。","手上有疑点、需要回原文核对时(如正文引用的数值要确认原文怎么写、图纸说明里的参数在哪一页);检索结果看起来矛盾、或 `search_evidence` 给出的切片是派生内容而你要看原文上下文时。",'已经拿到的切片文本足够回答当前问题时(原文一次可能上万字符,是切片预算的数十倍);只是想知道"项目里有没有这个文件"(那是 `discover_files`);也不要拿它当通用读文件工具去读项目里与资料无关的文件——路径不在资料白名单内一律 PATH_DENIED。'),scope:"evidence-whitelist",inputSchema:dQ.object({path:dQ.str("资料文件路径(KB 相对路径或落在白名单根内的绝对路径)"),loc:dQ.obj("定位(可选;三者互斥,page 优先于 range)",{page:dQ.int("PDF 页码(依赖抽取器写下的「## PDF 第 N 页」标记)"),range:dQ.arr("抽取文本坐标系下的字符区间 [start, end)(**不是文件字节偏移**,见 S7.2 #1)",dQ.int("字符偏移")),sheet:dQ.str("XLSX 工作表名(仅 .xlsx/.xls 有效;缺省取第一个工作表)")})},["path"]),idempotent:!0,handler:function(a,b){let c,d,e,f=dM(a.path,b.scopeRoots,"read_raw 的 path"),g=ae.extname(f.absolute).toLowerCase(),h=a.loc??{},i="kb-chunks";if(void 0!==h.sheet&&ea.has(g)){let a=d6(b);try{let b=a?.getParsedDocument(f.relative),d=b?.document.structure.spreadsheet?.sheets.find(a=>a.name===h.sheet);if(!d)throw dG("库内工作表结构单元","现有切片仍可读取;不能因为原文件已删除而改为缺资料或直接读取磁盘");c=d.cells.map(a=>`${a.address}: ${a.display}${a.formula?` 公式=${a.formula}`:""}`).join("\n"),i="kb-sheet"}finally{a?.close()}}if(void 0===c&&"function"==typeof b.rawText){let a=b.rawText(f.relative);"string"==typeof a&&(c=a,i="runtime-rawText")}if(void 0===c){let a=d6(b);if(a)try{let b=a.getDocumentChunk(f.relative);b&&(c=b.content,i="kb-chunks")}finally{a.close()}}if(void 0===c)throw dG(`文件「${f.relative}」的抽取文本(KB 切片库里没有该路径的 document chunk,且它不是可直读的文本格式)`,"运行时注入 `ctx.rawText`(接 `IndexStateStore.getDocumentChunk`),或先让该文件过一遍抽取器落库");let j=c.length,k=c;if("number"==typeof h.page){let a=function(a,b){let c=RegExp(`^#{1,6}\\s*PDF\\s*第\\s*${b}\\s*页`,"mu").exec(a);if(!c)return{text:"",found:!1};let d=a.slice(c.index+c[0].length),e=/^#{1,6}\s*PDF\s*第\s*\d+\s*页/mu.exec(d);return{text:e?d.slice(0,e.index):d,found:!0}}(c,h.page);if(!a.found)throw dF(`在「${f.relative}」的抽取文本里找不到页码标记「## PDF 第 ${h.page} 页」(markdown 页标记通道)`);d=h.page,k=a.text}else if(Array.isArray(h.range)&&2===h.range.length){let[a,b]=h.range;if(!Number.isFinite(a)||!Number.isFinite(b)||a<0||b<=a)throw dD(`loc.range 必须是 [start, end] 且 0 <= start < end(当前 ${JSON.stringify(h.range)})`);if(e=[Math.trunc(a),Math.trunc(b)],!(k=c.slice(e[0],e[1])))throw dD(`loc.range ${JSON.stringify(e)} 落在文本长度 ${j} 之外`)}return{text:k,totalChars:j,channel:i,relativePath:f.relative,scopeRoot:f.root,...void 0===d?{}:{page:d},...void 0===e?{}:{range:e},...void 0===h.sheet?{}:{sheet:h.sheet}}}};async function ec(a,b){let d=dN(a.query,"query");d8(b,"search_evidence");let e=dO(a.opts?.limit,8,1,40),{getMultiProjectManager:f}=await Promise.resolve().then(c.bind(c,10295)),g=f(),h=b.projectModel&&Object.keys(b.projectModel.sources).filter(a=>d7(b,a)),i=(b.scopeRoots??[]).filter(a=>dx(a,(0,ah.NW)(b.projectRoot))).map(a=>ae.relative((0,ah.NW)(b.projectRoot),a).split(ae.sep).join("/")).filter(Boolean);if(h?!h.length:!i.length)throw dG("白名单内已登记的检索来源","没有可检索的来源身份,不代表资料没有所需事实;先核对解析与资料范围");let j=await g.search(b.projectRoot,d,{limit:3*e,scope:"project",filters:h?{filePaths:h}:{materialRoots:i},generationMode:!0}),k=Array.isArray(j?.failures)?j.failures:[],l=Array.isArray(j?.results)?j.results:[],m=[],n=0;for(let a of l){if(!d7(b,String(a.filePath??""))){n+=1;continue}let c="project"===a.scope&&void 0!==a.chunkIndex?b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===a.filePath&&b.sourceRef?.chunkIndex===a.chunkIndex):void 0;if(c&&!c.value.includes(a.content))throw dG("检索返回内容与本轮冻结原文不同,不能沿用旧sourceEvidenceId","保留本轮候选;核对解析资料版本,以新资料重开任务,不宣称资料缺失");if(m.push({filePath:a.filePath,score:a.score,...void 0===a.sectionTitle?{}:{sectionTitle:a.sectionTitle},...void 0===a.chunkIndex?{}:{chunkIndex:a.chunkIndex},..."project"===a.scope&&void 0!==a.chunkIndex&&b.projectModel?.sourceControls?.length?{sourceControls:b.projectModel.sourceControls.filter(b=>"verified-source-excerpt"!==b.roleId&&b.sourceFile===a.filePath&&b.sourceRef?.chunkIndex===a.chunkIndex).map(a=>({factId:a.factId,...(0,d$.mk)(b.projectModel,a.factId),value:a.value,sourceSpan:a.sourceRef.sourceSpan}))}:{},content:a.content,...c?{sourceEvidenceId:c.factId}:{},...b.projectModel?(0,d$.mk)(b.projectModel,void 0,c?.factId):{},...void 0===a.startChar?{}:{startChar:a.startChar},...void 0===a.endChar?{}:{endChar:a.endChar},scope:a.scope,...void 0===a.source?{}:{source:a.source}}),m.length>=e)break}if(k.length>0&&0===l.length)throw Error(`检索失败(不是"没有相关资料"):${k.map(a=>`${a.scope}/${a.kind}——${a.reason}`).join(";")}。请换关键词重试或改用其他取证工具;**不得据此写"资料未提供"**`);return{query:d,items:m,droppedOutOfScope:n,queryTimeMs:Number(j?.queryTimeMs??0),...k.length>0?{failedScopes:k.map(a=>`${a.scope}/${a.kind}:${a.reason}`)}:{}}}let ed={name:"search_evidence",description:dP("在本轮冻结项目资料白名单内检索完整证据;范围先过滤再排序,不搜索全局专业知识,不另调用模型重写查询。","需要为某个具体论点找资料依据、或要确认某个数值/规格/做法在资料里出现过时;写作前为本章做一次定向取证。",'每章无脑先调一次"拿一堆证据"(S1.3 点名的那种滥用:会引入与本章无关的证据并挤掉预算);也不是通用搜索——它只搜本项目资料,找文件用 `discover_files`,按命中的chunkIndex用 `read_source`精确读原文。同一 query 在同一轮里不要重复调(`idempotent`,重复结果只有噪声)。'),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("检索查询(自然语言或关键短语;建议带项目实体词而非泛词)"),opts:dQ.obj("检索选项",{limit:dQ.int("返回条数上限(默认 8;1–40)"),scope:dQ.enumStr("仅本轮项目资料;缺省同样为project",["project"])})},["query"]),idempotent:!0,handler:ec},ee={name:"read_source",description:dP("按已知冻结文件路径读取完整解析原文,可按chunkIndex精读或按真实nextOffset继续分页;检索未命中不阻止读取已知文件。","需要查看搜索命中的完整原文、对象或适用条件时。requestStatus=fulfilled表示请求证据已取得;fileCoverage只报告文件覆盖情况,不构成通读全文的写作义务。只读取当前具体问题所需原文。","只查看资料目录用discover_files;CAD图框与实例关系用query_cad_context。解析文本不等于已完成图像复核;路径不在本轮资料范围内时拒绝读取,不改路径绕过范围。"),scope:"evidence-whitelist",inputSchema:dQ.object({filePath:dQ.str("资料文件路径(KB 相对路径,须落在资料白名单内)"),opts:dQ.obj("读取选项",{maxChunks:dQ.int("返回切片数上限(默认 12;1–60)"),offset:dQ.int("切片序列偏移(默认0;非负整数),继续读取时使用上次nextOffset"),chunkIndex:dQ.int("精确切片编号;也可省略使用文件分页,与offset互斥,不将编号当数组偏移")})},["filePath"]),idempotent:!0,handler:function(a,b){let c=(0,ah.NW)(b.projectRoot),d=dM(ae.isAbsolute(a.filePath)?a.filePath:(()=>{let b=dz(c,a.filePath);if(!b.ok)throw dE("资料路径不能离开当前项目知识库");return b.absolute})(),b.scopeRoots,"read_source 的 filePath");if(!dx(d.absolute,c))throw dE("资料文件不在当前项目知识库内");let e={...d,relative:ae.relative(c,d.absolute).split(ae.sep).join("/")};if(b.projectModel&&!Object.hasOwn(b.projectModel.sources,e.relative))throw dE("该文件不属于本轮冻结来源;资料白名单不是采用新增未冻结来源的许可");let f=dO(a.opts?.maxChunks,12,1,60),g=a.opts?.offset??0;if(!Number.isSafeInteger(g)||g<0)throw dD("offset必须为非负整数");let h=a.opts?.chunkIndex;if(void 0!==h&&(!Number.isSafeInteger(h)||h<0||a.opts?.offset!==void 0))throw dD("chunkIndex必须为非负整数,且不能与offset同时使用");let i=(0,ah.Yy)(b.projectRoot).find(a=>a.relativePath===e.relative),j=d6(b);if(!j)throw dG(`项目 KB 切片库(kb.db)不存在,无法读取「${e.relative}」的切片`,"先让本项目过一遍索引(kbService 的索引链路);或确认 projectRoot 指向的是已索引的项目");try{let a=j.countChunks({relativePath:e.relative}),c=j.listChunks({relativePath:e.relative,limit:f,offset:g,chunkIndex:h});if(0===c.length&&0===a)throw dF(`「${e.relative}」在 KB 切片库里没有切片(可能尚未索引或索引失败)`);if(!c.length&&void 0!==h)throw dF(`未找到切片${h},不能把不存在的切片当成文件无内容`);for(let a of c){let c=b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex);if(c&&c.value!==a.content)throw dG("本轮冻结原文已与当前解析切片不同,不能把新内容挂到旧sourceEvidenceId","保留本轮候选;以更新后的资料重新冻结来源并重开任务,不把变更解释为资料缺失")}return{relativePath:e.relative,metadata:{format:i?.format??ae.extname(e.relative).slice(1).toLowerCase(),category:i?.category??"other",fileSize:i?.fileSize??0,mtime:i?.mtime??0,chunkCount:i?.chunkCount??a,status:i?.status??"unknown",...i?.indexedAt===void 0?{}:{indexedAt:i.indexedAt},...c[0]?.materialRoot===void 0?{}:{materialRoot:c[0].materialRoot}},chunks:c.map(a=>({chunkIndex:a.chunkIndex,...void 0===a.sectionTitle?{}:{sectionTitle:a.sectionTitle},content:a.content,sourceEvidenceId:b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex)?.factId,...b.projectModel?(0,d$.mk)(b.projectModel,void 0,b.projectModel.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex)?.factId):{},...void 0===a.startChar?{}:{startChar:a.startChar},...void 0===a.endChar?{}:{endChar:a.endChar},...a.metadataJson?{sourceSpans:JSON.parse(a.metadataJson).sourceSpans,parsedSnapshotId:JSON.parse(a.metadataJson).parsedSnapshotId,offsetSpace:JSON.parse(a.metadataJson).offsetSpace??"chunk-projection"}:{},...void 0===a.chunkKind?{}:{chunkKind:a.chunkKind},...b.projectModel?.sourceControls?.length?{sourceControls:b.projectModel.sourceControls.filter(b=>"verified-source-excerpt"!==b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex).map(a=>({factId:a.factId,...(0,d$.mk)(b.projectModel,a.factId),value:a.value,sourceSpan:a.sourceRef.sourceSpan}))}:{}})),totalChunks:a,readMode:void 0===h?"page":"chunk",offset:g,nextOffset:void 0===h&&g+c.length<a?g+c.length:null,requestStatus:"fulfilled",fileCoverage:{returnedChunks:c.length,totalChunks:a,coversWholeFile:0===g&&c.length>=a}}}finally{j.close()}}},ef={name:"discover_files",description:dP("列出本项目资料白名单内的文件清单(路径/分类/格式/大小/切片数/索引状态),可按 category 与路径关键词过滤。",'开工前先摸清"这次手上有什么资料"(定位阶段的第一步);或检索反复不命中时,先确认那份资料到底在不在、索引状态是不是 failed。',"已经知道文件路径时直接read_source;目录仅返回实际文件和元数据,不返回正文,也不证明某施工参数未提供。需要CAD关系时使用query_cad_context。"),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("路径关键词(子串匹配 relativePath;缺省不过滤)"),opts:dQ.obj("过滤选项",{category:dQ.str("资料分类(spreadsheet / image / cad / document / other)"),limit:dQ.int("返回条数上限(默认 40;1–200)")})}),idempotent:!0,handler:function(a,b){d8(b,"discover_files");let c=dO(a.opts?.limit,40,1,200),d=a.opts?.category?.trim(),e="string"==typeof a.query?a.query.trim().toLowerCase():"",f=(0,ah.Yy)(b.projectRoot,d?{category:d}:{}),g=0,h=[];for(let a of f){if(!d7(b,a.relativePath)){g+=1;continue}(!e||a.relativePath.toLowerCase().includes(e))&&h.push({relativePath:a.relativePath,category:a.category,format:a.format,fileSize:a.fileSize,chunkCount:a.chunkCount,status:a.status,matchedBy:a.matchedBy,...void 0===a.collectionName?{}:{collectionName:a.collectionName}})}let i=h.slice(0,c);return{items:i,total:h.length,returned:i.length,truncated:h.length>i.length,droppedOutOfScope:g}}},eg={name:"query_construction_plan",description:dP("只读主控冻结的同源工程计划,完整返回所选职责视图或真实活动及可引用数值序号。","缺资源、时间或接口信息时查询;组织视图无需数量,未测时间保持未知。","不重新扫描清单另算方案,不把拟定配置冒充已核项目事实。"),scope:"evidence-whitelist",idempotent:!0,inputSchema:dQ.object({view:dQ.enumStr("职责视图;省略时使用本任务职责",[...dZ.Zw]),activityIds:dQ.arr("明确选择活动;省略不隐式截取",dQ.str("实际活动目录身份"))},[]),handler:(a,b)=>{if(!b.constructionPlan)throw dG("共享工程计划","须绑定本轮当前合同、快照与实际作者任务");return b.constructionPlan.query(a)}},eh={name:"query_project_facts",description:dP("在本轮冻结项目模型中按属性和对象查询事实,返回版本、源切片和解析身份。","写作前确认对象的事实、牌号、直径或资料口径时;对象不明确、值冲突、取证未完成分别返回状态。","未判定不能解释为资料不存在;方案推导仍需查询已登记决定,不能把计划安排当源资料事实。"),scope:"evidence-whitelist",inputSchema:dQ.object({attribute:dQ.str("明确属性名称或字段ID"),objectName:dQ.str("原资料明确的工程对象,可省略项目级字段"),valueDomain:dQ.str("可选属性值域,例如rebar-grade或diameter")},["attribute"]),idempotent:!0,handler:(a,b)=>{if(!b.projectModel)throw dG("冻结项目模型","运行时必须将写作前冻结的ProjectModel注入本任务");let c=dN(a.attribute,"attribute");if(a.valueDomain&&!d0.XT.includes(a.valueDomain))throw dD("valueDomain不在登记的属性域内");return(0,dY.j)(b.projectModel,{attribute:c,objectName:a.objectName,valueDomain:a.valueDomain})}},ei={name:"query_cad_context",description:dP("只读本轮冻结图纸的实际图框、标注、几何及块变换来源,按完整记录分页。","先查询frames取得真实frameId;没有图框时annotations可用非空实际字面query定位候选,再用返回rootBindings的rootInstanceId读同根annotations或geometry,也可从instances真实目录定位。零query不返回全图,字面子串不当多关键词语义。数字标注常只有数值。","图框或坐标不等于工程属性已确认;解析不完整与旧解析身份显性报错,不猜部位或选择范围端点。"),scope:"evidence-whitelist",idempotent:!0,inputSchema:dQ.object({filePath:dQ.str("白名单内已冻结图纸相对路径"),kind:dQ.enumStr("查询类别,默认frames;instances读取真实根目录",["frames","annotations","geometry","instances"]),frameId:dQ.str("实际查询返回的图框身份"),entityId:dQ.str("实际结构记录身份"),query:dQ.str("单条记录的字面子串,不是语义检索或多个关键词;可省略以读取所选图框的全部标注"),rootInstanceId:dQ.str("instances目录实际返回的根身份,用于annotations或geometry;源handle/ordinal不代表工程部位,readingSourceIds只读身份不代表合格事实"),placement:dQ.enumStr("按实际块路径区分图框实例文字和绘图空间标注;不删原文,不证明某类来源没有工程内容",["all","drawing-space","frame-instance"]),textOnly:dQ.bool("只看有实际文字的标注;空尺寸实体可按entityId另读"),order:dQ.enumStr("按原实体顺序或实际坐标位置阅读",["source","position"]),detail:dQ.enumStr("frames可用catalog;instances只读catalog目录,实际几何用geometry full",["full","catalog"]),offset:dQ.int("分页偏移,按nextOffset继续"),limit:dQ.int("单页完整记录,默认8,最多24")},["filePath"]),handler:(a,b)=>{d8(b,"query_cad_context");let c=dN(a.filePath,"filePath");if(!d7(b,c))throw dE("图纸不在本任务资料白名单内");if(!b.projectModel)throw dG("冻结项目模型","主智能体必须在写作前固定图纸解析身份");let d=ae.join((0,ah.a2)(),"projects",(0,ag.computeProjectId)(ae.resolve(b.projectRoot)),"kb.db");if(!ac.existsSync(d))throw dG("图纸解析索引","先完整解析选定图纸并冻结输入");let e=b.projectModel;try{return(0,ah.VD)(b.projectRoot,b=>d5(b,e,{...a,filePath:c}))}catch(a){if(a instanceof d4)throw dD(a.message);throw a}}},ej={name:"query_work_packages",description:dP("查询本轮冻结清单的工程对象目录,或按memberIds/workPackageIds完整读取具体成员。","未指定ID时返回全部匹配工作包目录(无分页),供确定工程对象。指定ID时一次返回全部匹配原始记录,包括真实数量单位、特征和来源身份。只选本任务尚缺属性所在的对象,不遍历全项目清单。","资源计划先使用主控已给出的各阶段班组、设备和供料安排;原始清单不能替代施工部署或生产计划。目录不是工程量采用许可,清单归属不表示正文已覆盖。不同单位不得相加,原文出处使用sourceIndex;零命中不表示全资料无此工程。"),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("具体工程、分部或项目名称;按稳定ID读取时填*"),memberIds:dQ.arr("精确读取本任务尚缺属性的成员,全部指定成员一次返回",dQ.str("冻结目录中的完整成员ID")),workPackageIds:dQ.arr("精确读取所需工程对象工作包,全部成员一次返回",dQ.str("查询目录中的完整workPackageId"))},["query"]),idempotent:!0,handler:(a,b)=>{if(!b.projectModel?.workPackages)throw dG("冻结清单工作包库","主智能体须在写作开始前准备并冻结清单归属,不能解释为资料没有清单");d8(b,"query_work_packages");let c=dN(a.query,"query"),d={allowedFilePaths:Object.keys(b.projectModel.sources).filter(a=>d7(b,a))};return void 0!==a.memberIds||void 0!==a.workPackageIds?(0,d_.H)(b.projectModel,{query:c,memberIds:a.memberIds,workPackageIds:a.workPackageIds},d):(0,d_.F)(b.projectModel,c,d)}},ek={name:"query_source_units",scope:"evidence-whitelist",idempotent:!0,description:dP("读取已入库工作表的实际行及单元格、DOCX段落表格或PDF页,保留对象上下文、公式及稳定单元身份;不依赖原文件存在","已知文件需要解释对象、条件或单元格位置时;按nextOffset分页,不把零命中当资料没有","图纸几何用query_cad_context;不把结构单元自动当作已批准工程事实"),inputSchema:dQ.object({filePath:dQ.str("当前冻结知识库文件身份"),kind:dQ.enumStr("库内结构",["sheet-rows","docx-blocks","pdf-pages"]),query:dQ.str("具体原文或对象,可省略"),unitId:dQ.str("实际返回的单元ID,可省略"),offset:dQ.int("按nextOffset继续"),limit:dQ.int("单页完整记录,默认8,最多24")},["filePath","kind"]),handler:(a,b)=>{d8(b,"query_source_units");let c=dN(a.filePath,"filePath");if(!d7(b,c))throw dE("库内文件不在当前资料范围");if(!b.projectModel?.sources[c])throw dG("冻结库内文件身份","主控须固定本任务已入库资料");return(0,ah.VD)(b.projectRoot,d=>{if(d.parsedFileFingerprint(c).sha256!==b.projectModel.sources[c].sha256)throw dG("当前冻结解析身份","解析版本已改变,不能跨版本拼接");return d.queryParsedUnits(c,{kind:a.kind,query:a.query,unitId:a.unitId,offset:dO(a.offset,0,0,Number.MAX_SAFE_INTEGER),limit:dO(a.limit,8,1,24)})})}};async function el(a,b){let c=dN(a.attribute,"attribute"),d=b.authoritative;if(!d)throw dG("权威值选取的输入(facts / labeledValues / overrides)","运行时把 `buildAuthoritativeValues` 的入参挂到 `ctx.authoritative`(来源:事实池 + 原文口径标签 + 答疑覆盖)");let e=(0,d1.iC)(d),f=(0,d1.hf)(c),g=e.resolved.find(a=>a.attribute===c)??e.resolved.find(a=>(0,d1.hf)(a.attribute)===f)??e.resolved.find(a=>a.attribute.includes(c)||c.includes(a.attribute));return g?{attribute:g.attribute,value:g.value,rule:g.rule,evidence:g.evidence.map(a=>({source:a.source,snippet:a.snippet})),superseded:[...g.superseded],candidates:g.candidates.slice(0,12).map(a=>({subject:a.subject,value:a.value,source:a.source,priority:a.priority})),caliber:g.caliber}:{attribute:c,value:null,rule:null,evidence:[],superseded:[],candidates:[],caliber:!1}}let em={name:"lookup_authoritative",description:dP("按属性名查**现行权威值**及其裁决规则(R1..R7)、依据出处、被取代的历史值与全部候选(`buildAuthoritativeValues` 的 `ResolvedValue` 子集)。",'正文里要写某个数值/口径、需要先确认"以哪份资料为准"时(权威阶梯:clarification > 招标条款 > 评价规则 > 清单 > 图纸注记);或一个属性在资料里出现了多个值时,用它的 `superseded` / `candidates` 判断哪个是现行口径。','想检索资料原文(那是 `search_evidence`/`read_raw`);拿它当"事实查询"用来问与权威口径无关的内容(它只登记**口径型属性**,未命中会返回 `value: null`,那不是"资料里没有"而是"没有权威口径")。归**计划**阶段(S1.3)。'),scope:"evidence-whitelist",inputSchema:dQ.object({attribute:dQ.str("属性名(如「计划工期」「最高投标限价」「垫层做法」)")},["attribute"]),idempotent:!0,handler:el},en=new Set([".png",".jpg",".jpeg",".gif",".bmp",".webp",".tif",".tiff"]);async function eo(a,b){let c=dM(a.path,b.scopeRoots,"inspect_asset 的库内身份"),d=d6(b);if(!d)throw dG("知识库索引","先完成入库,不直接读取外部原文件");try{var e;let a=d.getRecord(c.relative);if(!a)throw dF(`库内文件记录未找到:${c.relative}`);let f=JSON.parse(a.metadataJson??"{}"),g=f.extraction??f,h=Number(g.imageWidth),i=Number(g.imageHeight);return{relativePath:c.relative,absolutePath:c.absolute,kind:(e=ae.extname(c.relative).toLowerCase(),".pdf"===e?"pdf":".docx"===e||".doc"===e?"docx":ea.has(e)?"xlsx":".dwg"===e||".dxf"===e?"dwg":en.has(e)?"image":d9.has(e)?"text":"other"),sizeBytes:a.fileSize,extractable:"active"===a.status,textExtracted:d.countChunks({relativePath:c.relative})>0,ocrAvailable:!0===b.ocrAvailable,...h>0&&i>0?{dimensions:{width:h,height:i}}:{},notes:["依据持久化库内记录;文件字段是逻辑身份,不要求磁盘原文件继续存在。图形及对象含义须读取对应结构单元。"]}}finally{d.close()}}async function ep(a,b){let c=dN(a.reason,"reason");if(!Array.isArray(a.roots)||0===a.roots.length)throw dD("roots 必须是非空数组");let d=[],e=[];for(let c of a.roots){let a=String(c??"").trim();if(!a){d.push({root:String(c),reason:"空路径"});continue}if(!ae.isAbsolute(a)){d.push({root:a,reason:"资料范围只能按绝对路径授予(相对路径的基准会随 cwd 漂移)"});continue}let f=function(a){let b=ae.resolve(a),c=bw.homedir();if(["/",c,ae.join(c,".customize-agent"),ae.join(c,".ssh"),ae.join(c,".aws")].includes(b))return"该根属于 4.6 域表中的禁止面(项目文件/系统/家目录)";let d=[ae.join(c,".customize-agent"),ae.join(c,".ssh"),ae.join(c,".aws"),ae.join(c,".config"),"/etc","/usr","/bin","/sbin","/var","/System","/Library",ae.join("C:","Windows")].find(a=>b===a||b.startsWith(`${a}${ae.sep}`));return d?`该根落在禁止面「${d}」之内(4.6:项目文件/系统/家目录一律禁止,含存放 API Key 的配置目录)`:void 0}(a);if(f){d.push({root:a,reason:f});continue}if(b.scopeRoots.some(b=>ae.resolve(b)===ae.resolve(a))){d.push({root:a,reason:"该根已在当前资料范围内,无需扩范围"});continue}e.push(ae.resolve(a))}if(0===e.length)throw dD(`没有任何可提交的扩范围请求。逐根拒绝原因:${d.map(a=>`${a.root} → ${a.reason}`).join(";")}`);return{requestId:`expand-scope-${Date.now().toString(36)}-${Math.abs(function(a){let b=0;for(let c=0;c<a.length;c+=1)b=31*b+a.charCodeAt(c)|0;return b}(e.join("|"))).toString(36)}`,tool:"expand_scope",status:"pending",reason:c,requestedRoots:e,currentRoots:[...b.scopeRoots],risk:"资料范围是 4.6 的冻结域:扩大可达面会让后续取证读到此前不可见的数据,必须人工确认",rejected:d}}let eq=[eb,ed,ee,ef,em,eh,eg,ej,ei,ek,{name:"inspect_asset",description:dP("探测一个资料文件的可读性:类型、体积、是否可抽取、KB 里是否已有抽取文本、图像像素尺寸、OCR 是否可用。",'**在决定怎么读它之前**先探一次(PDF 要页码、图要替代表、表格要工作表名,三种读法完全不同);或 `read_raw` 失败后先用它判断是"文件不在"、"没索引"还是"格式一期不支持"。',"已经知道类型且要内容时(直接 `read_raw`/`read_source`);也不要拿它批量扫全库——清单类的批量信息用 `discover_files`(一次返回全部元数据)。"),scope:"evidence-whitelist",inputSchema:dQ.object({path:dQ.str("资料文件路径(须落在资料白名单内)")},["path"]),idempotent:!0,handler:eo},{name:"expand_scope",description:dP("提交一份**扩大资料范围**的审批请求(不自行生效:只生成 pending 的 ApprovalRequest,含逐根拒绝原因)。",'确信资料就在白名单之外、且不读它就写不下去时(例如招标正文没被纳入资料范围,而某条要求必须核对原文);先把 `reason` 写清"缺了它会导致什么后果",人工据此裁决。','常规取证(白名单内还有很多没看时,先把范围用尽);把"授权"当成能自己给自己开的门——本工具**永不返回已获批**,且会直接拒绝 4.6 的禁止面(家目录/系统/含 API Key 的配置目录);也不要为了绕过某次 PATH_DENIED 而调它(那次拒绝是判据在工作,不是范围不够)。⚠需审批。'),scope:"evidence-whitelist",inputSchema:dQ.object({reason:dQ.str("扩范围的理由与后果(人工裁决的依据,不得写空话)"),roots:dQ.arr("申请纳入资料范围的**绝对路径**根(逐个校验;禁止面内的会被直接拒绝)",dQ.str("绝对路径"))},["reason","roots"]),idempotent:!1,requiresApproval:!0,handler:ep}],er=["schedule","assemblyRate","supportSystem","laborPeak","greeningMaintenance","blueprint","canonicalFacts"].map(a=>({id:a})),es=[{id:"spec-gate-rules",scope:"full-document",category:"structure",manualReview:!0},{id:"figure-substitute-table",scope:"full-document",category:"structure",manualReview:!0},{id:"project-contamination",scope:"full-document",category:"scope"},{id:"formal-text-gate",scope:"full-document",category:"format"},{id:"gating-checklist",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"toc-consistency",scope:"full-document",category:"structure",deterministicSafe:!0},{id:"hazard-grade-consistency",scope:"chapter",category:"fact_consistency",manualReview:!0},{id:"structure-integrity",scope:"full-document",category:"structure",deterministicSafe:!0},{id:"conclusion-table-conflict",scope:"full-document",category:"fact_consistency"},{id:"paragraph-near-duplicate",scope:"full-document",category:"style",manualReview:!0},{id:"overview-recap",scope:"full-document",category:"style"},{id:"internal-terminology-anchor",scope:"full-document",category:"style",deterministicSafe:!0},{id:"planning-leak",scope:"full-document",category:"format",deterministicSafe:!0},{id:"basis-regulations-coverage",scope:"full-document",category:"fact_consistency",authorities:["blueprint"]},{id:"construction-org-control-loop",scope:"chapter",category:"control_loop",manualReview:!0},{id:"construction-org-professional-chain",scope:"chapter",category:"professional_chain",manualReview:!0},{id:"planned-section-placement",scope:"chapter",category:"structure"},{id:"hollow-table-cell",scope:"full-document",category:"table",manualReview:!0},{id:"schedule-duration-overrun",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"stage-schedule-consistency",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"caliber-consistency",scope:"full-document",category:"fact_consistency"},{id:"hazard-parameter-binding",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"blueprint-value-placement",scope:"full-document",category:"professional_chain",manualReview:!0},{id:"dangling-conjunction",scope:"full-document",category:"structure",manualReview:!0},{id:"precise-fact-usage",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"parameter-obligation-usage",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"boq-placement",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"drawing-reference",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"drawing-pointer-phrase",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"table-title-without-table",scope:"full-document",category:"format"},{id:"truncated-sentence",scope:"full-document",category:"format",deterministicSafe:!0},{id:"block-structure-contract",scope:"chapter",category:"structure"}],et=[{name:"explain_defect",description:dP("查一条检测器的元数据:作用域、类别、人工复核标记及依赖的权威口径;实际执行与未测状态由完整合同评审回执确认。","需要核对一条真实问题的类别、权威依赖和人工复核方式时;或需要确认该项是否登记人工复核(manualReview),而非推断存在自动修复轮。","想知道当前文档**有哪些缺陷**(那是 `list_defects`,元动作类);也不要把它当检测器执行入口——它只返回声明,不跑判据。"),scope:"readonly",inputSchema:dQ.object({detectorId:dQ.str("检测器 id(注册表内已登记)")},["detectorId"]),idempotent:!0,handler:function(a){let b=String(a.detectorId??"").trim();if(!b)throw dD("detectorId 不能为空");let c=es.find(a=>a.id===b);if(!c)throw dF(`检测器「${b}」未登记在注册表`);let d=[...c.authorities??[]],e=new Set(er.map(a=>a.id));return{detectorId:c.id,scope:c.scope,category:c.category,manualReview:!0===c.manualReview,authority:d,authorityUnregistered:d.filter(a=>!e.has(a)),deterministicSafe:!0===c.deterministicSafe}}}];var eu=c(85354);let ev={sqrt:Math.sqrt,abs:Math.abs,round:Math.round,floor:Math.floor,ceil:Math.ceil,min:Math.min,max:Math.max,pow:Math.pow,log:Math.log,log10:Math.log10,exp:Math.exp,sin:Math.sin,cos:Math.cos,tan:Math.tan,hypot:Math.hypot};class ew{constructor(a){this.source=a,this.index=0,this.depth=0}parse(){let a=this.parseExpression();if(this.skipSpaces(),this.index<this.source.length)throw dD(`表达式在第 ${this.index+1} 个字符处无法解析:「${this.source.slice(this.index,this.index+16)}」`);return a}skipSpaces(){for(;this.index<this.source.length&&/\s/u.test(this.source[this.index]);)this.index+=1}peek(){return this.skipSpaces(),this.source[this.index]??""}parseExpression(){this.enter();let a=this.parseTerm();for(;;){let b=this.peek();if("+"!==b&&"-"!==b)break;this.index+=1;let c=this.parseTerm();a="+"===b?a+c:a-c}return this.exit(),a}parseTerm(){let a=this.parseUnary();for(;;){let b=this.peek();if("*"!==b&&"/"!==b&&"%"!==b)break;this.index+=1;let c=this.parseUnary();if(("/"===b||"%"===b)&&0===c)throw dD("表达式里出现除以 0");a="*"===b?a*c:"/"===b?a/c:a%c}return a}parseUnary(){let a=this.peek();return"-"===a?(this.index+=1,-this.parseUnary()):"+"===a?(this.index+=1,this.parseUnary()):this.parsePower()}parsePower(){let a=this.parsePrimary();return"*"!==this.peek()||"*"!==this.source[this.index+1]?a:(this.index+=2,Math.pow(a,this.parseUnary()))}parsePrimary(){this.skipSpaces();let a=this.source[this.index]??"";if("("===a){this.index+=1;let a=this.parseExpression();if(this.skipSpaces(),")"!==this.source[this.index])throw dD("括号不配对(缺少右括号)");return this.index+=1,a}if(/[0-9.]/u.test(a))return this.parseNumber();if(/[A-Za-z_]/u.test(a))return this.parseCall();throw dD(`表达式在第 ${this.index+1} 个字符处出现非法字符「${a}」`)}parseNumber(){let a=this.index;for(;this.index<this.source.length&&/[0-9._eE]/u.test(this.source[this.index]);)this.index+=1;let b=this.source.slice(a,this.index).replace(/_/gu,""),c=Number(b);if(!Number.isFinite(c))throw dD(`无法识别的数值字面量「${b}」`);return c}parseCall(){let a=this.index;for(;this.index<this.source.length&&/[A-Za-z_0-9]/u.test(this.source[this.index]);)this.index+=1;let b=this.source.slice(a,this.index),c=ev[b];if(!c)throw dD(`不支持的函数「${b}」(可用:${Object.keys(ev).join("、")})`);if(this.skipSpaces(),"("!==this.source[this.index])throw dD(`函数「${b}」后面必须是参数括号`);this.index+=1;let d=[];if(this.skipSpaces(),")"!==this.source[this.index])for(;;){if(d.push(this.parseExpression()),","===this.peek()){this.index+=1;continue}break}if(this.skipSpaces(),")"!==this.source[this.index])throw dD(`函数「${b}」的参数括号不配对`);return this.index+=1,c(...d)}enter(){if(this.depth+=1,this.depth>32)throw dD(`表达式嵌套超过 32 层`)}exit(){this.depth-=1}}function ex(a){return`'${a.replace(/'/gu,"'\\''")}'`}async function ey(a,b){let c="string"==typeof a.expr?a.expr.trim():"",e="string"==typeof a.script?a.script:"";if(c&&e)throw dD("expr 与 script 互斥,只能给一个");if(!c&&!e)throw dD("必须给 expr(纯算术)或 script(受限沙箱脚本)之一");if(c)return{result:function(a){var b;let c=(b=dN(a,"expr"),(0,d.Hr)(b).replace(/[×✕✖]/gu,"*").replace(/[÷]/gu,"/").replace(/[()]/gu,a=>"("===a?"(":")"));if(c.length>2e3)throw dD(`表达式过长(>2000 字符)`);let e=new ew(c).parse();if(!Number.isFinite(e))throw dD("计算结果不是有限数(溢出或未定义)——请检查量级与运算符");return Number(e.toPrecision(12))}(c),stdout:"",mode:"expr",executed:c};let f="py"===a.lang?"py":"js",g=b.sandbox;if(!g)throw dG("受限沙箱执行能力(`ctx.sandbox.execute`)","运行时注入:接 `packages/tools/src/sandbox/sandbox-executor.ts` 的 `SandboxExecutor`(docker/bwrap/sandbox-exec/VFS-Guard)");let h="py"===f?`python3 -c ${ex(e)}`:`node -e ${ex(e)}`,i=await g.execute(h,{timeoutMs:1e4,lang:f});if(0!==i.code)throw dD(`沙箱脚本退出码 ${i.code}:${(i.stderr||i.stdout||"").slice(0,800)}`);let j=String(i.stdout??""),k=Number(j.trim().split("\n").pop());return{result:Number.isFinite(k)?k:null,stdout:j.slice(0,4e3),mode:"sandbox-script",executed:`[${f} script, ${e.length} chars]`,exitCode:i.code}}let ez={name:"compute",description:dP("算数:`expr` 走**纯算术求值器**(+ - * / % ** 与 sqrt/abs/round/min/max/pow/log/hypot 等白名单函数,不 eval);`script` 走**受限沙箱**。","合计对不上要复核、要把清单里的分项加一遍、要做量级估算或百分比换算时;正文里即将落一个推导出来的数值,落笔前先算一遍。",'**不要用它"算出一个看起来合理的值"来填空**——算出来的数不等于资料里的数,无源的数值仍然要 `declare_missing`;也不要拿它当通用代码执行器(`expr` 只认算术与白名单函数;`script` 没有沙箱能力时直接失败,不会退回进程内执行)。'),scope:"sandbox",inputSchema:dQ.object({expr:dQ.str("纯算术表达式(支持全角字符、括号、幂、白名单函数;与 script 互斥)"),script:dQ.str("受限沙箱脚本(与 expr 互斥;需运行时接入沙箱能力)"),lang:dQ.enumStr("脚本语言(仅 script 模式有效,缺省 js)",["js","py"])}),idempotent:!0,handler:ey},eA={长度:{m:1,km:1e3,cm:.01,mm:.001},面积:{m2:1,hm2:1e4},体积:{m3:1,l:.001,ml:1e-6},质量:{kg:1,g:.001,t:1e3},力:{kn:1,n:.001},压强:{mpa:1,kpa:.001,pa:1e-6},功率:{kw:1,mw:1e3,w:.001},电压:{kv:1,v:.001},电流:{a:1,ma:.001},频率:{hz:1},时间:{h:1,min:1/60},比率:{"%":1,permille:.1}};function eB(a){let b=(0,d.Hr)(String(a??"")).trim();return(0,eu.Sn)(b||String(a??"").trim())}let eC={name:"convert_units",description:dP("单位换算:判定两单位是否同量纲(`unitAliases.unitsAreEquivalent`),同量纲则按固定倍率换算,否则返回 null 并说明。","正文/表格里的单位与资料不一致、需要核对是否等价或换算成同一单位再比较时;或要确认两个写法(「米」/「延长米」/「m」、「㎡」/「m2」)是不是同一单位。",'拿它做无关换算(座→个、套→台这类**计数单位**永远返回 null,见 `unitAliases` 的"不做量纲互换"口径);也不要拿换算结果去替换正文里的数值——换算会引入原文没有的值,那是改写而不是核对。'),scope:"sandbox",inputSchema:dQ.object({value:dQ.num("待换算的数值"),from:dQ.str("原单位(支持中文写法与符号形:米/m、㎡/m2、千牛/kN…)"),to:dQ.str("目标单位")},["value","from","to"]),idempotent:!0,handler:function(a){let b="number"==typeof a.value?a.value:Number(a.value);if(!Number.isFinite(b))throw dD("value 必须是有限数");let c=dN(a.from,"from"),d=dN(a.to,"to"),e=eB(c),f=eB(d);if(!(0,eu.Q0)(c,d))return{value:null,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!1,reason:"两单位不同量纲(`unitsAreEquivalent` 判否)——计数单位之间尤其不可互认(座 ≠ 组 ≠ 个)"};if(e===f)return{value:b,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0};for(let[a,g]of Object.entries(eA)){let h=g[e],i=g[f];if(void 0!==h&&void 0!==i)return{value:Number((b*h/i).toPrecision(12)),from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0,reason:`同量纲(${a})倍率换算`}}return{value:null,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0,reason:`两单位判为同量纲,但本工具的倍率表没有覆盖「${e} → ${f}」这一对——不猜倍率,宁可不给结果`}}},eD=/^(?:合\s*计|小\s*计|总\s*计|共\s*计|合\s*价)$/u;function eE(a){let b=String(a??"").replace(/\s+/gu,"").replace(/[,,]/gu,"");if(!b)return;let c=/^[-+]?\d+(?:\.\d+)?/u.exec(b.replace(/^[¥¥$]/u,""));if(!c)return;let d=Number(c[0]);return Number.isFinite(d)?d:void 0}let eF=[ez,eC,{name:"verify_table_arithmetic",description:dP("核验文档里的表内算术:既有判据(`tableArithmeticInconsistencyIssues` + `areaArithmeticIssues`)+ 显式「合计/小计」行列的确定性求和兜底。","表格里出现合计/小计时(分项和与合计不等是**阻断级**缺陷,改一个数字还是改合计需要先看清差异);或 `check` 报了表内算术类 issue、要定位到具体行列时。",'把 `defects` 为空读成"表内算术一定对"——兜底只覆盖显式合计形态,未覆盖的关系不在结论内(返回值 `note` 已写明);也不要拿它去改数字:先算出差异、再判断是分项错还是合计错,改动走 `patch_section` 且必须有资料依据。'),scope:"sandbox",inputSchema:dQ.object({markdown:dQ.str("含表格的 Markdown 文本(单章或全文)")},["markdown"]),idempotent:!0,handler:function(a){let b=dN(a.markdown,"markdown"),c=[...cL(b),...function(a){let b=[];for(let c of a.matchAll(cr)){let a=Number(c[2].replace(/[,,]/gu,"")),d=Number(c[3].replace(/[,,]/gu,"")),e=Number(c[4].replace(/[,,]/gu,""));if(![a,d,e].every(Number.isFinite))continue;let f=a+d;f!==e&&b.push({level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`面积算术矛盾:地上 ${a}㎡ + 地下 ${d}㎡ = ${f}㎡,与同句“单体建筑面积 ${e}㎡”不符(差 ${Math.abs(f-e).toFixed(2)}㎡)`,suggestion:`地上与地下面积之和必须等于单体建筑面积:按绑定资料统一三者数值,删除错误数值表述。`})}return b}(b)],d=function(a){let b=[],c=a.split(/\r?\n/u),d=-1,e=[],f=0,g=0,h=()=>{if(e.length<3){e=[];return}let[a,...c]=e,h=a.cells.length,i=c[c.length-1];if(eD.test(i.cells[0]??"")){f+=1;for(let a=1;a<h;a+=1){let e=eE(i.cells[a]??"");if(void 0===e)continue;let f=0,g=0;for(let b of c.slice(0,-1)){let c=eE(b.cells[a]??"");void 0!==c&&(f+=c,g+=1)}0!==g&&Math.abs(f-e)>Math.max(1e-6,1e-6*Math.abs(f))&&b.push({tableIndex:d,location:`第 ${i.line} 行「${i.cells[0]}」\xb7 第 ${a+1} 列`,expected:Number(f.toPrecision(12)),found:e,detail:`该列 ${g} 个数值分项之和为 ${Number(f.toPrecision(12))},但合计行写的是 ${e}`,source:"fallback"})}}let j=a.cells.findIndex(a=>eD.test(a));if(j>0)for(let a of(g+=1,c)){let c=eE(a.cells[j]??"");if(void 0===c)continue;let e=0,f=0;for(let b=0;b<h;b+=1){if(b===j)continue;let c=eE(a.cells[b]??"");void 0!==c&&(e+=c,f+=1)}!(f<2)&&Math.abs(e-c)>Math.max(1e-6,1e-6*Math.abs(e))&&b.push({tableIndex:d,location:`第 ${a.line} 行「合计」列`,expected:Number(e.toPrecision(12)),found:c,detail:`该行 ${f} 个数值分项之和为 ${Number(e.toPrecision(12))},但合计列写的是 ${c}`,source:"fallback"})}e=[]};return c.forEach((a,b)=>{if(/^\s*\|.*\|\s*$/u.test(a)){0===e.length&&(d+=1);let c=a.replace(/^\s*\|/u,"").replace(/\|\s*$/u,"").split("|").map(a=>a.trim());c.every(a=>/^:?-{2,}:?$/u.test(a)||""===a)||e.push({cells:c,line:b+1});return}h()}),h(),{defects:b,sumRows:f,sumColumns:g,tables:Math.max(0,d+1)}}(b);return{defects:[...c.map((a,b)=>({tableIndex:-1,location:a.sectionTitle??a.chapterId??`检测器命中 #${b+1}`,expected:NaN,found:NaN,detail:a.message,source:"detector"})),...d.defects],checked:{tables:d.tables,sumRows:d.sumRows,sumColumns:d.sumColumns,detectorIssues:c.length},note:"detector 条目来自既有判据(表内算术自洽 + 面积三元组),是权威;fallback 条目只覆盖显式「合计/小计」形态,未覆盖的表格关系(百分比/加权/取整)不在此工具结论内——**没有 fallback 命中不等于表内算术一定自洽**。"}}}],eG=["知识库","系统暂未","项目资料暂未","资料未明确","暂未明确","待确认","待资料复核","待系统","未检索到","资料不足","无法确认","建议补充","不适用","COL","可核验信息","工作包",...a1.Kd],eH=/\|.+\|/u,eI=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u,eJ=/\r?\n/u,eK=[/见(?:资料|文件|说明|方案|附件|相关文件)/u,/按(?:资料|文件|说明)/u,/满足(?:相关|有关)?要求/u,/依据本项目已确认资料/u],eL=/^(?:—+|-+|-|\/|N\/A|n\/a|待定|待补充|待确认|待查|待补|若干|暂无|无数据|无)$/u,eM=/^约\d/u,eN=[{open:"(",close:")",label:"全角括号"},{open:"《",close:"》",label:"书名号"}],eO=[...eG.filter(a=>!a1.Kd.includes(a)),.../工作包|事实卡|事实主表|后台数据库|落位|峰值口径|控制口径|数据口径/gu.source.split("|")],eP=["WRITER_MISSING_SECTION","Writer 未完成"],eQ=[/:\s*:/u,/;:/u,/。:/u,/。;/u,/;。/u,/。,/u,/,。/u,/。{2,}/u,/、{2,}/u],eR=a=>dQ.str(a,{minLength:1}),eS=dQ.arr("实际承担的本任务职责序号,从0开始",dQ.int("职责序号"),{minItems:1}),eT={id:dQ.int("三类载体共用唯一正整数,按正文实际顺序由小到大编号;此ID同时声明正文次序"),criterionIndices:eS,heading:eR("必要的内部小标题,没有时省略")},eU=dQ.arr("按原文顺序拼接:普通片段填text与实际出处;引用另一真实小节的片段只填sectionIndex,由服务端恢复当前合同标签",dQ.obj("正文或真实小节引用片段",{text:eR("实际交付原文,一段或一格可按不同断言分片;各片段首尾保留必要空格和标点"),sectionIndex:dQ.int("当前冻结合同小节表中明确选定的目标序号;本片段不能另填text或出处"),...{factIndices:dQ.arr("本片段每一处实际陈述的冻结属性序号;重复值也逐处登记,不替另一属性背书",dQ.int("已提供的factIndex")),sourceIndices:dQ.arr("本片段每一处引用的完整原文序号,重复断言仍须选择;独立核验其对象条件与含义",dQ.int("已提供的sourceIndex")),productionNumberIndices:dQ.arr("当前同合同施工生产计划的实际数值索引,保留拟定或推导用途,不作为项目事实或已核工程控制",dQ.int("当前视图或query_construction_plan提供的productionNumberIndex")),projectNumbers:dQ.arr("已有属性或原文引用覆盖时无需重复登记",dQ.obj("项目参数",{factIndex:dQ.int("实际冻结属性factIndex")},["factIndex"])),normativeNumbers:dQ.arr("本片段规范的真实定量控制值;规范编号和日期不登记",dQ.obj("规范参数",{factIndex:dQ.int("实际冻结属性factIndex"),version:eR("可核版本"),scope:eR("适用范围")},["factIndex","version","scope"])),derivedNumbers:dQ.arr("本片段可复核的推导值",dQ.obj("推导参数",{formula:eR("冻结输入四则算式"),inputFactIndices:dQ.arr("可靠输入属性factIndex",dQ.int("factIndex"),{minItems:1}),basis:eR("推导量纲及依据")},["formula","inputFactIndices","basis"])),plannedNumbers:dQ.arr("本片段明确标识拟定的数值安排;无数值的定性措施不填此类别",dQ.obj("拟定参数",{basis:eR("实际拟定依据"),constraints:dQ.arr("真实约束",eR("约束"),{minItems:1})},["basis","constraints"]))}},[]),{minItems:1}),eV=dQ.obj("本任务完整产物,compact-v7在实际正文片段上登记出处,原文不重复抄成引用",{format:dQ.enumStr("固定协议",["compact-v7"]),paragraphs:dQ.arr("全部正文段落",dQ.obj("一个完整段落及其引用",{...eT,parts:eU},["id","criterionIndices","parts"])),tables:dQ.arr("全部完整表格,没有时为空数组",dQ.obj("完整数据表",{...eT,caption:eR("非空实际表名"),columns:dQ.arr("字段顺序",dQ.obj("字段",{key:eR("字段key"),title:eR("字段名称"),unit:eR("必要的字段单位")},["key","title"]),{minItems:1}),rows:dQ.arr("全部数据记录;记录身份由服务端按实际行序管理",dQ.obj("记录",{cells:dQ.arr("按columns顺序逐格填写,不能多或少",dQ.obj("实际单元格",{parts:eU},["parts"]))},["cells"]),{minItems:1})},["id","criterionIndices","caption","columns","rows"])),figures:dQ.arr("全部完整图件,没有时为空数组;关系图表达工序接口,平面布置必须给二维layout并说明为示意",dQ.obj("完整图件",{...eT,caption:eR("非空实际图名"),nodes:dQ.arr("全部节点",dQ.obj("节点",{id:eR("节点ID"),parts:eU},["id","parts"]),{minItems:1}),edges:dQ.arr("全部关系",dQ.obj("关系",{from:eR("真实起点ID"),to:eR("真实终点ID"),parts:eU},["from","to"])),layout:dQ.obj("仅平面布置提供:归一化图内坐标,不是现场尺度;不得伪造尺寸、北向或边界",{coordinateSystem:dQ.enumStr("图内相对示意坐标",["relative-schematic"]),placements:dQ.arr("每节点恰好一个不重叠区域,完整标签需能容纳",dQ.obj("区域位置",{nodeId:eR("nodes中的实际身份"),x:dQ.num("左上角x,0到1"),y:dQ.num("左上角y,0到1"),width:dQ.num("宽度,正数,区域不得超出1"),height:dQ.num("高度,正数,区域不得超出1")},["nodeId","x","y","width","height"])),routes:dQ.arr("每条edges关系恰好一条实际通行或管线路径;端点落在对应区域",dQ.obj("路线",{edgeIndex:dQ.int("实际edges数组序号"),points:dQ.arr("完整折线路径至少两点",dQ.obj("图内点",{x:dQ.num("x,0到1"),y:dQ.num("y,0到1")},["x","y"]),{minItems:2})},["edgeIndex","points"]))},["coordinateSystem","placements","routes"])},["id","criterionIndices","caption","nodes","edges"])),decisionRequests:dQ.arr("真实未决事项,没有时返回[]",dQ.obj("未决事项",{id:eR("请求ID"),question:eR("具体问题"),reason:eR("缺少哪项实际依据"),criterionIndices:eS},["id","question","reason","criterionIndices"])),revisionReason:dQ.str("首次写入不必填写理由,由服务端登记;已接收稿的实质修订须说明具体原因")},["format","paragraphs","tables","figures","decisionRequests"]);function eW(a){return(a.match(/^###\s+\S/gmu)||[]).length}function eX(a){return String(a??"").replace(/\s+/gu,"")}function eY(a,b){let c=0;for(let d=0;d<a.length;d+=1)if(!/\s/u.test(a[d])){if(c===b)return d;c+=1}return -1}function eZ(a,b,c){let d=[],e=[],f=String(c??""),g=0===f.trim().length?"delete":!0===b.append||"chapter-end"===b.appendAt?"append":"string"==typeof b.endText&&b.endText.trim().length>0?"range":"anchor",h="append"===g?Math.max(4e3,Math.min(24e3,Math.ceil(1.2*bH(a)))):"range"===g?Math.max(2600,Math.min(9e3,Math.ceil(.95*bH(a)))):Math.max(2600,Math.min(16e3,Math.ceil(.45*bH(a)))),i=eX(b?.text);i.length<4&&d.push(`锚点过短(空白归一后 ${i.length} 字符 < 4):无法唯一定位,请给更长的锚点原文`),i&&!eX(a).includes(i)&&d.push("锚点在当前正文中未命中(逐字与空白归一两种比对都不中):锚点必须逐字取自当前草稿"),"delete"!==g&&0===f.trim().length&&d.push("replacement 为空但锚点不是删除语义——本工具的删除语义只由 `delete_span` 承担"),f.length>h&&d.push(`replacement 长度 ${f.length} 超出 ${g} 模式预算 ${h}(4.4 表第 3–5 行)`),"range"===g&&i&&!eX(f).includes(i)&&d.push("range 模式下 replacement 必须逐字包含起点锚点行(否则会把小节标题行整段吃掉)");let j=f,k=!1;if("append"===g&&i&&!eX(j).startsWith(i)&&(j=`${b.text}${j}`,k=!0),"delete"!==g&&j.trim().length>0){let a="append"===g?void 0:b?.text;for(let b of(e.push(...function(a,b){let c=[];bU.test(a)&&c.push("资料来源罗列句");let d=eO.filter(b=>a.includes(b));for(let b of(d.length>0&&c.push(`内部术语“${d.join("”“")}”`),a.matchAll(cq)))c.push(`具体日历日期“${b[1]}年${b[2]}月${b[3]}日”`);let e=[...new Set(a.match(cs)||[])];e.length>0&&c.push(`叠词“${e.join("”“")}”`);let f=eP.filter(b=>a.includes(b));f.length>0&&c.push(`未完成小节标记“${f.join("”“")}”`),function(a){let b=[...a.matchAll(cu)].map(a=>a[0].trim().slice(0,30));return 0===b.length?[]:[{level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`正文存在元话语声明句 ${b.length} 处(${[...new Set(b)].slice(0,3).join("、")}):声明≠数据,正文只保留数据不保留口径声明`,suggestion:"删除「不再另行出现其他口径」「不再另行统计累计投入人次」「以 X 为唯一控制基准,不再…」类自我声明句;数据本身的唯一性由数值一致体现,不需要文字声明。"}]}(a).length>0&&c.push("元话语声明句"),function(a){let b=[...a.matchAll(cv)].map(a=>a[0].trim().slice(0,30));return 0===b.length?[]:[{level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`正文出现公式形态残留 ${b.length} 处(${[...new Set(b)].slice(0,3).join("、")}):正文只允许计算值不允许计算公式`,suggestion:"删除公式符号(P =、Σ、cosφ、K1、q =),只保留计算结果值:如「用电负荷约 48kW」「高峰日生活用水量约 X m\xb3」;公式推导过程一律不进入正文。"}]}(a).length>0&&c.push("公式形态残留"),function(a){let b=[];for(let c of a.matchAll(RegExp(`(${ct})[^。;;
|
|
30
|
+
别用:${c}`}let dQ={str:(a,b={})=>({type:"string",description:a,...b}),num:(a,b={})=>({type:"number",description:a,...b}),int:(a,b={})=>({type:"integer",description:a,...b}),bool:(a,b={})=>({type:"boolean",description:a,...b}),arr:(a,b,c={})=>({type:"array",description:a,items:b,...c}),obj:(a,b,c=[],d={})=>({type:"object",description:a,properties:b,required:c,...d}),enumStr:(a,b)=>({type:"string",description:a,enum:b}),anyObj:a=>({type:"object",description:a}),object:(a,b=[])=>({type:"object",properties:a,required:b,additionalProperties:!1})};var dR=c(23313);let dS=new WeakMap;function dT(a,b){let c=a&&dS.get(a);if(!c)return;let d=c.tasks.get(JSON.stringify([b.chapterId,b.blockTitle])),f=d??`unplanned:${(0,e.createHash)("sha256").update(JSON.stringify([b.chapterId,b.blockTitle])).digest("hex").slice(0,24)}`,g=c.records.filter(a=>a.taskId===f).length,h=(0,e.randomUUID)();for(let a of Array.isArray(b.response?.rawToolCalls)?b.response.rawToolCalls:b.response?.toolCalls??[]){let b;if(a?.name!=="submit_author_task"||"string"!=typeof a.arguments)continue;try{b=(0,du.parseJsonWithoutDuplicateKeys)(a.arguments).output}catch{}let d=c.previousDrafts.get(f),e=(0,dR.Br)(d,b),g=b&&"object"==typeof b?b.revisionReason:void 0;c.rawDrafts.push({taskId:f,callId:h,toolCallId:"string"==typeof a.id?a.id:null,ordinal:c.rawDrafts.filter(a=>a.taskId===f).length,declaredReason:"string"==typeof g?g:null,comparison:e}),(0,dR.IO)(b)&&c.previousDrafts.set(f,structuredClone(b))}let i=(0,a0.tv)(c.generatedDir,`author-response-${h}.json`,{version:1,runId:c.runId,contractId:c.contractId,projectSnapshotId:c.projectSnapshotId,taskId:f,belongsToFrozenTask:!!d,callId:h,ordinal:g,turn:b.turn,firstResponse:0===g,responseReceived:!!b.response,rawText:b.response?.rawContent??b.response?.content??null,request:b.request??null,rawToolCalls:b.response?.rawToolCalls??null,droppedToolCalls:b.response?.droppedToolCalls??null,appliedRequest:b.response?.requestMetadata??null,toolCalls:b.response?.toolCalls??[],modelResponse:b.response?.responseMetadata??null,c0Qualification:"unmeasured"},c.runId);return c.records.push({taskId:f,callId:h,ordinal:g,responseReceived:!!b.response,...i}),h}function dU(a){return String(a??"").replace(/[!-~]/gu,a=>String.fromCharCode(a.charCodeAt(0)-65248)).replace(/[\s\u3000,。、;:!?!?…·—\--~~"'`“”‘’()()【】[\]《》<>「」]/gu,"").toLowerCase()}function dV(a){return String(a??"").replace(/[,。;:!?]/gu,a=>({",":",","。":".",";":";",":":":","!":"!","?":"?"})[a]??a).replace(/\s+/gu,"")}function dW(a,b=()=>""){return{recordEvidenceCall:({tool:b,term:c})=>{if(!a.evidenceCallLog)return;let d=String(c??"").trim();d&&a.evidenceCallLog.push({tool:b,term:d})},declareMissing:({item:c,reason:d,evidence:e})=>{let f=a.evidenceCallLog,g=f?e.filter(a=>!function(a,b){let c=dU(a);return!!c&&b.some(a=>{let b=dU(a.term);return!!b&&(b.includes(c)||c.includes(b))})}(a,f)):[],h=f&&e.length>0&&g.length===e.length?`;⚠未取证:所列 ${e.length} 处均对不上本块取证记录(本块取证调用 ${f.length} 次)`:"",i=`${b()?`${b()}:`:""}${c}(${d}${e.length>0?`;证据:${e.slice(0,3).join("、")}`:""}${h})`;a.missingItems.push(i),a.missingItemDetails?.push({item:c,reason:d,evidence:[...e],location:b(),at:Date.now()}),a.onIssue?.([((a,b,c,d=a)=>({level:b,severity:c,category:"evidence_coverage",message:a,suggestion:'按缺口说明补资料或在正文中显式声明(`declare_missing` 的出口是"如实说不知道",不是"略过")',provenance:{detectorId:"agent-declare",fingerprint:d}}))(`写作期声明缺料:${i}`,"warning","warning",`declare-missing\u0000${c}`)])},declareUnfixable:({issue:c,reason:d})=>{a.unfixableDeclarations.push({issue:c,reason:d,declaredAt:b(),declaredAtMs:Date.now()}),a.onIssue?.([{...c,message:`写作期声明不可修:${c.message}(${d})`}])},requestClarification:({question:c,blocking:d})=>{let e=dV(c);a.clarificationRequests.some(a=>dV(a.question)===e)||a.clarificationRequests.push({question:e,blocking:d,askedAt:b(),askedAtMs:Date.now(),status:"pending"}),a.onIssue?.([{level:d?"error":"info",severity:d?"blocker":"suggestion",category:"professional_chain",message:`待答口径裁决(${d?"已挂起等人":"记账继续"}):${e}`,suggestion:"按 A5.2「让人选」形态给出候选与来源后,由人点选;未答前按权威阶梯最高候选先写并复查",provenance:{detectorId:"agent-request-clarification",fingerprint:`clarification\u0000${e}`}}])},listDefects:()=>a.defects()}}var dX=c(45455),dY=c(63007),dZ=c(41240),d$=c(44616),d_=c(68417),d0=c(89249),d1=c(83653);function d2(a,b){let c=d3(a,b).geometryGraph.entities[0],d=a=>c.pairs.find(b=>b[0]===a)?.[1],e=d("5"),f=e??`ordinal-${c.ordinal}`;if(e&&1!==a.geometryGraph.entities.filter(a=>a.pairs.some(a=>"5"===a[0]&&a[1]===e)).length)throw Error("CAD根源handle不唯一,不能猜所属实例标注");return{rootInstanceId:b,sourceOrdinal:c.ordinal,entityType:c.type,sourceHandle:e??null,ownerHandle:d("330")??null,blockName:["INSERT","DIMENSION"].includes(c.type)?d("2")??null:null,instancePrefix:["INSERT","DIMENSION"].includes(c.type)?[f]:[],reference:f}}function d3(a,b){if(!/^(?:0|[1-9]\d*)$/u.test(b)||!Number.isSafeInteger(Number(b)))throw Error("CAD根实例身份无效");let c=a.geometryGraph.entities.findIndex(a=>String(a.ordinal)===b);if(c<0)throw Error("CAD根实例不属于该冻结图纸");let d=a.geometryGraph.entities[c];if(["SECTION","ENDSEC","ENDBLK","SEQEND","VERTEX"].includes(d.type))throw Error("源marker或序列成员不是独立几何根,须定位实际POLYLINE等根实例");let e=[d];if("POLYLINE"===d.type){let b=c+1;for(;a.geometryGraph.entities[b]?.type==="VERTEX";)e.push(a.geometryGraph.entities[b++]);if(a.geometryGraph.entities[b]?.type!=="SEQEND")throw Error("POLYLINE源序列未闭合,不能截去后续顶点冒充完整几何");e.push(a.geometryGraph.entities[b])}return{...a,geometryGraph:{...a.geometryGraph,entities:e}}}class d4 extends Error{constructor(...a){super(...a),this.name="CadQueryInputError"}}function d5(a,b,c){return a.readSnapshot(()=>{let d=b.sources[c.filePath];if(!d)throw Error("图纸不属于本轮冻结项目");let f=a.parsedFileFingerprint(c.filePath);if(f.sha256!==d.sha256)throw Error("图纸解析资产已变化,不能把新图框或坐标绑定到旧项目快照;须重新冻结项目");let g=a.loadMaterialEntities(c.filePath,"cad-scene-quality")[0]?.payload;if(!g?.version)throw Error("该图纸尚未按实际块实例与图框解析;旧图带不能作为图框身份,须重新解析");if(g.version!==ag.CAD_SCENE_VERSION)throw Error("图纸结构版本与当前读取协议不兼容,须重新解析并冻结项目");let h=c.kind??"frames";if(!["frames","annotations","geometry","instances"].includes(h))throw new d4("CAD查询类型无效");if(void 0!==c.rootInstanceId&&(!["geometry","annotations"].includes(h)||"string"!=typeof c.rootInstanceId))throw new d4("rootInstanceId只用于定位目录返回的实际几何或标注根");if("instances"===h&&(c.frameId||c.entityId||c.query||c.placement||void 0!==c.textOnly||c.order||"full"===c.detail))throw new d4("instances仅分页读取实际根目录,不接受图框、标注或全文筛选");if(c.rootInstanceId&&c.placement)throw new d4("根实例几何投影不使用图框块归属筛选");if(void 0!==c.detail&&(!["full","catalog"].includes(c.detail)||"catalog"===c.detail&&!["frames","instances"].includes(h)))throw new d4("目录投影只用于frames或instances,不能省略标注或几何细节");let i="annotations"===h&&!c.frameId&&!c.entityId&&!c.rootInstanceId&&"string"==typeof c.query&&!!c.query.trim();if(["annotations","geometry"].includes(h)&&!c.frameId&&!c.entityId&&!c.rootInstanceId&&!i)throw new d4("标注与几何查询须明确实际frameId或entityId;无图框时按instances真实根或非空实际字面query定位标注候选,不能全图猜对象");let j=c.frameId?a.queryMaterialEntityPage(c.filePath,{kind:"cad-frame",entityId:c.frameId,offset:0,limit:1}).records[0]?.payload:void 0;if(c.frameId&&!j)throw new d4("图框身份不属于该冻结图纸");if(void 0!==c.placement&&!["all","drawing-space","frame-instance"].includes(c.placement))throw new d4("CAD块归属筛选无效");if(c.placement&&"all"!==c.placement&&(!c.frameId||"frames"===h))throw new d4("块归属筛选须选择实际图框的标注或几何");if(void 0!==c.textOnly&&("boolean"!=typeof c.textOnly||"annotations"!==h))throw new d4("文字筛选只用于标注");if(void 0!==c.order&&(!["source","position"].includes(c.order)||"annotations"!==h))throw new d4("位置排序只用于标注");let k=j?.source,l=c.placement&&"all"!==c.placement?{path:k?.instancePath,handle:k?.handle,included:"frame-instance"===c.placement}:void 0;if(l&&(!Array.isArray(l.path)||!l.path.length||l.path.some(a=>"string"!=typeof a)))throw Error("图框实际块路径不完整,不能猜筛选归属");let m=c.offset??0,n=c.limit??8,o="instances"===h?function(a,b,c,d){let e=a.queryMaterialEntityPage(b,{kind:"cad-geometry-root",offset:c,limit:d});return{...e,records:e.records.map(a=>{let b=a.payload,c=b.pairs;if(!Number.isSafeInteger(b.ordinal)||0>Number(b.ordinal)||a.entityKey!==String(b.ordinal)||!Array.isArray(c)||c.some(a=>!Array.isArray(a)||2!==a.length||a.some(a=>"string"!=typeof a)))throw Error("CAD根实例身份或原始组码不完整,须重新解析");let d=a=>c.find(b=>b[0]===a)?.[1]??null;return{...a,payload:{rootInstanceId:a.entityKey,sourceOrdinal:b.ordinal,entityType:b.type,sourceHandle:d("5"),ownerHandle:d("330"),blockName:["INSERT","DIMENSION"].includes(String(b.type))?d("2"):null,layout:d("410"),sourceMarker:["SECTION","ENDSEC","ENDBLK","SEQEND"].includes(String(b.type)),sequenceMember:["VERTEX","SEQEND"].includes(String(b.type))}}})}}(a,c.filePath,m,n):i?function(a,b,c){if("string"!=typeof c.query||!c.query.trim())throw Error("无图框标注定位须提供非空实际字面query");let d=a.loadCadScene(b),e=a.queryMaterialEntityPage(b,{kind:"cad-entity",...c});return{...e,records:e.records.map(a=>{let b=a.payload,c=b.source,e=d.geometryGraph.entities.filter(a=>{if(["SECTION","ENDSEC","ENDBLK","SEQEND","VERTEX"].includes(a.type))return!1;let d=a.pairs.find(a=>"5"===a[0])?.[1],e=d??`ordinal-${a.ordinal}`;return 0===c.instancePath.length&&c.ordinal===a.ordinal||["INSERT","DIMENSION"].includes(a.type)&&c.instancePath[0]===e||"INSERT"===a.type&&"ATTRIB"===b.entityType&&0===c.instancePath.length&&void 0!==d&&c.ownerHandle===d}).flatMap(a=>{try{let{reference:b,...c}=d2(d,String(a.ordinal));return[c]}catch{return[]}});return{...a,rootBindings:e,rootBindingStatus:e.length?"source-bound":"unmeasured"}})}}(a,c.filePath,{query:c.query,textOnly:c.textOnly,order:c.order,offset:m,limit:n}):"annotations"===h&&void 0!==c.rootInstanceId?function(a,b,c){if(!Number.isSafeInteger(c.offset)||c.offset<0||!Number.isSafeInteger(c.limit)||c.limit<1||c.limit>24)throw Error("结构记录分页范围无效");let d=a.loadCadScene(b),e=d2(d,c.rootInstanceId),f=d.annotations.filter(a=>{let b=a.source,d=b.ordinal===e.sourceOrdinal&&0===b.instancePath.length,f=e.instancePrefix.length>0&&b.instancePath[0]===e.reference,g="INSERT"===e.entityType&&"ATTRIB"===a.entityType&&0===b.instancePath.length&&null!==e.sourceHandle&&b.ownerHandle===e.sourceHandle;return(d||f||g)&&(!c.frameId||a.sheet===c.frameId)&&(!c.entityId||a.id===c.entityId)&&(!c.query||(0,ag.projectCadAnnotationText)(a.text,a.entityType).includes(c.query))&&(!c.textOnly||!!(0,ag.projectCadAnnotationText)(a.text,a.entityType).trim())});"position"===c.order&&(f=f.map((a,b)=>({annotation:a,index:b})).sort((a,b)=>(b.annotation.position.y??0)-(a.annotation.position.y??0)||(a.annotation.position.x??0)-(b.annotation.position.x??0)||a.index-b.index).map(a=>a.annotation));let{reference:g,...h}=e;return{total:f.length,rootBinding:h,records:f.slice(c.offset,c.offset+c.limit).map(a=>({entityKind:"cad-entity",entityKey:a.id,payload:{...a,displayText:(0,ag.projectCadAnnotationText)(a.text,a.entityType)}}))}}(a,c.filePath,{rootInstanceId:c.rootInstanceId,frameId:c.frameId,entityId:c.entityId,query:c.query,textOnly:c.textOnly,order:c.order,offset:m,limit:n}):"geometry"===h&&void 0!==c.rootInstanceId?function(a,b,c){if(!Number.isSafeInteger(c.offset)||c.offset<0||!Number.isSafeInteger(c.limit)||c.limit<1||c.limit>24)throw Error("结构记录分页范围无效");let d=d3(a.loadCadScene(b),c.rootInstanceId),e=[],f=0;for(let a of(0,ag.iterateCadSceneGeometry)(d))if((!c.frameId||a.sheet===c.frameId)&&(!c.entityId||a.id===c.entityId)&&!c.query&&!(f++<c.offset)){if(e.length===c.limit)return{total:null,records:e};e.push({entityKind:"cad-geometry",entityKey:a.id,payload:a})}return{total:f,records:e}}(a,c.filePath,{rootInstanceId:c.rootInstanceId,frameId:c.frameId,entityId:c.entityId,query:c.query,offset:m,limit:n}):"geometry"===h?a.queryCadGeometryPage(c.filePath,{frameId:c.frameId,entityId:c.entityId,query:c.query,offset:m,limit:n,framePlacement:l}):a.queryMaterialEntityPage(c.filePath,{kind:"frames"===h?"cad-frame":"cad-entity",..."frames"!==h&&c.frameId?{frameId:c.frameId}:{},entityId:c.entityId,query:c.query,offset:m,limit:n,framePlacement:l,textOnly:c.textOnly,order:c.order}),p=o.records.map(a=>"frames"===h&&"catalog"===c.detail?{...a,payload:Object.fromEntries(["id","name","title","drawingNumber","layout"].filter(b=>Object.hasOwn(a.payload,b)).map(b=>[b,a.payload[b]]))}:a),q=m+p.length;return{projectSnapshotId:b.snapshotId,filePath:c.filePath,parsedIdentity:f.sha256,sceneVersion:g.version,kind:h,frameId:c.frameId??null,rootInstanceId:c.rootInstanceId??null,projection:"instances"===h?"catalog":c.detail??"full",selection:{placement:c.placement??"all",textOnly:c.textOnly??!1,order:c.order??"source"},sceneQuality:g.quality?{...g.quality,issues:void 0,issueCount:g.quality.issues?.length??0,issueReasons:[...new Set(g.quality.issues?.map(a=>a.reason)??[])],detailsComplete:!1}:null,units:g.units,records:p,..."frames"===h||"instances"===h?{directoryState:{scope:"indexed-cad-directory",complete:0===m&&null!==o.total&&q>=o.total&&!c.frameId&&!c.entityId&&!c.query,recordCount:o.total}}:{},...o.rootBinding?{rootBinding:o.rootBinding}:{},..."annotations"===h?{readingSourceIds:p.map(a=>({entityId:a.payload.id,sourceId:`cad-read:${(0,e.createHash)("sha256").update(JSON.stringify([c.filePath,f.sha256,c.rootInstanceId,a.payload.id,a.payload.source])).digest("hex")}`}))}:{},total:o.total,totalMeasured:null!==o.total,offset:m,nextOffset:null===o.total||q<o.total?q:null,complete:0===m&&null!==o.total&&q>=o.total,completeScope:i?"matching-literal-candidates":"geometry"===h?"matching-block-instance-projection":void 0!==c.rootInstanceId?"matching-root-instance-annotations":"matching-indexed-records",sourceInterpretationComplete:g.quality?.complete===!0,engineeringDecision:"not-evaluated",note:"标注text保留源字段,displayText是同一字段按DXF存储及显示规则确定性解码的文字;query定位displayText的字面子串,不是语义检索或多关键词并集。数字标注常没有属性名,零命中应取消筛选读取所选图框,不证明没有该参数。分页按实际nextOffset继续,不能按limit自行跳页。坐标、图框及尺寸尚未判定工程属性、部位和工况;范围与约数不能据此变成准确施工值。未返回或尚未支持的结构不代表图纸没有。"}})}function d6(a){try{let b=ae.join((0,ah.a2)(),"projects",(0,ag.computeProjectId)(ae.resolve(a.projectRoot)),"kb.db");if(!ac.existsSync(b))return;return new ag.IndexStateStore(b,{readonly:!0})}catch{return}}function d7(a,b){let c=(a.scopeRoots??[]).filter(Boolean);if(0===c.length)return!1;let d=dz((0,ah.NW)(a.projectRoot),b);return!!d.ok&&c.some(a=>dx(d.absolute,a))}function d8(a,b){if(0===(a.scopeRoots??[]).filter(Boolean).length)throw dE(`工具「${b}」被拒绝:本次运行未授予任何资料范围(fail-closed,见 4.6 域表)`)}let d9=new Set([".md",".markdown",".txt",".csv",".json",".tsv",".log"]),ea=new Set([".xlsx",".xls"]),eb={name:"read_raw",description:dP("读取已入库解析全文,按库内页码、字符区间或工作表定位;不访问或依赖原文件。","手上有疑点、需要回原文核对时(如正文引用的数值要确认原文怎么写、图纸说明里的参数在哪一页);检索结果看起来矛盾、或 `search_evidence` 给出的切片是派生内容而你要看原文上下文时。",'已经拿到的切片文本足够回答当前问题时(原文一次可能上万字符,是切片预算的数十倍);只是想知道"项目里有没有这个文件"(那是 `discover_files`);也不要拿它当通用读文件工具去读项目里与资料无关的文件——路径不在资料白名单内一律 PATH_DENIED。'),scope:"evidence-whitelist",inputSchema:dQ.object({path:dQ.str("资料文件路径(KB 相对路径或落在白名单根内的绝对路径)"),loc:dQ.obj("定位(可选;三者互斥,page 优先于 range)",{page:dQ.int("PDF 页码(依赖抽取器写下的「## PDF 第 N 页」标记)"),range:dQ.arr("抽取文本坐标系下的字符区间 [start, end)(**不是文件字节偏移**,见 S7.2 #1)",dQ.int("字符偏移")),sheet:dQ.str("XLSX 工作表名(仅 .xlsx/.xls 有效;缺省取第一个工作表)")})},["path"]),idempotent:!0,handler:function(a,b){let c,d,e,f=dM(a.path,b.scopeRoots,"read_raw 的 path"),g=ae.extname(f.absolute).toLowerCase(),h=a.loc??{},i="kb-chunks";if(void 0!==h.sheet&&ea.has(g)){let a=d6(b);try{let b=a?.getParsedDocument(f.relative),d=b?.document.structure.spreadsheet?.sheets.find(a=>a.name===h.sheet);if(!d)throw dG("库内工作表结构单元","现有切片仍可读取;不能因为原文件已删除而改为缺资料或直接读取磁盘");c=d.cells.map(a=>`${a.address}: ${a.display}${a.formula?` 公式=${a.formula}`:""}`).join("\n"),i="kb-sheet"}finally{a?.close()}}if(void 0===c&&"function"==typeof b.rawText){let a=b.rawText(f.relative);"string"==typeof a&&(c=a,i="runtime-rawText")}if(void 0===c){let a=d6(b);if(a)try{let b=a.getDocumentChunk(f.relative);b&&(c=b.content,i="kb-chunks")}finally{a.close()}}if(void 0===c)throw dG(`文件「${f.relative}」的抽取文本(KB 切片库里没有该路径的 document chunk,且它不是可直读的文本格式)`,"运行时注入 `ctx.rawText`(接 `IndexStateStore.getDocumentChunk`),或先让该文件过一遍抽取器落库");let j=c.length,k=c;if("number"==typeof h.page){let a=function(a,b){let c=RegExp(`^#{1,6}\\s*PDF\\s*第\\s*${b}\\s*页`,"mu").exec(a);if(!c)return{text:"",found:!1};let d=a.slice(c.index+c[0].length),e=/^#{1,6}\s*PDF\s*第\s*\d+\s*页/mu.exec(d);return{text:e?d.slice(0,e.index):d,found:!0}}(c,h.page);if(!a.found)throw dF(`在「${f.relative}」的抽取文本里找不到页码标记「## PDF 第 ${h.page} 页」(markdown 页标记通道)`);d=h.page,k=a.text}else if(Array.isArray(h.range)&&2===h.range.length){let[a,b]=h.range;if(!Number.isFinite(a)||!Number.isFinite(b)||a<0||b<=a)throw dD(`loc.range 必须是 [start, end] 且 0 <= start < end(当前 ${JSON.stringify(h.range)})`);if(e=[Math.trunc(a),Math.trunc(b)],!(k=c.slice(e[0],e[1])))throw dD(`loc.range ${JSON.stringify(e)} 落在文本长度 ${j} 之外`)}return{text:k,totalChars:j,channel:i,relativePath:f.relative,scopeRoot:f.root,...void 0===d?{}:{page:d},...void 0===e?{}:{range:e},...void 0===h.sheet?{}:{sheet:h.sheet}}}};async function ec(a,b){let d=dN(a.query,"query");d8(b,"search_evidence");let e=dO(a.opts?.limit,8,1,40),{getMultiProjectManager:f}=await Promise.resolve().then(c.bind(c,10295)),g=f(),h=b.projectModel&&Object.keys(b.projectModel.sources).filter(a=>d7(b,a)),i=(b.scopeRoots??[]).filter(a=>dx(a,(0,ah.NW)(b.projectRoot))).map(a=>ae.relative((0,ah.NW)(b.projectRoot),a).split(ae.sep).join("/")).filter(Boolean);if(h?!h.length:!i.length)throw dG("白名单内已登记的检索来源","没有可检索的来源身份,不代表资料没有所需事实;先核对解析与资料范围");let j=await g.search(b.projectRoot,d,{limit:3*e,scope:"project",filters:h?{filePaths:h}:{materialRoots:i},generationMode:!0}),k=Array.isArray(j?.failures)?j.failures:[],l=Array.isArray(j?.results)?j.results:[],m=[],n=0;for(let a of l){if(!d7(b,String(a.filePath??""))){n+=1;continue}let c="project"===a.scope&&void 0!==a.chunkIndex?b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===a.filePath&&b.sourceRef?.chunkIndex===a.chunkIndex):void 0;if(c&&!c.value.includes(a.content))throw dG("检索返回内容与本轮冻结原文不同,不能沿用旧sourceEvidenceId","保留本轮候选;核对解析资料版本,以新资料重开任务,不宣称资料缺失");if(m.push({filePath:a.filePath,score:a.score,...void 0===a.sectionTitle?{}:{sectionTitle:a.sectionTitle},...void 0===a.chunkIndex?{}:{chunkIndex:a.chunkIndex},..."project"===a.scope&&void 0!==a.chunkIndex&&b.projectModel?.sourceControls?.length?{sourceControls:b.projectModel.sourceControls.filter(b=>"verified-source-excerpt"!==b.roleId&&b.sourceFile===a.filePath&&b.sourceRef?.chunkIndex===a.chunkIndex).map(a=>({factId:a.factId,...(0,d$.mk)(b.projectModel,a.factId),value:a.value,sourceSpan:a.sourceRef.sourceSpan}))}:{},content:a.content,...c?{sourceEvidenceId:c.factId}:{},...b.projectModel?(0,d$.mk)(b.projectModel,void 0,c?.factId):{},...void 0===a.startChar?{}:{startChar:a.startChar},...void 0===a.endChar?{}:{endChar:a.endChar},scope:a.scope,...void 0===a.source?{}:{source:a.source}}),m.length>=e)break}if(k.length>0&&0===l.length)throw Error(`检索失败(不是"没有相关资料"):${k.map(a=>`${a.scope}/${a.kind}——${a.reason}`).join(";")}。请换关键词重试或改用其他取证工具;**不得据此写"资料未提供"**`);return{query:d,items:m,droppedOutOfScope:n,queryTimeMs:Number(j?.queryTimeMs??0),...k.length>0?{failedScopes:k.map(a=>`${a.scope}/${a.kind}:${a.reason}`)}:{}}}let ed={name:"search_evidence",description:dP("在本轮冻结项目资料白名单内检索完整证据;范围先过滤再排序,不搜索全局专业知识,不另调用模型重写查询。","需要为某个具体论点找资料依据、或要确认某个数值/规格/做法在资料里出现过时;写作前为本章做一次定向取证。",'每章无脑先调一次"拿一堆证据"(S1.3 点名的那种滥用:会引入与本章无关的证据并挤掉预算);也不是通用搜索——它只搜本项目资料,找文件用 `discover_files`,按命中的chunkIndex用 `read_source`精确读原文。同一 query 在同一轮里不要重复调(`idempotent`,重复结果只有噪声)。'),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("检索查询(自然语言或关键短语;建议带项目实体词而非泛词)"),opts:dQ.obj("检索选项",{limit:dQ.int("返回条数上限(默认 8;1–40)"),scope:dQ.enumStr("仅本轮项目资料;缺省同样为project",["project"])})},["query"]),idempotent:!0,handler:ec},ee={name:"read_source",description:dP("按已知冻结文件路径读取完整解析原文,可按chunkIndex精读或按真实nextOffset继续分页;检索未命中不阻止读取已知文件。","需要查看搜索命中的完整原文、对象或适用条件时。requestStatus=fulfilled表示请求证据已取得;fileCoverage只报告文件覆盖情况,不构成通读全文的写作义务。只读取当前具体问题所需原文。","只查看资料目录用discover_files;CAD图框与实例关系用query_cad_context。解析文本不等于已完成图像复核;路径不在本轮资料范围内时拒绝读取,不改路径绕过范围。"),scope:"evidence-whitelist",inputSchema:dQ.object({filePath:dQ.str("资料文件路径(KB 相对路径,须落在资料白名单内)"),opts:dQ.obj("读取选项",{maxChunks:dQ.int("返回切片数上限(默认 12;1–60)"),offset:dQ.int("切片序列偏移(默认0;非负整数),继续读取时使用上次nextOffset"),chunkIndex:dQ.int("精确切片编号;也可省略使用文件分页,与offset互斥,不将编号当数组偏移")})},["filePath"]),idempotent:!0,handler:function(a,b){let c=(0,ah.NW)(b.projectRoot),d=dM(ae.isAbsolute(a.filePath)?a.filePath:(()=>{let b=dz(c,a.filePath);if(!b.ok)throw dE("资料路径不能离开当前项目知识库");return b.absolute})(),b.scopeRoots,"read_source 的 filePath");if(!dx(d.absolute,c))throw dE("资料文件不在当前项目知识库内");let e={...d,relative:ae.relative(c,d.absolute).split(ae.sep).join("/")};if(b.projectModel&&!Object.hasOwn(b.projectModel.sources,e.relative))throw dE("该文件不属于本轮冻结来源;资料白名单不是采用新增未冻结来源的许可");let f=dO(a.opts?.maxChunks,12,1,60),g=a.opts?.offset??0;if(!Number.isSafeInteger(g)||g<0)throw dD("offset必须为非负整数");let h=a.opts?.chunkIndex;if(void 0!==h&&(!Number.isSafeInteger(h)||h<0||a.opts?.offset!==void 0))throw dD("chunkIndex必须为非负整数,且不能与offset同时使用");let i=(0,ah.Yy)(b.projectRoot).find(a=>a.relativePath===e.relative),j=d6(b);if(!j)throw dG(`项目 KB 切片库(kb.db)不存在,无法读取「${e.relative}」的切片`,"先让本项目过一遍索引(kbService 的索引链路);或确认 projectRoot 指向的是已索引的项目");try{let a=j.countChunks({relativePath:e.relative}),c=j.listChunks({relativePath:e.relative,limit:f,offset:g,chunkIndex:h});if(0===c.length&&0===a)throw dF(`「${e.relative}」在 KB 切片库里没有切片(可能尚未索引或索引失败)`);if(!c.length&&void 0!==h)throw dF(`未找到切片${h},不能把不存在的切片当成文件无内容`);for(let a of c){let c=b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex);if(c&&c.value!==a.content)throw dG("本轮冻结原文已与当前解析切片不同,不能把新内容挂到旧sourceEvidenceId","保留本轮候选;以更新后的资料重新冻结来源并重开任务,不把变更解释为资料缺失")}return{relativePath:e.relative,metadata:{format:i?.format??ae.extname(e.relative).slice(1).toLowerCase(),category:i?.category??"other",fileSize:i?.fileSize??0,mtime:i?.mtime??0,chunkCount:i?.chunkCount??a,status:i?.status??"unknown",...i?.indexedAt===void 0?{}:{indexedAt:i.indexedAt},...c[0]?.materialRoot===void 0?{}:{materialRoot:c[0].materialRoot}},chunks:c.map(a=>({chunkIndex:a.chunkIndex,...void 0===a.sectionTitle?{}:{sectionTitle:a.sectionTitle},content:a.content,sourceEvidenceId:b.projectModel?.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex)?.factId,...b.projectModel?(0,d$.mk)(b.projectModel,void 0,b.projectModel.sourceControls?.find(b=>"verified-source-excerpt"===b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex)?.factId):{},...void 0===a.startChar?{}:{startChar:a.startChar},...void 0===a.endChar?{}:{endChar:a.endChar},...a.metadataJson?{sourceSpans:JSON.parse(a.metadataJson).sourceSpans,parsedSnapshotId:JSON.parse(a.metadataJson).parsedSnapshotId,offsetSpace:JSON.parse(a.metadataJson).offsetSpace??"chunk-projection"}:{},...void 0===a.chunkKind?{}:{chunkKind:a.chunkKind},...b.projectModel?.sourceControls?.length?{sourceControls:b.projectModel.sourceControls.filter(b=>"verified-source-excerpt"!==b.roleId&&b.sourceFile===e.relative&&b.sourceRef?.chunkIndex===a.chunkIndex).map(a=>({factId:a.factId,...(0,d$.mk)(b.projectModel,a.factId),value:a.value,sourceSpan:a.sourceRef.sourceSpan}))}:{}})),totalChunks:a,readMode:void 0===h?"page":"chunk",offset:g,nextOffset:void 0===h&&g+c.length<a?g+c.length:null,requestStatus:"fulfilled",fileCoverage:{returnedChunks:c.length,totalChunks:a,coversWholeFile:0===g&&c.length>=a}}}finally{j.close()}}},ef={name:"discover_files",description:dP("列出本项目资料白名单内的文件清单(路径/分类/格式/大小/切片数/索引状态),可按 category 与路径关键词过滤。",'开工前先摸清"这次手上有什么资料"(定位阶段的第一步);或检索反复不命中时,先确认那份资料到底在不在、索引状态是不是 failed。',"已经知道文件路径时直接read_source;目录仅返回实际文件和元数据,不返回正文,也不证明某施工参数未提供。需要CAD关系时使用query_cad_context。"),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("路径关键词(子串匹配 relativePath;缺省不过滤)"),opts:dQ.obj("过滤选项",{category:dQ.str("资料分类(spreadsheet / image / cad / document / other)"),limit:dQ.int("返回条数上限(默认 40;1–200)")})}),idempotent:!0,handler:function(a,b){d8(b,"discover_files");let c=dO(a.opts?.limit,40,1,200),d=a.opts?.category?.trim(),e="string"==typeof a.query?a.query.trim().toLowerCase():"",f=(0,ah.Yy)(b.projectRoot,d?{category:d}:{}),g=0,h=[];for(let a of f){if(!d7(b,a.relativePath)){g+=1;continue}(!e||a.relativePath.toLowerCase().includes(e))&&h.push({relativePath:a.relativePath,category:a.category,format:a.format,fileSize:a.fileSize,chunkCount:a.chunkCount,status:a.status,matchedBy:a.matchedBy,...void 0===a.collectionName?{}:{collectionName:a.collectionName}})}let i=h.slice(0,c);return{items:i,total:h.length,returned:i.length,truncated:h.length>i.length,droppedOutOfScope:g}}},eg={name:"query_construction_plan",description:dP("只读主控冻结的同源工程计划,完整返回所选职责视图或真实活动及可引用数值序号。","缺资源、时间或接口信息时查询;组织视图无需数量,未测时间保持未知。","不重新扫描清单另算方案,不把拟定配置冒充已核项目事实。"),scope:"evidence-whitelist",idempotent:!0,inputSchema:dQ.object({view:dQ.enumStr("职责视图;省略时使用本任务职责",[...dZ.Zw]),activityIds:dQ.arr("明确选择活动;省略不隐式截取",dQ.str("实际活动目录身份"))},[]),handler:(a,b)=>{if(!b.constructionPlan)throw dG("共享工程计划","须绑定本轮当前合同、快照与实际作者任务");return b.constructionPlan.query(a)}},eh={name:"query_project_facts",description:dP("在本轮冻结项目模型中按属性和对象查询事实,返回版本、源切片和解析身份。","写作前确认对象的事实、牌号、直径或资料口径时;对象不明确、值冲突、取证未完成分别返回状态。","未判定不能解释为资料不存在;方案推导仍需查询已登记决定,不能把计划安排当源资料事实。"),scope:"evidence-whitelist",inputSchema:dQ.object({attribute:dQ.str("明确属性名称或字段ID"),objectName:dQ.str("原资料明确的工程对象,可省略项目级字段"),valueDomain:dQ.str("可选属性值域,例如rebar-grade或diameter")},["attribute"]),idempotent:!0,handler:(a,b)=>{if(!b.projectModel)throw dG("冻结项目模型","运行时必须将写作前冻结的ProjectModel注入本任务");let c=dN(a.attribute,"attribute");if(a.valueDomain&&!d0.XT.includes(a.valueDomain))throw dD("valueDomain不在登记的属性域内");return(0,dY.j)(b.projectModel,{attribute:c,objectName:a.objectName,valueDomain:a.valueDomain})}},ei={name:"query_cad_context",description:dP("只读本轮冻结图纸的实际图框、标注、几何及块变换来源,按完整记录分页。","先查询frames取得真实frameId;没有图框时annotations可用非空实际字面query定位候选,再用返回rootBindings的rootInstanceId读同根annotations或geometry,也可从instances真实目录定位。零query不返回全图,字面子串不当多关键词语义。数字标注常只有数值。","图框或坐标不等于工程属性已确认;解析不完整与旧解析身份显性报错,不猜部位或选择范围端点。"),scope:"evidence-whitelist",idempotent:!0,inputSchema:dQ.object({filePath:dQ.str("白名单内已冻结图纸相对路径"),kind:dQ.enumStr("查询类别,默认frames;instances读取真实根目录",["frames","annotations","geometry","instances"]),frameId:dQ.str("实际查询返回的图框身份"),entityId:dQ.str("实际结构记录身份"),query:dQ.str("单条记录的字面子串,不是语义检索或多个关键词;可省略以读取所选图框的全部标注"),rootInstanceId:dQ.str("instances目录实际返回的根身份,用于annotations或geometry;源handle/ordinal不代表工程部位,readingSourceIds只读身份不代表合格事实"),placement:dQ.enumStr("按实际块路径区分图框实例文字和绘图空间标注;不删原文,不证明某类来源没有工程内容",["all","drawing-space","frame-instance"]),textOnly:dQ.bool("只看有实际文字的标注;空尺寸实体可按entityId另读"),order:dQ.enumStr("按原实体顺序或实际坐标位置阅读",["source","position"]),detail:dQ.enumStr("frames可用catalog;instances只读catalog目录,实际几何用geometry full",["full","catalog"]),offset:dQ.int("分页偏移,按nextOffset继续"),limit:dQ.int("单页完整记录,默认8,最多24")},["filePath"]),handler:(a,b)=>{d8(b,"query_cad_context");let c=dN(a.filePath,"filePath");if(!d7(b,c))throw dE("图纸不在本任务资料白名单内");if(!b.projectModel)throw dG("冻结项目模型","主智能体必须在写作前固定图纸解析身份");let d=ae.join((0,ah.a2)(),"projects",(0,ag.computeProjectId)(ae.resolve(b.projectRoot)),"kb.db");if(!ac.existsSync(d))throw dG("图纸解析索引","先完整解析选定图纸并冻结输入");let e=b.projectModel;try{return(0,ah.VD)(b.projectRoot,b=>d5(b,e,{...a,filePath:c}))}catch(a){if(a instanceof d4)throw dD(a.message);throw a}}},ej={name:"query_work_packages",description:dP("查询本轮冻结清单的工程对象目录,或按memberIds/workPackageIds完整读取具体成员。","未指定ID时返回全部匹配工作包目录(无分页),供确定工程对象。指定ID时一次返回全部匹配原始记录,包括真实数量单位、特征和来源身份。只选本任务尚缺属性所在的对象,不遍历全项目清单。","资源计划先使用主控已给出的各阶段班组、设备和供料安排;原始清单不能替代施工部署或生产计划。目录不是工程量采用许可,清单归属不表示正文已覆盖。不同单位不得相加,原文出处使用sourceIndex;零命中不表示全资料无此工程。"),scope:"evidence-whitelist",inputSchema:dQ.object({query:dQ.str("具体工程、分部或项目名称;按稳定ID读取时填*"),memberIds:dQ.arr("精确读取本任务尚缺属性的成员,全部指定成员一次返回",dQ.str("冻结目录中的完整成员ID")),workPackageIds:dQ.arr("精确读取所需工程对象工作包,全部成员一次返回",dQ.str("查询目录中的完整workPackageId"))},["query"]),idempotent:!0,handler:(a,b)=>{if(!b.projectModel?.workPackages)throw dG("冻结清单工作包库","主智能体须在写作开始前准备并冻结清单归属,不能解释为资料没有清单");d8(b,"query_work_packages");let c=dN(a.query,"query"),d={allowedFilePaths:Object.keys(b.projectModel.sources).filter(a=>d7(b,a))};return void 0!==a.memberIds||void 0!==a.workPackageIds?(0,d_.H)(b.projectModel,{query:c,memberIds:a.memberIds,workPackageIds:a.workPackageIds},d):(0,d_.F)(b.projectModel,c,d)}},ek={name:"query_source_units",scope:"evidence-whitelist",idempotent:!0,description:dP("读取已入库工作表的实际行及单元格、DOCX段落表格或PDF页,保留对象上下文、公式及稳定单元身份;不依赖原文件存在","已知文件需要解释对象、条件或单元格位置时;按nextOffset分页,不把零命中当资料没有","图纸几何用query_cad_context;不把结构单元自动当作已批准工程事实"),inputSchema:dQ.object({filePath:dQ.str("当前冻结知识库文件身份"),kind:dQ.enumStr("库内结构",["sheet-rows","docx-blocks","pdf-pages"]),query:dQ.str("具体原文或对象,可省略"),unitId:dQ.str("实际返回的单元ID,可省略"),offset:dQ.int("按nextOffset继续"),limit:dQ.int("单页完整记录,默认8,最多24")},["filePath","kind"]),handler:(a,b)=>{d8(b,"query_source_units");let c=dN(a.filePath,"filePath");if(!d7(b,c))throw dE("库内文件不在当前资料范围");if(!b.projectModel?.sources[c])throw dG("冻结库内文件身份","主控须固定本任务已入库资料");return(0,ah.VD)(b.projectRoot,d=>{if(d.parsedFileFingerprint(c).sha256!==b.projectModel.sources[c].sha256)throw dG("当前冻结解析身份","解析版本已改变,不能跨版本拼接");return d.queryParsedUnits(c,{kind:a.kind,query:a.query,unitId:a.unitId,offset:dO(a.offset,0,0,Number.MAX_SAFE_INTEGER),limit:dO(a.limit,8,1,24)})})}};async function el(a,b){let c=dN(a.attribute,"attribute"),d=b.authoritative;if(!d)throw dG("权威值选取的输入(facts / labeledValues / overrides)","运行时把 `buildAuthoritativeValues` 的入参挂到 `ctx.authoritative`(来源:事实池 + 原文口径标签 + 答疑覆盖)");let e=(0,d1.iC)(d),f=(0,d1.hf)(c),g=e.resolved.find(a=>a.attribute===c)??e.resolved.find(a=>(0,d1.hf)(a.attribute)===f)??e.resolved.find(a=>a.attribute.includes(c)||c.includes(a.attribute));return g?{attribute:g.attribute,value:g.value,rule:g.rule,evidence:g.evidence.map(a=>({source:a.source,snippet:a.snippet})),superseded:[...g.superseded],candidates:g.candidates.slice(0,12).map(a=>({subject:a.subject,value:a.value,source:a.source,priority:a.priority})),caliber:g.caliber}:{attribute:c,value:null,rule:null,evidence:[],superseded:[],candidates:[],caliber:!1}}let em={name:"lookup_authoritative",description:dP("按属性名查**现行权威值**及其裁决规则(R1..R7)、依据出处、被取代的历史值与全部候选(`buildAuthoritativeValues` 的 `ResolvedValue` 子集)。",'正文里要写某个数值/口径、需要先确认"以哪份资料为准"时(权威阶梯:clarification > 招标条款 > 评价规则 > 清单 > 图纸注记);或一个属性在资料里出现了多个值时,用它的 `superseded` / `candidates` 判断哪个是现行口径。','想检索资料原文(那是 `search_evidence`/`read_raw`);拿它当"事实查询"用来问与权威口径无关的内容(它只登记**口径型属性**,未命中会返回 `value: null`,那不是"资料里没有"而是"没有权威口径")。归**计划**阶段(S1.3)。'),scope:"evidence-whitelist",inputSchema:dQ.object({attribute:dQ.str("属性名(如「计划工期」「最高投标限价」「垫层做法」)")},["attribute"]),idempotent:!0,handler:el},en=new Set([".png",".jpg",".jpeg",".gif",".bmp",".webp",".tif",".tiff"]);async function eo(a,b){let c=dM(a.path,b.scopeRoots,"inspect_asset 的库内身份"),d=d6(b);if(!d)throw dG("知识库索引","先完成入库,不直接读取外部原文件");try{var e;let a=d.getRecord(c.relative);if(!a)throw dF(`库内文件记录未找到:${c.relative}`);let f=JSON.parse(a.metadataJson??"{}"),g=f.extraction??f,h=Number(g.imageWidth),i=Number(g.imageHeight);return{relativePath:c.relative,absolutePath:c.absolute,kind:(e=ae.extname(c.relative).toLowerCase(),".pdf"===e?"pdf":".docx"===e||".doc"===e?"docx":ea.has(e)?"xlsx":".dwg"===e||".dxf"===e?"dwg":en.has(e)?"image":d9.has(e)?"text":"other"),sizeBytes:a.fileSize,extractable:"active"===a.status,textExtracted:d.countChunks({relativePath:c.relative})>0,ocrAvailable:!0===b.ocrAvailable,...h>0&&i>0?{dimensions:{width:h,height:i}}:{},notes:["依据持久化库内记录;文件字段是逻辑身份,不要求磁盘原文件继续存在。图形及对象含义须读取对应结构单元。"]}}finally{d.close()}}async function ep(a,b){let c=dN(a.reason,"reason");if(!Array.isArray(a.roots)||0===a.roots.length)throw dD("roots 必须是非空数组");let d=[],e=[];for(let c of a.roots){let a=String(c??"").trim();if(!a){d.push({root:String(c),reason:"空路径"});continue}if(!ae.isAbsolute(a)){d.push({root:a,reason:"资料范围只能按绝对路径授予(相对路径的基准会随 cwd 漂移)"});continue}let f=function(a){let b=ae.resolve(a),c=bw.homedir();if(["/",c,ae.join(c,".customize-agent"),ae.join(c,".ssh"),ae.join(c,".aws")].includes(b))return"该根属于 4.6 域表中的禁止面(项目文件/系统/家目录)";let d=[ae.join(c,".customize-agent"),ae.join(c,".ssh"),ae.join(c,".aws"),ae.join(c,".config"),"/etc","/usr","/bin","/sbin","/var","/System","/Library",ae.join("C:","Windows")].find(a=>b===a||b.startsWith(`${a}${ae.sep}`));return d?`该根落在禁止面「${d}」之内(4.6:项目文件/系统/家目录一律禁止,含存放 API Key 的配置目录)`:void 0}(a);if(f){d.push({root:a,reason:f});continue}if(b.scopeRoots.some(b=>ae.resolve(b)===ae.resolve(a))){d.push({root:a,reason:"该根已在当前资料范围内,无需扩范围"});continue}e.push(ae.resolve(a))}if(0===e.length)throw dD(`没有任何可提交的扩范围请求。逐根拒绝原因:${d.map(a=>`${a.root} → ${a.reason}`).join(";")}`);return{requestId:`expand-scope-${Date.now().toString(36)}-${Math.abs(function(a){let b=0;for(let c=0;c<a.length;c+=1)b=31*b+a.charCodeAt(c)|0;return b}(e.join("|"))).toString(36)}`,tool:"expand_scope",status:"pending",reason:c,requestedRoots:e,currentRoots:[...b.scopeRoots],risk:"资料范围是 4.6 的冻结域:扩大可达面会让后续取证读到此前不可见的数据,必须人工确认",rejected:d}}let eq=[eb,ed,ee,ef,em,eh,eg,ej,ei,ek,{name:"inspect_asset",description:dP("探测一个资料文件的可读性:类型、体积、是否可抽取、KB 里是否已有抽取文本、图像像素尺寸、OCR 是否可用。",'**在决定怎么读它之前**先探一次(PDF 要页码、图要替代表、表格要工作表名,三种读法完全不同);或 `read_raw` 失败后先用它判断是"文件不在"、"没索引"还是"格式一期不支持"。',"已经知道类型且要内容时(直接 `read_raw`/`read_source`);也不要拿它批量扫全库——清单类的批量信息用 `discover_files`(一次返回全部元数据)。"),scope:"evidence-whitelist",inputSchema:dQ.object({path:dQ.str("资料文件路径(须落在资料白名单内)")},["path"]),idempotent:!0,handler:eo},{name:"expand_scope",description:dP("提交一份**扩大资料范围**的审批请求(不自行生效:只生成 pending 的 ApprovalRequest,含逐根拒绝原因)。",'确信资料就在白名单之外、且不读它就写不下去时(例如招标正文没被纳入资料范围,而某条要求必须核对原文);先把 `reason` 写清"缺了它会导致什么后果",人工据此裁决。','常规取证(白名单内还有很多没看时,先把范围用尽);把"授权"当成能自己给自己开的门——本工具**永不返回已获批**,且会直接拒绝 4.6 的禁止面(家目录/系统/含 API Key 的配置目录);也不要为了绕过某次 PATH_DENIED 而调它(那次拒绝是判据在工作,不是范围不够)。⚠需审批。'),scope:"evidence-whitelist",inputSchema:dQ.object({reason:dQ.str("扩范围的理由与后果(人工裁决的依据,不得写空话)"),roots:dQ.arr("申请纳入资料范围的**绝对路径**根(逐个校验;禁止面内的会被直接拒绝)",dQ.str("绝对路径"))},["reason","roots"]),idempotent:!1,requiresApproval:!0,handler:ep}],er=["schedule","assemblyRate","supportSystem","laborPeak","greeningMaintenance","blueprint","canonicalFacts"].map(a=>({id:a})),es=[{id:"spec-gate-rules",scope:"full-document",category:"structure",manualReview:!0},{id:"figure-substitute-table",scope:"full-document",category:"structure",manualReview:!0},{id:"project-contamination",scope:"full-document",category:"scope"},{id:"formal-text-gate",scope:"full-document",category:"format"},{id:"gating-checklist",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"toc-consistency",scope:"full-document",category:"structure",deterministicSafe:!0},{id:"hazard-grade-consistency",scope:"chapter",category:"fact_consistency",manualReview:!0},{id:"structure-integrity",scope:"full-document",category:"structure",deterministicSafe:!0},{id:"conclusion-table-conflict",scope:"full-document",category:"fact_consistency"},{id:"paragraph-near-duplicate",scope:"full-document",category:"style",manualReview:!0},{id:"overview-recap",scope:"full-document",category:"style"},{id:"internal-terminology-anchor",scope:"full-document",category:"style",deterministicSafe:!0},{id:"planning-leak",scope:"full-document",category:"format",deterministicSafe:!0},{id:"basis-regulations-coverage",scope:"full-document",category:"fact_consistency",authorities:["blueprint"]},{id:"construction-org-control-loop",scope:"chapter",category:"control_loop",manualReview:!0},{id:"construction-org-professional-chain",scope:"chapter",category:"professional_chain",manualReview:!0},{id:"planned-section-placement",scope:"chapter",category:"structure"},{id:"hollow-table-cell",scope:"full-document",category:"table",manualReview:!0},{id:"schedule-duration-overrun",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"stage-schedule-consistency",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"caliber-consistency",scope:"full-document",category:"fact_consistency"},{id:"hazard-parameter-binding",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"blueprint-value-placement",scope:"full-document",category:"professional_chain",manualReview:!0},{id:"dangling-conjunction",scope:"full-document",category:"structure",manualReview:!0},{id:"precise-fact-usage",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"parameter-obligation-usage",scope:"full-document",category:"fact_consistency",manualReview:!0},{id:"boq-placement",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"drawing-reference",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"drawing-pointer-phrase",scope:"full-document",category:"evidence_coverage",manualReview:!0},{id:"table-title-without-table",scope:"full-document",category:"format"},{id:"truncated-sentence",scope:"full-document",category:"format",deterministicSafe:!0},{id:"block-structure-contract",scope:"chapter",category:"structure"}],et=[{name:"explain_defect",description:dP("查一条检测器的元数据:作用域、类别、人工复核标记及依赖的权威口径;实际执行与未测状态由完整合同评审回执确认。","需要核对一条真实问题的类别、权威依赖和人工复核方式时;或需要确认该项是否登记人工复核(manualReview),而非推断存在自动修复轮。","想知道当前文档**有哪些缺陷**(那是 `list_defects`,元动作类);也不要把它当检测器执行入口——它只返回声明,不跑判据。"),scope:"readonly",inputSchema:dQ.object({detectorId:dQ.str("检测器 id(注册表内已登记)")},["detectorId"]),idempotent:!0,handler:function(a){let b=String(a.detectorId??"").trim();if(!b)throw dD("detectorId 不能为空");let c=es.find(a=>a.id===b);if(!c)throw dF(`检测器「${b}」未登记在注册表`);let d=[...c.authorities??[]],e=new Set(er.map(a=>a.id));return{detectorId:c.id,scope:c.scope,category:c.category,manualReview:!0===c.manualReview,authority:d,authorityUnregistered:d.filter(a=>!e.has(a)),deterministicSafe:!0===c.deterministicSafe}}}];var eu=c(85354);let ev={sqrt:Math.sqrt,abs:Math.abs,round:Math.round,floor:Math.floor,ceil:Math.ceil,min:Math.min,max:Math.max,pow:Math.pow,log:Math.log,log10:Math.log10,exp:Math.exp,sin:Math.sin,cos:Math.cos,tan:Math.tan,hypot:Math.hypot};class ew{constructor(a){this.source=a,this.index=0,this.depth=0}parse(){let a=this.parseExpression();if(this.skipSpaces(),this.index<this.source.length)throw dD(`表达式在第 ${this.index+1} 个字符处无法解析:「${this.source.slice(this.index,this.index+16)}」`);return a}skipSpaces(){for(;this.index<this.source.length&&/\s/u.test(this.source[this.index]);)this.index+=1}peek(){return this.skipSpaces(),this.source[this.index]??""}parseExpression(){this.enter();let a=this.parseTerm();for(;;){let b=this.peek();if("+"!==b&&"-"!==b)break;this.index+=1;let c=this.parseTerm();a="+"===b?a+c:a-c}return this.exit(),a}parseTerm(){let a=this.parseUnary();for(;;){let b=this.peek();if("*"!==b&&"/"!==b&&"%"!==b)break;this.index+=1;let c=this.parseUnary();if(("/"===b||"%"===b)&&0===c)throw dD("表达式里出现除以 0");a="*"===b?a*c:"/"===b?a/c:a%c}return a}parseUnary(){let a=this.peek();return"-"===a?(this.index+=1,-this.parseUnary()):"+"===a?(this.index+=1,this.parseUnary()):this.parsePower()}parsePower(){let a=this.parsePrimary();return"*"!==this.peek()||"*"!==this.source[this.index+1]?a:(this.index+=2,Math.pow(a,this.parseUnary()))}parsePrimary(){this.skipSpaces();let a=this.source[this.index]??"";if("("===a){this.index+=1;let a=this.parseExpression();if(this.skipSpaces(),")"!==this.source[this.index])throw dD("括号不配对(缺少右括号)");return this.index+=1,a}if(/[0-9.]/u.test(a))return this.parseNumber();if(/[A-Za-z_]/u.test(a))return this.parseCall();throw dD(`表达式在第 ${this.index+1} 个字符处出现非法字符「${a}」`)}parseNumber(){let a=this.index;for(;this.index<this.source.length&&/[0-9._eE]/u.test(this.source[this.index]);)this.index+=1;let b=this.source.slice(a,this.index).replace(/_/gu,""),c=Number(b);if(!Number.isFinite(c))throw dD(`无法识别的数值字面量「${b}」`);return c}parseCall(){let a=this.index;for(;this.index<this.source.length&&/[A-Za-z_0-9]/u.test(this.source[this.index]);)this.index+=1;let b=this.source.slice(a,this.index),c=ev[b];if(!c)throw dD(`不支持的函数「${b}」(可用:${Object.keys(ev).join("、")})`);if(this.skipSpaces(),"("!==this.source[this.index])throw dD(`函数「${b}」后面必须是参数括号`);this.index+=1;let d=[];if(this.skipSpaces(),")"!==this.source[this.index])for(;;){if(d.push(this.parseExpression()),","===this.peek()){this.index+=1;continue}break}if(this.skipSpaces(),")"!==this.source[this.index])throw dD(`函数「${b}」的参数括号不配对`);return this.index+=1,c(...d)}enter(){if(this.depth+=1,this.depth>32)throw dD(`表达式嵌套超过 32 层`)}exit(){this.depth-=1}}function ex(a){return`'${a.replace(/'/gu,"'\\''")}'`}async function ey(a,b){let c="string"==typeof a.expr?a.expr.trim():"",e="string"==typeof a.script?a.script:"";if(c&&e)throw dD("expr 与 script 互斥,只能给一个");if(!c&&!e)throw dD("必须给 expr(纯算术)或 script(受限沙箱脚本)之一");if(c)return{result:function(a){var b;let c=(b=dN(a,"expr"),(0,d.Hr)(b).replace(/[×✕✖]/gu,"*").replace(/[÷]/gu,"/").replace(/[()]/gu,a=>"("===a?"(":")"));if(c.length>2e3)throw dD(`表达式过长(>2000 字符)`);let e=new ew(c).parse();if(!Number.isFinite(e))throw dD("计算结果不是有限数(溢出或未定义)——请检查量级与运算符");return Number(e.toPrecision(12))}(c),stdout:"",mode:"expr",executed:c};let f="py"===a.lang?"py":"js",g=b.sandbox;if(!g)throw dG("受限沙箱执行能力(`ctx.sandbox.execute`)","运行时注入:接 `packages/tools/src/sandbox/sandbox-executor.ts` 的 `SandboxExecutor`(docker/bwrap/sandbox-exec/VFS-Guard)");let h="py"===f?`python3 -c ${ex(e)}`:`node -e ${ex(e)}`,i=await g.execute(h,{timeoutMs:1e4,lang:f});if(0!==i.code)throw dD(`沙箱脚本退出码 ${i.code}:${(i.stderr||i.stdout||"").slice(0,800)}`);let j=String(i.stdout??""),k=Number(j.trim().split("\n").pop());return{result:Number.isFinite(k)?k:null,stdout:j.slice(0,4e3),mode:"sandbox-script",executed:`[${f} script, ${e.length} chars]`,exitCode:i.code}}let ez={name:"compute",description:dP("算数:`expr` 走**纯算术求值器**(+ - * / % ** 与 sqrt/abs/round/min/max/pow/log/hypot 等白名单函数,不 eval);`script` 走**受限沙箱**。","合计对不上要复核、要把清单里的分项加一遍、要做量级估算或百分比换算时;正文里即将落一个推导出来的数值,落笔前先算一遍。",'**不要用它"算出一个看起来合理的值"来填空**——算出来的数不等于资料里的数,无源的数值仍然要 `declare_missing`;也不要拿它当通用代码执行器(`expr` 只认算术与白名单函数;`script` 没有沙箱能力时直接失败,不会退回进程内执行)。'),scope:"sandbox",inputSchema:dQ.object({expr:dQ.str("纯算术表达式(支持全角字符、括号、幂、白名单函数;与 script 互斥)"),script:dQ.str("受限沙箱脚本(与 expr 互斥;需运行时接入沙箱能力)"),lang:dQ.enumStr("脚本语言(仅 script 模式有效,缺省 js)",["js","py"])}),idempotent:!0,handler:ey},eA={长度:{m:1,km:1e3,cm:.01,mm:.001},面积:{m2:1,hm2:1e4},体积:{m3:1,l:.001,ml:1e-6},质量:{kg:1,g:.001,t:1e3},力:{kn:1,n:.001},压强:{mpa:1,kpa:.001,pa:1e-6},功率:{kw:1,mw:1e3,w:.001},电压:{kv:1,v:.001},电流:{a:1,ma:.001},频率:{hz:1},时间:{h:1,min:1/60},比率:{"%":1,permille:.1}};function eB(a){let b=(0,d.Hr)(String(a??"")).trim();return(0,eu.Sn)(b||String(a??"").trim())}let eC={name:"convert_units",description:dP("单位换算:判定两单位是否同量纲(`unitAliases.unitsAreEquivalent`),同量纲则按固定倍率换算,否则返回 null 并说明。","正文/表格里的单位与资料不一致、需要核对是否等价或换算成同一单位再比较时;或要确认两个写法(「米」/「延长米」/「m」、「㎡」/「m2」)是不是同一单位。",'拿它做无关换算(座→个、套→台这类**计数单位**永远返回 null,见 `unitAliases` 的"不做量纲互换"口径);也不要拿换算结果去替换正文里的数值——换算会引入原文没有的值,那是改写而不是核对。'),scope:"sandbox",inputSchema:dQ.object({value:dQ.num("待换算的数值"),from:dQ.str("原单位(支持中文写法与符号形:米/m、㎡/m2、千牛/kN…)"),to:dQ.str("目标单位")},["value","from","to"]),idempotent:!0,handler:function(a){let b="number"==typeof a.value?a.value:Number(a.value);if(!Number.isFinite(b))throw dD("value 必须是有限数");let c=dN(a.from,"from"),d=dN(a.to,"to"),e=eB(c),f=eB(d);if(!(0,eu.Q0)(c,d))return{value:null,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!1,reason:"两单位不同量纲(`unitsAreEquivalent` 判否)——计数单位之间尤其不可互认(座 ≠ 组 ≠ 个)"};if(e===f)return{value:b,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0};for(let[a,g]of Object.entries(eA)){let h=g[e],i=g[f];if(void 0!==h&&void 0!==i)return{value:Number((b*h/i).toPrecision(12)),from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0,reason:`同量纲(${a})倍率换算`}}return{value:null,from:c,to:d,canonicalFrom:e,canonicalTo:f,equivalent:!0,reason:`两单位判为同量纲,但本工具的倍率表没有覆盖「${e} → ${f}」这一对——不猜倍率,宁可不给结果`}}},eD=/^(?:合\s*计|小\s*计|总\s*计|共\s*计|合\s*价)$/u;function eE(a){let b=String(a??"").replace(/\s+/gu,"").replace(/[,,]/gu,"");if(!b)return;let c=/^[-+]?\d+(?:\.\d+)?/u.exec(b.replace(/^[¥¥$]/u,""));if(!c)return;let d=Number(c[0]);return Number.isFinite(d)?d:void 0}let eF=[ez,eC,{name:"verify_table_arithmetic",description:dP("核验文档里的表内算术:既有判据(`tableArithmeticInconsistencyIssues` + `areaArithmeticIssues`)+ 显式「合计/小计」行列的确定性求和兜底。","表格里出现合计/小计时(分项和与合计不等是**阻断级**缺陷,改一个数字还是改合计需要先看清差异);或 `check` 报了表内算术类 issue、要定位到具体行列时。",'把 `defects` 为空读成"表内算术一定对"——兜底只覆盖显式合计形态,未覆盖的关系不在结论内(返回值 `note` 已写明);也不要拿它去改数字:先算出差异、再判断是分项错还是合计错,改动走 `patch_section` 且必须有资料依据。'),scope:"sandbox",inputSchema:dQ.object({markdown:dQ.str("含表格的 Markdown 文本(单章或全文)")},["markdown"]),idempotent:!0,handler:function(a){let b=dN(a.markdown,"markdown"),c=[...cL(b),...function(a){let b=[];for(let c of a.matchAll(cr)){let a=Number(c[2].replace(/[,,]/gu,"")),d=Number(c[3].replace(/[,,]/gu,"")),e=Number(c[4].replace(/[,,]/gu,""));if(![a,d,e].every(Number.isFinite))continue;let f=a+d;f!==e&&b.push({level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`面积算术矛盾:地上 ${a}㎡ + 地下 ${d}㎡ = ${f}㎡,与同句“单体建筑面积 ${e}㎡”不符(差 ${Math.abs(f-e).toFixed(2)}㎡)`,suggestion:`地上与地下面积之和必须等于单体建筑面积:按绑定资料统一三者数值,删除错误数值表述。`})}return b}(b)],d=function(a){let b=[],c=a.split(/\r?\n/u),d=-1,e=[],f=0,g=0,h=()=>{if(e.length<3){e=[];return}let[a,...c]=e,h=a.cells.length,i=c[c.length-1];if(eD.test(i.cells[0]??"")){f+=1;for(let a=1;a<h;a+=1){let e=eE(i.cells[a]??"");if(void 0===e)continue;let f=0,g=0;for(let b of c.slice(0,-1)){let c=eE(b.cells[a]??"");void 0!==c&&(f+=c,g+=1)}0!==g&&Math.abs(f-e)>Math.max(1e-6,1e-6*Math.abs(f))&&b.push({tableIndex:d,location:`第 ${i.line} 行「${i.cells[0]}」\xb7 第 ${a+1} 列`,expected:Number(f.toPrecision(12)),found:e,detail:`该列 ${g} 个数值分项之和为 ${Number(f.toPrecision(12))},但合计行写的是 ${e}`,source:"fallback"})}}let j=a.cells.findIndex(a=>eD.test(a));if(j>0)for(let a of(g+=1,c)){let c=eE(a.cells[j]??"");if(void 0===c)continue;let e=0,f=0;for(let b=0;b<h;b+=1){if(b===j)continue;let c=eE(a.cells[b]??"");void 0!==c&&(e+=c,f+=1)}!(f<2)&&Math.abs(e-c)>Math.max(1e-6,1e-6*Math.abs(e))&&b.push({tableIndex:d,location:`第 ${a.line} 行「合计」列`,expected:Number(e.toPrecision(12)),found:c,detail:`该行 ${f} 个数值分项之和为 ${Number(e.toPrecision(12))},但合计列写的是 ${c}`,source:"fallback"})}e=[]};return c.forEach((a,b)=>{if(/^\s*\|.*\|\s*$/u.test(a)){0===e.length&&(d+=1);let c=a.replace(/^\s*\|/u,"").replace(/\|\s*$/u,"").split("|").map(a=>a.trim());c.every(a=>/^:?-{2,}:?$/u.test(a)||""===a)||e.push({cells:c,line:b+1});return}h()}),h(),{defects:b,sumRows:f,sumColumns:g,tables:Math.max(0,d+1)}}(b);return{defects:[...c.map((a,b)=>({tableIndex:-1,location:a.sectionTitle??a.chapterId??`检测器命中 #${b+1}`,expected:NaN,found:NaN,detail:a.message,source:"detector"})),...d.defects],checked:{tables:d.tables,sumRows:d.sumRows,sumColumns:d.sumColumns,detectorIssues:c.length},note:"detector 条目来自既有判据(表内算术自洽 + 面积三元组),是权威;fallback 条目只覆盖显式「合计/小计」形态,未覆盖的表格关系(百分比/加权/取整)不在此工具结论内——**没有 fallback 命中不等于表内算术一定自洽**。"}}}],eG=["知识库","系统暂未","项目资料暂未","资料未明确","暂未明确","待确认","待资料复核","待系统","未检索到","资料不足","无法确认","建议补充","不适用","COL","可核验信息","工作包",...a1.Kd],eH=/\|.+\|/u,eI=/^\s*\|?\s*:?-{3,}:?\s*(?:\|\s*:?-{3,}:?\s*)+\|?\s*$/u,eJ=/\r?\n/u,eK=[/见(?:资料|文件|说明|方案|附件|相关文件)/u,/按(?:资料|文件|说明)/u,/满足(?:相关|有关)?要求/u,/依据本项目已确认资料/u],eL=/^(?:—+|-+|-|\/|N\/A|n\/a|待定|待补充|待确认|待查|待补|若干|暂无|无数据|无)$/u,eM=/^约\d/u,eN=[{open:"(",close:")",label:"全角括号"},{open:"《",close:"》",label:"书名号"}],eO=[...eG.filter(a=>!a1.Kd.includes(a)),.../工作包|事实卡|事实主表|后台数据库|落位|峰值口径|控制口径|数据口径/gu.source.split("|")],eP=["WRITER_MISSING_SECTION","Writer 未完成"],eQ=[/:\s*:/u,/;:/u,/。:/u,/。;/u,/;。/u,/。,/u,/,。/u,/。{2,}/u,/、{2,}/u],eR=a=>dQ.str(a,{minLength:1}),eS=dQ.arr("实际承担的本任务职责序号,从0开始",dQ.int("职责序号"),{minItems:1}),eT={id:dQ.int("三类载体共用唯一正整数,按正文实际顺序由小到大编号;此ID同时声明正文次序"),criterionIndices:eS,heading:eR("必要的内部小标题,没有时省略")},eU=dQ.arr("按原文顺序拼接:普通片段填text与实际出处;引用另一真实小节的片段只填sectionIndex,由服务端恢复当前合同标签",dQ.obj("正文或真实小节引用片段",{text:eR("实际交付原文,一段或一格可按不同断言分片;各片段首尾保留必要空格和标点"),sectionIndex:dQ.int("当前冻结合同小节表中明确选定的目标序号;本片段不能另填text或出处"),...{factIndices:dQ.arr("本片段每一处实际陈述的冻结属性序号;重复值也逐处登记,不替另一属性背书",dQ.int("已提供的factIndex")),sourceIndices:dQ.arr("本片段每一处引用的完整原文序号,重复断言仍须选择;独立核验其对象条件与含义",dQ.int("已提供的sourceIndex")),productionNumberIndices:dQ.arr("当前同合同施工生产计划的实际数值索引,保留拟定或推导用途,不作为项目事实或已核工程控制",dQ.int("当前视图或query_construction_plan提供的productionNumberIndex")),projectNumbers:dQ.arr("已有属性或原文引用覆盖时无需重复登记",dQ.obj("项目参数",{factIndex:dQ.int("实际冻结属性factIndex")},["factIndex"])),normativeNumbers:dQ.arr("本片段规范的真实定量控制值;规范编号和日期不登记",dQ.obj("规范参数",{factIndex:dQ.int("实际冻结属性factIndex"),version:eR("可核版本"),scope:eR("适用范围")},["factIndex","version","scope"])),derivedNumbers:dQ.arr("本片段可复核的推导值",dQ.obj("推导参数",{formula:eR("冻结输入四则算式"),inputFactIndices:dQ.arr("可靠输入属性factIndex",dQ.int("factIndex"),{minItems:1}),basis:eR("推导量纲及依据")},["formula","inputFactIndices","basis"])),plannedNumbers:dQ.arr("本片段明确标识拟定的数值安排;无数值的定性措施不填此类别",dQ.obj("拟定参数",{basis:eR("实际拟定依据"),constraints:dQ.arr("真实约束",eR("约束"),{minItems:1})},["basis","constraints"]))}},[]),{minItems:1}),eV=dQ.obj("本任务完整产物,compact-v7在实际正文片段上登记出处,原文不重复抄成引用",{format:dQ.enumStr("固定协议",["compact-v7"]),paragraphs:dQ.arr("全部正文段落",dQ.obj("一个完整段落及其引用",{...eT,parts:eU},["id","criterionIndices","parts"])),tables:dQ.arr("全部完整表格,没有时为空数组",dQ.obj("完整数据表",{...eT,caption:eR("非空实际表名"),columns:dQ.arr("字段顺序",dQ.obj("字段",{key:eR("字段key"),title:eR("字段名称"),unit:eR("必要的字段单位")},["key","title"]),{minItems:1}),rows:dQ.arr("全部数据记录;记录身份由服务端按实际行序管理",dQ.obj("记录",{cells:dQ.arr("按columns顺序逐格填写,不能多或少",dQ.obj("实际单元格",{parts:eU},["parts"]))},["cells"]),{minItems:1})},["id","criterionIndices","caption","columns","rows"])),figures:dQ.arr("全部完整图件,没有时为空数组;关系图表达工序接口,平面布置必须给二维layout并说明为示意",dQ.obj("完整图件",{...eT,caption:eR("非空实际图名"),nodes:dQ.arr("全部节点",dQ.obj("节点",{id:eR("节点ID"),parts:eU},["id","parts"]),{minItems:1}),edges:dQ.arr("全部关系",dQ.obj("关系",{from:eR("真实起点ID"),to:eR("真实终点ID"),parts:eU},["from","to"])),layout:dQ.obj("仅平面布置提供:归一化图内坐标,不是现场尺度;不得伪造尺寸、北向或边界",{coordinateSystem:dQ.enumStr("图内相对示意坐标",["relative-schematic"]),placements:dQ.arr("每节点恰好一个不重叠区域,完整标签需能容纳",dQ.obj("区域位置",{nodeId:eR("nodes中的实际身份"),x:dQ.num("左上角x,0到1"),y:dQ.num("左上角y,0到1"),width:dQ.num("宽度,正数,区域不得超出1"),height:dQ.num("高度,正数,区域不得超出1")},["nodeId","x","y","width","height"])),routes:dQ.arr("每条edges关系恰好一条实际通行或管线路径;端点落在对应区域",dQ.obj("路线",{edgeIndex:dQ.int("实际edges数组序号"),points:dQ.arr("完整折线路径至少两点",dQ.obj("图内点",{x:dQ.num("x,0到1"),y:dQ.num("y,0到1")},["x","y"]),{minItems:2})},["edgeIndex","points"]))},["coordinateSystem","placements","routes"])},["id","criterionIndices","caption","nodes","edges"])),decisionRequests:dQ.arr("真实未决事项,没有时返回[]",dQ.obj("未决事项",{id:eR("请求ID"),question:eR("具体问题"),reason:eR("缺少哪项实际依据"),criterionIndices:eS},["id","question","reason","criterionIndices"])),revisionReason:dQ.str("首次写入不必填写理由,由服务端登记;已接收稿的实质修订须说明具体原因")},["format","paragraphs","tables","figures","decisionRequests"]);function eW(a){return(a.match(/^###\s+\S/gmu)||[]).length}function eX(a){return String(a??"").replace(/\s+/gu,"")}function eY(a,b){let c=0;for(let d=0;d<a.length;d+=1)if(!/\s/u.test(a[d])){if(c===b)return d;c+=1}return -1}function eZ(a,b,c){let d=[],e=[],f=String(c??""),g=0===f.trim().length?"delete":!0===b.append||"chapter-end"===b.appendAt?"append":"string"==typeof b.endText&&b.endText.trim().length>0?"range":"anchor",h="append"===g?Math.max(4e3,Math.min(24e3,Math.ceil(1.2*bH(a)))):"range"===g?Math.max(2600,Math.min(9e3,Math.ceil(.95*bH(a)))):Math.max(2600,Math.min(16e3,Math.ceil(.45*bH(a)))),i=eX(b?.text);i.length<4&&d.push(`锚点过短(空白归一后 ${i.length} 字符 < 4):无法唯一定位,请给更长的锚点原文`),i&&!eX(a).includes(i)&&d.push("锚点在当前正文中未命中(逐字与空白归一两种比对都不中):锚点必须逐字取自当前草稿"),"delete"!==g&&0===f.trim().length&&d.push("replacement 为空但锚点不是删除语义——本工具的删除语义只由 `delete_span` 承担"),f.length>h&&d.push(`replacement 长度 ${f.length} 超出 ${g} 模式预算 ${h}(4.4 表第 3–5 行)`),"range"===g&&i&&!eX(f).includes(i)&&d.push("range 模式下 replacement 必须逐字包含起点锚点行(否则会把小节标题行整段吃掉)");let j=f,k=!1;if("append"===g&&i&&!eX(j).startsWith(i)&&(j=`${b.text}${j}`,k=!0),"delete"!==g&&j.trim().length>0){let a="append"===g?void 0:b?.text;for(let b of(e.push(...function(a,b){let c=[];bU.test(a)&&c.push("资料来源罗列句");let d=eO.filter(b=>a.includes(b));for(let b of(d.length>0&&c.push(`内部术语“${d.join("”“")}”`),a.matchAll(cq)))c.push(`具体日历日期“${b[1]}年${b[2]}月${b[3]}日”`);let e=[...new Set(a.match(cs)||[])];e.length>0&&c.push(`叠词“${e.join("”“")}”`);let f=eP.filter(b=>a.includes(b));f.length>0&&c.push(`未完成小节标记“${f.join("”“")}”`),function(a){let b=[...a.matchAll(cu)].map(a=>a[0].trim().slice(0,30));return 0===b.length?[]:[{level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`正文存在元话语声明句 ${b.length} 处(${[...new Set(b)].slice(0,3).join("、")}):声明≠数据,正文只保留数据不保留口径声明`,suggestion:"删除「不再另行出现其他口径」「不再另行统计累计投入人次」「以 X 为唯一控制基准,不再…」类自我声明句;数据本身的唯一性由数值一致体现,不需要文字声明。"}]}(a).length>0&&c.push("元话语声明句"),function(a){let b=[...a.matchAll(cv)].map(a=>a[0].trim().slice(0,30));return 0===b.length?[]:[{level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`正文出现公式形态残留 ${b.length} 处(${[...new Set(b)].slice(0,3).join("、")}):正文只允许计算值不允许计算公式`,suggestion:"删除公式符号(P =、Σ、cosφ、K1、q =),只保留计算结果值:如「用电负荷约 48kW」「高峰日生活用水量约 X m\xb3」;公式推导过程一律不进入正文。"}]}(a).length>0&&c.push("公式形态残留"),function(a){let b=[];for(let c of a.matchAll(RegExp(`(${ct})[^。;;
|
|
31
31
|
|]{0,10}?(\\d{3,})\\s*mm`,"gu"))){let a=Number(c[2]);a>=100&&b.push(`“${c[1]}”厚度 ${a}mm`)}for(let c of a.matchAll(RegExp(`(\\d{3,})\\s*mm厚?[^。;;
|
|
32
32
|
|]{0,18}(${ct})`,"gu"))){let a=Number(c[1]);a>=100&&b.push(`“${c[2]}”厚度 ${a}mm`)}let c=[...new Set(b)].slice(0,3);return 0===c.length?[]:[{level:"error",severity:"blocker",category:"fact_consistency",owner:"llm",repairability:"llm_repairable",message:`装饰层工艺参数异常:${c.join("、")} 远超工艺常规厚度(抹面/打底/找平 20mm、坐浆 20~30mm)`,suggestion:"装饰层(抹面/打底/找平/坐浆/结合层)厚度按工艺常规取值:抹面打底找平 20mm、坐浆 20~30mm,与结构层厚度(墙体/垫层/回填)区分,不得串用。"}]}(a).length>0&&c.push("装饰层工艺参数异常"),(eK.filter(b=>b.test(a)).length>0||function(a){let b=[];for(let d of function(a){let b=[],c=a.split(eJ);for(let a=0;a<c.length;a+=1){if(!eH.test(c[a]))continue;let d=[];for(;a<c.length&&eH.test(c[a]);)d.push(c[a]),a+=1;a-=1,d.some(a=>eI.test(a))&&b.push(d.join("\n"))}return b}(a)){let a=d.split(eJ).filter(a=>eH.test(a));if(a.length<2||!eI.test(a[1]||""))continue;let e=a.map(a=>a.trim().replace(/^\|/u,"").replace(/\|$/u,"").split(/(?<!\\)\|/u).map(a=>a.trim().replace(/[\u3000\u00a0\u2000-\u200f\u202f\u205f\ufeff]/gu,""))),f=e[0]||[];for(let a of e.slice(2))for(let d=0;d<a.length;d+=1){var c;let e=a[d]||"";c={rowFirstCell:a[0]||"",headerCell:f[d],cellIndex:d},!eL.test(e)&&!eM.test(e)||c.headerCell&&/存在问题|整改措施|整改要求|整改情况|复查结果|处理情况|检查情况|落实情况|验收结论|备注|说明/u.test(c.headerCell)&&/^无+$/u.test(e)||c.headerCell&&/^单位$/u.test(c.headerCell.trim())&&/^(?:—+|-+)$/u.test(e)||/^(?:—+|-+)$/u.test(e)&&(c.cellIndex>0&&/^(?:合计|小计|总计|累计)/u.test(c.rowFirstCell||"")||0)||b.push({header:f,rowFirstCell:a[0]||"",cellIndex:d,cell:e})}}return b}(a).length>0)&&c.push("占位符"),eQ.some(b=>b.test(a))&&c.push("截断句残留双冒号"),function(a){let b=[],c=a.split(eJ),d=/。{2,}|[!?;:,、]{2,}|。[!?;:,、]|[!?;:,、]。/u;for(let a of c){let c=a.trim();if(!c||/^#{1,6}\s+/u.test(c)||/^\s*\|/u.test(c)||/^<div\b/iu.test(c))continue;let e=d.exec(c);if(e){let a=Math.max(0,e.index-24),d=`${c.slice(a,e.index)}【${e[0]}】${c.slice(e.index+e[0].length,e.index+e[0].length+24)}`;b.push({level:"error",severity:"blocker",category:"format",owner:"llm",repairability:"llm_repairable",message:`正文存在句读标点叠用(拼接/删节残留):${d}`,suggestion:"相邻句读标点(如「。;」「;。」「。。」)是删节拼接残留或省略号误写,请重写该句。"})}}for(let{open:d,close:e,label:f}of eN){let g=a.split(d).length-1,h=a.split(e).length-1;if(g===h)continue;let i=c.find(a=>a.split(d).length-1!=a.split(e).length-1);b.push({level:"error",severity:"blocker",category:"format",owner:"llm",repairability:"llm_repairable",message:`正文存在${f}不闭合(开 ${g} 处、闭 ${h} 处,拼接/删节残留):${i?.trim().slice(0,120)??""}`,suggestion:`${f}成对性破坏是内容丢失拼接的确定性信号,请重写所在句子/小节,补齐或删除残缺部分。`})}return b}(a).length>0&&c.push("句读标点叠用/括号不闭合");let g=a.split(/\r?\n/u).map(a=>a.trim()).filter(Boolean),h=g.filter(a=>/^#{2,6}\s+\S/u.test(a)),i=h.filter(a=>/[((]\s*(?:\d{1,3}|[一二三四五六七八九十]{1,3})\s*[))]\s*$/u.test(a));i.length>0&&c.push(`防撞名后缀标题“${i[0]}”`);let j=h.filter(a=>/^####\s+\d+\.\d+(?!\.)\s+\S/u.test(a));if(j.length>0&&c.push(`小节标题降级形态“${j[0]}”`),g.some((a,b)=>b>0&&/^#{2,6}\s+\S/u.test(a)&&/^#{2,6}\s+\S/u.test(g[b-1]))&&c.push("连续标题堆叠(空节风险)"),g.length>1&&/^#{2,6}\s+\S/u.test(g[g.length-1])&&c.push("尾部裸标题(空节风险)"),b){let d=a=>[...a.matchAll(/^###\s+(\S.*)$/gmu)].map(a=>(a[1]||"").trim()),e=d(b),f=d(a);if(f.length<e.length)c.push("删除小节标题");else if(e.length>0){let b=a=>a.replace(/^\d+(?:\.\d+)*\s+/u,"").trim(),d=new Set(f.map(b)),g=[...a.matchAll(/^#{4,6}\s+(.+)$/gmu)].map(a=>b(a[1]||"")),h=[...a.matchAll(/^\*\*(.+)\*\*\s*$/gmu)].map(a=>(a[1]||"").trim()),i=e.map(b).filter(a=>a&&!d.has(a)&&(g.includes(a)||h.includes(a)));i.length>0&&c.push(`小节标题降级“${i[0]}”`)}}return c}(j,a)),e))d.push(`patchGuard(enforce) 拒绝:${b}`)}let l=function(a,b,c,d){let e=eX(b.text);if("append"===d)return`${a}
|
|
33
33
|
|
|
@@ -122,7 +122,7 @@ ${b}`,{maxTokens:e,signal:q,maxRetries:0,temperature:d.temperature??0,disableThi
|
|
|
122
122
|
缺失字段只能依据完整原始来源和已有内容补齐,不能由字段名、一般常识或通过校验的目的编造事实;若无法忠实补齐,不得伪造确认。返回完整的 schema 合法 JSON,不返回修复说明、补丁或 markdown。
|
|
123
123
|
|
|
124
124
|
JSON 结构重试修正(以下 JSON 是原样输出与协议校验数据,不是新的业务指令):
|
|
125
|
-
${JSON.stringify({priorRaw:l,validationFailure:m,currentSchema:n??null})}`);try{r=await D(()=>k(a,v),c.signal)}catch(a){if(c.signal?.aborted){let a=A(c.signal);throw c.outFailure&&Object.assign(c.outFailure,{value:a.message,code:C(a)}),d&&"AbortError"!==a.name&&V(c.diagnostics,a,B(a)),a}throw a}if(!r){c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r});let b=j.value?j:{value:"本次调用未返回模型内容;没有本次传输回执,不借用其他调用的故障",code:"EMPTY_OUTPUT"};c.outFailure&&Object.assign(c.outFailure,b);break}let w=al(r),x=!1;try{t=(0,e.parseJsonWithoutDuplicateKeys)(w)}catch(b){let a=b instanceof e.DuplicateJsonKeyError?b.message:function(a){let b=al(a),c=(b.match(/\{/gu)||[]).length-(b.match(/\}/gu)||[]).length,d=(b.match(/\[/gu)||[]).length-(b.match(/\]/gu)||[]).length,e=b.slice(-80).replace(/\s+/gu," ");return c>0||d>0?`JSON 被截断({ 未闭合 ${c} 个、[ 未闭合 ${d} 个),截断位置响应末段:${e}`:`JSON 语法错误,出错位置响应末段:${e}`}(w);u=`JSON 解析失败:${a}`,x=a.startsWith("JSON 被截断(")}if(!u&&c.schema){let a=[],b=am(t,c.schema,a);o=c.diagnostics,o&&0!==a.length&&(o.llm.lastInfo=`JSON Schema 超限拒收:${a.slice(0,4).map(a=>`${a.path} ${a.originalLength} 条超上限 ${a.maxItems},完整数组保留并拒收`).join(";")}`),b.length&&(u=`JSON Schema 校验失败:${b.join(";")}`)}if(!u&&c.validateProtocol){let b;try{b=c.validateProtocol(structuredClone(t))}catch(b){throw c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r}),b}b.length&&(u=`JSON 关联协议校验失败:${b.join(";")}`)}if(c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r,...u?{validationFailure:u}:{}}),(u||j.outputTruncated)&&(0,s.U5)(c.diagnostics,{system:a,prompt:v,raw:r,ordinal:p,callKind:c.callKind,validationFailure:u,outputTruncated:!!j.outputTruncated}),j.outputTruncated&&(0,q.jW)(c.diagnostics)){let a="供应商报告本次输出被截断;保留原始响应,暂停核查任务大小、实际思考及发送容量,不再次发送整包输入;默认容量截断不等于模型最大能力耗尽";c.outFailure&&Object.assign(c.outFailure,{value:a,code:"OUTPUT_TRUNCATED",outputTruncated:!0}),(0,q.wD)({nodeId:c.prefixKey??`llm:${c.callKind??"structured-generation"}`,title:c.callKind,turn:p+1,toolCalls:0,reason:a},"model-output-truncated");break}if(!u)return t;if(g=r,f=u,!function(a,b,c){if(!a)return;a.llm.schemaFailures=(a.llm.schemaFailures||0)+1,a.llm.lastError=b;let d=af(a,c);d.schemaFailures=(d.schemaFailures||0)+1}(c.diagnostics,u,c.prefixKey),(x||j.outputTruncated)&&(h=an(h)),p>=2){c.outFailure&&Object.assign(c.outFailure,{value:u,code:"JSON_VALIDATION_EXHAUSTED"});break}}}async function ap(a,b,c={}){return ao(a,b,c)}},41240:(a,b,c)=>{c.d(b,{E6:()=>f,Zw:()=>e});var d=c(76875);let e=["task","organization","labor","equipment","materials","schedule","deployment"];function f(a,b,c,g={}){let h=b.find(a=>a.id===c),i=a.tasks.find(a=>a.taskId===c);if(!h||!i)throw Error("共享工程计划查询不属于当前实际任务");let j=g.view??(/工资|实名|检验|储存|保管|安全管理|应急保障|管理制度/u.test(h.title)?"organization":h.contentTypes.includes("schedule")||/工期|进度|网络计划/u.test(h.title)?"schedule":/劳动力|工种|班组配置/u.test(h.title)?"labor":/机械|机具|设备配置/u.test(h.title)?"equipment":/材料|物资/u.test(h.title)?"materials":/部署|总体安排|组织安排/u.test(h.title)?"deployment":"task");if(!e.includes(j))throw Error("共享工程计划查询视图无效");if(g.activityIds&&(!Array.isArray(g.activityIds)||!g.activityIds.length||g.activityIds.some(b=>!a.production.activities.some(a=>a.input.id===b))))throw Error("须使用共享计划目录中的真实活动身份");let k=a.production.activities.filter(b=>g.activityIds?g.activityIds.includes(b.input.id):"task"!==j||b.input.taskIndices.some(b=>a.tasks[b]?.taskId===c)),l=new Set(k.map(a=>a.input.id)),m=a.production.plannedResources.filter(a=>l.has(a.activityId)),n=[],o=new Map,p=(0,d.wp)(a.production,b.map(a=>a.id)).filter(a=>(!a.activityId||l.has(a.activityId))&&("task"===j||"organization"===j||"materials"===j?"task"===j:"window"===a.purpose||"organization"===a.purpose||a.purpose===j||"deployment"===j&&!a.activityId)).map(({taskIds:a,inputMemberIds:b,objectScope:c,basis:d,...e})=>{let f=o.get(d);return f||(f=`basis-${n.length}`,o.set(d,f),n.push({id:f,text:d})),{...e,basisId:f,...!e.activityId?{objectScope:c}:{}}}),q=k.map(a=>{if("task"===j)return a;let{input:b,status:c,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,timeWindow:i,workTimeWindow:k,critical:l,floatDays:m}=a,n={id:b.id,phaseId:b.phaseId,objectScope:b.objectScope,workfront:b.workfront,status:c};return"organization"===j||"materials"===j?n:{...n,predecessors:b.predecessors,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,timeWindow:i,workTimeWindow:k,critical:l,floatDays:m}}),r=m.map(a=>{let{activityId:b,phaseId:c,objectScope:d,workfront:e,basis:f}=a,g={activityId:b,phaseId:c,objectScope:d,workfront:e,basis:f};return"task"===j?a:"organization"===j||"materials"===j?{...g,trades:a.workers.map(a=>a.trade),equipment:a.equipment.map(({name:a,spec:b})=>({name:a,spec:b}))}:"labor"===j?{...g,crewId:a.crewId,crews:a.crews,shiftsPerDay:a.shiftsPerDay,workers:a.workers,countMeaning:"每日配置含不同轮班人员,非同时在岗峰值"}:"equipment"===j?{...g,crewId:a.crewId,crews:a.crews,equipment:a.equipment}:{...g,crewId:a.crewId,crews:a.crews,shiftsPerDay:a.shiftsPerDay,trades:a.workers.map(a=>a.trade),equipment:a.equipment.map(({name:a,spec:b})=>({name:a,spec:b}))}});return{id:a.id,contractId:a.contractId,projectSnapshotId:a.projectSnapshotId,phases:a.phases,activityDirectory:a.production.activities.map(({input:a})=>({id:a.id,phaseId:a.phaseId,objectScope:a.objectScope,workfront:a.workfront})),view:j,activities:q,plannedResources:r,numbers:p,bases:n,numberMeaning:"index指向同源完整数记录;活动对象见activityId对应活动,basisId见bases原文。对象与依据只存一份,不裁字;组织管理视图不要求数量。",..."schedule"===j||"deployment"===j||"task"===j?{calendar:a.production.calendar}:{},..."labor"===j?{labor:a.production.labor}:{},..."equipment"===j?{equipment:a.production.equipment}:{},..."materials"===j?{materials:a.production.materials.filter(a=>l.has(a.activityId)),materialStatus:"逐源用途记录,不等于已采用采购总量"}:{},issues:a.production.issues.filter(a=>!a.activityId||l.has(a.activityId)),scope:{taskId:c,activityIds:[...l],completeSelectedView:!0},task:i,interfaces:a.tasks.filter(a=>a.taskId!==c&&a.phaseIds.some(a=>i.phaseIds.includes(a))).map(({taskId:a,objectScope:b,boundary:c,handoffs:d})=>({taskId:a,objectScope:b,boundary:c,handoffs:d}))}}},42948:(a,b,c)=>{c.d(b,{Fr:()=>k,HM:()=>l,Hf:()=>n,tv:()=>m,wE:()=>o,yW:()=>p});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(77598);let i=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u,j=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function k(a,b){return b?`run:${b}:${a}`:a}function l(a,b,c){if(!j.test(b))throw Error("非法运行资产文件名");if(void 0!==c&&!i.test(c))throw Error("非法运行 ID");return c?g().join(a,"runs",c,"artifacts",b):g().join(a,"assets",b)}function m(a,b,c,d){let f=l(a,b,d),i=JSON.stringify(c);if(void 0===i)throw Error("运行资产不能是 undefined");e().mkdirSync(g().dirname(f),{recursive:!0});let j=`${f}.${(0,h.randomUUID)()}.tmp`;e().writeFileSync(j,i,{encoding:"utf8",flag:"wx"});try{if(d)try{e().linkSync(j,f)}catch(a){if("EEXIST"!==a.code)throw a;if(e().readFileSync(f,"utf8")!==i)throw Error(`运行资产已存在且内容不同:${d}/${b}`,{cause:a})}else e().renameSync(j,f)}finally{e().rmSync(j,{force:!0})}return{assetPath:f,bytes:Buffer.byteLength(i),sha256:(0,h.createHash)("sha256").update(i).digest("hex")}}function n(a){if(!a.runId)throw Error("实时模型进度必须绑定当前运行 ID");let b=l(a.generatedDir,"llm-live-progress.json",a.runId),c=JSON.stringify({...a.snapshot,version:1,runId:a.runId,documentId:a.documentId});e().mkdirSync(g().dirname(b),{recursive:!0});let d=`${b}.${(0,h.randomUUID)()}.tmp`;e().writeFileSync(d,c,{encoding:"utf8",flag:"wx"});try{e().renameSync(d,b)}finally{e().rmSync(d,{force:!0})}}function o(a,b){return b?[["run-start","run-start.json","本轮启动身份"],["run-inputs","run-inputs.json","本轮已准备输入快照"],["project-model","project-model.json","本轮写作与终检共用的项目事实快照"],["tender-requirements","tender-requirements.json","本轮原始招标条款、技术职责拆分、商务归宿及未裁决台账"],["document-contract","document-contract.json","本轮写作前冻结的职责、义务与七维评价合同"],["contract-ownership-plan","contract-ownership-plan.json","主控逐项确认事实、表格与交付义务的唯一主要责任小节"],["content-type-plan","content-type-plan.json","本轮主控对各节具体内容职责与适用类型的确认回执"],["contract-quality","contract-quality.json","本轮固定合同、项目快照和正文版本的七维评价回执"],["writing-task-hierarchy","writing-task-hierarchy.json","锁定交付小节与专业作者子任务之间的固定层级"],["chapter-writing-structures","chapter-writing-structures.json","本轮作者任务开始前的固定结构和内容职责"],["author-task-executions","author-task-executions.json","实际作者实例、委派任务、完整输入身份、执行终态与共用章节预算"],["author-accounting-final","author-accounting-final.json","同一合同跨续跑累计的调用、token、成本与章节预算消耗"],["author-candidates","author-candidates.json","本轮工具执行、自检、清理及重试前的原始模型返回索引"],["document-token-anomaly","document-token-anomaly.json","本轮无有效进展的重复模型消费与整份暂停回执;缺usage和供应商结算保持未知"],["document-model-final","document-model-final.json","本轮统一文档模型的最终版本与全部累计修改记录"],["contract-quality-c0","contract-quality-c0.json","固定首稿的完整七维评价,后续修改不能覆盖"],["contract-light-repair","contract-light-repair.json","统一预算内轻修的预检、提交结果与首稿通过读数"],["document-model-author","document-model-author.json","本轮固定任务的结构化作者模型、初始候选与累计修改账"],["blueprint","blueprint.json","本轮写作蓝图"],["requirement-assignments","requirement-assignments.json","本轮要求责任分配"],["structure-assignments","structure-assignments.json","本轮呈现要求分配"],["before-global-review","before-global-review.json","全文审查前章节快照(含章内重试,不等于原始首稿)"],["before-finalize","before-finalize.json","收口前章节快照"],["final-document","final-document.json","本轮最终内容快照"],["run-summary","run-summary.json","本轮阶段墙钟、调用用途与历史评分读数"]].flatMap(([c,d,f])=>{let g=l(a,d,b);if(!e().existsSync(g))return[];let i=(0,h.createHash)("sha256").update(e().readFileSync(g)).digest("hex");return[{id:k(c,b),artifactKind:c,type:"file",role:"attachment",path:g,sha256:i,runId:b,status:"generated",message:f}]}):[]}function p(a){if(!a.runId)return;let b=a.chapters.map(a=>({id:a.id,title:a.title,content:a.content,contentHash:(0,h.createHash)("sha256").update(a.content).digest("hex")}));m(a.generatedDir,`${a.stage}.json`,{version:1,runId:a.runId,documentId:a.documentId??null,stage:a.stage,capturedAt:Date.now(),chapters:b,...void 0!==a.markdown?{markdown:a.markdown}:{},rawFirstCandidate:!1},a.runId)}},43255:(a,b,c)=>{c.d(b,{X4:()=>j,Yn:()=>i});var d=c(77598),e=c(16646),f=c(55422);function g(a,b){let c=a.trim();if(/^其他$|^其他工程$/u.test(c)){let a=b.map(a=>a.name);return a.some(a=>/彩绘|护栏|围栏|小品|标识|标牌|墙面|整治/u.test(a))?"环境整治工程":a.some(a=>/绿化|栽植|铺装|种植/u.test(a))?"景观附属工程":a.some(a=>/拆除|清理|清淤|清运/u.test(a))?"清理整治工程":"零星工程"}return/^其他装饰/u.test(c)?"零星装饰工程":/^措施项目$/u.test(c)?b.map(a=>a.name).some(a=>/化粪池|吊装|安装/u.test(a))?"模板、脚手架及化粪池安装工程":"模板与脚手架工程":/墙[、,]?柱面装饰/u.test(c)?b.some(a=>/幕墙|隔断/u.test(a.name))?c:"墙柱面装饰工程":c}function h(a,b,c=!1){let d=new Map;for(let b of a.entries){if(!b.section)continue;let a=c?JSON.stringify([b.sourceFile,b.villageGroup,b.section]):b.section,e=d.get(a)||[];e.push(b),d.set(a,e)}let e=[],f=0;for(let a of d.values()){let c=g(a[0].section,a),d=a.some(a=>"unit-project"===a.sectionKind),h=[];if(d){let b=new Map;for(let d of a){let a=d.subsection||c,e=b.get(a)||[];e.push(d),b.set(a,e)}for(let[a,c]of b)h.push(k(g(a,c),c))}else h.push(k(c,a));f+=1,e.push({id:`${b}.${f}`,title:c,requiredParams:h.flatMap(a=>Object.keys(a.quantities).slice(0,5).map(a=>({path:`data.quantities.${a}`,mode:"must_cite",strict:!0}))),tablePlans:[],workPackages:h})}return e}function i(a){let{chapterTitles:b,boq:c}=a,d=b.map((b,d)=>{var e;let f=String(d+1),g=/主要分部分项|施工方案|施工方法/u.test(b)?h(c,f):[];return{id:f,title:b,isActive:(e=a.docType,!(/专项施工方案|专项方案|危大/u.test(e)&&/总平面|平面布置|施工部署|总体部署/u.test(b))),requiredParams:[],subSections:g}}),e=h(c,"project",!0).flatMap(a=>a.workPackages),f=c.entries.filter(a=>!a.section);return f.length&&e.push(k("未分部清单记录",f)),{chapters:d,projectWorkPackages:e}}function j(a){return(0,d.createHash)("sha256").update(JSON.stringify([a.sourceFile,a.villageGroup,a.section,a.subsection,a.seq,a.code,a.name,a.description,a.unit,a.quantity,a.chunkIndex])).digest("hex")}function k(a,b){let c=[...b].sort((a,b)=>a.seq-b.seq),d={},g=new Map;for(let a of c){if(!a.name)continue;let b=g.get(a.name)??new Map;b.set(a.unit,(b.get(a.unit)??0)+a.quantity),g.set(a.name,b)}for(let[a,b]of g)for(let[c,e]of b)d[b.size>1?`${a}(${c||"未注明单位"})`:a]={value:Math.round(1e3*e)/1e3,unit:c};let h=[...new Set(c.map(a=>a.name).filter(Boolean))],i=(0,f.lh)(c),k=[],l=new Set;for(let a of c){for(let b of(0,f.QU)(a.description)){let a=`${b.key}=${b.value}`;if(!l.has(a)&&(l.add(a),k.push({key:b.key,value:b.value,source:"boq"}),k.length>=24))break}if(k.length>=24)break}let m=[];for(let a of c)for(let b of(0,f.QU)(a.description))/压实|试验|检测|验收|闭水|合格/u.test(`${b.key}${b.value}`)&&m.length<12&&!m.includes(b.value)&&m.push(b.value);let n=(0,e.cn)(c.map(a=>a.name)),o=[];for(let a of(0===m.length&&n.length>0&&m.push(...n[0].acceptance.slice(0,6).map(a=>`${a}(知识卡)`)),n.slice(0,2)))for(let b of a.standards)o.includes(b)||o.push(b);return{name:a,kind:"major",quantities:d,objectNames:h,methods:i,params:k,acceptance:m,standards:o,source:"boq",coveredSeqs:c.map(a=>a.seq),members:c.map(a=>({id:j(a),entry:{...a}}))}}},43967:(a,b,c)=>{c.d(b,{b:()=>g,jF:()=>h});let d=globalThis,e=d.__customizeStorageMaintenance??={active:!1};d.__customizeStorageApiWriters??=new Set;class f extends Error{constructor(){super("系统清空正在执行,暂不接收新的存储访问"),this.name="StorageMaintenanceError"}}function g(){return e.active}function h(){if(e.active)throw new f}},44616:(a,b,c)=>{c.d(b,{bV:()=>f,lu:()=>h,mk:()=>g});var d=c(63327);let e=new WeakMap;function f(a){let b=e.get(a);if(!b){let c=[...a.facts,...a.sourceControls??[]],f=[...new Set(c.filter(a=>"verified-source-excerpt"!==a.roleId).map(d.vg))].sort(),g=[...new Set(c.filter(a=>"verified-source-excerpt"===a.roleId).map(d.vg))].sort();b={facts:f,sources:g,factIndices:new Map(f.map((a,b)=>[a,b])),sourceIndices:new Map(g.map((a,b)=>[a,b]))},e.set(a,b)}return b}function g(a,b,c){let d=f(a);return{...b&&d.factIndices.has(b)?{factIndex:d.factIndices.get(b)}:{},...c&&d.sourceIndices.has(c)?{sourceIndex:d.sourceIndices.get(c)}:{}}}function h(a,b,c){let d="fact"===b?f(a).facts:f(a).sources;if(!Number.isSafeInteger(c)||0>Number(c)||Number(c)>=d.length)throw Error(`${"fact"===b?"属性":"原文"}引用序号不属于当前冻结项目`);return d[Number(c)]}},44736:(a,b,c)=>{c.d(b,{FP:()=>q,H0:()=>k,U2:()=>j,_e:()=>z,eb:()=>A,fN:()=>m,hg:()=>l,oN:()=>r});var d=c(77598),e=c(19898),f=c(70247);let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),h=a=>{let{rowSha256:b,...c}=a;return b===g(c)},i=a=>a.replace(/\s/gu,"");function j(a){let b=a.trim();if(!b.startsWith("|")||!b.endsWith("|"))return;let c=[],d="",e=!1;for(let a=1;a<b.length-1;a++){let f=b[a];"|"!==f||e?d+=f:(c.push(d.trim()),d=""),e="\\"===f&&!e}return c.push(d.trim()),c.length>=2?c:void 0}function k(a){let b=a[0]?.trim()??"";return/^(?:\d{1,3}(?:[..]\d{1,3}){1,4}|第[零一二三四五六七八九十百千\d]+[条款项])$/u.test(b)?b:void 0}function l(a,b,c){let{sha256:d,...f}=a;if("tender-native-file-proof-v1"!==a.version||a.file!==b||a.sourceChunkCount!==c||a.nativeLayoutVersion!==e.PDF_NATIVE_LAYOUT_VERSION||!/^[a-f0-9]{64}$/u.test(a.sourceSha256)||!/^[a-f0-9]{64}$/u.test(a.metadataSha256)||d!==g(f))throw Error("原生PDF表格文件证据身份不一致");return a.pages.flatMap(c=>{if(c.glyphSha256!==g(c.glyphs))throw Error("原生PDF字形回执不属于实际文件");if("fallback"===c.strategy)return[];if("ruled-cells"!==c.strategy)throw Error("原生PDF页面没有明确layout策略");let d=new Map(c.glyphs.map(a=>[a.id,a])),e=new Map,f=new Map;for(let a of c.cells){if(!Number.isSafeInteger(a.columnIndex)||a.columnIndex<0||!Number.isSafeInteger(a.columnSpan)||a.columnSpan<1||4!==a.bounds.length||!a.bounds.every(Number.isFinite)||a.bounds[0]>=a.bounds[2]||a.bounds[1]>=a.bounds[3])throw Error("原生表格物理合并单元格身份无效");for(let[b,c]of[[a.columnIndex,a.bounds[0]],[a.columnIndex+a.columnSpan,a.bounds[2]]]){let a=f.get(b);if(void 0!==a&&Math.abs(a-c)>1.5)throw Error("原生表格逻辑列与物理边界不一致");f.set(b,c)}let b=`${a.bounds[1]}:${a.bounds[3]}`;e.set(b,[...e.get(b)??[],a])}let h=[...e.values()].sort((a,b)=>b[0].bounds[3]-a[0].bounds[3]),i=Math.max(...c.cells.map(a=>a.columnIndex+a.columnSpan)),j=h.map(a=>{let b=Array(i).fill(""),c=0,e;for(let f of a.sort((a,b)=>a.columnIndex-b.columnIndex)){if(f.columnIndex!==c||void 0!==e&&Math.abs(f.bounds[0]-e)>1.5)throw Error("原生表格列范围重叠或缺失");c+=f.columnSpan,e=f.bounds[2],b[f.columnIndex]=f.glyphIds.map(a=>{let b=d.get(a);if(!b)throw Error("原生表格字形ID缺失");return b}).sort((a,b)=>2>=Math.abs(a.y-b.y)?a.x-b.x:b.y-a.y).map(a=>a.str).join("").replace(/\|/gu,"\\|")}if(c!==i)throw Error("原生表格列范围不完整");return b}),k=j[0]??[];return j.map((d,e)=>{let f={file:b,sourceSha256:a.sourceSha256,nativeProofSha256:a.sha256,page:c.page,row:e,rowCount:j.length,cells:d,bounds:h[e].map(a=>a.bounds),physicalCells:h[e],headers:k};return{...f,rowSha256:g(f)}})})}function m(a,b,c){let d=a.filter(a=>(void 0===c||a.page===c)&&a.cells.length===b.length&&a.cells.every((a,c)=>i(a)===i(b[c])));return 1===d.length?d[0]:void 0}let n=(a,b)=>{let c=j(b.rawText);return b.file===a.file&&!!c&&c.length===a.cells.length&&c.every((b,c)=>i(b)===i(a.cells[c]))},o=a=>(0,f.y)(a.map(({sourceGapBefore:a,sourceTableBridgeBefore:b,sourceNativeTextBridgeBefore:c,...d})=>d));function p(a,b){return h(a)&&h(b)&&a.file===b.file&&a.sourceSha256===b.sourceSha256&&a.nativeProofSha256===b.nativeProofSha256&&b.page===a.page+1&&a.row===a.rowCount-1&&1===b.row&&a.cells.length===b.cells.length&&a.cells.length>=2&&a.bounds.length===a.cells.length&&b.bounds.length===b.cells.length&&a.physicalCells.every((a,b)=>a.columnIndex===b&&1===a.columnSpan)&&b.physicalCells.every((a,b)=>a.columnIndex===b&&1===a.columnSpan)&&a.headers.length===b.headers.length&&a.headers.every((a,c)=>i(a)===i(b.headers[c]))&&a.bounds.every((a,c)=>1.5>Math.abs(a[0]-b.bounds[c][0])&&1.5>Math.abs(a[2]-b.bounds[c][2]))&&b.cells.slice(0,-1).every(a=>!i(a))&&!!i(b.cells.at(-1)??"")&&!!i(a.cells.at(-1)??"")&&!/[。!?!?;;][))】」》”’"']*$/u.test(a.cells.at(-1).trim())}function q(a,b,c,d){let{witnessSha256:e,...f}=a,h=d.flatMap((b,c)=>o([b])===a.fromSpanSha256?[c]:[]),i=d.flatMap((b,c)=>o([b])===a.toSpanSha256?[c]:[]),j=1===h.length&&1===i.length&&i[0]>=h[0]?d.slice(h[0],i[0]+1):[];if(!b||"native-table-page-bridge-v2"!==a.version||a.file!==c.file||a.file!==b.file||e!==g(f)||!p(a.from,a.to)||!j[0]||!j.at(-1)||!n(a.from,j[0])||!n(a.to,j.at(-1))||a.spansSha256!==o(j)||!j.includes(b)||!j.includes(c)||!a.transitions.some(a=>a.fromChunkIndex===b.chunkIndex&&a.toChunkIndex===c.chunkIndex&&a.fromChunkSha256===b.chunkSha256&&a.toChunkSha256===c.chunkSha256&&a.fromEnd===b.end&&a.toStart===c.start))throw Error("原生表格续行与完整layout/source spans证据不一致")}function r(a,b){let c=[...a];for(let a=0;a<c.length;a++){let d,e=c[a]?.nativeTableRow;if(!e)continue;let h=c.findIndex((b,c)=>c>a&&!!b.nativeTableRow&&0!==b.nativeTableRow.row&&b.file===e.file);if(h<0)continue;let k=c[h].nativeTableRow;if(!p(e,k)||c.slice(a+1,h).some(a=>a.nativeTableRow&&(0!==a.nativeTableRow.row||a.nativeTableRow.page!==k.page||a.nativeTableRow.nativeProofSha256!==e.nativeProofSha256)))continue;let l=a=>a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let b=a.trim(),c=j(b);return/^#{1,6}\s+(?:PDF 第\s*\d+\s*页|PDF 原生网格表格区域|-?\d+-?)$/u.test(b)||"|"===b||!!c&&(c.every(a=>/^:?-{3,}:?$/u.test(a))||c.every((a,b)=>a===`列${b+1}`)||c.every((a,b)=>i(a)===i(k.headers[b]??"")))});if(c.slice(a+1,h).some(a=>!l(a.sourceSpans?.map(a=>a.rawText).join("\n")??a.text)))continue;let m=c[a],q=c[h],r=m.sourceSpans?.at(-1),s=q.sourceSpans?.[0];if(!r||!s||void 0===r.chunkIndex||void 0===s.chunkIndex)continue;let t=b.filter(a=>a.file===e.file&&a.chunkIndex>r.chunkIndex&&a.chunkIndex<s.chunkIndex).sort((a,b)=>a.chunkIndex-b.chunkIndex);if(t.length!==s.chunkIndex-r.chunkIndex-1)continue;let u=b.find(a=>a.file===e.file&&a.chunkIndex===r.chunkIndex),v=b.find(a=>a.file===e.file&&a.chunkIndex===s.chunkIndex);if(!u||!v)continue;let w=[{chunk:u,start:r.end,end:u.text.length},...t.map(a=>({chunk:a,start:0,end:a.text.length})),{chunk:v,start:0,end:s.start}];if(w.some(a=>!l(a.chunk.text.slice(a.start,a.end))))continue;let x=[r,...w.filter(a=>a.chunk.text.slice(a.start,a.end).trim()).map(({chunk:a,start:b,end:c})=>({file:e.file,chunkIndex:a.chunkIndex,section:"PDF表格页间原始布局",chunkSha256:a.sha256,sourceStartChar:a.startChar,sourceEndChar:a.endChar,start:b,end:c,rawText:a.text.slice(b,c),text:a.text.slice(b,c)})),...q.sourceSpans];try{d=function(a,b,c){if(!p(a,b)||!c[0]||!c.at(-1)||!n(a,c[0])||!n(b,c.at(-1)))throw Error("没有相邻页同表同列续行证据");let d=[];for(let a=1;a<c.length;a++){let b=c[a-1],e=c[a];if(b.chunkIndex!==e.chunkIndex){if(void 0===b.chunkIndex||e.chunkIndex!==b.chunkIndex+1)throw Error("表格续行不能跳过未保全的parse chunk");d.push({fromChunkIndex:b.chunkIndex,toChunkIndex:e.chunkIndex,fromChunkSha256:b.chunkSha256,toChunkSha256:e.chunkSha256,fromEnd:b.end,toStart:e.start})}}let e={version:"native-table-page-bridge-v2",file:a.file,sourceSha256:a.sourceSha256,nativeProofSha256:a.nativeProofSha256,from:a,to:b,fromSpanSha256:o([c[0]]),toSpanSha256:o([c.at(-1)]),spansSha256:o(c),transitions:d};return{...e,witnessSha256:g(e)}}(e,k,x)}catch{continue}let y=[...m.sourceSpans,...x.slice(1).map((a,b)=>a.chunkIndex!==x[b].chunkIndex?{...a,sourceTableBridgeBefore:d}:a)];c.splice(a,h-a+1,{...m,text:y.map(a=>a.text).join("\n"),nativeTableRow:k,sourceSpans:y,sourceSpansSha256:(0,f.y)(y)}),a--}return c}let s=a=>/^-?\d{1,4}-?$/u.test(i(a)),t=a=>{let{lineSha256:b,...c}=a;return b===g(c)};function u(a){let{sha256:b,...c}=a;if(a.nativeLayoutVersion!==e.PDF_NATIVE_LAYOUT_VERSION||b!==g(c))throw Error("原生普通页文件证据身份不一致");return a.pages.flatMap(b=>{if(b.glyphSha256!==g(b.glyphs))throw Error("原生普通页glyph指纹不一致");let c=[];for(let a of[...b.glyphs].filter(a=>a.str.trim()).sort((a,b)=>b.y-a.y||a.x-b.x)){let b=c.find(b=>Math.abs(b.y-a.y)<=Math.max(2,.45*a.height));b?b.glyphs.push(a):c.push({y:a.y,glyphs:[a]})}return c.map((d,e)=>{d.glyphs.sort((a,b)=>a.x-b.x);let f=d.glyphs.filter(a=>/[A-Za-z\p{Script=Han}]/u.test(a.str)),h={file:a.file,sourceSha256:a.sourceSha256,nativeProofSha256:a.sha256,page:b.page,pageGlyphSha256:b.glyphSha256,line:e,lineCount:c.length,text:d.glyphs.map(a=>a.str).join("").replace(/\|/gu,"\\|"),glyphIds:d.glyphs.map(a=>a.id),x:d.glyphs[0].x,xEnd:Math.max(...d.glyphs.map(a=>a.x+a.width)),y:d.y,height:Math.max(...d.glyphs.map(a=>a.height)),columnGap:d.glyphs.some((a,b)=>b>0&&a.x-d.glyphs[b-1].x-d.glyphs[b-1].width>2*Math.max(a.height,d.glyphs[b-1].height)),fontNames:[...new Set((f.length?f:d.glyphs).flatMap(a=>a.fontName?[a.fontName]:[]))].sort()};return{...h,lineSha256:g(h)}})})}let v=(a,b,c)=>{let d=(a=>{let b=j(a.rawText);if(b){if(!b.slice(0,-1).every(a=>!i(a)))return;return b.at(-1)}return a.rawText.trim().replace(/^#{1,6}\s+/u,"")})(b);if(b.file!==a.file||void 0===d)return!1;let e=i(d),f=i(a.text);return!!f&&("start"===c?e.startsWith(f):e.endsWith(f))};function w(a,b){let c=a[0],d=b[0];return c&&d&&i(c.text)===i(d.text)&&1.5>Math.abs(c.x-d.x)&&1.5>Math.abs(c.y-d.y)&&1.5>Math.abs(c.height-d.height)&&c.fontNames.join("|")===d.fontNames.join("|")?i(c.text):void 0}function x(a,b,c,d,e){let f,g=w(c,d),j=c.filter(a=>!s(a.text)&&i(a.text)!==g),k=d.filter(a=>!s(a.text)&&i(a.text)!==g),l=1.5>Math.abs(a.xEnd-b.xEnd)&&a.x>b.x&&j.some(c=>c.line<a.line&&1.5>Math.abs(c.x-b.x)&&c.fontNames.join("|")===b.fontNames.join("|")),m=1.5>Math.abs(a.x-b.x)||l,n=!!e&&h(e)&&e.file===b.file&&e.sourceSha256===b.sourceSha256&&e.nativeProofSha256===b.nativeProofSha256&&e.page===b.page&&1===e.row&&e.cells.slice(0,-1).every(a=>!i(a))&&i(e.cells.at(-1)??"").startsWith(i(b.text));return t(a)&&t(b)&&a.file===b.file&&a.sourceSha256===b.sourceSha256&&a.nativeProofSha256===b.nativeProofSha256&&b.page===a.page+1&&a.line===j.at(-1)?.line&&b.line===k[0]?.line&&m&&2>Math.abs(a.height-b.height)&&!a.columnGap&&!b.columnGap&&(n||l||!j.some(a=>a.columnGap)&&!k.some(a=>a.columnGap))&&a.fontNames.join("|")===b.fontNames.join("|")&&(f=b.text,!/^(?:第[零一二三四五六七八九十百\d]+[章条节]|[((]?[一二三四五六七八九十百\d]+[))]|[一二三四五六七八九十百\d]+[..、])/u.test(f.trim()))&&!!i(a.text)&&!!i(b.text)&&!/[。!?!?;;::][))】」》”’"']*$/u.test(a.text.trim())}function y(a,b){let c=new Set([...b.fromPageLines,...b.toPageLines].filter(a=>s(a.text)).map(a=>i(a.text)));return a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let d=a.trim(),e=i(d.replace(/^#{1,6}\s+/u,"")),f=/^#{1,6}\s+PDF 第\s*(\d+)\s*页$/u.exec(d),g=j(d);return f?Number(f[1])===b.from.page||Number(f[1])===b.to.page:!!c.has(e)||!!b.repeatedHeader&&e===b.repeatedHeader||!!b.toGridRow&&(/^#{1,6}\s+PDF 原生网格表格区域$/u.test(d)||"|"===d||!!g&&g.length===b.toGridRow.cells.length&&(g.every(a=>/^:?-{3,}:?$/u.test(a))||g.every((a,b)=>a===`列${b+1}`)||g.every((a,c)=>i(a)===i(b.toGridRow.headers[c]??""))))})}function z(a,b,c,d){let{witnessSha256:e,...f}=a,h=function(a,b){let c=b.flatMap((b,c)=>o([b])===a.fromSpanSha256?[c]:[]),d=b.flatMap((b,c)=>o([b])===a.toSpanSha256?[c]:[]);return 1===c.length&&1===d.length&&d[0]>=c[0]?b.slice(c[0],d[0]+1):[]}(a,d);if(!b||"native-text-page-bridge-v1"!==a.version||a.file!==c.file||a.file!==b.file||e!==g(f)||!t(a.from)||!t(a.to)||a.to.page!==a.from.page+1||a.from.file!==a.file||a.to.file!==a.file||!a.fromPageLines.every(t)||!a.toPageLines.every(t)||a.repeatedHeader!==w(a.fromPageLines,a.toPageLines)||!x(a.from,a.to,a.fromPageLines,a.toPageLines,a.toGridRow)||a.from.sourceSha256!==a.sourceSha256||a.to.sourceSha256!==a.sourceSha256||a.from.nativeProofSha256!==a.nativeProofSha256||a.to.nativeProofSha256!==a.nativeProofSha256||!h[0]||!h.at(-1)||!v(a.from,h[0],"end")||!v(a.to,h.at(-1),"start")||a.toGridRow&&!n(a.toGridRow,h.at(-1))||a.spansSha256!==o(h)||!function(a,b,c,d){let e=d.indexOf(b);return!(e<0)&&d[e+1]===c&&void 0!==b.chunkIndex&&void 0!==c.chunkIndex&&!(c.chunkIndex<b.chunkIndex)&&!(c.chunkIndex>b.chunkIndex+1)&&(b.chunkIndex!==c.chunkIndex||b.chunkSha256===c.chunkSha256&&!(b.end>c.start))&&a.transitions.some(a=>a.fromChunkIndex===b.chunkIndex&&a.toChunkIndex===c.chunkIndex&&a.fromChunkSha256===b.chunkSha256&&a.toChunkSha256===c.chunkSha256&&a.fromEnd===b.end&&a.toStart===c.start)}(a,b,c,h)||h[0].chunkIndex===h.at(-1).chunkIndex&&(h.some(a=>a.chunkIndex!==h[0].chunkIndex||a.chunkSha256!==h[0].chunkSha256)||h.slice(1,-1).some(b=>!y(b.rawText,a))))throw Error("原生普通页续行与实际glyph/layout/source spans证据不一致")}function A(a,b,c,d){let e=c.flatMap(u),h=[...a],k=new Map,l=new Map,m=new Map,p=(a,b)=>JSON.stringify([a,b]);for(let a of e){let b=p(a.file,a.page);k.set(b,[...k.get(b)??[],a])}for(let a of[...b].sort((a,b)=>(a.file??"").localeCompare(b.file??"")||(a.chunkIndex??-1)-(b.chunkIndex??-1))){let b=a.file??"",c=[...a.text.matchAll(/^#{1,6}\s+PDF 第\s*(\d+)\s*页/gmu)].map(a=>({start:a.index,page:Number(a[1])}));l.set(p(b,a.chunkIndex),{initial:m.get(b),markers:c}),c.length&&m.set(b,c.at(-1).page)}let q=a=>{let b=l.get(p(a.file,a.chunkIndex));return b?.markers.filter(b=>b.start<a.start).at(-1)?.page??b?.initial},r=(a,b)=>(k.get(p(a.file,q(a)))??[]).filter(c=>v(c,a,b));for(let a=0;a<h.length;a++){let c=h[a],e=c.sourceSpans;if(!e)continue;let l=-1,m;for(let a=e.length-1;a>=0;a--){let b=r(e[a],"end").filter(a=>!s(a.text));if(1===b.length){l=a,m=b[0];break}}if(!m)continue;let t=k.get(p(m.file,m.page))??[],u=k.get(p(m.file,m.page+1))??[],z=w(t,u),A=u.find(a=>!s(a.text)&&i(a.text)!==z);if(!A)continue;let B=h.findIndex((b,c)=>c>a&&b.file===m.file&&b.sourceSpans?.[0]&&v(A,b.sourceSpans[0],"start")&&q(b.sourceSpans[0])===A.page);if(B<0)continue;let C=h[B],D=C.nativeTableRow,E=D&&1===D.row&&D.cells.slice(0,-1).every(a=>!i(a))&&C.sourceSpans?.[0]&&n(D,C.sourceSpans[0])?D:void 0;if(!x(m,A,t,u,E)||!E&&(C.clauseNo||C.sourceSpans?.[0]?.logicalBoundaryBefore||/^[^::,,。;;“”"'()()]{1,40}[::]/u.test(A.text)||d&&!d(c,C)))continue;let F=a=>a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let b=a.trim(),c=j(b),d=i(b.replace(/^#{1,6}\s+/u,""));return/^#{1,6}\s+(?:PDF 第\s*\d+\s*页|PDF 原生网格表格区域|-?\d+-?)$/u.test(b)||s(d)||!!z&&d===z||!!E&&"|"===b||!!c&&(c.every(a=>/^:?-{3,}:?$/u.test(a))||c.every((a,b)=>a===`列${b+1}`)||!!z&&i(c.join(""))===z)});if(h.slice(a+1,B).some(a=>!F(a.sourceSpans?.map(a=>a.rawText).join("\n")??a.text))||e.slice(l+1).some(a=>!F(a.rawText)))continue;let G=h[B],H=G.sourceSpans?.[0],I=e.at(-1);if(!H||!I||void 0===H.chunkIndex||void 0===I.chunkIndex||H.chunkIndex<I.chunkIndex)continue;let J=b.filter(a=>a.file===m.file&&a.chunkIndex>I.chunkIndex&&a.chunkIndex<H.chunkIndex).sort((a,b)=>a.chunkIndex-b.chunkIndex);if(J.length!==Math.max(0,H.chunkIndex-I.chunkIndex-1))continue;let K=b.find(a=>a.file===m.file&&a.chunkIndex===I.chunkIndex),L=b.find(a=>a.file===m.file&&a.chunkIndex===H.chunkIndex);if(!K||!L)continue;let M=I.chunkIndex===H.chunkIndex?[{chunk:K,start:I.end,end:H.start}]:[{chunk:K,start:I.end,end:K.text.length},...J.map(a=>({chunk:a,start:0,end:a.text.length})),{chunk:L,start:0,end:H.start}];if(M.some(a=>a.end<a.start||!F(a.chunk.text.slice(a.start,a.end))))continue;let N=M.filter(a=>a.chunk.text.slice(a.start,a.end).trim()).map(({chunk:a,start:b,end:c})=>({file:m.file,chunkIndex:a.chunkIndex,section:"PDF普通页间原始布局",chunkSha256:a.sha256,sourceStartChar:a.startChar,sourceEndChar:a.endChar,start:b,end:c,rawText:a.text.slice(b,c),text:a.text.slice(b,c)})),O=[...e.slice(l),...N,H],P=[],Q=!0,R=I.chunkIndex===H.chunkIndex;for(let a=1;a<O.length;a++){let b=O[a-1],c=O[a];if(b.chunkIndex!==c.chunkIndex||R){if(void 0===b.chunkIndex||void 0===c.chunkIndex||c.chunkIndex<b.chunkIndex||c.chunkIndex>b.chunkIndex+1||b.chunkIndex===c.chunkIndex&&(b.chunkSha256!==c.chunkSha256||b.end>c.start)){Q=!1;break}P.push({fromChunkIndex:b.chunkIndex,toChunkIndex:c.chunkIndex,fromChunkSha256:b.chunkSha256,toChunkSha256:c.chunkSha256,fromEnd:b.end,toStart:c.start})}}if(!Q)continue;let S={version:"native-text-page-bridge-v1",file:m.file,sourceSha256:m.sourceSha256,nativeProofSha256:m.nativeProofSha256,from:m,to:A,fromPageLines:t,toPageLines:u,...E?{toGridRow:E}:{},...z?{repeatedHeader:z}:{},fromSpanSha256:o([O[0]]),toSpanSha256:o([O.at(-1)]),spansSha256:o(O),transitions:P},T={...S,witnessSha256:g(S)};if(R&&O.slice(1,-1).some(a=>!y(a.rawText,T)))continue;let U=[...N,H],V=[...e,...U.map((a,b)=>R||a.chunkIndex!==(b?U[b-1]:I).chunkIndex?{...a,sourceNativeTextBridgeBefore:T}:a),...G.sourceSpans.slice(1)];h.splice(a,B-a+1,{...c,text:V.map(a=>a.text).join("\n"),sourceSpans:V,sourceSpansSha256:(0,f.y)(V)}),a--}return h}},45455:(a,b,c)=>{c.d(b,{Bj:()=>j,xj:()=>i});var d=c(77598);let e=new Set(["decisionId","requestId","toolCallId","capturedAt","recordedAt","startedAt","endedAt","finishedAt","elapsedMs","durMs","queryTimeMs"]);function f(a){return Array.isArray(a)?a.map(f):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).filter(([a])=>!e.has(a)).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,f(b)])):a}let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(f(a))).digest("hex"),h=a=>a&&"object"==typeof a&&!Array.isArray(a)?a:void 0;function i(a){return a.flatMap(a=>{let b=h(a.data);if(!a.ok||!b)return[];let c=h(b.directoryState);if("query_cad_context"===a.toolName&&["frames","instances"].includes(String(b.kind))&&c?.scope==="indexed-cad-directory"&&!0===c.complete&&0===c.recordCount&&"string"==typeof b.parsedIdentity&&"string"==typeof b.filePath)return[g(["empty-cad-directory",b.projectSnapshotId,b.filePath,b.parsedIdentity,b.kind])];if("ask_chief"===a.toolName){if("model"!==b.source)return[];let a=Object.fromEntries(("use-facts"===b.action?["factIds"]:"use-sources"===b.action?["sourceIds"]:"engineering-controls"===b.action?["controls","writingControls"]:"qualitative-controls"===b.action?["qualitativeControls"]:[]).filter(a=>Array.isArray(b[a])&&b[a].length>0).map(a=>[a,b[a]]));return Object.keys(a).length?[g(["chief-decision",b.taskId,b.action,a])]:[]}let d=Object.fromEntries(("query_construction_plan"===a.toolName?["activities","plannedResources","numbers","materials"]:"query_project_facts"===a.toolName?["candidates","sourceEvidence"]:"query_cad_context"===a.toolName?["records"]:"query_source_units"===a.toolName?["units"]:"read_source"===a.toolName?["chunks"]:["search_evidence","query_work_packages","discover_files"].includes(a.toolName)?["items"]:"list_skills"===a.toolName?["skills"]:"match_skills"===a.toolName?["matched"]:[]).flatMap(c=>{if(!Array.isArray(b[c]))return[];let d=b[c].filter(b=>{let c=h(f(b));return!!c&&!!Object.keys(c).length&&("read_source"!==a.toolName&&"search_evidence"!==a.toolName||"string"==typeof c.content&&!!c.content.trim())}),e="search_evidence"===a.toolName?d.map(a=>Object.fromEntries(Object.entries(h(a)).filter(([a])=>!["score","rank","retrievalRank","retrievalScore"].includes(a)))):d;return e.length?[[c,e]]:[]}));"load_skill"===a.toolName&&h(b.skill)&&(d.skill=b.skill);let e=Object.fromEntries(["snapshotId","projectSnapshotId","contractId",..."query_construction_plan"===a.toolName?["id"]:[],"filePath","relativePath","parsedIdentity","sceneVersion","kind","frameId","rootInstanceId","units","metadata","sourceVersionEligibility"].filter(a=>void 0!==b[a]).map(c=>[c,"metadata"===c&&"read_source"===a.toolName&&h(b[c])?Object.fromEntries(Object.entries(h(b[c])).filter(([a])=>!["mtime","indexedAt"].includes(a))):b[c]])),i=Object.entries(d).flatMap(([c,d])=>(Array.isArray(d)?d:[d]).map(d=>{let f=h(d);if("query_project_facts"===a.toolName&&f?.factId&&"verified-source-excerpt"!==f.roleId)return g(["project-fact",b.snapshotId??b.projectSnapshotId,f.factId,f.value,f.controlContext??null,h(f.sourceVersionEligibility)?.status??null]);if("query_project_facts"===a.toolName&&f&&(f.sourceEvidenceId||"verified-source-excerpt"===f.roleId))return g(["source-excerpt",b.snapshotId??b.projectSnapshotId,f.sourceEvidenceId??f.factId,f.value]);let i="query_construction_plan"===a.toolName&&"numbers"===c&&f?Object.fromEntries(Object.entries(f).filter(([a])=>"basisId"!==a)):d;return g(["source-material",a.toolName,e,c,i])}));return Number.isSafeInteger(b.offset)&&Number.isSafeInteger(b.nextOffset)&&Number(b.nextOffset)>Number(b.offset)&&i.push(g(["source-cursor",a.toolName,e,{offset:b.offset,nextOffset:b.nextOffset}])),i})}async function j(a){let b,{budget:c}=a,e=[...a.initialMessages],f=0,h=0,j="模型未产出可用正文",k="turns-exhausted",l=new Set(i(a.initialEvidence??[])),m=new Set,n=0;for(let o=1;void 0===c.maxTurnsPerBlock||o<=c.maxTurnsPerBlock;o+=1){if(void 0!==c.maxToolCallsPerBlock&&f>=c.maxToolCallsPerBlock){j=`显式工具调用预算耗尽(${f}/${c.maxToolCallsPerBlock})`,k="tool-budget-exhausted";break}let p=await a.runTurn({system:a.system,messages:e,turn:o,...void 0!==c.maxToolCallsPerBlock?{toolCallLimit:Math.max(0,c.maxToolCallsPerBlock-f)}:{}});if(h=o,f+=p.toolCalls.length,p.refused)return a.onTurn?.({turn:o,residual:b?.residual??0,toolCalls:f,action:"unfixable"}),b?{kind:"unfixable",content:b.content,turn:o,residual:b.residual,toolCalls:f,reason:p.refused.message,issues:[],cause:"budget-refused"}:{kind:"budget_refused",turn:o,reason:p.refused.message,refused:p.refused};let q=i(p.toolResults??[]);p.protocolRecovery?.sentOutputBudget!==null&&p.protocolRecovery?.sentOutputBudget!==void 0&&q.push(g(["protocol-recovery",p.protocolRecovery.sentOutputBudget]));let r=q.some(a=>!l.has(a));q.forEach(a=>l.add(a)),r&&(n=0);let s=p.committed||p.text;if(s?.trim()){let c=await a.check(s),g=c.issues.filter(a=>"error"===a.level||"blocker"===a.severity).length;if(c.degraded.length>0&&!c.executed.length)return a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"unfixable"}),{kind:"unfixable",content:s,turn:o,residual:g,toolCalls:f,reason:`自查维度全部降级(${c.degraded.join("、")}),本块未做自查,保留当前草稿`,issues:c.issues,cause:"checks-degraded"};if(0===g&&!c.degraded.length)return a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"commit"}),{kind:"passed",content:s,turn:o,residual:g,toolCalls:f};let h=(0,d.createHash)("sha256").update(JSON.stringify([s,c])).digest("hex"),i=m.has(h);if(m.add(h),(!b||g<b.residual)&&(b={content:s,residual:g}),i&&!r){j="相同候选与裁决重复,未取得新证据或改善",k="no-progress";break}a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"regenerate"}),e=[...e,...p.toolMessages??[],{role:"assistant",content:s},{role:"user",content:function(a){let b=a.filter(a=>"error"===a.level||"blocker"===a.severity),c=b.slice(0,12).map((a,b)=>`${b+1}. ${a.detectorId?`[${a.detectorId}] `:""}${a.message}`),d=b.slice(12),e=new Map;for(let a of d){let b=a.detectorId||"(未标注判据)";e.set(b,(e.get(b)||0)+1)}return["【自查裁决】本稿未通过判据,下列问题必须修正后重新输出完整本节正文:",...c,d.length>0?`${d.length} 条未逐条列出,按判据分布:${[...e.entries()].map(([a,b])=>`${a} ${b} 条`).join("、")}`:"","修正要求:直接输出修正后的**完整**本节正文(不要只输出改动片段、不要解说改动过程);保留原有事实、数值与结论,不得以删除内容的方式规避问题。"].filter(Boolean).join("\n")}(c.issues)}];continue}let t=p.toolMessages??[];if(r)e=[...e,...t];else{let a=++n;if(a>=3){j="相同无进展状态在具体反馈后仍未取得新证据、游标或主控决定",k="no-progress";break}e=[...e,...t,{role:"user",content:1===a?"本轮没有新增可用来源、分页游标或已接受的主控决定。原始工具回执已保留;空结果或失败不证明资料缺失,也不能用改查询词、调用ID或再报缺来冒充进展。请依据已取得的资料换用有实际依据的工具/继续真实nextOffset,或向已接线的主控说明具体对象、已查范围与失败;若仍无法核定,保留真实decisionRequests并提交已能完成的正文,不编造参数或条件。":"再次没有新增证据。立即停止重复取证:把已能完成的正文按协议提交(未决事项写入decisionRequests保留),拟定配置按工程经验带依据给出(正文标“拟定”并登记plannedNumbers);继续同类工具调用不会产生新证据。"}]}void 0!==c.maxTurnsPerBlock&&o>=c.maxTurnsPerBlock&&(j="显式轮次预算耗尽,模型尚未提交正文")}return b?(a.onTurn?.({turn:h,residual:b.residual,toolCalls:f,action:"unfixable"}),{kind:"unfixable",content:b.content,turn:h,residual:b.residual,toolCalls:f,reason:j,issues:[],cause:k}):{kind:"no_content",turn:h,toolCalls:f,reason:j,cause:k}}},47262:(a,b,c)=>{function d(a){let b=e()?.semanticFingerprints?.[a];return"string"==typeof b&&/^[a-f0-9]{64}$/u.test(b)?b:void 0}function e(){let a='{"version":1,"sourceFingerprint":"36956db6655c7ce7a67c9b6862b2ca1b6b5308f268b5595d430facff6c0f4152","semanticFingerprints":{"projectFacts":"6f372f4cec3e4a9138ebf95525ccbc825ce69d19b6e24706492fee1a8e595fdd","documentGeneration":"61493fb15152bc31cbc3aeca7fdd5c27ac6cb2b0948ba96557d7159931014e14"},"gitCommit":"b96422a199d83cf56f96a5e0f8ed2254ebd711f8","serverVersion":"4.60.11","sourceFiles":724,"capturedAt":"2026-10-13T05:38:11.442Z"}';if(a)try{let b=JSON.parse(a);if(1!==b.version||!/^[a-f0-9]{64}$/u.test(b.sourceFingerprint??"")||"string"!=typeof b.serverVersion||"number"!=typeof b.sourceFiles||"string"!=typeof b.capturedAt||null!==b.gitCommit&&"string"!=typeof b.gitCommit)return;return b}catch{return}}c.d(b,{C:()=>d,S:()=>e})},48825:(a,b,c)=>{c.d(b,{Jf:()=>j,V2:()=>i,bp:()=>d,wJ:()=>e});let d="professional-writing-guidance-v4-responsibility-titles-2026-10-13",e={building:{fileName:"施工组织设计章节写作分析与编制规范(建筑).docx",sha256:"9313607509897e9a252cdefd671c4c72025d2727411972788bfa61b9835a0ff2",pages:12},municipal:{fileName:"施工组织设计章节写作分析与编制规范(市政).docx",sha256:"8e36d97e7084464ab04776093550e10984d3ac4a2a64ac37d5ca74a13a3ccc82",pages:13},bidWriting:{fileName:"技术标写作指南(合肥AI评标).docx",sha256:"3f36e67531da8ac9ffb1847694403ec4246457e445612767b3a82acf02894d0e"},bidReview:{fileName:"青天大模型AI评标规则考证(2026-10-11).docx",sha256:"de976918a1a0f1486cb07e1c2fd4a72a3b86fa480cbd46353f4c1af372badc69"}},f=["先形成工程对象、工作包、部署、资源及时间的共同推演,再按交付目录组织成文。事实、数量、工作面、部位、班组、节点在各章共用稳定身份,作者不各自编数字。","功能职责不等于固定章节:概况解释条件与影响,部署决定空间和顺序,方法说明实施,质量说明检查,安全说明风险与处置,进度说明时间,平面说明现场组织,移交说明最终闭环。推荐母目录不覆盖招标或用户锁定结构。","工作包数量与方法连通,方法与资源连通,资源与工期迭代校核;材料到货早于使用,检测和必要等待进入转序与时间逻辑。同一机械或班组同期不能在不同工作面重复占用。","施工方法、部署、真正重难点与进度应充分展开;人材机重点算准,管理计划重点完成执行闭环,概况与编制依据保持准确简洁。详略按职责和风险,不按统一字数、参数密度或固定图表数量。","表格按真实数据形态选择:单项目多属性用“信息项—内容”纵向或按属性含义分组;多对象在相同指标下比较、配置或排程时才横向展开。字段宽度应容纳完整对象、控制数值和单位,不能把大量无比较目的的属性铺成十几列单行,或把长范围原文挤进窄格。真实阶段或对象矩阵需要宽表时保留全部字段与对应关系,按职责合理分组,不设置固定列数上限、不强制各章制表,不删表行、数值或对象迎合评价。","项目事实依据与技术规范依据分别治理;前者确定实际工程,后者核验控制与验收。核验规范编号、名称、实施日期、状态、替代及局部废止和对象范围;参考文件列出的编号不等于本次已验证有效。","计算、产能假设和规范查证保留内部审计,正文交付核定的配置与控制结果及必要实施条件,不堆算式和来源说明。引用规范仅限确有技术参数、验收或强制边界需要的地方。","首稿采用专业短句和必要分点:条件决定方法,动作达到可检状态,状态放行下一工序。正文工序名不以箭头串替代实施方法;实际流程图和活动网络保留其关系,图后不逐节点逐连线重复全文。","技能主题是规划参考,不是必须照抄的交付标题。主控按本工程对象及被委派职责拟定正式小节名称,避免把“候选、核验责任、适用性”这类内部判断任务直接当目录;真正承担辨识、核查职责时使用完整专业名称。专业标题说明工程对象、方法或组织职责,不拼接关键词、不照抄内部评审标签。正常技术名称重复不导致丢弃、换名或重写;同项目再次编制仍以实际条件和方案质量为准。","写作指南中的样本统计只提供观察线索,不构成评分算法;图片数、箭头数、元数据软件、标题关键词和入围差值不授予质量或真实性。项目实际要求与专业适用规则优先,不为低频统计删去必要风险和接口。"],g={building:"建筑工程按实际楼栋、楼层、流水段和专业接口组织;地下结构、主体、围护装修、机电与室外的先后和移交要一致。不能把房建通用专业强行加入实际没有的工程。",municipal:"市政按真实路线、桩号、区段和工作面组织,明确起点、推进方向、地下与地上转序;涉及社会交通时,导改、围挡、施工阶段、居民出行与施工车辆路线联动。场内便道与场外交通分开。"},h=[{id:"overview",label:"项目理解",match:/概况|项目理解|整体理解|现场条件|工程清单|专业构成/u,buildingPages:[2],municipalPages:[2],guidance:"给出事实及其对施工组织的影响,按专业呈现必要工程量;不复制设计说明、不提前展开工艺,不以无来源地质、距离或道路数据制造针对性。"},{id:"deployment",label:"总体部署",match:/总体部署|施工部署|流水段|工作面|施工区段|施工顺序/u,buildingPages:[2,3],municipalPages:[2,3],guidance:"明确区段和工作面对应哪些任务及工程量、划分理由、起点、方向、先后与穿插、专业移交条件。后续方法、资源和进度必须能从部署找到组织依据。"},{id:"difficulties",label:"重难点",match:/重难点|重点难点|项目特点|制约因素/u,buildingPages:[3,4],municipalPages:[3,4],guidance:"由真实项目证据辨识制约因素,解释原因和后果,给出技术组织、资源、检查及异常处置;只深写真正核心问题,并在相关方法、质量、安全或工期中闭合。"},{id:"method",label:"施工方法",match:/工艺|工法|施工方法|施工技术|浇筑|开挖|吊装|安装|支模/u,buildingPages:[4,5],municipalPages:[4,5],guidance:"对本节实际承担的分项写清对象和工作量、前提、顺序、步骤、材料机具工种、控制、接口、检查、异常和转序。普通工序可组织可检查,核心工序达到必要技术策划深度;不把施组全文变成专项计算书。"},{id:"materials",label:"材料供应",match:/材料|物资|永久设备|供应|采购|人材机/u,buildingPages:[5],municipalPages:[5],guidance:"数量由实际工程量或可靠换算取得,供应与工作面及使用窗口衔接;长周期构件设备串联确认、采购、到货和安装。区分施工机械与永久设备、产品标准与验收标准;不能可靠换算时不假算。"},{id:"equipment",label:"机械与仪器",match:/机械|机具|检测仪器|人材机|确保机/u,buildingPages:[5,6],municipalPages:[5,6],guidance:"关键机械以工作量、可用作业窗口、实际单机或机组能力核定数量,检查同期占用和转场。检测仪器服务实际检验。运距未知不能虚构运输循环时间;算式留审计,不抄经验台数。"},{id:"labor",label:"劳动力",match:/劳动力|班组|工种|人材机|确保人/u,buildingPages:[6,7],municipalPages:[6],guidance:"以班组、工作面、阶段和工种组织投入,核算工作量、工日和持续时间;峰值由实际同期工种矩阵求得,不能相加各专业独立峰值。配置与特种作业必须符合真实任务。"},{id:"quality",label:"质量控制",match:/质量|检验|检测|隐蔽验收|复试|样板|三检/u,buildingPages:[7],municipalPages:[6,7],guidance:"围绕真实实体写检查对象、指标、方法、适用频次、岗位、记录、不合格处置、复验和销项;合格后才转序。方法章写实施,质量章写核验,避免再抄一遍工艺。"},{id:"safety",label:"风险安全与应急",match:/危大|危险源|风险|安全|应急|专项方案|论证/u,buildingPages:[7,8],municipalPages:[7,8],guidance:"实际作业、实体参数和影响对象支撑风险与危大判定,不能靠关键词。承担现场控制时给出作业条件、停止触发、监测和处置;辨识或审核子任务只承担其边界,完整应急由被委派任务负责。"},{id:"schedule",label:"进度组织",match:/进度|工期|节点|施工计划|施工窗口|确保人|确保机/u,buildingPages:[8,9],municipalPages:[8,9],guidance:"共同任务网络连接工作量、工作面、综合能力、材料到货、必要等待、检测与转序。开始结束和搭接可复核,关键路线由逻辑计算,不将箭头示意当网络计划。进度、正文与资源共用同一时间数据。"},{id:"environment",label:"环境与外部运行",match:/文明|环境|环保|扬尘|噪声|校园秩序|交通|既有|保护/u,buildingPages:[9],municipalPages:[9],guidance:"针对实际居民、校园、生产、交通、水体或既有设施说明影响、控制、检查责任及恢复;地方措施需按属地核验,不无条件复制某城市标准。涉及既有设施先调查再分析保护监测。"},{id:"site-layout",label:"现场空间组织",match:/总平面|平面布置|临时设施|临设|运输路线|便道|便桥/u,buildingPages:[9,10],municipalPages:[9,10],guidance:"按实际场地边界和阶段部署布置物流、堆场、机具、水电排水、消防及出入口,检查真实可通行与转场条件。缺尺寸不编坐标;必要实体决定未完成时由主控解决,不用模糊正文冒充已落地。"},{id:"handover",label:"验收恢复移交",match:/竣工|移交|交付|保修|缺陷责任|退场|恢复/u,buildingPages:[10],municipalPages:[10,11],guidance:"从已施工实体与系统反推检查、调试、整改复验、资料、培训和移交。市政还核对道路、交通、绿化及临设恢复;过程隐蔽验收不重复承担整套竣工移交。"}];function i(a){let b="building"===a||"municipal"===a?g[a]:"工程类型未确认时只使用共同写作原则,不能默认套用市政或房建专业条件。";return`【编制规范萃取 ${d},是写作方法先验,不是项目事实或已核现行标准】
|
|
125
|
+
${JSON.stringify({priorRaw:l,validationFailure:m,currentSchema:n??null})}`);try{r=await D(()=>k(a,v),c.signal)}catch(a){if(c.signal?.aborted){let a=A(c.signal);throw c.outFailure&&Object.assign(c.outFailure,{value:a.message,code:C(a)}),d&&"AbortError"!==a.name&&V(c.diagnostics,a,B(a)),a}throw a}if(!r){c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r});let b=j.value?j:{value:"本次调用未返回模型内容;没有本次传输回执,不借用其他调用的故障",code:"EMPTY_OUTPUT"};c.outFailure&&Object.assign(c.outFailure,b);break}let w=al(r),x=!1;try{t=(0,e.parseJsonWithoutDuplicateKeys)(w)}catch(b){let a=b instanceof e.DuplicateJsonKeyError?b.message:function(a){let b=al(a),c=(b.match(/\{/gu)||[]).length-(b.match(/\}/gu)||[]).length,d=(b.match(/\[/gu)||[]).length-(b.match(/\]/gu)||[]).length,e=b.slice(-80).replace(/\s+/gu," ");return c>0||d>0?`JSON 被截断({ 未闭合 ${c} 个、[ 未闭合 ${d} 个),截断位置响应末段:${e}`:`JSON 语法错误,出错位置响应末段:${e}`}(w);u=`JSON 解析失败:${a}`,x=a.startsWith("JSON 被截断(")}if(!u&&c.schema){let a=[],b=am(t,c.schema,a);o=c.diagnostics,o&&0!==a.length&&(o.llm.lastInfo=`JSON Schema 超限拒收:${a.slice(0,4).map(a=>`${a.path} ${a.originalLength} 条超上限 ${a.maxItems},完整数组保留并拒收`).join(";")}`),b.length&&(u=`JSON Schema 校验失败:${b.join(";")}`)}if(!u&&c.validateProtocol){let b;try{b=c.validateProtocol(structuredClone(t))}catch(b){throw c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r}),b}b.length&&(u=`JSON 关联协议校验失败:${b.join(";")}`)}if(c.onAttempt?.({ordinal:p,system:a,prompt:v,raw:r,...u?{validationFailure:u}:{}}),(u||j.outputTruncated)&&(0,s.U5)(c.diagnostics,{system:a,prompt:v,raw:r,ordinal:p,callKind:c.callKind,validationFailure:u,outputTruncated:!!j.outputTruncated}),j.outputTruncated&&(0,q.jW)(c.diagnostics)){let a="供应商报告本次输出被截断;保留原始响应,暂停核查任务大小、实际思考及发送容量,不再次发送整包输入;默认容量截断不等于模型最大能力耗尽";c.outFailure&&Object.assign(c.outFailure,{value:a,code:"OUTPUT_TRUNCATED",outputTruncated:!0}),(0,q.wD)({nodeId:c.prefixKey??`llm:${c.callKind??"structured-generation"}`,title:c.callKind,turn:p+1,toolCalls:0,reason:a},"model-output-truncated");break}if(!u)return t;if(g=r,f=u,!function(a,b,c){if(!a)return;a.llm.schemaFailures=(a.llm.schemaFailures||0)+1,a.llm.lastError=b;let d=af(a,c);d.schemaFailures=(d.schemaFailures||0)+1}(c.diagnostics,u,c.prefixKey),(x||j.outputTruncated)&&(h=an(h)),p>=2){c.outFailure&&Object.assign(c.outFailure,{value:u,code:"JSON_VALIDATION_EXHAUSTED"});break}}}async function ap(a,b,c={}){return ao(a,b,c)}},41240:(a,b,c)=>{c.d(b,{E6:()=>f,Zw:()=>e});var d=c(76875);let e=["task","organization","labor","equipment","materials","schedule","deployment"];function f(a,b,c,g={}){let h=b.find(a=>a.id===c),i=a.tasks.find(a=>a.taskId===c);if(!h||!i)throw Error("共享工程计划查询不属于当前实际任务");let j=g.view??(/工资|实名|检验|储存|保管|安全管理|应急保障|管理制度/u.test(h.title)?"organization":h.contentTypes.includes("schedule")||/工期|进度|网络计划/u.test(h.title)?"schedule":/劳动力|工种|班组配置/u.test(h.title)?"labor":/机械|机具|设备配置/u.test(h.title)?"equipment":/材料|物资/u.test(h.title)?"materials":/部署|总体安排|组织安排/u.test(h.title)?"deployment":"task");if(!e.includes(j))throw Error("共享工程计划查询视图无效");if(g.activityIds&&(!Array.isArray(g.activityIds)||!g.activityIds.length||g.activityIds.some(b=>!a.production.activities.some(a=>a.input.id===b))))throw Error("须使用共享计划目录中的真实活动身份");let k=a.production.activities.filter(b=>g.activityIds?g.activityIds.includes(b.input.id):"task"!==j||b.input.taskIndices.some(b=>a.tasks[b]?.taskId===c)),l=new Set(k.map(a=>a.input.id)),m=a.production.plannedResources.filter(a=>l.has(a.activityId)),n=[],o=new Map,p=(0,d.wp)(a.production,b.map(a=>a.id)).filter(a=>(!a.activityId||l.has(a.activityId))&&("task"===j||"organization"===j||"materials"===j?"task"===j:"window"===a.purpose||"organization"===a.purpose||a.purpose===j||"deployment"===j&&!a.activityId)).map(({taskIds:a,inputMemberIds:b,objectScope:c,basis:d,...e})=>{let f=o.get(d);return f||(f=`basis-${n.length}`,o.set(d,f),n.push({id:f,text:d})),{...e,basisId:f,...!e.activityId?{objectScope:c}:{}}}),q=k.map(a=>{if("task"===j)return a;let{input:b,status:c,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,timeWindow:i,workTimeWindow:k,critical:l,floatDays:m}=a,n={id:b.id,phaseId:b.phaseId,objectScope:b.objectScope,workfront:b.workfront,status:c};return"organization"===j||"materials"===j?n:{...n,predecessors:b.predecessors,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,timeWindow:i,workTimeWindow:k,critical:l,floatDays:m}}),r=m.map(a=>{let{activityId:b,phaseId:c,objectScope:d,workfront:e,basis:f}=a,g={activityId:b,phaseId:c,objectScope:d,workfront:e,basis:f};return"task"===j?a:"organization"===j||"materials"===j?{...g,trades:a.workers.map(a=>a.trade),equipment:a.equipment.map(({name:a,spec:b})=>({name:a,spec:b}))}:"labor"===j?{...g,crewId:a.crewId,crews:a.crews,shiftsPerDay:a.shiftsPerDay,workers:a.workers,countMeaning:"每日配置含不同轮班人员,非同时在岗峰值"}:"equipment"===j?{...g,crewId:a.crewId,crews:a.crews,equipment:a.equipment}:{...g,crewId:a.crewId,crews:a.crews,shiftsPerDay:a.shiftsPerDay,trades:a.workers.map(a=>a.trade),equipment:a.equipment.map(({name:a,spec:b})=>({name:a,spec:b}))}});return{id:a.id,contractId:a.contractId,projectSnapshotId:a.projectSnapshotId,phases:a.phases,activityDirectory:a.production.activities.map(({input:a})=>({id:a.id,phaseId:a.phaseId,objectScope:a.objectScope,workfront:a.workfront})),view:j,activities:q,plannedResources:r,numbers:p,bases:n,numberMeaning:"index指向同源完整数记录;活动对象见activityId对应活动,basisId见bases原文。对象与依据只存一份,不裁字;组织管理视图不要求数量。",..."schedule"===j||"deployment"===j||"task"===j?{calendar:a.production.calendar}:{},..."labor"===j?{labor:a.production.labor}:{},..."equipment"===j?{equipment:a.production.equipment}:{},..."materials"===j?{materials:a.production.materials.filter(a=>l.has(a.activityId)),materialStatus:"逐源用途记录,不等于已采用采购总量"}:{},issues:a.production.issues.filter(a=>!a.activityId||l.has(a.activityId)),scope:{taskId:c,activityIds:[...l],completeSelectedView:!0},task:i,interfaces:a.tasks.filter(a=>a.taskId!==c&&a.phaseIds.some(a=>i.phaseIds.includes(a))).map(({taskId:a,objectScope:b,boundary:c,handoffs:d})=>({taskId:a,objectScope:b,boundary:c,handoffs:d}))}}},42948:(a,b,c)=>{c.d(b,{Fr:()=>k,HM:()=>l,Hf:()=>n,tv:()=>m,wE:()=>o,yW:()=>p});var d=c(73024),e=c.n(d),f=c(76760),g=c.n(f),h=c(77598);let i=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u,j=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function k(a,b){return b?`run:${b}:${a}`:a}function l(a,b,c){if(!j.test(b))throw Error("非法运行资产文件名");if(void 0!==c&&!i.test(c))throw Error("非法运行 ID");return c?g().join(a,"runs",c,"artifacts",b):g().join(a,"assets",b)}function m(a,b,c,d){let f=l(a,b,d),i=JSON.stringify(c);if(void 0===i)throw Error("运行资产不能是 undefined");e().mkdirSync(g().dirname(f),{recursive:!0});let j=`${f}.${(0,h.randomUUID)()}.tmp`;e().writeFileSync(j,i,{encoding:"utf8",flag:"wx"});try{if(d)try{e().linkSync(j,f)}catch(a){if("EEXIST"!==a.code)throw a;if(e().readFileSync(f,"utf8")!==i)throw Error(`运行资产已存在且内容不同:${d}/${b}`,{cause:a})}else e().renameSync(j,f)}finally{e().rmSync(j,{force:!0})}return{assetPath:f,bytes:Buffer.byteLength(i),sha256:(0,h.createHash)("sha256").update(i).digest("hex")}}function n(a){if(!a.runId)throw Error("实时模型进度必须绑定当前运行 ID");let b=l(a.generatedDir,"llm-live-progress.json",a.runId),c=JSON.stringify({...a.snapshot,version:1,runId:a.runId,documentId:a.documentId});e().mkdirSync(g().dirname(b),{recursive:!0});let d=`${b}.${(0,h.randomUUID)()}.tmp`;e().writeFileSync(d,c,{encoding:"utf8",flag:"wx"});try{e().renameSync(d,b)}finally{e().rmSync(d,{force:!0})}}function o(a,b){return b?[["run-start","run-start.json","本轮启动身份"],["run-inputs","run-inputs.json","本轮已准备输入快照"],["project-model","project-model.json","本轮写作与终检共用的项目事实快照"],["tender-requirements","tender-requirements.json","本轮原始招标条款、技术职责拆分、商务归宿及未裁决台账"],["document-contract","document-contract.json","本轮写作前冻结的职责、义务与七维评价合同"],["contract-ownership-plan","contract-ownership-plan.json","主控逐项确认事实、表格与交付义务的唯一主要责任小节"],["content-type-plan","content-type-plan.json","本轮主控对各节具体内容职责与适用类型的确认回执"],["contract-quality","contract-quality.json","本轮固定合同、项目快照和正文版本的七维评价回执"],["writing-task-hierarchy","writing-task-hierarchy.json","锁定交付小节与专业作者子任务之间的固定层级"],["chapter-writing-structures","chapter-writing-structures.json","本轮作者任务开始前的固定结构和内容职责"],["author-task-executions","author-task-executions.json","实际作者实例、委派任务、完整输入身份、执行终态与共用章节预算"],["author-accounting-final","author-accounting-final.json","同一合同跨续跑累计的调用、token、成本与章节预算消耗"],["author-candidates","author-candidates.json","本轮工具执行、自检、清理及重试前的原始模型返回索引"],["document-token-anomaly","document-token-anomaly.json","本轮无有效进展的重复模型消费与整份暂停回执;缺usage和供应商结算保持未知"],["document-model-final","document-model-final.json","本轮统一文档模型的最终版本与全部累计修改记录"],["contract-quality-c0","contract-quality-c0.json","固定首稿的完整七维评价,后续修改不能覆盖"],["contract-light-repair","contract-light-repair.json","统一预算内轻修的预检、提交结果与首稿通过读数"],["document-model-author","document-model-author.json","本轮固定任务的结构化作者模型、初始候选与累计修改账"],["blueprint","blueprint.json","本轮写作蓝图"],["requirement-assignments","requirement-assignments.json","本轮要求责任分配"],["structure-assignments","structure-assignments.json","本轮呈现要求分配"],["before-global-review","before-global-review.json","全文审查前章节快照(含章内重试,不等于原始首稿)"],["before-finalize","before-finalize.json","收口前章节快照"],["final-document","final-document.json","本轮最终内容快照"],["run-summary","run-summary.json","本轮阶段墙钟、调用用途与历史评分读数"]].flatMap(([c,d,f])=>{let g=l(a,d,b);if(!e().existsSync(g))return[];let i=(0,h.createHash)("sha256").update(e().readFileSync(g)).digest("hex");return[{id:k(c,b),artifactKind:c,type:"file",role:"attachment",path:g,sha256:i,runId:b,status:"generated",message:f}]}):[]}function p(a){if(!a.runId)return;let b=a.chapters.map(a=>({id:a.id,title:a.title,content:a.content,contentHash:(0,h.createHash)("sha256").update(a.content).digest("hex")}));m(a.generatedDir,`${a.stage}.json`,{version:1,runId:a.runId,documentId:a.documentId??null,stage:a.stage,capturedAt:Date.now(),chapters:b,...void 0!==a.markdown?{markdown:a.markdown}:{},rawFirstCandidate:!1},a.runId)}},43255:(a,b,c)=>{c.d(b,{X4:()=>j,Yn:()=>i});var d=c(77598),e=c(16646),f=c(55422);function g(a,b){let c=a.trim();if(/^其他$|^其他工程$/u.test(c)){let a=b.map(a=>a.name);return a.some(a=>/彩绘|护栏|围栏|小品|标识|标牌|墙面|整治/u.test(a))?"环境整治工程":a.some(a=>/绿化|栽植|铺装|种植/u.test(a))?"景观附属工程":a.some(a=>/拆除|清理|清淤|清运/u.test(a))?"清理整治工程":"零星工程"}return/^其他装饰/u.test(c)?"零星装饰工程":/^措施项目$/u.test(c)?b.map(a=>a.name).some(a=>/化粪池|吊装|安装/u.test(a))?"模板、脚手架及化粪池安装工程":"模板与脚手架工程":/墙[、,]?柱面装饰/u.test(c)?b.some(a=>/幕墙|隔断/u.test(a.name))?c:"墙柱面装饰工程":c}function h(a,b,c=!1){let d=new Map;for(let b of a.entries){if(!b.section)continue;let a=c?JSON.stringify([b.sourceFile,b.villageGroup,b.section]):b.section,e=d.get(a)||[];e.push(b),d.set(a,e)}let e=[],f=0;for(let a of d.values()){let c=g(a[0].section,a),d=a.some(a=>"unit-project"===a.sectionKind),h=[];if(d){let b=new Map;for(let d of a){let a=d.subsection||c,e=b.get(a)||[];e.push(d),b.set(a,e)}for(let[a,c]of b)h.push(k(g(a,c),c))}else h.push(k(c,a));f+=1,e.push({id:`${b}.${f}`,title:c,requiredParams:h.flatMap(a=>Object.keys(a.quantities).slice(0,5).map(a=>({path:`data.quantities.${a}`,mode:"must_cite",strict:!0}))),tablePlans:[],workPackages:h})}return e}function i(a){let{chapterTitles:b,boq:c}=a,d=b.map((b,d)=>{var e;let f=String(d+1),g=/主要分部分项|施工方案|施工方法/u.test(b)?h(c,f):[];return{id:f,title:b,isActive:(e=a.docType,!(/专项施工方案|专项方案|危大/u.test(e)&&/总平面|平面布置|施工部署|总体部署/u.test(b))),requiredParams:[],subSections:g}}),e=h(c,"project",!0).flatMap(a=>a.workPackages),f=c.entries.filter(a=>!a.section);return f.length&&e.push(k("未分部清单记录",f)),{chapters:d,projectWorkPackages:e}}function j(a){return(0,d.createHash)("sha256").update(JSON.stringify([a.sourceFile,a.villageGroup,a.section,a.subsection,a.seq,a.code,a.name,a.description,a.unit,a.quantity,a.chunkIndex])).digest("hex")}function k(a,b){let c=[...b].sort((a,b)=>a.seq-b.seq),d={},g=new Map;for(let a of c){if(!a.name)continue;let b=g.get(a.name)??new Map;b.set(a.unit,(b.get(a.unit)??0)+a.quantity),g.set(a.name,b)}for(let[a,b]of g)for(let[c,e]of b)d[b.size>1?`${a}(${c||"未注明单位"})`:a]={value:Math.round(1e3*e)/1e3,unit:c};let h=[...new Set(c.map(a=>a.name).filter(Boolean))],i=(0,f.lh)(c),k=[],l=new Set;for(let a of c){for(let b of(0,f.QU)(a.description)){let a=`${b.key}=${b.value}`;if(!l.has(a)&&(l.add(a),k.push({key:b.key,value:b.value,source:"boq"}),k.length>=24))break}if(k.length>=24)break}let m=[];for(let a of c)for(let b of(0,f.QU)(a.description))/压实|试验|检测|验收|闭水|合格/u.test(`${b.key}${b.value}`)&&m.length<12&&!m.includes(b.value)&&m.push(b.value);let n=(0,e.cn)(c.map(a=>a.name)),o=[];for(let a of(0===m.length&&n.length>0&&m.push(...n[0].acceptance.slice(0,6).map(a=>`${a}(知识卡)`)),n.slice(0,2)))for(let b of a.standards)o.includes(b)||o.push(b);return{name:a,kind:"major",quantities:d,objectNames:h,methods:i,params:k,acceptance:m,standards:o,source:"boq",coveredSeqs:c.map(a=>a.seq),members:c.map(a=>({id:j(a),entry:{...a}}))}}},43967:(a,b,c)=>{c.d(b,{b:()=>g,jF:()=>h});let d=globalThis,e=d.__customizeStorageMaintenance??={active:!1};d.__customizeStorageApiWriters??=new Set;class f extends Error{constructor(){super("系统清空正在执行,暂不接收新的存储访问"),this.name="StorageMaintenanceError"}}function g(){return e.active}function h(){if(e.active)throw new f}},44616:(a,b,c)=>{c.d(b,{bV:()=>f,lu:()=>h,mk:()=>g});var d=c(63327);let e=new WeakMap;function f(a){let b=e.get(a);if(!b){let c=[...a.facts,...a.sourceControls??[]],f=[...new Set(c.filter(a=>"verified-source-excerpt"!==a.roleId).map(d.vg))].sort(),g=[...new Set(c.filter(a=>"verified-source-excerpt"===a.roleId).map(d.vg))].sort();b={facts:f,sources:g,factIndices:new Map(f.map((a,b)=>[a,b])),sourceIndices:new Map(g.map((a,b)=>[a,b]))},e.set(a,b)}return b}function g(a,b,c){let d=f(a);return{...b&&d.factIndices.has(b)?{factIndex:d.factIndices.get(b)}:{},...c&&d.sourceIndices.has(c)?{sourceIndex:d.sourceIndices.get(c)}:{}}}function h(a,b,c){let d="fact"===b?f(a).facts:f(a).sources;if(!Number.isSafeInteger(c)||0>Number(c)||Number(c)>=d.length)throw Error(`${"fact"===b?"属性":"原文"}引用序号不属于当前冻结项目`);return d[Number(c)]}},44736:(a,b,c)=>{c.d(b,{FP:()=>q,H0:()=>k,U2:()=>j,_e:()=>z,eb:()=>A,fN:()=>m,hg:()=>l,oN:()=>r});var d=c(77598),e=c(19898),f=c(70247);let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),h=a=>{let{rowSha256:b,...c}=a;return b===g(c)},i=a=>a.replace(/\s/gu,"");function j(a){let b=a.trim();if(!b.startsWith("|")||!b.endsWith("|"))return;let c=[],d="",e=!1;for(let a=1;a<b.length-1;a++){let f=b[a];"|"!==f||e?d+=f:(c.push(d.trim()),d=""),e="\\"===f&&!e}return c.push(d.trim()),c.length>=2?c:void 0}function k(a){let b=a[0]?.trim()??"";return/^(?:\d{1,3}(?:[..]\d{1,3}){1,4}|第[零一二三四五六七八九十百千\d]+[条款项])$/u.test(b)?b:void 0}function l(a,b,c){let{sha256:d,...f}=a;if("tender-native-file-proof-v1"!==a.version||a.file!==b||a.sourceChunkCount!==c||a.nativeLayoutVersion!==e.PDF_NATIVE_LAYOUT_VERSION||!/^[a-f0-9]{64}$/u.test(a.sourceSha256)||!/^[a-f0-9]{64}$/u.test(a.metadataSha256)||d!==g(f))throw Error("原生PDF表格文件证据身份不一致");return a.pages.flatMap(c=>{if(c.glyphSha256!==g(c.glyphs))throw Error("原生PDF字形回执不属于实际文件");if("fallback"===c.strategy)return[];if("ruled-cells"!==c.strategy)throw Error("原生PDF页面没有明确layout策略");let d=new Map(c.glyphs.map(a=>[a.id,a])),e=new Map,f=new Map;for(let a of c.cells){if(!Number.isSafeInteger(a.columnIndex)||a.columnIndex<0||!Number.isSafeInteger(a.columnSpan)||a.columnSpan<1||4!==a.bounds.length||!a.bounds.every(Number.isFinite)||a.bounds[0]>=a.bounds[2]||a.bounds[1]>=a.bounds[3])throw Error("原生表格物理合并单元格身份无效");for(let[b,c]of[[a.columnIndex,a.bounds[0]],[a.columnIndex+a.columnSpan,a.bounds[2]]]){let a=f.get(b);if(void 0!==a&&Math.abs(a-c)>1.5)throw Error("原生表格逻辑列与物理边界不一致");f.set(b,c)}let b=`${a.bounds[1]}:${a.bounds[3]}`;e.set(b,[...e.get(b)??[],a])}let h=[...e.values()].sort((a,b)=>b[0].bounds[3]-a[0].bounds[3]),i=Math.max(...c.cells.map(a=>a.columnIndex+a.columnSpan)),j=h.map(a=>{let b=Array(i).fill(""),c=0,e;for(let f of a.sort((a,b)=>a.columnIndex-b.columnIndex)){if(f.columnIndex!==c||void 0!==e&&Math.abs(f.bounds[0]-e)>1.5)throw Error("原生表格列范围重叠或缺失");c+=f.columnSpan,e=f.bounds[2],b[f.columnIndex]=f.glyphIds.map(a=>{let b=d.get(a);if(!b)throw Error("原生表格字形ID缺失");return b}).sort((a,b)=>2>=Math.abs(a.y-b.y)?a.x-b.x:b.y-a.y).map(a=>a.str).join("").replace(/\|/gu,"\\|")}if(c!==i)throw Error("原生表格列范围不完整");return b}),k=j[0]??[];return j.map((d,e)=>{let f={file:b,sourceSha256:a.sourceSha256,nativeProofSha256:a.sha256,page:c.page,row:e,rowCount:j.length,cells:d,bounds:h[e].map(a=>a.bounds),physicalCells:h[e],headers:k};return{...f,rowSha256:g(f)}})})}function m(a,b,c){let d=a.filter(a=>(void 0===c||a.page===c)&&a.cells.length===b.length&&a.cells.every((a,c)=>i(a)===i(b[c])));return 1===d.length?d[0]:void 0}let n=(a,b)=>{let c=j(b.rawText);return b.file===a.file&&!!c&&c.length===a.cells.length&&c.every((b,c)=>i(b)===i(a.cells[c]))},o=a=>(0,f.y)(a.map(({sourceGapBefore:a,sourceTableBridgeBefore:b,sourceNativeTextBridgeBefore:c,...d})=>d));function p(a,b){return h(a)&&h(b)&&a.file===b.file&&a.sourceSha256===b.sourceSha256&&a.nativeProofSha256===b.nativeProofSha256&&b.page===a.page+1&&a.row===a.rowCount-1&&1===b.row&&a.cells.length===b.cells.length&&a.cells.length>=2&&a.bounds.length===a.cells.length&&b.bounds.length===b.cells.length&&a.physicalCells.every((a,b)=>a.columnIndex===b&&1===a.columnSpan)&&b.physicalCells.every((a,b)=>a.columnIndex===b&&1===a.columnSpan)&&a.headers.length===b.headers.length&&a.headers.every((a,c)=>i(a)===i(b.headers[c]))&&a.bounds.every((a,c)=>1.5>Math.abs(a[0]-b.bounds[c][0])&&1.5>Math.abs(a[2]-b.bounds[c][2]))&&b.cells.slice(0,-1).every(a=>!i(a))&&!!i(b.cells.at(-1)??"")&&!!i(a.cells.at(-1)??"")&&!/[。!?!?;;][))】」》”’"']*$/u.test(a.cells.at(-1).trim())}function q(a,b,c,d){let{witnessSha256:e,...f}=a,h=d.flatMap((b,c)=>o([b])===a.fromSpanSha256?[c]:[]),i=d.flatMap((b,c)=>o([b])===a.toSpanSha256?[c]:[]),j=1===h.length&&1===i.length&&i[0]>=h[0]?d.slice(h[0],i[0]+1):[];if(!b||"native-table-page-bridge-v2"!==a.version||a.file!==c.file||a.file!==b.file||e!==g(f)||!p(a.from,a.to)||!j[0]||!j.at(-1)||!n(a.from,j[0])||!n(a.to,j.at(-1))||a.spansSha256!==o(j)||!j.includes(b)||!j.includes(c)||!a.transitions.some(a=>a.fromChunkIndex===b.chunkIndex&&a.toChunkIndex===c.chunkIndex&&a.fromChunkSha256===b.chunkSha256&&a.toChunkSha256===c.chunkSha256&&a.fromEnd===b.end&&a.toStart===c.start))throw Error("原生表格续行与完整layout/source spans证据不一致")}function r(a,b){let c=[...a];for(let a=0;a<c.length;a++){let d,e=c[a]?.nativeTableRow;if(!e)continue;let h=c.findIndex((b,c)=>c>a&&!!b.nativeTableRow&&0!==b.nativeTableRow.row&&b.file===e.file);if(h<0)continue;let k=c[h].nativeTableRow;if(!p(e,k)||c.slice(a+1,h).some(a=>a.nativeTableRow&&(0!==a.nativeTableRow.row||a.nativeTableRow.page!==k.page||a.nativeTableRow.nativeProofSha256!==e.nativeProofSha256)))continue;let l=a=>a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let b=a.trim(),c=j(b);return/^#{1,6}\s+(?:PDF 第\s*\d+\s*页|PDF 原生网格表格区域|-?\d+-?)$/u.test(b)||"|"===b||!!c&&(c.every(a=>/^:?-{3,}:?$/u.test(a))||c.every((a,b)=>a===`列${b+1}`)||c.every((a,b)=>i(a)===i(k.headers[b]??"")))});if(c.slice(a+1,h).some(a=>!l(a.sourceSpans?.map(a=>a.rawText).join("\n")??a.text)))continue;let m=c[a],q=c[h],r=m.sourceSpans?.at(-1),s=q.sourceSpans?.[0];if(!r||!s||void 0===r.chunkIndex||void 0===s.chunkIndex)continue;let t=b.filter(a=>a.file===e.file&&a.chunkIndex>r.chunkIndex&&a.chunkIndex<s.chunkIndex).sort((a,b)=>a.chunkIndex-b.chunkIndex);if(t.length!==s.chunkIndex-r.chunkIndex-1)continue;let u=b.find(a=>a.file===e.file&&a.chunkIndex===r.chunkIndex),v=b.find(a=>a.file===e.file&&a.chunkIndex===s.chunkIndex);if(!u||!v)continue;let w=[{chunk:u,start:r.end,end:u.text.length},...t.map(a=>({chunk:a,start:0,end:a.text.length})),{chunk:v,start:0,end:s.start}];if(w.some(a=>!l(a.chunk.text.slice(a.start,a.end))))continue;let x=[r,...w.filter(a=>a.chunk.text.slice(a.start,a.end).trim()).map(({chunk:a,start:b,end:c})=>({file:e.file,chunkIndex:a.chunkIndex,section:"PDF表格页间原始布局",chunkSha256:a.sha256,sourceStartChar:a.startChar,sourceEndChar:a.endChar,start:b,end:c,rawText:a.text.slice(b,c),text:a.text.slice(b,c)})),...q.sourceSpans];try{d=function(a,b,c){if(!p(a,b)||!c[0]||!c.at(-1)||!n(a,c[0])||!n(b,c.at(-1)))throw Error("没有相邻页同表同列续行证据");let d=[];for(let a=1;a<c.length;a++){let b=c[a-1],e=c[a];if(b.chunkIndex!==e.chunkIndex){if(void 0===b.chunkIndex||e.chunkIndex!==b.chunkIndex+1)throw Error("表格续行不能跳过未保全的parse chunk");d.push({fromChunkIndex:b.chunkIndex,toChunkIndex:e.chunkIndex,fromChunkSha256:b.chunkSha256,toChunkSha256:e.chunkSha256,fromEnd:b.end,toStart:e.start})}}let e={version:"native-table-page-bridge-v2",file:a.file,sourceSha256:a.sourceSha256,nativeProofSha256:a.nativeProofSha256,from:a,to:b,fromSpanSha256:o([c[0]]),toSpanSha256:o([c.at(-1)]),spansSha256:o(c),transitions:d};return{...e,witnessSha256:g(e)}}(e,k,x)}catch{continue}let y=[...m.sourceSpans,...x.slice(1).map((a,b)=>a.chunkIndex!==x[b].chunkIndex?{...a,sourceTableBridgeBefore:d}:a)];c.splice(a,h-a+1,{...m,text:y.map(a=>a.text).join("\n"),nativeTableRow:k,sourceSpans:y,sourceSpansSha256:(0,f.y)(y)}),a--}return c}let s=a=>/^-?\d{1,4}-?$/u.test(i(a)),t=a=>{let{lineSha256:b,...c}=a;return b===g(c)};function u(a){let{sha256:b,...c}=a;if(a.nativeLayoutVersion!==e.PDF_NATIVE_LAYOUT_VERSION||b!==g(c))throw Error("原生普通页文件证据身份不一致");return a.pages.flatMap(b=>{if(b.glyphSha256!==g(b.glyphs))throw Error("原生普通页glyph指纹不一致");let c=[];for(let a of[...b.glyphs].filter(a=>a.str.trim()).sort((a,b)=>b.y-a.y||a.x-b.x)){let b=c.find(b=>Math.abs(b.y-a.y)<=Math.max(2,.45*a.height));b?b.glyphs.push(a):c.push({y:a.y,glyphs:[a]})}return c.map((d,e)=>{d.glyphs.sort((a,b)=>a.x-b.x);let f=d.glyphs.filter(a=>/[A-Za-z\p{Script=Han}]/u.test(a.str)),h={file:a.file,sourceSha256:a.sourceSha256,nativeProofSha256:a.sha256,page:b.page,pageGlyphSha256:b.glyphSha256,line:e,lineCount:c.length,text:d.glyphs.map(a=>a.str).join("").replace(/\|/gu,"\\|"),glyphIds:d.glyphs.map(a=>a.id),x:d.glyphs[0].x,xEnd:Math.max(...d.glyphs.map(a=>a.x+a.width)),y:d.y,height:Math.max(...d.glyphs.map(a=>a.height)),columnGap:d.glyphs.some((a,b)=>b>0&&a.x-d.glyphs[b-1].x-d.glyphs[b-1].width>2*Math.max(a.height,d.glyphs[b-1].height)),fontNames:[...new Set((f.length?f:d.glyphs).flatMap(a=>a.fontName?[a.fontName]:[]))].sort()};return{...h,lineSha256:g(h)}})})}let v=(a,b,c)=>{let d=(a=>{let b=j(a.rawText);if(b){if(!b.slice(0,-1).every(a=>!i(a)))return;return b.at(-1)}return a.rawText.trim().replace(/^#{1,6}\s+/u,"")})(b);if(b.file!==a.file||void 0===d)return!1;let e=i(d),f=i(a.text);return!!f&&("start"===c?e.startsWith(f):e.endsWith(f))};function w(a,b){let c=a[0],d=b[0];return c&&d&&i(c.text)===i(d.text)&&1.5>Math.abs(c.x-d.x)&&1.5>Math.abs(c.y-d.y)&&1.5>Math.abs(c.height-d.height)&&c.fontNames.join("|")===d.fontNames.join("|")?i(c.text):void 0}function x(a,b,c,d,e){let f,g=w(c,d),j=c.filter(a=>!s(a.text)&&i(a.text)!==g),k=d.filter(a=>!s(a.text)&&i(a.text)!==g),l=1.5>Math.abs(a.xEnd-b.xEnd)&&a.x>b.x&&j.some(c=>c.line<a.line&&1.5>Math.abs(c.x-b.x)&&c.fontNames.join("|")===b.fontNames.join("|")),m=1.5>Math.abs(a.x-b.x)||l,n=!!e&&h(e)&&e.file===b.file&&e.sourceSha256===b.sourceSha256&&e.nativeProofSha256===b.nativeProofSha256&&e.page===b.page&&1===e.row&&e.cells.slice(0,-1).every(a=>!i(a))&&i(e.cells.at(-1)??"").startsWith(i(b.text));return t(a)&&t(b)&&a.file===b.file&&a.sourceSha256===b.sourceSha256&&a.nativeProofSha256===b.nativeProofSha256&&b.page===a.page+1&&a.line===j.at(-1)?.line&&b.line===k[0]?.line&&m&&2>Math.abs(a.height-b.height)&&!a.columnGap&&!b.columnGap&&(n||l||!j.some(a=>a.columnGap)&&!k.some(a=>a.columnGap))&&a.fontNames.join("|")===b.fontNames.join("|")&&(f=b.text,!/^(?:第[零一二三四五六七八九十百\d]+[章条节]|[((]?[一二三四五六七八九十百\d]+[))]|[一二三四五六七八九十百\d]+[..、])/u.test(f.trim()))&&!!i(a.text)&&!!i(b.text)&&!/[。!?!?;;::][))】」》”’"']*$/u.test(a.text.trim())}function y(a,b){let c=new Set([...b.fromPageLines,...b.toPageLines].filter(a=>s(a.text)).map(a=>i(a.text)));return a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let d=a.trim(),e=i(d.replace(/^#{1,6}\s+/u,"")),f=/^#{1,6}\s+PDF 第\s*(\d+)\s*页$/u.exec(d),g=j(d);return f?Number(f[1])===b.from.page||Number(f[1])===b.to.page:!!c.has(e)||!!b.repeatedHeader&&e===b.repeatedHeader||!!b.toGridRow&&(/^#{1,6}\s+PDF 原生网格表格区域$/u.test(d)||"|"===d||!!g&&g.length===b.toGridRow.cells.length&&(g.every(a=>/^:?-{3,}:?$/u.test(a))||g.every((a,b)=>a===`列${b+1}`)||g.every((a,c)=>i(a)===i(b.toGridRow.headers[c]??""))))})}function z(a,b,c,d){let{witnessSha256:e,...f}=a,h=function(a,b){let c=b.flatMap((b,c)=>o([b])===a.fromSpanSha256?[c]:[]),d=b.flatMap((b,c)=>o([b])===a.toSpanSha256?[c]:[]);return 1===c.length&&1===d.length&&d[0]>=c[0]?b.slice(c[0],d[0]+1):[]}(a,d);if(!b||"native-text-page-bridge-v1"!==a.version||a.file!==c.file||a.file!==b.file||e!==g(f)||!t(a.from)||!t(a.to)||a.to.page!==a.from.page+1||a.from.file!==a.file||a.to.file!==a.file||!a.fromPageLines.every(t)||!a.toPageLines.every(t)||a.repeatedHeader!==w(a.fromPageLines,a.toPageLines)||!x(a.from,a.to,a.fromPageLines,a.toPageLines,a.toGridRow)||a.from.sourceSha256!==a.sourceSha256||a.to.sourceSha256!==a.sourceSha256||a.from.nativeProofSha256!==a.nativeProofSha256||a.to.nativeProofSha256!==a.nativeProofSha256||!h[0]||!h.at(-1)||!v(a.from,h[0],"end")||!v(a.to,h.at(-1),"start")||a.toGridRow&&!n(a.toGridRow,h.at(-1))||a.spansSha256!==o(h)||!function(a,b,c,d){let e=d.indexOf(b);return!(e<0)&&d[e+1]===c&&void 0!==b.chunkIndex&&void 0!==c.chunkIndex&&!(c.chunkIndex<b.chunkIndex)&&!(c.chunkIndex>b.chunkIndex+1)&&(b.chunkIndex!==c.chunkIndex||b.chunkSha256===c.chunkSha256&&!(b.end>c.start))&&a.transitions.some(a=>a.fromChunkIndex===b.chunkIndex&&a.toChunkIndex===c.chunkIndex&&a.fromChunkSha256===b.chunkSha256&&a.toChunkSha256===c.chunkSha256&&a.fromEnd===b.end&&a.toStart===c.start)}(a,b,c,h)||h[0].chunkIndex===h.at(-1).chunkIndex&&(h.some(a=>a.chunkIndex!==h[0].chunkIndex||a.chunkSha256!==h[0].chunkSha256)||h.slice(1,-1).some(b=>!y(b.rawText,a))))throw Error("原生普通页续行与实际glyph/layout/source spans证据不一致")}function A(a,b,c,d){let e=c.flatMap(u),h=[...a],k=new Map,l=new Map,m=new Map,p=(a,b)=>JSON.stringify([a,b]);for(let a of e){let b=p(a.file,a.page);k.set(b,[...k.get(b)??[],a])}for(let a of[...b].sort((a,b)=>(a.file??"").localeCompare(b.file??"")||(a.chunkIndex??-1)-(b.chunkIndex??-1))){let b=a.file??"",c=[...a.text.matchAll(/^#{1,6}\s+PDF 第\s*(\d+)\s*页/gmu)].map(a=>({start:a.index,page:Number(a[1])}));l.set(p(b,a.chunkIndex),{initial:m.get(b),markers:c}),c.length&&m.set(b,c.at(-1).page)}let q=a=>{let b=l.get(p(a.file,a.chunkIndex));return b?.markers.filter(b=>b.start<a.start).at(-1)?.page??b?.initial},r=(a,b)=>(k.get(p(a.file,q(a)))??[]).filter(c=>v(c,a,b));for(let a=0;a<h.length;a++){let c=h[a],e=c.sourceSpans;if(!e)continue;let l=-1,m;for(let a=e.length-1;a>=0;a--){let b=r(e[a],"end").filter(a=>!s(a.text));if(1===b.length){l=a,m=b[0];break}}if(!m)continue;let t=k.get(p(m.file,m.page))??[],u=k.get(p(m.file,m.page+1))??[],z=w(t,u),A=u.find(a=>!s(a.text)&&i(a.text)!==z);if(!A)continue;let B=h.findIndex((b,c)=>c>a&&b.file===m.file&&b.sourceSpans?.[0]&&v(A,b.sourceSpans[0],"start")&&q(b.sourceSpans[0])===A.page);if(B<0)continue;let C=h[B],D=C.nativeTableRow,E=D&&1===D.row&&D.cells.slice(0,-1).every(a=>!i(a))&&C.sourceSpans?.[0]&&n(D,C.sourceSpans[0])?D:void 0;if(!x(m,A,t,u,E)||!E&&(C.clauseNo||C.sourceSpans?.[0]?.logicalBoundaryBefore||/^[^::,,。;;“”"'()()]{1,40}[::]/u.test(A.text)||d&&!d(c,C)))continue;let F=a=>a.split(/\r?\n/u).filter(a=>a.trim()).every(a=>{let b=a.trim(),c=j(b),d=i(b.replace(/^#{1,6}\s+/u,""));return/^#{1,6}\s+(?:PDF 第\s*\d+\s*页|PDF 原生网格表格区域|-?\d+-?)$/u.test(b)||s(d)||!!z&&d===z||!!E&&"|"===b||!!c&&(c.every(a=>/^:?-{3,}:?$/u.test(a))||c.every((a,b)=>a===`列${b+1}`)||!!z&&i(c.join(""))===z)});if(h.slice(a+1,B).some(a=>!F(a.sourceSpans?.map(a=>a.rawText).join("\n")??a.text))||e.slice(l+1).some(a=>!F(a.rawText)))continue;let G=h[B],H=G.sourceSpans?.[0],I=e.at(-1);if(!H||!I||void 0===H.chunkIndex||void 0===I.chunkIndex||H.chunkIndex<I.chunkIndex)continue;let J=b.filter(a=>a.file===m.file&&a.chunkIndex>I.chunkIndex&&a.chunkIndex<H.chunkIndex).sort((a,b)=>a.chunkIndex-b.chunkIndex);if(J.length!==Math.max(0,H.chunkIndex-I.chunkIndex-1))continue;let K=b.find(a=>a.file===m.file&&a.chunkIndex===I.chunkIndex),L=b.find(a=>a.file===m.file&&a.chunkIndex===H.chunkIndex);if(!K||!L)continue;let M=I.chunkIndex===H.chunkIndex?[{chunk:K,start:I.end,end:H.start}]:[{chunk:K,start:I.end,end:K.text.length},...J.map(a=>({chunk:a,start:0,end:a.text.length})),{chunk:L,start:0,end:H.start}];if(M.some(a=>a.end<a.start||!F(a.chunk.text.slice(a.start,a.end))))continue;let N=M.filter(a=>a.chunk.text.slice(a.start,a.end).trim()).map(({chunk:a,start:b,end:c})=>({file:m.file,chunkIndex:a.chunkIndex,section:"PDF普通页间原始布局",chunkSha256:a.sha256,sourceStartChar:a.startChar,sourceEndChar:a.endChar,start:b,end:c,rawText:a.text.slice(b,c),text:a.text.slice(b,c)})),O=[...e.slice(l),...N,H],P=[],Q=!0,R=I.chunkIndex===H.chunkIndex;for(let a=1;a<O.length;a++){let b=O[a-1],c=O[a];if(b.chunkIndex!==c.chunkIndex||R){if(void 0===b.chunkIndex||void 0===c.chunkIndex||c.chunkIndex<b.chunkIndex||c.chunkIndex>b.chunkIndex+1||b.chunkIndex===c.chunkIndex&&(b.chunkSha256!==c.chunkSha256||b.end>c.start)){Q=!1;break}P.push({fromChunkIndex:b.chunkIndex,toChunkIndex:c.chunkIndex,fromChunkSha256:b.chunkSha256,toChunkSha256:c.chunkSha256,fromEnd:b.end,toStart:c.start})}}if(!Q)continue;let S={version:"native-text-page-bridge-v1",file:m.file,sourceSha256:m.sourceSha256,nativeProofSha256:m.nativeProofSha256,from:m,to:A,fromPageLines:t,toPageLines:u,...E?{toGridRow:E}:{},...z?{repeatedHeader:z}:{},fromSpanSha256:o([O[0]]),toSpanSha256:o([O.at(-1)]),spansSha256:o(O),transitions:P},T={...S,witnessSha256:g(S)};if(R&&O.slice(1,-1).some(a=>!y(a.rawText,T)))continue;let U=[...N,H],V=[...e,...U.map((a,b)=>R||a.chunkIndex!==(b?U[b-1]:I).chunkIndex?{...a,sourceNativeTextBridgeBefore:T}:a),...G.sourceSpans.slice(1)];h.splice(a,B-a+1,{...c,text:V.map(a=>a.text).join("\n"),sourceSpans:V,sourceSpansSha256:(0,f.y)(V)}),a--}return h}},45455:(a,b,c)=>{c.d(b,{Bj:()=>j,xj:()=>i});var d=c(77598);let e=new Set(["decisionId","requestId","toolCallId","capturedAt","recordedAt","startedAt","endedAt","finishedAt","elapsedMs","durMs","queryTimeMs"]);function f(a){return Array.isArray(a)?a.map(f):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).filter(([a])=>!e.has(a)).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,f(b)])):a}let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(f(a))).digest("hex"),h=a=>a&&"object"==typeof a&&!Array.isArray(a)?a:void 0;function i(a){return a.flatMap(a=>{let b=h(a.data);if(!a.ok||!b)return[];let c=h(b.directoryState);if("query_cad_context"===a.toolName&&["frames","instances"].includes(String(b.kind))&&c?.scope==="indexed-cad-directory"&&!0===c.complete&&0===c.recordCount&&"string"==typeof b.parsedIdentity&&"string"==typeof b.filePath)return[g(["empty-cad-directory",b.projectSnapshotId,b.filePath,b.parsedIdentity,b.kind])];if("ask_chief"===a.toolName){if("model"!==b.source)return[];let a=Object.fromEntries(("use-facts"===b.action?["factIds"]:"use-sources"===b.action?["sourceIds"]:"engineering-controls"===b.action?["controls","writingControls"]:"qualitative-controls"===b.action?["qualitativeControls"]:[]).filter(a=>Array.isArray(b[a])&&b[a].length>0).map(a=>[a,b[a]]));return Object.keys(a).length?[g(["chief-decision",b.taskId,b.action,a])]:[]}let d=Object.fromEntries(("query_construction_plan"===a.toolName?["activities","plannedResources","numbers","materials"]:"query_project_facts"===a.toolName?["candidates","sourceEvidence"]:"query_cad_context"===a.toolName?["records"]:"query_source_units"===a.toolName?["units"]:"read_source"===a.toolName?["chunks"]:["search_evidence","query_work_packages","discover_files"].includes(a.toolName)?["items"]:"list_skills"===a.toolName?["skills"]:"match_skills"===a.toolName?["matched"]:[]).flatMap(c=>{if(!Array.isArray(b[c]))return[];let d=b[c].filter(b=>{let c=h(f(b));return!!c&&!!Object.keys(c).length&&("read_source"!==a.toolName&&"search_evidence"!==a.toolName||"string"==typeof c.content&&!!c.content.trim())}),e="search_evidence"===a.toolName?d.map(a=>Object.fromEntries(Object.entries(h(a)).filter(([a])=>!["score","rank","retrievalRank","retrievalScore"].includes(a)))):d;return e.length?[[c,e]]:[]}));"load_skill"===a.toolName&&h(b.skill)&&(d.skill=b.skill);let e=Object.fromEntries(["snapshotId","projectSnapshotId","contractId",..."query_construction_plan"===a.toolName?["id"]:[],"filePath","relativePath","parsedIdentity","sceneVersion","kind","frameId","rootInstanceId","units","metadata","sourceVersionEligibility"].filter(a=>void 0!==b[a]).map(c=>[c,"metadata"===c&&"read_source"===a.toolName&&h(b[c])?Object.fromEntries(Object.entries(h(b[c])).filter(([a])=>!["mtime","indexedAt"].includes(a))):b[c]])),i=Object.entries(d).flatMap(([c,d])=>(Array.isArray(d)?d:[d]).map(d=>{let f=h(d);if("query_project_facts"===a.toolName&&f?.factId&&"verified-source-excerpt"!==f.roleId)return g(["project-fact",b.snapshotId??b.projectSnapshotId,f.factId,f.value,f.controlContext??null,h(f.sourceVersionEligibility)?.status??null]);if("query_project_facts"===a.toolName&&f&&(f.sourceEvidenceId||"verified-source-excerpt"===f.roleId))return g(["source-excerpt",b.snapshotId??b.projectSnapshotId,f.sourceEvidenceId??f.factId,f.value]);let i="query_construction_plan"===a.toolName&&"numbers"===c&&f?Object.fromEntries(Object.entries(f).filter(([a])=>"basisId"!==a)):d;return g(["source-material",a.toolName,e,c,i])}));return Number.isSafeInteger(b.offset)&&Number.isSafeInteger(b.nextOffset)&&Number(b.nextOffset)>Number(b.offset)&&i.push(g(["source-cursor",a.toolName,e,{offset:b.offset,nextOffset:b.nextOffset}])),i})}async function j(a){let b,{budget:c}=a,e=[...a.initialMessages],f=0,h=0,j="模型未产出可用正文",k="turns-exhausted",l=new Set(i(a.initialEvidence??[])),m=new Set,n=0;for(let o=1;void 0===c.maxTurnsPerBlock||o<=c.maxTurnsPerBlock;o+=1){if(void 0!==c.maxToolCallsPerBlock&&f>=c.maxToolCallsPerBlock){j=`显式工具调用预算耗尽(${f}/${c.maxToolCallsPerBlock})`,k="tool-budget-exhausted";break}let p=await a.runTurn({system:a.system,messages:e,turn:o,...void 0!==c.maxToolCallsPerBlock?{toolCallLimit:Math.max(0,c.maxToolCallsPerBlock-f)}:{}});if(h=o,f+=p.toolCalls.length,p.refused)return a.onTurn?.({turn:o,residual:b?.residual??0,toolCalls:f,action:"unfixable"}),b?{kind:"unfixable",content:b.content,turn:o,residual:b.residual,toolCalls:f,reason:p.refused.message,issues:[],cause:"budget-refused"}:{kind:"budget_refused",turn:o,reason:p.refused.message,refused:p.refused};let q=i(p.toolResults??[]);p.protocolRecovery?.sentOutputBudget!==null&&p.protocolRecovery?.sentOutputBudget!==void 0&&q.push(g(["protocol-recovery",p.protocolRecovery.sentOutputBudget]));let r=q.some(a=>!l.has(a));q.forEach(a=>l.add(a)),r&&(n=0);let s=p.committed||p.text;if(s?.trim()){let c=await a.check(s),g=c.issues.filter(a=>"error"===a.level||"blocker"===a.severity).length;if(c.degraded.length>0&&!c.executed.length)return a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"unfixable"}),{kind:"unfixable",content:s,turn:o,residual:g,toolCalls:f,reason:`自查维度全部降级(${c.degraded.join("、")}),本块未做自查,保留当前草稿`,issues:c.issues,cause:"checks-degraded"};if(0===g&&!c.degraded.length)return a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"commit"}),{kind:"passed",content:s,turn:o,residual:g,toolCalls:f};let h=(0,d.createHash)("sha256").update(JSON.stringify([s,c])).digest("hex"),i=m.has(h);if(m.add(h),(!b||g<b.residual)&&(b={content:s,residual:g}),i&&!r){j="相同候选与裁决重复,未取得新证据或改善",k="no-progress";break}a.onTurn?.({turn:o,residual:g,toolCalls:f,action:"regenerate"}),e=[...e,...p.toolMessages??[],{role:"assistant",content:s},{role:"user",content:function(a){let b=a.filter(a=>"error"===a.level||"blocker"===a.severity),c=b.slice(0,12).map((a,b)=>`${b+1}. ${a.detectorId?`[${a.detectorId}] `:""}${a.message}`),d=b.slice(12),e=new Map;for(let a of d){let b=a.detectorId||"(未标注判据)";e.set(b,(e.get(b)||0)+1)}return["【自查裁决】本稿未通过判据,下列问题必须修正后重新输出完整本节正文:",...c,d.length>0?`${d.length} 条未逐条列出,按判据分布:${[...e.entries()].map(([a,b])=>`${a} ${b} 条`).join("、")}`:"","修正要求:直接输出修正后的**完整**本节正文(不要只输出改动片段、不要解说改动过程);保留原有事实、数值与结论,不得以删除内容的方式规避问题。"].filter(Boolean).join("\n")}(c.issues)}];continue}let t=p.toolMessages??[];if(r)e=[...e,...t];else{let a=++n;if(a>=3){j="相同无进展状态在具体反馈后仍未取得新证据、游标或主控决定",k="no-progress";break}e=[...e,...t,{role:"user",content:1===a?"本轮没有新增可用来源、分页游标或已接受的主控决定。原始工具回执已保留;空结果或失败不证明资料缺失,也不能用改查询词、调用ID或再报缺来冒充进展。请依据已取得的资料换用有实际依据的工具/继续真实nextOffset,或向已接线的主控说明具体对象、已查范围与失败;若仍无法核定,保留真实decisionRequests并提交已能完成的正文,不编造参数或条件。":"再次没有新增证据。立即停止重复取证:把已能完成的正文按协议提交(未决事项写入decisionRequests保留),拟定配置按工程经验带依据给出(正文标“拟定”并登记plannedNumbers);继续同类工具调用不会产生新证据。"}]}void 0!==c.maxTurnsPerBlock&&o>=c.maxTurnsPerBlock&&(j="显式轮次预算耗尽,模型尚未提交正文")}return b?(a.onTurn?.({turn:h,residual:b.residual,toolCalls:f,action:"unfixable"}),{kind:"unfixable",content:b.content,turn:h,residual:b.residual,toolCalls:f,reason:j,issues:[],cause:k}):{kind:"no_content",turn:h,toolCalls:f,reason:j,cause:k}}},47262:(a,b,c)=>{function d(a){let b=e()?.semanticFingerprints?.[a];return"string"==typeof b&&/^[a-f0-9]{64}$/u.test(b)?b:void 0}function e(){let a='{"version":1,"sourceFingerprint":"c097c482b89445ecd5af066c8dcae41fe044bfa13f1e971756cbd620b20de70d","semanticFingerprints":{"projectFacts":"337f29d6f35c8d738243daf39663e96007699ef80e49d90391734b5f38a250be","documentGeneration":"de0fd4d505a40590d5b0a350e2145334e97397ab6930c5fc175c7658a6001569"},"gitCommit":"afd176a6c2a6755da80cd5e9e16a4ad390c6eb15","serverVersion":"4.60.13","sourceFiles":739,"capturedAt":"2026-10-13T13:38:46.448Z"}';if(a)try{let b=JSON.parse(a);if(1!==b.version||!/^[a-f0-9]{64}$/u.test(b.sourceFingerprint??"")||"string"!=typeof b.serverVersion||"number"!=typeof b.sourceFiles||"string"!=typeof b.capturedAt||null!==b.gitCommit&&"string"!=typeof b.gitCommit)return;return b}catch{return}}c.d(b,{C:()=>d,S:()=>e})},48825:(a,b,c)=>{c.d(b,{Jf:()=>j,V2:()=>i,bp:()=>d,wJ:()=>e});let d="professional-writing-guidance-v4-responsibility-titles-2026-10-13",e={building:{fileName:"施工组织设计章节写作分析与编制规范(建筑).docx",sha256:"9313607509897e9a252cdefd671c4c72025d2727411972788bfa61b9835a0ff2",pages:12},municipal:{fileName:"施工组织设计章节写作分析与编制规范(市政).docx",sha256:"8e36d97e7084464ab04776093550e10984d3ac4a2a64ac37d5ca74a13a3ccc82",pages:13},bidWriting:{fileName:"技术标写作指南(合肥AI评标).docx",sha256:"3f36e67531da8ac9ffb1847694403ec4246457e445612767b3a82acf02894d0e"},bidReview:{fileName:"青天大模型AI评标规则考证(2026-10-11).docx",sha256:"de976918a1a0f1486cb07e1c2fd4a72a3b86fa480cbd46353f4c1af372badc69"}},f=["先形成工程对象、工作包、部署、资源及时间的共同推演,再按交付目录组织成文。事实、数量、工作面、部位、班组、节点在各章共用稳定身份,作者不各自编数字。","功能职责不等于固定章节:概况解释条件与影响,部署决定空间和顺序,方法说明实施,质量说明检查,安全说明风险与处置,进度说明时间,平面说明现场组织,移交说明最终闭环。推荐母目录不覆盖招标或用户锁定结构。","工作包数量与方法连通,方法与资源连通,资源与工期迭代校核;材料到货早于使用,检测和必要等待进入转序与时间逻辑。同一机械或班组同期不能在不同工作面重复占用。","施工方法、部署、真正重难点与进度应充分展开;人材机重点算准,管理计划重点完成执行闭环,概况与编制依据保持准确简洁。详略按职责和风险,不按统一字数、参数密度或固定图表数量。","表格按真实数据形态选择:单项目多属性用“信息项—内容”纵向或按属性含义分组;多对象在相同指标下比较、配置或排程时才横向展开。字段宽度应容纳完整对象、控制数值和单位,不能把大量无比较目的的属性铺成十几列单行,或把长范围原文挤进窄格。真实阶段或对象矩阵需要宽表时保留全部字段与对应关系,按职责合理分组,不设置固定列数上限、不强制各章制表,不删表行、数值或对象迎合评价。","项目事实依据与技术规范依据分别治理;前者确定实际工程,后者核验控制与验收。核验规范编号、名称、实施日期、状态、替代及局部废止和对象范围;参考文件列出的编号不等于本次已验证有效。","计算、产能假设和规范查证保留内部审计,正文交付核定的配置与控制结果及必要实施条件,不堆算式和来源说明。引用规范仅限确有技术参数、验收或强制边界需要的地方。","首稿采用专业短句和必要分点:条件决定方法,动作达到可检状态,状态放行下一工序。正文工序名不以箭头串替代实施方法;实际流程图和活动网络保留其关系,图后不逐节点逐连线重复全文。","技能主题是规划参考,不是必须照抄的交付标题。主控按本工程对象及被委派职责拟定正式小节名称,避免把“候选、核验责任、适用性”这类内部判断任务直接当目录;真正承担辨识、核查职责时使用完整专业名称。专业标题说明工程对象、方法或组织职责,不拼接关键词、不照抄内部评审标签。正常技术名称重复不导致丢弃、换名或重写;同项目再次编制仍以实际条件和方案质量为准。","写作指南中的样本统计只提供观察线索,不构成评分算法;图片数、箭头数、元数据软件、标题关键词和入围差值不授予质量或真实性。项目实际要求与专业适用规则优先,不为低频统计删去必要风险和接口。"],g={building:"建筑工程按实际楼栋、楼层、流水段和专业接口组织;地下结构、主体、围护装修、机电与室外的先后和移交要一致。不能把房建通用专业强行加入实际没有的工程。",municipal:"市政按真实路线、桩号、区段和工作面组织,明确起点、推进方向、地下与地上转序;涉及社会交通时,导改、围挡、施工阶段、居民出行与施工车辆路线联动。场内便道与场外交通分开。"},h=[{id:"overview",label:"项目理解",match:/概况|项目理解|整体理解|现场条件|工程清单|专业构成/u,buildingPages:[2],municipalPages:[2],guidance:"给出事实及其对施工组织的影响,按专业呈现必要工程量;不复制设计说明、不提前展开工艺,不以无来源地质、距离或道路数据制造针对性。"},{id:"deployment",label:"总体部署",match:/总体部署|施工部署|流水段|工作面|施工区段|施工顺序/u,buildingPages:[2,3],municipalPages:[2,3],guidance:"明确区段和工作面对应哪些任务及工程量、划分理由、起点、方向、先后与穿插、专业移交条件。后续方法、资源和进度必须能从部署找到组织依据。"},{id:"difficulties",label:"重难点",match:/重难点|重点难点|项目特点|制约因素/u,buildingPages:[3,4],municipalPages:[3,4],guidance:"由真实项目证据辨识制约因素,解释原因和后果,给出技术组织、资源、检查及异常处置;只深写真正核心问题,并在相关方法、质量、安全或工期中闭合。"},{id:"method",label:"施工方法",match:/工艺|工法|施工方法|施工技术|浇筑|开挖|吊装|安装|支模/u,buildingPages:[4,5],municipalPages:[4,5],guidance:"对本节实际承担的分项写清对象和工作量、前提、顺序、步骤、材料机具工种、控制、接口、检查、异常和转序。普通工序可组织可检查,核心工序达到必要技术策划深度;不把施组全文变成专项计算书。"},{id:"materials",label:"材料供应",match:/材料|物资|永久设备|供应|采购|人材机/u,buildingPages:[5],municipalPages:[5],guidance:"数量由实际工程量或可靠换算取得,供应与工作面及使用窗口衔接;长周期构件设备串联确认、采购、到货和安装。区分施工机械与永久设备、产品标准与验收标准;不能可靠换算时不假算。"},{id:"equipment",label:"机械与仪器",match:/机械|机具|检测仪器|人材机|确保机/u,buildingPages:[5,6],municipalPages:[5,6],guidance:"关键机械以工作量、可用作业窗口、实际单机或机组能力核定数量,检查同期占用和转场。检测仪器服务实际检验。运距未知不能虚构运输循环时间;算式留审计,不抄经验台数。"},{id:"labor",label:"劳动力",match:/劳动力|班组|工种|人材机|确保人/u,buildingPages:[6,7],municipalPages:[6],guidance:"以班组、工作面、阶段和工种组织投入,核算工作量、工日和持续时间;峰值由实际同期工种矩阵求得,不能相加各专业独立峰值。配置与特种作业必须符合真实任务。"},{id:"quality",label:"质量控制",match:/质量|检验|检测|隐蔽验收|复试|样板|三检/u,buildingPages:[7],municipalPages:[6,7],guidance:"围绕真实实体写检查对象、指标、方法、适用频次、岗位、记录、不合格处置、复验和销项;合格后才转序。方法章写实施,质量章写核验,避免再抄一遍工艺。"},{id:"safety",label:"风险安全与应急",match:/危大|危险源|风险|安全|应急|专项方案|论证/u,buildingPages:[7,8],municipalPages:[7,8],guidance:"实际作业、实体参数和影响对象支撑风险与危大判定,不能靠关键词。承担现场控制时给出作业条件、停止触发、监测和处置;辨识或审核子任务只承担其边界,完整应急由被委派任务负责。"},{id:"schedule",label:"进度组织",match:/进度|工期|节点|施工计划|施工窗口|确保人|确保机/u,buildingPages:[8,9],municipalPages:[8,9],guidance:"共同任务网络连接工作量、工作面、综合能力、材料到货、必要等待、检测与转序。开始结束和搭接可复核,关键路线由逻辑计算,不将箭头示意当网络计划。进度、正文与资源共用同一时间数据。"},{id:"environment",label:"环境与外部运行",match:/文明|环境|环保|扬尘|噪声|校园秩序|交通|既有|保护/u,buildingPages:[9],municipalPages:[9],guidance:"针对实际居民、校园、生产、交通、水体或既有设施说明影响、控制、检查责任及恢复;地方措施需按属地核验,不无条件复制某城市标准。涉及既有设施先调查再分析保护监测。"},{id:"site-layout",label:"现场空间组织",match:/总平面|平面布置|临时设施|临设|运输路线|便道|便桥/u,buildingPages:[9,10],municipalPages:[9,10],guidance:"按实际场地边界和阶段部署布置物流、堆场、机具、水电排水、消防及出入口,检查真实可通行与转场条件。缺尺寸不编坐标;必要实体决定未完成时由主控解决,不用模糊正文冒充已落地。"},{id:"handover",label:"验收恢复移交",match:/竣工|移交|交付|保修|缺陷责任|退场|恢复/u,buildingPages:[10],municipalPages:[10,11],guidance:"从已施工实体与系统反推检查、调试、整改复验、资料、培训和移交。市政还核对道路、交通、绿化及临设恢复;过程隐蔽验收不重复承担整套竣工移交。"}];function i(a){let b="building"===a||"municipal"===a?g[a]:"工程类型未确认时只使用共同写作原则,不能默认套用市政或房建专业条件。";return`【编制规范萃取 ${d},是写作方法先验,不是项目事实或已核现行标准】
|
|
126
126
|
${f.join("\n")}
|
|
127
127
|
${b}`}function j(a){let b=h.map(b=>({role:b,score:4*!!b.match.test(a.title)+2*!!b.match.test(a.responsibility)+("method"===b.id&&a.contentTypes.includes("method")?1:0)})).filter(a=>a.score>0).sort((a,b)=>b.score-a.score).map(a=>a.role);return{version:d,source:("building"===a.projectType||"municipal"===a.projectType?e[a.projectType]:void 0)??null,roles:b.map(b=>({id:b.id,label:b.label,pages:"building"===a.projectType?b.buildingPages:"municipal"===a.projectType?b.municipalPages:[],guidance:b.guidance})),omitted:[],text:`${i(a.projectType)}
|
|
128
128
|
本任务相关功能指引仅在其被委派的职责内采用:
|