@customize-agent/server 4.60.3 → 4.60.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +6 -6
  3. package/.next/prerender-manifest.json +3 -3
  4. package/.next/required-server-files.json +1 -1
  5. package/.next/server/chunks/1243.js +1 -1
  6. package/.next/server/chunks/4683.js +11 -9
  7. package/.next/server/chunks/6321.js +1 -1
  8. package/.next/server/chunks/8204.js +1 -1
  9. package/.next/server/chunks/9666.js +10 -8
  10. package/.next/server/middleware-build-manifest.js +1 -1
  11. package/.next/server/pages/404.html +1 -1
  12. package/.next/server/pages/500.html +1 -1
  13. package/.next/server/pages/api/documents/export.js.nft.json +1 -1
  14. package/.next/server/pages/api/health.js +1 -1
  15. package/.next/server/pages/canvas/[id].html +1 -1
  16. package/.next/server/pages/canvas.html +1 -1
  17. package/.next/server/pages/documents.html +1 -1
  18. package/.next/server/pages/guide.html +1 -1
  19. package/.next/server/pages/index.html +1 -1
  20. package/.next/server/pages/knowledge/file-detail.html +1 -1
  21. package/.next/server/pages/knowledge/files.html +1 -1
  22. package/.next/server/pages/knowledge/manage.html +1 -1
  23. package/.next/server/pages/knowledge/source-preview.html +1 -1
  24. package/.next/server/pages/knowledge.html +1 -1
  25. package/.next/server/pages/models.html +1 -1
  26. package/.next/server/pages/overview.html +1 -1
  27. package/.next/server/pages/prompt.html +1 -1
  28. package/.next/server/pages/settings.html +1 -1
  29. package/.next/server/pages/skills/[id]/edit.html +1 -1
  30. package/.next/server/pages/skills/[id].html +1 -1
  31. package/.next/server/pages/skills/new.html +1 -1
  32. package/.next/server/pages/skills.html +1 -1
  33. package/.next/server/pages/system/logs.html +1 -1
  34. package/.next/server/pages-manifest.json +35 -35
  35. package/.next/static/{7ea0ee326182fc159e629b4cd9354c5c800c7d5e156fcd6533182444b20d26cf → 77a0c591cb44f2d0fda8be7c18cd915e32ecb5272d201914c0e332124a63d539}/_buildManifest.js +1 -1
  36. package/.next/static/chunks/{530-a5a65dc8adb1ee11.js → 530-7e79396d68742829.js} +1 -1
  37. package/.next/static/chunks/pages/{_app-10f13111671af8a4.js → _app-3f5aa4ff7951feca.js} +1 -1
  38. package/.next/static/css/39e9d8f998ce517b.css +1 -0
  39. package/package.json +1 -1
  40. package/public/apple-touch-icon.png +0 -0
  41. package/public/favicon.ico +0 -0
  42. package/public/favicon.svg +4 -2
  43. package/scripts/brand-moon-fit.cjs +147 -0
  44. package/scripts/generate-brand-assets.cjs +62 -19
  45. package/.next/static/css/e67420f8d0ea180d.css +0 -1
  46. /package/.next/static/{7ea0ee326182fc159e629b4cd9354c5c800c7d5e156fcd6533182444b20d26cf → 77a0c591cb44f2d0fda8be7c18cd915e32ecb5272d201914c0e332124a63d539}/_ssgManifest.js +0 -0
@@ -5,7 +5,7 @@ ${JSON.stringify(c.sourceAssertions)}`,`【定量来源、推导和拟定安排
5
5
  ${JSON.stringify(c.numericBindings)}`,`【本任务独立核定的来源用途与项目选型】
6
6
  ${JSON.stringify(c.sourceApplications)}`,`【同稿实际图件模型】
7
7
  ${JSON.stringify(c.figures)}`,`【原文与同稿图件证据库】
8
- ${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),am=c(42948),an=c(73055),ao=c(86282),ap=c(5518),aq=c(9848);function ar(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 as(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 at(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 au(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 av=a=>a?JSON.parse(a.replace(/^\s*```(?:json)?\s*/u,"").replace(/\s*```\s*$/u,"")):void 0,aw=["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"],ax=(a,b,c)=>{if(!Object.hasOwn(b.sources,c)||a.parsedFileFingerprint(c).sha256!==b.sources[c].sha256)throw Error("CAD准备期间解析来源已变化")};async function ay(a){let b,c=[],d=[],f=a.caller??h.rI,g=aw.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=>{ax(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=av(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(()=>{ax(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=>ar(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=>ar(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=av(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=>as(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=av(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=>as(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=>ar(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath})));j+=1;let k=await at({project:a.project,candidate:g,views:i,readEvidence:b=>a.read(c=>as(c,a.project,b)),reviewer:async b=>av(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=au(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 az=c(36594);let aA=a=>!!a&&"object"==typeof a&&!Array.isArray(a),aB=a=>"string"==typeof a&&!!a.trim(),aC=a=>Array.isArray(a)?a.map(aC):aA(a)?Object.fromEntries(Object.keys(a).sort().filter(b=>void 0!==a[b]).map(b=>[b,aC(a[b])])):a,aD=a=>{let b;return b=JSON.stringify(aC(a)),(0,e.createHash)("sha256").update(b).digest("hex")},aE="project-model-v10-semantic-facts-2026-10-12",aF=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function aG(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 aH(a){let b=a.global.input.signal;(0,an.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(j6(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.Uy)(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(j6(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=aF({version:aE,targets:n,domain:a.prepare.domainProfile,prompt:a.prepare.factExtractionPromptTexts,modelIdentity:o,algorithmIdentity:p,registeredCadAssets:r,extractionTuning:{maxChars:(0,ao.z)().factExtractionMaxChars}}),u=aF({sources:g,contextHash:t,sourceVersionPolicyId:m.policyId}),v=af().join(j6(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||aF(b)!==a.sha256)throw Error("项目事实缓存内容校验不通过");if(b.version===aE&&b.inputHash===u&&aF(b.sources)===aF(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={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>n.some(b=>b.name===a||b.id===a))}))},x=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>n.some(b=>b.id===a.id))}:void 0,y=(0,ak.d6)({evidence:h,template:w,spec:x,diagnostics:a.planning.generationDiagnostics,parsedOnly:!0}),z=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)},A=(0,an.lX)([...y.localFacts,...y.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(aG).filter(z);A.push(...(0,az.Yn)(h,m));let B=A.filter(a=>(0,aq.p)(a).requiresTechnicalDecision&&/\.(?:dwg|dxf)$/iu.test(a.sourceFile)),C=!1;if(B.length){let c=[...new Set(B.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:aF({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(!aA(b)||b.id!==g||!aA(b.data)||"reusable-reviewed-cad-v1-2026-10-08"!==b.data.version||b.contentHash!==aD(b.data)||!aA(b.data.provenance)||b.id!==aD({version:b.data.version,provenance:b.data.provenance}))throw Error("CAD历史资产完整性校验失败");let{audit:c,results:h,modelMetadata:i}=function(a){let b;if(!aA(a)||!aB(a.kind)||!aA(a.result))throw Error("历史CAD资产必须为完整审核envelope,不能仅提供事实或项目模型");if(aB(a.model))b={scope:"original-audit",model:a.model};else if(aA(a.llm)&&Array.isArray(a.llm.modelChoices)&&a.llm.modelChoices.some(a=>aA(a)&&aB(a.chosen)&&aB(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=>aA(a)&&Array.isArray(a.results)?a.results:[]):[]).filter(a=>aA(a)&&!0===a.approvedForWriting);if(!c.length)throw Error("历史CAD资产没有完整核准结果,裸事实和未决候选不能复用");for(let a of c){if(!aA(a.candidate)||!aA(a.candidate.evidence)||!aA(a.proof)||!aA(a.review)||"confirmed"!==a.review.status||!aB(a.review.reason)||!1!==a.expertValidated||!aB(a.candidate.objectName)||!aB(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))||!aB(a.proof.projectSnapshotId)||!aB(a.proof.parsedIdentity)||!/^[0-9a-f]{64}$/u.test(a.proof.parsedIdentity)||!aA(a.proof.frame)||!aA(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(!aB(b.filePath)||!aB(b.frameId)||!aB(b.valueEntityId)||!aB(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||aD(b.data.provenance.originalModelMetadata)!==aD(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(aD(g(e))!==aD(g(f)))throw Error("历史CAD审核的图框、量值、单位或范围实体与当前证明不一致");if(!e.unitAnnotations.some(b=>b.text===a.candidate.unit))throw Error("历史CAD单位没有当前实际单位文字实体支持");if(!au(a))throw Error("历史审核没有准入可写事实")}(i,a.project,a.readEvidence);let b=au(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:j6(a.prepare.projectRoot),project:d,requestedAttributes:c,readEvidence:b=>(0,ah.VD)(a.prepare.projectRoot,a=>as(a,d,b))});A.push(...e.facts);let f=[...new Set(B.map(a=>a.sourceFile))].filter(a=>!c.every(b=>e.facts.some(c=>c.sourceFile===a&&c.fieldId===b)));a.global.input.runId&&(0,am.tv)(j6(a.prepare.projectRoot),"cad-historical-reuse.json",e,a.global.input.runId);let h=f.length?await ay({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&&(A.push(...h.facts),C=!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,am.tv)(j6(a.prepare.projectRoot),"cad-writing-preparation.json",h,a.global.input.runId))}let D=b=>af().join(j6(a.prepare.projectRoot),"project-model-cache",`source-${aF([b,g[b].sha256,t])}.json`),E=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(D(a),"utf8"));aF(b.data)===b.sha256&&Array.isArray(b.data)&&A.push(...b.data.filter(E).map(aG).filter(z))}catch{}let F=n.filter(a=>a.required&&!A.some(b=>(0,ak.PV)(b,a))),G=new Map;for(let b of F)G.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 H=[...new Map(F.flatMap(a=>G.get(a.id)??[]).map(a=>[`${a.filePath}\0${a.sectionTitle}\0${a.content}`,a])).values()],I=!1;if(H.length>0){let c={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>F.some(b=>b.id===a||b.name===a))}))},d=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>F.some(b=>b.id===a.id))}:void 0,e=await (0,ak.OQ)(H,a.prepare.factExtractionPromptTexts,c,d,b,a.planning.generationDiagnostics);(0,an.Te)(b);let f=(0,an.lX)(e.facts).filter(E).map(aG).filter(z);for(let a of(A.push(...f),I=e.stages.some(a=>"failed"===a.status)||0===f.length,new Set(f.map(a=>a.sourceFile)))){if(!p||!g[a])continue;let b=[...new Map(A.filter(b=>b.sourceFile===a&&E(b)).map(a=>[aF([a.fieldId,a.key,a.objectName,a.value,a.sourceRef]),a])).values()],c=D(a);ad().mkdirSync(af().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.tmp`;ad().writeFileSync(d,JSON.stringify({data:b,sha256:aF(b)})),ad().renameSync(d,c)}}if(aF((0,ah.Y8)(a.prepare.projectRoot,c))!==aF(g))throw Error("写前理解期间解析资料已变化,不能将旧候选与新来源一起冻结");let J={version:aE,inputHash:u,sources:g,sourceVersionPolicy:m,facts:A,tables:y.structuredTables,unresolvedFields:F.filter(a=>!A.some(b=>(0,ak.PV)(b,a))).map(a=>({id:a.id,name:a.name,status:"unmeasured",candidateCount:G.get(a.id)?.length??0,phase:G.get(a.id)?.length?"attribute-extraction":"source-location",provesMissingSource:!1,candidateLocations:(G.get(a.id)??[]).map(a=>({sourceFile:a.filePath,chunkIndex:a.chunkIndex})),reason:G.get(a.id)?.length?"已有相关解析原文,属性理解尚未完成;不能凭抽取失败认定原文缺料":"当前字段关键词尚未定位原文,未据此判定全库缺料"})),cacheHit:!1};if(p&&!I&&!C){ad().mkdirSync(af().dirname(v),{recursive:!0});let a=`${v}.${process.pid}.tmp`;ad().writeFileSync(a,JSON.stringify({data:J,sha256:aF(J)})),ad().renameSync(a,v)}return J}function aI(a,b){if(b.version!==aE)throw Error("项目事实快照版本失配,须按当前语义属性重新准备,不能转换旧快照用于生成");if(!b.sourceVersionPolicy)throw Error("项目恢复缺少冻结来源版本用途账,须按当前来源重新准备");if((0,s.gM)(b.sourceVersionPolicy),(0,s.cW)(af().join(j6(a),"assets","source-editions")).fingerprint!==b.sourceVersionPolicy.assetFingerprint)throw Error("来源发行确认资产已变化,原项目快照不能继续复用");let{snapshotId:c,...d}=b;if(aF(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(aF((0,ah.Y8)(a,Object.keys(b.sources)))!==aF(b.sources))throw Error("写作期间解析资料已经变更,当前事实快照已过期;保留草稿并使用新快照重新规划受影响任务")}let aJ={version:"professional-document-workflow-v113",rules:["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"]},aK={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"]},aL=a=>(0,e.createHash)("sha256").update(a).digest("hex");var aM=c(7258);let aN=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),aO="native-execution-accounting-",aP=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function aQ(a,b){let c=(0,aj.C)("documentGeneration");if(!c||!a.inputSnapshot)return;let d=b??{};return b||(0,j.er)(d,a.inputSnapshot),aP({inputHash:a.inputSnapshot.sha256,requirement:a.requirement??"",title:a.title??"",materialRoot:a.materialRoot??"",algorithm:c,models:k(d),workflowVersion:aJ.version})}var aR=c(19668);c(20297);var aS=c(48161),aT=c.n(aS);class aU extends Error{constructor(a,b,c){super(a),this.promptId=b,this.reason=c,this.name="PromptResolutionError"}}function aV(a,b={}){let c=[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))];if(0===c.length)throw new aU("生成需要提示词:请在画布底部的输入框里用「+」选择至少一份提示词(\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(aS.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 aU(`提示词不存在:${a}(可能已被删除)。请在画布上用「+」重新选择提示词后重试。`,a,"unknown-id");if(!c.name.trim())throw new aU(`提示词没有名字,无法判定它进哪条链:${a}`,a,"unknown-id");if(!c.content.trim())throw new aU(`提示词内容为空:${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 aW{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 aX=c(79704),aY=c(10059),aZ=c(57268);function a$(a){let b=a.map(a=>({id:(0,aZ.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 a_(a,b,c){if(!c||"string"!=typeof c.version||!c.version.trim())throw Error("缺少当前全文主控计划");let d=a$(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,aZ.DS)(a),f=g.get(e);if(!f||!["technical","commercial","unmeasured"].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("commercial"===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 a0(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function a1(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 a2(a){return"manual_review"===a.repairability||"user"===a.owner}function a3(a){let b=a.provenance?.detectorId?.trim();return b?[b]:a.category?[a.category]:[]}function a4(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}var a5=c(450);function a6(a){return a.replace(/\s+/gu,"").toLowerCase()}function a7(a){return[...new Set(a)]}c(86697),RegExp(`^.{2,36}?表`,"u");let a8="[\\d一二三四五六七八九十]+";RegExp(`^表\\s*${a8}(?:[--..—]\\s*${a8})?\\s*[::、..]?\\s`,"u");let a9=[{pattern:/横道图|甘特图/u,instruction:"以表格式时间轴呈现(阶段与节点、起止时间、与工期目标的关系);表中时间节点必须与总工期及开工竣工日期一致"},{pattern:/网络图|关键线路/u,instruction:"以文字框图呈现(工作节点、先后衔接关系、关键线路标注),节点划分必须与本工程施工组织一致"},{pattern:/组织机构图|组织框图|机构框图|机构图/u,instruction:"以文字框图呈现组织机构层级(部门或岗位、隶属关系)"},{pattern:/平面布置图|布置图/u,instruction:"以分区布置的文字框图或布置要点表呈现(分区、布置内容、管控要求)"},{pattern:/流程图|工艺流程图/u,instruction:"以文字框图呈现流程步骤与衔接关系"}];function ba(a){return a6(a).replace(/[((][^))]*[))]/gu,"").replace(/[图表]+$/u,"")}let bb=/知识库|系统暂未|项目资料暂未|暂未明确|待确认|待资料复核|待系统|通用兜底(?:段落|模板)?|兜底(?:占位|模板|内容)|未检索到|资料不足|无法确认|建议补充|COL\d+|可核验信息|以本项目招标文件明确内容为准/u,bc=String.raw`(?:\d+[.、](?=\s|\*\*)\s*|[((]\d+[))]\s*|[-*+]\s+)`;RegExp(String.raw`\S.+(?:\s|[。;;])${bc}\S.+(?:\s|[。;;])${bc}\S`,"u"),RegExp(`\r?
8
+ ${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),am=c(42948),an=c(73055),ao=c(86282),ap=c(5518),aq=c(9848);function ar(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 as(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 at(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 au(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 av=a=>a?JSON.parse(a.replace(/^\s*```(?:json)?\s*/u,"").replace(/\s*```\s*$/u,"")):void 0,aw=["ground_elevation","pit_bottom_elevation","foundation_elevation","pile_length","pile_diameter"],ax=(a,b,c)=>{if(!Object.hasOwn(b.sources,c)||a.parsedFileFingerprint(c).sha256!==b.sources[c].sha256)throw Error("CAD准备期间解析来源已变化")};async function ay(a){let b,c=[],d=[],f=a.caller??h.rI,g=aw.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=>{ax(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=av(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(()=>{ax(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=>ar(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=>ar(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=av(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=>as(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=av(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=>as(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=>ar(c,a.project,{filePath:d.filePath,frameId:d.frameId,viewport:b,width:3200,fontPath:a.fontPath})));j+=1;let k=await at({project:a.project,candidate:g,views:i,readEvidence:b=>a.read(c=>as(c,a.project,b)),reviewer:async b=>av(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=au(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 az=c(36594);let aA=a=>!!a&&"object"==typeof a&&!Array.isArray(a),aB=a=>"string"==typeof a&&!!a.trim(),aC=a=>Array.isArray(a)?a.map(aC):aA(a)?Object.fromEntries(Object.keys(a).sort().filter(b=>void 0!==a[b]).map(b=>[b,aC(a[b])])):a,aD=a=>{let b;return b=JSON.stringify(aC(a)),(0,e.createHash)("sha256").update(b).digest("hex")},aE="project-model-v10-semantic-facts-2026-10-12",aF=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function aG(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 aH(a){let b=a.global.input.signal;(0,an.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(j6(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.Uy)(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(j6(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=aF({version:aE,targets:n,domain:a.prepare.domainProfile,prompt:a.prepare.factExtractionPromptTexts,modelIdentity:o,algorithmIdentity:p,registeredCadAssets:r,extractionTuning:{maxChars:(0,ao.z)().factExtractionMaxChars}}),u=aF({sources:g,contextHash:t,sourceVersionPolicyId:m.policyId}),v=af().join(j6(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||aF(b)!==a.sha256)throw Error("项目事实缓存内容校验不通过");if(b.version===aE&&b.inputHash===u&&aF(b.sources)===aF(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={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>n.some(b=>b.name===a||b.id===a))}))},x=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>n.some(b=>b.id===a.id))}:void 0,y=(0,ak.d6)({evidence:h,template:w,spec:x,diagnostics:a.planning.generationDiagnostics,parsedOnly:!0}),z=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)},A=(0,an.lX)([...y.localFacts,...y.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(aG).filter(z);A.push(...(0,az.Yn)(h,m));let B=A.filter(a=>(0,aq.p)(a).requiresTechnicalDecision&&/\.(?:dwg|dxf)$/iu.test(a.sourceFile)),C=!1;if(B.length){let c=[...new Set(B.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:aF({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(!aA(b)||b.id!==g||!aA(b.data)||"reusable-reviewed-cad-v1-2026-10-08"!==b.data.version||b.contentHash!==aD(b.data)||!aA(b.data.provenance)||b.id!==aD({version:b.data.version,provenance:b.data.provenance}))throw Error("CAD历史资产完整性校验失败");let{audit:c,results:h,modelMetadata:i}=function(a){let b;if(!aA(a)||!aB(a.kind)||!aA(a.result))throw Error("历史CAD资产必须为完整审核envelope,不能仅提供事实或项目模型");if(aB(a.model))b={scope:"original-audit",model:a.model};else if(aA(a.llm)&&Array.isArray(a.llm.modelChoices)&&a.llm.modelChoices.some(a=>aA(a)&&aB(a.chosen)&&aB(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=>aA(a)&&Array.isArray(a.results)?a.results:[]):[]).filter(a=>aA(a)&&!0===a.approvedForWriting);if(!c.length)throw Error("历史CAD资产没有完整核准结果,裸事实和未决候选不能复用");for(let a of c){if(!aA(a.candidate)||!aA(a.candidate.evidence)||!aA(a.proof)||!aA(a.review)||"confirmed"!==a.review.status||!aB(a.review.reason)||!1!==a.expertValidated||!aB(a.candidate.objectName)||!aB(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))||!aB(a.proof.projectSnapshotId)||!aB(a.proof.parsedIdentity)||!/^[0-9a-f]{64}$/u.test(a.proof.parsedIdentity)||!aA(a.proof.frame)||!aA(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(!aB(b.filePath)||!aB(b.frameId)||!aB(b.valueEntityId)||!aB(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||aD(b.data.provenance.originalModelMetadata)!==aD(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(aD(g(e))!==aD(g(f)))throw Error("历史CAD审核的图框、量值、单位或范围实体与当前证明不一致");if(!e.unitAnnotations.some(b=>b.text===a.candidate.unit))throw Error("历史CAD单位没有当前实际单位文字实体支持");if(!au(a))throw Error("历史审核没有准入可写事实")}(i,a.project,a.readEvidence);let b=au(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:j6(a.prepare.projectRoot),project:d,requestedAttributes:c,readEvidence:b=>(0,ah.VD)(a.prepare.projectRoot,a=>as(a,d,b))});A.push(...e.facts);let f=[...new Set(B.map(a=>a.sourceFile))].filter(a=>!c.every(b=>e.facts.some(c=>c.sourceFile===a&&c.fieldId===b)));a.global.input.runId&&(0,am.tv)(j6(a.prepare.projectRoot),"cad-historical-reuse.json",e,a.global.input.runId);let h=f.length?await ay({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&&(A.push(...h.facts),C=!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,am.tv)(j6(a.prepare.projectRoot),"cad-writing-preparation.json",h,a.global.input.runId))}let D=b=>af().join(j6(a.prepare.projectRoot),"project-model-cache",`source-${aF([b,g[b].sha256,t])}.json`),E=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(D(a),"utf8"));aF(b.data)===b.sha256&&Array.isArray(b.data)&&A.push(...b.data.filter(E).map(aG).filter(z))}catch{}let F=n.filter(a=>a.required&&!A.some(b=>(0,ak.PV)(b,a))),G=new Map;for(let b of F)G.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 H=[...new Map(F.flatMap(a=>G.get(a.id)??[]).map(a=>[`${a.filePath}\0${a.sectionTitle}\0${a.content}`,a])).values()],I=!1;if(H.length>0){let c={...a.prepare.template,chapters:a.prepare.template.chapters.map(a=>({...a,requiredFacts:a.requiredFacts.filter(a=>F.some(b=>b.id===a||b.name===a))}))},d=a.prepare.documentSpec?{...a.prepare.documentSpec,factFields:a.prepare.documentSpec.factFields.filter(a=>F.some(b=>b.id===a.id))}:void 0,e=await (0,ak.OQ)(H,a.prepare.factExtractionPromptTexts,c,d,b,a.planning.generationDiagnostics);(0,an.Te)(b);let f=(0,an.lX)(e.facts).filter(E).map(aG).filter(z);for(let a of(A.push(...f),I=e.stages.some(a=>"failed"===a.status)||0===f.length,new Set(f.map(a=>a.sourceFile)))){if(!p||!g[a])continue;let b=[...new Map(A.filter(b=>b.sourceFile===a&&E(b)).map(a=>[aF([a.fieldId,a.key,a.objectName,a.value,a.sourceRef]),a])).values()],c=D(a);ad().mkdirSync(af().dirname(c),{recursive:!0});let d=`${c}.${process.pid}.tmp`;ad().writeFileSync(d,JSON.stringify({data:b,sha256:aF(b)})),ad().renameSync(d,c)}}if(aF((0,ah.Y8)(a.prepare.projectRoot,c))!==aF(g))throw Error("写前理解期间解析资料已变化,不能将旧候选与新来源一起冻结");let J={version:aE,inputHash:u,sources:g,sourceVersionPolicy:m,facts:A,tables:y.structuredTables,unresolvedFields:F.filter(a=>!A.some(b=>(0,ak.PV)(b,a))).map(a=>({id:a.id,name:a.name,status:"unmeasured",candidateCount:G.get(a.id)?.length??0,phase:G.get(a.id)?.length?"attribute-extraction":"source-location",provesMissingSource:!1,candidateLocations:(G.get(a.id)??[]).map(a=>({sourceFile:a.filePath,chunkIndex:a.chunkIndex})),reason:G.get(a.id)?.length?"已有相关解析原文,属性理解尚未完成;不能凭抽取失败认定原文缺料":"当前字段关键词尚未定位原文,未据此判定全库缺料"})),cacheHit:!1};if(p&&!I&&!C){ad().mkdirSync(af().dirname(v),{recursive:!0});let a=`${v}.${process.pid}.tmp`;ad().writeFileSync(a,JSON.stringify({data:J,sha256:aF(J)})),ad().renameSync(a,v)}return J}function aI(a,b){if(b.version!==aE)throw Error("项目事实快照版本失配,须按当前语义属性重新准备,不能转换旧快照用于生成");if(!b.sourceVersionPolicy)throw Error("项目恢复缺少冻结来源版本用途账,须按当前来源重新准备");if((0,s.gM)(b.sourceVersionPolicy),(0,s.cW)(af().join(j6(a),"assets","source-editions")).fingerprint!==b.sourceVersionPolicy.assetFingerprint)throw Error("来源发行确认资产已变化,原项目快照不能继续复用");let{snapshotId:c,...d}=b;if(aF(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(aF((0,ah.Y8)(a,Object.keys(b.sources)))!==aF(b.sources))throw Error("写作期间解析资料已经变更,当前事实快照已过期;保留草稿并使用新快照重新规划受影响任务")}let aJ={version:"professional-document-workflow-v114",rules:["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"]},aK={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"]},aL=a=>(0,e.createHash)("sha256").update(a).digest("hex");var aM=c(7258);let aN=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),aO="native-execution-accounting-",aP=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function aQ(a,b){let c=(0,aj.C)("documentGeneration");if(!c||!a.inputSnapshot)return;let d=b??{};return b||(0,j.er)(d,a.inputSnapshot),aP({inputHash:a.inputSnapshot.sha256,requirement:a.requirement??"",title:a.title??"",materialRoot:a.materialRoot??"",algorithm:c,models:k(d),workflowVersion:aJ.version})}var aR=c(19668);c(20297);var aS=c(48161),aT=c.n(aS);class aU extends Error{constructor(a,b,c){super(a),this.promptId=b,this.reason=c,this.name="PromptResolutionError"}}function aV(a,b={}){let c=[...new Set(a.map(a=>String(a||"").trim()).filter(Boolean))];if(0===c.length)throw new aU("生成需要提示词:请在画布底部的输入框里用「+」选择至少一份提示词(\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(aS.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 aU(`提示词不存在:${a}(可能已被删除)。请在画布上用「+」重新选择提示词后重试。`,a,"unknown-id");if(!c.name.trim())throw new aU(`提示词没有名字,无法判定它进哪条链:${a}`,a,"unknown-id");if(!c.content.trim())throw new aU(`提示词内容为空:${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 aW{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 aX=c(79704),aY=c(10059),aZ=c(57268);function a$(a){let b=a.map(a=>({id:(0,aZ.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 a_(a,b,c){if(!c||"string"!=typeof c.version||!c.version.trim())throw Error("缺少当前全文主控计划");let d=a$(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,aZ.DS)(a),f=g.get(e);if(!f||!["technical","commercial","unmeasured"].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("commercial"===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 a0(a){return a.replace(/<[^>]+>/gu,"").replace(/\s+/gu,"").length}function a1(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 a2(a){return"manual_review"===a.repairability||"user"===a.owner}function a3(a){let b=a.provenance?.detectorId?.trim();return b?[b]:a.category?[a.category]:[]}function a4(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}var a5=c(450);function a6(a){return a.replace(/\s+/gu,"").toLowerCase()}function a7(a){return[...new Set(a)]}c(86697),RegExp(`^.{2,36}?表`,"u");let a8="[\\d一二三四五六七八九十]+";RegExp(`^表\\s*${a8}(?:[--..—]\\s*${a8})?\\s*[::、..]?\\s`,"u");let a9=[{pattern:/横道图|甘特图/u,instruction:"以表格式时间轴呈现(阶段与节点、起止时间、与工期目标的关系);表中时间节点必须与总工期及开工竣工日期一致"},{pattern:/网络图|关键线路/u,instruction:"以文字框图呈现(工作节点、先后衔接关系、关键线路标注),节点划分必须与本工程施工组织一致"},{pattern:/组织机构图|组织框图|机构框图|机构图/u,instruction:"以文字框图呈现组织机构层级(部门或岗位、隶属关系)"},{pattern:/平面布置图|布置图/u,instruction:"以分区布置的文字框图或布置要点表呈现(分区、布置内容、管控要求)"},{pattern:/流程图|工艺流程图/u,instruction:"以文字框图呈现流程步骤与衔接关系"}];function ba(a){return a6(a).replace(/[((][^))]*[))]/gu,"").replace(/[图表]+$/u,"")}let bb=/知识库|系统暂未|项目资料暂未|暂未明确|待确认|待资料复核|待系统|通用兜底(?:段落|模板)?|兜底(?:占位|模板|内容)|未检索到|资料不足|无法确认|建议补充|COL\d+|可核验信息|以本项目招标文件明确内容为准/u,bc=String.raw`(?:\d+[.、](?=\s|\*\*)\s*|[((]\d+[))]\s*|[-*+]\s+)`;RegExp(String.raw`\S.+(?:\s|[。;;])${bc}\S.+(?:\s|[。;;])${bc}\S`,"u"),RegExp(`\r?
9
9
  `,"u"),RegExp(`
10
10
  {3,}`,"gu");let bd=/(?<=^|[。;;\n])(?:本方案|本施工组织设计|本工程|本项目|项目部|我方|我公司|投标人)?(?:根据|依据|结合|按照)?(?:本项目|项目)?(?:招标文件|补疑澄清文件|补遗澄清文件|补疑补遗|答疑(?:回复)?文件|答疑修正口径|补充答疑修正口径|澄清文件|工程量清单|设计图纸|施工图纸|图纸资料|设计修改通知单)(?:[、,,及和与\s]*(?:招标文件|补疑澄清文件|补遗澄清文件|补疑补遗|答疑(?:回复)?文件|答疑修正口径|补充答疑修正口径|澄清文件|工程量清单|设计图纸|施工图纸|图纸资料|设计修改通知单|现行规范|规范)){1,}(?:[^。;;\n]{0,40})?[,,]/gmu,be=RegExp(bd.source,"mu"),bf=/编制依据|编制说明|法律法规|规范标准|标准依据/u,bg=/(?:安全|管理|施工|质量|工期|进度|保障|体系|措施|控制|工程|项目|技术|方案|计划|组织|标准|规范|验收|方法|工艺|文明|绿色)/u,bh=/(?:工程施工方案|安装工程施工方案|专业工程施工方案|专项施工方案)$/u;async function bi(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 bj(a){return a.map(a=>`## [${a.category}] ${a.name}
11
11
  ${function(a){let b=a.replace(/```([\s\S]*?)```/gu,(a,b)=>/<OUTLINE>|\|\s*[^\n]+\s*\||#{1,6}\s+|必须|禁止|不得|应当|要求|规则|格式|输出|表格|章节|小节|正文/u.test(b)?`
@@ -26,11 +26,13 @@ ${c}`;if("delete"===d)return a.split(/\r?\n/u).filter(a=>!es(a).includes(e)).joi
26
26
 
27
27
  `:"";return`${e}${d(b)}
28
28
  ${d(b.map(()=>"---"))}
29
- ${c.map(a=>d(a)).join("\n")}`}(a.spec);return ex(b,"insert_table",c,a.at,d)}let eD={name:"insert_table",description:dd("在锚点处插入一张 Markdown 表格(先过表块守卫:表头 + 分隔线 + ≥1 行数据,且各行列数与表头一致),再走与 patch 相同的事务与边界。",'正文需要以正式表格承载清单/参数/对照关系时(表格是评价规则里的加分承载面);或某处"应该有一张表"而目前只有一段罗列句时。','正文禁表场景(招标显式禁表)——那时表会被判为结构缺陷;也不要拿它插"见下表"式的空表或没有表头的表(守卫会直接拒绝);表格内容必须有资料依据,不得为了好看编数据。'),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id"),spec:de.obj("表格规格",{headers:de.arr("表头单元格(非空)",de.str("表头")),rows:de.arr("数据行(≥1 行,每行列数须与表头一致)",de.arr("一行单元格",de.str("单元格"))),caption:de.str("表名/表注(可选;有则作为表前一行输出)")},["headers","rows"]),at:de.obj("插入位置锚点",{text:de.str("锚点原文(逐字取自当前草稿)")},["text"])},["nodeId","spec","at"]),idempotent:!1,idempotentViaSnapshot:!0,handler:eC};async function eE(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw c1("nodeId 不能为空");let d=b.document;if(!d)throw c4("文档事务能力(`ctx.document.commitSection`)","运行时注入:接 `chapterLoop` 的块推进/提交记账");let e=d.readSection(c);if("string"!=typeof e)throw c3(`节点「${c}」不存在或尚无草稿正文,不能提交`);if(!e.trim())throw c1(`节点「${c}」正文为空,不能提交(空块提交会把"没写"标成"写完")`);return"function"==typeof d.commitSection&&await d.commitSection(c),{nodeId:c,committed:!0,committedAt:Date.now(),note:d.commitSection?"已通过事务通道提交":'事务通道未提供 commitSection 钩子;本次仅返回提交回执(S1.3 的显式化目的:让画布能显示"这块定了")'}}let eF={name:"commit_section",description:dd('显式提交一个小节的草稿(现在靠"不返回 toolCall"隐式表达;显式化以便画布显示与循环判定)。','这一块确实写完了、不再改时(提交是**块推进的信号**,也是"我认账"的声明)。',"还想再改(提交后再改会走到重开路径,代价更高);正文为空时提交会被直接拒绝——它只提交已有正文;不能替代当前任务完成与来源核验。"),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id")},["nodeId"]),idempotent:!0,handler:eE};async function eG(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw c1("nodeId 不能为空");if(!a?.anchor||"string"!=typeof a.anchor.text)throw c1("anchor.text 必填(要删的那句/那行的原文)");return ex(b,"delete_span",c,a.anchor,"")}let eH={name:"delete_span",description:dd("删除锚点命中的整句/整行(`applyChapterPatch` 的空 replacement 删除语义),走同一套 4.4 边界与事务。","确定某句是污染内容时必须删(来源罗列句、内部术语句、元话语声明句、重复句)——**删得掉比改得像更重要**;`check` 报了某句类缺陷而改写无法消除时。",'只是"这句写得不好"(那是 `patch_section` 改写,删除会丢信息);一次删掉大段正文(净字数下限会直接拒绝,且删内容比补内容更容易伤到实质判据);也不要连着删多句——每删一句都要有独立的判据依据(`explain_defect` 可查)。'),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id"),anchor:de.obj("要删除的语句锚点(逐字取自当前草稿)",{text:de.str("锚点原文")},["text"])},["nodeId","anchor"]),idempotent:!1,idempotentViaSnapshot:!0,handler:eG},eI={name:"submit_author_task",description:dd("将完整段落、表格、流程图和事实绑定提交到当前冻结作者任务。","取证与必要决定完成后,按作者产物协议提交完整单元集合;任务、合同、快照与评价项由运行时核对。","不能用于扩大合同、换任务、删掉必需评价项或宣称专业质量通过。未决请求如实保留,不得编造事实补足。"),scope:"document-draft",inputSchema:de.object({output:eq},["output"]),idempotent:!1,idempotentViaSnapshot:!0,handler:async(a,b)=>{if(!b.authorTask)throw c4("authorTask","当前运行尚未绑定结构化作者任务");try{return await b.authorTask.submit(a.output)}catch(a){throw c1(a instanceof Error?a.message:String(a))}}},eJ={name:"correct_author_submission",scope:"document-draft",idempotent:!1,idempotentViaSnapshot:!0,description:dd("在服务端保留的真实作者原稿上纠正职责/来源标注或清理协议外形状,不重新输出正文。","提交失败回执给出submissionIndex后,指定错误位置的JSON路径(JSON指针或a[0].b形式);所有段落、表行、图数据守恒后再按同一任务验证。","不能改text/parts文字、标题、表头、行、图节点/关系或未决问题;remove-unknown-field只能删非正文键,drop-empty-fragment只能删仅含空text的片段;实质正文修改另行完整submit并如实计账。纠正不授予来源采用或专业质量通过。"),inputSchema:de.object({submissionIndex:de.int("本任务失败回执给出的实际原稿序号,从0开始"),changes:de.arr("必要的标注或形状纠正",de.obj("纠正项",{path:de.str("实际JSON路径:标注字段,或待清理的协议外键/空片段位置。支持 /a/0/b 与 a[0].b 两种写法"),valueJson:de.str('标注字段的新JSON值(数组或revisionReason字符串);删除类操作填"null"'),op:de.enumStr("操作类别;省略按标注纠正处理",["annotation","remove-unknown-field","drop-empty-fragment"])},["path","valueJson"]),{minItems:1})},["submissionIndex","changes"]),handler:async(a,b)=>{if(!b.authorTask?.correct)throw c4("authorTask.correct","当前运行没有已保留原稿纠正器");try{return await b.authorTask.correct(a.submissionIndex,a.changes)}catch(a){throw c1(a instanceof Error?a.message:String(a))}}},eK=[{name:"ask_chief",scope:"document-plan",idempotent:!0,description:dd("将当前任务的具体职责或方法问题交给主智能体,立即取得结构化裁决及其身份。","提交首稿前确定方法边界、部位工况及定量控制时;提供sourceQueries取得完整依据,主控可给经独立复核的工程控制项及原文序号。按实际任务问题继续查证,同一问题复用已有回执;先使用已给出的合同与完整必要资料,未完成对象不得假称已核定。","普通写作无需调用;不能请求主控代写正文、编造参数或扩大合同。request-human 必须保留为未决请求。"),inputSchema:de.object({question:de.str("具体可回答的问题"),criterionIndices:de.arr("作者协议已给出的当前任务职责序号,从0开始,不复制或猜长ID",de.int("当前任务实际职责序号"),{minItems:1}),sourceQueries:de.arr("先查冻结原文中实际对象与条件,完整片段分页;query各词均须命中,可继续nextOffset",de.obj("一项原文查询",{query:de.str("真实对象或术语,以空格连接同时命中的词"),filePath:de.str("已冻结的完整文件路径,可省略"),offset:de.int("从零开始的匹配片段偏移"),limit:de.int("一次1至8个完整片段")},["query"])),factQueries:de.arr("问题所需的真实事实属性及对象,按完整对象控制组查证;主控从冻结事实查询,不限于评价项原先绑定的事实",{...de.object({attribute:de.str("实际属性名称"),objectName:de.str("实际对象名称,可省略")},["attribute"]),description:"一项冻结事实查询"})},["question","criterionIndices"]),handler:async(a,b)=>{let d;if(!b.chief)throw c4("chief","当前运行未绑定主智能体裁决通道");if(!b.authorTask)throw c4("当前作者职责索引","主控须绑定已委派任务的同一职责序号表");if(Object.keys(a).some(a=>!["question","criterionIndices","sourceQueries","factQueries"].includes(a)))throw c1("主控提问只接受当前criterionIndices协议,不转换退役ID输入");let{resolveAuthorCriterionIndices:e}=await Promise.resolve().then(c.bind(c,33972)),{criterionIndices:f,...g}=a;try{if(!(d=e(b.authorTask.criterionIds,f)).length)throw Error("主控问题须绑定本任务实际职责")}catch(a){throw c1(a instanceof Error?a.message:String(a))}let{chiefDecisionWritingContext:h}=await Promise.resolve().then(c.bind(c,29327));return h(await b.chief.ask({...g,criterionIds:d}))}},eI,eJ,ez,eB,eD,eF,eH];async function eL(a,b){let c=String(a?.item??"").trim(),d=String(a?.reason??"").trim();if(!c)throw c1('item 不能为空(要写清"缺的是什么",不能是"某些资料")');if(d.length<4)throw c1("reason 太短:必须说明**为什么缺**(招标未给/图纸未含/资料未上传),否则人手无法接续");let e=Array.isArray(a?.evidence)?a.evidence.map(a=>String(a??"").trim()).filter(Boolean):[];if(0===e.length)throw c1('evidence 不能为空:请列出**已经找过的地方**(`search_evidence` 的查询词 + 命中的文件/页,或 `discover_files` 的结果)。空证据的声明等价于"我没找,直接报缺"——那是拿声明当偷懒通道。');let f=b.audit;if(!f)throw c4("审计状态写入能力(`ctx.audit.declareMissing`)","运行时注入:接 `session.understanding.missingItems`(已有的只增数组)+ 节点 issue 写入");return await f.declareMissing({item:c,reason:d,evidence:e}),{declared:!0,item:c,recordedAt:Date.now(),recordedTo:"session.understanding.missingItems",evidenceCount:e.length,note:"声明已入账(只增数组)。注意:**声明不减少应写内容**——该节仍需按已有资料写足,缺料处由人在清单上补齐。"}}let eM={name:"declare_missing",description:dd("上报当前任务确需但尚无可靠依据的具体项目属性,保留实际查证记录供主控判断。声明不降低职责或质量要求。","query_project_facts、query_work_packages、query_cad_context、search_evidence、read_source或discover_files的实际回执仍不能核定所需属性,并已向主控提出具体问题时;如实区分未读完、读取失败、适用关系未核定与资料确实缺失。","不把零命中或未预加载当作全部资料缺失;先通过ask_chief核查职责和技术口径。不能编造查证记录,也不能用声明替代必须完成的施工决定或在正文中写后台状态。"),scope:"audit-state",inputSchema:de.object({item:de.str("缺的是什么(具体到字段/参数/图名,如「基坑支护设计参数:锚索张拉锁定值」)"),reason:de.str("为什么缺(招标未给 / 图纸未含 / 资料未上传 / 与已有资料矛盾且无权威可裁)"),evidence:de.arr('已经找过的地方(≥1 条;写查询词与命中的文件/页,或说明"已遍历资料清单,无此文件")',de.str("一条搜寻记录"))},["item","reason","evidence"]),idempotent:!0,handler:eL};async function eN(a,b){let c=a?.issue;if(!c||"object"!=typeof c)throw c1("issue 必填(要声明的是**哪一条缺陷**,不能泛指)");let d=String(c.message??"").trim();if(!d)throw c1("issue.message 不能为空(缺陷必须有可读的说明)");let e=c.level;if("error"!==e&&"warning"!==e&&"info"!==e)throw c1("issue.level 必须是 error / warning / info 之一");let f=String(a?.reason??"").trim();if(f.length<8)throw c1("reason 太短:必须说明实际查证、主控判断或提交拒绝的结果,以及当前不能完成的具体原因;不得编造尝试或为了声明反复改写。");let g=b.audit;if(!g)throw c4("审计状态写入能力(`ctx.audit.declareUnfixable`)","运行时注入:接新增的 `unfixable` 通道 → `suspensionChecklist`(`suspensionChecklist.ts:40` 已有挂起通道)");await g.declareUnfixable({issue:c,reason:f});let h=c.severity;return{declared:!0,message:d,detectorId:c.provenance?.detectorId,recordedAt:Date.now(),recordedTo:"unfixable → suspensionChecklist",stillBlocker:"blocker"===h||"error"===e,note:'已报出并进入挂起清单。**声明不改变缺陷等级**——它仍是阻断级,只是从"我没修"变成"我修不动并已上报"。后续:块轮次/工具数耗尽时该节点置 `blocked`(**不是 `completed`**)。'}}async function eO(a,b){let c=String(a?.question??"").trim();if(c.length<8)throw c1('question 太短:必须写成**一个可回答的问题**(并列候选与各自来源,见 A5.2「让人选」),不写成"我判不了,你来看"');if("boolean"!=typeof a?.blocking)throw c1("blocking 必填且必须是布尔:它决定本次是**挂起等人**还是**记账继续**,不能靠默认值蒙混");if(!/[??]|是否|哪一|哪个|请确认|请裁定/u.test(c))throw c1("question 缺少疑问形态(未见 ?/? 或 是否/哪一/请确认 等):请写成一个**可回答**的问题,并列出候选与来源");let d=b.audit;if(!d)throw c4("审计状态写入能力(`ctx.audit.requestClarification`)",'运行时注入:**新建** `clarificationOverrides` 的**待答**槽(现有只有"已答"侧)');return await d.requestClarification({question:c,blocking:a.blocking}),{requested:!0,question:c,blocking:a.blocking,recordedAt:Date.now(),recordedTo:"clarificationOverrides.pending",note:a.blocking?"已挂起等人裁决(blocking=true)。挂起期间**不要**对同一处反复重问,也不要自己选一个口径先写下去。":"已记账但未挂起(blocking=false):先按**权威阶梯最高的候选**继续写,并在下次自查时复查。"}}let eP=[eM,{name:"declare_unfixable",description:dd("记录当前固定任务无法完成的具体阻断及真实原因,保留已生成的正确内容与查证回执;声明不会将任务标为完成。","依据实际源读取、主控裁决或结构化提交拒绝,能够指出仍未满足的具体职责或控制条件时;无法完成是工程或来源条件限制时可直接上报,不要求先改写若干轮。","不能跳过难点、虚构修复次数或把工具故障解释为资料缺失。专业疑问先用ask_chief,仍未核定的控制点保留decisionRequests;不得扩大冻结任务或用重复改写消耗预算。"),scope:"audit-state",inputSchema:de.object({issue:de.anyObj("实际未满足职责或控制条件的具体阻断对象,须含真实level与message;已收到校验问题时保留原样"),reason:de.str("实际源读取、主控判断或提交拒绝的结果,以及仍不能完成的原因;不编造改写次数")},["issue","reason"]),idempotent:!0,handler:eN},{name:"request_clarification",description:dd("向人提出一个**可回答的口径裁决问题**(写进待答槽;`blocking=true` 时挂起等人,`false` 时记账继续)。A5.2 的要旨:把「要人找」变成「让人选」。","A5.1 的 **C 级**三类:**扩资料范围**(`expand_scope` 的连带)\xb7 **口径裁决**(同一事实多个候选值、权威阶梯也分不出高下,N9)\xb7 **改动超阈值**;以及规划本身不合理到影响得分(如小节顺序与评标习惯冲突)。写法:**列出候选值 + 各自来源 + 权威级 + 你的建议**,让人一次点选。",'**自己能查能判的不要问人**——先 `lookup_authoritative`(权威值)/ `search_evidence`(资料内可查)/ `verify_numbers`(算得出来的);把问题写成"我判不了,你来看"(无候选、无来源)等于把工作退回给人;**不要用 blocking=true 逃避写作**——挂起只用于真的没法继续的地方,其余靠 `declare_missing` 记账继续;扩资料范围本身走 `expand_scope`(它带审批通道),本工具只用于"该不该扩/扩到哪"的口径问题。'),scope:"audit-state",inputSchema:de.object({question:de.str("可回答的问题(须含疑问形态 + 候选值与各自来源 + 权威级;建议附上你的建议)"),blocking:de.bool("true = 挂起等人;false = 记账继续。**必填**(不给默认值:挂起与否是决策,不是格式)")},["question","blocking"]),idempotent:!0,handler:eO}];function eQ(a){return String(a??"").replace(/\s+/gu,"").replace(/[::==]/gu,"=").toLowerCase()}async function eR(a,b){let c=(Array.isArray(a?.facts)?a.facts:[]).map(a=>String(a??"").trim()).filter(Boolean);if(0===c.length)throw c1("facts 不能为空:请列出**本块实际写进正文**的事实键(从「本主题块专属事实」清单里取)");let d=b.factPlacement;if(!d)throw c4("事实落位记账能力(`ctx.factPlacement`)","运行时注入:由章写作层按**本块分配的事实清单**构造(`agentToolWiring.factPlacementFor`)");let e=[],f=[];for(let a of c){let b=function(a,b){let c=eQ(a);if(c)for(let a of b){let b=eQ(a);if(b&&(b===c||b.startsWith(`${c}=`)||b.startsWith(c)||c.startsWith(b)))return a}}(a,d.allowed);b?e.push(b):f.push(a)}if(d.record({accepted:e,unknown:f}),0===e.length){let a=d.allowed.slice(0,6).map(a=>`「${a.slice(0,24)}」`).join("、");throw c1(`报出的 ${c.length} 条**一条都不在本块可见事实里**(可能是别的节的事实或写错了键)。本块可见的是:${a||"(本块没有专属事实——那就不必调用本工具)"}`)}return{recorded:!0,accepted:e,unknown:f,acceptedCount:e.length,note:"已按**本块可见事实**记账(集合连接:判定不再只靠字面命中)。这是观测面不是门:漏报不会让本节失败,但会让「哪块漏了哪条」少一条写手侧的证词——写下正文之后顺手报一次即可,不必逐条核对。"+(f.length>0?`(${f.length} 条不在本块可见事实里,只回执、未落账)`:"")}}let eS=[{name:"record_fact_placement",description:dd('回报"本节实际用上了哪几条事实"(**逐条回链**):系统按**集合连接**记账,"参数/事实是否落位"不再只靠字面匹配去猜。',"正文写完(或 `commit_section` / `patch_section` 落地)之后,如果本节用了「本主题块专属事实」清单里的条目——把**用上的那几个键**报一次。一次调用报完,不必逐段调。",'**不要把它当验收清单**(漏报不会让本节失败,系统仍有字面判定的兜底);**不要报清单外的键**(那些不落账,只会出现在回执里);**不要为了凑数把没用的事实也报上**——账是给"哪块漏了哪条"用的,报了假的等于把缺口藏起来。'),scope:"readonly",inputSchema:de.object({facts:de.arr("本节实际用上的事实键(写「本主题块专属事实」清单里的键即可,如「计划工期」)",de.str("一个事实键"))},["facts"]),idempotent:!0,handler:eR}],eT={error:0,warning:1,info:2},eU={blocker:0,warning:1,suggestion:2};function eV(a){return((a.severity?eU[a.severity]:void 0)??3)*10+(eT[a.level]??3)}async function eW(a,b){let c=b.audit;if(!c||"function"!=typeof c.listDefects)throw c4("缺陷清单读取能力(`ctx.audit.listDefects`)","运行时注入:读 `session.validationIssues` + `qualityBundle`(附录 A.8:可读但当前无接口,需补一个只读访问器)");let d=a?.scope;if(void 0!==d&&("object"!=typeof d||null===d||Array.isArray(d)))throw c1("scope 若要给,必须是对象 `{chapterId?}`");let e=await c.listDefects(d);if(!Array.isArray(e))throw c1("缺陷清单能力返回了非数组——返回形状是接口的一部分,不能含糊");return[...e].sort((a,b)=>{let c=eV(a)-eV(b);if(0!==c)return c;let d=String(a.source??"").localeCompare(String(b.source??""));return 0!==d?d:a.message.localeCompare(b.message)})}let eX=[{name:"list_defects",description:dd('读出当前文档的缺陷清单(阻断级优先排序,可带 `chapterId` 缩小范围)。这是"我现在还欠什么"的账本。','每轮收尾前对账;或不确定"还有什么没解决"时(比凭记忆列缺陷可靠得多——记忆里的缺陷清单总是偏乐观)。','**不要拿它当 `check` 的替代**:`check` 是对**指定文本**现跑判据(能看到"我刚改的这版有没有引入新问题"),`list_defects` 读的是**已入账**的历史清单(可能滞后于你刚做的改动)。改完正文必须 `check` 复验,不能靠 `list_defects` 变没变来确认。'),scope:"audit-state",inputSchema:de.object({scope:de.obj("范围(可选)",{chapterId:de.str("只看某一章的缺陷")})}),idempotent:!0,handler:eW}],eY=["C01","C02","C03","C04","C05","C06","C07","C08","C09","C10","C11","C12","C13","C14","C15","C16"],eZ={C01:"工程概况与总体理解",C02:"主要施工内容 / 分部分项施工方案",C03:"重难点分析与对策",C04:"施工部署与组织",C05:"进度计划与工期保障",C06:"质量保证体系与措施",C07:"安全文明与危大工程管控",C08:"劳动力材料机械设备配置",C09:"绿色文明施工与环保",C10:"应急管理体系",C11:"竣工/验收/移交/保修",C12:"劳务实名制与农民工工资保障",C13:"危大工程专项管控",C14:"交通导改与管线保护",C15:"居民协调与既有保护",C16:"成品保护与交叉施工"},e$={C01:"工程概况",C02:"主要施工内容",C03:"重难点分析",C04:"施工部署",C05:"进度计划",C06:"质量保证",C07:"安全文明与危大",C08:"资源配置",C09:"绿色文明施工",C10:"应急管理",C11:"竣工与保修",C12:"劳务实名与工资",C13:"危大专项管控",C14:"交通导改与管线",C15:"居民协调与既有保护",C16:"成品保护与交叉施工"},e_=["building","municipal","renovation","decoration","general"],e0={building:"房建工程",municipal:"市政工程",renovation:"老旧小区改造",decoration:"装饰装修工程",general:"通用/其他"},e1=/\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d*,?\d*\})/u,e2=/\((?:[^()\\]|\\.)*\|(?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d*,?\d*\})/u,e3=/\\[1-9]/u;function e4(a){if("string"!=typeof a)return!1;let b=a.trim();if(0===b.length||b.length>200||e1.test(b)||e2.test(b)||e3.test(b))return!1;try{RegExp(b,"u")}catch{return!1}return!0}let e5=[{id:"boq",label:"工程量清单"},{id:"drawings",label:"图纸"},{id:"tenderDocument",label:"招标文件"},{id:"clarification",label:"答疑/补遗"},{id:"geologyReport",label:"地勘报告"},{id:"projectMaterial",label:"项目资料"},{id:"userRequirement",label:"用户要求"}],e6=/^[a-z][a-z0-9-]*$/u,e7=[{pattern:/概况|总体|理解|说明|编制/u,goal:"依据真实资料说明范围、专业组成、实施条件和编制依据,区分已知事实与核验事项",mustCover:["工程名称、地点、规模、工期和质量目标等有出处且适用的项目事实","工程范围、专业组成、接口和场地条件;关键未知条件保留核验责任","实际采用的招标补遗、法规、标准及管理文件;名称、编号、版本和资格状态可核,实际引用与依据对应","全部真实专业、单体、系统和特殊构造的施工与交接责任,不强凑专业数量","单项目多属性以信息项—内容纵向或按含义分组;对象比较才横向,完整保留对象、控制数值和单位,不以固定列数或表数删数据"]},{pattern:/主要施工内容/u,goal:"完整承接真实对象、方法和接口,不以工程量罗列代替施工说明",mustCover:["全部实际专业、部位和对象,近名归并不遗漏不同职责","对应对象的工程量口径、准备条件、顺序、方法和专业接口","按对象和工法控制需要说明真实规格或参数、质量安全控制、检验验收及记录交接"]},{pattern:/主要分部分项工程施工方案|主要施工方法/u,goal:"按真实对象和工法说明可执行操作、控制和验收,必要参数随实际控制用途展开",mustCover:["各分项、独立系统和特殊构造的方法职责,不因工程量小或名称近似遗漏","对象部位、前置准备与验收、关键步骤、工作面和相邻专业衔接","工法确需的材料规格、操作或检验条件;数值具有来源、对象、单位和完整前提,未知不补造","工艺质量、安全、成品保护、记录及交接验收,不统一要求参数或环节数量"]},{pattern:/重点|难点/u,goal:"说明真实对象及工况的成因、影响、针对性控制和处置闭环",mustCover:["实际对象、部位、工况、成因和影响范围","对应方法、接口或专项控制及真实适用条件","责任、检查验收节点、异常处置、整改复核和记录","需要数值控制时准确引用参数及依据;管理或接口问题以完整程序表达,不按量化占比评分"]},{pattern:/部署|总体|流水|顺序/u,goal:"按真实范围、工作面和同一施工活动网络组织阶段及资源",mustCover:["真实对象、区段、工作面及交接界面","工序依赖、阶段顺序、穿插和必要等待,不照搬单一类型的整套工序","同一计划的资源、能力约束、动态协调及责任"]},{pattern:/进度|工期/u,goal:"基于工期约束、工程量和统一施工计划说明进度可实施性",mustCover:["总工期与日期口径、活动网络、依赖、必要等待和关键线路","阶段及滚动计划、资源工作面能力、供应和交接","进度监测、偏差原因、纠偏调整及责任,拟定节点与资料事实分开表达"]},{pattern:/质量/u,goal:"按适用质量要求落实材料、过程、验收、整改与资料闭环",mustCover:["有出处的质量目标、适用验收依据、对象和条件","交底、样板或首件、自检互检专检的实际责任及程序","适用复验与见证取样、隐蔽验收、试验及报验,参数和比例仅按真实适用要求","通病或缺陷防治、记录、整改复验及资料闭合","交接、保修与缺陷响应;有依据的期限准确写出,不补造承诺值"]},{pattern:/安全|危大|风险/u,goal:"按真实作业对象和工况落实风险、专项程序、检查整改及应急控制",mustCover:["实际安全目标与责任,不统一补造伤亡率、轻伤频率或达标率","对象、部位、作业形态和风险辨识,关键工况缺失保留核验责任","危大候选和分级以同对象完整参数及适用规则为依据,未决不等于不触发或已需专家论证","按已成立的条件落实方案编审、必要论证、交底、实施、监测和验收责任","人员设备、临电、消防及防护按实际形式组织,必要参数和检验周期具有真实适用依据","安全检查、隐患处置、复查记录和应急响应"]},{pattern:/资源|材料|设备|劳动力|人材机/u,goal:"使人机料、仪器和设施同实际活动、工程量、能力及阶段对应",mustCover:["设备适用作业、选型依据、能力约束、投入及进退场","工种、班组、工作面、阶段安排及交接","材料技术要求、采购批次、验收保管及供应","同一施工计划的资源口径和推导依据,区分拟定配置与现场已投入事实","表格按对象比较与阶段关系组织,完整对象、控制数值和单位可读;单对象多属性不堆成无比较目的的十几列单行,真实宽表保留全部字段"]},{pattern:/文明|绿色|环保|扬尘|噪声/u,goal:"按真实现场、作业影响及适用属地要求组织环境保护和文明施工",mustCover:["适用围挡、覆盖、清洗、场地和运输扬尘措施,不自动套固定百分比承诺","实际噪声振动、时段、污水、固废及交通秩序控制","监测检查、预警、处置复查、责任及记录,限值和频次仅按真实依据","适用节水节材节地节能和环保措施,不强凑每类数字或声称已完成评价"]},{pattern:/应急|预案/u,goal:"按真实风险源落实预警、响应、救援和恢复职责",mustCover:["实际风险、预警触发条件、组织及职责","与风险和救援条件相符的物资设备、通信协同","适用处置、疏散、报告救援、后期恢复、培训演练和记录,不套固定事故名单或数量"]},{pattern:/竣工|验收|移交|保修/u,goal:"按真实交付范围组织清理、验收、整改、移交和缺陷响应",mustCover:["实际收尾清理、废弃物处置和设施恢复","验收、缺陷记录、责任、整改复验和交接条件","实物资料移交、签认、保修响应及有依据的期限"]},{pattern:/工资|劳务|实名/u,goal:"按真实用工、合同和适用规定落实实名、工资、保险及争议处置",mustCover:["实名登记、合同考勤的适用对象、责任及资料管理","适用工资支付、专户代发、保证措施和台账,不把制度要求写成已开户或已支付","适用保险、参保、事故申报及劳动争议处理责任"]},{pattern:/交通导改|交通导行|交通组织|导改|管线保护|占道/u,goal:"对真实交通及管线接口说明调查、阶段保障与保护责任,不按工程类型排除",mustCover:["真实或需核验的交通、出入口及管线条件与调查责任","需要的阶段导改、通行能力、围挡隔离及恢复条件","实际通行保障、管线探明保护、权属协同和应急","适用标志标线、警示照明、监护交接,不把拟调查写成已调查"]},{pattern:/居民|扰民|既有(?:设施|管线|建筑|构筑物)保护|沟通协调|公众参与/u,goal:"按真实受影响对象组织沟通、通行、扰动控制与保护,不假定所有改造都有在场居民",mustCover:["实际影响对象、诉求和调查沟通责任,不补造户数或已走访事实","实际噪声扬尘振动和作业时间影响及控制","分区通行、出入口保障及既有设施保护接口","公示协调、投诉响应、责任记录和恢复移交"]},{pattern:/成品保护|半成品保护|交叉施工|交叉作业/u,goal:"按真实成品、系统和作业接口组织保护、交接与责任转移",mustCover:["真实保护对象、风险、责任和形式,不强行套齐房建饰面部位","工序作业面交接条件、检查记录、责任转移和专业协调","损坏记录、责任认定、修复复验、清洁和最终移交"]}];var e8=c(16646);let e9=new Map(e8.ts.map(a=>[a.id,{id:a.id,name:a.name}])),fa=[{id:"c07-safety-dangerous-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:["building"],sectionKeywords:["安全","危大","风险","安全文明","安全技术措施","危大工程","危险源"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"tender.safetyRequirements",source:"tenderDocument",required:!0}],structure:[{title:"安全管理目标与岗位职责",required:["有来源的目标、适用对象与责任,不能补造伤亡率或达标率"]},{title:"危险源辨识与危大工程管理",required:["对象、部位、作业形态、来源与完整必要参数","已成立的判据与未决条件分别表达"]},{title:"专项施工方案管理与实施程序",required:["编制审核审批、达到适用规模时的论证、交底和验收责任"]},{title:"作业安全与临时用电",required:["对应人员设备、防护形式、用电系统和必要控制依据"]},{title:"安全检查、隐患整改与应急处置",required:["检查对象、责任、异常处置、复查及记录"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","scaffold","tower-crane","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","基坑、支撑、架体、吊装等只按实际对象和工况选用;参数未齐保持核验责任,不按楼高或总量下全项目结论。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c07-safety-dangerous-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:["municipal"],sectionKeywords:["安全","危大","风险","沟槽","有限空间","管线","占道"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!0},{key:"material.existingPipelines",source:"projectMaterial",required:!0}],structure:[{title:"安全管理目标与岗位职责",required:["有来源的适用目标、对象及责任"]},{title:"沟槽与降排水安全",required:["深度、土水条件、支护或放坡、监测及周边接口","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"有限空间安全",required:["空间与进入作业条件、通风检测、监护及救援","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"管线与占道接口",required:["探明保护、权属协同、交通隔离及应急","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"吊装与现场安全",required:["实际方法、设备索具、工作条件、检查整改与记录","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","市政标签不能证明地下水、入井作业或占道事实,也不能排除真实房建结构和设备作业;按实际范围核验。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c14-traffic-diversion",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C14",projectTypes:["municipal"],sectionKeywords:["交通导改","导行","管线保护","占道","交通组织","围挡"],sectionRegex:"交通导改|导行|管线保护|交通组织"},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.trafficLayout",source:"drawings",required:!0},{key:"material.existingPipelines",source:"projectMaterial",required:!0},{key:"tender.trafficRequirements",source:"tenderDocument",required:!1}],structure:[{title:"交通现状调查与施工接口管理",required:["实际或需调查的交通、出入口、管线和调查责任"]},{title:"分阶段交通导改与围挡设置",required:["阶段路线、能力校核、隔离及撤除恢复条件","选用条件:确有导改需要时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"通行保障",required:["实际行人车辆、沿线单位、出入口及无障碍需要"]},{title:"管线保护与警示",required:["探测保护、权属协同、标志照明、监护应急","选用条件:涉及相应接口时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"交通设施恢复与移交",required:["恢复条件、检查验收及责任转移"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-road","municipal-pipe"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","导改依赖真实道路、交通与审批条件;非市政工程同样可能有接口,不把计划调查写成已经调查。"],nonDeterministic:!0}],examples:{good:"实际交通与管线条件决定分阶段通行、围挡及保护方法,说明施工与运营接口、监护和恢复交接。",defect:"未查明管线就写已探明或已迁改,所有场内运输都套社会道路导改。"}},{id:"c15-resident-coordination",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C15",projectTypes:["building","municipal","renovation","decoration"],sectionKeywords:["居民","协调","扰民","既有","沟通","公示","通行"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0},{key:"clarification.residentRequirements",source:"clarification",required:!1}],structure:[{title:"周边影响调查与沟通协调",required:["真实使用者或居民、影响范围、诉求及调查责任"]},{title:"施工扰动控制与通行保障",required:["实际噪声扬尘振动时段、分区、通道和出入口"]},{title:"既有设施保护",required:["对象、保护形式、接口与监测","选用条件:存在相应设施时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"施工公示、投诉处理与环境恢复",required:["渠道、响应处置、责任记录、恢复与移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["facade-renovation","structural-strengthen","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","改造不当然存在在场居民或特定户数;未知保留调查责任,其他类型的真实公众接口也应承接。"],nonDeterministic:!0}],examples:{good:"围绕实际受影响人员、出入口及设施组织施工时段、沟通、保护和投诉处置,恢复结果形成交接。",defect:"照抄居民协调模板却未识别受影响对象,或把拟踏勘写成已经完成调查。"}},{id:"c16-finished-product-protection",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C16",projectTypes:[],sectionKeywords:["成品保护","交叉施工","交接","保护措施","收口"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1},{key:"tender.finishRequirements",source:"tenderDocument",required:!1}],structure:[{title:"成品保护范围与岗位职责",required:["本项目实际成品、半成品、系统及风险,保护形式与责任"]},{title:"作业面交接与保护措施",required:["各对象工序接口、移交检查、责任转移、污染与损坏防护"]},{title:"交叉作业协调",required:["真实穿插顺序、界面冲突处置和交接记录"]},{title:"成品损伤修复与交付",required:["损坏记录、责任认定、修复复验、清洁及移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","ceil-partition","painting","door-window","electrical"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","保护对象按真实工程选择,不能强行套齐地面墙面吊顶门窗设备,也不能只用饰面清单排除其他系统。"],nonDeterministic:!0}],examples:{good:"保护对象与施工状态明确,移交签认后由下一作业保护,交叉施工先核可作业条件,破损由责任方处理并复验。",defect:"每种材料都套同一句覆盖保护,未说明谁移交、谁接收及相邻工序如何避免损伤。"}},{id:"c02-major-content-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C02",projectTypes:["building"],sectionKeywords:["主要施工","分部分项","施工方法","主体结构","基础工程"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"分项工程范围与施工接口",required:["全部实际单体、专业、系统和特殊构造及其来源"]},{title:"施工准备与方法",required:["对象部位、前置验收、关键动作、工序依赖和专业衔接"]},{title:"工艺控制与验收",required:["工法确需的真实规格参数、质量安全、检验记录与交接"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["earthwork-excavation","earthwork-backfill","foundation-pit-support","pile-foundation","formwork-works","rebar-works","concrete-works"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","按本项目房建对象选工法,独立机电、室外道路或管线存在时同样覆盖,不以工程类型绝对禁写。"],nonDeterministic:!0}],examples:{good:"本分项先核工作面与前工序交接状态,再说明所选方法的实施动作、控制及合格后移交;不同材料体系分别写条件。",defect:"“放样→安装→验收”只有动作名单;“以专项方案为准”将当前技术决定转给后续。"}},{id:"c02-major-content-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C02",projectTypes:["municipal"],sectionKeywords:["主要施工","分部分项","施工方法","沟槽","管道","路基","路面"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!1}],structure:[{title:"分项工程范围与施工接口",required:["实际道路、管网、构筑物及其他专业的来源和范围"]},{title:"施工准备、土方与降排水施工",required:["测量管线核验、真实地质条件、开挖支护和排水","选用条件:涉及时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"专业工程安装与场地恢复",required:["管道接口或道路各层方法、试验、回填恢复及相关条件","选用条件:涉及时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"施工质量控制与验收",required:["对应工法的必要规格参数、质量安全、检验及移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不是所有市政都有沟槽、检查井或沥青;具体试验方式取决于系统和真实技术要求,不固定套闭水试验。"],nonDeterministic:!0}],examples:{good:"本分项先核工作面与前工序交接状态,再说明所选方法的实施动作、控制及合格后移交;不同材料体系分别写条件。",defect:"“放样→安装→验收”只有动作名单;“以专项方案为准”将当前技术决定转给后续。"}},{id:"c08-resources",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C08",projectTypes:[],sectionKeywords:["资源","劳动力","机械设备","材料","人材机","试验检测","临时设施"]},requires:[{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"施工机械设备选型与作业能力核算",required:["实际作业选型、能力、投入数量和阶段进退场的可核依据"]},{title:"劳动力配置与班组组织",required:["工种、作业面、班次、阶段投入和交接依据"]},{title:"材料采购与供应计划",required:["技术要求、批次、验收保管和活动衔接"]},{title:"检测仪器及临时设施配置",required:["用途、适用能力、来源或计划依据及布置条件","选用条件:确有需要时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["scaffold","tower-crane","electrical-hookup"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","配置来自同一实际施工计划,与工程量、工效、工作面、班次、等待和能力对应;拟定投入不冒称现场已投入。","资源表按真实对象比较和阶段关系组织,完整保留对象、控制数值和单位;单对象多属性纵向或分组,真实宽表保留字段,不以列数或表数删数据。"],nonDeterministic:!0}],examples:{good:"班组机具与材料供应对应工作面、使用窗口及产能,阶段同期资源矩阵得出峰值,不将采购设备与施工机械混列。",defect:"把各专业独立峰值相加,按合同天数平均分配人数,或在设备表填写未经核实的本企业库存。"}},{id:"c05-schedule",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C05",projectTypes:[],sectionKeywords:["进度","工期","计划","节点","里程碑","保证措施"]},requires:[{key:"schedule.totalDuration",source:"tenderDocument",required:!0},{key:"boq.quantities",source:"boq",required:!0}],structure:[{title:"总进度与关键线路",required:["工期日期口径、实际活动、依赖、必要等待与节点"]},{title:"阶段协调与滚动计划",required:["资源工作面能力、供应交接、编制调整责任"]},{title:"进度偏差分析与工期保障",required:["监测分析、纠偏、组织资源技术保障及气候影响条件"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","开工日期未明采用相对日期;不压缩必要养护试验等时间凑工期,不独立重造资源和活动网络。"],nonDeterministic:!0}],examples:{good:"活动明确前后关系和工作面放行,时长对应施工量与有效产能,材料到货、检测和必要等待进入同一网络。",defect:"相加阶段天数即宣布满足工期、先写关键线路再说日后计算,无法复核搭接和同期资源。"}},{id:"c06-quality",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C06",projectTypes:[],sectionKeywords:["质量","验收","三检","样板","复试","隐蔽","通病","保修"]},requires:[{key:"drawing.specs",source:"drawings",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"tender.qualityStandard",source:"tenderDocument",required:!0}],structure:[{title:"质量管理目标与验收依据",required:["真实目标、对象、规范资格及验收条件"]},{title:"材料验收与施工过程质量控制",required:["交底样板、材料复验、适用取样、隐蔽验收和报验"]},{title:"质量缺陷处理与验收资料管理",required:["实际通病、检验记录、整改复验、资料闭合"]},{title:"工程交接与保修服务",required:["移交条件、响应责任和有依据的期限"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["concrete-works","rebar-works","waterproofing"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","检测项目、比例、频次和允许偏差仅在实际适用且可核时写明;完整责任程序不因没有数字而判浅。"],nonDeterministic:!0}],examples:{good:"围绕实际实体写检验对象、方法、合格状态与记录,不合格由责任岗位组织处置和复验,合格后移交。",defect:"质量章重复整套施工工艺或只写三检制、确保优良,未解释怎样证明实体合格。"}},{id:"c10-emergency",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C10",projectTypes:[],sectionKeywords:["应急","预案","演练","应急响应","应急物资","事故"]},requires:[{key:"boq.divisions",source:"boq",required:!1},{key:"material.riskSources",source:"projectMaterial",required:!0},{key:"tender.safetyRequirements",source:"tenderDocument",required:!1}],structure:[{title:"应急预警与组织职责",required:["实际风险源、触发条件、指挥协同及职责"]},{title:"突发事件处置与应急救援",required:["适用场景、警戒疏散、初期处置、报告救援及安全条件"]},{title:"应急物资、通信保障与施工恢复",required:["对应救援能力、供应存放、通信、善后复盘"]},{title:"应急培训、演练与记录管理",required:["适用要求、组织安排及反馈闭环"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["fire-protection","scaffold","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","预案和物资匹配真实风险及救援条件,不固定套事故名单、半年频次或灭火器数量。"],nonDeterministic:!0}],examples:{good:"异常按实际风险和现场接口分级处置,明确停工、隔离、撤离、通信和专业救援条件,恢复由检查结果放行。",defect:"只列应急小组姓名或要求人员盲目进入事故空间,未明确响应动作和实际救援资源。"}},{id:"c12-labor-wage",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C12",projectTypes:[],sectionKeywords:["工资","劳务","实名","农民工","工伤","考勤"]},requires:[{key:"material.laborPlan",source:"projectMaterial",required:!0},{key:"tender.wageRequirements",source:"tenderDocument",required:!0},{key:"clarification.wageGuarantee",source:"clarification",required:!1}],structure:[{title:"用工实名制与劳动合同管理",required:["适用人员、合同登记、考勤、分包及资料责任"]},{title:"工资支付保障与台账管理",required:["实际适用专户代发、保证措施、支付核验和争议处理"]},{title:"用工保险与事故申报",required:["适用参保范围、信息管理、事故申报及责任"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","制度要求与已开户已参保已支付事实分开表达,不补造登记率、账户、银行或期限;仍保留依法适用的保障责任。"],nonDeterministic:!0}],examples:{good:"用工、实名和工资安排分别明确责任、台账、核对及异常处置,承接本项目真实适用要求,拟实施程序不冒称已开户落实。",defect:"把报价人工费下限当班组生产配置,或用“资金充足绝不拖欠”代替核验与处置程序。"}},{id:"c01-overview-basis",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C01",projectTypes:[],sectionKeywords:["概况","编制依据","总体","理解","说明","编制","范围"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"tender.scope",source:"tenderDocument",required:!0},{key:"drawing.specs",source:"drawings",required:!1},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"工程概况与施工条件",required:["有出处的基本信息、专业组成、实施边界、已知条件和关键核验责任"]},{title:"编制说明与编制依据",required:["实际引用的资料法规标准管理文件、名称编号版本、适用范围和资格状态"]},{title:"专业工程组成与施工接口",required:["全部实际对象及接口,不强凑专业或依据类别数量"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","实际引用与编制依据完整对应;源码或源文件给了名称编号不等于已确认现行或批准采用,缺字段不猜补。","单项目多属性用信息项—内容纵向或按含义分组,对象比较才横向;对象、控制数值与单位完整可读,真实宽表保留全部字段,不强设列数或每章表数。"],nonDeterministic:!0}],examples:{good:"概况按实际工程范围说明对象与条件,并解释这些条件如何影响部署;编制依据列正文实际采用的名称、编号和用途。",defect:"只堆项目名、面积与“严格按图施工”,或将参考标准目录全部抄入依据,不能说明工程理解与实际采用。"}},{id:"c03-difficulty-control",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C03",projectTypes:[],sectionKeywords:["重点","难点","对策","措施","控制"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"工程重难点成因与施工影响",required:["真实对象、部位、工况、接口、成因及影响"]},{title:"工程重难点控制措施",required:["对应方法措施、实际适用条件和必要控制依据"]},{title:"控制措施责任分工与检查整改",required:["检查验收、异常处置、整改复核及记录"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","按问题本身的控制需要写参数;管理和接口难点可用完整责任程序表达,不要求每条指标、量化占比或固定措辞。"],nonDeterministic:!0}],examples:{good:"先说明真实条件造成的施工制约,再给出对应的方法、资源和接口,明确检查与异常处理如何解除制约。",defect:"将常见工艺全部称作重难点、只列风险名称与“加强管理”,没有成因与措施关系。"}},{id:"c03-difficulty-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C03",projectTypes:["building"],sectionKeywords:["重点","难点","基坑","支模","混凝土","垂直运输","既有建筑"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"改造工程范围与施工重难点",required:["根据真实范围选择基坑、支撑、混凝土、运输或既有接口,不自动套齐"]},{title:"改造施工方法与实施条件",required:["问题成因、对应措施、必要参数及专项适用依据"]},{title:"改造施工责任分工与检验",required:["前置验收、监测检查、异常处置、交接及闭环"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","concrete-works","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不因房建标签自动要求深基坑、高支模、大体积、群塔或专家论证;未核实工况继续保留适用性核验。"],nonDeterministic:!0}],examples:{good:"先说明真实条件造成的施工制约,再给出对应的方法、资源和接口,明确检查与异常处理如何解除制约。",defect:"将常见工艺全部称作重难点、只列风险名称与“加强管理”,没有成因与措施关系。"}},{id:"c04-deployment-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["building"],sectionKeywords:["部署","流水","顺序","区段","总体安排","穿插"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"施工区段与工作面划分",required:["实际单位工程和专业分组、作业面、施工条件及交接"]},{title:"施工阶段划分与工序衔接",required:["真实活动依赖、穿插、必要等待及相邻专业接口"]},{title:"施工资源配置与动态协调",required:["同一计划的能力、投入、调整及责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","仅对真实存在的基础主体装饰机电等组织,不能将全套新建房建链强加改造或混合工程。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["municipal"],sectionKeywords:["部署","流水","顺序","区段","沟槽","管线","围挡"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0}],structure:[{title:"施工区段划分与专业接口",required:["实际井段桩号或其他工程对象,通行及专业界面"]},{title:"施工阶段与穿插",required:["实际道路管线构筑物等的依赖、工作面、等待及恢复条件"]},{title:"施工资源配置与交通导改协调",required:["同一计划能力投入与实际保通隔离调整责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","市政工程可能包含房建和设备对象;交通导改、沟槽、沥青仅按真实范围采用,不绝对禁写其他专业。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-renovation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["renovation"],sectionKeywords:["部署","流水","顺序","分区","居民","既有"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0}],structure:[{title:"改造工程范围与使用条件",required:["保留拆改对象、场地使用者、分区、通行和调查责任"]},{title:"改造阶段衔接与既有设施保护",required:["真实拆改及新旧接口、专业穿插、稳定保护、必要等待和恢复"]},{title:"改造资源配置与周边影响协调",required:["同一计划的投入能力、作业时段和影响控制"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["facade-renovation","structural-strengthen","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不假定每个改造都有居民在场,也不按类型排除真实深基坑、高支撑或新增主体;依对象与完整条件组织。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-decoration",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["decoration"],sectionKeywords:["部署","流水","顺序","收口","成品保护","作业面"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1},{key:"tender.finishRequirements",source:"tenderDocument",required:!1}],structure:[{title:"装饰施工部位与工作面划分",required:["装饰对象、构造层次、基层验收和作业面交接"]},{title:"装饰施工顺序与专业穿插",required:["实际隐蔽防水饰面机电等接口、必要等待和成品保护"]},{title:"装饰资源配置与工序交接",required:["统一计划投入、移交条件、责任和冲突处置"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","ceil-partition","painting","door-window"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","装饰顺序按实际构造与专业接口确定,不强制全部作业分批或预设所有部位;已有土建管线责任不能删。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-general",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["general"],sectionKeywords:["部署","流水","顺序","组织","安排","准备"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"template.chapterTitles",source:"projectMaterial",required:!1}],structure:[{title:"安装工程范围与作业条件",required:["实际对象、区段、工作面、接口和未知条件核验"]},{title:"安装施工与验收组织",required:["准备、方法依赖、检查、交接和必要等待"]},{title:"安装资源配置与阶段安排",required:["同一计划的能力、投入、供应、协调和责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["earthwork-excavation","concrete-works","electrical-hookup"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","类型未知不减少真实职责,也不填入固定主体装饰流程;据实际对象编制有条件可实施的安排。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c09-green-civilized",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C09",projectTypes:[],sectionKeywords:["文明","绿色","环保","扬尘","噪声","监测","四节一环保"]},requires:[{key:"tender.environmentRequirements",source:"tenderDocument",required:!0},{key:"material.siteConditions",source:"projectMaterial",required:!1},{key:"boq.quantities",source:"boq",required:!1}],structure:[{title:"施工环境与文明施工要求",required:["实际周边影响、属地规则及措施适用条件"]},{title:"扬尘噪声与污染控制",required:["实际围挡覆盖清洗运输、时段、污水固废和责任"]},{title:"环境监测、预警与整改",required:["适用监测或检查、异常处置、复查和记录"]},{title:"资源节约与环境保护",required:["适用水材地能和环保措施及真实控制依据"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","具体属地百分比、限值或评价频次须可核且适用;不强套六百分百或每类固定量化指标,不把计划写成已落实。"],nonDeterministic:!0}],examples:{good:"按实际受影响对象和施工阶段说明扬尘、噪声、废水或通行控制,检查结果触发纠正与恢复。",defect:"无条件抄某城市制度、承诺已取得运输许可,或在无相应对象时增加水体污染章节。"}},{id:"c11-completion-handover",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C11",projectTypes:[],sectionKeywords:["竣工","验收","移交","保修","缺陷","收尾"]},requires:[{key:"tender.qualityStandard",source:"tenderDocument",required:!0},{key:"boq.divisions",source:"boq",required:!1}],structure:[{title:"竣工收尾与场地恢复",required:["实际清理、废弃物去向和设施恢复"]},{title:"竣工检查与缺陷整改",required:["实际验收范围、问题记录、整改责任和复验"]},{title:"工程实体与竣工资料移交",required:["交接条件、资料清单、签认和责任转移"]},{title:"保修与缺陷响应",required:["适用期限依据、联系责任及处置闭环"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不能补造保修期限或回访频次,不能冒称已验收签认;完整交付职责与真实合同和质量要求对应。"],nonDeterministic:!0}],examples:{good:"从实际完成实体与系统组织检验、调试、问题整改、资料和实物移交,保修按真实责任对象安排响应。",defect:"把过程隐蔽验收重复当整套竣工验收,或写已通过尚未开展的专项检验。"}},{id:"c11-household-acceptance",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C11",projectTypes:["building","renovation"],sectionKeywords:["分户","实测实量","交付","住户","观感"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"tender.qualityStandard",source:"tenderDocument",required:!1}],structure:[{title:"分户验收适用范围",required:["实际分户对象、依据和实施条件,不按类型默认适用"]},{title:"分户实测检验与整改复验",required:["真实检验项目、允许偏差依据、记录、整改和复验","选用条件:适用时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"分户验收资料交付与签认",required:["交付资料、对象、责任及签认程序","选用条件:适用时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","door-window"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","拟实施验收不填虚假合格率、实测值或住户签认;未明确分户适用性保留核验,不能据房建或改造标签确认。"],nonDeterministic:!0}],examples:{good:"从实际完成实体与系统组织检验、调试、问题整改、资料和实物移交,保修按真实责任对象安排响应。",defect:"把过程隐蔽验收重复当整套竣工验收,或写已通过尚未开展的专项检验。"}},{id:"c13-dangerous-program",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:[],sectionKeywords:["危大","危险性较大","专项方案","专家论证","辨识清单","分级"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"tender.safetyRequirements",source:"tenderDocument",required:!0}],structure:[{title:"危大工程辨识与判定依据",required:["对象部位、作业形态、完整参数、适用规则和未决核验"]},{title:"专项施工方案编制、审核与论证",required:["按成立条件编制审核审批、必要专家论证及交底"]},{title:"危大工程实施、监测与验收",required:["责任、检查、异常处置、验收和记录"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","候选、已成立分级和未决条件分别表达;数值对阈值不足以成立判断,须有完整同对象形态和适用条件。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["building"],sectionKeywords:["危大","危险性较大","基坑","模板支撑","脚手架","吊装","幕墙","吊篮"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"施工危险源辨识与风险评估",required:["真实基坑支撑架体吊装幕墙等对象和作业方法,不强行补齐类别"]},{title:"危险源关联工况核查",required:["深度土水周边、支撑几何与荷载、架体形式、吊装方法单件及场地等适用参数"]},{title:"危险源分级与专项控制",required:["完整适用判据、未决核验、对应方案程序、监测验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","scaffold","tower-crane","steel-structure"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","房建类型既不能证明存在某危大形态,也不能证明全部不触发;实际对象和完整条件是正负判定依据。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["municipal"],sectionKeywords:["危大","危险性较大","沟槽","有限空间","顶管","吊装","拆除"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!0}],structure:[{title:"市政施工危险源与作业方式",required:["真实沟槽、构筑物、空间、暗挖顶管、吊装拆除等候选"]},{title:"市政施工工况与风险判定依据",required:["对应土水环境、空间进入条件、工法、设备和必要参数,不用全工程总量替代"]},{title:"市政危大工程核查与专项控制",required:["已成立判据与未决事项、方案、监测、防护、救援和验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","有限空间风险需真实空间与进入作业条件;它与法定危大范围分别核验,不因市政名称自动等同。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-renovation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["renovation"],sectionKeywords:["危大","危险性较大","拆除","脚手架","吊篮","既有","有限空间"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!1}],structure:[{title:"改造工程对象与作业条件",required:["真实拆改、新增、既有稳定与相邻接口"]},{title:"改造施工危险源辨识",required:["按范围核验拆除架体吊篮吊装支撑基坑空间等,不预设不适用"]},{title:"危大工程判定与专项控制",required:["完整同对象参数和适用规则、未知核验、方案监测防护及验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["demolition","scaffold","structural-strengthen","facade-renovation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不能因改造标签要求写深基坑或高支模不适用理由;有真实对应工况即承接,未知不判无危大。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-decoration",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["decoration"],sectionKeywords:["危大","危险性较大","吊篮","脚手架","幕墙","吊装","高处"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1}],structure:[{title:"装饰工程对象与作业条件",required:["真实部位、工作高度、运输安装方法和专业接口"]},{title:"装饰施工危险源辨识",required:["按范围核验架体吊篮幕墙吊装及其他作业,不强套固定清单"]},{title:"危大工程判定与专项控制",required:["完整同对象参数、适用规则、未知核验、防护及监测验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["scaffold","facade-renovation","ceil-partition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","高处或吊运风险不自动等同已成立法定危大;真实土建或管线作业也不得因装饰标签绝对排除。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c07-safety-obligation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:[],sectionKeywords:["安全","危大","危险性较大","超过一定规模","专项方案","危险源","风险分级","安全技术措施"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"project.scale",source:"tenderDocument",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"安装施工危险源与危大工程辨识",required:["逐对象工况、参数及适用判据;未决条件和核验责任"]},{title:"安装专项施工方案管理",required:["按已成立条件编审审批、必要论证和交底"]},{title:"安装安全措施实施与验收",required:["实施检查、监测、异常处置、验收及记录责任"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","普通风险、危大候选和已成立法定分级分别表达;缺值不变不触发,单一类别不推成全项目结论。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c14-pipeline-protection",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C14",projectTypes:[],sectionKeywords:["管线","地下管线","管线保护","探明","迁改","保护措施","既有管线"]},requires:[{key:"drawing.specs",source:"drawings",required:!0},{key:"boq.divisions",source:"boq",required:!1}],structure:[{title:"地下管线调查与施工接口核查",required:["真实或需探明的类别走向、权属、位置及调查责任"]},{title:"地下管线保护与迁改",required:["对应保护方法、施工衔接、产权协同及实施条件","选用条件:确有需要时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"管线施工监护与应急处置",required:["作业限制、监测巡护、碰损处置和恢复交接"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","管线调查及保护属于实施安排时不能写成已探明已迁改;未知类别位置保留核验责任,不猜填。"],nonDeterministic:!0}],examples:{good:"实际交通与管线条件决定分阶段通行、围挡及保护方法,说明施工与运营接口、监护和恢复交接。",defect:"未查明管线就写已探明或已迁改,所有场内运输都套社会道路导改。"}}],fb=["C01","C02","C02","C03","C04","C05","C06","C07","C08","C09","C10","C11","C12","C14","C15","C16"],fc=[{domain:"C13",pattern:/危大工程专项|危险性较大的分部分项工程专项|危大专项/u}];function fd(a){if(fb.length!==e7.length)throw Error(`章域映射表与 CHAPTER_FOCUS_RULES 失配:映射 ${fb.length} 条 / 规则 ${e7.length} 条`);let b=[];for(let{domain:c,pattern:d}of function(){let a=[];return e7.forEach((b,c)=>{let d=fb[c];d&&a.push({domain:d,pattern:b.pattern})}),a.push(...fc),a}())!b.includes(c)&&d.test(a)&&b.push(c);return b}function fe(a){return a.replace(/\s+/gu,"").toLowerCase()}function ff(a,b,c,d){let e=fd(b),f=e.includes(a.match.chapterDomain),g=0===a.match.projectTypes.length||a.match.projectTypes.includes(d),h=c.map(fe).filter(a=>a.length>0),i=h.length>0,j=a.match.sectionKeywords.filter(a=>{let b=fe(a);return b.length>0&&h.some(a=>a.includes(b))}),k=i?function(a){let b=a.match.sectionRegex;if(b&&e4(b))try{return RegExp(b,"u")}catch{return}}(a):void 0,l=!!k&&h.some(a=>k.test(a)),m=a.match.sectionKeywords.length>0||void 0!==k,n=!i||!m||j.length>0||l;return{skillId:a.id,domainHit:f,matchedDomains:e,projectTypeHit:g,sectionGateApplied:i,matchedKeywords:j,regexHit:l,matched:f&&g&&n}}function fg(a,b,c,d=fa){let e=d.filter(a=>a.enabled).map(d=>({skill:d,explanation:ff(d,a,b,c)})).filter(a=>a.explanation.matched).map(a=>{var b;return{skill:a.skill,specificity:(b=a.explanation).matchedKeywords.length+ +!!b.regexHit}});return e.sort((a,b)=>b.specificity!==a.specificity?b.specificity-a.specificity:a.skill.id<b.skill.id?-1:+(a.skill.id>b.skill.id)),e.map(a=>a.skill)}let fh=new Set(["id","version","source","enabled","match","requires","structure","forbidden","knowledge","acceptance","examples","outputTitle","chapterChecklist"]);function fi(a){return af().join(function(a){if(a&&a.trim().length>0)return af().resolve(a);let b=process.env.CUSTOMIZE_AGENT_HOME;return b&&b.trim().length>0?af().resolve(b):aT().homedir()}(a),".customize-agent","skills")}let fj=["match","requires","structure","forbidden","knowledge","acceptance","examples"];function fk(a){var b,c;if(a.skill)return{skill:{...a.skill,enabled:a.enabled},kind:"user"};let d=(b=a.id,fa.find(a=>a.id===b));if(d)return{skill:{...(c=a.overrides??{},{...d,...void 0!==c.match?{match:c.match}:{},...void 0!==c.requires?{requires:c.requires}:{},...void 0!==c.structure?{structure:c.structure}:{},...void 0!==c.forbidden?{forbidden:c.forbidden}:{},...void 0!==c.knowledge?{knowledge:c.knowledge}:{},...void 0!==c.acceptance?{acceptance:c.acceptance}:{},...void 0!==c.examples?{examples:c.examples}:{},enabled:d.enabled}),enabled:a.enabled},kind:"override"}}function fl(a){let{records:b,invalid:c}=function(a){let b,c=fi(a),d=[];try{b=ad().readdirSync(c).filter(a=>a.endsWith(".json"))}catch(a){if("ENOENT"===a.code)return{records:[],invalid:d};throw Error(`技能目录不可读:${c}(${a instanceof Error?a.message:String(a)})`,{cause:a})}let e=[];for(let a of b.sort()){let b=af().join(c,a);try{let c=JSON.parse(ad().readFileSync(b,"utf8"));if(c?.v!==1){d.push({file:b,reason:`记录版本 ${String(c?.v)} 与当前 1 不符`});continue}if("string"!=typeof c.id||0===c.id.length){d.push({file:b,reason:"记录缺少 id"});continue}if(c.id!==a.replace(/\.json$/u,"")){d.push({file:b,reason:`文件名与记录 id「${c.id}」不一致`});continue}e.push(c)}catch(a){d.push({file:b,reason:`解析失败:${a instanceof Error?a.message:String(a)}`})}}return{records:e,invalid:d}}(a),d=new Map;for(let a of b)d.set(a.id,a);for(let d of b){var e;let b=fa.some(a=>a.id===d.id),f=function(a,b){let c=[];if(("string"!=typeof a.id||0===a.id.trim().length)&&c.push({code:"record-id-invalid",message:"记录 id 不得为空"}),1!==a.v&&c.push({code:"record-version-invalid",message:`记录版本须为 1,当前 ${String(a.v)}`}),"boolean"!=typeof a.enabled&&c.push({code:"override-shape",message:'enabled 必须显式为布尔值("没写"与"禁用"不能同形)'}),void 0!==a.overrides)for(let b of Object.keys(a.overrides))fj.includes(b)||c.push({code:"override-unknown-field",message:`覆盖字段「${b}」不合法(合法字段:${fj.join("/")})`});return void 0!==a.skill&&b.isBuiltin&&c.push({code:"builtin-skill-not-persistable",message:`「${a.id}」是内置技能:F.3 要求内置技能不落盘(随应用版本),只落用户的覆盖/禁用——请改用 overrides 或 enabled`}),void 0!==a.skill&&(a.skill.id!==a.id&&c.push({code:"stored-skill-id-mismatch",message:`记录 id「${a.id}」与技能 id「${a.skill.id}」不一致(文件名即 id,不一致会让读取定位到别的技能)`}),"user"!==a.skill.source&&c.push({code:"stored-skill-source",message:`落盘的自建技能 source 必须为 'user',当前 '${a.skill.source}'`})),void 0===a.skill&&void 0===a.overrides&&!1!==a.enabled&&c.push({code:"stored-skill-missing",message:"记录既没有 skill(自建)也没有 overrides(覆盖),且 enabled 不是 false——这样一条空记录落盘只会污染技能库"}),void 0!==a.skill||void 0===a.overrides||b.isBuiltin||c.push({code:"overrides-not-applicable",message:`overrides 只用于覆盖**内置**技能,而「${a.id}」不是内置 id——用户自建技能请写完整契约(skill 字段)`}),c}(d,{isBuiltin:b}),g=f.length?void 0:fk(d);g&&f.push(...(function(a){let b=!a||"object"!=typeof a||Array.isArray(a)?[]:Object.keys(a).filter(a=>!fh.has(a)).map(a=>({code:"skill-field-unsupported",path:a,message:`技能不支持字段「${a}」,请使用当前编辑器中的专业内容字段。`})),c=[],d=(a,c,d)=>{b.push({code:a,path:c,message:d})},e=(a,b,d)=>{c.push({code:a,path:b,message:d})};if(!(!(!a||"object"!=typeof a||Array.isArray(a))&&"string"==typeof a.id&&a.match&&"object"==typeof a.match&&["requires","structure","forbidden","knowledge","acceptance"].every(b=>Array.isArray(a[b]))))return{ok:!1,errors:[...b,{code:"skill-malformed",path:"",message:"技能须包含有效标识、匹配条件及专业内容数组。"}],warnings:c};for(let[b,c]of(e6.test(a.id)||d("skill-id-invalid","id","技能标识须为安全的小写字母、数字和连字符。"),(!Number.isInteger(a.version)||a.version<1)&&d("skill-version-invalid","version","技能版本须为正整数。"),["builtin","user"].includes(a.source)||d("skill-source-invalid","source","技能来源只能为builtin或user。"),"boolean"!=typeof a.enabled&&d("skill-enabled-invalid","enabled","启用状态须为布尔值。"),eY.includes(a.match.chapterDomain)||d("match-chapter-domain-unknown","match.chapterDomain","未知的专业章域。"),(!Array.isArray(a.match.projectTypes)||a.match.projectTypes.some(a=>!e_.includes(a)))&&d("match-project-type-unknown","match.projectTypes","工程类型须来自支持的专业分类。"),(!Array.isArray(a.match.sectionKeywords)||a.match.sectionKeywords.some(a=>"string"!=typeof a||!a.trim()))&&d("match-keyword-invalid","match.sectionKeywords","主题关键词须为非空文字。"),void 0===a.match.sectionRegex||e4(a.match.sectionRegex)||d("match-regex-unsafe","match.sectionRegex","主题正则无效或存在输入安全风险。"),a.requires.entries()))c&&"string"==typeof c.key&&c.key.trim()||d("requires-key-empty",`requires[${b}].key`,"事实键不得为空。"),c&&e5.some(a=>a.id===c.source)||d("requires-source-unknown",`requires[${b}].source`,"未知的资料来源。");for(let[b,c]of(a.structure.length||d("structure-empty","structure","请说明技能适用的专业主题。"),a.structure.entries())){let a=`structure[${b}]`;if(!c||"object"!=typeof c){d("structure-invalid",a,"专业主题须为对象。");continue}for(let b of Object.keys(c))["title","required"].includes(b)||d("structure-field-unsupported",`${a}.${b}`,"主题只声明名称与专业内容提示,不设置字数或参数数量要求。");"string"==typeof c.title&&c.title.trim()||d("structure-title-empty",`${a}.title`,"主题名称不得为空。"),void 0!==c.required&&(!Array.isArray(c.required)||c.required.some(a=>"string"!=typeof a||!a.trim()))&&d("structure-required-empty",`${a}.required`,"专业内容提示须为非空文字数组。")}for(let[b,c]of a.forbidden.entries()){let a="string"==typeof c?c:c?.phrase;"string"==typeof a&&a.trim()?/^.{1}$/u.test(a.trim())&&e("forbidden-entry-unusable",`forbidden[${b}]`,"单字不足以表达专业适用条件,避免仅按词面排除工程内容。"):d("forbidden-entry-empty",`forbidden[${b}]`,"写作注意不得为空。")}for(let[b,c]of a.knowledge.entries()){let a=`knowledge[${b}]`;if(!c||"processCard"!==c.kind){d("knowledge-kind-unknown",`${a}.kind`,"知识只支持可加载完整正文的工艺卡。");continue}for(let b of Object.keys(c))["kind","ids","note"].includes(b)||d("knowledge-ref-shape",`${a}.${b}`,"工艺知识引用只使用ids与说明。");if(!Array.isArray(c.ids)||!c.ids.length){d("knowledge-ids-empty",`${a}.ids`,"请选择实际工艺卡。");continue}for(let[b,e]of c.ids.entries())e9.has(e)||d("knowledge-id-unresolved",`${a}.ids[${b}]`,`工艺卡「${e}」不存在。`)}for(let[b,c]of a.acceptance.entries()){let a=`acceptance[${b}]`;if(!c||"llmChecklist"!==c.kind){d("acceptance-kind-unknown",`${a}.kind`,"技能只声明专业写作核对提示,不添加检测器或评分阈值。");continue}(!Array.isArray(c.items)||!c.items.length||c.items.some(a=>"string"!=typeof a||!a.trim()))&&d("acceptance-llm-items-empty",`${a}.items`,"专业核对提示须为非空文字数组。"),!0!==c.nonDeterministic&&d("acceptance-llm-not-flagged",`${a}.nonDeterministic`,"专业提示不能声明为已确定通过的验收结果。")}if(a.knowledge.length||a.structure.some(a=>Array.isArray(a?.required)&&a.required.length)||a.acceptance.length||d("skill-guidance-empty","","技能须有可加载工艺知识或实际专业内容提示,不能只有标题。"),!a.examples||"string"==typeof a.examples.good&&a.examples.good.trim()&&"string"==typeof a.examples.defect&&a.examples.defect.trim()||d("examples-incomplete","examples","示例须同时说明合理写法与缺陷,示例不是工程事实。"),void 0===a.outputTitle||"string"==typeof a.outputTitle&&a.outputTitle.trim()||d("output-title-empty","outputTitle","文档名称声明须为非空文字。"),void 0!==a.chapterChecklist){let b=a.chapterChecklist;if(!b||"object"!=typeof b||Array.isArray(b))d("chapter-checklist-malformed","chapterChecklist","章级专业提示须为对象。");else{let a=new Set(["sections","queries","requiredFacts","tableSections","tableRequirements","pinnedEvidenceFilePaths"]);for(let[c,e]of Object.entries(b))"purpose"===c?"string"==typeof e&&e.trim()||d("chapter-checklist-purpose-empty",`chapterChecklist.${c}`,"章职责不得为空。"):a.has(c)?(!Array.isArray(e)||e.some(a=>"string"!=typeof a||!a.trim()))&&d("chapter-checklist-entry-invalid",`chapterChecklist.${c}`,"专业提示须为非空文字数组。"):d("chapter-checklist-unknown-field",`chapterChecklist.${c}`,"未知的章级专业提示字段。")}}return{ok:0===b.length,errors:b,warnings:c}})(g.skill).errors.map(a=>({code:"skill-invalid",message:`${a.path}: ${a.message}`}))),(f.length||!g)&&c.push({file:(e=d.id,af().join(fi(a),`${e}.json`)),reason:f.map(a=>a.message).join(";")||"不能解析为生效技能"})}let f=[];for(let a of fa){let b=d.get(a.id);if(!b){f.push(a);continue}let c=fk(b);f.push(c?c.skill:{...a,enabled:b.enabled})}for(let a of b){if(fa.some(b=>b.id===a.id))continue;let b=fk(a);b&&f.push(b.skill)}return{skills:f,records:b,invalid:c}}function fm(a){let b=fl(a);if(b.invalid.length)throw Error(`生成技能输入不完整:${b.invalid.map(a=>`${a.file}:${a.reason}`).join(";")}`);return b.skills}function fn(a,b){let c=new Set(a);return(0,e8.cn)([b]).filter(a=>c.has(a.id)).map(a=>a.id)}let fo=e8.ts.map(a=>a.id);function fp(a){return[...new Set(a)].map(a=>{let b=(0,e8.VY)(a);return b?[`▸ ${b.name}(方法参考,步骤不作为正文句式):`,...b.applicability?[` 适用对象与方法条件:${b.applicability}`]:[],...b.exclusions?.length?[` 不适用或需另选的条件:${b.exclusions.join(";")}`]:[],...b.process.map((a,b)=>` ${b+1}. ${a}`)," 写作时说明适用条件、实施动作、控制与转序;不能只把这些步骤串成动作列表。",...b.params.map(a=>` \xb7 工艺参数:${a}`),...b.acceptance.map(a=>` \xb7 检测验收:${a}`),...(b.interfaces??[]).map(a=>` \xb7 专业接口:${a}`),...b.resourceBasis?[` \xb7 资源与工效推演:${b.resourceBasis}`]:[],...b.standards.map(a=>` \xb7 规范候选:${a}(具体版本、适用条文与工程采用另核)`),...b.source?[` \xb7 知识参考出处(非项目证据或采用结论):${b.source}`]:[]].join("\n"):""}).filter(Boolean).join("\n")}function fq(a){return[...a.structure.map(a=>`${a.title}:${(a.required??[]).join(";")}`).filter(a=>!a.endsWith(":")),...a.acceptance.flatMap(a=>a.items),...a.forbidden.map(a=>"string"==typeof a?a:`${a.phrase}${a.reason?`(${a.reason})`:""}`),...a.examples?[`表达示例(仅教写法,不构成本项目事实或专家验收):${a.examples.good}`,`需避免的写法及原因:${a.examples.defect}`]:[]].filter(Boolean).join("\n")}function fr(a){if(Array.isArray(a.skills))return{skills:a.skills,invalidRecords:[],source:"ctx"};let b=fl();return{skills:b.skills,invalidRecords:b.invalid,source:"store"}}function fs(a,b,c=!1){return{id:a.id,displayName:function(a){let b=e$[a.match.chapterDomain]??a.match.chapterDomain,c=0===a.match.projectTypes.length?"全类型":a.match.projectTypes.map(a=>e0[a]??a).join("、");return`${b} \xb7 ${c}`}(a),version:a.version,source:a.source,enabled:a.enabled,chapterDomain:a.match.chapterDomain,chapterDomainLabel:eZ[a.match.chapterDomain]??a.match.chapterDomain,projectTypes:[...a.match.projectTypes],projectTypeLabels:a.match.projectTypes.map(a=>e0[a]??a),sectionKeywords:[...a.match.sectionKeywords],matchedBy:{domains:b?[...b.matchedDomains]:[],keywords:b?[...b.matchedKeywords]:[],regexHit:b?.regexHit??!1},...!c?{contract:{sections:a.structure.map(a=>a.title),sectionCount:a.structure.length,forbiddenCount:a.forbidden.length,acceptanceCount:a.acceptance.length,acceptanceKinds:[...new Set(a.acceptance.map(a=>a.kind))],requires:a.requires.map(a=>a.key),knowledge:a.knowledge.flatMap(a=>a.ids)}}:{}}}function ft(a,b){let c=String(a??"").trim();if(!c)throw c1(`${b} 必填(${e_.join(" / ")})。**刻意不给默认值**:传 general 会让只声明了 building/municipal 等类型的技能静默不命中,而"少加载了技能"是看不见的缺陷。工程类型取自项目设定或招标文件,不要猜。`);if(!e_.includes(c))throw c1(`${b} 取值「${c}」不在闭集内(${e_.join(" / ")})`);return c}async function fu(a,b){let c=String(a?.chapterTitle??"").trim();if(!c)throw c1("chapterTitle 不能为空(技能按章标题解析章域,空标题推不出任何域)");let d=ft(a?.projectType,"projectType"),e=Array.isArray(a?.sections)?a.sections.map(a=>String(a??"").trim()).filter(Boolean):[],f=fr(b);if(0===f.skills.length)throw c4("技能池(`ctx.skills` 或技能库)","运行时注入 `ctx.skills`(内置与用户技能池)。空池应查明加载原因,不能报告专业知识已经加载。");let g=fg(c,e,d,f.skills),h=f.skills.filter(a=>!a.enabled).length;return{chapterTitle:c,projectType:d,matched:g.map(a=>fs(a,ff(a,c,e,d),!!b.authorTask)),disabledCount:h,poolSize:f.skills.length,invalidRecords:f.invalidRecords,note:0===g.length?"没有命中任何技能(匹配是特异度降序的硬门:章域 + 工程类型 + 小节关键词任一不过即不命中)。请核对工程类型与当前任务名称;确认无适用技能时依本任务资料和职责写作,不为命中技能改标题或增删小节。":`命中 ${g.length} 个(已按特异度降序);完整专业知识用 \`load_skill(skillId)\` 取,不要凭摘要里的节名自己编结构。`}}let fv={name:"match_skills",description:dd("按章标题、小节标题和工程类型匹配技能,返回领域候选摘要及命中依据;候选节名不改变本次冻结合同。","**本章开工前**的定位阶段(`:378`:「专业参考可取得」是定位阶段的成功判据);换章、改标题、改工程类型后要重跑。","**写完才调**——那时结构已定,看契约只剩事后辩解;也**不要凭摘要里的节名自己补全契约**(摘要是索引不是内容,用 `load_skill` 取全量);`projectType` 不要猜(猜错会让应命中的技能静默不加载,见工具参数说明)。"),scope:"skill-store",inputSchema:de.object({chapterTitle:de.str("章标题(用模板里的正式名;技能按它解析章域)"),sections:de.arr("本章的小节标题(用于小节关键词门;可空)",de.str("小节标题")),projectType:de.str(`工程类型(${e_.join(" / ")};**必填,不给默认值**)`)},["chapterTitle","projectType"]),idempotent:!0,handler:fu};async function fw(a,b){let c=String(a?.skillId??"").trim();if(!c)throw c1("skillId 不能为空");let d=fr(b),e=d.skills.find(a=>a.id===c);if(!e){let a=d.skills.map(a=>a.id).sort().join("、");throw c3(`技能「${c}」不存在。当前池内可用技能:${a||"(池为空)"}`)}if(!e.enabled)throw c1(`技能「${c}」已停用,不能加载。`);let f=fq(e),g=fp(e.knowledge.flatMap(a=>a.ids)),{examples:h,...i}=e;if(b.authorTask){let{structure:a,requires:b,acceptance:c,chapterChecklist:d,outputTitle:e,...h}=i;return{skill:h,writingGuidance:f,processCardText:g,note:"当前作者职责、结构及验收以冻结合同为准;技能只提供领域工艺知识与禁配,不能增加小节或强制字数、参数密度。来源和具体参数仍须核本项目的对象与适用条件。"}}return{skill:i,writingGuidance:f,processCardText:g,contract:{sectionCount:e.structure.length,forbidden:e.forbidden.map(a=>"string"==typeof a?a:a.phrase),acceptanceSummary:e.acceptance.flatMap(a=>a.items)}}}let fx={name:"load_skill",description:dd("读取一个技能的工艺知识、写作正反例与禁配。示例只教表达,不作为本项目事实;固定任务作者不获得另一套结构或验收要求。","需要补充当前职责相关领域知识时,从已命中技能中按需读取;正文职责与层级由本次冻结合同确定。","一次把池里所有技能全 load 进来(每个技能 1.5–2.2KB,几个就顶满工具结果上限,而且用不到的契约只会干扰判断)——只加载当前任务相关技能;也不要在写作中途反复重 load(本轮已冻结知识未变化,重复取等于烧上下文)。"),scope:"skill-store",inputSchema:de.object({skillId:de.str("技能 id(取自 `match_skills` 或 `list_skills`)")},["skillId"]),idempotent:!0,handler:fw};async function fy(a,b){let c=a?.filter;if(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)))throw c1("filter 若要给,必须是对象 `{source?, projectType?, chapterDomain?}`");if(c?.source!==void 0&&"builtin"!==c.source&&"user"!==c.source)throw c1("filter.source 只能是 builtin 或 user");if(c?.chapterDomain!==void 0&&!eY.includes(String(c.chapterDomain)))throw c1(`filter.chapterDomain 取值「${String(c.chapterDomain)}」不在闭集内(${eY.join(" / ")})`);let d=c?.projectType===void 0?void 0:ft(c.projectType,"filter.projectType"),e=fr(b),f=e.skills.filter(a=>(c?.source===void 0||a.source===c.source)&&(c?.chapterDomain===void 0||a.match.chapterDomain===c.chapterDomain)&&(void 0===d||!(a.match.projectTypes.length>0)||!!a.match.projectTypes.includes(d)));return{skills:f.map(a=>fs(a)),total:e.skills.length,filteredOut:e.skills.length-f.length,disabledCount:e.skills.filter(a=>!a.enabled).length,invalidRecords:e.invalidRecords,availableDomains:eY.map(a=>({id:a,label:eZ[a]??a})),availableProjectTypes:e_.map(a=>({id:a,label:e0[a]??a})),note:`技能库共 ${e.skills.length} 个,过滤后 ${f.length} 个(含 disabled)。**\`disabled\` 的技能也列出来**:禁用是用户的显式决定,不报出来就没人知道"这条技能为什么没生效"。缺省工程类型为 general(本工具只做过滤,不参与匹配,故给默认值无副作用)。`}}let fz={name:"list_skills",description:dd("列出技能库(可按 `source` / `projectType` / `chapterDomain` 过滤),返回摘要与可用枚举值(含 disabled 项)。",'需要知道"这个库到底有哪些技能"时:新项目立项、怀疑某个技能该在却没匹配上、或要看用户自定义技能(`source: "user"`)时。',"**不要拿它替代 `match_skills`**:本工具只做过滤、不做章标题匹配,列出来的不等于本章该用的;也不要在写作过程中反复列(技能库在一次运行内不变,重复列等于烧上下文)。"),scope:"skill-store",inputSchema:de.object({filter:de.obj("过滤条件(可选;都给即取交集)",{source:de.enumStr("技能来源",["builtin","user"]),projectType:de.enumStr("工程类型",e_),chapterDomain:de.enumStr("章域(闭集)",eY)})}),idempotent:!0,handler:fy},fA=["match_skills","load_skill","list_skills","discover_files","inspect_asset"],fB=["lookup_authoritative","query_project_facts"],fC=a=>a.map(a=>a.name),fD=(...a)=>[...new Set(a.flat())],fE={locate:fA,plan:fD(fA,fB,["expand_scope"]),generate:fD(fA,fB,fC(dR),fC(dU),fC(d4),fC(eK),fC(eP),fC(eS)),finalize:fD(fC(dU),fC(eK),fC(eP),fC(eX))},fF=["locate","plan","generate","finalize"];function fG(a){return fF.filter(b=>fE[b].includes(a))}let fH=[{id:"A.1-evidence",tools:dR},{id:"A.2-verdict",tools:dU},{id:"A.3-compute",tools:d4},{id:"A.4-authoring",tools:eK},{id:"A.6-declare",tools:eP},{id:"A.11-fact-placement",tools:eS},{id:"A.8-meta",tools:eX},{id:"A.9-skills",tools:[fv,fx,fz]}],fI=fH.flatMap(a=>a.tools.map(a=>({...a,stages:fG(a.name)}))),fJ=new Map(fI.map(a=>[a.name,a]));function fK(a){return fI.filter(b=>b.stages.includes(a))}async function fL(a,b,c){let d=Date.now(),e=fJ.get(a);if(e&&c.allowedTools&&!c.allowedTools.includes(a))return c8(a,c3(`工具「${a}」不在当前任务实际开放的能力范围中`),d);if(e&&c.stage&&!fG(a).includes(c.stage))return c8(a,c3(`工具「${a}」不允许在 ${c.stage} 阶段调用(允许阶段:${fG(a).join("、")||"无"})`),d);if(!e)return c8(a,c3(`未注册的工具「${a}」。已注册 ${fI.length} 个:${fI.map(a=>a.name).join("、")}`),d);let f=function(a,b){if(0===a.inputSchema.required.length)return;if(!b||"object"!=typeof b||Array.isArray(b))return`工具「${a.name}」需要对象参数,缺少必填字段:${a.inputSchema.required.join("、")}`;let c=a.inputSchema.required.filter(a=>void 0===b[a]||null===b[a]);return c.length>0?`工具「${a.name}」缺少必填字段:${c.join("、")}`:void 0}(e,b);if(f)return c8(a,c1(f),d);try{let f=await e.handler(b,c,{tool:a,ctx:c}),g=function(a){let b=String(a??"");if(!b)return{suspicious:!1,patterns:[]};let c=c6.filter(a=>a.pattern.test(b)).map(a=>a.id);return{suspicious:c.length>0,patterns:[...new Set(c)].sort()}}(c7(f)),h={ok:!0,tool:a,data:f,bytes:c7(f).length,elapsedMs:Math.max(0,Date.now()-d)};return g.suspicious&&(h.injection=g),h}catch(b){return c8(a,function(a){if(a instanceof c_)return a;let b=a instanceof Error?a.message:String(a);return new c_("INTERNAL",`工具内部异常:${b}`)}(b),d)}}Object.fromEntries(fH.map(a=>[a.id,a.tools.length]));let fM=["query_construction_plan","query_project_facts","query_work_packages","query_cad_context","query_source_units","search_evidence","read_source","discover_files","list_skills","match_skills","load_skill","ask_chief","submit_author_task","correct_author_submission","declare_missing","declare_unfixable"];function fN(a){return fM.filter(b=>"ask_chief"===b?"function"==typeof a.chief?.ask:"query_construction_plan"===b?"function"==typeof a.constructionPlan?.query:"declare_missing"===b?"function"==typeof a.audit?.declareMissing:"declare_unfixable"!==b||"function"==typeof a.audit?.declareUnfixable)}let fO=["items","chunks","candidates","sourceEvidence","records","units","skills","matched","activities","plannedResources","numbers","materials"],fP=a=>Array.isArray(a)?a.map(fP):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,fP(b)])):a,fQ=a=>(0,e.createHash)("sha256").update(JSON.stringify(fP(a))).digest("hex");function fR(a){let b=String(a.projectRoot??"").trim(),c=b?(0,ah.NW)(b):"",d=[],e=[];for(let b of a.scopeRootNames??[]){let a=String(b??"").trim();if(!a)continue;if(!c){e.push(`${a}(项目根为空,无法解析项目资料根)`);continue}let f=cZ(c,a);f.ok?d.push(f.absolute):e.push(`${a}(${c$(f.reason)})`)}e.length>0&&console.warn(`[agent-tools] 资料白名单有 ${e.length} 项无法解析为项目资料根,已按 fail-closed 丢弃:${e.join(";")}`),b||console.warn("[agent-tools] 未提供 projectRoot:本块工具面的资料根为空(取证/读类工具一律 PATH_DENIED,fail-closed)");let f={projectRoot:b,...a.skills?{skills:a.skills}:{},scopeRoots:[...new Set(d)].sort(),...a.signal?{signal:a.signal}:{},...a.rewriteAuthor?{rewriteAuthor:a.rewriteAuthor}:{},...a.audit?{audit:dk(a.audit,a.locationOf)}:{},...a.authoritative?{authoritative:a.authoritative}:{},...a.projectModel?{projectModel:a.projectModel}:{}};return a.contractScoped&&(f.allowedTools=fN(f)),f}async function fS(a){let b=String(a.nodeId??"").trim()||"current";if(!0!==a.contractScoped)throw Error("作者生成必须使用冻结合同,不能退回旧Markdown写作");let c=(0,g.O3)(a.diagnostics,a.chapterId??"",a.blockTitle??b);if(!c||!a.diagnostics||!a.toolContext?.projectModel)throw Error("固定作者任务缺少合同、诊断账或项目快照接线");let d=`${a.system}
29
+ ${c.map(a=>d(a)).join("\n")}`}(a.spec);return ex(b,"insert_table",c,a.at,d)}let eD={name:"insert_table",description:dd("在锚点处插入一张 Markdown 表格(先过表块守卫:表头 + 分隔线 + ≥1 行数据,且各行列数与表头一致),再走与 patch 相同的事务与边界。",'正文需要以正式表格承载清单/参数/对照关系时(表格是评价规则里的加分承载面);或某处"应该有一张表"而目前只有一段罗列句时。','正文禁表场景(招标显式禁表)——那时表会被判为结构缺陷;也不要拿它插"见下表"式的空表或没有表头的表(守卫会直接拒绝);表格内容必须有资料依据,不得为了好看编数据。'),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id"),spec:de.obj("表格规格",{headers:de.arr("表头单元格(非空)",de.str("表头")),rows:de.arr("数据行(≥1 行,每行列数须与表头一致)",de.arr("一行单元格",de.str("单元格"))),caption:de.str("表名/表注(可选;有则作为表前一行输出)")},["headers","rows"]),at:de.obj("插入位置锚点",{text:de.str("锚点原文(逐字取自当前草稿)")},["text"])},["nodeId","spec","at"]),idempotent:!1,idempotentViaSnapshot:!0,handler:eC};async function eE(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw c1("nodeId 不能为空");let d=b.document;if(!d)throw c4("文档事务能力(`ctx.document.commitSection`)","运行时注入:接 `chapterLoop` 的块推进/提交记账");let e=d.readSection(c);if("string"!=typeof e)throw c3(`节点「${c}」不存在或尚无草稿正文,不能提交`);if(!e.trim())throw c1(`节点「${c}」正文为空,不能提交(空块提交会把"没写"标成"写完")`);return"function"==typeof d.commitSection&&await d.commitSection(c),{nodeId:c,committed:!0,committedAt:Date.now(),note:d.commitSection?"已通过事务通道提交":'事务通道未提供 commitSection 钩子;本次仅返回提交回执(S1.3 的显式化目的:让画布能显示"这块定了")'}}let eF={name:"commit_section",description:dd('显式提交一个小节的草稿(现在靠"不返回 toolCall"隐式表达;显式化以便画布显示与循环判定)。','这一块确实写完了、不再改时(提交是**块推进的信号**,也是"我认账"的声明)。',"还想再改(提交后再改会走到重开路径,代价更高);正文为空时提交会被直接拒绝——它只提交已有正文;不能替代当前任务完成与来源核验。"),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id")},["nodeId"]),idempotent:!0,handler:eE};async function eG(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw c1("nodeId 不能为空");if(!a?.anchor||"string"!=typeof a.anchor.text)throw c1("anchor.text 必填(要删的那句/那行的原文)");return ex(b,"delete_span",c,a.anchor,"")}let eH={name:"delete_span",description:dd("删除锚点命中的整句/整行(`applyChapterPatch` 的空 replacement 删除语义),走同一套 4.4 边界与事务。","确定某句是污染内容时必须删(来源罗列句、内部术语句、元话语声明句、重复句)——**删得掉比改得像更重要**;`check` 报了某句类缺陷而改写无法消除时。",'只是"这句写得不好"(那是 `patch_section` 改写,删除会丢信息);一次删掉大段正文(净字数下限会直接拒绝,且删内容比补内容更容易伤到实质判据);也不要连着删多句——每删一句都要有独立的判据依据(`explain_defect` 可查)。'),scope:"document-draft",inputSchema:de.object({nodeId:de.str("目标节点 id"),anchor:de.obj("要删除的语句锚点(逐字取自当前草稿)",{text:de.str("锚点原文")},["text"])},["nodeId","anchor"]),idempotent:!1,idempotentViaSnapshot:!0,handler:eG},eI={name:"submit_author_task",description:dd("将完整段落、表格、流程图和事实绑定提交到当前冻结作者任务。","取证与必要决定完成后,按作者产物协议提交完整单元集合;任务、合同、快照与评价项由运行时核对。","不能用于扩大合同、换任务、删掉必需评价项或宣称专业质量通过。未决请求如实保留,不得编造事实补足。"),scope:"document-draft",inputSchema:de.object({output:eq},["output"]),idempotent:!1,idempotentViaSnapshot:!0,handler:async(a,b)=>{if(!b.authorTask)throw c4("authorTask","当前运行尚未绑定结构化作者任务");try{return await b.authorTask.submit(a.output)}catch(a){throw c1(a instanceof Error?a.message:String(a))}}},eJ={name:"correct_author_submission",scope:"document-draft",idempotent:!1,idempotentViaSnapshot:!0,description:dd("在服务端保留的真实作者原稿上纠正职责/来源标注或清理协议外形状,不重新输出正文。","提交失败回执给出submissionIndex后,指定错误位置的JSON路径(JSON指针或a[0].b形式);所有段落、表行、图数据守恒后再按同一任务验证。","不能改text/parts文字、标题、表头、行、图节点/关系或未决问题;remove-unknown-field只能删非正文键,drop-empty-fragment只能删仅含空text的片段;实质正文修改另行完整submit并如实计账。纠正不授予来源采用或专业质量通过。"),inputSchema:de.object({submissionIndex:de.int("本任务失败回执给出的实际原稿序号,从0开始"),changes:de.arr("必要的标注或形状纠正",de.obj("纠正项",{path:de.str("实际JSON路径:标注字段,或待清理的协议外键/空片段位置。支持 /a/0/b 与 a[0].b 两种写法"),valueJson:de.str('标注字段的新JSON值(数组或revisionReason字符串);删除类操作填"null"'),op:de.enumStr("操作类别;省略按标注纠正处理",["annotation","remove-unknown-field","drop-empty-fragment"])},["path","valueJson"]),{minItems:1})},["submissionIndex","changes"]),handler:async(a,b)=>{if(!b.authorTask?.correct)throw c4("authorTask.correct","当前运行没有已保留原稿纠正器");try{return await b.authorTask.correct(a.submissionIndex,a.changes)}catch(a){throw c1(a instanceof Error?a.message:String(a))}}},eK=[{name:"ask_chief",scope:"document-plan",idempotent:!0,description:dd("将当前任务的具体职责或方法问题交给主智能体,立即取得结构化裁决及其身份。","提交首稿前确定方法边界、部位工况及定量控制时;提供sourceQueries取得完整依据,主控可给经独立复核的工程控制项及原文序号。按实际任务问题继续查证,同一问题复用已有回执;先使用已给出的合同与完整必要资料,未完成对象不得假称已核定。","普通写作无需调用;不能请求主控代写正文、编造参数或扩大合同。request-human 必须保留为未决请求。"),inputSchema:de.object({question:de.str("具体可回答的问题"),criterionIndices:de.arr("作者协议已给出的当前任务职责序号,从0开始,不复制或猜长ID",de.int("当前任务实际职责序号"),{minItems:1}),sourceQueries:de.arr("先查冻结原文中实际对象与条件,完整片段分页;query各词均须命中,可继续nextOffset",de.obj("一项原文查询",{query:de.str("真实对象或术语,以空格连接同时命中的词"),filePath:de.str("已冻结的完整文件路径,可省略"),offset:de.int("从零开始的匹配片段偏移"),limit:de.int("一次1至8个完整片段")},["query"])),factQueries:de.arr("问题所需的真实事实属性及对象,按完整对象控制组查证;主控从冻结事实查询,不限于评价项原先绑定的事实",{...de.object({attribute:de.str("实际属性名称"),objectName:de.str("实际对象名称,可省略")},["attribute"]),description:"一项冻结事实查询"})},["question","criterionIndices"]),handler:async(a,b)=>{let d;if(!b.chief)throw c4("chief","当前运行未绑定主智能体裁决通道");if(!b.authorTask)throw c4("当前作者职责索引","主控须绑定已委派任务的同一职责序号表");if(Object.keys(a).some(a=>!["question","criterionIndices","sourceQueries","factQueries"].includes(a)))throw c1("主控提问只接受当前criterionIndices协议,不转换退役ID输入");let{resolveAuthorCriterionIndices:e}=await Promise.resolve().then(c.bind(c,33972)),{criterionIndices:f,...g}=a;try{if(!(d=e(b.authorTask.criterionIds,f)).length)throw Error("主控问题须绑定本任务实际职责")}catch(a){throw c1(a instanceof Error?a.message:String(a))}let{chiefDecisionWritingContext:h}=await Promise.resolve().then(c.bind(c,29327));return h(await b.chief.ask({...g,criterionIds:d}))}},eI,eJ,ez,eB,eD,eF,eH];async function eL(a,b){let c=String(a?.item??"").trim(),d=String(a?.reason??"").trim();if(!c)throw c1('item 不能为空(要写清"缺的是什么",不能是"某些资料")');if(d.length<4)throw c1("reason 太短:必须说明**为什么缺**(招标未给/图纸未含/资料未上传),否则人手无法接续");let e=Array.isArray(a?.evidence)?a.evidence.map(a=>String(a??"").trim()).filter(Boolean):[];if(0===e.length)throw c1('evidence 不能为空:请列出**已经找过的地方**(`search_evidence` 的查询词 + 命中的文件/页,或 `discover_files` 的结果)。空证据的声明等价于"我没找,直接报缺"——那是拿声明当偷懒通道。');let f=b.audit;if(!f)throw c4("审计状态写入能力(`ctx.audit.declareMissing`)","运行时注入:接 `session.understanding.missingItems`(已有的只增数组)+ 节点 issue 写入");return await f.declareMissing({item:c,reason:d,evidence:e}),{declared:!0,item:c,recordedAt:Date.now(),recordedTo:"session.understanding.missingItems",evidenceCount:e.length,note:"声明已入账(只增数组)。注意:**声明不减少应写内容**——该节仍需按已有资料写足,缺料处由人在清单上补齐。"}}let eM={name:"declare_missing",description:dd("上报当前任务确需但尚无可靠依据的具体项目属性,保留实际查证记录供主控判断。声明不降低职责或质量要求。","query_project_facts、query_work_packages、query_cad_context、search_evidence、read_source或discover_files的实际回执仍不能核定所需属性,并已向主控提出具体问题时;如实区分未读完、读取失败、适用关系未核定与资料确实缺失。","不把零命中或未预加载当作全部资料缺失;先通过ask_chief核查职责和技术口径。不能编造查证记录,也不能用声明替代必须完成的施工决定或在正文中写后台状态。"),scope:"audit-state",inputSchema:de.object({item:de.str("缺的是什么(具体到字段/参数/图名,如「基坑支护设计参数:锚索张拉锁定值」)"),reason:de.str("为什么缺(招标未给 / 图纸未含 / 资料未上传 / 与已有资料矛盾且无权威可裁)"),evidence:de.arr('已经找过的地方(≥1 条;写查询词与命中的文件/页,或说明"已遍历资料清单,无此文件")',de.str("一条搜寻记录"))},["item","reason","evidence"]),idempotent:!0,handler:eL};async function eN(a,b){let c=a?.issue;if(!c||"object"!=typeof c)throw c1("issue 必填(要声明的是**哪一条缺陷**,不能泛指)");let d=String(c.message??"").trim();if(!d)throw c1("issue.message 不能为空(缺陷必须有可读的说明)");let e=c.level;if("error"!==e&&"warning"!==e&&"info"!==e)throw c1("issue.level 必须是 error / warning / info 之一");let f=String(a?.reason??"").trim();if(f.length<8)throw c1("reason 太短:必须说明实际查证、主控判断或提交拒绝的结果,以及当前不能完成的具体原因;不得编造尝试或为了声明反复改写。");let g=b.audit;if(!g)throw c4("审计状态写入能力(`ctx.audit.declareUnfixable`)","运行时注入:接新增的 `unfixable` 通道 → `suspensionChecklist`(`suspensionChecklist.ts:40` 已有挂起通道)");await g.declareUnfixable({issue:c,reason:f});let h=c.severity;return{declared:!0,message:d,detectorId:c.provenance?.detectorId,recordedAt:Date.now(),recordedTo:"unfixable → suspensionChecklist",stillBlocker:"blocker"===h||"error"===e,note:'已报出并进入挂起清单。**声明不改变缺陷等级**——它仍是阻断级,只是从"我没修"变成"我修不动并已上报"。后续:块轮次/工具数耗尽时该节点置 `blocked`(**不是 `completed`**)。'}}async function eO(a,b){let c=String(a?.question??"").trim();if(c.length<8)throw c1('question 太短:必须写成**一个可回答的问题**(并列候选与各自来源,见 A5.2「让人选」),不写成"我判不了,你来看"');if("boolean"!=typeof a?.blocking)throw c1("blocking 必填且必须是布尔:它决定本次是**挂起等人**还是**记账继续**,不能靠默认值蒙混");if(!/[??]|是否|哪一|哪个|请确认|请裁定/u.test(c))throw c1("question 缺少疑问形态(未见 ?/? 或 是否/哪一/请确认 等):请写成一个**可回答**的问题,并列出候选与来源");let d=b.audit;if(!d)throw c4("审计状态写入能力(`ctx.audit.requestClarification`)",'运行时注入:**新建** `clarificationOverrides` 的**待答**槽(现有只有"已答"侧)');return await d.requestClarification({question:c,blocking:a.blocking}),{requested:!0,question:c,blocking:a.blocking,recordedAt:Date.now(),recordedTo:"clarificationOverrides.pending",note:a.blocking?"已挂起等人裁决(blocking=true)。挂起期间**不要**对同一处反复重问,也不要自己选一个口径先写下去。":"已记账但未挂起(blocking=false):先按**权威阶梯最高的候选**继续写,并在下次自查时复查。"}}let eP=[eM,{name:"declare_unfixable",description:dd("记录当前固定任务无法完成的具体阻断及真实原因,保留已生成的正确内容与查证回执;声明不会将任务标为完成。","依据实际源读取、主控裁决或结构化提交拒绝,能够指出仍未满足的具体职责或控制条件时;无法完成是工程或来源条件限制时可直接上报,不要求先改写若干轮。","不能跳过难点、虚构修复次数或把工具故障解释为资料缺失。专业疑问先用ask_chief,仍未核定的控制点保留decisionRequests;不得扩大冻结任务或用重复改写消耗预算。"),scope:"audit-state",inputSchema:de.object({issue:de.anyObj("实际未满足职责或控制条件的具体阻断对象,须含真实level与message;已收到校验问题时保留原样"),reason:de.str("实际源读取、主控判断或提交拒绝的结果,以及仍不能完成的原因;不编造改写次数")},["issue","reason"]),idempotent:!0,handler:eN},{name:"request_clarification",description:dd("向人提出一个**可回答的口径裁决问题**(写进待答槽;`blocking=true` 时挂起等人,`false` 时记账继续)。A5.2 的要旨:把「要人找」变成「让人选」。","A5.1 的 **C 级**三类:**扩资料范围**(`expand_scope` 的连带)\xb7 **口径裁决**(同一事实多个候选值、权威阶梯也分不出高下,N9)\xb7 **改动超阈值**;以及规划本身不合理到影响得分(如小节顺序与评标习惯冲突)。写法:**列出候选值 + 各自来源 + 权威级 + 你的建议**,让人一次点选。",'**自己能查能判的不要问人**——先 `lookup_authoritative`(权威值)/ `search_evidence`(资料内可查)/ `verify_numbers`(算得出来的);把问题写成"我判不了,你来看"(无候选、无来源)等于把工作退回给人;**不要用 blocking=true 逃避写作**——挂起只用于真的没法继续的地方,其余靠 `declare_missing` 记账继续;扩资料范围本身走 `expand_scope`(它带审批通道),本工具只用于"该不该扩/扩到哪"的口径问题。'),scope:"audit-state",inputSchema:de.object({question:de.str("可回答的问题(须含疑问形态 + 候选值与各自来源 + 权威级;建议附上你的建议)"),blocking:de.bool("true = 挂起等人;false = 记账继续。**必填**(不给默认值:挂起与否是决策,不是格式)")},["question","blocking"]),idempotent:!0,handler:eO}];function eQ(a){return String(a??"").replace(/\s+/gu,"").replace(/[::==]/gu,"=").toLowerCase()}async function eR(a,b){let c=(Array.isArray(a?.facts)?a.facts:[]).map(a=>String(a??"").trim()).filter(Boolean);if(0===c.length)throw c1("facts 不能为空:请列出**本块实际写进正文**的事实键(从「本主题块专属事实」清单里取)");let d=b.factPlacement;if(!d)throw c4("事实落位记账能力(`ctx.factPlacement`)","运行时注入:由章写作层按**本块分配的事实清单**构造(`agentToolWiring.factPlacementFor`)");let e=[],f=[];for(let a of c){let b=function(a,b){let c=eQ(a);if(c)for(let a of b){let b=eQ(a);if(b&&(b===c||b.startsWith(`${c}=`)||b.startsWith(c)||c.startsWith(b)))return a}}(a,d.allowed);b?e.push(b):f.push(a)}if(d.record({accepted:e,unknown:f}),0===e.length){let a=d.allowed.slice(0,6).map(a=>`「${a.slice(0,24)}」`).join("、");throw c1(`报出的 ${c.length} 条**一条都不在本块可见事实里**(可能是别的节的事实或写错了键)。本块可见的是:${a||"(本块没有专属事实——那就不必调用本工具)"}`)}return{recorded:!0,accepted:e,unknown:f,acceptedCount:e.length,note:"已按**本块可见事实**记账(集合连接:判定不再只靠字面命中)。这是观测面不是门:漏报不会让本节失败,但会让「哪块漏了哪条」少一条写手侧的证词——写下正文之后顺手报一次即可,不必逐条核对。"+(f.length>0?`(${f.length} 条不在本块可见事实里,只回执、未落账)`:"")}}let eS=[{name:"record_fact_placement",description:dd('回报"本节实际用上了哪几条事实"(**逐条回链**):系统按**集合连接**记账,"参数/事实是否落位"不再只靠字面匹配去猜。',"正文写完(或 `commit_section` / `patch_section` 落地)之后,如果本节用了「本主题块专属事实」清单里的条目——把**用上的那几个键**报一次。一次调用报完,不必逐段调。",'**不要把它当验收清单**(漏报不会让本节失败,系统仍有字面判定的兜底);**不要报清单外的键**(那些不落账,只会出现在回执里);**不要为了凑数把没用的事实也报上**——账是给"哪块漏了哪条"用的,报了假的等于把缺口藏起来。'),scope:"readonly",inputSchema:de.object({facts:de.arr("本节实际用上的事实键(写「本主题块专属事实」清单里的键即可,如「计划工期」)",de.str("一个事实键"))},["facts"]),idempotent:!0,handler:eR}],eT={error:0,warning:1,info:2},eU={blocker:0,warning:1,suggestion:2};function eV(a){return((a.severity?eU[a.severity]:void 0)??3)*10+(eT[a.level]??3)}async function eW(a,b){let c=b.audit;if(!c||"function"!=typeof c.listDefects)throw c4("缺陷清单读取能力(`ctx.audit.listDefects`)","运行时注入:读 `session.validationIssues` + `qualityBundle`(附录 A.8:可读但当前无接口,需补一个只读访问器)");let d=a?.scope;if(void 0!==d&&("object"!=typeof d||null===d||Array.isArray(d)))throw c1("scope 若要给,必须是对象 `{chapterId?}`");let e=await c.listDefects(d);if(!Array.isArray(e))throw c1("缺陷清单能力返回了非数组——返回形状是接口的一部分,不能含糊");return[...e].sort((a,b)=>{let c=eV(a)-eV(b);if(0!==c)return c;let d=String(a.source??"").localeCompare(String(b.source??""));return 0!==d?d:a.message.localeCompare(b.message)})}let eX=[{name:"list_defects",description:dd('读出当前文档的缺陷清单(阻断级优先排序,可带 `chapterId` 缩小范围)。这是"我现在还欠什么"的账本。','每轮收尾前对账;或不确定"还有什么没解决"时(比凭记忆列缺陷可靠得多——记忆里的缺陷清单总是偏乐观)。','**不要拿它当 `check` 的替代**:`check` 是对**指定文本**现跑判据(能看到"我刚改的这版有没有引入新问题"),`list_defects` 读的是**已入账**的历史清单(可能滞后于你刚做的改动)。改完正文必须 `check` 复验,不能靠 `list_defects` 变没变来确认。'),scope:"audit-state",inputSchema:de.object({scope:de.obj("范围(可选)",{chapterId:de.str("只看某一章的缺陷")})}),idempotent:!0,handler:eW}],eY=["C01","C02","C03","C04","C05","C06","C07","C08","C09","C10","C11","C12","C13","C14","C15","C16"],eZ={C01:"工程概况与总体理解",C02:"主要施工内容 / 分部分项施工方案",C03:"重难点分析与对策",C04:"施工部署与组织",C05:"进度计划与工期保障",C06:"质量保证体系与措施",C07:"安全文明与危大工程管控",C08:"劳动力材料机械设备配置",C09:"绿色文明施工与环保",C10:"应急管理体系",C11:"竣工/验收/移交/保修",C12:"劳务实名制与农民工工资保障",C13:"危大工程专项管控",C14:"交通导改与管线保护",C15:"居民协调与既有保护",C16:"成品保护与交叉施工"},e$={C01:"工程概况",C02:"主要施工内容",C03:"重难点分析",C04:"施工部署",C05:"进度计划",C06:"质量保证",C07:"安全文明与危大",C08:"资源配置",C09:"绿色文明施工",C10:"应急管理",C11:"竣工与保修",C12:"劳务实名与工资",C13:"危大专项管控",C14:"交通导改与管线",C15:"居民协调与既有保护",C16:"成品保护与交叉施工"},e_=["building","municipal","renovation","decoration","general"],e0={building:"房建工程",municipal:"市政工程",renovation:"老旧小区改造",decoration:"装饰装修工程",general:"通用/其他"},e1=/\((?:[^()\\]|\\.)*[+*](?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d*,?\d*\})/u,e2=/\((?:[^()\\]|\\.)*\|(?:[^()\\]|\\.)*\)\s*(?:[+*]|\{\d*,?\d*\})/u,e3=/\\[1-9]/u;function e4(a){if("string"!=typeof a)return!1;let b=a.trim();if(0===b.length||b.length>200||e1.test(b)||e2.test(b)||e3.test(b))return!1;try{RegExp(b,"u")}catch{return!1}return!0}let e5=[{id:"boq",label:"工程量清单"},{id:"drawings",label:"图纸"},{id:"tenderDocument",label:"招标文件"},{id:"clarification",label:"答疑/补遗"},{id:"geologyReport",label:"地勘报告"},{id:"projectMaterial",label:"项目资料"},{id:"userRequirement",label:"用户要求"}],e6=/^[a-z][a-z0-9-]*$/u,e7=[{pattern:/概况|总体|理解|说明|编制/u,goal:"依据真实资料说明范围、专业组成、实施条件和编制依据,区分已知事实与核验事项",mustCover:["工程名称、地点、规模、工期和质量目标等有出处且适用的项目事实","工程范围、专业组成、接口和场地条件;关键未知条件保留核验责任","实际采用的招标补遗、法规、标准及管理文件;名称、编号、版本和资格状态可核,实际引用与依据对应","全部真实专业、单体、系统和特殊构造的施工与交接责任,不强凑专业数量","单项目多属性以信息项—内容纵向或按含义分组;对象比较才横向,完整保留对象、控制数值和单位,不以固定列数或表数删数据"]},{pattern:/主要施工内容/u,goal:"完整承接真实对象、方法和接口,不以工程量罗列代替施工说明",mustCover:["全部实际专业、部位和对象,近名归并不遗漏不同职责","对应对象的工程量口径、准备条件、顺序、方法和专业接口","按对象和工法控制需要说明真实规格或参数、质量安全控制、检验验收及记录交接"]},{pattern:/主要分部分项工程施工方案|主要施工方法/u,goal:"按真实对象和工法说明可执行操作、控制和验收,必要参数随实际控制用途展开",mustCover:["各分项、独立系统和特殊构造的方法职责,不因工程量小或名称近似遗漏","对象部位、前置准备与验收、关键步骤、工作面和相邻专业衔接","工法确需的材料规格、操作或检验条件;数值具有来源、对象、单位和完整前提,未知不补造","工艺质量、安全、成品保护、记录及交接验收,不统一要求参数或环节数量"]},{pattern:/重点|难点/u,goal:"说明真实对象及工况的成因、影响、针对性控制和处置闭环",mustCover:["实际对象、部位、工况、成因和影响范围","对应方法、接口或专项控制及真实适用条件","责任、检查验收节点、异常处置、整改复核和记录","需要数值控制时准确引用参数及依据;管理或接口问题以完整程序表达,不按量化占比评分"]},{pattern:/部署|总体|流水|顺序/u,goal:"按真实范围、工作面和同一施工活动网络组织阶段及资源",mustCover:["真实对象、区段、工作面及交接界面","工序依赖、阶段顺序、穿插和必要等待,不照搬单一类型的整套工序","同一计划的资源、能力约束、动态协调及责任"]},{pattern:/进度|工期/u,goal:"基于工期约束、工程量和统一施工计划说明进度可实施性",mustCover:["总工期与日期口径、活动网络、依赖、必要等待和关键线路","阶段及滚动计划、资源工作面能力、供应和交接","进度监测、偏差原因、纠偏调整及责任,拟定节点与资料事实分开表达"]},{pattern:/质量/u,goal:"按适用质量要求落实材料、过程、验收、整改与资料闭环",mustCover:["有出处的质量目标、适用验收依据、对象和条件","交底、样板或首件、自检互检专检的实际责任及程序","适用复验与见证取样、隐蔽验收、试验及报验,参数和比例仅按真实适用要求","通病或缺陷防治、记录、整改复验及资料闭合","交接、保修与缺陷响应;有依据的期限准确写出,不补造承诺值"]},{pattern:/安全|危大|风险/u,goal:"按真实作业对象和工况落实风险、专项程序、检查整改及应急控制",mustCover:["实际安全目标与责任,不统一补造伤亡率、轻伤频率或达标率","对象、部位、作业形态和风险辨识,关键工况缺失保留核验责任","危大候选和分级以同对象完整参数及适用规则为依据,未决不等于不触发或已需专家论证","按已成立的条件落实方案编审、必要论证、交底、实施、监测和验收责任","人员设备、临电、消防及防护按实际形式组织,必要参数和检验周期具有真实适用依据","安全检查、隐患处置、复查记录和应急响应"]},{pattern:/资源|材料|设备|劳动力|人材机/u,goal:"使人机料、仪器和设施同实际活动、工程量、能力及阶段对应",mustCover:["设备适用作业、选型依据、能力约束、投入及进退场","工种、班组、工作面、阶段安排及交接","材料技术要求、采购批次、验收保管及供应","同一施工计划的资源口径和推导依据,区分拟定配置与现场已投入事实","表格按对象比较与阶段关系组织,完整对象、控制数值和单位可读;单对象多属性不堆成无比较目的的十几列单行,真实宽表保留全部字段"]},{pattern:/文明|绿色|环保|扬尘|噪声/u,goal:"按真实现场、作业影响及适用属地要求组织环境保护和文明施工",mustCover:["适用围挡、覆盖、清洗、场地和运输扬尘措施,不自动套固定百分比承诺","实际噪声振动、时段、污水、固废及交通秩序控制","监测检查、预警、处置复查、责任及记录,限值和频次仅按真实依据","适用节水节材节地节能和环保措施,不强凑每类数字或声称已完成评价"]},{pattern:/应急|预案/u,goal:"按真实风险源落实预警、响应、救援和恢复职责",mustCover:["实际风险、预警触发条件、组织及职责","与风险和救援条件相符的物资设备、通信协同","适用处置、疏散、报告救援、后期恢复、培训演练和记录,不套固定事故名单或数量"]},{pattern:/竣工|验收|移交|保修/u,goal:"按真实交付范围组织清理、验收、整改、移交和缺陷响应",mustCover:["实际收尾清理、废弃物处置和设施恢复","验收、缺陷记录、责任、整改复验和交接条件","实物资料移交、签认、保修响应及有依据的期限"]},{pattern:/工资|劳务|实名/u,goal:"按真实用工、合同和适用规定落实实名、工资、保险及争议处置",mustCover:["实名登记、合同考勤的适用对象、责任及资料管理","适用工资支付、专户代发、保证措施和台账,不把制度要求写成已开户或已支付","适用保险、参保、事故申报及劳动争议处理责任"]},{pattern:/交通导改|交通导行|交通组织|导改|管线保护|占道/u,goal:"对真实交通及管线接口说明调查、阶段保障与保护责任,不按工程类型排除",mustCover:["真实或需核验的交通、出入口及管线条件与调查责任","需要的阶段导改、通行能力、围挡隔离及恢复条件","实际通行保障、管线探明保护、权属协同和应急","适用标志标线、警示照明、监护交接,不把拟调查写成已调查"]},{pattern:/居民|扰民|既有(?:设施|管线|建筑|构筑物)保护|沟通协调|公众参与/u,goal:"按真实受影响对象组织沟通、通行、扰动控制与保护,不假定所有改造都有在场居民",mustCover:["实际影响对象、诉求和调查沟通责任,不补造户数或已走访事实","实际噪声扬尘振动和作业时间影响及控制","分区通行、出入口保障及既有设施保护接口","公示协调、投诉响应、责任记录和恢复移交"]},{pattern:/成品保护|半成品保护|交叉施工|交叉作业/u,goal:"按真实成品、系统和作业接口组织保护、交接与责任转移",mustCover:["真实保护对象、风险、责任和形式,不强行套齐房建饰面部位","工序作业面交接条件、检查记录、责任转移和专业协调","损坏记录、责任认定、修复复验、清洁和最终移交"]}];var e8=c(16646);let e9=new Map(e8.ts.map(a=>[a.id,{id:a.id,name:a.name}])),fa=[{id:"c07-safety-dangerous-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:["building"],sectionKeywords:["安全","危大","风险","安全文明","安全技术措施","危大工程","危险源"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"tender.safetyRequirements",source:"tenderDocument",required:!0}],structure:[{title:"安全管理目标与岗位职责",required:["有来源的目标、适用对象与责任,不能补造伤亡率或达标率"]},{title:"危险源辨识与危大工程管理",required:["对象、部位、作业形态、来源与完整必要参数","已成立的判据与未决条件分别表达"]},{title:"专项施工方案管理与实施程序",required:["编制审核审批、达到适用规模时的论证、交底和验收责任"]},{title:"作业安全与临时用电",required:["对应人员设备、防护形式、用电系统和必要控制依据"]},{title:"安全检查、隐患整改与应急处置",required:["检查对象、责任、异常处置、复查及记录"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","scaffold","tower-crane","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","基坑、支撑、架体、吊装等只按实际对象和工况选用;参数未齐保持核验责任,不按楼高或总量下全项目结论。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c07-safety-dangerous-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:["municipal"],sectionKeywords:["安全","危大","风险","沟槽","有限空间","管线","占道"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!0},{key:"material.existingPipelines",source:"projectMaterial",required:!0}],structure:[{title:"安全管理目标与岗位职责",required:["有来源的适用目标、对象及责任"]},{title:"沟槽与降排水安全",required:["深度、土水条件、支护或放坡、监测及周边接口","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"有限空间安全",required:["空间与进入作业条件、通风检测、监护及救援","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"管线与占道接口",required:["探明保护、权属协同、交通隔离及应急","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"吊装与现场安全",required:["实际方法、设备索具、工作条件、检查整改与记录","选用条件:涉及相应作业时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","市政标签不能证明地下水、入井作业或占道事实,也不能排除真实房建结构和设备作业;按实际范围核验。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c14-traffic-diversion",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C14",projectTypes:["municipal"],sectionKeywords:["交通导改","导行","管线保护","占道","交通组织","围挡"],sectionRegex:"交通导改|导行|管线保护|交通组织"},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.trafficLayout",source:"drawings",required:!0},{key:"material.existingPipelines",source:"projectMaterial",required:!0},{key:"tender.trafficRequirements",source:"tenderDocument",required:!1}],structure:[{title:"交通现状调查与施工接口管理",required:["实际或需调查的交通、出入口、管线和调查责任"]},{title:"分阶段交通导改与围挡设置",required:["阶段路线、能力校核、隔离及撤除恢复条件","选用条件:确有导改需要时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"通行保障",required:["实际行人车辆、沿线单位、出入口及无障碍需要"]},{title:"管线保护与警示",required:["探测保护、权属协同、标志照明、监护应急","选用条件:涉及相应接口时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"交通设施恢复与移交",required:["恢复条件、检查验收及责任转移"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-road","municipal-pipe"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","导改依赖真实道路、交通与审批条件;非市政工程同样可能有接口,不把计划调查写成已经调查。"],nonDeterministic:!0}],examples:{good:"实际交通与管线条件决定分阶段通行、围挡及保护方法,说明施工与运营接口、监护和恢复交接。",defect:"未查明管线就写已探明或已迁改,所有场内运输都套社会道路导改。"}},{id:"c15-resident-coordination",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C15",projectTypes:["building","municipal","renovation","decoration"],sectionKeywords:["居民","协调","扰民","既有","沟通","公示","通行"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0},{key:"clarification.residentRequirements",source:"clarification",required:!1}],structure:[{title:"周边影响调查与沟通协调",required:["真实使用者或居民、影响范围、诉求及调查责任"]},{title:"施工扰动控制与通行保障",required:["实际噪声扬尘振动时段、分区、通道和出入口"]},{title:"既有设施保护",required:["对象、保护形式、接口与监测","选用条件:存在相应设施时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"施工公示、投诉处理与环境恢复",required:["渠道、响应处置、责任记录、恢复与移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["facade-renovation","structural-strengthen","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","改造不当然存在在场居民或特定户数;未知保留调查责任,其他类型的真实公众接口也应承接。"],nonDeterministic:!0}],examples:{good:"围绕实际受影响人员、出入口及设施组织施工时段、沟通、保护和投诉处置,恢复结果形成交接。",defect:"照抄居民协调模板却未识别受影响对象,或把拟踏勘写成已经完成调查。"}},{id:"c16-finished-product-protection",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C16",projectTypes:[],sectionKeywords:["成品保护","交叉施工","交接","保护措施","收口"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1},{key:"tender.finishRequirements",source:"tenderDocument",required:!1}],structure:[{title:"成品保护范围与岗位职责",required:["本项目实际成品、半成品、系统及风险,保护形式与责任"]},{title:"作业面交接与保护措施",required:["各对象工序接口、移交检查、责任转移、污染与损坏防护"]},{title:"交叉作业协调",required:["真实穿插顺序、界面冲突处置和交接记录"]},{title:"成品损伤修复与交付",required:["损坏记录、责任认定、修复复验、清洁及移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","ceil-partition","painting","door-window","electrical"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","保护对象按真实工程选择,不能强行套齐地面墙面吊顶门窗设备,也不能只用饰面清单排除其他系统。"],nonDeterministic:!0}],examples:{good:"保护对象与施工状态明确,移交签认后由下一作业保护,交叉施工先核可作业条件,破损由责任方处理并复验。",defect:"每种材料都套同一句覆盖保护,未说明谁移交、谁接收及相邻工序如何避免损伤。"}},{id:"c02-major-content-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C02",projectTypes:["building"],sectionKeywords:["主要施工","分部分项","施工方法","主体结构","基础工程"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"分项工程范围与施工接口",required:["全部实际单体、专业、系统和特殊构造及其来源"]},{title:"施工准备与方法",required:["对象部位、前置验收、关键动作、工序依赖和专业衔接"]},{title:"工艺控制与验收",required:["工法确需的真实规格参数、质量安全、检验记录与交接"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["earthwork-excavation","earthwork-backfill","foundation-pit-support","pile-foundation","formwork-works","rebar-works","concrete-works"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","按本项目房建对象选工法,独立机电、室外道路或管线存在时同样覆盖,不以工程类型绝对禁写。"],nonDeterministic:!0}],examples:{good:"本分项先核工作面与前工序交接状态,再说明所选方法的实施动作、控制及合格后移交;不同材料体系分别写条件。",defect:"“放样→安装→验收”只有动作名单;“以专项方案为准”将当前技术决定转给后续。"}},{id:"c02-major-content-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C02",projectTypes:["municipal"],sectionKeywords:["主要施工","分部分项","施工方法","沟槽","管道","路基","路面"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!1}],structure:[{title:"分项工程范围与施工接口",required:["实际道路、管网、构筑物及其他专业的来源和范围"]},{title:"施工准备、土方与降排水施工",required:["测量管线核验、真实地质条件、开挖支护和排水","选用条件:涉及时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"专业工程安装与场地恢复",required:["管道接口或道路各层方法、试验、回填恢复及相关条件","选用条件:涉及时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"施工质量控制与验收",required:["对应工法的必要规格参数、质量安全、检验及移交"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不是所有市政都有沟槽、检查井或沥青;具体试验方式取决于系统和真实技术要求,不固定套闭水试验。"],nonDeterministic:!0}],examples:{good:"本分项先核工作面与前工序交接状态,再说明所选方法的实施动作、控制及合格后移交;不同材料体系分别写条件。",defect:"“放样→安装→验收”只有动作名单;“以专项方案为准”将当前技术决定转给后续。"}},{id:"c08-resources",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C08",projectTypes:[],sectionKeywords:["资源","劳动力","机械设备","材料","人材机","试验检测","临时设施"]},requires:[{key:"boq.quantities",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"施工机械设备选型与作业能力核算",required:["实际作业选型、能力、投入数量和阶段进退场的可核依据"]},{title:"劳动力配置与班组组织",required:["工种、作业面、班次、阶段投入和交接依据"]},{title:"材料采购与供应计划",required:["技术要求、批次、验收保管和活动衔接"]},{title:"检测仪器及临时设施配置",required:["用途、适用能力、来源或计划依据及布置条件","选用条件:确有需要时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["scaffold","tower-crane","electrical-hookup"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","配置来自同一实际施工计划,与工程量、工效、工作面、班次、等待和能力对应;拟定投入不冒称现场已投入。","资源表按真实对象比较和阶段关系组织,完整保留对象、控制数值和单位;单对象多属性纵向或分组,真实宽表保留字段,不以列数或表数删数据。"],nonDeterministic:!0}],examples:{good:"班组机具与材料供应对应工作面、使用窗口及产能,阶段同期资源矩阵得出峰值,不将采购设备与施工机械混列。",defect:"把各专业独立峰值相加,按合同天数平均分配人数,或在设备表填写未经核实的本企业库存。"}},{id:"c05-schedule",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C05",projectTypes:[],sectionKeywords:["进度","工期","计划","节点","里程碑","保证措施"]},requires:[{key:"schedule.totalDuration",source:"tenderDocument",required:!0},{key:"boq.quantities",source:"boq",required:!0}],structure:[{title:"总进度与关键线路",required:["工期日期口径、实际活动、依赖、必要等待与节点"]},{title:"阶段协调与滚动计划",required:["资源工作面能力、供应交接、编制调整责任"]},{title:"进度偏差分析与工期保障",required:["监测分析、纠偏、组织资源技术保障及气候影响条件"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","开工日期未明采用相对日期;不压缩必要养护试验等时间凑工期,不独立重造资源和活动网络。"],nonDeterministic:!0}],examples:{good:"活动明确前后关系和工作面放行,时长对应施工量与有效产能,材料到货、检测和必要等待进入同一网络。",defect:"相加阶段天数即宣布满足工期、先写关键线路再说日后计算,无法复核搭接和同期资源。"}},{id:"c06-quality",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C06",projectTypes:[],sectionKeywords:["质量","验收","三检","样板","复试","隐蔽","通病","保修"]},requires:[{key:"drawing.specs",source:"drawings",required:!0},{key:"boq.quantities",source:"boq",required:!0},{key:"tender.qualityStandard",source:"tenderDocument",required:!0}],structure:[{title:"质量管理目标与验收依据",required:["真实目标、对象、规范资格及验收条件"]},{title:"材料验收与施工过程质量控制",required:["交底样板、材料复验、适用取样、隐蔽验收和报验"]},{title:"质量缺陷处理与验收资料管理",required:["实际通病、检验记录、整改复验、资料闭合"]},{title:"工程交接与保修服务",required:["移交条件、响应责任和有依据的期限"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["concrete-works","rebar-works","waterproofing"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","检测项目、比例、频次和允许偏差仅在实际适用且可核时写明;完整责任程序不因没有数字而判浅。"],nonDeterministic:!0}],examples:{good:"围绕实际实体写检验对象、方法、合格状态与记录,不合格由责任岗位组织处置和复验,合格后移交。",defect:"质量章重复整套施工工艺或只写三检制、确保优良,未解释怎样证明实体合格。"}},{id:"c10-emergency",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C10",projectTypes:[],sectionKeywords:["应急","预案","演练","应急响应","应急物资","事故"]},requires:[{key:"boq.divisions",source:"boq",required:!1},{key:"material.riskSources",source:"projectMaterial",required:!0},{key:"tender.safetyRequirements",source:"tenderDocument",required:!1}],structure:[{title:"应急预警与组织职责",required:["实际风险源、触发条件、指挥协同及职责"]},{title:"突发事件处置与应急救援",required:["适用场景、警戒疏散、初期处置、报告救援及安全条件"]},{title:"应急物资、通信保障与施工恢复",required:["对应救援能力、供应存放、通信、善后复盘"]},{title:"应急培训、演练与记录管理",required:["适用要求、组织安排及反馈闭环"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["fire-protection","scaffold","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","预案和物资匹配真实风险及救援条件,不固定套事故名单、半年频次或灭火器数量。"],nonDeterministic:!0}],examples:{good:"异常按实际风险和现场接口分级处置,明确停工、隔离、撤离、通信和专业救援条件,恢复由检查结果放行。",defect:"只列应急小组姓名或要求人员盲目进入事故空间,未明确响应动作和实际救援资源。"}},{id:"c12-labor-wage",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C12",projectTypes:[],sectionKeywords:["工资","劳务","实名","农民工","工伤","考勤"]},requires:[{key:"material.laborPlan",source:"projectMaterial",required:!0},{key:"tender.wageRequirements",source:"tenderDocument",required:!0},{key:"clarification.wageGuarantee",source:"clarification",required:!1}],structure:[{title:"用工实名制与劳动合同管理",required:["适用人员、合同登记、考勤、分包及资料责任"]},{title:"工资支付保障与台账管理",required:["实际适用专户代发、保证措施、支付核验和争议处理"]},{title:"用工保险与事故申报",required:["适用参保范围、信息管理、事故申报及责任"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","制度要求与已开户已参保已支付事实分开表达,不补造登记率、账户、银行或期限;仍保留依法适用的保障责任。"],nonDeterministic:!0}],examples:{good:"用工、实名和工资安排分别明确责任、台账、核对及异常处置,承接本项目真实适用要求,拟实施程序不冒称已开户落实。",defect:"把报价人工费下限当班组生产配置,或用“资金充足绝不拖欠”代替核验与处置程序。"}},{id:"c01-overview-basis",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C01",projectTypes:[],sectionKeywords:["概况","编制依据","总体","理解","说明","编制","范围"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"tender.scope",source:"tenderDocument",required:!0},{key:"drawing.specs",source:"drawings",required:!1},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"工程概况与施工条件",required:["有出处的基本信息、专业组成、实施边界、已知条件和关键核验责任"]},{title:"编制说明与编制依据",required:["实际引用的资料法规标准管理文件、名称编号版本、适用范围和资格状态"]},{title:"专业工程组成与施工接口",required:["全部实际对象及接口,不强凑专业或依据类别数量"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","实际引用与编制依据完整对应;源码或源文件给了名称编号不等于已确认现行或批准采用,缺字段不猜补。","单项目多属性用信息项—内容纵向或按含义分组,对象比较才横向;对象、控制数值与单位完整可读,真实宽表保留全部字段,不强设列数或每章表数。"],nonDeterministic:!0}],examples:{good:"概况按实际工程范围说明对象与条件,并解释这些条件如何影响部署;编制依据列正文实际采用的名称、编号和用途。",defect:"只堆项目名、面积与“严格按图施工”,或将参考标准目录全部抄入依据,不能说明工程理解与实际采用。"}},{id:"c03-difficulty-control",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C03",projectTypes:[],sectionKeywords:["重点","难点","对策","措施","控制"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"工程重难点成因与施工影响",required:["真实对象、部位、工况、接口、成因及影响"]},{title:"工程重难点控制措施",required:["对应方法措施、实际适用条件和必要控制依据"]},{title:"控制措施责任分工与检查整改",required:["检查验收、异常处置、整改复核及记录"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","按问题本身的控制需要写参数;管理和接口难点可用完整责任程序表达,不要求每条指标、量化占比或固定措辞。"],nonDeterministic:!0}],examples:{good:"先说明真实条件造成的施工制约,再给出对应的方法、资源和接口,明确检查与异常处理如何解除制约。",defect:"将常见工艺全部称作重难点、只列风险名称与“加强管理”,没有成因与措施关系。"}},{id:"c03-difficulty-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C03",projectTypes:["building"],sectionKeywords:["重点","难点","基坑","支模","混凝土","垂直运输","既有建筑"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"改造工程范围与施工重难点",required:["根据真实范围选择基坑、支撑、混凝土、运输或既有接口,不自动套齐"]},{title:"改造施工方法与实施条件",required:["问题成因、对应措施、必要参数及专项适用依据"]},{title:"改造施工责任分工与检验",required:["前置验收、监测检查、异常处置、交接及闭环"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","concrete-works","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不因房建标签自动要求深基坑、高支模、大体积、群塔或专家论证;未核实工况继续保留适用性核验。"],nonDeterministic:!0}],examples:{good:"先说明真实条件造成的施工制约,再给出对应的方法、资源和接口,明确检查与异常处理如何解除制约。",defect:"将常见工艺全部称作重难点、只列风险名称与“加强管理”,没有成因与措施关系。"}},{id:"c04-deployment-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["building"],sectionKeywords:["部署","流水","顺序","区段","总体安排","穿插"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"施工区段与工作面划分",required:["实际单位工程和专业分组、作业面、施工条件及交接"]},{title:"施工阶段划分与工序衔接",required:["真实活动依赖、穿插、必要等待及相邻专业接口"]},{title:"施工资源配置与动态协调",required:["同一计划的能力、投入、调整及责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","tower-crane"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","仅对真实存在的基础主体装饰机电等组织,不能将全套新建房建链强加改造或混合工程。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["municipal"],sectionKeywords:["部署","流水","顺序","区段","沟槽","管线","围挡"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0}],structure:[{title:"施工区段划分与专业接口",required:["实际井段桩号或其他工程对象,通行及专业界面"]},{title:"施工阶段与穿插",required:["实际道路管线构筑物等的依赖、工作面、等待及恢复条件"]},{title:"施工资源配置与交通导改协调",required:["同一计划能力投入与实际保通隔离调整责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","市政工程可能包含房建和设备对象;交通导改、沟槽、沥青仅按真实范围采用,不绝对禁写其他专业。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-renovation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["renovation"],sectionKeywords:["部署","流水","顺序","分区","居民","既有"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0}],structure:[{title:"改造工程范围与使用条件",required:["保留拆改对象、场地使用者、分区、通行和调查责任"]},{title:"改造阶段衔接与既有设施保护",required:["真实拆改及新旧接口、专业穿插、稳定保护、必要等待和恢复"]},{title:"改造资源配置与周边影响协调",required:["同一计划的投入能力、作业时段和影响控制"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["facade-renovation","structural-strengthen","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不假定每个改造都有居民在场,也不按类型排除真实深基坑、高支撑或新增主体;依对象与完整条件组织。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-decoration",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["decoration"],sectionKeywords:["部署","流水","顺序","收口","成品保护","作业面"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1},{key:"tender.finishRequirements",source:"tenderDocument",required:!1}],structure:[{title:"装饰施工部位与工作面划分",required:["装饰对象、构造层次、基层验收和作业面交接"]},{title:"装饰施工顺序与专业穿插",required:["实际隐蔽防水饰面机电等接口、必要等待和成品保护"]},{title:"装饰资源配置与工序交接",required:["统一计划投入、移交条件、责任和冲突处置"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","ceil-partition","painting","door-window"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","装饰顺序按实际构造与专业接口确定,不强制全部作业分批或预设所有部位;已有土建管线责任不能删。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c04-deployment-general",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C04",projectTypes:["general"],sectionKeywords:["部署","流水","顺序","组织","安排","准备"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"template.chapterTitles",source:"projectMaterial",required:!1}],structure:[{title:"安装工程范围与作业条件",required:["实际对象、区段、工作面、接口和未知条件核验"]},{title:"安装施工与验收组织",required:["准备、方法依赖、检查、交接和必要等待"]},{title:"安装资源配置与阶段安排",required:["同一计划的能力、投入、供应、协调和责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["earthwork-excavation","concrete-works","electrical-hookup"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","类型未知不减少真实职责,也不填入固定主体装饰流程;据实际对象编制有条件可实施的安排。"],nonDeterministic:!0}],examples:{good:"区段以实际工作面和专业移交划分,说明推进顺序、可穿插条件及共享资源,后续方法和进度承接同一部署。",defect:"套统一阶段、把清单顺序当工序顺序,或各专业都从开工第一天占用同一设备。"}},{id:"c09-green-civilized",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C09",projectTypes:[],sectionKeywords:["文明","绿色","环保","扬尘","噪声","监测","四节一环保"]},requires:[{key:"tender.environmentRequirements",source:"tenderDocument",required:!0},{key:"material.siteConditions",source:"projectMaterial",required:!1},{key:"boq.quantities",source:"boq",required:!1}],structure:[{title:"施工环境与文明施工要求",required:["实际周边影响、属地规则及措施适用条件"]},{title:"扬尘噪声与污染控制",required:["实际围挡覆盖清洗运输、时段、污水固废和责任"]},{title:"环境监测、预警与整改",required:["适用监测或检查、异常处置、复查和记录"]},{title:"资源节约与环境保护",required:["适用水材地能和环保措施及真实控制依据"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","具体属地百分比、限值或评价频次须可核且适用;不强套六百分百或每类固定量化指标,不把计划写成已落实。"],nonDeterministic:!0}],examples:{good:"按实际受影响对象和施工阶段说明扬尘、噪声、废水或通行控制,检查结果触发纠正与恢复。",defect:"无条件抄某城市制度、承诺已取得运输许可,或在无相应对象时增加水体污染章节。"}},{id:"c11-completion-handover",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C11",projectTypes:[],sectionKeywords:["竣工","验收","移交","保修","缺陷","收尾"]},requires:[{key:"tender.qualityStandard",source:"tenderDocument",required:!0},{key:"boq.divisions",source:"boq",required:!1}],structure:[{title:"竣工收尾与场地恢复",required:["实际清理、废弃物去向和设施恢复"]},{title:"竣工检查与缺陷整改",required:["实际验收范围、问题记录、整改责任和复验"]},{title:"工程实体与竣工资料移交",required:["交接条件、资料清单、签认和责任转移"]},{title:"保修与缺陷响应",required:["适用期限依据、联系责任及处置闭环"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不能补造保修期限或回访频次,不能冒称已验收签认;完整交付职责与真实合同和质量要求对应。"],nonDeterministic:!0}],examples:{good:"从实际完成实体与系统组织检验、调试、问题整改、资料和实物移交,保修按真实责任对象安排响应。",defect:"把过程隐蔽验收重复当整套竣工验收,或写已通过尚未开展的专项检验。"}},{id:"c11-household-acceptance",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C11",projectTypes:["building","renovation"],sectionKeywords:["分户","实测实量","交付","住户","观感"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"tender.qualityStandard",source:"tenderDocument",required:!1}],structure:[{title:"分户验收适用范围",required:["实际分户对象、依据和实施条件,不按类型默认适用"]},{title:"分户实测检验与整改复验",required:["真实检验项目、允许偏差依据、记录、整改和复验","选用条件:适用时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"分户验收资料交付与签认",required:["交付资料、对象、责任及签认程序","选用条件:适用时;只作为内部适用提示,不作为正式标题或新增职责。"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["tile-paving","door-window"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","拟实施验收不填虚假合格率、实测值或住户签认;未明确分户适用性保留核验,不能据房建或改造标签确认。"],nonDeterministic:!0}],examples:{good:"从实际完成实体与系统组织检验、调试、问题整改、资料和实物移交,保修按真实责任对象安排响应。",defect:"把过程隐蔽验收重复当整套竣工验收,或写已通过尚未开展的专项检验。"}},{id:"c13-dangerous-program",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:[],sectionKeywords:["危大","危险性较大","专项方案","专家论证","辨识清单","分级"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"tender.safetyRequirements",source:"tenderDocument",required:!0}],structure:[{title:"危大工程辨识与判定依据",required:["对象部位、作业形态、完整参数、适用规则和未决核验"]},{title:"专项施工方案编制、审核与论证",required:["按成立条件编制审核审批、必要专家论证及交底"]},{title:"危大工程实施、监测与验收",required:["责任、检查、异常处置、验收和记录"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","候选、已成立分级和未决条件分别表达;数值对阈值不足以成立判断,须有完整同对象形态和适用条件。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-building",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["building"],sectionKeywords:["危大","危险性较大","基坑","模板支撑","脚手架","吊装","幕墙","吊篮"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.specs",source:"drawings",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1}],structure:[{title:"施工危险源辨识与风险评估",required:["真实基坑支撑架体吊装幕墙等对象和作业方法,不强行补齐类别"]},{title:"危险源关联工况核查",required:["深度土水周边、支撑几何与荷载、架体形式、吊装方法单件及场地等适用参数"]},{title:"危险源分级与专项控制",required:["完整适用判据、未决核验、对应方案程序、监测验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["foundation-pit-support","formwork-works","scaffold","tower-crane","steel-structure"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","房建类型既不能证明存在某危大形态,也不能证明全部不触发;实际对象和完整条件是正负判定依据。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-municipal",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["municipal"],sectionKeywords:["危大","危险性较大","沟槽","有限空间","顶管","吊装","拆除"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.pipelineLayout",source:"drawings",required:!0},{key:"geology.groundwater",source:"geologyReport",required:!0}],structure:[{title:"市政施工危险源与作业方式",required:["真实沟槽、构筑物、空间、暗挖顶管、吊装拆除等候选"]},{title:"市政施工工况与风险判定依据",required:["对应土水环境、空间进入条件、工法、设备和必要参数,不用全工程总量替代"]},{title:"市政危大工程核查与专项控制",required:["已成立判据与未决事项、方案、监测、防护、救援和验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["municipal-pipe","municipal-road","earthwork-excavation","demolition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","有限空间风险需真实空间与进入作业条件;它与法定危大范围分别核验,不因市政名称自动等同。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-renovation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["renovation"],sectionKeywords:["危大","危险性较大","拆除","脚手架","吊篮","既有","有限空间"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.existingFacilities",source:"drawings",required:!0},{key:"material.residentSituation",source:"projectMaterial",required:!1}],structure:[{title:"改造工程对象与作业条件",required:["真实拆改、新增、既有稳定与相邻接口"]},{title:"改造施工危险源辨识",required:["按范围核验拆除架体吊篮吊装支撑基坑空间等,不预设不适用"]},{title:"危大工程判定与专项控制",required:["完整同对象参数和适用规则、未知核验、方案监测防护及验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["demolition","scaffold","structural-strengthen","facade-renovation"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","不能因改造标签要求写深基坑或高支模不适用理由;有真实对应工况即承接,未知不判无危大。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c13-dangerous-forms-decoration",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C13",projectTypes:["decoration"],sectionKeywords:["危大","危险性较大","吊篮","脚手架","幕墙","吊装","高处"]},requires:[{key:"boq.entries",source:"boq",required:!0},{key:"drawing.finishSchedule",source:"drawings",required:!1}],structure:[{title:"装饰工程对象与作业条件",required:["真实部位、工作高度、运输安装方法和专业接口"]},{title:"装饰施工危险源辨识",required:["按范围核验架体吊篮幕墙吊装及其他作业,不强套固定清单"]},{title:"危大工程判定与专项控制",required:["完整同对象参数、适用规则、未知核验、防护及监测验收责任"]}],forbidden:[],knowledge:[{kind:"processCard",ids:["scaffold","facade-renovation","ceil-partition"],note:"专业方法参考;按真实对象、工法和完整适用条件核验选用,不作为项目事实、来源采用或现行标准证明。"}],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","高处或吊运风险不自动等同已成立法定危大;真实土建或管线作业也不得因装饰标签绝对排除。"],nonDeterministic:!0}],examples:{good:"同一专项对象的几何、支承、荷载与作业条件共同支持适用性判断,明确论证实施检查的责任与放行。",defect:"用一个孤立范围端点判危大,缺工况时直接写不需要专项方案。"}},{id:"c07-safety-obligation",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C07",projectTypes:[],sectionKeywords:["安全","危大","危险性较大","超过一定规模","专项方案","危险源","风险分级","安全技术措施"]},requires:[{key:"boq.divisions",source:"boq",required:!0},{key:"project.scale",source:"tenderDocument",required:!0},{key:"geology.conditions",source:"geologyReport",required:!1},{key:"drawing.specs",source:"drawings",required:!1}],structure:[{title:"安装施工危险源与危大工程辨识",required:["逐对象工况、参数及适用判据;未决条件和核验责任"]},{title:"安装专项施工方案管理",required:["按已成立条件编审审批、必要论证和交底"]},{title:"安装安全措施实施与验收",required:["实施检查、监测、异常处置、验收及记录责任"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","普通风险、危大候选和已成立法定分级分别表达;缺值不变不触发,单一类别不推成全项目结论。"],nonDeterministic:!0}],examples:{good:"风险源对应实际作业与对象,明确防护、监测、停止条件及责任;危大判定依据完整工况,不以未知认定不触发。",defect:"见到基坑或吊装关键词就宣告危大,或用总建筑高度替代专项作业高度。"}},{id:"c14-pipeline-protection",version:4,source:"builtin",enabled:!0,match:{chapterDomain:"C14",projectTypes:[],sectionKeywords:["管线","地下管线","管线保护","探明","迁改","保护措施","既有管线"]},requires:[{key:"drawing.specs",source:"drawings",required:!0},{key:"boq.divisions",source:"boq",required:!1}],structure:[{title:"地下管线调查与施工接口核查",required:["真实或需探明的类别走向、权属、位置及调查责任"]},{title:"地下管线保护与迁改",required:["对应保护方法、施工衔接、产权协同及实施条件","选用条件:确有需要时;只作为内部适用提示,不作为正式标题或新增职责。"]},{title:"管线施工监护与应急处置",required:["作业限制、监测巡护、碰损处置和恢复交接"]}],forbidden:[],knowledge:[],acceptance:[{kind:"llmChecklist",items:["仅按本任务真实对象、部位、工法及控制需要选用相关专业指导;标题或工程类型提示不证明对象存在,不排除资料明确的其他专业。","必要参数须核验真实来源、对象、单位和完整适用条件;未知保留核验责任,不能变成已完成或不适用,不按参数、字数或条数评价,不以本清单自证通过。","管线调查及保护属于实施安排时不能写成已探明已迁改;未知类别位置保留核验责任,不猜填。"],nonDeterministic:!0}],examples:{good:"实际交通与管线条件决定分阶段通行、围挡及保护方法,说明施工与运营接口、监护和恢复交接。",defect:"未查明管线就写已探明或已迁改,所有场内运输都套社会道路导改。"}}],fb=["C01","C02","C02","C03","C04","C05","C06","C07","C08","C09","C10","C11","C12","C14","C15","C16"],fc=[{domain:"C13",pattern:/危大工程专项|危险性较大的分部分项工程专项|危大专项/u}];function fd(a){if(fb.length!==e7.length)throw Error(`章域映射表与 CHAPTER_FOCUS_RULES 失配:映射 ${fb.length} 条 / 规则 ${e7.length} 条`);let b=[];for(let{domain:c,pattern:d}of function(){let a=[];return e7.forEach((b,c)=>{let d=fb[c];d&&a.push({domain:d,pattern:b.pattern})}),a.push(...fc),a}())!b.includes(c)&&d.test(a)&&b.push(c);return b}function fe(a){return a.replace(/\s+/gu,"").toLowerCase()}function ff(a,b,c,d){let e=fd(b),f=e.includes(a.match.chapterDomain),g=0===a.match.projectTypes.length||a.match.projectTypes.includes(d),h=c.map(fe).filter(a=>a.length>0),i=h.length>0,j=a.match.sectionKeywords.filter(a=>{let b=fe(a);return b.length>0&&h.some(a=>a.includes(b))}),k=i?function(a){let b=a.match.sectionRegex;if(b&&e4(b))try{return RegExp(b,"u")}catch{return}}(a):void 0,l=!!k&&h.some(a=>k.test(a)),m=a.match.sectionKeywords.length>0||void 0!==k,n=!i||!m||j.length>0||l;return{skillId:a.id,domainHit:f,matchedDomains:e,projectTypeHit:g,sectionGateApplied:i,matchedKeywords:j,regexHit:l,matched:f&&g&&n}}function fg(a,b,c,d=fa){let e=d.filter(a=>a.enabled).map(d=>({skill:d,explanation:ff(d,a,b,c)})).filter(a=>a.explanation.matched).map(a=>{var b;return{skill:a.skill,specificity:(b=a.explanation).matchedKeywords.length+ +!!b.regexHit}});return e.sort((a,b)=>b.specificity!==a.specificity?b.specificity-a.specificity:a.skill.id<b.skill.id?-1:+(a.skill.id>b.skill.id)),e.map(a=>a.skill)}let fh=new Set(["id","version","source","enabled","match","requires","structure","forbidden","knowledge","acceptance","examples","outputTitle","chapterChecklist"]);function fi(a){return af().join(function(a){if(a&&a.trim().length>0)return af().resolve(a);let b=process.env.CUSTOMIZE_AGENT_HOME;return b&&b.trim().length>0?af().resolve(b):aT().homedir()}(a),".customize-agent","skills")}let fj=["match","requires","structure","forbidden","knowledge","acceptance","examples"];function fk(a){var b,c;if(a.skill)return{skill:{...a.skill,enabled:a.enabled},kind:"user"};let d=(b=a.id,fa.find(a=>a.id===b));if(d)return{skill:{...(c=a.overrides??{},{...d,...void 0!==c.match?{match:c.match}:{},...void 0!==c.requires?{requires:c.requires}:{},...void 0!==c.structure?{structure:c.structure}:{},...void 0!==c.forbidden?{forbidden:c.forbidden}:{},...void 0!==c.knowledge?{knowledge:c.knowledge}:{},...void 0!==c.acceptance?{acceptance:c.acceptance}:{},...void 0!==c.examples?{examples:c.examples}:{},enabled:d.enabled}),enabled:a.enabled},kind:"override"}}function fl(a){let{records:b,invalid:c}=function(a){let b,c=fi(a),d=[];try{b=ad().readdirSync(c).filter(a=>a.endsWith(".json"))}catch(a){if("ENOENT"===a.code)return{records:[],invalid:d};throw Error(`技能目录不可读:${c}(${a instanceof Error?a.message:String(a)})`,{cause:a})}let e=[];for(let a of b.sort()){let b=af().join(c,a);try{let c=JSON.parse(ad().readFileSync(b,"utf8"));if(c?.v!==1){d.push({file:b,reason:`记录版本 ${String(c?.v)} 与当前 1 不符`});continue}if("string"!=typeof c.id||0===c.id.length){d.push({file:b,reason:"记录缺少 id"});continue}if(c.id!==a.replace(/\.json$/u,"")){d.push({file:b,reason:`文件名与记录 id「${c.id}」不一致`});continue}e.push(c)}catch(a){d.push({file:b,reason:`解析失败:${a instanceof Error?a.message:String(a)}`})}}return{records:e,invalid:d}}(a),d=new Map;for(let a of b)d.set(a.id,a);for(let d of b){var e;let b=fa.some(a=>a.id===d.id),f=function(a,b){let c=[];if(("string"!=typeof a.id||0===a.id.trim().length)&&c.push({code:"record-id-invalid",message:"记录 id 不得为空"}),1!==a.v&&c.push({code:"record-version-invalid",message:`记录版本须为 1,当前 ${String(a.v)}`}),"boolean"!=typeof a.enabled&&c.push({code:"override-shape",message:'enabled 必须显式为布尔值("没写"与"禁用"不能同形)'}),void 0!==a.overrides)for(let b of Object.keys(a.overrides))fj.includes(b)||c.push({code:"override-unknown-field",message:`覆盖字段「${b}」不合法(合法字段:${fj.join("/")})`});return void 0!==a.skill&&b.isBuiltin&&c.push({code:"builtin-skill-not-persistable",message:`「${a.id}」是内置技能:F.3 要求内置技能不落盘(随应用版本),只落用户的覆盖/禁用——请改用 overrides 或 enabled`}),void 0!==a.skill&&(a.skill.id!==a.id&&c.push({code:"stored-skill-id-mismatch",message:`记录 id「${a.id}」与技能 id「${a.skill.id}」不一致(文件名即 id,不一致会让读取定位到别的技能)`}),"user"!==a.skill.source&&c.push({code:"stored-skill-source",message:`落盘的自建技能 source 必须为 'user',当前 '${a.skill.source}'`})),void 0===a.skill&&void 0===a.overrides&&!1!==a.enabled&&c.push({code:"stored-skill-missing",message:"记录既没有 skill(自建)也没有 overrides(覆盖),且 enabled 不是 false——这样一条空记录落盘只会污染技能库"}),void 0!==a.skill||void 0===a.overrides||b.isBuiltin||c.push({code:"overrides-not-applicable",message:`overrides 只用于覆盖**内置**技能,而「${a.id}」不是内置 id——用户自建技能请写完整契约(skill 字段)`}),c}(d,{isBuiltin:b}),g=f.length?void 0:fk(d);g&&f.push(...(function(a){let b=!a||"object"!=typeof a||Array.isArray(a)?[]:Object.keys(a).filter(a=>!fh.has(a)).map(a=>({code:"skill-field-unsupported",path:a,message:`技能不支持字段「${a}」,请使用当前编辑器中的专业内容字段。`})),c=[],d=(a,c,d)=>{b.push({code:a,path:c,message:d})},e=(a,b,d)=>{c.push({code:a,path:b,message:d})};if(!(!(!a||"object"!=typeof a||Array.isArray(a))&&"string"==typeof a.id&&a.match&&"object"==typeof a.match&&["requires","structure","forbidden","knowledge","acceptance"].every(b=>Array.isArray(a[b]))))return{ok:!1,errors:[...b,{code:"skill-malformed",path:"",message:"技能须包含有效标识、匹配条件及专业内容数组。"}],warnings:c};for(let[b,c]of(e6.test(a.id)||d("skill-id-invalid","id","技能标识须为安全的小写字母、数字和连字符。"),(!Number.isInteger(a.version)||a.version<1)&&d("skill-version-invalid","version","技能版本须为正整数。"),["builtin","user"].includes(a.source)||d("skill-source-invalid","source","技能来源只能为builtin或user。"),"boolean"!=typeof a.enabled&&d("skill-enabled-invalid","enabled","启用状态须为布尔值。"),eY.includes(a.match.chapterDomain)||d("match-chapter-domain-unknown","match.chapterDomain","未知的专业章域。"),(!Array.isArray(a.match.projectTypes)||a.match.projectTypes.some(a=>!e_.includes(a)))&&d("match-project-type-unknown","match.projectTypes","工程类型须来自支持的专业分类。"),(!Array.isArray(a.match.sectionKeywords)||a.match.sectionKeywords.some(a=>"string"!=typeof a||!a.trim()))&&d("match-keyword-invalid","match.sectionKeywords","主题关键词须为非空文字。"),void 0===a.match.sectionRegex||e4(a.match.sectionRegex)||d("match-regex-unsafe","match.sectionRegex","主题正则无效或存在输入安全风险。"),a.requires.entries()))c&&"string"==typeof c.key&&c.key.trim()||d("requires-key-empty",`requires[${b}].key`,"事实键不得为空。"),c&&e5.some(a=>a.id===c.source)||d("requires-source-unknown",`requires[${b}].source`,"未知的资料来源。");for(let[b,c]of(a.structure.length||d("structure-empty","structure","请说明技能适用的专业主题。"),a.structure.entries())){let a=`structure[${b}]`;if(!c||"object"!=typeof c){d("structure-invalid",a,"专业主题须为对象。");continue}for(let b of Object.keys(c))["title","required"].includes(b)||d("structure-field-unsupported",`${a}.${b}`,"主题只声明名称与专业内容提示,不设置字数或参数数量要求。");"string"==typeof c.title&&c.title.trim()||d("structure-title-empty",`${a}.title`,"主题名称不得为空。"),void 0!==c.required&&(!Array.isArray(c.required)||c.required.some(a=>"string"!=typeof a||!a.trim()))&&d("structure-required-empty",`${a}.required`,"专业内容提示须为非空文字数组。")}for(let[b,c]of a.forbidden.entries()){let a="string"==typeof c?c:c?.phrase;"string"==typeof a&&a.trim()?/^.{1}$/u.test(a.trim())&&e("forbidden-entry-unusable",`forbidden[${b}]`,"单字不足以表达专业适用条件,避免仅按词面排除工程内容。"):d("forbidden-entry-empty",`forbidden[${b}]`,"写作注意不得为空。")}for(let[b,c]of a.knowledge.entries()){let a=`knowledge[${b}]`;if(!c||"processCard"!==c.kind){d("knowledge-kind-unknown",`${a}.kind`,"知识只支持可加载完整正文的工艺卡。");continue}for(let b of Object.keys(c))["kind","ids","note"].includes(b)||d("knowledge-ref-shape",`${a}.${b}`,"工艺知识引用只使用ids与说明。");if(!Array.isArray(c.ids)||!c.ids.length){d("knowledge-ids-empty",`${a}.ids`,"请选择实际工艺卡。");continue}for(let[b,e]of c.ids.entries())e9.has(e)||d("knowledge-id-unresolved",`${a}.ids[${b}]`,`工艺卡「${e}」不存在。`)}for(let[b,c]of a.acceptance.entries()){let a=`acceptance[${b}]`;if(!c||"llmChecklist"!==c.kind){d("acceptance-kind-unknown",`${a}.kind`,"技能只声明专业写作核对提示,不添加检测器或评分阈值。");continue}(!Array.isArray(c.items)||!c.items.length||c.items.some(a=>"string"!=typeof a||!a.trim()))&&d("acceptance-llm-items-empty",`${a}.items`,"专业核对提示须为非空文字数组。"),!0!==c.nonDeterministic&&d("acceptance-llm-not-flagged",`${a}.nonDeterministic`,"专业提示不能声明为已确定通过的验收结果。")}if(a.knowledge.length||a.structure.some(a=>Array.isArray(a?.required)&&a.required.length)||a.acceptance.length||d("skill-guidance-empty","","技能须有可加载工艺知识或实际专业内容提示,不能只有标题。"),!a.examples||"string"==typeof a.examples.good&&a.examples.good.trim()&&"string"==typeof a.examples.defect&&a.examples.defect.trim()||d("examples-incomplete","examples","示例须同时说明合理写法与缺陷,示例不是工程事实。"),void 0===a.outputTitle||"string"==typeof a.outputTitle&&a.outputTitle.trim()||d("output-title-empty","outputTitle","文档名称声明须为非空文字。"),void 0!==a.chapterChecklist){let b=a.chapterChecklist;if(!b||"object"!=typeof b||Array.isArray(b))d("chapter-checklist-malformed","chapterChecklist","章级专业提示须为对象。");else{let a=new Set(["sections","queries","requiredFacts","tableSections","tableRequirements","pinnedEvidenceFilePaths"]);for(let[c,e]of Object.entries(b))"purpose"===c?"string"==typeof e&&e.trim()||d("chapter-checklist-purpose-empty",`chapterChecklist.${c}`,"章职责不得为空。"):a.has(c)?(!Array.isArray(e)||e.some(a=>"string"!=typeof a||!a.trim()))&&d("chapter-checklist-entry-invalid",`chapterChecklist.${c}`,"专业提示须为非空文字数组。"):d("chapter-checklist-unknown-field",`chapterChecklist.${c}`,"未知的章级专业提示字段。")}}return{ok:0===b.length,errors:b,warnings:c}})(g.skill).errors.map(a=>({code:"skill-invalid",message:`${a.path}: ${a.message}`}))),(f.length||!g)&&c.push({file:(e=d.id,af().join(fi(a),`${e}.json`)),reason:f.map(a=>a.message).join(";")||"不能解析为生效技能"})}let f=[];for(let a of fa){let b=d.get(a.id);if(!b){f.push(a);continue}let c=fk(b);f.push(c?c.skill:{...a,enabled:b.enabled})}for(let a of b){if(fa.some(b=>b.id===a.id))continue;let b=fk(a);b&&f.push(b.skill)}return{skills:f,records:b,invalid:c}}function fm(a){let b=fl(a);if(b.invalid.length)throw Error(`生成技能输入不完整:${b.invalid.map(a=>`${a.file}:${a.reason}`).join(";")}`);return b.skills}function fn(a,b){let c=new Set(a);return(0,e8.cn)([b]).filter(a=>c.has(a.id)).map(a=>a.id)}let fo=e8.ts.map(a=>a.id);function fp(a){return[...new Set(a)].map(a=>{let b=(0,e8.VY)(a);return b?[`▸ ${b.name}(方法参考,步骤不作为正文句式):`,...b.applicability?[` 适用对象与方法条件:${b.applicability}`]:[],...b.exclusions?.length?[` 不适用或需另选的条件:${b.exclusions.join(";")}`]:[],...b.process.map((a,b)=>` ${b+1}. ${a}`)," 写作时说明适用条件、实施动作、控制与转序;不能只把这些步骤串成动作列表。",...b.params.map(a=>` \xb7 工艺参数:${a}`),...b.acceptance.map(a=>` \xb7 检测验收:${a}`),...(b.interfaces??[]).map(a=>` \xb7 专业接口:${a}`),...b.resourceBasis?[` \xb7 资源与工效推演:${b.resourceBasis}`]:[],...b.standards.map(a=>` \xb7 规范候选:${a}(具体版本、适用条文与工程采用另核)`),...b.source?[` \xb7 知识参考出处(非项目证据或采用结论):${b.source}`]:[]].join("\n"):""}).filter(Boolean).join("\n")}function fq(a){return[...a.structure.map(a=>`${a.title}:${(a.required??[]).join(";")}`).filter(a=>!a.endsWith(":")),...a.acceptance.flatMap(a=>a.items),...a.forbidden.map(a=>"string"==typeof a?a:`${a.phrase}${a.reason?`(${a.reason})`:""}`),...a.examples?[`表达示例(仅教写法,不构成本项目事实或专家验收):${a.examples.good}`,`需避免的写法及原因:${a.examples.defect}`]:[]].filter(Boolean).join("\n")}function fr(a){if(Array.isArray(a.skills))return{skills:a.skills,invalidRecords:[],source:"ctx"};let b=fl();return{skills:b.skills,invalidRecords:b.invalid,source:"store"}}function fs(a,b,c=!1){return{id:a.id,displayName:function(a){let b=e$[a.match.chapterDomain]??a.match.chapterDomain,c=0===a.match.projectTypes.length?"全类型":a.match.projectTypes.map(a=>e0[a]??a).join("、");return`${b} \xb7 ${c}`}(a),version:a.version,source:a.source,enabled:a.enabled,chapterDomain:a.match.chapterDomain,chapterDomainLabel:eZ[a.match.chapterDomain]??a.match.chapterDomain,projectTypes:[...a.match.projectTypes],projectTypeLabels:a.match.projectTypes.map(a=>e0[a]??a),sectionKeywords:[...a.match.sectionKeywords],matchedBy:{domains:b?[...b.matchedDomains]:[],keywords:b?[...b.matchedKeywords]:[],regexHit:b?.regexHit??!1},...!c?{contract:{sections:a.structure.map(a=>a.title),sectionCount:a.structure.length,forbiddenCount:a.forbidden.length,acceptanceCount:a.acceptance.length,acceptanceKinds:[...new Set(a.acceptance.map(a=>a.kind))],requires:a.requires.map(a=>a.key),knowledge:a.knowledge.flatMap(a=>a.ids)}}:{}}}function ft(a,b){let c=String(a??"").trim();if(!c)throw c1(`${b} 必填(${e_.join(" / ")})。**刻意不给默认值**:传 general 会让只声明了 building/municipal 等类型的技能静默不命中,而"少加载了技能"是看不见的缺陷。工程类型取自项目设定或招标文件,不要猜。`);if(!e_.includes(c))throw c1(`${b} 取值「${c}」不在闭集内(${e_.join(" / ")})`);return c}async function fu(a,b){let c=String(a?.chapterTitle??"").trim();if(!c)throw c1("chapterTitle 不能为空(技能按章标题解析章域,空标题推不出任何域)");let d=ft(a?.projectType,"projectType"),e=Array.isArray(a?.sections)?a.sections.map(a=>String(a??"").trim()).filter(Boolean):[],f=fr(b);if(0===f.skills.length)throw c4("技能池(`ctx.skills` 或技能库)","运行时注入 `ctx.skills`(内置与用户技能池)。空池应查明加载原因,不能报告专业知识已经加载。");let g=fg(c,e,d,f.skills),h=f.skills.filter(a=>!a.enabled).length;return{chapterTitle:c,projectType:d,matched:g.map(a=>fs(a,ff(a,c,e,d),!!b.authorTask)),disabledCount:h,poolSize:f.skills.length,invalidRecords:f.invalidRecords,note:0===g.length?"没有命中任何技能(匹配是特异度降序的硬门:章域 + 工程类型 + 小节关键词任一不过即不命中)。请核对工程类型与当前任务名称;确认无适用技能时依本任务资料和职责写作,不为命中技能改标题或增删小节。":`命中 ${g.length} 个(已按特异度降序);完整专业知识用 \`load_skill(skillId)\` 取,不要凭摘要里的节名自己编结构。`}}let fv={name:"match_skills",description:dd("按章标题、小节标题和工程类型匹配技能,返回领域候选摘要及命中依据;候选节名不改变本次冻结合同。","**本章开工前**的定位阶段(`:378`:「专业参考可取得」是定位阶段的成功判据);换章、改标题、改工程类型后要重跑。","**写完才调**——那时结构已定,看契约只剩事后辩解;也**不要凭摘要里的节名自己补全契约**(摘要是索引不是内容,用 `load_skill` 取全量);`projectType` 不要猜(猜错会让应命中的技能静默不加载,见工具参数说明)。"),scope:"skill-store",inputSchema:de.object({chapterTitle:de.str("章标题(用模板里的正式名;技能按它解析章域)"),sections:de.arr("本章的小节标题(用于小节关键词门;可空)",de.str("小节标题")),projectType:de.str(`工程类型(${e_.join(" / ")};**必填,不给默认值**)`)},["chapterTitle","projectType"]),idempotent:!0,handler:fu};async function fw(a,b){let c=String(a?.skillId??"").trim();if(!c)throw c1("skillId 不能为空");let d=fr(b),e=d.skills.find(a=>a.id===c);if(!e){let a=d.skills.map(a=>a.id).sort().join("、");throw c3(`技能「${c}」不存在。当前池内可用技能:${a||"(池为空)"}`)}if(!e.enabled)throw c1(`技能「${c}」已停用,不能加载。`);let f=fq(e),g=fp(e.knowledge.flatMap(a=>a.ids)),{examples:h,...i}=e;if(b.authorTask){let{structure:a,requires:b,acceptance:c,chapterChecklist:d,outputTitle:e,...h}=i;return{skill:h,writingGuidance:f,processCardText:g,note:"当前作者职责、结构及验收以冻结合同为准;技能只提供领域工艺知识与禁配,不能增加小节或强制字数、参数密度。来源和具体参数仍须核本项目的对象与适用条件。"}}return{skill:i,writingGuidance:f,processCardText:g,contract:{sectionCount:e.structure.length,forbidden:e.forbidden.map(a=>"string"==typeof a?a:a.phrase),acceptanceSummary:e.acceptance.flatMap(a=>a.items)}}}let fx={name:"load_skill",description:dd("读取一个技能的工艺知识、写作正反例与禁配。示例只教表达,不作为本项目事实;固定任务作者不获得另一套结构或验收要求。","需要补充当前职责相关领域知识时,从已命中技能中按需读取;正文职责与层级由本次冻结合同确定。","一次把池里所有技能全 load 进来(每个技能 1.5–2.2KB,几个就顶满工具结果上限,而且用不到的契约只会干扰判断)——只加载当前任务相关技能;也不要在写作中途反复重 load(本轮已冻结知识未变化,重复取等于烧上下文)。"),scope:"skill-store",inputSchema:de.object({skillId:de.str("技能 id(取自 `match_skills` 或 `list_skills`)")},["skillId"]),idempotent:!0,handler:fw};async function fy(a,b){let c=a?.filter;if(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)))throw c1("filter 若要给,必须是对象 `{source?, projectType?, chapterDomain?}`");if(c?.source!==void 0&&"builtin"!==c.source&&"user"!==c.source)throw c1("filter.source 只能是 builtin 或 user");if(c?.chapterDomain!==void 0&&!eY.includes(String(c.chapterDomain)))throw c1(`filter.chapterDomain 取值「${String(c.chapterDomain)}」不在闭集内(${eY.join(" / ")})`);let d=c?.projectType===void 0?void 0:ft(c.projectType,"filter.projectType"),e=fr(b),f=e.skills.filter(a=>(c?.source===void 0||a.source===c.source)&&(c?.chapterDomain===void 0||a.match.chapterDomain===c.chapterDomain)&&(void 0===d||!(a.match.projectTypes.length>0)||!!a.match.projectTypes.includes(d)));return{skills:f.map(a=>fs(a)),total:e.skills.length,filteredOut:e.skills.length-f.length,disabledCount:e.skills.filter(a=>!a.enabled).length,invalidRecords:e.invalidRecords,availableDomains:eY.map(a=>({id:a,label:eZ[a]??a})),availableProjectTypes:e_.map(a=>({id:a,label:e0[a]??a})),note:`技能库共 ${e.skills.length} 个,过滤后 ${f.length} 个(含 disabled)。**\`disabled\` 的技能也列出来**:禁用是用户的显式决定,不报出来就没人知道"这条技能为什么没生效"。缺省工程类型为 general(本工具只做过滤,不参与匹配,故给默认值无副作用)。`}}let fz={name:"list_skills",description:dd("列出技能库(可按 `source` / `projectType` / `chapterDomain` 过滤),返回摘要与可用枚举值(含 disabled 项)。",'需要知道"这个库到底有哪些技能"时:新项目立项、怀疑某个技能该在却没匹配上、或要看用户自定义技能(`source: "user"`)时。',"**不要拿它替代 `match_skills`**:本工具只做过滤、不做章标题匹配,列出来的不等于本章该用的;也不要在写作过程中反复列(技能库在一次运行内不变,重复列等于烧上下文)。"),scope:"skill-store",inputSchema:de.object({filter:de.obj("过滤条件(可选;都给即取交集)",{source:de.enumStr("技能来源",["builtin","user"]),projectType:de.enumStr("工程类型",e_),chapterDomain:de.enumStr("章域(闭集)",eY)})}),idempotent:!0,handler:fy},fA=["match_skills","load_skill","list_skills","discover_files","inspect_asset"],fB=["lookup_authoritative","query_project_facts"],fC=a=>a.map(a=>a.name),fD=(...a)=>[...new Set(a.flat())],fE={locate:fA,plan:fD(fA,fB,["expand_scope"]),generate:fD(fA,fB,fC(dR),fC(dU),fC(d4),fC(eK),fC(eP),fC(eS)),finalize:fD(fC(dU),fC(eK),fC(eP),fC(eX))},fF=["locate","plan","generate","finalize"];function fG(a){return fF.filter(b=>fE[b].includes(a))}let fH=[{id:"A.1-evidence",tools:dR},{id:"A.2-verdict",tools:dU},{id:"A.3-compute",tools:d4},{id:"A.4-authoring",tools:eK},{id:"A.6-declare",tools:eP},{id:"A.11-fact-placement",tools:eS},{id:"A.8-meta",tools:eX},{id:"A.9-skills",tools:[fv,fx,fz]}],fI=fH.flatMap(a=>a.tools.map(a=>({...a,stages:fG(a.name)}))),fJ=new Map(fI.map(a=>[a.name,a]));function fK(a){return fI.filter(b=>b.stages.includes(a))}async function fL(a,b,c){let d=Date.now(),e=fJ.get(a);if(e&&c.allowedTools&&!c.allowedTools.includes(a))return c8(a,c3(`工具「${a}」不在当前任务实际开放的能力范围中`),d);if(e&&c.stage&&!fG(a).includes(c.stage))return c8(a,c3(`工具「${a}」不允许在 ${c.stage} 阶段调用(允许阶段:${fG(a).join("、")||"无"})`),d);if(!e)return c8(a,c3(`未注册的工具「${a}」。已注册 ${fI.length} 个:${fI.map(a=>a.name).join("、")}`),d);let f=function(a,b){if(0===a.inputSchema.required.length)return;if(!b||"object"!=typeof b||Array.isArray(b))return`工具「${a.name}」需要对象参数,缺少必填字段:${a.inputSchema.required.join("、")}`;let c=a.inputSchema.required.filter(a=>void 0===b[a]||null===b[a]);return c.length>0?`工具「${a.name}」缺少必填字段:${c.join("、")}`:void 0}(e,b);if(f)return c8(a,c1(f),d);try{let f=await e.handler(b,c,{tool:a,ctx:c}),g=function(a){let b=String(a??"");if(!b)return{suspicious:!1,patterns:[]};let c=c6.filter(a=>a.pattern.test(b)).map(a=>a.id);return{suspicious:c.length>0,patterns:[...new Set(c)].sort()}}(c7(f)),h={ok:!0,tool:a,data:f,bytes:c7(f).length,elapsedMs:Math.max(0,Date.now()-d)};return g.suspicious&&(h.injection=g),h}catch(b){return c8(a,function(a){if(a instanceof c_)return a;let b=a instanceof Error?a.message:String(a);return new c_("INTERNAL",`工具内部异常:${b}`)}(b),d)}}Object.fromEntries(fH.map(a=>[a.id,a.tools.length]));let fM=["query_construction_plan","query_project_facts","query_work_packages","query_cad_context","query_source_units","search_evidence","read_source","discover_files","list_skills","match_skills","load_skill","ask_chief","submit_author_task","correct_author_submission","declare_missing","declare_unfixable"];function fN(a){return fM.filter(b=>"ask_chief"===b?"function"==typeof a.chief?.ask:"query_construction_plan"===b?"function"==typeof a.constructionPlan?.query:"declare_missing"===b?"function"==typeof a.audit?.declareMissing:"declare_unfixable"!==b||"function"==typeof a.audit?.declareUnfixable)}let fO=["items","chunks","candidates","sourceEvidence","records","units","skills","matched","activities","plannedResources","numbers","materials"],fP=a=>Array.isArray(a)?a.map(fP):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,fP(b)])):a,fQ=a=>(0,e.createHash)("sha256").update(JSON.stringify(fP(a))).digest("hex");function fR(a){let b=String(a.projectRoot??"").trim(),c=b?(0,ah.NW)(b):"",d=[],e=[];for(let b of a.scopeRootNames??[]){let a=String(b??"").trim();if(!a)continue;if(!c){e.push(`${a}(项目根为空,无法解析项目资料根)`);continue}let f=cZ(c,a);f.ok?d.push(f.absolute):e.push(`${a}(${c$(f.reason)})`)}e.length>0&&console.warn(`[agent-tools] 资料白名单有 ${e.length} 项无法解析为项目资料根,已按 fail-closed 丢弃:${e.join(";")}`),b||console.warn("[agent-tools] 未提供 projectRoot:本块工具面的资料根为空(取证/读类工具一律 PATH_DENIED,fail-closed)");let f={projectRoot:b,...a.skills?{skills:a.skills}:{},scopeRoots:[...new Set(d)].sort(),...a.signal?{signal:a.signal}:{},...a.rewriteAuthor?{rewriteAuthor:a.rewriteAuthor}:{},...a.audit?{audit:dk(a.audit,a.locationOf)}:{},...a.authoritative?{authoritative:a.authoritative}:{},...a.projectModel?{projectModel:a.projectModel}:{}};return a.contractScoped&&(f.allowedTools=fN(f)),f}async function fS(a){let b=String(a.nodeId??"").trim()||"current";if(!0!==a.contractScoped)throw Error("作者生成必须使用冻结合同,不能退回旧Markdown写作");let c=(0,g.O3)(a.diagnostics,a.chapterId??"",a.blockTitle??b);if(!c||!a.diagnostics||!a.toolContext?.projectModel)throw Error("固定作者任务缺少合同、诊断账或项目快照接线");let d=(0,bl.r2)({...c,projectModel:a.toolContext?.projectModel}),f=`${a.system}
30
30
 
31
- ${(0,bl.r2)({...c,projectModel:a.toolContext?.projectModel})}
32
- 最终正文通过结构化任务产物提交;内容、事实和专业要求仍须完整遵守,格式标记与自评说明不写入信息单元。`,f=function(){let a=new Map,b=new WeakMap;return c=>c.map(c=>{let d;if("tool"!==c.role||!c.toolCallId)return c;let e=b.get(c);if(e)return e;let f=/^\[([^\]]+)\] ok[^\n]*\n/u.exec(c.content);if(!f)return c;try{d=JSON.parse(c.content.slice(f[0].length))}catch{return c}if(!d||"object"!=typeof d||Array.isArray(d))return c;let g={projectSnapshotId:d.projectSnapshotId??d.snapshotId,contractId:d.contractId},h={},i={...d};for(let b of fO){if(!Array.isArray(d[b]))continue;let e=[];for(let[f,i]of d[b].entries()){let d=fQ(i),j=fQ([g,i]),k=a.get(j);k?(h[b]??=[]).push({requestedIndex:f,...k}):(a.set(j,{toolCallId:c.toolCallId,field:b,index:e.length,sha256:d}),e.push(i))}i[b]=e}if(!Object.keys(h).length)return b.set(c,c),c;i.contextReferences=h,i.contextProjection="unique-records-with-exact-prior-tool-references",i.referenceMeaning="本次匹配结果由新增记录与contextReferences共同组成;引用指向本对话此前原字完整工具回执,不能将新增数组为空解释为查询无结果。";let j=JSON.stringify(i),k={...c,content:`[${f[1]}] ok \xb7 ${j.length} 字符
33
- ${j}`};return b.set(c,k),k})}(),i=[],j=0,k=[],l=a.maxTokens,m=await (0,dl.Bj)({system:d,initialMessages:[{role:"user",content:a.prompt}],initialEvidence:[...a.preloadedSourceRecords?.length?[{toolName:"query_project_facts",ok:!0,data:{snapshotId:a.toolContext.projectModel.snapshotId,candidates:a.preloadedSourceRecords}}]:[],...a.preloadedMemberIds?.length?[{toolName:"query_work_packages",ok:!0,data:(0,dq.H)(a.toolContext.projectModel,{query:"*",memberIds:[...a.preloadedMemberIds]})}]:[],...a.preloadedConstructionPlan?[{toolName:"query_construction_plan",ok:!0,data:a.preloadedConstructionPlan}]:[]],budget:(0,bk.Su)(a.diagnostics).budget,...a.onTurn?{onTurn:a.onTurn}:{},check:async a=>({issues:a.trim()?[]:[{detectorId:"block-structure-contract",level:"error",severity:"blocker",message:"结构化任务尚未提交"}],executed:["block-structure-contract"],degraded:[]}),runTurn:async({messages:g,toolCallLimit:m,turn:n})=>{var o,p;let q,r,s,t;a.signal?.throwIfAborted();let u=(0,bk.Iw)((0,bk.Su)(a.diagnostics)),v=[...fK("locate"),...fK("plan"),...fK("generate")],w=new Set(fN(a.toolContext)),x=[...new Map(v.map(a=>[a.name,a])).values()].filter(b=>w.has(b.name)&&(!a.toolContext?.allowedTools||a.toolContext.allowedTools.includes(b.name))).map(a=>{let b=structuredClone(a.inputSchema);return{name:a.name,description:a.description,parameters:b}}),y=f(g),z=!1,A=l,B=await (0,h._v)({system:d,messages:y,tools:x,requireToolCall:!0,taskKind:"structuredGeneration",onRawResponse:e=>{if(t=e,s=void 0,z=!0,r=dh(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:n,response:e,request:{system:d,messages:y,tools:x,maxTokens:A,requireToolCall:!0}}),e.responseMetadata?.finishReason==="length"){(0,cS.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:n,toolCalls:e.toolCalls.length,reason:"作者工具输出被供应商截断;完整原响应已归档,暂停核查单任务协议与实际思考开销,不重写整任务或继续整包取证"},"model-output-truncated");let c=e.requestMetadata?.maxTokens,d=void 0!==A?Math.ceil(1.5*A):void 0!==c?Math.ceil(1.5*c):void 0,f=e.requestMetadata?.outputCap;s={kind:"incomplete-output",sentOutputBudget:c??null,nextOutputBudget:(l=void 0===d?void 0:void 0===f?d:Math.min(d,f))??null,finishReason:"length"}}else e.responseMetadata?.protocolFailure&&(s={kind:"invalid-tool-arguments"===e.responseMetadata.protocolFailure?"invalid-tool-arguments":"incomplete-stream",sentOutputBudget:null,nextOutputBudget:null,finishReason:e.responseMetadata.finishReason??null,detail:e.droppedToolCalls??null});e.responseMetadata?.completed===!1&&(e.toolCalls.some(a=>"submit_author_task"===a.name)||Array.isArray(e.rawToolCalls)&&e.rawToolCalls.some(a=>a?.name==="submit_author_task"||a?.function?.name==="submit_author_task"))&&bx(a.diagnostics,c.section.id,!1)},callKind:(o=a.diagnostics,p=c.section.id,o&&bq.get(o)?.model.taskAttempts[p])?"chapter-repair":"chapter-writing",stablePrefixChars:a.stablePrefixChars,maxTokens:A,signal:a.signal,diagnostics:a.diagnostics});if(a.signal?.throwIfAborted(),z||(r=dh(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:n,response:B})),!z&&B?.responseMetadata?.completed===!1&&B.toolCalls.some(a=>"submit_author_task"===a.name)&&bx(a.diagnostics,c.section.id,!1),!B){if(t?.responseMetadata?.protocolFailure==="invalid-tool-arguments"&&Array.isArray(t.rawToolCalls)){let a=t.rawToolCalls.map(a=>({id:a.id,name:a.name??a.function?.name,arguments:a.arguments??a.function?.arguments}));if(a.length&&a.every(a=>"string"==typeof a.id&&a.id&&"string"==typeof a.arguments&&x.some(b=>b.name===a.name))){let b=[{role:"assistant",content:t.content,...void 0===t.thinkingContent?{}:{thinkingContent:t.thinkingContent},toolCalls:a},...a.map(a=>({role:"tool",toolCallId:a.id,content:c9(c8(a.name,c1(`本次参数未执行:${JSON.stringify(t.droppedToolCalls??[])};只纠正语法结构,保留前述原字全部正文、表格和图数据`),Date.now()))}))];return{text:"",toolCalls:[],protocolRecovery:s,toolMessages:b}}}let b=(0,bk.Su)(a.diagnostics);if((0,bk.Iw)(b)>u||(0,bk.nY)(b)||(0,bk.Z9)(b)){let a=(0,bk.nY)(b)??(0,bk.Z9)(b);return{text:"",toolCalls:[],refused:{kind:a?.kind??"budget",message:a?.message??"预算耗尽:本次调用未发起"}}}return{text:"",toolCalls:[],...s?{protocolRecovery:s,toolMessages:[{role:"user",content:`上一工具响应未接纳。实际协议回执:${JSON.stringify(s)}。解析失败或未报告finish_reason不能证明输出额度不足,不凭空扩大预算;原始有意义文字完整保留。保留完整原任务和已取得证据,纠正实际工具参数语法与标注;已有服务端保留的可解析原稿使用correct_author_submission,不重新生成它的段落、表行或图数据;不得补造事实。`}]}:{}}}let C=[],D=[],E=[],F=[],G=async(b,d)=>{let f;if(B.responseMetadata?.completed!==!0)throw Error("作者响应未完整结束,不能提交为完整任务");if(void 0!==a.maxAuthorSubmissions&&j>=a.maxAuthorSubmissions)throw Error("本任务的定向内容修改次数已用完,不能再次改稿");try{f=(0,bl.Ix)(b,{contract:c.contract,taskId:c.section.id,projectModel:a.toolContext?.projectModel}),await a.beforeAuthorSubmit?.(f)}catch(b){throw bx(a.diagnostics,c.section.id,!1),b}let g=function(a,b,c,d,e={}){let f=bq.get(a);if(!f)throw Error("当前运行没有文档模型写入器");let g={...f,model:bs(f.model),onChange:void 0};try{let a=bw(g,b,c,d??(f.model.authorPassSealed?"续跑补足原合同未产出任务":void 0),!!(e.preserveFirstDraft&&!f.model.tasks[b]&&!f.model.authorPassSealed));return f.onChange?.(bs(g.model)),f.model=g.model,a}catch(a){throw bv(f.model,b,!1),f.onChange?.(bs(f.model)),a}}(a.diagnostics,c.section.id,f,f&&"object"==typeof f&&"string"==typeof f.revisionReason?f.revisionReason:void 0,{preserveFirstDraft:!a.beforeAuthorSubmit});for(let b of(j+=1,!function(a,b,c,d){let f=a&&dg.get(a);if(!f)return;if(b.output.contractId!==f.contractId||b.output.projectSnapshotId!==f.projectSnapshotId||!f.expectedTaskIds.includes(b.output.taskId))throw Error("结构化候选的归档身份不属于当前运行");let g=f.candidates.filter(a=>a.taskId===b.output.taskId).length,h=(0,am.tv)(f.generatedDir,`author-candidate-${(0,e.randomUUID)()}.json`,{version:1,runId:f.runId,contractId:f.contractId,taskId:b.output.taskId,ordinal:g,rawCallId:c??null,protocolComplete:!0,qualityMeasured:!1,candidate:b,...d?{protocolCorrection:d}:{}},f.runId);f.candidates.push({taskId:b.output.taskId,ordinal:g,rawCallId:c??null,...h,contentHash:b.contentHash,hasContent:b.output.units.length>0})}(a.diagnostics,g,r,d),q=g.markdown,g.output.decisionRequests))await a.toolContext.audit?.requestClarification({question:b.question,blocking:!0});return{taskId:g.output.taskId,contentHash:g.contentHash,pendingCriterionIds:g.pendingCriterionIds}},H={...a.toolContext,stage:"generate",allowedTools:x.map(a=>a.name),authorTask:{criterionIds:(0,cT.C)(c.contract,c.section.id).map(a=>a.id),submit:async a=>{let b=k.length,c={output:structuredClone(a),accepted:!1,rawCallId:r??null};k.push(c);try{let b=await G(a);c.accepted=!0;let d=(0,bl.t3)(a);return d.length?{...b,shapeRepairs:d}:b}catch(d){let a=d instanceof Error?d.message:String(d),c=/包含协议外字段/u.test(a)?";可用 correct_author_submission 的 remove-unknown-field 操作删除该键(错误信息已给出路径),或去掉该键后重新提交":/须保留非空实际原文/u.test(a)?";可用 drop-empty-fragment 删除仅含空text的片段,或修正后重新提交":/已退役|units 旧形态|format 无效/u.test(a)?";请按 compact-v7 载体形(paragraphs/tables/figures/decisionRequests)重新提交":/守恒/u.test(a)?";单元顺序与全部载体须保持完整,不丢弃也不补造":"";throw Error(`${a};原稿已完整保留,submissionIndex=${b}。标注纠正用correct_author_submission,不重写段落、表行或图数据;来源资格仍须独立核验。${c}`,{cause:d})}},correct:async(a,b)=>{if(!Number.isSafeInteger(a)||a<0)throw Error("原稿序号无效");let c=k[a];if(!c||c.accepted)throw Error("只能纠正本任务当前实际未接收原稿");let d=(0,df.QN)(c.output,b);c.output=d;let e=await G(d,{submissionIndex:a,originalRawCallId:c.rawCallId,changes:b});return c.accepted=!0,e}}},I=void 0!==m?Math.max(0,m):B.toolCalls.length,J=a=>"submit_author_task"===a||"correct_author_submission"===a,K=B.toolCalls.find(a=>J(a.name)),L=new Set([...B.toolCalls.filter(a=>!J(a.name)).slice(0,Math.max(0,I-(K||void 0!==m&&x.some(a=>"submit_author_task"===a.name)?1:0))),...K&&I>0?[K]:[]]),M=B.toolCalls.filter(a=>L.has(a)),N=B.toolCalls.length-M.length;for(let b of(N>0&&(console.warn(`[agent-tools] 单轮工具调用超块级预算,已截断 ${N} 次(限额 ${m})`),a.onToolIssue?.([{level:"warning",category:"structure",owner:"system",message:`本轮工具调用超出块级上限,已执行前 ${M.length} 次、截断 ${N} 次——请合并查询或减少工具调用`,suggestion:"下一轮只调真正需要的工具;剩余额度见块预算"}])),M)){let c,d;a.signal?.throwIfAborted();let e=Date.now();try{c=(0,cU.parseJsonWithoutDuplicateKeys)(b.arguments||"{}")}catch(a){d=a instanceof Error?a.message:String(a)}let f=d?c8(b.name,c1(d),e):await fL(b.name,c,H);if(a.signal?.throwIfAborted(),D.push(f.ok?{toolName:b.name,ok:!0,data:f.data}:{toolName:b.name,ok:!1,error:{code:f.error.code}}),f.ok){let a=function(a,b){let c=b??{},d=(...a)=>{for(let b of a){let a=c[b];if("string"==typeof a&&a.trim())return a.trim()}};return"search_evidence"===a||"discover_files"===a?d("query"):"read_source"===a||"query_source_units"===a?d("filePath","path"):void 0}(b.name,c);a&&H.audit?.recordEvidenceCall&&H.audit.recordEvidenceCall({tool:b.name,term:a})}0===E.length&&E.push({role:"assistant",content:B.content??"",toolCalls:M.map(a=>({id:a.id,name:a.name,arguments:a.arguments})),...void 0!==B.thinkingContent?{thinkingContent:B.thinkingContent}:{}}),E.push({role:"tool",content:c9(f),toolCallId:b.id});let g=f.ok?f.injection:void 0;g?.suspicious&&F.push({tool:b.name,patterns:g.patterns}),C.push({toolName:b.name,ok:f.ok,durMs:Date.now()-e,summary:f.ok?`ok ${f.bytes??0}B${g?.suspicious?" \xb7 疑似注入(按数据对待)":""}`:`${f.error.code}`})}if(i.push(...C),F.length>0){let c=F.map(a=>`${a.tool}(${a.patterns.join("、")})`).join(";");a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${F.length} 处:${c}——已按数据对待并记节点 issue`);try{a.onToolIssue?a.onToolIssue(F.map(a=>(function(a){let b=[...a.patterns].sort().join("、")||"未标注模式";return{level:"warning",severity:"warning",category:"scope",owner:"system",repairability:"manual_review",message:`工具「${a.tool}」返回的资料内容命中疑似注入形态(${b})——该内容已按数据对待(模型侧带「${c5}」前缀),本节正文不得因它改变写作口径`,suggestion:"人工复核该资料:若确为提示注入,请把该文件移出资料范围后重跑本节;正文中据其写出的事实须另行核实来源。",...a.nodeId?{sectionTitle:a.nodeId}:{},provenance:{detectorId:"suspicious-injection",fingerprint:(0,an.c6)(`${a.tool}\u0000${b}\u0000${a.nodeId??""}`)}}})({...a,nodeId:b}))):console.warn(`[agent-tools] 工具结果命中疑似注入(${c})但本次未提供节点问题汇(onToolIssue)——命中未被静默丢弃,见 llm.lastInfo`)}catch(d){let b=d instanceof Error?d.message:String(d);a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${F.length} 处:${c}——**节点 issue 未落库**(${b}):命中未被静默丢弃,但记账不完整`),console.error(`[agent-tools] 记录疑似注入节点 issue 失败(${c}):${b}`,d)}}let O=E.length>0?[...E,...N?[{role:"user",content:`该原始响应另有${N}个工具请求未执行,不能将它们当成取证结果。正文提交额度已经预留;依据实际已给的资料与已完成取证写作,真实缺口留作未决事项,不再猜属性或遍历全部资料。`}]:[]]:[];return{text:q??"",...void 0!==q?{committed:q}:{},toolCalls:C,toolMessages:O,toolResults:D}}}),n=k.filter(a=>!a.accepted).length;if(("unfixable"===m.kind||"no_content"===m.kind)&&"no-progress"===m.cause&&(0,cS.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:m.turn,toolCalls:m.toolCalls,reason:m.reason}),a.onOutcome?.(n?{...m,rejectedSubmissions:n}:m),"no_content"===m.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环未产出正文:${m.reason}`);return}if("budget_refused"===m.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环被预算挡回(${m.refused.kind}):${m.reason}`);return}"unfixable"===m.kind&&a.diagnostics&&(a.diagnostics.llm.lastInfo=`写手循环停止(${m.cause}),保留当前候选(残余 ${m.residual}):${m.reason}`);let o=function(a){if("unfixable"===a.kind&&!(a.residual<=0)&&"budget-refused"!==a.cause&&"tool-budget-exhausted"!==a.cause)return{issue:{level:"error",severity:"blocker",category:"structure",message:`块写作未收敛(残余 ${a.residual}):${a.reason}`},reason:`写手循环 ${a.turn} 轮后仍不达标(残余 ${a.residual}):${a.reason} —— 提交当前最好草稿,缺口由块账与导出门禁承载`}}(m);return o&&(a.diagnostics&&(a.diagnostics.llm.lastInfo=`${a.diagnostics.llm.lastInfo??""};本块残余 ${"unfixable"===m.kind?m.residual:0} 未收敛`),a.toolContext?.audit?.declareUnfixable(o)),m.content}let fT={structure:"结构完整性",table:"表格质量",fact_consistency:"数值/事实一致性",evidence_coverage:"证据覆盖",professional_chain:"专业链条",control_loop:"控制闭环",format:"格式规范",style:"文风与模板化",scope:"范围与商务边界"},fU={local_deterministic:"确定性修复器(已执行未收敛:核对该检测器与修复器口径是否同源)",llm_repairable:"LLM 定向修复(自动轮次已耗尽:按定位与建议人工修订,或补齐锚点证据后续修重试)",manual_review:"人工复核(自动修复链不消费该类缺陷)",not_repair_needed:"系统判定无需修复(若仍阻断:复核检测器是否误报)"};function fV(a,b,c){let d=a.map((a,c)=>({index:c+1,category:a.category?fT[a.category]:"其他",location:function(a,b){if(a.chapterId){let c=b?.find(b=>b.id===a.chapterId);if(c?.title)return a.sectionTitle?`${c.title} / ${a.sectionTitle}`:c.title}if(a.sectionTitle)return a.sectionTitle;let c=a.message.match(/^(\d{1,2}(?:\.\d{1,2}){1,3}[\s\u00a0]*[^\s::]{2,24})[^::]{0,24}[::]/u);return c?c[1].trim():"全文"}(a,b),problem:a.message,action:a.suggestion||"人工核对后修订正文;修订必须同步导出源(doc.json.markdown)并复核守恒,或基于检查点续修重试。",repairPath:a.repairability?fU[a.repairability]:"自动修复链已执行(残留待人工定位)",detectorId:a.provenance?.detectorId}));return{suspended:!0,generatedAt:Date.now(),total:d.length,repairChainSummary:"已保存逐项问题与依据;实际自动处理范围以本轮执行回执为准",items:d,...c&&c.length>0?{declarations:c.map(a=>({location:a.declaredAt,problem:a.issue.message,reason:a.reason,declaredAtMs:a.declaredAtMs}))}:{}}}function fW(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}let fX=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),fY=a=>"string"==typeof a?a.replace(/\r\n/gu,"\n").split("\n").map(a=>a.trim()).join("\n"):Array.isArray(a)?a.map(fY):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,b])=>[a,fY(b)])):a;function fZ(a,b){let c=a.match(/[≤≥±]?[A-Za-z0-9][A-Za-z0-9._%/+−-]*|[\s\S]/gu)??[],d=[],e="";for(let a of c)e&&Array.from(e+a).length>b&&(d.push(e),e=""),e+=a;return e&&d.push(e),d}var f$=c(50369);let f_=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;"),f0=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;");function f1(a){if(!/^[A-Za-z0-9_-]+$/u.test(a.documentId))throw Error("图件文档身份无效");let b=new Map;return{renderer:c=>{let d=(0,e.createHash)("sha256").update(JSON.stringify(c)).digest("hex"),f=function(a){if(a.layout)return function(a){let b=(0,f$.Q)(a.layout,a.nodes.map(a=>a.id),a.edges),c=fZ(a.caption,40),d=27*Math.max(0,c.length-2),e={x:35,y:95+d,width:930,height:590},f=[],g=a=>({x:e.x+a.x*e.width,y:e.y+a.y*e.height}),h=b.routes.map(b=>{let c=b.points.map(g),d=a.edges[b.edgeIndex].label,f=c.slice(1).map((a,b)=>Math.hypot(a.x-c[b].x,a.y-c[b].y)),h=f.reduce((a,b)=>a+b,0)/2,i=c[0];for(let a=0;a<f.length;a++){if(h<=f[a]&&f[a]>0){let b=h/f[a];i={x:c[a].x+(c[a+1].x-c[a].x)*b,y:c[a].y+(c[a+1].y-c[a].y)*b};break}h-=f[a]}let j=fZ(d??"",40),k=20*j.length;if(k>e.height)throw Error("空间路线完整标签无法在图中清晰显示,须调整图件布局");let l=Math.min(600,Math.max(0,...j.map(a=>15*Array.from(a).length))),m=Math.max(e.x+l/2,Math.min(e.x+e.width-l/2,i.x)),n=Math.max(e.y+k,Math.min(e.y+e.height-10,i.y-8));return`<g data-source-edge="${b.edgeIndex}" data-from="${f_(a.edges[b.edgeIndex].from)}" data-to="${f_(a.edges[b.edgeIndex].to)}"><polyline points="${c.map(a=>`${a.x},${a.y}`).join(" ")}" fill="none" stroke="#475569" stroke-width="2"/>${j.length?`<rect x="${m-l/2-3}" y="${n-k+3}" width="${l+6}" height="${k}" fill="white"/><text x="${m}" y="${n-k+20}" text-anchor="middle" font-size="15" fill="#334155">${j.map((a,b)=>`<tspan x="${m}" dy="${20*!!b}">${f_(a)}</tspan>`).join("")}</text>`:""}</g>`}),i=b.placements.map(b=>{let c=a.nodes.find(a=>a.id===b.nodeId),d=g(b),h=b.width*e.width,i=b.height*e.height,j=20,k=[];for(;j>=12;j--){let a=Math.max(1,Math.floor((h-16)/j));if((k=fZ(c.label,a)).length*(j+5)+12<=i&&k.every(a=>Array.from(a).length*j<=h-16))break}if(j<12){let b=a.nodes.findIndex(a=>a.id===c.id)+1,e=Array.from(c.label).reduce((a,b,c)=>{let d=Math.floor(c/48);return a[d]=(a[d]??"")+b,a},[]);return f.push({nodeId:c.id,number:b,lines:e}),`<g data-source-node="${f_(c.id)}"><title>${f_(c.label)}</title><rect x="${d.x}" y="${d.y}" width="${h}" height="${i}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/><text x="${d.x+h/2}" y="${d.y+i/2+4}" font-size="12" text-anchor="middle" fill="#0f172a" stroke="white" stroke-width="3" paint-order="stroke" data-legend-marker="${b}">${b}</text></g>`}return`<g data-source-node="${f_(c.id)}"><rect x="${d.x}" y="${d.y}" width="${h}" height="${i}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${k.map((a,b)=>`<text x="${d.x+h/2}" y="${d.y+(i-k.length*(j+5))/2+j+b*(j+5)}" font-size="${j}" text-anchor="middle">${f_(a)}</text>`).join("")}</g>`}),j=e.y+e.height+28,k=f.map(a=>{let b=a.lines.map((b,c)=>`<text x="35" y="${j+24*c}" font-size="16">${c?"":`${a.number}&#160;&#160;`}${f_(b)}</text>`).join("");return j+=24*a.lines.length+8,`<g data-label-legend-for="${f_(a.nodeId)}">${b}</g>`}).join(""),l=Math.max(760+d,j+62);return`<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="${l}" viewBox="0 0 1000 ${l}" role="img" aria-label="${f_(a.caption)}" data-coordinate-system="relative-schematic"><rect width="100%" height="100%" fill="white"/><g font-family="Noto Sans CJK SC,Microsoft YaHei,SimSun,sans-serif" fill="#0f172a">${c.map((a,b)=>`<text x="500" y="${32+27*b}" text-anchor="middle" font-size="22">${f_(a)}</text>`).join("")}<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}" fill="none" stroke="#94a3b8"/>${h.join("")}${i.join("")}${k}<text x="35" y="${l-35}" font-size="16">相对位置布置示意${f.length?";编号与设施名称图例对应":""}</text></g></svg>`}(a);if(!a.nodes.length||a.edges.some(b=>!a.nodes.some(a=>a.id===b.from)||!a.nodes.some(a=>a.id===b.to)))throw Error("图件必须具有真实节点,关系端点不能缺席");let b=a.nodes.map(a=>fZ(a.label,10)),c=Math.min(3,a.nodes.length),d=Math.max(66,...b.map(a=>24*a.length+24)),e=new Map(a.nodes.map((a,b)=>[a.id,Math.floor(b/c)])),f=new Map;for(let b of a.edges)e.get(b.from)<e.get(b.to)&&f.set(e.get(b.from),(f.get(e.get(b.from))??0)+1);let g=d+Math.max(105,22*Math.max(0,...f.values())+45),h=125+Math.ceil(a.nodes.length/c)*g,i=new Map(a.nodes.map((a,b)=>[a.id,{x:40+b%c*295,y:110+Math.floor(b/c)*g}])),j=new Map,k=0,l=[{x:450-19*Array.from(a.caption).length/2,y:10,width:19*Array.from(a.caption).length,height:32}],m=[],n=a.edges.map((a,b)=>{let c,e,f,g,h=i.get(a.from),n=i.get(a.to),o=h.x+115,p=h.y+d,q=n.x+115,r=n.y,s=!1;if(h.y===n.y&&n.x>h.x&&n.x-h.x<320){let a=h.y+d/2,b=h.y-20;c=`M${h.x+230},${a} H${h.x+230+14} V${b} H${n.x-14} V${a} H${n.x-9}`,e=`${n.x-2},${a} ${n.x-11},${a-5} ${n.x-11},${a+5}`,f=(h.x+230+n.x)/2,g=b-7}else if(h.y<n.y){let a=j.get(h.y)??0;j.set(h.y,a+1);let b=p+28+22*a;c=`M${o},${p} V${b} H${q} V${r-9}`,e=`${q},${r-2} ${q-5},${r-11} ${q+5},${r-11}`,f=(o+q)/2,g=b-8}else{let a=12-28*k++,d=Math.max(52,n.y-(24+b%3*12));c=`M${o},${h.y} V${h.y-20} H${a} V${d} H${q} V${r-9}`,e=`${q},${r-2} ${q-5},${r-11} ${q+5},${r-11}`,f=a-12,g=(h.y-20+d)/2,s=!0}let t=a.label?16*Array.from(a.label).length+12:0;a.label&&l.push(s?{x:f-18,y:g-t/2,width:24,height:t}:{x:f-t/2,y:g-18,width:t,height:24});let u=a.label?`<g ${s?`transform="rotate(-90 ${f} ${g})"`:""}><rect x="${f-t/2}" y="${g-18}" width="${t}" height="24" fill="white"/><text x="${f}" y="${g}" text-anchor="middle" font-size="16" fill="#334155">${f0(a.label)}</text></g>`:"";return m.push(u),`<g data-source-edge="${b}" data-from="${f0(a.from)}" data-to="${f0(a.to)}"><path d="${c}" fill="none" stroke="#475569" stroke-width="1.6"/><polygon points="${e}" fill="#475569"/></g>`}),o=a.nodes.map((a,c)=>{let{x:e,y:f}=i.get(a.id);return`<g data-source-node="${f0(a.id)}"><rect x="${e}" y="${f}" width="230" height="${d}" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${b[c].map((a,g)=>`<text x="${e+115}" y="${f+(d-24*b[c].length)/2+20+24*g}" font-size="20" text-anchor="middle">${f0(a)}</text>`).join("")}</g>`}),p=Math.floor(Math.min(0,...l.map(a=>a.x-10))),q=Math.ceil(Math.max(900,...l.map(a=>a.x+a.width+10))),r=Math.floor(Math.min(0,...l.map(a=>a.y-10))),s=Math.ceil(Math.max(h,...l.map(a=>a.y+a.height+10))),t=q-p,u=s-r;return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${u}" viewBox="0 0 ${t} ${u}" data-source-offset-y="${-r}" role="img"><title>${f0(a.caption)}</title><desc>${f0(JSON.stringify({nodes:a.nodes,edges:a.edges}))}</desc><rect width="100%" height="100%" fill="white"/><g transform="translate(${-p} ${-r})" font-family="Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif" fill="#0f172a"><text x="450" y="35" text-anchor="middle" font-size="19">${f0(a.caption)}</text>${n.join("")}${m.join("")}${o.join("")}</g></svg>`}(c),g=(0,e.createHash)("sha256").update(f).digest("hex");if((f.match(/data-source-node=/gu)??[]).length!==c.nodes.length||(f.match(/data-source-edge=/gu)??[]).length!==c.edges.length)throw Error("图件节点或关系渲染不守恒");let h=function(a,b=1200){let c=/^<svg\b[^>]*width="(\d+)"[^>]*height="(\d+)"[^>]*>([\s\S]*)<\/svg>$/u.exec(a);if(!c)throw Error("原生图件缺少完整画布尺寸");let d=Number(c[1]),e=Number(c[2]),f=c[3],g=Number(/data-source-offset-y="(\d+)"/u.exec(a)?.[1]??0);if(e<=b)return[a];let h=[...f.matchAll(/<rect\b[^>]*\bx="([\d.-]+)"[^>]*\by="([\d.-]+)"[^>]*\bwidth="([\d.]+)"[^>]*\bheight="([\d.]+)"/gu)].map(a=>({y:Number(a[2]),height:Number(a[4])})),i=[...h,...[...f.matchAll(/transform="rotate\(-90\s+[\d.-]+\s+([\d.-]+)\)"[^>]*><rect\b[^>]*width="([\d.]+)"/gu)].map(a=>({y:Number(a[1])-Number(a[2])/2,height:Number(a[2])})),...[...f.matchAll(/<polygon points="([^"]+)"/gu)].map(a=>{let b=a[1].split(/\s+/u).map(a=>Number(a.split(",")[1]));return{y:Math.min(...b),height:Math.max(...b)-Math.min(...b)}})].map(a=>({...a,y:a.y+g})),j=[...new Set([...f.matchAll(/data-source-node="[^"]+"><rect\b[^>]*\by="(\d+)"/gu)].map(a=>Number(a[1])+g).flatMap(a=>[a-55,a-45,a-10]))].filter(a=>a>50&&a<e&&!i.some(b=>a>b.y-3&&a<b.y+b.height+3)).sort((a,b)=>a-b),k=[0];for(;e-k[k.length-1]>b;){let c=k[k.length-1],d=j.filter(a=>a>c+100&&a<=c+b-50*!!c).at(-1);if(void 0===d)return[a];k.push(d)}return k.push(e),k.slice(0,-1).map((a,b)=>{let c=k[b+1]-a,e=50*!!b,g=/<title>([\s\S]*?)<\/title>/u.exec(f)?.[1]??"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${d}" height="${c+e}" viewBox="0 0 ${d} ${c+e}" data-source-range="${a}:${k[b+1]}"><rect width="100%" height="100%" fill="white"/><defs><clipPath id="panelClip"><rect x="0" y="${e}" width="${d}" height="${c}"/></clipPath></defs><g clip-path="url(#panelClip)"><g transform="translate(0 ${e-a})">${f}</g></g>${b?`<text x="${d/2}" y="32" text-anchor="middle" font-family="Noto Sans CJK SC, PingFang SC, sans-serif" font-size="19">${g}(续)</text>`:""}</svg>`})}(f),i=h.map((i,j)=>{let k=(0,e.createHash)("sha256").update(i).digest("hex"),l=`author-graph-${k}.svg`,m=af().join(a.generatedDir,"assets","figures",l);if(ad().mkdirSync(af().dirname(m),{recursive:!0}),ad().existsSync(m)){if(ad().readFileSync(m,"utf8")!==i)throw Error("既有图件资产与原结构化单元身份不一致")}else{let a=`${m}.${process.pid}.tmp`;ad().writeFileSync(a,i),ad().renameSync(a,m)}let n=/data-source-range="(\d+):(\d+)"/u.exec(i),o=Number(/data-source-offset-y="(\d+)"/u.exec(f)?.[1]??0),p=n?[...f.matchAll(/data-source-node="([^"]+)"><rect\b[^>]*\by="(\d+)"/gu)].filter(a=>Number(a[2])+o>=Number(n[1])&&Number(a[2])+o<Number(n[2])).map(a=>a[1]):c.nodes.map(a=>a.id);return b.set(`${d}:${j}`,{unitId:c.id,sourceHash:d,sourceSvgHash:g,svgHash:k,file:m,nodes:c.nodes.length,edges:c.edges.length,...h.length>1?{panels:h.length,panelIndex:j,visibleNodeIds:p}:{}}),`/api/documents/generated/${a.documentId}/figure/${l}?projectRoot=${encodeURIComponent(a.projectRoot)}`});return 1===i.length?i[0]:i},receipts:()=>[...b.values()]}}function f2(a){return Object.values(a.tasks).some(a=>a.current.output.units.some(a=>"figure"===a.kind))}let f3=["failed","paused","repairing","blocked","running","pending","completed"];function f4(a,b){return a.seq!==b.seq?a.seq-b.seq:a.id===b.id?0:a.id<b.id?-1:1}let f5=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"]),f6=new Set(["failed","paused","repairing","blocked","running","pending","completed"]);function f7(a){return"string"==typeof a&&f6.has(a)}let f8=["id","parentId","type","title","seq","status","startedAt","completedAt","progress","metrics","issues","payloadRef"];class f9 extends Error{constructor(a,b,c={},d){super(b,d),this.code=a,this.detail=c,this.name="NodeLogError"}}let ga=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function gb(a,b){var c;return ae.join((c=b,ae.join(c??j6(),"drafts")),`${gc(a)}.nodes.jsonl`)}function gc(a){if("string"!=typeof a||!ga.test(a))throw new f9("node-log-doc-id-invalid",`文档 id 不合法:「${String(a)}」(须为字母数字开头、仅含字母数字/._-、长度 ≤128)`);return a}function gd(a){var b;if(!a||"object"!=typeof a)throw new f9("node-log-node-invalid","节点必须是对象");let c=new Set(f8),d=Object.keys(a).filter(a=>!c.has(a));if(d.length>0)throw new f9("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 f9("node-log-node-invalid","节点 id 不得为空(id 是 rollup 视图的聚合键)");if(void 0!==a.parentId&&("string"!=typeof a.parentId||0===a.parentId.length))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 parentId 必须是非空字符串`);if(a.parentId===a.id)throw new f9("node-log-node-invalid",`节点 ${a.id} 的 parentId 指向自己(自环会让 children 派生进入死循环)`);if(!("string"==typeof(b=a.type)&&f5.has(b)))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 type「${String(a.type)}」不在 附录 D.1 的闭集内`);if(!f7(a.status))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 status「${String(a.status)}」不是合法状态`);if("string"!=typeof a.title)throw new f9("node-log-node-invalid",`节点 ${a.id} 缺 title(8.4 的"这个节点做了什么"要靠它)`);if(!Number.isFinite(a.seq))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 seq 必须是有限数(节流会 splice 掉数组位置,顺序只能靠它)`);if(!Number.isFinite(a.startedAt))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 startedAt 必须是有限数`);if(void 0!==a.completedAt&&!Number.isFinite(a.completedAt))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 completedAt 必须是有限数`)}function ge(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||0===a.id.length)throw new f9("node-log-node-invalid","status/rollup 事件必须带非空 id(补丁要打在谁身上)");if(void 0!==a.startedAt)throw new f9("node-log-node-invalid",`补丁不得改写 ${a.id} 的 startedAt(存在事实,不是状态)`);if(void 0!==a.status&&!f7(a.status))throw new f9("node-log-node-invalid",`补丁 ${a.id} 的 status「${String(a.status)}」不是合法状态`);let b=new Set([...f8,"id"]);b.delete("startedAt");let c=Object.keys(a).filter(a=>!b.has(a));if(c.length>0)throw new f9("node-log-node-invalid",`补丁 ${a.id} 含 8.2 之外的字段:${c.join("/")}`)}function gf(a,b){let c,d=gc(a.docId),e=gb(d,b),f=a.t??Date.now();if("upsert"===a.op){var g;gd(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 ge(a.node),c={v:1,t:f,op:a.op,node:{...a.node}};let h=`${JSON.stringify(c)}
31
+ ${d.shared}
32
+ 最终正文通过结构化任务产物提交;内容、事实和专业要求仍须完整遵守,格式标记与自评说明不写入信息单元。`,i=function(){let a=new Map,b=new WeakMap;return c=>c.map(c=>{let d;if("tool"!==c.role||!c.toolCallId)return c;let e=b.get(c);if(e)return e;let f=/^\[([^\]]+)\] ok[^\n]*\n/u.exec(c.content);if(!f)return c;try{d=JSON.parse(c.content.slice(f[0].length))}catch{return c}if(!d||"object"!=typeof d||Array.isArray(d))return c;let g={projectSnapshotId:d.projectSnapshotId??d.snapshotId,contractId:d.contractId},h={},i={...d};for(let b of fO){if(!Array.isArray(d[b]))continue;let e=[];for(let[f,i]of d[b].entries()){let d=fQ(i),j=fQ([g,i]),k=a.get(j);k?(h[b]??=[]).push({requestedIndex:f,...k}):(a.set(j,{toolCallId:c.toolCallId,field:b,index:e.length,sha256:d}),e.push(i))}i[b]=e}if(!Object.keys(h).length)return b.set(c,c),c;i.contextReferences=h,i.contextProjection="unique-records-with-exact-prior-tool-references",i.referenceMeaning="本次匹配结果由新增记录与contextReferences共同组成;引用指向本对话此前原字完整工具回执,不能将新增数组为空解释为查询无结果。";let j=JSON.stringify(i),k={...c,content:`[${f[1]}] ok \xb7 ${j.length} 字符
33
+ ${j}`};return b.set(c,k),k})}(),j=[],k=0,l=[],m=a.maxTokens,n=await (0,dl.Bj)({system:f,initialMessages:[{role:"user",content:`${a.prompt}
34
+
35
+ ${d.task}`}],initialEvidence:[...a.preloadedSourceRecords?.length?[{toolName:"query_project_facts",ok:!0,data:{snapshotId:a.toolContext.projectModel.snapshotId,candidates:a.preloadedSourceRecords}}]:[],...a.preloadedMemberIds?.length?[{toolName:"query_work_packages",ok:!0,data:(0,dq.H)(a.toolContext.projectModel,{query:"*",memberIds:[...a.preloadedMemberIds]})}]:[],...a.preloadedConstructionPlan?[{toolName:"query_construction_plan",ok:!0,data:a.preloadedConstructionPlan}]:[]],budget:(0,bk.Su)(a.diagnostics).budget,...a.onTurn?{onTurn:a.onTurn}:{},check:async a=>({issues:a.trim()?[]:[{detectorId:"block-structure-contract",level:"error",severity:"blocker",message:"结构化任务尚未提交"}],executed:["block-structure-contract"],degraded:[]}),runTurn:async({messages:d,toolCallLimit:g,turn:n})=>{var o,p;let q,r,s,t;a.signal?.throwIfAborted();let u=(0,bk.Iw)((0,bk.Su)(a.diagnostics)),v=[...fK("locate"),...fK("plan"),...fK("generate")],w=new Set(fN(a.toolContext)),x=[...new Map(v.map(a=>[a.name,a])).values()].filter(b=>w.has(b.name)&&(!a.toolContext?.allowedTools||a.toolContext.allowedTools.includes(b.name))).map(a=>{let b=structuredClone(a.inputSchema);return{name:a.name,description:a.description,parameters:b}}),y=i(d),z=!1,A=m,B=await (0,h._v)({system:f,messages:y,tools:x,requireToolCall:!0,taskKind:"composition",onRawResponse:d=>{if(t=d,s=void 0,z=!0,r=dh(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:n,response:d,request:{system:f,messages:y,tools:x,maxTokens:A,requireToolCall:!0}}),d.responseMetadata?.finishReason==="length"){(0,cS.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:n,toolCalls:d.toolCalls.length,reason:"作者工具输出被供应商截断;完整原响应已归档,暂停核查单任务协议与实际思考开销,不重写整任务或继续整包取证"},"model-output-truncated");let c=d.requestMetadata?.maxTokens,e=void 0!==A?Math.ceil(1.5*A):void 0!==c?Math.ceil(1.5*c):void 0,f=d.requestMetadata?.outputCap;s={kind:"incomplete-output",sentOutputBudget:c??null,nextOutputBudget:(m=void 0===e?void 0:void 0===f?e:Math.min(e,f))??null,finishReason:"length"}}else d.responseMetadata?.protocolFailure&&(s={kind:"invalid-tool-arguments"===d.responseMetadata.protocolFailure?"invalid-tool-arguments":"incomplete-stream",sentOutputBudget:null,nextOutputBudget:null,finishReason:d.responseMetadata.finishReason??null,detail:d.droppedToolCalls??null});d.responseMetadata?.completed===!1&&(d.toolCalls.some(a=>"submit_author_task"===a.name)||Array.isArray(d.rawToolCalls)&&d.rawToolCalls.some(a=>a?.name==="submit_author_task"||a?.function?.name==="submit_author_task"))&&bx(a.diagnostics,c.section.id,!1)},callKind:(o=a.diagnostics,p=c.section.id,o&&bq.get(o)?.model.taskAttempts[p])?"chapter-repair":"chapter-writing",stablePrefixChars:a.stablePrefixChars,maxTokens:A,signal:a.signal,diagnostics:a.diagnostics});if(a.signal?.throwIfAborted(),z||(r=dh(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:n,response:B})),!z&&B?.responseMetadata?.completed===!1&&B.toolCalls.some(a=>"submit_author_task"===a.name)&&bx(a.diagnostics,c.section.id,!1),!B){if(t?.responseMetadata?.protocolFailure==="invalid-tool-arguments"&&Array.isArray(t.rawToolCalls)){let a=t.rawToolCalls.map(a=>({id:a.id,name:a.name??a.function?.name,arguments:a.arguments??a.function?.arguments}));if(a.length&&a.every(a=>"string"==typeof a.id&&a.id&&"string"==typeof a.arguments&&x.some(b=>b.name===a.name))){let b=[{role:"assistant",content:t.content,...void 0===t.thinkingContent?{}:{thinkingContent:t.thinkingContent},toolCalls:a},...a.map(a=>({role:"tool",toolCallId:a.id,content:c9(c8(a.name,c1(`本次参数未执行:${JSON.stringify(t.droppedToolCalls??[])};只纠正语法结构,保留前述原字全部正文、表格和图数据`),Date.now()))}))];return{text:"",toolCalls:[],protocolRecovery:s,toolMessages:b}}}let b=(0,bk.Su)(a.diagnostics);if((0,bk.Iw)(b)>u||(0,bk.nY)(b)||(0,bk.Z9)(b)){let a=(0,bk.nY)(b)??(0,bk.Z9)(b);return{text:"",toolCalls:[],refused:{kind:a?.kind??"budget",message:a?.message??"预算耗尽:本次调用未发起"}}}return{text:"",toolCalls:[],...s?{protocolRecovery:s,toolMessages:[{role:"user",content:`上一工具响应未接纳。实际协议回执:${JSON.stringify(s)}。解析失败或未报告finish_reason不能证明输出额度不足,不凭空扩大预算;原始有意义文字完整保留。保留完整原任务和已取得证据,纠正实际工具参数语法与标注;已有服务端保留的可解析原稿使用correct_author_submission,不重新生成它的段落、表行或图数据;不得补造事实。`}]}:{}}}let C=[],D=[],E=[],F=[],G=async(b,d)=>{let f;if(B.responseMetadata?.completed!==!0)throw Error("作者响应未完整结束,不能提交为完整任务");if(void 0!==a.maxAuthorSubmissions&&k>=a.maxAuthorSubmissions)throw Error("本任务的定向内容修改次数已用完,不能再次改稿");try{f=(0,bl.Ix)(b,{contract:c.contract,taskId:c.section.id,projectModel:a.toolContext?.projectModel}),await a.beforeAuthorSubmit?.(f)}catch(b){throw bx(a.diagnostics,c.section.id,!1),b}let g=function(a,b,c,d,e={}){let f=bq.get(a);if(!f)throw Error("当前运行没有文档模型写入器");let g={...f,model:bs(f.model),onChange:void 0};try{let a=bw(g,b,c,d??(f.model.authorPassSealed?"续跑补足原合同未产出任务":void 0),!!(e.preserveFirstDraft&&!f.model.tasks[b]&&!f.model.authorPassSealed));return f.onChange?.(bs(g.model)),f.model=g.model,a}catch(a){throw bv(f.model,b,!1),f.onChange?.(bs(f.model)),a}}(a.diagnostics,c.section.id,f,f&&"object"==typeof f&&"string"==typeof f.revisionReason?f.revisionReason:void 0,{preserveFirstDraft:!a.beforeAuthorSubmit});for(let b of(k+=1,!function(a,b,c,d){let f=a&&dg.get(a);if(!f)return;if(b.output.contractId!==f.contractId||b.output.projectSnapshotId!==f.projectSnapshotId||!f.expectedTaskIds.includes(b.output.taskId))throw Error("结构化候选的归档身份不属于当前运行");let g=f.candidates.filter(a=>a.taskId===b.output.taskId).length,h=(0,am.tv)(f.generatedDir,`author-candidate-${(0,e.randomUUID)()}.json`,{version:1,runId:f.runId,contractId:f.contractId,taskId:b.output.taskId,ordinal:g,rawCallId:c??null,protocolComplete:!0,qualityMeasured:!1,candidate:b,...d?{protocolCorrection:d}:{}},f.runId);f.candidates.push({taskId:b.output.taskId,ordinal:g,rawCallId:c??null,...h,contentHash:b.contentHash,hasContent:b.output.units.length>0})}(a.diagnostics,g,r,d),q=g.markdown,g.output.decisionRequests))await a.toolContext.audit?.requestClarification({question:b.question,blocking:!0});return{taskId:g.output.taskId,contentHash:g.contentHash,pendingCriterionIds:g.pendingCriterionIds}},H={...a.toolContext,stage:"generate",allowedTools:x.map(a=>a.name),authorTask:{criterionIds:(0,cT.C)(c.contract,c.section.id).map(a=>a.id),submit:async a=>{let b=l.length,c={output:structuredClone(a),accepted:!1,rawCallId:r??null};l.push(c);try{let b=await G(a);c.accepted=!0;let d=(0,bl.t3)(a);return d.length?{...b,shapeRepairs:d}:b}catch(d){let a=d instanceof Error?d.message:String(d),c=/包含协议外字段/u.test(a)?";可用 correct_author_submission 的 remove-unknown-field 操作删除该键(错误信息已给出路径),或去掉该键后重新提交":/须保留非空实际原文/u.test(a)?";可用 drop-empty-fragment 删除仅含空text的片段,或修正后重新提交":/已退役|units 旧形态|format 无效/u.test(a)?";请按 compact-v7 载体形(paragraphs/tables/figures/decisionRequests)重新提交":/守恒/u.test(a)?";单元顺序与全部载体须保持完整,不丢弃也不补造":"";throw Error(`${a};原稿已完整保留,submissionIndex=${b}。标注纠正用correct_author_submission,不重写段落、表行或图数据;来源资格仍须独立核验。${c}`,{cause:d})}},correct:async(a,b)=>{if(!Number.isSafeInteger(a)||a<0)throw Error("原稿序号无效");let c=l[a];if(!c||c.accepted)throw Error("只能纠正本任务当前实际未接收原稿");let d=(0,df.QN)(c.output,b);c.output=d;let e=await G(d,{submissionIndex:a,originalRawCallId:c.rawCallId,changes:b});return c.accepted=!0,e}}},I=void 0!==g?Math.max(0,g):B.toolCalls.length,J=a=>"submit_author_task"===a||"correct_author_submission"===a,K=B.toolCalls.find(a=>J(a.name)),L=new Set([...B.toolCalls.filter(a=>!J(a.name)).slice(0,Math.max(0,I-(K||void 0!==g&&x.some(a=>"submit_author_task"===a.name)?1:0))),...K&&I>0?[K]:[]]),M=B.toolCalls.filter(a=>L.has(a)),N=B.toolCalls.length-M.length;for(let b of(N>0&&(console.warn(`[agent-tools] 单轮工具调用超块级预算,已截断 ${N} 次(限额 ${g})`),a.onToolIssue?.([{level:"warning",category:"structure",owner:"system",message:`本轮工具调用超出块级上限,已执行前 ${M.length} 次、截断 ${N} 次——请合并查询或减少工具调用`,suggestion:"下一轮只调真正需要的工具;剩余额度见块预算"}])),M)){let c,d;a.signal?.throwIfAborted();let e=Date.now();try{c=(0,cU.parseJsonWithoutDuplicateKeys)(b.arguments||"{}")}catch(a){d=a instanceof Error?a.message:String(a)}let f=d?c8(b.name,c1(d),e):await fL(b.name,c,H);if(a.signal?.throwIfAborted(),D.push(f.ok?{toolName:b.name,ok:!0,data:f.data}:{toolName:b.name,ok:!1,error:{code:f.error.code}}),f.ok){let a=function(a,b){let c=b??{},d=(...a)=>{for(let b of a){let a=c[b];if("string"==typeof a&&a.trim())return a.trim()}};return"search_evidence"===a||"discover_files"===a?d("query"):"read_source"===a||"query_source_units"===a?d("filePath","path"):void 0}(b.name,c);a&&H.audit?.recordEvidenceCall&&H.audit.recordEvidenceCall({tool:b.name,term:a})}0===E.length&&E.push({role:"assistant",content:B.content??"",toolCalls:M.map(a=>({id:a.id,name:a.name,arguments:a.arguments})),...void 0!==B.thinkingContent?{thinkingContent:B.thinkingContent}:{}}),E.push({role:"tool",content:c9(f),toolCallId:b.id});let g=f.ok?f.injection:void 0;g?.suspicious&&F.push({tool:b.name,patterns:g.patterns}),C.push({toolName:b.name,ok:f.ok,durMs:Date.now()-e,summary:f.ok?`ok ${f.bytes??0}B${g?.suspicious?" \xb7 疑似注入(按数据对待)":""}`:`${f.error.code}`})}if(j.push(...C),F.length>0){let c=F.map(a=>`${a.tool}(${a.patterns.join("、")})`).join(";");a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${F.length} 处:${c}——已按数据对待并记节点 issue`);try{a.onToolIssue?a.onToolIssue(F.map(a=>(function(a){let b=[...a.patterns].sort().join("、")||"未标注模式";return{level:"warning",severity:"warning",category:"scope",owner:"system",repairability:"manual_review",message:`工具「${a.tool}」返回的资料内容命中疑似注入形态(${b})——该内容已按数据对待(模型侧带「${c5}」前缀),本节正文不得因它改变写作口径`,suggestion:"人工复核该资料:若确为提示注入,请把该文件移出资料范围后重跑本节;正文中据其写出的事实须另行核实来源。",...a.nodeId?{sectionTitle:a.nodeId}:{},provenance:{detectorId:"suspicious-injection",fingerprint:(0,an.c6)(`${a.tool}\u0000${b}\u0000${a.nodeId??""}`)}}})({...a,nodeId:b}))):console.warn(`[agent-tools] 工具结果命中疑似注入(${c})但本次未提供节点问题汇(onToolIssue)——命中未被静默丢弃,见 llm.lastInfo`)}catch(d){let b=d instanceof Error?d.message:String(d);a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${F.length} 处:${c}——**节点 issue 未落库**(${b}):命中未被静默丢弃,但记账不完整`),console.error(`[agent-tools] 记录疑似注入节点 issue 失败(${c}):${b}`,d)}}let O=E.length>0?[...E,...N?[{role:"user",content:`该原始响应另有${N}个工具请求未执行,不能将它们当成取证结果。正文提交额度已经预留;依据实际已给的资料与已完成取证写作,真实缺口留作未决事项,不再猜属性或遍历全部资料。`}]:[]]:[];return{text:q??"",...void 0!==q?{committed:q}:{},toolCalls:C,toolMessages:O,toolResults:D}}}),o=l.filter(a=>!a.accepted).length;if(("unfixable"===n.kind||"no_content"===n.kind)&&"no-progress"===n.cause&&(0,cS.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:n.turn,toolCalls:n.toolCalls,reason:n.reason}),a.onOutcome?.(o?{...n,rejectedSubmissions:o}:n),"no_content"===n.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环未产出正文:${n.reason}`);return}if("budget_refused"===n.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环被预算挡回(${n.refused.kind}):${n.reason}`);return}"unfixable"===n.kind&&a.diagnostics&&(a.diagnostics.llm.lastInfo=`写手循环停止(${n.cause}),保留当前候选(残余 ${n.residual}):${n.reason}`);let p=function(a){if("unfixable"===a.kind&&!(a.residual<=0)&&"budget-refused"!==a.cause&&"tool-budget-exhausted"!==a.cause)return{issue:{level:"error",severity:"blocker",category:"structure",message:`块写作未收敛(残余 ${a.residual}):${a.reason}`},reason:`写手循环 ${a.turn} 轮后仍不达标(残余 ${a.residual}):${a.reason} —— 提交当前最好草稿,缺口由块账与导出门禁承载`}}(n);return p&&(a.diagnostics&&(a.diagnostics.llm.lastInfo=`${a.diagnostics.llm.lastInfo??""};本块残余 ${"unfixable"===n.kind?n.residual:0} 未收敛`),a.toolContext?.audit?.declareUnfixable(p)),n.content}let fT={structure:"结构完整性",table:"表格质量",fact_consistency:"数值/事实一致性",evidence_coverage:"证据覆盖",professional_chain:"专业链条",control_loop:"控制闭环",format:"格式规范",style:"文风与模板化",scope:"范围与商务边界"},fU={local_deterministic:"确定性修复器(已执行未收敛:核对该检测器与修复器口径是否同源)",llm_repairable:"LLM 定向修复(自动轮次已耗尽:按定位与建议人工修订,或补齐锚点证据后续修重试)",manual_review:"人工复核(自动修复链不消费该类缺陷)",not_repair_needed:"系统判定无需修复(若仍阻断:复核检测器是否误报)"};function fV(a,b,c){let d=a.map((a,c)=>({index:c+1,category:a.category?fT[a.category]:"其他",location:function(a,b){if(a.chapterId){let c=b?.find(b=>b.id===a.chapterId);if(c?.title)return a.sectionTitle?`${c.title} / ${a.sectionTitle}`:c.title}if(a.sectionTitle)return a.sectionTitle;let c=a.message.match(/^(\d{1,2}(?:\.\d{1,2}){1,3}[\s\u00a0]*[^\s::]{2,24})[^::]{0,24}[::]/u);return c?c[1].trim():"全文"}(a,b),problem:a.message,action:a.suggestion||"人工核对后修订正文;修订必须同步导出源(doc.json.markdown)并复核守恒,或基于检查点续修重试。",repairPath:a.repairability?fU[a.repairability]:"自动修复链已执行(残留待人工定位)",detectorId:a.provenance?.detectorId}));return{suspended:!0,generatedAt:Date.now(),total:d.length,repairChainSummary:"已保存逐项问题与依据;实际自动处理范围以本轮执行回执为准",items:d,...c&&c.length>0?{declarations:c.map(a=>({location:a.declaredAt,problem:a.issue.message,reason:a.reason,declaredAtMs:a.declaredAtMs}))}:{}}}function fW(a,b=80){let c=a.replace(/\s+/gu," ").trim();return c.length>b?`${c.slice(0,b)}…`:c}let fX=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),fY=a=>"string"==typeof a?a.replace(/\r\n/gu,"\n").split("\n").map(a=>a.trim()).join("\n"):Array.isArray(a)?a.map(fY):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,b])=>[a,fY(b)])):a;function fZ(a,b){let c=a.match(/[≤≥±]?[A-Za-z0-9][A-Za-z0-9._%/+−-]*|[\s\S]/gu)??[],d=[],e="";for(let a of c)e&&Array.from(e+a).length>b&&(d.push(e),e=""),e+=a;return e&&d.push(e),d}var f$=c(50369);let f_=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;"),f0=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;");function f1(a){if(!/^[A-Za-z0-9_-]+$/u.test(a.documentId))throw Error("图件文档身份无效");let b=new Map;return{renderer:c=>{let d=(0,e.createHash)("sha256").update(JSON.stringify(c)).digest("hex"),f=function(a){if(a.layout)return function(a){let b=(0,f$.Q)(a.layout,a.nodes.map(a=>a.id),a.edges),c=fZ(a.caption,40),d=27*Math.max(0,c.length-2),e={x:35,y:95+d,width:930,height:590},f=[],g=a=>({x:e.x+a.x*e.width,y:e.y+a.y*e.height}),h=b.routes.map(b=>{let c=b.points.map(g),d=a.edges[b.edgeIndex].label,f=c.slice(1).map((a,b)=>Math.hypot(a.x-c[b].x,a.y-c[b].y)),h=f.reduce((a,b)=>a+b,0)/2,i=c[0];for(let a=0;a<f.length;a++){if(h<=f[a]&&f[a]>0){let b=h/f[a];i={x:c[a].x+(c[a+1].x-c[a].x)*b,y:c[a].y+(c[a+1].y-c[a].y)*b};break}h-=f[a]}let j=fZ(d??"",40),k=20*j.length;if(k>e.height)throw Error("空间路线完整标签无法在图中清晰显示,须调整图件布局");let l=Math.min(600,Math.max(0,...j.map(a=>15*Array.from(a).length))),m=Math.max(e.x+l/2,Math.min(e.x+e.width-l/2,i.x)),n=Math.max(e.y+k,Math.min(e.y+e.height-10,i.y-8));return`<g data-source-edge="${b.edgeIndex}" data-from="${f_(a.edges[b.edgeIndex].from)}" data-to="${f_(a.edges[b.edgeIndex].to)}"><polyline points="${c.map(a=>`${a.x},${a.y}`).join(" ")}" fill="none" stroke="#475569" stroke-width="2"/>${j.length?`<rect x="${m-l/2-3}" y="${n-k+3}" width="${l+6}" height="${k}" fill="white"/><text x="${m}" y="${n-k+20}" text-anchor="middle" font-size="15" fill="#334155">${j.map((a,b)=>`<tspan x="${m}" dy="${20*!!b}">${f_(a)}</tspan>`).join("")}</text>`:""}</g>`}),i=b.placements.map(b=>{let c=a.nodes.find(a=>a.id===b.nodeId),d=g(b),h=b.width*e.width,i=b.height*e.height,j=20,k=[];for(;j>=12;j--){let a=Math.max(1,Math.floor((h-16)/j));if((k=fZ(c.label,a)).length*(j+5)+12<=i&&k.every(a=>Array.from(a).length*j<=h-16))break}if(j<12){let b=a.nodes.findIndex(a=>a.id===c.id)+1,e=Array.from(c.label).reduce((a,b,c)=>{let d=Math.floor(c/48);return a[d]=(a[d]??"")+b,a},[]);return f.push({nodeId:c.id,number:b,lines:e}),`<g data-source-node="${f_(c.id)}"><title>${f_(c.label)}</title><rect x="${d.x}" y="${d.y}" width="${h}" height="${i}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/><text x="${d.x+h/2}" y="${d.y+i/2+4}" font-size="12" text-anchor="middle" fill="#0f172a" stroke="white" stroke-width="3" paint-order="stroke" data-legend-marker="${b}">${b}</text></g>`}return`<g data-source-node="${f_(c.id)}"><rect x="${d.x}" y="${d.y}" width="${h}" height="${i}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${k.map((a,b)=>`<text x="${d.x+h/2}" y="${d.y+(i-k.length*(j+5))/2+j+b*(j+5)}" font-size="${j}" text-anchor="middle">${f_(a)}</text>`).join("")}</g>`}),j=e.y+e.height+28,k=f.map(a=>{let b=a.lines.map((b,c)=>`<text x="35" y="${j+24*c}" font-size="16">${c?"":`${a.number}&#160;&#160;`}${f_(b)}</text>`).join("");return j+=24*a.lines.length+8,`<g data-label-legend-for="${f_(a.nodeId)}">${b}</g>`}).join(""),l=Math.max(760+d,j+62);return`<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="${l}" viewBox="0 0 1000 ${l}" role="img" aria-label="${f_(a.caption)}" data-coordinate-system="relative-schematic"><rect width="100%" height="100%" fill="white"/><g font-family="Noto Sans CJK SC,Microsoft YaHei,SimSun,sans-serif" fill="#0f172a">${c.map((a,b)=>`<text x="500" y="${32+27*b}" text-anchor="middle" font-size="22">${f_(a)}</text>`).join("")}<rect x="${e.x}" y="${e.y}" width="${e.width}" height="${e.height}" fill="none" stroke="#94a3b8"/>${h.join("")}${i.join("")}${k}<text x="35" y="${l-35}" font-size="16">相对位置布置示意${f.length?";编号与设施名称图例对应":""}</text></g></svg>`}(a);if(!a.nodes.length||a.edges.some(b=>!a.nodes.some(a=>a.id===b.from)||!a.nodes.some(a=>a.id===b.to)))throw Error("图件必须具有真实节点,关系端点不能缺席");let b=a.nodes.map(a=>fZ(a.label,10)),c=Math.min(3,a.nodes.length),d=Math.max(66,...b.map(a=>24*a.length+24)),e=new Map(a.nodes.map((a,b)=>[a.id,Math.floor(b/c)])),f=new Map;for(let b of a.edges)e.get(b.from)<e.get(b.to)&&f.set(e.get(b.from),(f.get(e.get(b.from))??0)+1);let g=d+Math.max(105,22*Math.max(0,...f.values())+45),h=125+Math.ceil(a.nodes.length/c)*g,i=new Map(a.nodes.map((a,b)=>[a.id,{x:40+b%c*295,y:110+Math.floor(b/c)*g}])),j=new Map,k=0,l=[{x:450-19*Array.from(a.caption).length/2,y:10,width:19*Array.from(a.caption).length,height:32}],m=[],n=a.edges.map((a,b)=>{let c,e,f,g,h=i.get(a.from),n=i.get(a.to),o=h.x+115,p=h.y+d,q=n.x+115,r=n.y,s=!1;if(h.y===n.y&&n.x>h.x&&n.x-h.x<320){let a=h.y+d/2,b=h.y-20;c=`M${h.x+230},${a} H${h.x+230+14} V${b} H${n.x-14} V${a} H${n.x-9}`,e=`${n.x-2},${a} ${n.x-11},${a-5} ${n.x-11},${a+5}`,f=(h.x+230+n.x)/2,g=b-7}else if(h.y<n.y){let a=j.get(h.y)??0;j.set(h.y,a+1);let b=p+28+22*a;c=`M${o},${p} V${b} H${q} V${r-9}`,e=`${q},${r-2} ${q-5},${r-11} ${q+5},${r-11}`,f=(o+q)/2,g=b-8}else{let a=12-28*k++,d=Math.max(52,n.y-(24+b%3*12));c=`M${o},${h.y} V${h.y-20} H${a} V${d} H${q} V${r-9}`,e=`${q},${r-2} ${q-5},${r-11} ${q+5},${r-11}`,f=a-12,g=(h.y-20+d)/2,s=!0}let t=a.label?16*Array.from(a.label).length+12:0;a.label&&l.push(s?{x:f-18,y:g-t/2,width:24,height:t}:{x:f-t/2,y:g-18,width:t,height:24});let u=a.label?`<g ${s?`transform="rotate(-90 ${f} ${g})"`:""}><rect x="${f-t/2}" y="${g-18}" width="${t}" height="24" fill="white"/><text x="${f}" y="${g}" text-anchor="middle" font-size="16" fill="#334155">${f0(a.label)}</text></g>`:"";return m.push(u),`<g data-source-edge="${b}" data-from="${f0(a.from)}" data-to="${f0(a.to)}"><path d="${c}" fill="none" stroke="#475569" stroke-width="1.6"/><polygon points="${e}" fill="#475569"/></g>`}),o=a.nodes.map((a,c)=>{let{x:e,y:f}=i.get(a.id);return`<g data-source-node="${f0(a.id)}"><rect x="${e}" y="${f}" width="230" height="${d}" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${b[c].map((a,g)=>`<text x="${e+115}" y="${f+(d-24*b[c].length)/2+20+24*g}" font-size="20" text-anchor="middle">${f0(a)}</text>`).join("")}</g>`}),p=Math.floor(Math.min(0,...l.map(a=>a.x-10))),q=Math.ceil(Math.max(900,...l.map(a=>a.x+a.width+10))),r=Math.floor(Math.min(0,...l.map(a=>a.y-10))),s=Math.ceil(Math.max(h,...l.map(a=>a.y+a.height+10))),t=q-p,u=s-r;return`<svg xmlns="http://www.w3.org/2000/svg" width="${t}" height="${u}" viewBox="0 0 ${t} ${u}" data-source-offset-y="${-r}" role="img"><title>${f0(a.caption)}</title><desc>${f0(JSON.stringify({nodes:a.nodes,edges:a.edges}))}</desc><rect width="100%" height="100%" fill="white"/><g transform="translate(${-p} ${-r})" font-family="Noto Sans CJK SC, PingFang SC, Microsoft YaHei, sans-serif" fill="#0f172a"><text x="450" y="35" text-anchor="middle" font-size="19">${f0(a.caption)}</text>${n.join("")}${m.join("")}${o.join("")}</g></svg>`}(c),g=(0,e.createHash)("sha256").update(f).digest("hex");if((f.match(/data-source-node=/gu)??[]).length!==c.nodes.length||(f.match(/data-source-edge=/gu)??[]).length!==c.edges.length)throw Error("图件节点或关系渲染不守恒");let h=function(a,b=1200){let c=/^<svg\b[^>]*width="(\d+)"[^>]*height="(\d+)"[^>]*>([\s\S]*)<\/svg>$/u.exec(a);if(!c)throw Error("原生图件缺少完整画布尺寸");let d=Number(c[1]),e=Number(c[2]),f=c[3],g=Number(/data-source-offset-y="(\d+)"/u.exec(a)?.[1]??0);if(e<=b)return[a];let h=[...f.matchAll(/<rect\b[^>]*\bx="([\d.-]+)"[^>]*\by="([\d.-]+)"[^>]*\bwidth="([\d.]+)"[^>]*\bheight="([\d.]+)"/gu)].map(a=>({y:Number(a[2]),height:Number(a[4])})),i=[...h,...[...f.matchAll(/transform="rotate\(-90\s+[\d.-]+\s+([\d.-]+)\)"[^>]*><rect\b[^>]*width="([\d.]+)"/gu)].map(a=>({y:Number(a[1])-Number(a[2])/2,height:Number(a[2])})),...[...f.matchAll(/<polygon points="([^"]+)"/gu)].map(a=>{let b=a[1].split(/\s+/u).map(a=>Number(a.split(",")[1]));return{y:Math.min(...b),height:Math.max(...b)-Math.min(...b)}})].map(a=>({...a,y:a.y+g})),j=[...new Set([...f.matchAll(/data-source-node="[^"]+"><rect\b[^>]*\by="(\d+)"/gu)].map(a=>Number(a[1])+g).flatMap(a=>[a-55,a-45,a-10]))].filter(a=>a>50&&a<e&&!i.some(b=>a>b.y-3&&a<b.y+b.height+3)).sort((a,b)=>a-b),k=[0];for(;e-k[k.length-1]>b;){let c=k[k.length-1],d=j.filter(a=>a>c+100&&a<=c+b-50*!!c).at(-1);if(void 0===d)return[a];k.push(d)}return k.push(e),k.slice(0,-1).map((a,b)=>{let c=k[b+1]-a,e=50*!!b,g=/<title>([\s\S]*?)<\/title>/u.exec(f)?.[1]??"";return`<svg xmlns="http://www.w3.org/2000/svg" width="${d}" height="${c+e}" viewBox="0 0 ${d} ${c+e}" data-source-range="${a}:${k[b+1]}"><rect width="100%" height="100%" fill="white"/><defs><clipPath id="panelClip"><rect x="0" y="${e}" width="${d}" height="${c}"/></clipPath></defs><g clip-path="url(#panelClip)"><g transform="translate(0 ${e-a})">${f}</g></g>${b?`<text x="${d/2}" y="32" text-anchor="middle" font-family="Noto Sans CJK SC, PingFang SC, sans-serif" font-size="19">${g}(续)</text>`:""}</svg>`})}(f),i=h.map((i,j)=>{let k=(0,e.createHash)("sha256").update(i).digest("hex"),l=`author-graph-${k}.svg`,m=af().join(a.generatedDir,"assets","figures",l);if(ad().mkdirSync(af().dirname(m),{recursive:!0}),ad().existsSync(m)){if(ad().readFileSync(m,"utf8")!==i)throw Error("既有图件资产与原结构化单元身份不一致")}else{let a=`${m}.${process.pid}.tmp`;ad().writeFileSync(a,i),ad().renameSync(a,m)}let n=/data-source-range="(\d+):(\d+)"/u.exec(i),o=Number(/data-source-offset-y="(\d+)"/u.exec(f)?.[1]??0),p=n?[...f.matchAll(/data-source-node="([^"]+)"><rect\b[^>]*\by="(\d+)"/gu)].filter(a=>Number(a[2])+o>=Number(n[1])&&Number(a[2])+o<Number(n[2])).map(a=>a[1]):c.nodes.map(a=>a.id);return b.set(`${d}:${j}`,{unitId:c.id,sourceHash:d,sourceSvgHash:g,svgHash:k,file:m,nodes:c.nodes.length,edges:c.edges.length,...h.length>1?{panels:h.length,panelIndex:j,visibleNodeIds:p}:{}}),`/api/documents/generated/${a.documentId}/figure/${l}?projectRoot=${encodeURIComponent(a.projectRoot)}`});return 1===i.length?i[0]:i},receipts:()=>[...b.values()]}}function f2(a){return Object.values(a.tasks).some(a=>a.current.output.units.some(a=>"figure"===a.kind))}let f3=["failed","paused","repairing","blocked","running","pending","completed"];function f4(a,b){return a.seq!==b.seq?a.seq-b.seq:a.id===b.id?0:a.id<b.id?-1:1}let f5=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"]),f6=new Set(["failed","paused","repairing","blocked","running","pending","completed"]);function f7(a){return"string"==typeof a&&f6.has(a)}let f8=["id","parentId","type","title","seq","status","startedAt","completedAt","progress","metrics","issues","payloadRef"];class f9 extends Error{constructor(a,b,c={},d){super(b,d),this.code=a,this.detail=c,this.name="NodeLogError"}}let ga=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function gb(a,b){var c;return ae.join((c=b,ae.join(c??j6(),"drafts")),`${gc(a)}.nodes.jsonl`)}function gc(a){if("string"!=typeof a||!ga.test(a))throw new f9("node-log-doc-id-invalid",`文档 id 不合法:「${String(a)}」(须为字母数字开头、仅含字母数字/._-、长度 ≤128)`);return a}function gd(a){var b;if(!a||"object"!=typeof a)throw new f9("node-log-node-invalid","节点必须是对象");let c=new Set(f8),d=Object.keys(a).filter(a=>!c.has(a));if(d.length>0)throw new f9("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 f9("node-log-node-invalid","节点 id 不得为空(id 是 rollup 视图的聚合键)");if(void 0!==a.parentId&&("string"!=typeof a.parentId||0===a.parentId.length))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 parentId 必须是非空字符串`);if(a.parentId===a.id)throw new f9("node-log-node-invalid",`节点 ${a.id} 的 parentId 指向自己(自环会让 children 派生进入死循环)`);if(!("string"==typeof(b=a.type)&&f5.has(b)))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 type「${String(a.type)}」不在 附录 D.1 的闭集内`);if(!f7(a.status))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 status「${String(a.status)}」不是合法状态`);if("string"!=typeof a.title)throw new f9("node-log-node-invalid",`节点 ${a.id} 缺 title(8.4 的"这个节点做了什么"要靠它)`);if(!Number.isFinite(a.seq))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 seq 必须是有限数(节流会 splice 掉数组位置,顺序只能靠它)`);if(!Number.isFinite(a.startedAt))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 startedAt 必须是有限数`);if(void 0!==a.completedAt&&!Number.isFinite(a.completedAt))throw new f9("node-log-node-invalid",`节点 ${a.id} 的 completedAt 必须是有限数`)}function ge(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||0===a.id.length)throw new f9("node-log-node-invalid","status/rollup 事件必须带非空 id(补丁要打在谁身上)");if(void 0!==a.startedAt)throw new f9("node-log-node-invalid",`补丁不得改写 ${a.id} 的 startedAt(存在事实,不是状态)`);if(void 0!==a.status&&!f7(a.status))throw new f9("node-log-node-invalid",`补丁 ${a.id} 的 status「${String(a.status)}」不是合法状态`);let b=new Set([...f8,"id"]);b.delete("startedAt");let c=Object.keys(a).filter(a=>!b.has(a));if(c.length>0)throw new f9("node-log-node-invalid",`补丁 ${a.id} 含 8.2 之外的字段:${c.join("/")}`)}function gf(a,b){let c,d=gc(a.docId),e=gb(d,b),f=a.t??Date.now();if("upsert"===a.op){var g;gd(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 ge(a.node),c={v:1,t:f,op:a.op,node:{...a.node}};let h=`${JSON.stringify(c)}
34
36
  `;try{ac.mkdirSync(ae.dirname(e),{recursive:!0}),ac.appendFileSync(e,h,"utf8")}catch(a){throw new f9("node-log-write-failed",`节点日志写入失败(S3.2:节点日志是唯一真相源,不可静默丢 ⇒ 停止生成并上报):${e}:${a instanceof Error?a.message:String(a)}`,{docId:d,file:e},{cause:a})}return c}function gg(a,b,c={}){return gf({docId:a,op:"upsert",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function gh(a,b,c={}){return gf({docId:a,op:"status",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function gi(a,b){return function(a,b){let c,d=gc(a),e=gb(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 f9("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 f9("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 gd(a.node),{v:1,t:a.t,op:"upsert",node:a.node};return ge(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 f9("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(f4)}(k,d,e),records:k,lineCount:j.length,tornTail:g}}(a,b).nodes}let gj={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 gk(a,b,c="completed",d){let e=gj[b];gz(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:gl(b),type:e.type,title:e.title,status:c,..."string"==typeof d&&d.length>0?{metrics:gy(d)}:{}})}function gl(a){return`phase:${a}`}function gm(a){return`chapter:${a}`}let gn={running:"running",success:"completed",failed:"failed",partial:"repairing",skipped:"blocked"};function go(a,b={}){let c;try{c=gi(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=>!gp.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;gh(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=>!gp.has(m(a))))continue;let i=function(a){let b,c=1/0;for(let d of a){let a=function(a){let b=f3.indexOf(a);return b>=0?b:0}(d);a<c&&(c=a,b=d)}return b}(d.map(a=>m(a)))??"completed";gh(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 gp=new Set(["completed","failed","blocked","paused"]),gq={"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 gr(a){let b=a.replace(/[^A-Za-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"");return b.length>0?b.slice(0,48):"none"}function gs(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 gt(a){return"chapter_generation"===a.type||/^agent-chapter-task-/u.test(a.roleId||"")}let gu=globalThis,gv=gu.__customizeAgentNodeLedgers??=new Map;function gw(a,b){let c=gb(a,b),d=gv.get(c);if(d&&(0,ac.existsSync)(c))return d;let e=gi(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 gv.set(c,h),h}function gx(a){return"string"==typeof a.title&&a.title.length>0?a.title:String(a.type)}function gy(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 gz(a,b){let c=function(a){let b=gq[a];if(!b)throw new f9("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?gw(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?gx(d):void 0):void 0)??(d?gx(d):void 0)??String(j),l=void 0!==i&&i>1&&!k.includes(`第 ${i} 轮`)?`${k} \xb7 第 ${i} 轮`:k,m=b.status??(d?gn[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:bG}))}(d),q={...gy(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.${gr(d.type)}.${gr(d.roleId||"none")}.${gs(gt(d)?[d.type,d.roleId||"",d.promptId||"",d.subtitle||"",d.order??""].join("::"):[d.type,d.roleId||"",d.promptId||""].join("::"))}`:`${gr(j)}.${gs(`${b.parentId??gl(c.phase)}::${l}`)}`),s=b.chapterId??(d&&gt(d)?function(a){let b=/^agent-chapter-task-(.+)$/u.exec(a.roleId||"");return b?.[1]}(d):void 0),t=b.parentId??(s?gm(s):void 0)??gl(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=gj[b[1]];if(a)return{type:a.type,title:a.title}}return a.startsWith("chapter:")?{type:"chapter",title:a.slice(8),parentId:gl("write")}:a.startsWith("round:")?{type:"round",title:a.slice(6),parentId:gl("close")}:void 0}(c);if(!f)throw new f9("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()};gg(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&&!gp.has(w.status),z=gp.has(m)&&!y,A=b.completedAt??(gp.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}:{}};gh(f,a,u),g.nodes.set(r,gA(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 gg(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 gA(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}function gB(a,b){let c=a.contractQuality,d=b.contractQuality;if(!c||!d)return"缺少修订前或修订后的固定合同七维回执";if("string"!=typeof c.contractId||!c.contractId.trim()||c.contractId!==d.contractId)return"修订前后不是同一固定合同";for(let c of[a,b]){let a=c.contractQuality;if(!Number.isSafeInteger(a.unresolvedCount)||a.unresolvedCount<0||a.unresolvedCount!==a.findings?.filter(a=>"met"!==a.status).length)return"未满足或未判定职责计数与实际回执不一致";if(!Number.isInteger(c.blocking)||c.blocking<0)return"阻断复验没有有效计数";if(!Array.isArray(a.findings)||0===a.findings.length)return"固定合同职责复验缺失";let b=new Set;for(let c of a.findings){if(!c||"string"!=typeof c.criterionId||!c.criterionId.trim()||b.has(c.criterionId)||!["met","not-met","unmeasured"].includes(c.status))return"合同职责标识或复验状态无效";b.add(c.criterionId)}}let e=new Set(c.findings.map(a=>a.criterionId));if(d.findings.length!==e.size||d.findings.some(a=>!e.has(a.criterionId)))return"修订前后固定职责集合发生变化"}let gC=new Set(["role_binding","knowledge_retrieval","file_understanding","fact_extraction","chapter_generation","llm_review","validation","reference"]),gD={completed:"success",failed:"failed",repairing:"partial",blocked:"skipped",running:"running",pending:"running",paused:"running"};function gE(a,b){let c=a.metrics?.[b];return"string"==typeof c?c:void 0}function gF(a,b){let c=a.metrics?.[b];return"number"==typeof c&&Number.isFinite(c)?c:void 0}function gG(a,b={}){if("string"!=typeof a||0===a.length)return{stages:[],nodeCount:0,noNodeLog:!0};let c=gi(a,b.baseDir),d=[];for(let a of c){let b=function(a){let b=a.metrics?.stageType;if("string"!=typeof b||!gC.has(b))return;let c=gE(a,"stageRoleId")??"",d=gE(a,"stagePromptId"),e=gE(a,"stageSubtitle"),f=gF(a,"stageOrder"),g=gF(a,"roundIteration"),h=gE(a,"note"),i=gF(a,"noteChars"),j=void 0!==h&&void 0!==i&&i>h.length?`${h}(原文 ${i} 字,已截断)`:h,k=(a.issues||[]).filter(bH),l=k.length?k.map(a=>a.message):void 0;return bF({type:b,roleId:c,status:gD[a.status],title:a.title,nodeId:a.id,...void 0!==d?{promptId:d}:{},...void 0!==j?{message:j}:{},...void 0!==l?{details:l}:{},...void 0!==a.progress?{progress:a.progress}:{},...void 0!==g?{roundIteration:g}:{}},{...void 0!==e?{subtitle:e}:{},...void 0!==f?{order:f}:{}})}(a);b&&d.push(b)}return{stages:d,nodeCount:c.length,noNodeLog:0===c.length}}let gH=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function gI(a,b,c){return{level:"error",severity:"blocker",category:"structure",owner:"system",message:a,sectionTitle:c,provenance:{detectorId:b,fingerprint:gH([b,a,c])}}}async function gJ(a){let b=a.documentContract,c=a.projectModel;if(!b||!c)throw Error("新成稿流程缺少冻结合同或项目模型");(0,g.oH)(b),aI(a.projectRoot,c);let d=a.generationDiagnostics,f=c=>{a.runId&&(0,am.tv)(j6(a.projectRoot),`contract-review-response-${(0,e.randomUUID)()}.json`,{runId:a.runId,contractId:b.id,...c},a.runId)};b.sections.some(a=>a.contentTypes.includes("basis"))&&bB(d);let h=by(d);if(!h)throw Error("新成稿流程缺少统一文档模型");if(f2(h)&&!a.documentId)throw Error("真实图件渲染缺少文档身份,不能将代码块当成已落地图件");let i=f2(h)?f1({generatedDir:j6(a.projectRoot),projectRoot:a.projectRoot,documentId:a.documentId}):void 0,j=d.authorTaskExecutions;if(!j||j.contractId!==b.id||j.projectSnapshotId!==c.snapshotId)throw Error("最终组装缺少同一合同和冻结项目的真实作者任务执行回执");let k=c=>bz(b,c,a.template.outputTitle,a.chapterDrafts,i?.renderer,j.tasks);for(let[a,d]of Object.entries(h.tasks))(0,bl.validateAuthorTaskOutput)(d.current.output,{contract:b,projectModel:c,taskId:a},{preserveQualityDefects:!!(d.current.qualityIssues?.length||d.current.annotationIssues?.length||d.current.sourceReviewRequests?.length)});let l=k(h);gz(a,{batch:"finalize.delivery",stage:{type:"validation",roleId:"document-contract-review",status:"running",message:"对固定首稿执行七维完整评价,正文保持冻结"}});let m=await a.withProgressHeartbeat(()=>ab({contract:b,projectModel:c,...l,figureUrlFor:i?.renderer,authorTasks:Object.fromEntries(Object.entries(h.tasks).map(([a,b])=>[a,b.current.output])),diagnostics:d,signal:a.input.signal,onReviewAttempt:f})),n=function(a){let b=bs(a);for(let[c,d]of Object.entries(b.tasks))a.c0TaskHashes?.[c]===null?delete b.tasks[c]:d.current=bs(d.firstCandidate);return b}(h),o=k(n),p=T(o.chapters,o.markdown),q=a.input.resumeAuthorState?.firstQuality,r=U(Object.fromEntries(Object.entries(n.tasks).map(([a,b])=>[a,b.current.output]))),s=q?.version===Q&&q.contractId===b.id&&q.projectSnapshotId===c.snapshotId&&q.documentHash===p&&q.authorModelHash===r&&gH(q.score)===gH((0,g._n)(b,q.findings))?q:p===m.documentHash&&m.authorModelHash===r?m:await a.withProgressHeartbeat(()=>ab({contract:b,projectModel:c,...o,figureUrlFor:i?.renderer,authorTasks:Object.fromEntries(Object.entries(n.tasks).map(([a,b])=>[a,b.current.output])),diagnostics:d,signal:a.input.signal,onReviewAttempt:f})),t=[];if(a.runId&&(0,am.tv)(j6(a.projectRoot),"contract-quality-c0.json",s,a.runId),!a.pausedByRequest)for(let e of b.sections.filter(a=>m.findings.some(c=>"not-met"===c.status&&b.criteria.some(b=>b.id===c.criterionId&&b.sectionId===a.id)))){let g;(0,an.Te)(a.input.signal);let h=by(d),j=h.tasks[e.id]?.current,n=m.findings.filter(a=>"not-met"===a.status&&b.criteria.find(b=>b.id===a.criterionId)?.sectionId===e.id),o=new Set(n.map(a=>a.criterionId));if(n.some(a=>"minor"!==a.impact)){t.push({taskId:e.id,status:"not-eligible",reason:"存在实质方案、资料或未分级问题,需要主控重新核工程决定;本轮保留完整稿与根因,不交局部作者反复刷分"});continue}if(!j||j.qualityIssues?.length||j.annotationIssues?.length||j.sourceReviewRequests?.length||j.pendingCriterionIds.length||0===n.length){t.push({taskId:e.id,status:"not-eligible",reason:"缺少可靠完整首稿、前置来源或职责未落实、存在真实未决事项,;保留原稿与缺口,不调用作者反复整节重写"});continue}let p=m;try{await a.withProgressHeartbeat(()=>fS({chapterId:e.chapterId,blockTitle:e.title,contractScoped:!0,maxTokens:Math.max(3200,Math.ceil(1.7*j.markdown.length)),maxAuthorSubmissions:1,system:"你是专业文档作者智能体。本次仅修正已确定的局部缺陷,保留正确的信息单元、事实、方法和承诺,不能扩写无关内容。",prompt:`修改任务${e.id}。只修改承载下列缺陷的既有信息单元,完整返回同一结构化产物;不得增删单元或修改其他单元、事实绑定和未决事项。revisionReason须说明改动。
35
37
  【明确缺陷】${JSON.stringify(n)}
36
38
  【当前产物】${JSON.stringify(j.output)}`,diagnostics:d,signal:a.input.signal,toolContext:fR({projectRoot:a.projectRoot,projectModel:c,scopeRootNames:a.agentWorkflow.materialScope.selectedRoots,contractScoped:!0,signal:a.input.signal}),beforeAuthorSubmit:async m=>{let q=function(a,b,c,d){let e=bq.get(a);if(!e)throw Error("当前运行没有文档模型写入器");let f={...e,model:bs(e.model)};return{candidate:bw(f,b,c,d),model:f.model}}(d,e.id,m,`一次定向轻修:${n.map(a=>a.reason).join(";")}`),r=q.candidate.output;if(gH(r.units.map(a=>a.id))!==gH(j.output.units.map(a=>a.id)))throw Error("轻修不能增删整段、表格或图件");if(gH(r.factBindings)!==gH(j.output.factBindings)||gH(r.decisionRequests)!==gH(j.output.decisionRequests)||gH(r.numericBindings??[])!==gH(j.output.numericBindings??[]))throw Error("事实、定量来源或方案决定变更须先回到前置模型裁决");for(let a of r.units){let b=j.output.units.find(b=>b.id===a.id);if(b.kind!==a.kind||gH(b.criterionIds)!==gH(a.criterionIds))throw Error("轻修不能改写信息单元类型或职责身份");if(gH(b)!==gH(a)&&!b.criterionIds.some(a=>o.has(a)))throw Error("修改涉及缺陷作用域以外的信息单元")}let s=k(q.model),t=(b,c)=>cR(a,c,b).filter(a=>"error"===a.level||"blocker"===a.severity),u=t(h,l),v=t(q.model,s),w=new Set(u.map(a=>gH([a.provenance?.detectorId,a.message])));if(v.some(a=>!w.has(gH([a.provenance?.detectorId,a.message]))))throw Error("轻修引入新的结构、数据或明确禁令问题");let x=b.criteria.filter(a=>!a.chapterId||a.chapterId===e.chapterId).map(a=>a.id),y=await ab({contract:b,projectModel:c,...s,figureUrlFor:i?.renderer,authorTasks:Object.fromEntries(Object.entries(q.model.tasks).map(([a,b])=>[a,b.current.output])),diagnostics:d,signal:a.input.signal,previousReceipt:p,affectedCriterionIds:x,onReviewAttempt:f});if(y.score.blocking.some(a=>!p.score.blocking.includes(a)))throw Error("轻修新增关键未满足或未判定项,拒绝提交");let z=n.some(a=>y.findings.find(b=>b.criterionId===a.criterionId)?.status==="met");if(!z)throw Error("目标缺陷没有减少,停止该方向并保留原稿");if(Z(y).length>Z(p).length)throw Error("轻修增加来源改写阻断,拒绝提交");let A=(a,b,c,d,e)=>({contractQuality:{contractId:a.contractId,unresolvedCount:a.findings.filter(a=>"met"!==a.status).length,requestedChangeVerified:e,findings:a.findings.map(({criterionId:a,status:b})=>({criterionId:a,status:b}))},blocking:d.length+a.score.blocking.length+Z(a).length,entityPlacement:Object.values(b.tasks).reduce((a,b)=>a+b.current.output.factBindings.length,0),chars:c.markdown.length}),B=A(p,h,l,u,!1),C=A(y,q.model,s,v,z),D=gB(B,C);if(D)throw Error(`轻修复验不可比较:${D};原稿保留`);if(!function(a,b){if(gB(a,b))return!1;let c=a.contractQuality,d=b.contractQuality;if(!0!==d.requestedChangeVerified||d.unresolvedCount>c.unresolvedCount||b.blocking>a.blocking)return!1;let e=new Map(d.findings.map(a=>[a.criterionId,a.status]));return c.findings.every(a=>"unmeasured"===a.status||("met"===a.status?"met"===e.get(a.criterionId):"unmeasured"!==e.get(a.criterionId)))}(B,C))throw Error("轻修未获同合同净改善:未满足项增加或已测职责退步,拒绝提交并保留原稿");g=y}}));let q=by(d);g&&q.tasks[e.id].current.contentHash!==j.contentHash?(m=g,l=k(q),t.push({taskId:e.id,status:"committed",reason:"同稿局部缺陷与增量复验通过后提交"})):t.push({taskId:e.id,status:"rejected",reason:"未提交通过复验的结构化修改,保留原稿"})}catch(c){if(a.input.signal?.aborted)throw c;let b=by(d);g&&b.tasks[e.id]?.current.contentHash!==j.contentHash?(m=g,l=k(b),t.push({taskId:e.id,status:"committed",reason:`已通过复验并提交;后续记录失败:${c instanceof Error?c.message:String(c)}`})):t.push({taskId:e.id,status:"rejected",reason:c instanceof Error?c.message:String(c)})}}if(aI(a.projectRoot,c),m.normativeUses){var u=m.normativeUses;let a=bq.get(d);if(!a)throw Error("规范终评账缺少真实当前文档模型");K(u,{project:a.projectModel,tasks:bA(a.contract,a.model)}),a.model.normativeUses=bs(u),a.onChange?.(bs(a.model))}else b.sections.some(a=>a.contentTypes.includes("basis"))&&bB(d);let v=by(d);a.runId&&v.normativeUses&&(0,am.tv)(j6(a.projectRoot),"normative-use-register-final.json",v.normativeUses,a.runId);let w=function(a,b,c,d){if(c.contractId!==a.id||b.contractId!==a.id)throw Error("写作指标的首稿、模型和合同身份不一致");let e=new Map(c.findings.map(a=>[a.criterionId,a])),f=new Map(c.findings.map(a=>[a.criterionId,a.status])),g=a=>"met"===f.get(a)&&["professional","strong"].includes(e.get(a)?.qualityLevel??"unmeasured"),h=a.criteria.filter(a=>a.applicable&&!a.chapterId),i=new Set(c.sourceReviews?.filter(a=>"met"!==a.status).map(a=>a.taskId)),j=a.sections.map(c=>{let d=a.criteria.filter(a=>a.applicable&&a.sectionId===c.id),e=b.taskAttempts[c.id]?.firstComplete===!0;return{taskId:c.id,produced:!!b.tasks[c.id],protocolFirstComplete:e,firstQualityPassed:e&&!b.tasks[c.id]?.firstCandidate.qualityIssues?.length&&!i.has(c.id)&&d.length>0&&d.every(a=>g(a.id))}}),k=a.criteria.filter(a=>a.applicable&&a.sectionId).reduce((a,b)=>a+b.weight,0),l=0,m=0,n=0,o=0,p=0;for(let c of a.sections){let d=b.tasks[c.id];if(!d)continue;let g=b.taskAttempts[c.id]?.firstComplete===!0&&!d.firstCandidate.qualityIssues?.length&&!i.has(c.id),h=new Map(d.firstCandidate.output.units.map(a=>[a.id,a])),j=a.criteria.filter(a=>a.applicable&&a.sectionId===c.id),k=new Set;for(let a of d.current.output.units){o+=1;let i=g&&b.c0TaskHashes?.[c.id]!==null?h.get(a.id):void 0,l=(0,bl.renderAuthorUnit)(a).length;m+=l;let q=d.firstCandidate.output.factBindings.filter(b=>b.unitId===a.id),r=d.current.output.factBindings.filter(b=>b.unitId===a.id),s=d.firstCandidate.output.numericBindings?.filter(b=>b.unitId===a.id)??[],t=d.current.output.numericBindings?.filter(b=>b.unitId===a.id)??[],u=j.filter(b=>{let c=e.get(b.id)?.authorUnitIds;return void 0===c?a.criterionIds.includes(b.id):c.includes(a.id)});i&&fX(fY(i))===fX(fY(a))&&fX(q)===fX(r)&&fX(s)===fX(t)&&u.length>0&&u.every(a=>"met"===f.get(a.id))&&a.criterionIds.every(a=>"met"===f.get(a))&&(k.add(a.id),p+=1,n+=l)}for(let h of a.criteria.filter(a=>a.applicable&&a.sectionId===c.id)){let a=e.get(h.id)?.authorUnitIds,i=(!g||b.c0TaskHashes?.[c.id]===null?[]:d.firstCandidate.output.units).filter(b=>void 0!==a?a.includes(b.id):b.criterionIds.includes(h.id));i.length&&"met"===f.get(h.id)&&(l+=h.weight*i.filter(a=>k.has(a.id)).length/i.length)}}let{missingUsageCalls:q,totalTokens:r,repairTokens:s}=(0,aM.TV)(d);return{version:"writing-metrics-v2-professional-2026-10-12",contractId:a.id,firstDocumentHash:c.documentHash,metricDefinition:"task-professional-pass-and-document-conditions-v2",taskMetrics:j,firstPassRate:j.length?j.filter(a=>a.firstQualityPassed).length/j.length:null,documentConditionsPassed:h.every(a=>g(a.id)),unresolvedDocumentCriterionIds:h.filter(a=>!g(a.id)).map(a=>a.id),retention:{fixedWeight:k,retainedWeight:l,conservativeWeightRatio:k?l/k:null,evidencePolicy:"confirmed-applicable-criterion-unit-evidence-v1",currentUnits:o,retainedUnits:p,contentChars:m,retainedContentChars:n,charRatio:m?n/m:null},rework:b.rework,generationTokens:{totalTokens:q?null:r,repairTokens:q?null:s,repairRatio:!q&&r?s/r:null,missingUsageCalls:q,purposePolicy:"首候选后的写作调用及明确轻修保守计入chapter-repair;资料理解、规划和纯审查单独报告"},calibration:"initial-unvalidated",expertValidated:!1}}(b,v,s,d),x=cR(a,l),y=m.score.blocking.map(a=>{let c=b.criteria.find(b=>b.id===a),d=m.findings.find(b=>b.criterionId===a);return gI(`合同评价${d?.status==="not-met"?"未满足":"未判定"}:${c.description};${d?.reason??"评价未完成"}`,"document-contract-quality",b.chapters.find(a=>a.id===c.chapterId)?.title)}),z=(a.clarificationRequests??[]).filter(a=>a.blocking&&"pending"===a.status).map(a=>gI(`未决主控或用户事项:${a.question}`,"document-contract-pending-decision")),A=[...x,...y,...aa(b,m),...Z(m),...z],B=A.filter(a=>"error"===a.level||"blocker"===a.severity),C=!a.pausedByRequest&&0===B.length&&_(m),D=w.taskMetrics;if(a.runId){let c=j6(a.projectRoot);(0,am.tv)(c,"document-model-final.json",v,a.runId),i&&(0,am.tv)(c,"document-figure-rendering.json",{contractId:b.id,documentHash:m.documentHash,figures:i.receipts().map(a=>({...a,current:l.markdown.includes((0,ae.basename)(a.file))}))},a.runId),(0,am.tv)(c,"contract-light-repair.json",{firstDocumentHash:s.documentHash,finalDocumentHash:m.documentHash,repairLog:t,taskMetrics:D,firstPassRate:D.length?D.filter(a=>a.firstQualityPassed).length/D.length:null,rework:v.rework,writingMetrics:w,calibration:"initial-unvalidated"},a.runId)}let E=b.sections.every(a=>{let b=l.chapters.find(b=>b.id===a.chapterId)?.generationProgress;return!!b?.producedTaskIds.includes(a.id)}),F=l.chapters.map(a=>({id:a.id,title:a.title,chars:a.content.length,status:C?"completed":a.generationProgress?.status??"not-started",generationProgress:a.generationProgress,updatedAt:Date.now()})),G=Object.keys(c.sources).map(b=>({filePath:b,count:a.allEvidence.filter(a=>a.filePath===b).length}));return gz(a,{batch:"finalize.delivery",stage:{type:"validation",roleId:"document-contract-review",status:C?"success":"partial",message:`七维评价${m.score.deliveryReady?"职责满足且专业达标":"待核验或专业改进"};专业档位缺口${m.score.qualityGaps.length}项;首稿通过${D.filter(a=>a.firstQualityPassed).length}/${D.length};轻修提交${t.filter(a=>"committed"===a.status).length}项`}}),{templateId:a.template.id,templateName:a.template.name,title:a.template.outputTitle,requirement:a.input.requirement??"",projectRoot:a.projectRoot,projectId:a.projectId,...l,facts:Object.fromEntries(c.facts.map(a=>[a.key,(0,an.lG)(a.value)])),structuredFacts:c.facts,factsModel:c.factsModel,sources:G,missingItems:[...a.missingItems],clarificationRequests:a.clarificationRequests,unfixableDeclarations:a.unfixableDeclarations,validation:{passed:C,errors:B.map(a=>a.message),warnings:A.filter(a=>"warning"===a.level).map(a=>a.message)},validationIssues:A,exportGate:{passed:C,blockingIssues:B,textFingerprint:(0,an.c6)(l.markdown),deliveryFingerprint:(0,an.c6)(l.markdown),checklist:[{key:"document-contract-quality",label:"冻结合同七维评价",passed:m.score.deliveryReady},{key:"document-model-conservation",label:"正文结构与数据守恒",passed:!x.some(a=>"error"===a.level||"blocker"===a.severity)},{key:"generation-complete",label:"全部固定任务已产出正文",passed:!a.pausedByRequest&&E}]},executionStages:gG(a.documentId,a.nodeLogBaseDir?{baseDir:a.nodeLogBaseDir}:{}).stages,assets:a.runAssets??[],checkpointChapters:l.chapters,partialChapters:F,resumeLedger:a1({recordedAt:Date.now(),workflowVersion:aJ.version,blocks:d.blockLedger??[],chapters:F,readings:{blockers:B.length,warnings:A.length-B.length,words:l.markdown.length,chaptersTotal:b.chapters.length,chaptersCompleted:F.filter(a=>"completed"===a.status).length,firstPassRate:D.length?D.filter(a=>a.firstQualityPassed).length/D.length:null}}),promptRules:a.promptDocumentRules,agentWorkflow:a.agentWorkflow,bidComposition:a.bidComposition,exportSettings:cI(void 0,a.bidComposition?.formatRules).settings,generationSettings:a.template.generationSettings,reviewMetadata:{chapterSummaries:[],globalIssues:[],diagnostics:d,contractQuality:m,writingMetrics:w,workflowVersion:aJ,suspensionChecklist:C?void 0:fV(B,l.chapters),retrievalCoverage:a.retrievalCoverageReports,telemetry:function(a){let b=[...a.diagnostics.metrics].sort((a,b)=>b.durationMs-a.durationMs).slice(0,5).map(a=>({name:a.name,durationMs:a.durationMs})),c={};for(let[b,d]of Object.entries(a.diagnostics.llm.patchGuardStats||{}))c[b]={hits:d.hits+d.rejects,repaired:d.hits,failed:d.rejects+(d.rejectedWrites??0),readingStatus:"patch-guard"};for(let b of a.diagnostics.repairChainLog||[]){if("<converged>"===b.round||c[b.round])continue;let a=b.residualBefore,d=b.residualAfter;if(a&&"anchored"===a.status){let e=a.count,f=d&&"anchored"===d.status?Math.max(0,a.count-d.count):0;c[b.round]={hits:e,repaired:f,failed:Math.max(0,e-f),readingStatus:"residual-anchored"};continue}c[b.round]={hits:0,repaired:0,failed:0,readingStatus:"no-reader"}}return{llmCalls:a.diagnostics.llm.calls,llmFailures:a.diagnostics.llm.failures,maxParallelLlm:a.diagnostics.llm.maxActive,searchQueries:a.diagnostics.evidence.searchQueries,evidenceContextChars:a.diagnostics.evidence.contextChars,qualityIssues:{...a.diagnostics.quality},slowMetrics:b,elapsedMs:a.startedAt&&a.endedAt?a.endedAt-a.startedAt:void 0,repairHeat:Object.keys(c).length>0?c:void 0,repairChainNetChars:a.diagnostics.repairChainNetChars}}({diagnostics:d})},generatedAt:Date.now(),pausedByRequest:a.pausedByRequest,...a.blueprintDataRef?{blueprintDataRef:a.blueprintDataRef}:{}}}async function gK(a){if(!a.documentContract||!a.projectModel)throw Error("终稿缺少冻结合同或项目模型;保留已有产物,不启动旧全文修复或救援生成");return gJ(a)}var gL=c(87931),gM=c(29327);async function gN(a){if(!a.section.contentTypes.includes("method"))return;let b=a.contract.criteria.filter(b=>b.sectionId===a.section.id&&b.applicable),c=`${a.section.title} ${a.section.responsibility}`,d=(0,aq.Y)(c),e=new Set(["施工","项目","工程","技术","方法","措施","方案","控制","管理","保障","组织","检查","验收","范围","部位","作业","条件","依据","要求"]),f=a.project.facts.filter(b=>{if(!(0,m.j)(b)||!Object.hasOwn(a.project.sources,b.sourceFile))return!1;let f=(0,l.nD)(b),g=[b.objectName,b.key,f?.label,...f?.aliases??[]].filter(a=>!!(a&&"项目主体"!==a));return!!(d.has(f?.key??b.fieldId??b.key)||g.some(a=>!e.has(a)&&c.includes(a)))&&(0,aq.p)(b).requiresTechnicalDecision}),g=a=>(0,l.nD)(a)?.key??a.fieldId??a.key;if(!f.length)return;let h={excavation_depth:["ground_elevation","pit_bottom_elevation"],foundation_depth:["ground_elevation","foundation_elevation"]},i=a=>a.resolutionRef?.winnerSourceFile??a.sourceFile,j=new Set(f.flatMap(a=>[g(a),...h[g(a)]??[]])),k=a.project.facts.filter(b=>{let c=i(b),d=b.resolutionRef?.winnerSourceRef??b.sourceRef,e=d?.cadInterpretation;return(0,m.j)(b)&&Object.hasOwn(a.project.sources,c)&&f.some(a=>i(a)===c)&&j.has(g(b))&&!(0,aq.p)(b).requiresTechnicalDecision&&!!b.objectName&&d?.roleId==="cad-reviewed-geometry"&&"number"==typeof(0,dp.mk)(a.project,(0,l.vg)(b)).factIndex&&e?.parsedIdentity===a.project.sources[c].sha256&&!!(e.frameId&&e.valueEntityId&&e.rawValue&&e.unit&&e.condition?.trim()&&e.reviewReason?.trim()&&e.unitEntityIds?.length&&e.scopeEntityIds?.length&&e.sourceViewHashes?.length)&&"resolved"===(0,dm.j)(a.project,{attribute:g(b),objectName:b.objectName}).status}),n=k.map(b=>({factId:(0,l.vg)(b),objectName:b.objectName,attribute:g(b),condition:(b.resolutionRef?.winnerSourceRef??b.sourceRef).cadInterpretation.condition,value:b.value,authorReferences:{factIndices:[(0,dp.mk)(a.project,(0,l.vg)(b)).factIndex]}})),o=n.filter(b=>{let c=k.find(a=>(0,l.vg)(a)===b.factId);try{return(0,q.tS)({project:a.project,taskId:a.section.id,fact:c,usage:"project-fact",quantitativeValues:(0,P.ei)(b.value),assertedText:`${b.objectName} ${b.attribute} ${b.value} ${b.condition}`}),!0}catch{return!1}}),p=f.map(a=>({factId:(0,l.vg)(a),attribute:g(a),...a.objectName?{objectName:a.objectName}:{},reason:(0,aq.p)(a).reason})),r=new Set(f.map(l.vg)),s={decisions:[],candidateIds:[...r],additionalCandidateIds:f.filter(a=>!r.has((0,l.vg)(a))).map(l.vg),readyControls:o,unresolvedGeometry:p,remainingFactQueries:[],reusedReviewedControls:!1},t=new Set(b.flatMap(a=>a.factIds??[]));if(f.length&&f.every(a=>!a.objectName&&!t.has((0,l.vg)(a))&&o.some(b=>b.attribute===g(a)&&c.includes(b.objectName))))return{...s,reusedReviewedControls:!0,reuseBasis:"same-object-same-attribute"};let u=[...new Map([...new Map(f.map(a=>{let b={attribute:g(a),...a.objectName?{objectName:a.objectName}:{}};return[JSON.stringify(b),b]})).values(),...k.filter(a=>f.some(b=>(h[g(b)]??[]).includes(g(a)))).map(a=>({attribute:g(a),objectName:a.objectName}))].map(a=>[JSON.stringify(a),a])).values()],v=[...new Map(f.flatMap(b=>{let c=(0,l.nD)(b),d=i(b),e=b.resolutionRef?.winnerSourceRef?.sourceSpan??b.sourceRef?.sourceSpan??"",f=[b.key,c?.label,...c?.aliases??[]].find(a=>a&&e.includes(a));return f&&Object.hasOwn(a.project.sources,d)?[{query:f,filePath:d,limit:8}]:[]}).map(a=>[JSON.stringify(a),a])).values()],w=b.filter(a=>"facts"===a.dimension||"understanding"===a.dimension||"methods"===a.dimension||"response"===a.dimension).map(a=>a.id);if(!w.length)return;let x=await a.chief.ask({question:`写作前主动核定本任务真正需要的工序选择、工程对象和接口。根据当前职责完整原母与查询工具查证可执行的方法决定;不要逐字段穷举预审全部源,不把计价档位当施工条件,不把目录材料名当工法。已有明确源义务保持主体/触发/例外;真实定性方法或项目采用以qualitative-controls核定,真正定量控制以engineering-controls核定;缺依据保持具体未决,普通专业段落可继续形成候选。以下物理几何原证据已独立复核,可直接核本任务用途,不能再把其单位和原定位当未抽取:${JSON.stringify(n)}。这还不构成方法控制采用许可,不扩大其他对象或工况。以下所有相关控制对象均须保留,不只取第一属性或前四项:${JSON.stringify(f.map(a=>({factId:(0,l.vg)(a),attribute:g(a),objectName:a.objectName,meaning:(0,aq.p)(a)})))}。对象查询先提供已独立复核的实际控制;优先复用其完整适用条件,不重复读取已核定的同一属性。坑底控制可按真实属性使用,但不能称作开挖深度;地面标高不自动等于坡顶标高,不能自行相减。若本节必须另有总深度或局部加深控制,继续定位基准、对象和阶段;不为解决概述范围强行制造统一深度。未决范围不得取端点,不能推广其他区段。${s.remainingFactQueries.length?`受单次查询上限影响尚未查询:${JSON.stringify(s.remainingFactQueries)};不能声称这些对象已完成核查。`:""}请先解释完整原文,再提供可核验的控制决定或明确尚需定位的内容。`,criterionIds:w,sourceQueries:v,factQueries:u});return{...s,decisions:[x]}}var gO=c(16752);function gP(a){return a.map(a=>{let b=a.resolutionRef?.winnerSourceRef??a.sourceRef,c=b?.cadInterpretation;return{...void 0!==a.factIndex?{factIndex:a.factIndex}:{},...void 0!==a.sourceIndex?{sourceIndex:a.sourceIndex}:{},attribute:a.fieldId??a.fieldName??a.key,label:a.fieldName??a.key,...a.objectName?{objectName:a.objectName}:{},value:a.value,sourceRole:a.roleId,..."verified-source-excerpt"===a.roleId?{sourceStatus:"original-source-candidate-not-project-adoption"}:{},...c?.unit||a.unit?{unit:c?.unit??a.unit}:{},sourceFile:a.resolutionRef?.winnerSourceFile??a.sourceFile,sourceRef:b?{...void 0!==b.chunkIndex?{chunkIndex:b.chunkIndex}:{},...b.sectionTitle?{sectionTitle:b.sectionTitle}:{},...b.sourceSpan?{sourceSpan:b.sourceSpan}:{},...b.contextSpan?{contextSpan:b.contextSpan}:{},...c?{cad:{frameId:c.frameId,valueEntityId:c.valueEntityId,condition:c.condition,unit:c.unit,independentlyReviewed:!!("cad-reviewed-geometry"===b.roleId&&c.reviewReason&&c.unitEntityIds?.length&&c.scopeEntityIds?.length&&c.sourceViewHashes?.length)}}:{}}:void 0,...a.resolutionRef?.scope?{resolutionScope:a.resolutionRef.scope}:{},...a.temporalConstraint?{temporalConstraint:{event:a.temporalConstraint.event,kind:a.temporalConstraint.kind,status:a.temporalConstraint.status,date:a.temporalConstraint.date,condition:a.temporalConstraint.condition,superseded:a.temporalConstraint.superseded}}:{},...a.requirementIds?.length?{requirementIds:a.requirementIds}:{},technicalMeaning:a.technicalMeaning??(0,aq.p)(a)}})}function gQ(a,b){if(new Set(b).size!==b.length)throw Error("作者调度存在重复章节身份");let c=new Map(b.map(a=>[a,[]])),d=new Set;for(let b of a){let a=c.get(b.chapterId);if(!a||d.has(b.id))throw Error("作者调度任务的章节身份缺失或任务重复");d.add(b.id),a.push(b)}let e=[];for(let b=0;e.length<a.length;b+=1)for(let a of c.values())a[b]&&e.push(a[b]);return e}var gR=c(25493),gS=c(74812);let gT=a=>(0,e.createHash)("sha256").update(JSON.stringify(a)).digest("hex");async function gU(a){var b;let c,d=a.planning.documentContract,e=a.understanding.projectModel;if(!d||!e)throw Error("合同作者调度缺少冻结的职责或事实");let j=a.planning.generationDiagnostics,k=a.global.input;aI(a.prepare.projectRoot,e);let n=a.planning.sharedConstructionPlan;if(d.deliveryPolicy&&!n)throw Error("专业正文缺少同一固定合同的主控共同组织部署");n&&(0,gR.wB)(n,d,e),n&&(0,P.Nu)(e,d,n.production);let p=d.sections,q=(gQ(p,b=d.chapters.map(a=>a.id)),{body:gQ(p.filter(a=>!a.collectsDocumentNormativeUses),b),compilationBasis:gQ(p.filter(a=>a.collectsDocumentNormativeUses),b)}),r=[...q.body,...q.compilationBasis],s=q.compilationBasis.length?q.body.length:r.length,t=p.map(a=>({taskId:a.id,instanceId:`author:${gT([k.runId,a.id]).slice(0,32)}`,status:"not-started"})),u=new Map(t.map(a=>[a.taskId,a])),v=()=>{j.authorTaskExecutions={contractId:d.id,projectSnapshotId:e.snapshotId,tasks:t.map(({taskId:a,status:b,reason:c,startedAt:d,endedAt:e})=>({taskId:a,status:b,...void 0===c?{}:{reason:c},...void 0===d?{}:{startedAt:d},...void 0===e?{}:{endedAt:e}}))}};v();let w=(0,aM.Tc)(j),x=0,z=new Set,A=!1,B=(0,gM.w)({contract:d,project:e,diagnostics:j,signal:k.signal,sharedPlan:n,readCad:b=>(0,ah.VD)(a.prepare.projectRoot,a=>dw(a,e,b)),onReceipt:b=>{k.runId&&(0,am.tv)(j6(a.prepare.projectRoot),`chief-decision-${gT(b.decision.decisionId).slice(0,24)}.json`,b,k.runId);let c=b.decision;gz(a,{batch:"generation.write",id:c.decisionId,type:"supervisor",title:"主智能体裁决",status:"unmeasured"===c.action?"failed":"request-human"===c.action?"blocked":"completed",metrics:{taskId:c.taskId,action:c.action,source:c.source,note:c.reason}}),"request-human"===c.action&&a.understanding.clarificationRequests.push({question:b.question.question,blocking:!0,askedAt:c.taskId,askedAtMs:Date.now(),status:"pending"})}}),C=()=>{v();let b=by(j),c=k.documentId&&f2(b)?f1({generatedDir:j6(a.prepare.projectRoot),projectRoot:a.prepare.projectRoot,documentId:k.documentId}):void 0,f=c?b=>{try{return c.renderer(b)}catch(f){let c=gT(b);if(!z.has(c)){let g=f instanceof Error?f.message:String(f);k.runId&&(0,am.tv)(j6(a.prepare.projectRoot),`author-figure-preview-failure-${c}.json`,{contractId:d.id,projectSnapshotId:e.snapshotId,sourceHash:c,unit:b,reason:g,status:"failed"},k.runId),gz(a,{batch:"generation.write",id:`figure-preview:${c}`,type:"write",title:`图件预览未完成:${b.caption}`,status:"failed",metrics:{sourceHash:c,note:g}}),z.add(c)}return}}:void 0,g=bz(d,b,a.prepare.template.outputTitle,[],f,t);a.understanding.chapterDraftsByOrder=g.chapters,a.global.chapterDrafts=g.chapters,a.global.emitProgress(g.chapters)};for(let b of d.chapters)gz(a,{batch:"generation.write",id:gm(b.id),type:"chapter",title:b.title,chapterId:b.id,chapterTitle:b.title,status:"pending",metrics:{固定作者任务:b.sectionIds.length}});let D=i((0,h.Sq)(),d.chapters.length),E=[],F=!1,G=()=>{let b=[...E,...k.pullInstructions?.()??[]];for(let c of(E=[],F=!1,b)){let b=["requirement","resize","repair"].includes(c.kind),d=b?"用户要求改变已冻结的内容或范围;保留本轮候选,下一版本须重新编译合同与作者依赖":"指令已在作者批边界收到";if(k.onInstructionOutcome?.(c,{status:b?"pending-rebase":"executed",reason:d}),gz(a,{batch:"generation.write",id:`instruction:${gT([x,c]).slice(0,24)}`,type:"supervisor",title:"用户指令处理",status:b?"blocked":"completed",metrics:{action:c.kind,note:d,原话:c.rawText}}),b&&(A=!0,a.understanding.clarificationRequests.push({question:`新合同变更要求:${c.rawText}。${d}`,blocking:!0,askedAt:"author-batch-boundary",askedAtMs:Date.now(),status:"pending"})),"pause"===c.kind&&(a.global.pausedByRequest=!0,A=!0),"abort"===c.kind)throw Error("用户已中止生成")}};try{for(;x<p.length&&!A&&(G(),!A);){if(x>=s&&s<r.length){let b=bB(j),f=await y(e,b.uses.flatMap(a=>a.code?[a.code.text]:[]),{enabled:!0,signal:k.signal});k.runId&&(0,am.tv)(j6(a.prepare.projectRoot),"normative-official-status-before-basis.json",f,k.runId);let g=bB(j),h=by(j);c=function(a,b){K(a,b);let c=new Set(a.uses.flatMap(a=>a.boundSources.map(a=>a.sourceId)));return{registerId:a.id,projectSnapshotId:a.projectSnapshotId,sourcePolicyId:a.sourcePolicyId,citationCatalog:a.uses.map(b=>({...b,qualification:a.qualifications.filter(a=>a.useId===b.id),verified:a.verifiedUseIds.includes(b.id),issues:a.issues.filter(a=>a.useId===b.id)})),bibliographicRows:a.bibliographicRows,issues:a.issues,sourceEvidence:(b.project.sourceControls??[]).filter(a=>c.has((0,l.vg)(a))),qualificationMeaning:"实际正文引用索引;未核专业适用和当前资格在issues保留,不作为采用许可"}}(g,{project:e,tasks:bA(d,h)}),k.runId&&(0,am.tv)(j6(a.prepare.projectRoot),"normative-use-register-before-basis.json",g,k.runId),gz(a,{batch:"generation.write",type:"supervisor",title:"编制依据首次写作依赖已形成",status:"completed",metrics:{已产正文任务:q.body.filter(a=>!!h.tasks[a.id]).length,正文预期任务:q.body.length,实际规范引用:g.uses.length,可定位名称编号:g.bibliographicRows.length,未核问题:g.issues.length}}),s=r.length}let b=(await Promise.allSettled(Array.from({length:Math.min(D,s-x)},async()=>{for(;x<s&&!A&&!F;){(0,an.Te)(k.signal);let b=k.pullInstructions?.()??[];if(b.length){E.push(...b),F=!0;return}if(k.shouldPause?.()){a.global.pausedByRequest=!0,A=!0;return}if((0,bk.nY)((0,bk.Su)(j))){A=!0;return}aI(a.prepare.projectRoot,e);let h=r[x++],i=u.get(h.id),q=n?.tasks.find(a=>a.taskId===h.id),s=(0,gS.b)({contract:d,section:h,project:e,sharedTask:q});i.readiness=s;let t=by(j).tasks[h.id];if(t){i.status=t.current.pendingCriterionIds.length||"ready"!==s.status?"blocked":"completed",i.reason="blocked"===i.status?"原候选或任务依赖仍有未决事项,不能将续跑标为完成":"复用同一合同中已有的结构化信息单元,累计修改账保留",C();continue}await (0,bk.$X)({instance:j,chapterId:h.chapterId,sharedRecord:w.get(h.chapterId)},async()=>{w.set(h.chapterId,(0,bk.Kj)());let b=d.chapters.find(a=>a.id===h.chapterId);i.startedAt=Date.now(),i.status="running",v(),gz(a,{batch:"generation.write",id:gm(b.id),type:"chapter",title:b.title,chapterId:b.id,chapterTitle:b.title,status:"running",metrics:{固定作者任务:b.sectionIds.length}}),gz(a,{batch:"generation.write",id:i.instanceId,type:"block",title:h.title,status:"running",chapterId:b.id,chapterTitle:b.title,parentId:gm(b.id),metrics:{taskId:h.id,合同:d.id.slice(0,16)}});let q="作者未提交完整结构化候选",r=0;try{if("blocked"===s.status){i.status="blocked",i.reason=s.issues.map(a=>a.reason).join(";");return}let{facts:t,unresolvedFacts:u,commonFacts:v,factCandidates:w,sourceCandidates:x,workPackageCandidates:y,workScope:z}=function(a){let{project:b,contract:c,section:d}=a;if(c.projectSnapshotId!==b.snapshotId||!c.sections.some(a=>a.id===d.id))throw Error("作者任务资料包不属于当前冻结项目与合同");let e=c.criteria.filter(a=>a.applicable&&a.sectionId===d.id),f=new Set(e.flatMap(a=>a.factIds??[])),g=new Set(e.flatMap(a=>a.candidateFactIds??[])),h=new Set(e.map(a=>a.id)),i=[...b.facts,...b.sourceControls??[]].filter(a=>f.has((0,l.vg)(a))||a.requirementIds?.some(a=>h.has(a))),j=i.filter(a=>(0,m.j)(a)&&Object.hasOwn(b.sources,a.resolutionRef?.winnerSourceFile??a.sourceFile)),k=new Set(i.map(l.vg));if([...f].some(a=>!k.has(a)))throw Error("作者任务指定的必用事实不在当前冻结项目中");let n=j.map(a=>(0,gO.YL)(b,a)),o=new Set(n.map(l.vg)),p=(0,gO.tb)(b,d).filter(a=>!o.has((0,l.vg)(a)));return p.forEach(a=>o.add((0,l.vg)(a))),{version:"author-task-evidence-package-v2-source-candidates",projectSnapshotId:b.snapshotId,contractId:c.id,taskId:d.id,criteria:e,facts:n,unresolvedFacts:i.filter(a=>!j.includes(a)).map(a=>({factId:(0,l.vg)(a),attribute:a.fieldId??a.fieldName??a.key,key:a.key,objectName:a.objectName??null,sourceFile:a.resolutionRef?.winnerSourceFile??a.sourceFile,status:"unmeasured",reason:a.temporalConstraint?.status!==void 0&&"resolved"!==a.temporalConstraint.status?"该开工事件尚未核定,候选日期不能当固定进度条件":"必需记录的当前来源或置信状态尚未满足事实使用条件"})),commonFacts:p,factCandidates:[...new Map([...b.facts.filter(a=>g.has((0,l.vg)(a))).map(a=>(0,gO.YL)(b,a)),...(0,gO.Xi)(b,d,e)].filter(a=>!o.has((0,l.vg)(a))).map(a=>[(0,l.vg)(a),a])).values()],sourceCandidates:(0,gO.GA)(b,d,e),workPackageCandidates:(0,gO.i6)(b,d,e),workScope:{chapterTitle:c.chapters.find(a=>a.id===d.chapterId).title,taskTitle:d.title,responsibility:d.responsibility,interfaces:c.sections.filter(a=>a.chapterId===d.chapterId&&a.id!==d.id).map(a=>({taskId:a.id,title:a.title,responsibility:a.responsibility})),workPackageDirectory:(0,gO.T3)(b,d),sourceStatus:"directory-and-evidence-candidates-not-project-adoption"}}}({project:e,contract:d,section:h}),A=(0,gO.Jh)([...t,...v,...w]),C=h.contentTypes.includes("project")?[]:w.filter(a=>a.technicalMeaning.requiresTechnicalDecision),D=new Set(C.map(l.vg)),E=w.filter(a=>!D.has((0,l.vg)(a))),F=await gN({contract:d,section:h,project:e,chief:B(h.id)});k.runId&&F&&(0,am.tv)(j6(a.prepare.projectRoot),`chief-writing-preparation-${gT(h.id).slice(0,24)}.json`,F,k.runId);let G=`${b.title} ${h.title}`.replace(/[、,,]/gu,""),H=a.planning.projectTypeDecision?.type??"general",I=(0,f.Jf)({projectType:H,title:h.title,responsibility:h.responsibility,contentTypes:h.contentTypes}),J=fg(G,[h.title,h.responsibility],H,k.inputSnapshot?.skills??[]),K=function(a){let b=fg(a.chapterTitle,a.sections,a.projectType,a.skills),c=[],d=new Set,e=new Set;for(let f of b){let b=[...new Set([...fn(f.knowledge.flatMap(a=>a.ids),a.blockText),...fn(fo,a.blockText)])];for(let a of b)d.add(a);let g=fq(f);for(let a of g.split("\n").filter(Boolean))e.add(a);let h=ff(f,a.chapterTitle,a.sections,a.projectType);c.push({skillId:f.id,matchedBy:`章域${h.matchedDomains.join("、")};主题${h.matchedKeywords.join("、")};类型${a.projectType}`,cards:b,forbiddenCount:f.forbidden.length,injectedChars:g.length})}if(!b.length){let b=fn(fo,a.blockText);for(let a of b)d.add(a);b.length&&c.push({skillId:"(块文本直配)",matchedBy:`主题提及实际工艺:${b.join("、")}`,cards:b,forbiddenCount:0,injectedChars:0})}let f=fp([...d]),g=[e.size?`【专业内容提示】
@@ -106,8 +108,8 @@ semanticKind:本项目自身的设计、条件与施工要求为 project-desig
106
108
 
107
109
  只返回JSON:{"confirmed":true或false,"reason":"整体复核理由","sourceResults":[{"sourceDictionaryIndex":0,"complete":true,"caseIds":["case-a"],"reason":"逐源理由"}],"sourceCases":[{"id":"case-a","sourceDictionaryIndex":0,"quote":"该原文中真实连续原字","objectScope":"实际对象","condition":"适用工况","semanticKind":"project-condition","versionDomain":"unmeasured","applicability":"applicable","variantIds":[],"reason":"用途依据"}],"variantResults":[],"controlsResults":[],"uncoveredSourceCases":[]}。
108
110
 
109
- 【sourceDictionary】${JSON.stringify(i)}`,k=a.reviewer?async(b,c)=>{let d=await a.reviewer(b,c);return"string"==typeof d?d:void 0===d?void 0:JSON.stringify(d)}:void 0,l=await (0,e.v7)("你是独立来源用途评审者。只对给定任务将实际引用的完整原文逐条核定来源用途、版本用途域与适用性;不新增事实、不授予采用许可、不检查未提供的资料。",j,{diagnostics:a.diagnostics,signal:a.signal,callKind:"planning-review",taskKind:(0,e.TO)(),temperature:0,maxTokens:Math.max(4e3,Math.ceil(.6*JSON.stringify(i).length)),schema:(0,m.q1)([],h),validateProtocol:b=>{try{let c=(0,m.lH)(b,{variants:[],sourceDictionary:d,requiredSourceDictionaryIndices:h});return u(a.project,c,{sourceDictionary:d,facts:[],variants:[]}),[]}catch(a){return[a instanceof Error?a.message:String(a)]}}},k);if(!l)continue;let n=(0,m.lH)(l,{variants:[],sourceDictionary:d,requiredSourceDictionaryIndices:h});u(a.project,n,{sourceDictionary:d,facts:[],variants:[]}),f[b]={sourceDictionaryIds:d.map(a=>(0,g.vg)(a)),receipt:n,taskIds:[...c.taskIds]}}catch(b){if(a.signal?.aborted)throw b}}})),f.filter(Boolean).flatMap(a=>a.taskIds.map(b=>({taskId:b,sourceDictionaryIds:a.sourceDictionaryIds,receipt:a.receipt})))}function z(a,b){let c=x(a,b.sections.length),d=a.activities;if(!Array.isArray(d)||d.some(a=>!a||"object"!=typeof a||Reflect.ownKeys(a).some(a=>!["id","phaseId","objectScope","workfront","taskIndices","predecessors"].includes(String(a)))))throw Error("施工拓扑只允许完整活动身份、对象、工作面、任务和依赖;生产输入在分阶段详情填写");let e=(0,o.SZ)(d.map(a=>({...a,quantity:null,production:null,duration:null,waits:[]})),c.map(a=>a.id),b.sections.length);for(let a of e)if(a.taskIndices.some(b=>!c.find(b=>b.id===a.phaseId).taskIndices.includes(b)))throw Error("拓扑活动任务不属于已声明阶段");let f=new Set,g=new Set,h=a=>{if(f.has(a))throw Error("施工活动依赖成环,不能进入分阶段生产核定");if(!g.has(a)){for(let b of(f.add(a),e.find(b=>b.id===a).predecessors))h(b.activityId);f.delete(a),g.add(a)}};return e.forEach(a=>h(a.id)),e.map(({id:a,phaseId:b,objectScope:c,workfront:d,taskIndices:e,predecessors:f})=>({id:a,phaseId:b,objectScope:c,workfront:d,taskIndices:e,predecessors:f}))}function A(a,b,c,d,e,f){if(!a||"object"!=typeof a||Reflect.ownKeys(a).some(a=>"activities"!==a)||!Array.isArray(a.activities))throw Error("阶段生产详情仅返回activities");let g=a.activities;if(g.length!==c.length||new Set(g.map(a=>a?.activityIndex)).size!==c.length||g.some(a=>!a||!c.includes(Number(a.activityIndex))||!Number.isSafeInteger(a.activityIndex)||Reflect.ownKeys(a).some(a=>!["activityIndex","quantity","production","duration","waits"].includes(String(a)))))throw Error("阶段详情含重复、缺失、越域活动或擅改冻结拓扑");let h=new Map(g.map(({activityIndex:a,...b})=>[Number(a),b])),i=(0,o.SZ)(b.map((a,b)=>({...a,...h.get(b)??{quantity:null,production:null,duration:null,waits:[]}})),d.map(a=>a.id),e.sections.length);return(0,o.yP)({contract:e,project:f,phaseIds:d.map(a=>a.id),activities:i}),c.map(a=>i[a])}async function B(a){let b,c,{contract:d,project:j}=a;if(v(j),d.projectSnapshotId!==j.snapshotId)throw Error("共享施工计划与项目合同不一致");let k=[...new Map(d.sections.flatMap(a=>(0,f.tb)(j,a)).filter(h.j).map(a=>[(0,g.vg)(a),a])).values()],l=d.sections.map((a,b)=>({taskIndex:b,title:a.title,responsibility:a.responsibility})),m=[(0,i.V2)(d.writingKnowledge?.projectType),"先形成全体作者共用的完整施工阶段与活动依赖网络;本次只写专业拓扑,资源、产率、数量和时长在冻结拓扑之后按阶段独立填写,不在一个巨型JSON里同时输出。不得漏工作范围或为缩短响应合并不同对象和工况。","阶段按真实对象、工作面和移交条件安排,不套固定五阶段。方法和接口是当前工程决定,不能猜设计参数或用按图、后续审批代替。实际楼层、区段与阶段名称可正常表述;数值引用仍须对应真实来源,工程生产输入单独结构化登记,拓扑文本不授予数值事实或采用资格。",'只返回{"phases":[{id,scope,method,predecessors:[],releaseCondition,interfaces:[],taskIndices:[]}],"activities":[{id,phaseId,objectScope,workfront,taskIndices:[],predecessors:[{activityId,relation:"finish-start"或"start-start",lagDays:0}]}]}。本次activities不含quantity/production/duration/waits。活动ID和跨阶段依赖一次确定,后续不得换活动、任务或依赖。真实等待仅以明确有依据的依赖lagDays登记,不编未知等待数。',"每个活动的taskIndices必须属于对应阶段。完整承担方法、资源、管理、资料、验收和交接职责,全部作者任务必须有实际施工/管理活动承接;不得把所有任务机械挂到每个活动。施工依赖不代表作者串行写作。",JSON.stringify({tasks:l,projectConstraints:k,workPackageDirectory:(j.workPackages??[]).map(a=>({name:a.name,memberCount:a.members?.length??0,objects:[...new Map((a.members??[]).map(({entry:a})=>[JSON.stringify([a.name,a.section,a.subsection]),{name:a.name,scope:a.section,part:a.subsection}])).values()]}))})].join("\n\n"),n=Date.now(),r=[],s="同一工程组织与生产网络已形成;拟定工况及实际正文待专业评价";a.onReceipt?.("shared-construction-start",{startedAt:n,inputHash:q(m),protocol:"topology-then-phase-details"});let t=0,u=a.planner?async(b,c)=>{let d=await a.planner(b,c);return"string"==typeof d?d:void 0===d?void 0:JSON.stringify(d)}:void 0,w=async(b,c,d,f,g)=>{let h={},i=await (0,e.v7)(c,d,{diagnostics:a.diagnostics,signal:a.signal,callKind:"planning-review",taskKind:"reasoning",temperature:0,schema:f,outFailure:h,validateProtocol:g,onAttempt:c=>{t+=1,a.onReceipt?.(`shared-construction-${b}-attempt-${c.ordinal}`,c)}},u);if(!i)throw Error(`${b}完整尝试及协议失败:${h.value??"未收到可用响应"}`);return i};try{let f=await w("topology","你是施工组织设计主智能体,先固定完整施工活动与接口拓扑。",m,{type:"object",required:["phases","activities"],additionalProperties:!1,properties:{phases:{type:"array",items:{type:"object"}},activities:{type:"array",items:{type:"object"}}}},a=>{try{return z(a,d),[]}catch(a){return[a instanceof Error?a.message:String(a)]}}),g=z(f,d);r=x(f,d.sections.length),a.onReceipt?.("shared-construction-topology",{raw:f});let h=(0,o.i)(j),i=r.map(a=>({phase:a,indices:g.flatMap((b,c)=>b.phaseId===a.id?[c]:[])})).filter(a=>a.indices.length),n=Array(i.length),p=0,q=(await Promise.allSettled(Array.from({length:Math.min(i.length,(0,e.jW)())},async()=>{for(;p<i.length;){let b=p++,c=i[b],e=new Set(d.criteria.filter(a=>a.applicable&&a.sectionId&&c.phase.taskIndices.some(b=>d.sections[b].id===a.sectionId)).flatMap(a=>a.workPackage?.members.map(a=>a.id)??[])),f=h.filter(a=>e.has(a.memberId)),m=["只为本阶段已有活动填写实际工程量用途、拟定产率/班组/设备、必要等待或非生产性活动时长。活动身份、对象、工作面、委派任务和依赖由主控已冻结;不得复制或改变它们,不新造活动。",'只返回{"activities":[{activityIndex,quantity:null或{memberIndices:[原来源index],use:"workload"|"installation"|"procurement"|"pricing"|"measure",unit,reason},production:null或{crewId,crews,productivityPerCrewShift:null或每班组每班产率,unit:null或作业量单位,shiftsPerDay,hoursPerShift,workers:[{trade,countPerCrew}],equipment:[{resourceId,name,spec,countPerCrew,capacityPerMachineShift:null或数值,unit:null或容量的计量单位,basis}],basis},duration:null或{days,basis},waits:[{kind:"approval"|"delivery"|"curing"|"testing"|"handover"|"calendar",days,basis}]}]}。duration.days及等待days均为连续组织的日历日;资料写工作日时须有真实作业日历换算依据,不把工作日直接当日历日。shiftsPerDay表示每日不同人员轮班数,countPerCrew为单班单组人数,不安排同一人员连续承担多个完整班;机械可跨班复用。本阶段activityIndex恰好各返回一次;目录序号不因选源或分阶段重排。',"不同对象、部位、单位或数量用途不得合量。相同作业对象、部位和计量单位的不同规格,只有采用相同施工方法与产率且reason逐项说明工况可比时,才能为工作量计算归组;逐源规格始终保留,不能据此统一设计或采购规格。安装量、采购消耗量、计价量及施工工作量分开;不能把计价小数取整为安装台套。产率、班组、班次、工种与机械须是有工况依据的明确拟定选择,basis说明依据和条件。设计未知保留null,不能填默认定额或平摊人数;施工方拟定班组与产率不需要资料预先给出,应依据实际工法、作业面、搬运距离和设备能力做出明确且可复核的配置选择,不能把可策划的输入全部留null;明确由时长控制的准备、协调、验收活动用duration及依据,仍应在production中保留实际拟配置人员和机具。辅助/检测仪器未声明生产能力时capacityPerMachineShift和unit可以为null;不得为通过协议给仪器虚构产能单位。production.unit是作业量单位(如m3),不重复附加“/班”;每班语义已由productivityPerCrewShift表达。可核施工工作量和安装作业量可按同单位产率计算时长。相同来源、工程对象和部位中不同构件名称不自动禁止同工法作业归量,reason说明共同工法、产率及工况,并保留各源规格;采购/计价/措施数量不得直接转为安装工作量。明确由组织时长控制的临设搭建、测量准备、协调和验收可同时拟定班组/设备,productivityPerCrewShift与unit为null,duration说明实际组织依据。以产率计算的生产活动不同时填duration,不反摊合同天数或调整产率凑工期。",JSON.stringify({projectConstraints:k,dependencyDirectory:g.map((a,b)=>({activityIndex:b,id:a.id,phaseId:a.phaseId,objectScope:a.objectScope}))}),JSON.stringify({phase:c.phase,tasks:l.filter(a=>c.phase.taskIndices.includes(a.taskIndex)),activities:c.indices.map(a=>({activityIndex:a,...g[a]})),quantitySources:f})].join("\n\n"),o={type:"object",required:["activities"],additionalProperties:!1,properties:{activities:{type:"array",minItems:c.indices.length,maxItems:c.indices.length,items:{type:"object"}}}},q=await w(`details-${b}`,"你是施工组织设计主智能体,为已经固定的本阶段活动核定有依据的生产输入。",m,o,a=>{try{return A(a,g,c.indices,r,d,j),[]}catch(a){return[a instanceof Error?a.message:String(a)]}});n[b]=A(q,g,c.indices,r,d,j),a.onReceipt?.(`shared-construction-details-${b}`,{phaseId:c.phase.id,raw:q})}}))).find(a=>"rejected"===a.status);if(q?.status==="rejected")throw q.reason;b=g.map((a,b)=>n.flat().find(b=>b.id===a.id)??(()=>{throw Error(`共同生产计划缺少活动${b}的实际输入`)})());let s={phases:r,activities:b},t=function(a,b,c){let d,e,f=[];try{d=x(a,b.sections.length)}catch(a){f.push(a instanceof Error?a.message:String(a))}if(!d)return f;try{e=(0,o.SZ)(a.activities,d.map(a=>a.id),b.sections.length)}catch(a){f.push(a instanceof Error?a.message:String(a))}if(!e)return f;let g=e.filter(a=>a.taskIndices.some(b=>!d.find(b=>b.id===a.phaseId).taskIndices.includes(b)));if(g.length)return f.push(`活动任务不属于该实际阶段委派:活动「${g.map(a=>a.id).join("、")}」的 taskIndices 必须取自其 phaseId 对应阶段的 taskIndices,不得引用其他阶段或未委派任务`),f;try{(0,o.yP)({contract:b,project:c,phaseIds:d.map(a=>a.id),activities:e})}catch(a){f.push(`生产计划不成立:${a instanceof Error?a.message:String(a)}`)}return f}(s,d,j);if(t.length)throw Error(t.join(";"));a.onReceipt?.("shared-construction-candidate",{raw:s}),c=(0,o.yP)({contract:d,project:j,phaseIds:r.map(a=>a.id),activities:b})}catch(e){if(a.signal?.aborted)throw e;r=[],b=[],c=(0,o.yP)({contract:d,project:j,phaseIds:[],activities:b}),s=`共同工程计划尚未确认:${e instanceof Error?e.message:String(e)};各阶段实际候选与失败已留档,保留全部章节任务,不采用未核控制`}let B=d.sections.map((a,b)=>{let c=r.filter(a=>a.taskIndices.includes(b));return{taskId:a.id,status:c.length?"planned":"unmeasured",phaseIds:c.map(a=>a.id),objectScope:a.responsibility,approach:c.map(a=>a.method).join(";"),handoffs:[...new Set(c.flatMap(a=>a.interfaces))],boundary:a.responsibility}}),C=a.sourcePurposeReviewer||void 0===a.planner?await y({contract:d,project:j,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.sourcePurposeReviewer}):[],D={version:p,contractId:d.id,projectSnapshotId:j.snapshotId,phases:r,tasks:B,production:c,taskSourceReviews:C,review:{status:"unmeasured",reason:s}},E={...D,id:q(D)};return a.onReceipt?.("shared-construction-end",{startedAt:n,elapsedMs:Date.now()-n,attempts:t,status:r.length?"planned":"unmeasured",taskSourceReviewCount:C.length,reason:s,planId:E.id}),E}function C(a,b,c){v(c);let{id:d,...e}=a;if(a.version!==p||q(e)!==d||a.contractId!==b.id||a.projectSnapshotId!==c.snapshotId)throw Error("共同施工组织骨架与当前冻结项目或合同身份不一致");let f=b.sections.map(a=>a.id);if(a.tasks.length!==f.length||new Set(a.tasks.map(a=>a.taskId)).size!==f.length||a.tasks.some(a=>!f.includes(a.taskId)||!["planned","unmeasured"].includes(a.status??"")))throw Error("共同施工组织骨架的任务集合缺项、重复或状态无效");if(a.phases.length&&x({phases:a.phases},b.sections.length),(0,o.SZ)(a.production.inputs,a.phases.map(a=>a.id),b.sections.length),q(a.production.phaseIds)!==q(a.phases.map(a=>a.id))||a.production.inputs.some(b=>b.taskIndices.some(c=>!a.phases.find(a=>a.id===b.phaseId).taskIndices.includes(c))))throw Error("生产网络与实际阶段及任务委派不一致");if((0,o.Q4)(a.production,b,c),"unmeasured"!==a.review.status||!a.review.reason.trim())throw Error("组织候选不能冒充已完成的专业工程复核");let h=["id","version","contractId","projectSnapshotId","phases","tasks","production","taskSourceReviews","review"],i=["taskId","status","phaseIds","objectScope","approach","handoffs","boundary"];if(Reflect.ownKeys(a).some(a=>!h.includes(String(a)))||a.tasks.some(a=>Reflect.ownKeys(a).some(a=>!i.includes(String(a)))))throw Error("组织骨架不能携带旧字段或未经实际工程核定的采用许可");if(!Array.isArray(a.taskSourceReviews))throw Error("共享计划缺少每任务来源用途核定集合");let j=new Set;for(let b of a.taskSourceReviews){if(!b||Reflect.ownKeys(b).some(a=>!["taskId","sourceDictionaryIds","receipt"].includes(String(a)))||j.has(b.taskId)||!f.includes(b.taskId)||!Array.isArray(b.sourceDictionaryIds)||!b.sourceDictionaryIds.length||new Set(b.sourceDictionaryIds).size!==b.sourceDictionaryIds.length)throw Error("任务来源用途核定缺项、重复或身份无效");j.add(b.taskId);let a=b.sourceDictionaryIds.map(a=>[...c.sourceControls??[],...c.facts].find(b=>(0,g.vg)(b)===a));if(a.some(a=>!a))throw Error("任务来源用途核定缺少当前冻结原文");(0,m.lH)(b.receipt,{variants:[],sourceDictionary:a,requiredSourceDictionaryIndices:a.map((a,b)=>b)})}for(let[c,d]of a.tasks.entries()){let e=a.phases.filter(a=>a.taskIndices.includes(c));if(d.taskId!==f[c]||q(d.phaseIds)!==q(e.map(a=>a.id))||d.status!==(e.length?"planned":"unmeasured")||d.approach!==e.map(a=>a.method).join(";")||q(d.handoffs)!==q([...new Set(e.flatMap(a=>a.interfaces))])||d.objectScope!==b.sections[c].responsibility||d.boundary!==b.sections[c].responsibility)throw Error("共享组织委派与实际阶段及冻结任务职责不一致")}}function D(a,b,c){v(b);let{id:d,...e}=a;if(a.version!==p||q(e)!==d||a.projectSnapshotId!==b.snapshotId)throw Error("作者权限底座与当前组织骨架/项目身份不同");if(!a.tasks.some(a=>a.taskId===c))throw Error("作者权限底座没有当前任务");let f=a.taskSourceReviews.find(a=>a.taskId===c);if(!f)return{planId:a.id,taskId:c,sourceCases:[],controls:[]};let h=f.sourceDictionaryIds.map(a=>[...b.sourceControls??[],...b.facts].find(b=>(0,g.vg)(b)===a));if(h.some(a=>!a))throw Error("来源用途核定缺少当前冻结原文");let i=(0,m.lH)(f.receipt,{variants:[],sourceDictionary:h,requiredSourceDictionaryIndices:h.map((a,b)=>b)}).sourceCases.map(a=>{let c=h[a.sourceDictionaryIndex],d=b.sources[c.sourceFile]?.sha256;if(!d)throw Error("来源用途核定引用了未冻结来源文件");return{...a,sourceId:(0,g.vg)(c),sourceFile:c.sourceFile,sourceFingerprint:d,chunkIndex:c.sourceRef?.chunkIndex}});return{planId:a.id,taskId:c,sourceCases:i,controls:[]}}},27939:(a,b,c)=>{c.d(b,{G0:()=>h,HU:()=>f,RM:()=>i,lY:()=>e,n5:()=>g,yD:()=>d});let d="content-first-technical-bid-v1",e=["写成可据以组织施工的技术方案:明确工程对象和部位、施工前提、工序、接口、控制值、岗位、验收与异常处理;定性管理无需凑参数。","正文直接陈述已经核定的技术条件和措施,不写“按设计图例”“图纸要求”“对照清单”,不说明某个工程或工法来自哪个图纸;规范名称与适用版本可在编制依据中正常列明。出处、原句和推导保存在引用审计中。","不得用“以经审批的专项施工方案及设计文件为准,本节不另行设定”等话把本节技术决定推给后续。审批程序可以写,但必须同时说明当前方案的实际方法、参数和控制要求。","直接用于施工的尺寸、标高、深度、规格和配置须按明确对象与部位给出已核定值;不使用“约”“左右”或笼统范围代替控制值。不同部位确有不同值时逐部位说明,不能取范围端点、平均数或统一最大值冒充所有部位的值。","分层厚度、坑底高程、支护桩长与基坑总深度是不同属性。存在多种设计工况时说明适用工况,偏差允许值与合理施工条件区间也须明确用途,不能混成工程实体的未决范围。","有完整依据才能作技术判断。资料冲突或对象关系尚未解决时,在写作前向主智能体提出具体问题,保留内部未决项;不把“待核定”“以文件为准”塞进成稿,也不编造确定值。","每段提供新的工程信息、必要理由或执行动作。删去重复承诺、空泛口号、泛化制度和无实际作用的过渡语,避免各任务重复工程概况;不得为凑字数增加内容。","项目针对性由本节适用的部位、作业条件、工序接口、资源安排、风险和验收关系体现,不以标题新奇或同义改写体现。行业专业标题、术语、工艺的固定名称与同一项目已核定事实可以稳定复用;不得为避开历史文档而改名、删职责、换正确参数或重新编造方案。","每轮依据当前合格资料、已确认方案和冻结职责独立成稿。表达调整须保持对象、条件、因果顺序、控制值和责任接口不变;必要事实或接口承接的重复不是套话,只有不增加有效信息的重复叙述才需要在其实际作用域内处理。","正文不生成封面,封面不属于专业内容评审评分项;目录由系统按实际正文标题统一生成,作者无需编写目录或虚构页码。","本轮以专业内容验收,页数仅用于排版参考,后续投标由人工二次排版;不能为压到50页删去必需技术信息。"],f="本节形成精简、实际、有效且可执行的专业技术方案,工程对象、工况、方法、控制值与职责明确;无重复套话、空话或泛化说明,不以资料出处或未来审批替代当前技术决定。工程实体参数按具体部位核定,笼统约数或范围不能替代施工控制值;不同部位的真实差异与允许偏差应明确其适用条件和用途。项目针对性按本节真实对象、条件及其实施关系判断;标准术语、专业标题和必要事实承接可稳定复用,不以跨文档词面相似度或表述新奇程度判分。";function g(a){let b=[/按设计图例/gu,/(?:按|遵照|依据)?图纸要求/gu,/对照清单/gu,/按(?:照)?(?:施工)?图(?:纸)?(?:要求|施工|实施|设置)?/gu,/(?:以|依据|参照|详见)[^。;\n]{0,60}(?:图|图集|设计文件|专项(?:施工)?方案)[^。;\n]{0,25}(?:为准|执行|实施|施工)/gu,/(?:按|依据|参照)[^。;\n]{0,35}图[^。;\n]{0,20}(?:标注|所示|示出|指定)(?:[^。;\n]{0,10}(?:距离|值|尺寸|做法))?/gu,/以[^。;\n]{0,80}(?:专项施工方案|设计文件)[^。;\n]{0,30}为准[^。;\n]{0,30}(?:本节|本方案)?不另行设定/gu].flatMap(b=>[...a.matchAll(b)].map(a=>({text:a[0],start:a.index,end:a.index+a[0].length}))).sort((a,b)=>b.text.length-a.text.length),c=[];for(let a of b)c.some(b=>a.start<b.end&&a.end>b.start)||c.push(a);return c.sort((a,b)=>a.start-b.start).map(a=>`正文用出处或后续文件替代当前技术决定:${a.text}`)}function h(a){let b=g(a);for(let c of a.split(/[。;\n]/u))/(?:设计|图纸)[^。;]*不(?:一致|符)[^。;]*(?:按|依照|根据)现场实际(?:情况)?施工/u.test(c)&&!/(?:不得|禁止|不能|不可)[^。;]{0,12}(?:按|依照|根据)现场实际/u.test(c)&&b.push("设计与现场不符时不能擅自按现场改变设计施工;须明确停止影响范围、记录差异、处理责任及变更后复核放行条件");return[...new Set(b)]}let i="【从来源到施工决定】来源原句用于识别工程对象、合同责任、条件和约束,不直接粘贴成正文。先判断本节实际需决定的工法、资源、检查或接口,再依据已给事实和工程知识写行动、控制、停止与放行。无需为管理段添加参数或重复检查全项目资料。\n合同说“由总包承担”“按图实施”只说明责任或引用,不等于本节已完成技术决定。把责任落实为本方案的具体动作与接口;真实设计/规格未知只就这个问题查证并交主控,其他可完成内容先成文,未决留任务元数据。\n现场与设计发生差异时,禁止擅自按现场改变设计。例如接口条件不一致:停止该接口的开挖和接驳,记录实测位置、标高及影响范围,由项目技术负责人协调设计处理,取得明确变更后交底、复核并放行。这是异常处置,不能替代正常施工方法,不在无此问题的小节机械复制。\n图件必须承载对应专业信息:工序或接口关系用关系图,场地布置用实际相对位置、设施区域及通行/管线线路的平面示意;图内相对坐标不是现场尺寸。需要测量尺度或真实定位时以已核事实支持,数据缺失进入主控问题,不把流程图冒称真实场地平面图。"},28356:(a,b,c)=>{let d;c.d(b,{Qf:()=>C,rI:()=>ak,bb:()=>ap,v7:()=>ao,_v:()=>ah,CX:()=>ab,jW:()=>I,Sq:()=>P,TO:()=>$,_T:()=>ae,Jx:()=>am});var e=c(95393),f=c(12669),g=c(73024),h=c(76760),i=c(73055);function j(){let a=process.env.AGENT_CASSETTE_DIR;return a||h.join(process.cwd(),"apps","server","test","fixtures","llm")}function k(a){let b="number"==typeof a.stablePrefixChars&&a.stablePrefixChars>0&&a.stablePrefixChars<=a.prompt.length?a.stablePrefixChars:a.prompt.length;return(0,i.c6)(["native-author-prompt-v2",a.model,JSON.stringify(a.params),a.system,a.prompt.slice(0,b)].join("\0"))}function l(a){return h.join(j(),`${a}.json`)}class m extends Error{constructor(a,b){super(`cassette 未命中(${b}):key=${a}。回放模式下未录制即测试失败,不静默回落到真调用。用 AGENT_RECORD=1 重跑以录制,产物落在 ${l(a)}。`),this.key=a,this.mode=b,this.name="CassetteMissError"}}async function n(a){let b="1"===process.env.AGENT_REPLAY?"replay":"1"===process.env.AGENT_RECORD?"record":"off";if("off"===b)return a.invoke();if("replay"===b){let c=function(a){try{let b=JSON.parse(g.readFileSync(l(a),"utf8"));return b?.v===1?b:void 0}catch{return}}(a.key);if(!c)throw new m(a.key,b);return c.response}let c=await a.invoke();try{g.mkdirSync(j(),{recursive:!0});let b={v:1,key:a.key,model:a.model,params:a.params,response:c,recordedAt:Date.now()};g.writeFileSync(l(a.key),JSON.stringify(b,null,2))}catch(a){console.error(`[cassette] 录制落盘失败(不影响生成):${a instanceof Error?a.message:String(a)}`)}return c}var o=c(96770),p=c(81684),q=c(24481),r=c(10059),s=c(79704),t=c(7258),u=c(86282);let v=new Map,w=0,x=new WeakMap,y=0;function z(a){let b=a.reason;return b instanceof Error&&"AbortError"!==b.name?b:void 0===b||b?.name==="AbortError"?Object.assign(Error("用户中止",{cause:b}),{name:"AbortError"}):Error(`LLM调用被外部运行信号终止:${String(b)}`,{cause:b})}function A(a){return"TimeoutError"===a.name?"local_deadline":"AbortError"===a.name?"aborted":"run_cancelled"}function B(a){return"TimeoutError"===a.name?"LOCAL_LLM_DEADLINE":"AbortError"===a.name?"CALL_ABORTED":"RUN_CANCELLED"}function C(a,b){return b.aborted?Promise.reject(z(b)):new Promise((c,d)=>{let e=!1,f=a=>{e||(e=!0,b.removeEventListener("abort",g),a())},g=()=>f(()=>d(z(b)));if(b.addEventListener("abort",g,{once:!0}),b.aborted)return void g();Promise.resolve().then(()=>{if(b.aborted)throw z(b);return a()}).then(a=>f(()=>c(a)),a=>f(()=>d(a)))})}function D(a,b){let c=(0,f.II)(a);if(c)return(0,f.D)(a),b&&(b.llm.lastError=`预算耗尽(${c.kind}):本次调用未发起——${c.message}`),console.error(`[llm] 预算耗尽拒绝调用(${c.kind}):${c.message}`),c}function E(a,b){let c=a.flatMap(a=>a.usage?[a.usage]:[]);if(!c.length)return b;let d=a=>c.reduce((b,c)=>b+(c[a]??0),0),e=a=>c.some(b=>void 0!==b[a])?d(a):void 0;return{promptTokens:d("promptTokens"),completionTokens:d("completionTokens"),promptCacheHitTokens:e("promptCacheHitTokens"),promptCacheMissTokens:e("promptCacheMissTokens"),reasoningTokens:e("reasoningTokens")}}function F(a,b,c,e,g){let h=Math.max(0,g?.promptCacheHitTokens||0),i=Math.max(0,g?.promptTokens||0),j=Math.min(Math.max(0,g?.promptCacheMissTokens??i-h),i),k=g?i+Math.max(0,g.completionTokens||0):0,l=g&&c?function(a,b,c,e=process.env){let f=function(a,b,c=process.env){return function(a=process.env){let b=a.AGENT_COST_PRICES_JSON;if(d&&d.raw===b)return d.table;let{table:c,warning:e}=function(a){let b;if(!a||""===a.trim())return{table:{}};try{b=JSON.parse(a)}catch(a){return{table:{},warning:`AGENT_COST_PRICES_JSON 解析失败,保留未定价状态:${a instanceof Error?a.message:String(a)}`}}if("object"!=typeof b||null===b||Array.isArray(b))return{table:{},warning:'AGENT_COST_PRICES_JSON 顶层必须是对象({"model:kind": {...}}),已忽略'};let c={},d=[];for(let[a,e]of Object.entries(b)){if("object"!=typeof e||null===e){d.push(a);continue}let b=Number(e.inputPerM),f=Number(e.outputPerM);if(!Number.isFinite(b)||!Number.isFinite(f)||b<0||f<0){d.push(a);continue}let g=Number.isFinite(Number(e.cacheHitPerM))&&Number(e.cacheHitPerM)>=0?Number(e.cacheHitPerM):b;c[a]={inputPerM:b,outputPerM:f,cacheHitPerM:g}}return{table:c,warning:d.length>0?`AGENT_COST_PRICES_JSON 中 ${d.length} 项非法已忽略:${d.slice(0,5).join("、")}`:void 0}}(b);return e&&console.warn(`[costModel] ${e}`),d={raw:b,table:c,warning:e},c}(c)[`${a}:${b}`]}(a,b,e);if(f)return function(a,b){let c=Math.max(0,b.inputTokens||0),d=Math.max(0,b.outputTokens||0),e=Math.min(Math.max(0,b.cacheHitTokens||0),c),f=b.cacheMissTokens,g="number"==typeof f&&Number.isFinite(f)?Math.min(Math.max(0,f),Math.max(0,c-e)):Math.max(0,c-e);return(e*a.cacheHitPerM+g*a.inputPerM+d*a.outputPerM)/1e6}(f,c)}(c,e,{inputTokens:g.promptTokens||0,outputTokens:g.completionTokens||0,cacheHitTokens:g.promptCacheHitTokens||0,cacheMissTokens:g.promptCacheMissTokens||0}):void 0,m=(0,f.dn)(a,{tokens:k,costUsd:l,priced:!g||void 0!==l,now:Date.now(),cacheHitTokens:h,cacheMissTokens:j});return m&&b&&(b.llm.lastError=m.message,console.error(`[llm] 预算耗尽:${m.message}`)),m}function G(a){return"reasoning"===a?"reasoning":"chat"}function H(a,b){return new Promise((c,d)=>{if(b?.aborted)return void d(Error("用户中止"));let e=()=>{clearTimeout(f),d(Error("用户中止"))},f=setTimeout(()=>{b?.removeEventListener("abort",e),c()},a);b?.addEventListener("abort",e,{once:!0})})}function I(){let a=(0,u.z)().llmMaxConcurrency;return"number"==typeof a&&Number.isFinite(a)&&a>0?Math.max(1,Math.floor(a)):1/0}let J=[];function K(a){return new Promise((b,c)=>{if(a?.aborted)return void c(z(a));if(w<I()){w+=1,b(L);return}let d={resolve:b,reject:c,settled:!1};J.push(d);let e=()=>{if(d.settled)return;d.settled=!0,d.cleanup?.();let a=J.indexOf(d);a>=0&&J.splice(a,1),c(Error("用户中止"))};if(a){if(a.aborted)return void e();a.addEventListener("abort",e,{once:!0}),d.cleanup=()=>a.removeEventListener("abort",e)}})}function L(){w=Math.max(0,w-1);let a=J.shift();a&&!a.settled&&(a.settled=!0,a.cleanup?.(),w+=1,a.resolve(L))}let M=[],N=null,O=(()=>{let a=Number(process.env.DOCUMENT_PREFIX_SCHEDULE_WINDOW_MS);return Number.isFinite(a)&&a>=0?Math.floor(a):void 0})();function P(){return I()}function Q(a){let b=a instanceof Error?`${a.name} ${a.message}`:String(a);return/connection error|econnrefused|econnreset|fetch failed|network|socket|eai_again|enotfound|etimedout|429|502|503|504|rate ?limit|too many requests|overloaded|服务繁忙|连接失败|abort|timeout|timed ?out|terminated/iu.test(b)}function R(a){if(a instanceof e.IncompleteChatStreamError)return"incomplete_stream";if(a instanceof U)return"tool_protocol_invalid";let b=a instanceof Error?`${a.name} ${a.message}`:String(a),c=[],d=new Set,f=a;for(;f&&"object"==typeof f&&!d.has(f);){d.add(f);let a=f;if("LOCAL_LLM_DEADLINE"===a.code)return"local_deadline";for(let b of[a.name,a.code])"string"==typeof b&&c.push(b);f=a.cause}if(/\babort(ed)?\b|用户中止/iu.test(b)&&!/timeout|timed ?out|terminated/iu.test(b))return"aborted";if(/空响应|empty content/iu.test(b))return"empty_response";let g=a&&"object"==typeof a&&"status"in a?a.status:void 0,h="number"==typeof g&&Number.isInteger(g)?g:Number(b.match(/(?:endpoint error|api error|http\s*(?:status)?)\s*[(:]?\s*(\d{3})\s*\)?/iu)?.[1]);if(Number.isFinite(h)&&h>0){if(408===h)return"provider_timeout";if(429===h||h>=500)return"provider_unavailable";if(h>=400)return W(b)?"context_overflow":"provider_rejected"}return/输出截断|finish_reason\s*=\s*length/iu.test(b)?"output_truncated":W(b)?"context_overflow":/APIConnectionTimeoutError|HeadersTimeoutError|BodyTimeoutError|UND_ERR_(?:HEADERS|BODY|CONNECT)_TIMEOUT|ETIMEDOUT|headers?\s+timeout|body\s+timeout|connect(?:ion)?\s+timeout/iu.test(`${b} ${c.join(" ")}`)?"transport_timeout":/missing field|invalid[_ ]request|tool_call_id|tool_calls|messages\[\d+\]|协议|参数不合法|未授权|鉴权/iu.test(b)?"provider_rejected":/\b429\b|connection error|fetch failed|network|socket|eai_again|enotfound|econnrefused|econnreset|rate ?limit|too many requests|overloaded|bad gateway|gateway timeout|internal server error|service unavailable|服务繁忙|连接失败/iu.test(b)?"provider_unavailable":"unknown_failure"}class S extends Error{constructor(a,b){super(a),this.name="TruncatedContentError",this.partial=b}}function T(a){if("length"!==a.finishReason)return;let b=a.droppedToolCalls?.length?`;实际未解析工具:${a.droppedToolCalls.map(a=>`${a.name??"(无名)"}:${a.reason}`).join(";")}`:"";return`输出截断(供应商明确finish_reason=length);原始返回已保留${b}`}class U extends Error{constructor(a){super(`工具参数协议失败,finish_reason=${a.finishReason??"未报告"};${(a.droppedToolCalls??[]).map(a=>`${a.name??"(无名)"}:${a.reason};参数字符${a.argumentsChars??"未报告"},空白字符${a.whitespaceChars??"未报告"}`).join(";")}。解析失败不能证明供应商输出额度耗尽;完整raw保留,按实际字段纠正。`),this.name="ToolArgumentProtocolError"}}function V(a,b,c){if(!a)return;let d=b instanceof Error?b.message:String(b);a.llm.failures+=1,a.llm.failureStreak=(a.llm.failureStreak||0)+1,a.llm.lastError=d;let e=c??R(b);a.llm.lastFailureKind=e;let f=a.llm.failureKindCounts??={};return f[e]=(f[e]??0)+1,e}function W(a){let b=a instanceof Error?`${a.name} ${a.message}`:String(a);return/maximum context length|context ?length|context ?window|too many tokens|input.{0,24}too long|prompt.{0,24}too long|请求.{0,16}(超长|过长|超出)|上下文.{0,16}(超长|超出|过长|窗口)/iu.test(b)||/400/u.test(b)&&/context|too ?long|token|length|上下文/iu.test(b)||/JSON.{0,10}被截断|JSON.{0,10}未闭合/iu.test(b)}function X(a,b){let c=(0,o.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":/deepseek/iu.test(a)?"deepseek":"openai"}function Y(a){let b=(0,p.c9)(a),c=b.models.active;if(!c)return;let d=b.models.list.find(a=>a.name===c.name&&a.provider===c.provider);if(!d)throw Error("当前选定模型不在模型列表中;本次不会自动选用其他模型");let e=b.providers[d.provider];if(!e)throw Error("当前选定模型的供应商尚未配置;本次不会自动选用其他模型");return{model:{...d,key:JSON.stringify([d.provider,d.name])},provider:e}}function Z(a,b,c){let d=a[b]??={calls:0,failures:0};d.calls+=1,"failure"===c&&(d.failures+=1)}function $(){return!function(){let a=(process.env.DOCUMENT_THINKING_FOR_JUDGES??"").trim().toLowerCase();return"1"===a||"on"===a||"true"===a}()?"structuredGeneration":"reasoning"}function _(a,b,c){if(/^deepseek-(?:v4-pro|flash)$/iu.test(b))return"disabled"===c?{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,reasoningEffort:"reasoning"===a?"high":"low",budgetMode:"relaxed"};if((0,e.isGlm53Model)(b))return{disableThinking:!1,reasoningEffort:"disabled"===c?"low":"enabled"===c||"reasoning"===a?"high":"low",budgetMode:"relaxed",..."disabled"===c?{warning:`当前模型 ${b} 不支持关闭思考,本次使用厂商支持的 low 强度,模型选择保持不变`}:{}};let d=(0,e.thinkingCapabilityForModel)(b);return"disabled"===c?d&&"unsupported"!==d.disable?{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,budgetMode:d?.budgetPolicy==="shared"?"relaxed":"compact",.../gemini-3/iu.test(b)?{reasoningEffort:"low"}:{},warning:`当前模型 ${b} 思考不可关闭(厂商限制),已保留合法思考参数和当前模型选择`}:"enabled"===c?{disableThinking:!1,budgetMode:"structuredGeneration"===a&&d?.budgetPolicy==="shared"?"relaxed":"compact"}:"structuredGeneration"===a&&d?"unsupported"===d.disable?{disableThinking:!1,budgetMode:"shared"===d.budgetPolicy?"relaxed":"compact",.../gemini-3/iu.test(b)?{reasoningEffort:"medium"}:{},warning:`当前模型 ${b} 思考不可关闭(厂商限制),本次保留思考并使用受限输出预算`}:{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,budgetMode:"compact"}}function aa(a){let b=a.at(-1);return b?{requestParameters:a,...void 0!==b.maxTokens?{sentMaxTokens:b.maxTokens}:{},...b.reasoningEffort?{reasoningEffort:b.reasoningEffort}:{},...b.responseFormat?{responseFormat:b.responseFormat}:{}}:{}}function ab(a){return a.filter(a=>!!a).reduce((a,b)=>a+b.length,0)}function ac(a){if(!a)return{};let b=Math.max(0,a.promptTokens||0),c=void 0===a.promptCacheHitTokens?void 0:Math.max(0,a.promptCacheHitTokens),d=void 0===a.promptCacheMissTokens?void 0:Math.min(Math.max(0,a.promptCacheMissTokens),b);return{inputTokens:b,outputTokens:Math.max(0,a.completionTokens||0),...void 0===c?{}:{cacheHitTokens:c},...void 0===d?{}:{cacheMissTokens:d},...void 0===a.reasoningTokens?{}:{reasoningTokens:a.reasoningTokens}}}function ad(a,b){a&&((0,t.iC)(a,b),(a.llm.callLog??=[]).push(b),(0,s.t8)(a,b))}function ae(a,b=5){let c=new Map;for(let b of a??[]){let a=c.get(b.kind)??{kind:b.kind,calls:0,inputChars:0,outputChars:0,toolArgumentsChars:0,ms:0,failed:0,truncated:0};a.calls+=1,a.inputChars+=b.inputChars,a.outputChars+=b.outputChars,a.toolArgumentsChars+=b.toolArgumentsChars??0,a.ms+=b.ms,b.ok||(a.failed+=1),"output_truncated"===b.failureKind&&(a.truncated+=1),c.set(b.kind,a)}return{rows:[...c.values()].sort((a,b)=>b.inputChars-a.inputChars).slice(0,b),unlabeledCalls:c.get("unlabeled")?.calls??0}}function af(a,b){let c=a.llm.callBreakdown??(a.llm.callBreakdown={}),d=b||"(none)";return c[d]??(c[d]={calls:0,inputChars:0,l3Chars:0,cacheHitTokens:0,cacheMissTokens:0})}class ag extends Error{constructor(a){super(a),this.name="ToolProtocolViolationError"}}async function ah(a){return ai(a={...a=(0,q.DQ)(a),signal:a.signal??new AbortController().signal})}async function ai(a){var b;let c,d,g,h,j,l,m=a.signal;if(m.aborted)throw z(m);let o=(b=a.diagnostics,(0,f.Su)(b));if(D(o,a.diagnostics))return;let p=Date.now(),s=0,t=!1,u=0,w=[],x=[],y=0,B=0,I=0,J=a.diagnostics?a.diagnostics.llm.modelHealth??={}:{};try{g=await K(m),I=Date.now()-p;let b=Y(a.diagnostics);if(!b)return void V(a.diagnostics,"MODEL_NOT_CONFIGURED:尚未明确选择模型,本次未发送请求");let{model:f,provider:o}=b;j=f.name,l=f.key,a.diagnostics&&(a.diagnostics.llm.modelChoices??=[]).push({at:Date.now(),chosen:f.name,provider:f.provider,callKind:a.callKind,reason:"使用本轮冻结的用户选定模型;失败不会自动切换模型"});let A=(0,i.c6)({provider:f.provider,model:f.name,baseUrl:o.baseUrl,directEndpoint:o.directEndpoint,protocol:o.protocol,apiKeyHash:o.apiKey?(0,i.c6)(o.apiKey):""}),D=v.get(A);D||(D=(0,e.createProvider)(X(f.provider,o),{baseUrl:o.baseUrl,apiKey:o.apiKey,modelName:f.name,directEndpoint:o.directEndpoint}),v.set(A,D));let E=f.name.toLowerCase();if(a.requiredToolName&&!a.tools.some(b=>b.name===a.requiredToolName))throw Error("指定的提交工具不在当前作者允许的工具中");if((a.requireToolCall||a.requiredToolName)&&D.capabilities?.supportsFunctionCalling===!1)throw Error("当前作者供应商未实现原生工具调用,不能提交冻结作者任务");let F=_(a.taskKind??"structuredGeneration",E,f.thinking);F.warning&&a.diagnostics&&!a.diagnostics.llm.thinkingWarning&&(a.diagnostics.llm.thinkingWarning=F.warning);let G=D.capabilities?.maxOutputTokens,L="number"==typeof G&&Number.isFinite(G)&&G>0?G:1/0,M=(0,e.isGlm53Model)(E)||/deepseek/iu.test(E)&&!F.disableThinking,N=!!(a.requireToolCall&&!M),O=M?void 0:a.requiredToolName,P=(0,q.jW)(a.diagnostics)?void 0===a.maxTokens?void 0:Math.min(a.maxTokens,L):Math.min("relaxed"===F.budgetMode?(a.maxTokens??3200)*6:a.maxTokens??3200,L),R=D.capabilities.supportsStreaming&&!0!==o.directEndpoint,S=a.stablePrefixChars&&a.stablePrefixChars>0?a.stablePrefixChars:void 0,W=k({system:a.system,prompt:a.messages.map(a=>a.content).join("\x01"),stablePrefixChars:S,model:f.name||"unknown",params:{temperature:a.temperature??0,maxTokens:P,stream:R,tools:a.tools,requireToolCall:N,requiredToolName:O??null,provider:f.provider,callKind:a.callKind,endpointHash:(0,i.c6)([o.baseUrl,o.protocol,o.directEndpoint]),disableThinking:F.disableThinking,reasoningEffort:F.reasoningEffort}});a.diagnostics&&(a.diagnostics.llm.calls+=1,a.diagnostics.llm.inputChars=(a.diagnostics.llm.inputChars||0)+a.system.length+a.messages.reduce((a,b)=>a+b.content.length,0));let $=await C(()=>n({key:W,model:f.name||"unknown",params:{temperature:a.temperature??0,maxTokens:P,stream:R},invoke:async()=>{let b;for(let c=0;c<=3;c+=1)try{if(m.aborted)throw z(m);u+=1;let b=Date.now();d=b,w.push({maxTokens:P,...F.reasoningEffort?{reasoningEffort:F.reasoningEffort}:{}});let c=(0,r.bw)({diagnostics:a.diagnostics,kind:a.callKind??"unlabeled",streaming:R,signal:m});x.push(c.receipt);let g=[{role:"system",content:a.system},...a.messages.map(a=>({role:a.role,content:a.content,...a.toolCallId?{toolCallId:a.toolCallId}:{},...a.toolCalls&&a.toolCalls.length>0?{toolCalls:a.toolCalls}:{},...void 0!==a.thinkingContent?{thinkingContent:a.thinkingContent}:{}}))],i={maxRetries:0,temperature:a.temperature??0,maxTokens:P,signal:m,disableThinking:F.disableThinking,reasoningEffort:F.reasoningEffort,tools:a.tools,...O?{extraBody:{tool_choice:{type:"function",function:{name:O}}}}:N?{extraBody:{tool_choice:"required"}}:{}};try{return await C(()=>c.run(()=>R?D.chatStream(g,c.onChunk,i):D.chat(g,i)),m)}catch(b){if(b instanceof e.IncompleteChatStreamError){let c=b.partialResponse;h=c.usage,s=c.content.length;let d=c.vendorExtensions?.rawToolCalls;Array.isArray(d)&&(B=d.reduce((a,b)=>a+("string"==typeof b?.arguments?b.arguments.length:0),0)),a.onRawResponse?.({content:b.partialResponse.content,toolCalls:[],rawContent:b.partialResponse.content,rawToolCalls:b.partialResponse.vendorExtensions?.rawToolCalls,droppedToolCalls:b.partialResponse.droppedToolCalls,...void 0===b.partialResponse.thinkingContent?{}:{thinkingContent:b.partialResponse.thinkingContent},requestMetadata:{maxTokens:P,...Number.isFinite(L)?{outputCap:L}:{},requireToolCall:a.requireToolCall??!1,disableThinking:F.disableThinking,...a.requiredToolName?{requiredToolName:a.requiredToolName}:{}},responseMetadata:{model:f.name,provider:f.provider,completed:!1,finishReason:b.partialResponse.finishReason??null,usage:b.partialResponse.usage??null,usageStatus:b.partialResponse.usage?"reported":"unreported",protocolFailure:"incomplete-stream"}})}throw b}finally{y+=Date.now()-b,d=void 0}}catch(e){if(b=e,m.aborted)throw z(m);if(!Q(e)||c>=3)throw e;let d=Math.min(3e4,1200*2**c)+Math.floor(400*Math.random());a.diagnostics&&(a.diagnostics.llm.retries+=1,a.diagnostics.llm.lastError=`工具循环瞬态错误退避 ${Math.round(d/1e3)}s(第 ${c+1} 次):${e instanceof Error?e.message:String(e)}`),await H(d,m)}throw b instanceof Error?b:Error(String(b))}}),m);x.length||(0,r.xC)(a.diagnostics,$.usage),h=$.usage?{promptTokens:$.usage.promptTokens,completionTokens:$.usage.completionTokens,promptCacheHitTokens:$.usage.promptCacheHitTokens,promptCacheMissTokens:$.usage.promptCacheMissTokens}:void 0,j=f.name;let aa=$.content?.trim()??"",ab=T($),ac=!!$.droppedToolCalls?.length,ad=ab?"output_truncated":ac?"tool_protocol_invalid":void 0;ad&&V(a.diagnostics,ab??new U($),ad);let ae=($.toolCalls||[]).map((a,b)=>({id:a.id||`call-${b}`,name:a.name,arguments:"string"==typeof a.arguments?a.arguments:JSON.stringify(a.arguments??{})})),af=$.vendorExtensions?.rawToolCalls;B=Array.isArray(af)?af.reduce((a,b)=>a+("string"==typeof b?.arguments?b.arguments.length:0),0):ae.reduce((a,b)=>a+b.arguments.length,0);let ah={content:aa,toolCalls:ae,...void 0!==$.thinkingContent?{thinkingContent:$.thinkingContent}:{},rawContent:$.content??"",rawToolCalls:$.vendorExtensions?.rawToolCalls,requestMetadata:{maxTokens:P,...Number.isFinite(L)?{outputCap:L}:{},requireToolCall:a.requireToolCall??!1,disableThinking:F.disableThinking,...a.requiredToolName?{requiredToolName:a.requiredToolName}:{}},droppedToolCalls:$.droppedToolCalls,responseMetadata:{model:f.name,provider:f.provider,completed:!ad,finishReason:$.finishReason??null,usage:$.usage??null,usageStatus:$.usage?"reported":"unreported",...ad?{protocolFailure:ab?"output-truncated":"invalid-tool-arguments"}:{}}};if(a.onRawResponse?.(ah),!ad&&(ae.some(b=>!a.tools.some(a=>a.name===b.name))||a.requireToolCall&&0===ae.length||a.requiredToolName&&(0===ae.length||ae.some(b=>b.name!==a.requiredToolName))))throw new ag(`供应商未遵守当前工具协议:要求${a.requiredToolName??(a.requireToolCall?"实际工具调用":"声明内工具")},实际返回${ae.map(a=>a.name).join("、")||"普通文本或空返回"};原响应已保留,未执行越界工具`);if(!aa&&0===ae.length){ad||V(a.diagnostics,"空响应(工具路径:模型既无正文也无工具调用)"),c=ad??"empty_response",l&&Z(J,l,"failure");return}return t=!ad,ad&&(c=ad),s=aa.length,l&&Z(J,l,ad?"failure":"ok"),ah}catch(e){let b=m.aborted?z(m):e;l&&!m.aborted&&Z(J,l,"failure");let d=m.aborted&&b instanceof Error?A(b):void 0;throw b instanceof Error&&"AbortError"===b.name||V(a.diagnostics,b,d),c=d??R(b),b}finally{g||(I=Date.now()-p),g?.(),F(o,a.diagnostics,j,G(a.taskKind),E(x,h)),ad(a.diagnostics,{at:p,kind:a.callKind??"unlabeled",inputChars:a.system.length+a.messages.reduce((a,b)=>a+b.content.length,0),outputChars:s,providerAttempts:u,toolArgumentsChars:B,toolSchemaChars:JSON.stringify(a.tools).length,slotWaitMs:I,providerMs:y+(void 0===d?0:Date.now()-d),launchWaitMs:0,ms:Date.now()-p,ok:t,...ac(E(x,h)),...c?{failureKind:c}:{},...a.maxTokens?{maxTokens:a.maxTokens}:{},...aa(w),...x.length?{transportActivities:x.map(a=>({...a}))}:{},inputThinkingChars:a.messages.reduce((a,b)=>a+(b.thinkingContent?.length??0),0),inputToolArgumentsChars:a.messages.reduce((a,b)=>a+(b.toolCalls??[]).reduce((a,b)=>a+b.arguments.length,0),0)})}}function aj(a,b,c,d){a&&Object.assign(a,{value:b,code:c,performed:d})}async function ak(a,b,c=!1,d={}){var g;let h,j,l,m,o,p;(d=(0,q.DQ)(d)).outFailure&&(delete d.outFailure.value,delete d.outFailure.code,delete d.outFailure.performed,delete d.outFailure.outputTruncated);let t=(g=d.diagnostics,(0,f.Su)(g)),u=D(t,d.diagnostics);if(u)return void aj(d.outFailure,`预算耗尽(${u.kind}):本次调用未发起——${u.message}`,"BUDGET_REFUSED",!1);d={...d,signal:d.signal??new AbortController().signal};let I=[],J=Date.now(),L=0,P=!1,R=0,U=0,W=0,$=[];if(d.diagnostics){d.diagnostics.llm.calls+=1,d.diagnostics.llm.inputChars=(d.diagnostics.llm.inputChars||0)+a.length+b.length;let c=af(d.diagnostics,d.prefixKey);if(c.calls+=1,c.inputChars+=a.length+b.length,c.l3Chars+=d.contextLayers?.l3||0,d.contextLayers){let a=d.diagnostics.llm.layerChars??(d.diagnostics.llm.layerChars={l0:0,l1:0,l2:0,l3:0});a.l0+=d.contextLayers.l0||0,a.l1+=d.contextLayers.l1||0,a.l2+=d.contextLayers.l2||0,a.l3+=d.contextLayers.l3||0}else d.diagnostics.llm.unlayeredChars=(d.diagnostics.llm.unlayeredChars||0)+a.length+b.length}let ab=0,ae=d.diagnostics?d.diagnostics.llm.modelHealth??={}:{};try{let f;l=await K(d.signal),ab=Date.now()-J,d.diagnostics&&(d.diagnostics.llm.maxActive=Math.max(d.diagnostics.llm.maxActive,w));let g=Y(d.diagnostics);if(!g){let a="MODEL_NOT_CONFIGURED:尚未明确选择模型,本次未发送请求";aj(d.outFailure,a,"MODEL_NOT_CONFIGURED",!1),h=V(d.diagnostics,a);return}let{model:t,provider:u}=g;p=t.key,d.outModel&&(d.outModel.value=t.key),d.diagnostics&&(d.diagnostics.llm.modelChoices??=[]).push({at:Date.now(),chosen:t.name,provider:t.provider,callKind:d.callKind,reason:"使用本轮冻结的用户选定模型;失败不会自动切换模型"});let A=(0,i.c6)({provider:t.provider,model:t.name,baseUrl:u.baseUrl,directEndpoint:u.directEndpoint,protocol:u.protocol,apiKeyHash:u.apiKey?(0,i.c6)(u.apiKey):""}),B=v.get(A);if(B||(B=(0,e.createProvider)(X(t.provider,u),{baseUrl:u.baseUrl,apiKey:u.apiKey,modelName:t.name,directEndpoint:u.directEndpoint}),v.set(A,B)),d.files?.length&&(B.capabilities?.supportsVision!==!0||"function"!=typeof B.understandFiles)){let a="当前选定模型没有实际图像理解能力;该图像复核未测量,未发送图像,也未自动切换模型或降为纯文本假称已核准";aj(d.outFailure,a,"VISION_UNAVAILABLE",!1),h=V(d.diagnostics,a);return}let D=t.name.toLowerCase(),E=_(d.taskKind??"structuredGeneration",D,t.thinking);E.warning&&d.diagnostics&&!d.diagnostics.llm.thinkingWarning&&(d.diagnostics.llm.thinkingWarning=E.warning);let F=B.capabilities?.maxOutputTokens,G="number"==typeof F&&Number.isFinite(F)&&F>0?F:1/0,aa=function(a){if((0,q.jW)(a.diagnostics))return;if(!a.maxTokens)return a.maxTokens;let b="total"===a.outputBudget;return"relaxed"!==a.decision.budgetMode||b?b?Math.min(a.maxTokens,a.outputCap):a.maxTokens:Math.min(Math.ceil(6*a.maxTokens),a.outputCap)}({decision:E,maxTokens:d.maxTokens,outputBudget:d.outputBudget,outputCap:G,diagnostics:d.diagnostics}),ac=(0,e.isGlm53Model)(D)&&c?{type:"json_object"}:void 0,ad=!d.files?.length&&B.capabilities.supportsStreaming&&!0!==u.directEndpoint,ag=Symbol("empty-content"),ah=async(e,f=!1)=>{var g;if(d.signal?.aborted)throw Error("用户中止");let l=(g=d.diagnostics)?x.get(g)??0:y,p=l<3?0:l<6?2e4:l<10?45e3:6e4;if(p>0){let a=p+Math.floor(5e3*Math.random());d.diagnostics&&(d.diagnostics.llm.emptyStormWaits=(d.diagnostics.llm.emptyStormWaits||0)+1,d.diagnostics.llm.lastInfo=`空响应风暴长退避 ${Math.round(a/1e3)}s(连续空响应 ${l} 次)`),await H(a,d.signal)}let q=d.signal,s=d.prefixKey||(0,i.c6)(`${a}
110
- ${b.slice(0,2e3)}`),v=k({system:a,prompt:b,stablePrefixChars:!d.files?.length&&(d.contextLayers?.l3||0)>0&&(d.contextLayers.l3||0)<b.length?b.length-(d.contextLayers.l3||0):void 0,model:t.name||"unknown",params:{temperature:d.temperature??0,maxTokens:e,jsonOnly:c,stream:ad,disableThinking:E.disableThinking,reasoningEffort:E.reasoningEffort,...ac?{responseFormat:ac}:{},provider:t.provider,callKind:d.callKind,endpointHash:(0,i.c6)([u.baseUrl,u.protocol,u.directEndpoint]),files:d.files?.map(a=>({name:a.name,mimeType:a.mimeType,hash:(0,i.c6)(a.data.toString("base64"))}))}}),z=await C(()=>n({key:v,model:t.name||"unknown",params:{temperature:d.temperature??0,maxTokens:e,jsonOnly:c,stream:ad,disableThinking:E.disableThinking,...ac?{responseFormat:ac}:{},provider:t.provider,callKind:d.callKind,endpointHash:(0,i.c6)([u.baseUrl,u.protocol,u.directEndpoint])},invoke:()=>new Promise((g,h)=>{let i=Date.now();!function(a,b){var c;let d=(c=w,void 0!==O?O:c>=16?500:120);if(d<=0)return b();M.push({fingerprint:a,launch:b}),N||(N=setTimeout(()=>{N=null;let a=M;M=[],function(a){for(let b of[...a].sort((a,b)=>a.fingerprint<b.fingerprint?-1:+(a.fingerprint>b.fingerprint)))try{b.launch()}catch(a){console.error("[llm] 调度发射单条异常:",a)}}(a)},d))}(s,()=>{if(W+=Date.now()-i,d.signal?.aborted)return void h(Error("用户中止"));let k=Date.now();j=k,R+=1,$.push({maxTokens:e,...E.reasoningEffort?{reasoningEffort:E.reasoningEffort}:{},...ac?{responseFormat:ac.type}:{}});let l=(0,r.bw)({diagnostics:d.diagnostics,kind:d.callKind??"unlabeled",streaming:ad,signal:q});I.push(l.receipt);let m=[{role:"system",content:c?`${a}
111
+ 【sourceDictionary】${JSON.stringify(i)}`,k=a.reviewer?async(b,c)=>{let d=await a.reviewer(b,c);return"string"==typeof d?d:void 0===d?void 0:JSON.stringify(d)}:void 0,l=await (0,e.v7)("你是独立来源用途评审者。只对给定任务将实际引用的完整原文逐条核定来源用途、版本用途域与适用性;不新增事实、不授予采用许可、不检查未提供的资料。",j,{diagnostics:a.diagnostics,signal:a.signal,callKind:"planning-review",taskKind:(0,e.TO)(),temperature:0,maxTokens:Math.max(4e3,Math.ceil(.6*JSON.stringify(i).length)),schema:(0,m.q1)([],h),validateProtocol:b=>{try{let c=(0,m.lH)(b,{variants:[],sourceDictionary:d,requiredSourceDictionaryIndices:h});return u(a.project,c,{sourceDictionary:d,facts:[],variants:[]}),[]}catch(a){return[a instanceof Error?a.message:String(a)]}}},k);if(!l)continue;let n=(0,m.lH)(l,{variants:[],sourceDictionary:d,requiredSourceDictionaryIndices:h});u(a.project,n,{sourceDictionary:d,facts:[],variants:[]}),f[b]={sourceDictionaryIds:d.map(a=>(0,g.vg)(a)),receipt:n,taskIds:[...c.taskIds]}}catch(b){if(a.signal?.aborted)throw b}}})),f.filter(Boolean).flatMap(a=>a.taskIds.map(b=>({taskId:b,sourceDictionaryIds:a.sourceDictionaryIds,receipt:a.receipt})))}function z(a,b){let c=x(a,b.sections.length),d=a.activities;if(!Array.isArray(d)||d.some(a=>!a||"object"!=typeof a||Reflect.ownKeys(a).some(a=>!["id","phaseId","objectScope","workfront","taskIndices","predecessors"].includes(String(a)))))throw Error("施工拓扑只允许完整活动身份、对象、工作面、任务和依赖;生产输入在分阶段详情填写");let e=(0,o.SZ)(d.map(a=>({...a,quantity:null,production:null,duration:null,waits:[]})),c.map(a=>a.id),b.sections.length);for(let a of e)if(a.taskIndices.some(b=>!c.find(b=>b.id===a.phaseId).taskIndices.includes(b)))throw Error("拓扑活动任务不属于已声明阶段");let f=new Set,g=new Set,h=a=>{if(f.has(a))throw Error("施工活动依赖成环,不能进入分阶段生产核定");if(!g.has(a)){for(let b of(f.add(a),e.find(b=>b.id===a).predecessors))h(b.activityId);f.delete(a),g.add(a)}};return e.forEach(a=>h(a.id)),e.map(({id:a,phaseId:b,objectScope:c,workfront:d,taskIndices:e,predecessors:f})=>({id:a,phaseId:b,objectScope:c,workfront:d,taskIndices:e,predecessors:f}))}function A(a,b,c,d,e,f){if(!a||"object"!=typeof a||Reflect.ownKeys(a).some(a=>"activities"!==a)||!Array.isArray(a.activities))throw Error("阶段生产详情仅返回activities");let g=a.activities;if(g.length!==c.length||new Set(g.map(a=>a?.activityIndex)).size!==c.length||g.some(a=>!a||!c.includes(Number(a.activityIndex))||!Number.isSafeInteger(a.activityIndex)||Reflect.ownKeys(a).some(a=>!["activityIndex","quantity","production","duration","waits"].includes(String(a)))))throw Error("阶段详情含重复、缺失、越域活动或擅改冻结拓扑");let h=new Map(g.map(({activityIndex:a,...b})=>[Number(a),b])),i=(0,o.SZ)(b.map((a,b)=>({...a,...h.get(b)??{quantity:null,production:null,duration:null,waits:[]}})),d.map(a=>a.id),e.sections.length);return(0,o.yP)({contract:e,project:f,phaseIds:d.map(a=>a.id),activities:i}),c.map(a=>i[a])}async function B(a){let b,c,{contract:d,project:j}=a;if(v(j),d.projectSnapshotId!==j.snapshotId)throw Error("共享施工计划与项目合同不一致");let k=[...new Map(d.sections.flatMap(a=>(0,f.tb)(j,a)).filter(h.j).map(a=>[(0,g.vg)(a),a])).values()],l=d.sections.map((a,b)=>({taskIndex:b,title:a.title,responsibility:a.responsibility})),m=[(0,i.V2)(d.writingKnowledge?.projectType),"先形成全体作者共用的完整施工阶段与活动依赖网络;本次只写专业拓扑,资源、产率、数量和时长在冻结拓扑之后按阶段独立填写,不在一个巨型JSON里同时输出。不得漏工作范围或为缩短响应合并不同对象和工况。","阶段按真实对象、工作面和移交条件安排,不套固定五阶段。方法和接口是当前工程决定,不能猜设计参数或用按图、后续审批代替。实际楼层、区段与阶段名称可正常表述;数值引用仍须对应真实来源,工程生产输入单独结构化登记,拓扑文本不授予数值事实或采用资格。",'只返回{"phases":[{id,scope,method,predecessors:[],releaseCondition,interfaces:[],taskIndices:[]}],"activities":[{id,phaseId,objectScope,workfront,taskIndices:[],predecessors:[{activityId,relation:"finish-start"或"start-start",lagDays:0}]}]}。本次activities不含quantity/production/duration/waits。活动ID和跨阶段依赖一次确定,后续不得换活动、任务或依赖。真实等待仅以明确有依据的依赖lagDays登记,不编未知等待数。',"每个活动的taskIndices必须属于对应阶段。完整承担方法、资源、管理、资料、验收和交接职责,全部作者任务必须有实际施工/管理活动承接;不得把所有任务机械挂到每个活动。施工依赖不代表作者串行写作。",JSON.stringify({tasks:l,projectConstraints:k,workPackageDirectory:(j.workPackages??[]).map(a=>({name:a.name,memberCount:a.members?.length??0,objects:[...new Map((a.members??[]).map(({entry:a})=>[JSON.stringify([a.name,a.section,a.subsection]),{name:a.name,scope:a.section,part:a.subsection}])).values()]}))})].join("\n\n"),n=Date.now(),r=[],s="同一工程组织与生产网络已形成;拟定工况及实际正文待专业评价";a.onReceipt?.("shared-construction-start",{startedAt:n,inputHash:q(m),protocol:"topology-then-phase-details"});let t=0,u=a.planner?async(b,c)=>{let d=await a.planner(b,c);return"string"==typeof d?d:void 0===d?void 0:JSON.stringify(d)}:void 0,w=async(b,c,d,f,g)=>{let h={},i=await (0,e.v7)(c,d,{diagnostics:a.diagnostics,signal:a.signal,callKind:"planning-review",taskKind:"reasoning",temperature:0,schema:f,outFailure:h,validateProtocol:g,onAttempt:c=>{t+=1,a.onReceipt?.(`shared-construction-${b}-attempt-${c.ordinal}`,c)}},u);if(!i)throw Error(`${b}完整尝试及协议失败:${h.value??"未收到可用响应"}`);return i};try{let f=await w("topology","你是施工组织设计主智能体,先固定完整施工活动与接口拓扑。",m,{type:"object",required:["phases","activities"],additionalProperties:!1,properties:{phases:{type:"array",items:{type:"object"}},activities:{type:"array",items:{type:"object"}}}},a=>{try{return z(a,d),[]}catch(a){return[a instanceof Error?a.message:String(a)]}}),g=z(f,d);r=x(f,d.sections.length),a.onReceipt?.("shared-construction-topology",{raw:f});let h=(0,o.i)(j),i=r.map(a=>({phase:a,indices:g.flatMap((b,c)=>b.phaseId===a.id?[c]:[])})).filter(a=>a.indices.length),n=Array(i.length),p=0,q=(await Promise.allSettled(Array.from({length:Math.min(i.length,(0,e.jW)())},async()=>{for(;p<i.length;){let b=p++,c=i[b],e=new Set(d.criteria.filter(a=>a.applicable&&a.sectionId&&c.phase.taskIndices.some(b=>d.sections[b].id===a.sectionId)).flatMap(a=>a.workPackage?.members.map(a=>a.id)??[])),f=h.filter(a=>e.has(a.memberId)),m=["只为本阶段已有活动填写实际工程量用途、拟定产率/班组/设备、必要等待或非生产性活动时长。活动身份、对象、工作面、委派任务和依赖由主控已冻结;不得复制或改变它们,不新造活动。",'只返回{"activities":[{activityIndex,quantity:null或{memberIndices:[原来源index],use:"workload"|"installation"|"procurement"|"pricing"|"measure",unit,reason},production:null或{crewId,crews,productivityPerCrewShift:null或每班组每班产率,unit:null或作业量单位,shiftsPerDay,hoursPerShift,workers:[{trade,countPerCrew}],equipment:[{resourceId,name,spec,countPerCrew,capacityPerMachineShift:null或数值,unit:null或容量的计量单位,basis}],basis},duration:null或{days,basis},waits:[{kind:"approval"|"delivery"|"curing"|"testing"|"handover"|"calendar",days,basis}]}]}。duration.days及等待days均为连续组织的日历日;资料写工作日时须有真实作业日历换算依据,不把工作日直接当日历日。shiftsPerDay表示每日不同人员轮班数,countPerCrew为单班单组人数,不安排同一人员连续承担多个完整班;机械可跨班复用。本阶段activityIndex恰好各返回一次;目录序号不因选源或分阶段重排。',"不同对象、部位、单位或数量用途不得合量。相同作业对象、部位和计量单位的不同规格,只有采用相同施工方法与产率且reason逐项说明工况可比时,才能为工作量计算归组;逐源规格始终保留,不能据此统一设计或采购规格。安装量、采购消耗量、计价量及施工工作量分开;不能把计价小数取整为安装台套。产率、班组、班次、工种与机械须是有工况依据的明确拟定选择,basis说明依据和条件。设计未知保留null,不能填默认定额或平摊人数;施工方拟定班组与产率不需要资料预先给出,应依据实际工法、作业面、搬运距离和设备能力做出明确且可复核的配置选择,不能把可策划的输入全部留null;明确由时长控制的准备、协调、验收活动用duration及依据,仍应在production中保留实际拟配置人员和机具。辅助/检测仪器未声明生产能力时capacityPerMachineShift和unit可以为null;不得为通过协议给仪器虚构产能单位。production.unit是作业量单位(如m3),不重复附加“/班”;每班语义已由productivityPerCrewShift表达。可核施工工作量和安装作业量可按同单位产率计算时长。相同来源、工程对象和部位中不同构件名称不自动禁止同工法作业归量,reason说明共同工法、产率及工况,并保留各源规格;采购/计价/措施数量不得直接转为安装工作量。明确由组织时长控制的临设搭建、测量准备、协调和验收可同时拟定班组/设备,productivityPerCrewShift与unit为null,duration说明实际组织依据。以产率计算的生产活动不同时填duration,不反摊合同天数或调整产率凑工期。",JSON.stringify({projectConstraints:k,dependencyDirectory:g.map((a,b)=>({activityIndex:b,id:a.id,phaseId:a.phaseId,objectScope:a.objectScope}))}),JSON.stringify({phase:c.phase,tasks:l.filter(a=>c.phase.taskIndices.includes(a.taskIndex)),activities:c.indices.map(a=>({activityIndex:a,...g[a]})),quantitySources:f})].join("\n\n"),o={type:"object",required:["activities"],additionalProperties:!1,properties:{activities:{type:"array",minItems:c.indices.length,maxItems:c.indices.length,items:{type:"object"}}}},q=await w(`details-${b}`,"你是施工组织设计主智能体,为已经固定的本阶段活动核定有依据的生产输入。",m,o,a=>{try{return A(a,g,c.indices,r,d,j),[]}catch(a){return[a instanceof Error?a.message:String(a)]}});n[b]=A(q,g,c.indices,r,d,j),a.onReceipt?.(`shared-construction-details-${b}`,{phaseId:c.phase.id,raw:q})}}))).find(a=>"rejected"===a.status);if(q?.status==="rejected")throw q.reason;b=g.map((a,b)=>n.flat().find(b=>b.id===a.id)??(()=>{throw Error(`共同生产计划缺少活动${b}的实际输入`)})());let s={phases:r,activities:b},t=function(a,b,c){let d,e,f=[];try{d=x(a,b.sections.length)}catch(a){f.push(a instanceof Error?a.message:String(a))}if(!d)return f;try{e=(0,o.SZ)(a.activities,d.map(a=>a.id),b.sections.length)}catch(a){f.push(a instanceof Error?a.message:String(a))}if(!e)return f;let g=e.filter(a=>a.taskIndices.some(b=>!d.find(b=>b.id===a.phaseId).taskIndices.includes(b)));if(g.length)return f.push(`活动任务不属于该实际阶段委派:活动「${g.map(a=>a.id).join("、")}」的 taskIndices 必须取自其 phaseId 对应阶段的 taskIndices,不得引用其他阶段或未委派任务`),f;try{(0,o.yP)({contract:b,project:c,phaseIds:d.map(a=>a.id),activities:e})}catch(a){f.push(`生产计划不成立:${a instanceof Error?a.message:String(a)}`)}return f}(s,d,j);if(t.length)throw Error(t.join(";"));a.onReceipt?.("shared-construction-candidate",{raw:s}),c=(0,o.yP)({contract:d,project:j,phaseIds:r.map(a=>a.id),activities:b})}catch(e){if(a.signal?.aborted)throw e;r=[],b=[],c=(0,o.yP)({contract:d,project:j,phaseIds:[],activities:b}),s=`共同工程计划尚未确认:${e instanceof Error?e.message:String(e)};各阶段实际候选与失败已留档,保留全部章节任务,不采用未核控制`}let B=d.sections.map((a,b)=>{let c=r.filter(a=>a.taskIndices.includes(b));return{taskId:a.id,status:c.length?"planned":"unmeasured",phaseIds:c.map(a=>a.id),objectScope:a.responsibility,approach:c.map(a=>a.method).join(";"),handoffs:[...new Set(c.flatMap(a=>a.interfaces))],boundary:a.responsibility}}),C=a.sourcePurposeReviewer||void 0===a.planner?await y({contract:d,project:j,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.sourcePurposeReviewer}):[],D={version:p,contractId:d.id,projectSnapshotId:j.snapshotId,phases:r,tasks:B,production:c,taskSourceReviews:C,review:{status:"unmeasured",reason:s}},E={...D,id:q(D)};return a.onReceipt?.("shared-construction-end",{startedAt:n,elapsedMs:Date.now()-n,attempts:t,status:r.length?"planned":"unmeasured",taskSourceReviewCount:C.length,reason:s,planId:E.id}),E}function C(a,b,c){v(c);let{id:d,...e}=a;if(a.version!==p||q(e)!==d||a.contractId!==b.id||a.projectSnapshotId!==c.snapshotId)throw Error("共同施工组织骨架与当前冻结项目或合同身份不一致");let f=b.sections.map(a=>a.id);if(a.tasks.length!==f.length||new Set(a.tasks.map(a=>a.taskId)).size!==f.length||a.tasks.some(a=>!f.includes(a.taskId)||!["planned","unmeasured"].includes(a.status??"")))throw Error("共同施工组织骨架的任务集合缺项、重复或状态无效");if(a.phases.length&&x({phases:a.phases},b.sections.length),(0,o.SZ)(a.production.inputs,a.phases.map(a=>a.id),b.sections.length),q(a.production.phaseIds)!==q(a.phases.map(a=>a.id))||a.production.inputs.some(b=>b.taskIndices.some(c=>!a.phases.find(a=>a.id===b.phaseId).taskIndices.includes(c))))throw Error("生产网络与实际阶段及任务委派不一致");if((0,o.Q4)(a.production,b,c),"unmeasured"!==a.review.status||!a.review.reason.trim())throw Error("组织候选不能冒充已完成的专业工程复核");let h=["id","version","contractId","projectSnapshotId","phases","tasks","production","taskSourceReviews","review"],i=["taskId","status","phaseIds","objectScope","approach","handoffs","boundary"];if(Reflect.ownKeys(a).some(a=>!h.includes(String(a)))||a.tasks.some(a=>Reflect.ownKeys(a).some(a=>!i.includes(String(a)))))throw Error("组织骨架不能携带旧字段或未经实际工程核定的采用许可");if(!Array.isArray(a.taskSourceReviews))throw Error("共享计划缺少每任务来源用途核定集合");let j=new Set;for(let b of a.taskSourceReviews){if(!b||Reflect.ownKeys(b).some(a=>!["taskId","sourceDictionaryIds","receipt"].includes(String(a)))||j.has(b.taskId)||!f.includes(b.taskId)||!Array.isArray(b.sourceDictionaryIds)||!b.sourceDictionaryIds.length||new Set(b.sourceDictionaryIds).size!==b.sourceDictionaryIds.length)throw Error("任务来源用途核定缺项、重复或身份无效");j.add(b.taskId);let a=b.sourceDictionaryIds.map(a=>[...c.sourceControls??[],...c.facts].find(b=>(0,g.vg)(b)===a));if(a.some(a=>!a))throw Error("任务来源用途核定缺少当前冻结原文");(0,m.lH)(b.receipt,{variants:[],sourceDictionary:a,requiredSourceDictionaryIndices:a.map((a,b)=>b)})}for(let[c,d]of a.tasks.entries()){let e=a.phases.filter(a=>a.taskIndices.includes(c));if(d.taskId!==f[c]||q(d.phaseIds)!==q(e.map(a=>a.id))||d.status!==(e.length?"planned":"unmeasured")||d.approach!==e.map(a=>a.method).join(";")||q(d.handoffs)!==q([...new Set(e.flatMap(a=>a.interfaces))])||d.objectScope!==b.sections[c].responsibility||d.boundary!==b.sections[c].responsibility)throw Error("共享组织委派与实际阶段及冻结任务职责不一致")}}function D(a,b,c){v(b);let{id:d,...e}=a;if(a.version!==p||q(e)!==d||a.projectSnapshotId!==b.snapshotId)throw Error("作者权限底座与当前组织骨架/项目身份不同");if(!a.tasks.some(a=>a.taskId===c))throw Error("作者权限底座没有当前任务");let f=a.taskSourceReviews.find(a=>a.taskId===c);if(!f)return{planId:a.id,taskId:c,sourceCases:[],controls:[]};let h=f.sourceDictionaryIds.map(a=>[...b.sourceControls??[],...b.facts].find(b=>(0,g.vg)(b)===a));if(h.some(a=>!a))throw Error("来源用途核定缺少当前冻结原文");let i=(0,m.lH)(f.receipt,{variants:[],sourceDictionary:h,requiredSourceDictionaryIndices:h.map((a,b)=>b)}).sourceCases.map(a=>{let c=h[a.sourceDictionaryIndex],d=b.sources[c.sourceFile]?.sha256;if(!d)throw Error("来源用途核定引用了未冻结来源文件");return{...a,sourceId:(0,g.vg)(c),sourceFile:c.sourceFile,sourceFingerprint:d,chunkIndex:c.sourceRef?.chunkIndex}});return{planId:a.id,taskId:c,sourceCases:i,controls:[]}}},27939:(a,b,c)=>{c.d(b,{G0:()=>h,HU:()=>f,RM:()=>i,lY:()=>e,n5:()=>g,yD:()=>d});let d="content-first-technical-bid-v1",e=["写成可据以组织施工的技术方案:明确工程对象和部位、施工前提、工序、接口、控制值、岗位、验收与异常处理;定性管理无需凑参数。","正文直接陈述已经核定的技术条件和措施,不写“按设计图例”“图纸要求”“对照清单”,不说明某个工程或工法来自哪个图纸;规范名称与适用版本可在编制依据中正常列明。出处、原句和推导保存在引用审计中。","不得用“以经审批的专项施工方案及设计文件为准,本节不另行设定”等话把本节技术决定推给后续。审批程序可以写,但必须同时说明当前方案的实际方法、参数和控制要求。","直接用于施工的尺寸、标高、深度、规格和配置须按明确对象与部位给出已核定值;不使用“约”“左右”或笼统范围代替控制值。不同部位确有不同值时逐部位说明,不能取范围端点、平均数或统一最大值冒充所有部位的值。","分层厚度、坑底高程、支护桩长与基坑总深度是不同属性。存在多种设计工况时说明适用工况,偏差允许值与合理施工条件区间也须明确用途,不能混成工程实体的未决范围。","有完整依据才能作技术判断。资料冲突或对象关系尚未解决时,在写作前向主智能体提出具体问题,保留内部未决项;不把“待核定”“以文件为准”塞进成稿,也不编造确定值。","每段提供新的工程信息、必要理由或执行动作。删去重复承诺、空泛口号、泛化制度和无实际作用的过渡语,避免各任务重复工程概况;不得为凑字数增加内容。","项目针对性由本节适用的部位、作业条件、工序接口、资源安排、风险和验收关系体现,不以标题新奇或同义改写体现。行业专业标题、术语、工艺的固定名称与同一项目已核定事实可以稳定复用;不得为避开历史文档而改名、删职责、换正确参数或重新编造方案。","每轮依据当前合格资料、已确认方案和冻结职责独立成稿。表达调整须保持对象、条件、因果顺序、控制值和责任接口不变;必要事实或接口承接的重复不是套话,只有不增加有效信息的重复叙述才需要在其实际作用域内处理。","正文不生成封面,封面不属于专业内容评审评分项;目录由系统按实际正文标题统一生成,作者无需编写目录或虚构页码。","本轮以专业内容验收,页数仅用于排版参考,后续投标由人工二次排版;不能为压到50页删去必需技术信息。"],f="本节形成精简、实际、有效且可执行的专业技术方案,工程对象、工况、方法、控制值与职责明确;无重复套话、空话或泛化说明,不以资料出处或未来审批替代当前技术决定。工程实体参数按具体部位核定,笼统约数或范围不能替代施工控制值;不同部位的真实差异与允许偏差应明确其适用条件和用途。项目针对性按本节真实对象、条件及其实施关系判断;标准术语、专业标题和必要事实承接可稳定复用,不以跨文档词面相似度或表述新奇程度判分。";function g(a){let b=[/按设计图例/gu,/(?:按|遵照|依据)?图纸要求/gu,/对照清单/gu,/按(?:照)?(?:施工)?图(?:纸)?(?:要求|施工|实施|设置)?/gu,/(?:以|依据|参照|详见)[^。;\n]{0,60}(?:图|图集|设计文件|专项(?:施工)?方案)[^。;\n]{0,25}(?:为准|执行|实施|施工)/gu,/(?:按|依据|参照)[^。;\n]{0,35}图[^。;\n]{0,20}(?:标注|所示|示出|指定)(?:[^。;\n]{0,10}(?:距离|值|尺寸|做法))?/gu,/以[^。;\n]{0,80}(?:专项施工方案|设计文件)[^。;\n]{0,30}为准[^。;\n]{0,30}(?:本节|本方案)?不另行设定/gu].flatMap(b=>[...a.matchAll(b)].map(a=>({text:a[0],start:a.index,end:a.index+a[0].length}))).sort((a,b)=>b.text.length-a.text.length),c=[];for(let a of b)c.some(b=>a.start<b.end&&a.end>b.start)||c.push(a);return c.sort((a,b)=>a.start-b.start).map(a=>`正文用出处或后续文件替代当前技术决定:${a.text}`)}function h(a){let b=g(a);for(let c of a.split(/[。;\n]/u))/(?:设计|图纸)[^。;]*不(?:一致|符)[^。;]*(?:按|依照|根据)现场实际(?:情况)?施工/u.test(c)&&!/(?:不得|禁止|不能|不可)[^。;]{0,12}(?:按|依照|根据)现场实际/u.test(c)&&b.push("设计与现场不符时不能擅自按现场改变设计施工;须明确停止影响范围、记录差异、处理责任及变更后复核放行条件");return[...new Set(b)]}let i="【从来源到施工决定】来源原句用于识别工程对象、合同责任、条件和约束,不直接粘贴成正文。先判断本节实际需决定的工法、资源、检查或接口,再依据已给事实和工程知识写行动、控制、停止与放行。无需为管理段添加参数或重复检查全项目资料。\n合同说“由总包承担”“按图实施”只说明责任或引用,不等于本节已完成技术决定。把责任落实为本方案的具体动作与接口;真实设计/规格未知只就这个问题查证并交主控,其他可完成内容先成文,未决留任务元数据。\n现场与设计发生差异时,禁止擅自按现场改变设计。例如接口条件不一致:停止该接口的开挖和接驳,记录实测位置、标高及影响范围,由项目技术负责人协调设计处理,取得明确变更后交底、复核并放行。这是异常处置,不能替代正常施工方法,不在无此问题的小节机械复制。\n图件必须承载对应专业信息:工序或接口关系用关系图,场地布置用实际相对位置、设施区域及通行/管线线路的平面示意;图内相对坐标不是现场尺寸。需要测量尺度或真实定位时以已核事实支持,数据缺失进入主控问题,不把流程图冒称真实场地平面图。"},28356:(a,b,c)=>{let d;c.d(b,{Qf:()=>C,rI:()=>ak,bb:()=>ap,v7:()=>ao,_v:()=>ah,CX:()=>ab,jW:()=>I,Sq:()=>P,TO:()=>$,_T:()=>ae,Jx:()=>am});var e=c(95393),f=c(12669),g=c(73024),h=c(76760),i=c(73055);function j(){let a=process.env.AGENT_CASSETTE_DIR;return a||h.join(process.cwd(),"apps","server","test","fixtures","llm")}function k(a){let b="number"==typeof a.stablePrefixChars&&a.stablePrefixChars>0&&a.stablePrefixChars<=a.prompt.length?a.stablePrefixChars:a.prompt.length;return(0,i.c6)(["native-author-prompt-v2",a.model,JSON.stringify(a.params),a.system,a.prompt.slice(0,b)].join("\0"))}function l(a){return h.join(j(),`${a}.json`)}class m extends Error{constructor(a,b){super(`cassette 未命中(${b}):key=${a}。回放模式下未录制即测试失败,不静默回落到真调用。用 AGENT_RECORD=1 重跑以录制,产物落在 ${l(a)}。`),this.key=a,this.mode=b,this.name="CassetteMissError"}}async function n(a){let b="1"===process.env.AGENT_REPLAY?"replay":"1"===process.env.AGENT_RECORD?"record":"off";if("off"===b)return a.invoke();if("replay"===b){let c=function(a){try{let b=JSON.parse(g.readFileSync(l(a),"utf8"));return b?.v===1?b:void 0}catch{return}}(a.key);if(!c)throw new m(a.key,b);return c.response}let c=await a.invoke();try{g.mkdirSync(j(),{recursive:!0});let b={v:1,key:a.key,model:a.model,params:a.params,response:c,recordedAt:Date.now()};g.writeFileSync(l(a.key),JSON.stringify(b,null,2))}catch(a){console.error(`[cassette] 录制落盘失败(不影响生成):${a instanceof Error?a.message:String(a)}`)}return c}var o=c(96770),p=c(81684),q=c(24481),r=c(10059),s=c(79704),t=c(7258),u=c(86282);let v=new Map,w=0,x=new WeakMap,y=0;function z(a){let b=a.reason;return b instanceof Error&&"AbortError"!==b.name?b:void 0===b||b?.name==="AbortError"?Object.assign(Error("用户中止",{cause:b}),{name:"AbortError"}):Error(`LLM调用被外部运行信号终止:${String(b)}`,{cause:b})}function A(a){return"TimeoutError"===a.name?"local_deadline":"AbortError"===a.name?"aborted":"run_cancelled"}function B(a){return"TimeoutError"===a.name?"LOCAL_LLM_DEADLINE":"AbortError"===a.name?"CALL_ABORTED":"RUN_CANCELLED"}function C(a,b){return b.aborted?Promise.reject(z(b)):new Promise((c,d)=>{let e=!1,f=a=>{e||(e=!0,b.removeEventListener("abort",g),a())},g=()=>f(()=>d(z(b)));if(b.addEventListener("abort",g,{once:!0}),b.aborted)return void g();Promise.resolve().then(()=>{if(b.aborted)throw z(b);return a()}).then(a=>f(()=>c(a)),a=>f(()=>d(a)))})}function D(a,b){let c=(0,f.II)(a);if(c)return(0,f.D)(a),b&&(b.llm.lastError=`预算耗尽(${c.kind}):本次调用未发起——${c.message}`),console.error(`[llm] 预算耗尽拒绝调用(${c.kind}):${c.message}`),c}function E(a,b){let c=a.flatMap(a=>a.usage?[a.usage]:[]);if(!c.length)return b;let d=a=>c.reduce((b,c)=>b+(c[a]??0),0),e=a=>c.some(b=>void 0!==b[a])?d(a):void 0;return{promptTokens:d("promptTokens"),completionTokens:d("completionTokens"),promptCacheHitTokens:e("promptCacheHitTokens"),promptCacheMissTokens:e("promptCacheMissTokens"),reasoningTokens:e("reasoningTokens")}}function F(a,b,c,e,g){let h=Math.max(0,g?.promptCacheHitTokens||0),i=Math.max(0,g?.promptTokens||0),j=Math.min(Math.max(0,g?.promptCacheMissTokens??i-h),i),k=g?i+Math.max(0,g.completionTokens||0):0,l=g&&c?function(a,b,c,e=process.env){let f=function(a,b,c=process.env){return function(a=process.env){let b=a.AGENT_COST_PRICES_JSON;if(d&&d.raw===b)return d.table;let{table:c,warning:e}=function(a){let b;if(!a||""===a.trim())return{table:{}};try{b=JSON.parse(a)}catch(a){return{table:{},warning:`AGENT_COST_PRICES_JSON 解析失败,保留未定价状态:${a instanceof Error?a.message:String(a)}`}}if("object"!=typeof b||null===b||Array.isArray(b))return{table:{},warning:'AGENT_COST_PRICES_JSON 顶层必须是对象({"model:kind": {...}}),已忽略'};let c={},d=[];for(let[a,e]of Object.entries(b)){if("object"!=typeof e||null===e){d.push(a);continue}let b=Number(e.inputPerM),f=Number(e.outputPerM);if(!Number.isFinite(b)||!Number.isFinite(f)||b<0||f<0){d.push(a);continue}let g=Number.isFinite(Number(e.cacheHitPerM))&&Number(e.cacheHitPerM)>=0?Number(e.cacheHitPerM):b;c[a]={inputPerM:b,outputPerM:f,cacheHitPerM:g}}return{table:c,warning:d.length>0?`AGENT_COST_PRICES_JSON 中 ${d.length} 项非法已忽略:${d.slice(0,5).join("、")}`:void 0}}(b);return e&&console.warn(`[costModel] ${e}`),d={raw:b,table:c,warning:e},c}(c)[`${a}:${b}`]}(a,b,e);if(f)return function(a,b){let c=Math.max(0,b.inputTokens||0),d=Math.max(0,b.outputTokens||0),e=Math.min(Math.max(0,b.cacheHitTokens||0),c),f=b.cacheMissTokens,g="number"==typeof f&&Number.isFinite(f)?Math.min(Math.max(0,f),Math.max(0,c-e)):Math.max(0,c-e);return(e*a.cacheHitPerM+g*a.inputPerM+d*a.outputPerM)/1e6}(f,c)}(c,e,{inputTokens:g.promptTokens||0,outputTokens:g.completionTokens||0,cacheHitTokens:g.promptCacheHitTokens||0,cacheMissTokens:g.promptCacheMissTokens||0}):void 0,m=(0,f.dn)(a,{tokens:k,costUsd:l,priced:!g||void 0!==l,now:Date.now(),cacheHitTokens:h,cacheMissTokens:j});return m&&b&&(b.llm.lastError=m.message,console.error(`[llm] 预算耗尽:${m.message}`)),m}function G(a){return"reasoning"===a?"reasoning":"chat"}function H(a,b){return new Promise((c,d)=>{if(b?.aborted)return void d(Error("用户中止"));let e=()=>{clearTimeout(f),d(Error("用户中止"))},f=setTimeout(()=>{b?.removeEventListener("abort",e),c()},a);b?.addEventListener("abort",e,{once:!0})})}function I(){let a=(0,u.z)().llmMaxConcurrency;return"number"==typeof a&&Number.isFinite(a)&&a>0?Math.max(1,Math.floor(a)):1/0}let J=[];function K(a){return new Promise((b,c)=>{if(a?.aborted)return void c(z(a));if(w<I()){w+=1,b(L);return}let d={resolve:b,reject:c,settled:!1};J.push(d);let e=()=>{if(d.settled)return;d.settled=!0,d.cleanup?.();let a=J.indexOf(d);a>=0&&J.splice(a,1),c(Error("用户中止"))};if(a){if(a.aborted)return void e();a.addEventListener("abort",e,{once:!0}),d.cleanup=()=>a.removeEventListener("abort",e)}})}function L(){w=Math.max(0,w-1);let a=J.shift();a&&!a.settled&&(a.settled=!0,a.cleanup?.(),w+=1,a.resolve(L))}let M=[],N=null,O=(()=>{let a=Number(process.env.DOCUMENT_PREFIX_SCHEDULE_WINDOW_MS);return Number.isFinite(a)&&a>=0?Math.floor(a):void 0})();function P(){return I()}function Q(a){let b=a instanceof Error?`${a.name} ${a.message}`:String(a);return/connection error|econnrefused|econnreset|fetch failed|network|socket|eai_again|enotfound|etimedout|429|502|503|504|rate ?limit|too many requests|overloaded|服务繁忙|连接失败|abort|timeout|timed ?out|terminated/iu.test(b)}function R(a){if(a instanceof e.IncompleteChatStreamError)return"incomplete_stream";if(a instanceof U)return"tool_protocol_invalid";let b=a instanceof Error?`${a.name} ${a.message}`:String(a),c=[],d=new Set,f=a;for(;f&&"object"==typeof f&&!d.has(f);){d.add(f);let a=f;if("LOCAL_LLM_DEADLINE"===a.code)return"local_deadline";for(let b of[a.name,a.code])"string"==typeof b&&c.push(b);f=a.cause}if(/\babort(ed)?\b|用户中止/iu.test(b)&&!/timeout|timed ?out|terminated/iu.test(b))return"aborted";if(/空响应|empty content/iu.test(b))return"empty_response";let g=a&&"object"==typeof a&&"status"in a?a.status:void 0,h="number"==typeof g&&Number.isInteger(g)?g:Number(b.match(/(?:endpoint error|api error|http\s*(?:status)?)\s*[(:]?\s*(\d{3})\s*\)?/iu)?.[1]);if(Number.isFinite(h)&&h>0){if(408===h)return"provider_timeout";if(429===h||h>=500)return"provider_unavailable";if(h>=400)return W(b)?"context_overflow":"provider_rejected"}return/输出截断|finish_reason\s*=\s*length/iu.test(b)?"output_truncated":W(b)?"context_overflow":/APIConnectionTimeoutError|HeadersTimeoutError|BodyTimeoutError|UND_ERR_(?:HEADERS|BODY|CONNECT)_TIMEOUT|ETIMEDOUT|headers?\s+timeout|body\s+timeout|connect(?:ion)?\s+timeout/iu.test(`${b} ${c.join(" ")}`)?"transport_timeout":/missing field|invalid[_ ]request|tool_call_id|tool_calls|messages\[\d+\]|协议|参数不合法|未授权|鉴权/iu.test(b)?"provider_rejected":/\b429\b|connection error|fetch failed|network|socket|eai_again|enotfound|econnrefused|econnreset|rate ?limit|too many requests|overloaded|bad gateway|gateway timeout|internal server error|service unavailable|服务繁忙|连接失败/iu.test(b)?"provider_unavailable":"unknown_failure"}class S extends Error{constructor(a,b){super(a),this.name="TruncatedContentError",this.partial=b}}function T(a){if("length"!==a.finishReason)return;let b=a.droppedToolCalls?.length?`;实际未解析工具:${a.droppedToolCalls.map(a=>`${a.name??"(无名)"}:${a.reason}`).join(";")}`:"";return`输出截断(供应商明确finish_reason=length);原始返回已保留${b}`}class U extends Error{constructor(a){super(`工具参数协议失败,finish_reason=${a.finishReason??"未报告"};${(a.droppedToolCalls??[]).map(a=>`${a.name??"(无名)"}:${a.reason};参数字符${a.argumentsChars??"未报告"},空白字符${a.whitespaceChars??"未报告"}`).join(";")}。解析失败不能证明供应商输出额度耗尽;完整raw保留,按实际字段纠正。`),this.name="ToolArgumentProtocolError"}}function V(a,b,c){if(!a)return;let d=b instanceof Error?b.message:String(b);a.llm.failures+=1,a.llm.failureStreak=(a.llm.failureStreak||0)+1,a.llm.lastError=d;let e=c??R(b);a.llm.lastFailureKind=e;let f=a.llm.failureKindCounts??={};return f[e]=(f[e]??0)+1,e}function W(a){let b=a instanceof Error?`${a.name} ${a.message}`:String(a);return/maximum context length|context ?length|context ?window|too many tokens|input.{0,24}too long|prompt.{0,24}too long|请求.{0,16}(超长|过长|超出)|上下文.{0,16}(超长|超出|过长|窗口)/iu.test(b)||/400/u.test(b)&&/context|too ?long|token|length|上下文/iu.test(b)||/JSON.{0,10}被截断|JSON.{0,10}未闭合/iu.test(b)}function X(a,b){let c=(0,o.resolveProtocol)(a,b);return"anthropic"===c?"anthropic":"google"===c?"google":"ollama"===c?"ollama":"openrouter"===c?"openrouter":/deepseek/iu.test(a)?"deepseek":"openai"}function Y(a){let b=(0,p.c9)(a),c=b.models.active;if(!c)return;let d=b.models.list.find(a=>a.name===c.name&&a.provider===c.provider);if(!d)throw Error("当前选定模型不在模型列表中;本次不会自动选用其他模型");let e=b.providers[d.provider];if(!e)throw Error("当前选定模型的供应商尚未配置;本次不会自动选用其他模型");return{model:{...d,key:JSON.stringify([d.provider,d.name])},provider:e}}function Z(a,b,c){let d=a[b]??={calls:0,failures:0};d.calls+=1,"failure"===c&&(d.failures+=1)}function $(){return!function(){let a=(process.env.DOCUMENT_THINKING_FOR_JUDGES??"").trim().toLowerCase();return"1"===a||"on"===a||"true"===a}()?"structuredGeneration":"reasoning"}function _(a,b,c){let d="composition"===a?(0,e.thinkingCapabilityForModel)(b):void 0;if(d&&"unsupported"!==d.disable&&"enabled"!==c)return{disableThinking:!0,budgetMode:"compact"};if(/^deepseek-(?:v4-pro|flash)$/iu.test(b))return"disabled"===c?{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,reasoningEffort:"reasoning"===a?"high":"low",budgetMode:"relaxed"};if((0,e.isGlm53Model)(b))return{disableThinking:!1,reasoningEffort:"disabled"===c?"low":"enabled"===c||"reasoning"===a?"high":"low",budgetMode:"relaxed",..."disabled"===c?{warning:`当前模型 ${b} 不支持关闭思考,本次使用厂商支持的 low 强度,模型选择保持不变`}:{}};let f=(0,e.thinkingCapabilityForModel)(b);return"disabled"===c?f&&"unsupported"!==f.disable?{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,budgetMode:f?.budgetPolicy==="shared"?"relaxed":"compact",.../gemini-3/iu.test(b)?{reasoningEffort:"low"}:{},warning:`当前模型 ${b} 思考不可关闭(厂商限制),已保留合法思考参数和当前模型选择`}:"enabled"===c?{disableThinking:!1,budgetMode:"structuredGeneration"===a&&f?.budgetPolicy==="shared"?"relaxed":"compact"}:"structuredGeneration"===a&&f?"unsupported"===f.disable?{disableThinking:!1,budgetMode:"shared"===f.budgetPolicy?"relaxed":"compact",.../gemini-3/iu.test(b)?{reasoningEffort:"medium"}:{},warning:`当前模型 ${b} 思考不可关闭(厂商限制),本次保留思考并使用受限输出预算`}:{disableThinking:!0,budgetMode:"compact"}:{disableThinking:!1,budgetMode:"compact"}}function aa(a){let b=a.at(-1);return b?{requestParameters:a,...void 0!==b.maxTokens?{sentMaxTokens:b.maxTokens}:{},...b.reasoningEffort?{reasoningEffort:b.reasoningEffort}:{},...b.responseFormat?{responseFormat:b.responseFormat}:{}}:{}}function ab(a){return a.filter(a=>!!a).reduce((a,b)=>a+b.length,0)}function ac(a){if(!a)return{};let b=Math.max(0,a.promptTokens||0),c=void 0===a.promptCacheHitTokens?void 0:Math.max(0,a.promptCacheHitTokens),d=void 0===a.promptCacheMissTokens?void 0:Math.min(Math.max(0,a.promptCacheMissTokens),b);return{inputTokens:b,outputTokens:Math.max(0,a.completionTokens||0),...void 0===c?{}:{cacheHitTokens:c},...void 0===d?{}:{cacheMissTokens:d},...void 0===a.reasoningTokens?{}:{reasoningTokens:a.reasoningTokens}}}function ad(a,b){a&&((0,t.iC)(a,b),(a.llm.callLog??=[]).push(b),(0,s.t8)(a,b))}function ae(a,b=5){let c=new Map;for(let b of a??[]){let a=c.get(b.kind)??{kind:b.kind,calls:0,inputChars:0,outputChars:0,toolArgumentsChars:0,ms:0,failed:0,truncated:0};a.calls+=1,a.inputChars+=b.inputChars,a.outputChars+=b.outputChars,a.toolArgumentsChars+=b.toolArgumentsChars??0,a.ms+=b.ms,b.ok||(a.failed+=1),"output_truncated"===b.failureKind&&(a.truncated+=1),c.set(b.kind,a)}return{rows:[...c.values()].sort((a,b)=>b.inputChars-a.inputChars).slice(0,b),unlabeledCalls:c.get("unlabeled")?.calls??0}}function af(a,b){let c=a.llm.callBreakdown??(a.llm.callBreakdown={}),d=b||"(none)";return c[d]??(c[d]={calls:0,inputChars:0,l3Chars:0,cacheHitTokens:0,cacheMissTokens:0})}class ag extends Error{constructor(a){super(a),this.name="ToolProtocolViolationError"}}async function ah(a){return ai(a={...a=(0,q.DQ)(a),signal:a.signal??new AbortController().signal})}async function ai(a){var b;let c,d,g,h,j,l,m=a.signal;if(m.aborted)throw z(m);let o=(b=a.diagnostics,(0,f.Su)(b));if(D(o,a.diagnostics))return;let p=Date.now(),s=0,t=!1,u=0,w=[],x=[],y=0,B=0,I=0,J=a.diagnostics?a.diagnostics.llm.modelHealth??={}:{};try{g=await K(m),I=Date.now()-p;let b=Y(a.diagnostics);if(!b)return void V(a.diagnostics,"MODEL_NOT_CONFIGURED:尚未明确选择模型,本次未发送请求");let{model:f,provider:o}=b;j=f.name,l=f.key,a.diagnostics&&(a.diagnostics.llm.modelChoices??=[]).push({at:Date.now(),chosen:f.name,provider:f.provider,callKind:a.callKind,reason:"使用本轮冻结的用户选定模型;失败不会自动切换模型"});let A=(0,i.c6)({provider:f.provider,model:f.name,baseUrl:o.baseUrl,directEndpoint:o.directEndpoint,protocol:o.protocol,apiKeyHash:o.apiKey?(0,i.c6)(o.apiKey):""}),D=v.get(A);D||(D=(0,e.createProvider)(X(f.provider,o),{baseUrl:o.baseUrl,apiKey:o.apiKey,modelName:f.name,directEndpoint:o.directEndpoint}),v.set(A,D));let E=f.name.toLowerCase();if(a.requiredToolName&&!a.tools.some(b=>b.name===a.requiredToolName))throw Error("指定的提交工具不在当前作者允许的工具中");if((a.requireToolCall||a.requiredToolName)&&D.capabilities?.supportsFunctionCalling===!1)throw Error("当前作者供应商未实现原生工具调用,不能提交冻结作者任务");let F=_(a.taskKind??"structuredGeneration",E,f.thinking);F.warning&&a.diagnostics&&!a.diagnostics.llm.thinkingWarning&&(a.diagnostics.llm.thinkingWarning=F.warning);let G=D.capabilities?.maxOutputTokens,L="number"==typeof G&&Number.isFinite(G)&&G>0?G:1/0,M=(0,e.isGlm53Model)(E)||/deepseek/iu.test(E)&&!F.disableThinking,N=!!(a.requireToolCall&&!M),O=M?void 0:a.requiredToolName,P=(0,q.jW)(a.diagnostics)?void 0===a.maxTokens?void 0:Math.min(a.maxTokens,L):Math.min("relaxed"===F.budgetMode?(a.maxTokens??3200)*6:a.maxTokens??3200,L),R=D.capabilities.supportsStreaming&&!0!==o.directEndpoint,S=a.stablePrefixChars&&a.stablePrefixChars>0?a.stablePrefixChars:void 0,W=k({system:a.system,prompt:a.messages.map(a=>a.content).join("\x01"),stablePrefixChars:S,model:f.name||"unknown",params:{temperature:a.temperature??0,maxTokens:P,stream:R,tools:a.tools,requireToolCall:N,requiredToolName:O??null,provider:f.provider,callKind:a.callKind,endpointHash:(0,i.c6)([o.baseUrl,o.protocol,o.directEndpoint]),disableThinking:F.disableThinking,reasoningEffort:F.reasoningEffort}});a.diagnostics&&(a.diagnostics.llm.calls+=1,a.diagnostics.llm.inputChars=(a.diagnostics.llm.inputChars||0)+a.system.length+a.messages.reduce((a,b)=>a+b.content.length,0));let $=await C(()=>n({key:W,model:f.name||"unknown",params:{temperature:a.temperature??0,maxTokens:P,stream:R},invoke:async()=>{let b;for(let c=0;c<=3;c+=1)try{if(m.aborted)throw z(m);u+=1;let b=Date.now();d=b,w.push({disableThinking:F.disableThinking,maxTokens:P,...F.reasoningEffort?{reasoningEffort:F.reasoningEffort}:{}});let c=(0,r.bw)({diagnostics:a.diagnostics,kind:a.callKind??"unlabeled",streaming:R,signal:m});x.push(c.receipt);let g=[{role:"system",content:a.system},...a.messages.map(a=>({role:a.role,content:a.content,...a.toolCallId?{toolCallId:a.toolCallId}:{},...a.toolCalls&&a.toolCalls.length>0?{toolCalls:a.toolCalls}:{},...void 0!==a.thinkingContent?{thinkingContent:a.thinkingContent}:{}}))],i={maxRetries:0,temperature:a.temperature??0,maxTokens:P,signal:m,disableThinking:F.disableThinking,reasoningEffort:F.reasoningEffort,tools:a.tools,...O?{extraBody:{tool_choice:{type:"function",function:{name:O}}}}:N?{extraBody:{tool_choice:"required"}}:{}};try{return await C(()=>c.run(()=>R?D.chatStream(g,c.onChunk,i):D.chat(g,i)),m)}catch(b){if(b instanceof e.IncompleteChatStreamError){let c=b.partialResponse;h=c.usage,s=c.content.length;let d=c.vendorExtensions?.rawToolCalls;Array.isArray(d)&&(B=d.reduce((a,b)=>a+("string"==typeof b?.arguments?b.arguments.length:0),0)),a.onRawResponse?.({content:b.partialResponse.content,toolCalls:[],rawContent:b.partialResponse.content,rawToolCalls:b.partialResponse.vendorExtensions?.rawToolCalls,droppedToolCalls:b.partialResponse.droppedToolCalls,...void 0===b.partialResponse.thinkingContent?{}:{thinkingContent:b.partialResponse.thinkingContent},requestMetadata:{maxTokens:P,...Number.isFinite(L)?{outputCap:L}:{},requireToolCall:a.requireToolCall??!1,disableThinking:F.disableThinking,...a.requiredToolName?{requiredToolName:a.requiredToolName}:{}},responseMetadata:{model:f.name,provider:f.provider,completed:!1,finishReason:b.partialResponse.finishReason??null,usage:b.partialResponse.usage??null,usageStatus:b.partialResponse.usage?"reported":"unreported",protocolFailure:"incomplete-stream"}})}throw b}finally{y+=Date.now()-b,d=void 0}}catch(e){if(b=e,m.aborted)throw z(m);if(!Q(e)||c>=3)throw e;let d=Math.min(3e4,1200*2**c)+Math.floor(400*Math.random());a.diagnostics&&(a.diagnostics.llm.retries+=1,a.diagnostics.llm.lastError=`工具循环瞬态错误退避 ${Math.round(d/1e3)}s(第 ${c+1} 次):${e instanceof Error?e.message:String(e)}`),await H(d,m)}throw b instanceof Error?b:Error(String(b))}}),m);x.length||(0,r.xC)(a.diagnostics,$.usage),h=$.usage?{promptTokens:$.usage.promptTokens,completionTokens:$.usage.completionTokens,promptCacheHitTokens:$.usage.promptCacheHitTokens,promptCacheMissTokens:$.usage.promptCacheMissTokens}:void 0,j=f.name;let aa=$.content?.trim()??"",ab=T($),ac=!!$.droppedToolCalls?.length,ad=ab?"output_truncated":ac?"tool_protocol_invalid":void 0;ad&&V(a.diagnostics,ab??new U($),ad);let ae=($.toolCalls||[]).map((a,b)=>({id:a.id||`call-${b}`,name:a.name,arguments:"string"==typeof a.arguments?a.arguments:JSON.stringify(a.arguments??{})})),af=$.vendorExtensions?.rawToolCalls;B=Array.isArray(af)?af.reduce((a,b)=>a+("string"==typeof b?.arguments?b.arguments.length:0),0):ae.reduce((a,b)=>a+b.arguments.length,0);let ah={content:aa,toolCalls:ae,...void 0!==$.thinkingContent?{thinkingContent:$.thinkingContent}:{},rawContent:$.content??"",rawToolCalls:$.vendorExtensions?.rawToolCalls,requestMetadata:{maxTokens:P,...Number.isFinite(L)?{outputCap:L}:{},requireToolCall:a.requireToolCall??!1,disableThinking:F.disableThinking,...a.requiredToolName?{requiredToolName:a.requiredToolName}:{}},droppedToolCalls:$.droppedToolCalls,responseMetadata:{model:f.name,provider:f.provider,completed:!ad,finishReason:$.finishReason??null,usage:$.usage??null,usageStatus:$.usage?"reported":"unreported",...ad?{protocolFailure:ab?"output-truncated":"invalid-tool-arguments"}:{}}};if(a.onRawResponse?.(ah),!ad&&(ae.some(b=>!a.tools.some(a=>a.name===b.name))||a.requireToolCall&&0===ae.length||a.requiredToolName&&(0===ae.length||ae.some(b=>b.name!==a.requiredToolName))))throw new ag(`供应商未遵守当前工具协议:要求${a.requiredToolName??(a.requireToolCall?"实际工具调用":"声明内工具")},实际返回${ae.map(a=>a.name).join("、")||"普通文本或空返回"};原响应已保留,未执行越界工具`);if(!aa&&0===ae.length){ad||V(a.diagnostics,"空响应(工具路径:模型既无正文也无工具调用)"),c=ad??"empty_response",l&&Z(J,l,"failure");return}return t=!ad,ad&&(c=ad),s=aa.length,l&&Z(J,l,ad?"failure":"ok"),ah}catch(e){let b=m.aborted?z(m):e;l&&!m.aborted&&Z(J,l,"failure");let d=m.aborted&&b instanceof Error?A(b):void 0;throw b instanceof Error&&"AbortError"===b.name||V(a.diagnostics,b,d),c=d??R(b),b}finally{g||(I=Date.now()-p),g?.(),F(o,a.diagnostics,j,G(a.taskKind),E(x,h)),ad(a.diagnostics,{at:p,kind:a.callKind??"unlabeled",inputChars:a.system.length+a.messages.reduce((a,b)=>a+b.content.length,0),outputChars:s,providerAttempts:u,toolArgumentsChars:B,toolSchemaChars:JSON.stringify(a.tools).length,slotWaitMs:I,providerMs:y+(void 0===d?0:Date.now()-d),launchWaitMs:0,ms:Date.now()-p,ok:t,...ac(E(x,h)),...c?{failureKind:c}:{},...a.maxTokens?{maxTokens:a.maxTokens}:{},...aa(w),...x.length?{transportActivities:x.map(a=>({...a}))}:{},inputThinkingChars:a.messages.reduce((a,b)=>a+(b.thinkingContent?.length??0),0),inputToolArgumentsChars:a.messages.reduce((a,b)=>a+(b.toolCalls??[]).reduce((a,b)=>a+b.arguments.length,0),0)})}}function aj(a,b,c,d){a&&Object.assign(a,{value:b,code:c,performed:d})}async function ak(a,b,c=!1,d={}){var g;let h,j,l,m,o,p;(d=(0,q.DQ)(d)).outFailure&&(delete d.outFailure.value,delete d.outFailure.code,delete d.outFailure.performed,delete d.outFailure.outputTruncated);let t=(g=d.diagnostics,(0,f.Su)(g)),u=D(t,d.diagnostics);if(u)return void aj(d.outFailure,`预算耗尽(${u.kind}):本次调用未发起——${u.message}`,"BUDGET_REFUSED",!1);d={...d,signal:d.signal??new AbortController().signal};let I=[],J=Date.now(),L=0,P=!1,R=0,U=0,W=0,$=[];if(d.diagnostics){d.diagnostics.llm.calls+=1,d.diagnostics.llm.inputChars=(d.diagnostics.llm.inputChars||0)+a.length+b.length;let c=af(d.diagnostics,d.prefixKey);if(c.calls+=1,c.inputChars+=a.length+b.length,c.l3Chars+=d.contextLayers?.l3||0,d.contextLayers){let a=d.diagnostics.llm.layerChars??(d.diagnostics.llm.layerChars={l0:0,l1:0,l2:0,l3:0});a.l0+=d.contextLayers.l0||0,a.l1+=d.contextLayers.l1||0,a.l2+=d.contextLayers.l2||0,a.l3+=d.contextLayers.l3||0}else d.diagnostics.llm.unlayeredChars=(d.diagnostics.llm.unlayeredChars||0)+a.length+b.length}let ab=0,ae=d.diagnostics?d.diagnostics.llm.modelHealth??={}:{};try{let f;l=await K(d.signal),ab=Date.now()-J,d.diagnostics&&(d.diagnostics.llm.maxActive=Math.max(d.diagnostics.llm.maxActive,w));let g=Y(d.diagnostics);if(!g){let a="MODEL_NOT_CONFIGURED:尚未明确选择模型,本次未发送请求";aj(d.outFailure,a,"MODEL_NOT_CONFIGURED",!1),h=V(d.diagnostics,a);return}let{model:t,provider:u}=g;p=t.key,d.outModel&&(d.outModel.value=t.key),d.diagnostics&&(d.diagnostics.llm.modelChoices??=[]).push({at:Date.now(),chosen:t.name,provider:t.provider,callKind:d.callKind,reason:"使用本轮冻结的用户选定模型;失败不会自动切换模型"});let A=(0,i.c6)({provider:t.provider,model:t.name,baseUrl:u.baseUrl,directEndpoint:u.directEndpoint,protocol:u.protocol,apiKeyHash:u.apiKey?(0,i.c6)(u.apiKey):""}),B=v.get(A);if(B||(B=(0,e.createProvider)(X(t.provider,u),{baseUrl:u.baseUrl,apiKey:u.apiKey,modelName:t.name,directEndpoint:u.directEndpoint}),v.set(A,B)),d.files?.length&&(B.capabilities?.supportsVision!==!0||"function"!=typeof B.understandFiles)){let a="当前选定模型没有实际图像理解能力;该图像复核未测量,未发送图像,也未自动切换模型或降为纯文本假称已核准";aj(d.outFailure,a,"VISION_UNAVAILABLE",!1),h=V(d.diagnostics,a);return}let D=t.name.toLowerCase(),E=_(d.taskKind??"structuredGeneration",D,t.thinking);E.warning&&d.diagnostics&&!d.diagnostics.llm.thinkingWarning&&(d.diagnostics.llm.thinkingWarning=E.warning);let F=B.capabilities?.maxOutputTokens,G="number"==typeof F&&Number.isFinite(F)&&F>0?F:1/0,aa=function(a){if((0,q.jW)(a.diagnostics))return;if(!a.maxTokens)return a.maxTokens;let b="total"===a.outputBudget;return"relaxed"!==a.decision.budgetMode||b?b?Math.min(a.maxTokens,a.outputCap):a.maxTokens:Math.min(Math.ceil(6*a.maxTokens),a.outputCap)}({decision:E,maxTokens:d.maxTokens,outputBudget:d.outputBudget,outputCap:G,diagnostics:d.diagnostics}),ac=(0,e.isGlm53Model)(D)&&c?{type:"json_object"}:void 0,ad=!d.files?.length&&B.capabilities.supportsStreaming&&!0!==u.directEndpoint,ag=Symbol("empty-content"),ah=async(e,f=!1)=>{var g;if(d.signal?.aborted)throw Error("用户中止");let l=(g=d.diagnostics)?x.get(g)??0:y,p=l<3?0:l<6?2e4:l<10?45e3:6e4;if(p>0){let a=p+Math.floor(5e3*Math.random());d.diagnostics&&(d.diagnostics.llm.emptyStormWaits=(d.diagnostics.llm.emptyStormWaits||0)+1,d.diagnostics.llm.lastInfo=`空响应风暴长退避 ${Math.round(a/1e3)}s(连续空响应 ${l} 次)`),await H(a,d.signal)}let q=d.signal,s=d.prefixKey||(0,i.c6)(`${a}
112
+ ${b.slice(0,2e3)}`),v=k({system:a,prompt:b,stablePrefixChars:!d.files?.length&&(d.contextLayers?.l3||0)>0&&(d.contextLayers.l3||0)<b.length?b.length-(d.contextLayers.l3||0):void 0,model:t.name||"unknown",params:{temperature:d.temperature??0,maxTokens:e,jsonOnly:c,stream:ad,disableThinking:E.disableThinking,reasoningEffort:E.reasoningEffort,...ac?{responseFormat:ac}:{},provider:t.provider,callKind:d.callKind,endpointHash:(0,i.c6)([u.baseUrl,u.protocol,u.directEndpoint]),files:d.files?.map(a=>({name:a.name,mimeType:a.mimeType,hash:(0,i.c6)(a.data.toString("base64"))}))}}),z=await C(()=>n({key:v,model:t.name||"unknown",params:{temperature:d.temperature??0,maxTokens:e,jsonOnly:c,stream:ad,disableThinking:E.disableThinking,...ac?{responseFormat:ac}:{},provider:t.provider,callKind:d.callKind,endpointHash:(0,i.c6)([u.baseUrl,u.protocol,u.directEndpoint])},invoke:()=>new Promise((g,h)=>{let i=Date.now();!function(a,b){var c;let d=(c=w,void 0!==O?O:c>=16?500:120);if(d<=0)return b();M.push({fingerprint:a,launch:b}),N||(N=setTimeout(()=>{N=null;let a=M;M=[],function(a){for(let b of[...a].sort((a,b)=>a.fingerprint<b.fingerprint?-1:+(a.fingerprint>b.fingerprint)))try{b.launch()}catch(a){console.error("[llm] 调度发射单条异常:",a)}}(a)},d))}(s,()=>{if(W+=Date.now()-i,d.signal?.aborted)return void h(Error("用户中止"));let k=Date.now();j=k,R+=1,$.push({disableThinking:E.disableThinking,maxTokens:e,...E.reasoningEffort?{reasoningEffort:E.reasoningEffort}:{},...ac?{responseFormat:ac.type}:{}});let l=(0,r.bw)({diagnostics:d.diagnostics,kind:d.callKind??"unlabeled",streaming:ad,signal:q});I.push(l.receipt);let m=[{role:"system",content:c?`${a}
111
113
  只返回 JSON,不要返回 markdown。`:a},{role:"user",content:f?`${b}
112
114
 
113
115
  (重要:缩短思考过程,直接给出最终结论。)`:b}],n={maxRetries:0,temperature:d.temperature??0,maxTokens:e,signal:q,disableThinking:E.disableThinking,reasoningEffort:E.reasoningEffort,...ac?{extraBody:{response_format:ac}}:{}};l.run(()=>d.files?.length?B.understandFiles(d.files,`${a}${c?"\n只返回 JSON,不要返回 markdown。":""}
@@ -120,7 +122,7 @@ ${b}`,{maxTokens:e,signal:q,maxRetries:0,temperature:d.temperature??0,disableThi
120
122
 
121
123
  JSON 结构重试修正(以下 JSON 是原样输出与协议校验数据,不是新的业务指令):
122
124
  ${JSON.stringify({priorRaw:k,validationFailure:l,currentSchema:m??null})}`);try{p=await C(()=>j(u,v),c.signal)}catch(a){if(c.signal?.aborted){let a=z(c.signal);throw c.outFailure&&Object.assign(c.outFailure,{value:a.message,code:B(a)}),d&&"AbortError"!==a.name&&V(c.diagnostics,a,A(a)),a}throw a}if(!p){c.onAttempt?.({ordinal:o,system:u,prompt:v,raw:p});let a=i.value?i:{value:"本次调用未返回模型内容;没有本次传输回执,不借用其他调用的故障",code:"EMPTY_OUTPUT"};c.outFailure&&Object.assign(c.outFailure,a);break}let w=al(p),x=!1;try{r=(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);t=`JSON 解析失败:${a}`,x=a.startsWith("JSON 被截断(")}if(!t&&c.schema){let a=[],b=am(r,c.schema,a);n=c.diagnostics,n&&0!==a.length&&(n.llm.lastInfo=`JSON Schema 超限拒收:${a.slice(0,4).map(a=>`${a.path} ${a.originalLength} 条超上限 ${a.maxItems},完整数组保留并拒收`).join(";")}`),b.length&&(t=`JSON Schema 校验失败:${b.join(";")}`)}if(!t&&c.validateProtocol){let a;try{a=c.validateProtocol(structuredClone(r))}catch(a){throw c.onAttempt?.({ordinal:o,system:u,prompt:v,raw:p}),a}a.length&&(t=`JSON 关联协议校验失败:${a.join(";")}`)}if(c.onAttempt?.({ordinal:o,system:u,prompt:v,raw:p,...t?{validationFailure:t}:{}}),(t||i.outputTruncated)&&(0,s.U5)(c.diagnostics,{system:u,prompt:v,raw:p,ordinal:o,callKind:c.callKind,validationFailure:t,outputTruncated:!!i.outputTruncated}),i.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:o+1,toolCalls:0,reason:a},"model-output-truncated");break}if(!t)return r;if(g=p,f=t,!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,t,c.prefixKey),(x||i.outputTruncated)&&(h=an(h)),o>=2){c.outFailure&&Object.assign(c.outFailure,{value:t,code:"JSON_VALIDATION_EXHAUSTED"});break}}}async function ap(a,b,c={}){return ao(a,b,c)}},29327:(a,b,c)=>{c.d(b,{chiefDecisionWritingContext:()=>M,w:()=>O});var d=c(77598),e=c(63327),f=c(10170),g=c(63007),h=c(48825),i=c(9848),j=c(16752),k=c(44616),l=c(5518),m=c(73123);function n(a,b){if(!b.query?.trim()||b.query.length>300||!Number.isSafeInteger(b.offset??0)||(b.offset??0)<0||!Number.isSafeInteger(b.limit??4)||(b.limit??4)<1||(b.limit??4)>8||void 0!==b.filePath&&!Object.hasOwn(a.sources,b.filePath))throw Error("原文查询条件或冻结文件身份无效");let c=b.query.trim().split(/\s+/u).map(a=>a.toLowerCase()),d=(a.sourceControls??[]).filter(d=>"verified-source-excerpt"===d.roleId&&d.factId&&Object.hasOwn(a.sources,d.sourceFile)&&(void 0===b.filePath||d.sourceFile===b.filePath)&&c.every(a=>d.value.toLowerCase().includes(a))).sort((a,b)=>a.sourceFile.localeCompare(b.sourceFile)||Number(a.sourceRef?.chunkIndex??0)-Number(b.sourceRef?.chunkIndex??0)),e=b.offset??0,f=d.slice(e,e+(b.limit??4)),g=e+f.length;return{kind:"frozen-original-source",projectSnapshotId:a.snapshotId,query:b.query,matchedCount:d.length,offset:e,complete:g>=d.length,...g<d.length?{nextOffset:g}:{},sources:f.map(b=>({sourceId:b.factId,...(0,k.mk)(a,void 0,b.factId),filePath:b.sourceFile,sourceHash:a.sources[b.sourceFile].sha256,chunkIndex:b.sourceRef?.chunkIndex,sectionTitle:b.sourceRef?.sectionTitle,text:b.value,sourceVersionEligibility:a.sourceVersionPolicy?(0,m.bz)(a,{sourceFile:b.sourceFile,usage:"source-reference",quote:b.value}):{status:"unmeasured",decisionIds:[],reason:"原文可供只读追溯;缺少来源版本用途账,不能作为本次准入或设计采用证明"},sourceSemantics:b.sourceSemantics??(0,l.Q)(b.sourceRef?.roleId??b.roleId,b.sourceRef?.processingType??b.processingType)})),interpretation:"冻结原文候选;须结合对象、条件及已裁决事实判断适用性,查询零命中不证明全部资料没有该内容"}}var o=c(68417),p=c(15254),q=c(66620),r=c(28356),s=c(27939),t=c(5968),u=c(9236);let v=a=>"string"==typeof a&&!!a.trim();async function w(a,b){if(b.signal?.throwIfAborted(),!Array.isArray(a)||!a.length)throw Error("工程裁决须提供非空的实际对象控制项");let c=a.map(a=>{if(!a||"object"!=typeof a||Object.keys(a).some(a=>!["objectName","attribute","condition","value","instruction","evidence","derivation"].includes(a))||!["objectName","attribute","condition","value","instruction"].every(b=>v(a[b])&&a[b].length<=1500)||!Array.isArray(a.evidence)||!a.evidence.length||a.evidence.length>8)throw Error("工程控制项的对象、属性、工况、值或依据不完整");let c=a.evidence.map(a=>{if(!a||Object.keys(a).some(a=>!["sourceId","quote"].includes(a))||!v(a.sourceId)||!v(a.quote))throw Error("工程裁决的原文定位无效");let c=b.sources.find(b=>b.sourceId===a.sourceId);if(!c||!(0,p.dP)(c.text,a.quote))throw Error("工程裁决引用未查询的来源或改写了原文");return{sourceId:a.sourceId,quote:a.quote}}),d=(0,q.ei)(a.value);if((0,s.n5)(a.instruction).length)throw Error("工程控制执行指引仍将施工决定转交图示、设计文件或审批,须先核定具体执行要求");if(1!==d.length||/\d\s*(?:~|~|至|到|–|—)\s*[+−-]?\d|(?:约|左右|大致)/u.test(a.value))throw Error("控制值须为明确数值及单位;范围和约数只能保留为概况");if((0,q.ei)(a.instruction).some(a=>!d.includes(a)))throw Error("执行指引包含控制项之外未核定的参数");if(void 0!==a.derivation){let c=a.derivation;if(!c||Object.keys(c).some(a=>!["formula","inputFactIds","basis"].includes(a))||!v(c.formula)||!v(c.basis)||!Array.isArray(c.inputFactIds)||!c.inputFactIds.length||c.inputFactIds.some(a=>!b.facts.some(b=>b.factId===a)))throw Error("工程推导须使用本次提供的可靠事实与有限算式");(0,q.Db)([{unitId:"chief-control",quote:a.value,source:{kind:"derived",...c}}],{units:[{id:"chief-control",kind:"paragraph",criterionIds:[],text:a.value}],project:b.project,factBindings:[],required:!0})}else if(!c.some(a=>(0,q.ei)(a.quote).includes(d[0])))throw Error("控制值与单位没有得到实际引文支持");return{objectName:a.objectName,attribute:a.attribute,condition:a.condition,value:a.value,instruction:a.instruction,evidence:c,...a.derivation?{derivation:a.derivation}:{}}}),d=(0,t.TR)(b.project,c,b.sources,b.taskId),e=JSON.stringify({task:b.task,criteria:b.criteria,effectiveFacts:b.facts,controls:c,cadReadings:b.cadReadings,sourceContext:d,sources:b.sources}),f=Math.max(8e3,Math.ceil(.6*JSON.stringify({controls:c,variants:d.variants,sources:d.sourceDictionary.map(a=>({value:a.value,objectName:a.objectName}))}).length)+1200*c.length),g=b.reviewer?await b.reviewer(e):await (0,r.bb)('你是独立工程适用性评审者。核对主智能体的控制项与完整原文、已裁决事实和本任务职责。须明确同一对象、部位、施工阶段、基准、适用条件和数值属性;存在无关图框/详图/材料串用、取概况范围端点或平均值、把计价量当实测量、分层厚度当总深度、引用已被更正资料、未经确认的范围扩大或推导输入基准不一致时拒绝。原文引用与算术正确不等于工程适用性正确。未核出部位关系保持unmeasured,不能以通常经验补造。每个控制项按零起始index返回status=confirmed/rejected/unmeasured与reason。同时对sourceContext中每份完整原文、每个实际variant及control返回完整sourceReview。sourceCases语义分为project-design/project-condition/normative-rule/reference-option/reference-method/unmeasured;每个case必须填写versionDomain,按完整原文的实际用途选择boq-quantity、procurement-brand、procurement-specification、construction-method,尚未确认填unmeasured。一个清单表引用A材料品牌,不扩大为它所有数量或工序均受A版本限制;同句同时断言数量与品牌须分别核定实际用途,不能只核数量而漏核产品选择。reference-method只用于已独立核定的非定量参考工序,versionDomain只能construction-method,不承接任何产品选型、规格或清单量控制。不把冻结出处或工艺推导正确当项目采用证明;图集参考选项须真实项目selector与option原文的同selectionKey桥,不能凭通常采用或reason确认。规范约束只登记normative-constraint,本工程设计或项目已选参数为project-property。derived输出只核公式、对象及基准关系,不变成原文已给的项目值;sourceContext中其输入control仍逐项核真实输入来源用途。逐源完整解释、逐variant覆盖,未知保留unmeasured,不新增省略字段。只返回JSON {"results":[{"index":0,"status":"confirmed|rejected|unmeasured","reason":"对象条件及推导关系核验"}],"sourceReview":{"confirmed":true,"reason":"整体复核理由","sourceResults":[{"sourceDictionaryIndex":0,"complete":true,"caseIds":["case-a"],"reason":"完整原文解释"}],"sourceCases":[{"id":"case-a","sourceDictionaryIndex":0,"quote":"该源真实连续原文","objectScope":"实际对象","condition":"适用工况","semanticKind":"project-condition","versionDomain":"unmeasured","applicability":"applicable","variantIds":["从sourceContext选择"],"reason":"项目用途依据"}],"variantResults":[{"variantId":"从sourceContext选择","status":"confirmed|rejected|unmeasured","sourceCaseIds":["case-a"],"reason":"来源与工况关系"}],"controlsResults":[{"variantId":"从sourceContext选择","controlId":"从sourceContext选择","status":"confirmed|rejected|unmeasured","usage":"project-property|normative-constraint","sourceCaseIds":["case-a"],"selectionEvidence":[{"selectorSourceCaseId":"真实项目选择case","optionSourceCaseId":"参考选项case","selectionKey":"两份原文逐字共同标识"}],"reason":"用途核验理由"}],"uncoveredSourceCases":[]}}。没有选项时selectionEvidence为空数组。',e,{diagnostics:b.diagnostics,signal:b.signal,taskKind:(0,r.TO)(),callKind:"supervisor-decision",maxTokens:f,temperature:0,schema:{type:"object",required:["results","sourceReview"],properties:{results:{type:"array",minItems:c.length,maxItems:c.length,items:{type:"object",properties:{index:{type:"integer",required:!0},status:{type:"string",required:!0,enum:["confirmed","rejected","unmeasured"]},reason:{type:"string",required:!0,minLength:1}}}},sourceReview:(0,u.q1)(d.variants,d.sourceDictionary.map((a,b)=>b))}}});b.signal?.throwIfAborted();let h=g&&"object"==typeof g&&Array.isArray(g.results)?g.results:[];for(let[a]of c.entries()){let b=h.filter(b=>b&&"object"==typeof b&&b.index===a),c=b[0];if(1!==b.length||c?.status!=="confirmed"||!v(c.reason))throw Error(`工程适用性未确认:控制项${a},${v(c?.reason)?c.reason:"评审缺项或无效"}`)}let i=(0,t.XJ)({project:b.project,planId:b.planId,taskId:b.taskId,decisionId:b.decisionId,controls:c,sources:b.sources,review:g});return{controls:c.map(a=>{let{derivation:c,...d}=a;return{...d,evidence:a.evidence.map(a=>({...a,...(0,k.mk)(b.project,void 0,a.sourceId)})),...c?{derivation:{...c,inputFactIndices:c.inputFactIds.map(a=>{let c=(0,k.mk)(b.project,a).factIndex;if(void 0===c)throw Error("推导输入没有本轮冻结属性序号");return c})}}:{}}}),review:g,sourceApplicationReceipt:i}}var x=c(45455);function y(a,b){let c=new Map,d=(a.sourceControls??[]).filter(b=>"verified-source-excerpt"===b.roleId&&Object.hasOwn(a.sources,b.sourceFile)),f=b=>{let f=d.find(a=>(0,e.vg)(a)===b);f&&c.set(b,{sourceId:b,...(0,k.mk)(a,void 0,b),filePath:f.sourceFile,sourceHash:a.sources[f.sourceFile].sha256,chunkIndex:f.sourceRef?.chunkIndex,sectionTitle:f.sourceRef?.sectionTitle,text:f.value,sourceVersionEligibility:{status:"unmeasured",decisionIds:[],reason:"真实读取仅恢复冻结原文身份;来源用途、版本及工程采用须独立复核"},sourceSemantics:f.sourceSemantics??(0,l.Q)(f.roleId,f.processingType)})};for(let g of b)if(!g.error&&g.result&&g.result.projectSnapshotId===a.snapshotId)if("source"===g.kind)for(let b of g.result.sources){let f=d.find(a=>(0,e.vg)(a)===b.sourceId);f&&b.filePath===f.sourceFile&&b.sourceHash===a.sources[f.sourceFile].sha256&&b.chunkIndex===f.sourceRef?.chunkIndex&&b.text===f.value&&c.set(b.sourceId,b)}else if("cad"===g.kind){let b=g.result;if("annotations"!==b.kind||a.sources[b.filePath]?.sha256!==b.parsedIdentity)continue;for(let a of b.records){let c=a.payload.text;if("string"==typeof c&&c.trim()&&a.payload.source&&"string"==typeof a.payload.id)for(let a of d.filter(a=>a.sourceFile===b.filePath&&a.value.replace(/\s/gu,"").includes(c.replace(/\s/gu,""))))f((0,e.vg)(a))}}else for(let b of g.result.items){let c=a.workPackages?.flatMap(a=>a.members??[]).find(a=>a.id===b.id);c&&JSON.stringify(c.entry)===JSON.stringify(b.entry)&&b.sourceEvidenceId&&a.sources[b.entry.sourceFile]?.sha256===b.sourceFingerprint&&f(b.sourceEvidenceId)}return[...c.values()]}function z(a){return a.flatMap(a=>{if(a.error||!a.result)return[];if("source"===a.kind){let b=a.result;return(0,x.xj)([{toolName:"read_source",ok:!0,data:{...b,chunks:b.sources.map(a=>({filePath:a.filePath,chunkIndex:a.chunkIndex,sourceId:a.sourceId,sourceHash:a.sourceHash,content:a.text}))}}])}return(0,x.xj)([{toolName:"cad"===a.kind?"query_cad_context":"query_work_packages",ok:!0,data:a.result}])})}async function A(a){let b=a.initialSourceQueries.map(b=>({kind:"source",query:b,result:n(a.project,b)})),c=[],d=[],e=new Set(z(b)),f=!1;for(;;){let g=await a.ask([a.prompt,'需要继续查证时返回 {"action":"read","sourceQueries":[{query,filePath?,offset?,limit?}],"cadQueries":[{filePath,kind:"frames"|"annotations"|"geometry"|"instances",frameId?,entityId?,rootInstanceId?,query?,offset?,limit?}]}。按真实对象读取,nextOffset继续分页;新证据或实际游标有进展即可继续,没有总次数配额。重复同页、空结果和改query不代表新证据。先定位图框;读取身份、单位文字、坐标均不自动成为已核定工程参数。没有新证据时具体说明未核事项,不编造施工值。',...a.readCad?[]:["本次未提供CAD结构读取能力,cadQueries不可使用。"],JSON.stringify({readingReceipts:b,protocolErrors:d})].join("\n"));if(c.push(g),a.onProgress?.(b,c,d),!g||"object"!=typeof g||"read"!==g.action)return{raw:g,attempts:c,reads:b,protocolErrors:d,sources:y(a.project,b)};if(Object.keys(g).some(a=>!["action","sourceQueries","cadQueries"].includes(a))||void 0!==g.sourceQueries&&!Array.isArray(g.sourceQueries)||void 0!==g.cadQueries&&!Array.isArray(g.cadQueries))throw Error("主控追加读取协议无效");let h=[...(g.sourceQueries??[]).map(a=>({kind:"source",query:a})),...(g.cadQueries??[]).map(a=>({kind:"cad",query:a}))];if(!h.length){if(d.push("读取请求为空,未取得新证据;请返回具体裁决或实际定位条件。"),a.onProgress?.(b,c,d),f)throw Error("主控重复无进展,未形成已核定裁决");f=!0;continue}let i=b.length;for(let e of h){try{let c="source"===e.kind?["query","filePath","offset","limit"]:["filePath","kind","frameId","entityId","rootInstanceId","query","offset","limit","placement","textOnly","order","detail"];if(!e.query||"object"!=typeof e.query||Object.keys(e.query).some(a=>!c.includes(a)))throw Error("读取定位字段无效");if("cad"===e.kind&&!a.readCad)throw Error("本次主控未提供CAD读取能力");let d="source"===e.kind?n(a.project,e.query):a.readCad(e.query);b.push({...e,result:d})}catch(a){b.push({...e,error:a instanceof Error?a.message:String(a)})}a.onProgress?.(b,c,d)}let j=z(b.slice(i)),k=j.some(a=>!e.has(a));if(j.forEach(a=>e.add(a)),k)f=!1;else{if(d.push("实际读取没有新的证据或分页进展;不能以改查询词或重复第一页声称完成查证。"),a.onProgress?.(b,c,d),f)throw Error("主控重复无进展,未形成已核定裁决");f=!0}}}var B=c(24481);let C={type:"object",properties:{query:{type:"string",description:"以空格分隔的每个词均须出现在同一原文片段中;不是多个问题或备选词。换查询须从offset=0开始。"},filePath:{type:"string"},offset:{type:"integer",minimum:0,description:"同一查询的下一页必须使用回执nextOffset;不能沿用其他查询的偏移。"},limit:{type:"integer",minimum:1,maximum:8}},required:["query"],additionalProperties:!1},D={type:"object",properties:{filePath:{type:"string"},kind:{type:"string",enum:["frames","annotations","geometry","instances"]},frameId:{type:"string",description:"annotations/geometry须提供本次frames实际返回的图框ID、entityId或instances返回的rootInstanceId。"},entityId:{type:"string"},rootInstanceId:{type:"string",description:"instances目录实际返回的源根身份,用于annotations或geometry;根handle或ordinal不是工程部位,readingSourceIds只读身份不是已核定事实。"},query:{type:"string",description:"单条标注或图名中的实际字面子串。不是语义检索,不支持空格分隔的多词。数字标注常只有数值,建议先不填query读取所选图框或实际根标注,再按真实文字定位。图框可用剖面等实际图名定位。"},offset:{type:"integer",minimum:0,description:"回执nextOffset为实际分页边界;不按请求limit自行累加。换图框、实际根或关键词须从0开始。"},limit:{type:"integer",minimum:1,maximum:24},placement:{type:"string",enum:["all","drawing-space","frame-instance"],description:"在所选图框内按实际块路径筛选;drawing-space排除图框实例及其ATTRIB(常为图签),frame-instance仅查看这部分;不是语义删除,不证明另一部分没有工程说明。剖面主体标注宜先读drawing-space。"},textOnly:{type:"boolean",description:"仅返回有实际文字的标注,过滤空DIMENSION;其尺寸印刷字仍按实际图形块引用返回。"},order:{type:"string",enum:["source","position"],description:"position按实际世界坐标从上到下、从左到右阅读;只是绘图位置,不据此判断工程标高和对象。"},detail:{type:"string",enum:["full","catalog"],description:"frames默认catalog提供实际图框身份、图名和图号;需要真实边界和块变换时按entityId读取full。annotations/geometry始终full。"}},required:["filePath"],additionalProperties:!1},E={type:"object",properties:{action:{type:"string",enum:["use-facts","use-sources","engineering-controls","qualitative-controls","guidance","request-human"]},answer:{type:"string"},reason:{type:"string"},factIds:{type:"array",items:{type:"string"}},sourceIds:{type:"array",items:{type:"string"}},controls:{type:"array",minItems:1,items:{type:"object",properties:{objectName:{type:"string"},attribute:{type:"string"},condition:{type:"string"},value:{type:"string"},instruction:{type:"string"},evidence:{type:"array",items:{type:"object",properties:{sourceId:{type:"string"},quote:{type:"string"}},required:["sourceId","quote"],additionalProperties:!1}},derivation:{type:"object",properties:{formula:{type:"string"},inputFactIds:{type:"array",items:{type:"string"}},basis:{type:"string"}},required:["formula","inputFactIds","basis"],additionalProperties:!1}},required:["objectName","attribute","condition","value","instruction","evidence"],additionalProperties:!1}},qualitativeControls:{type:"array",minItems:1,items:{type:"object",properties:{category:{type:"string",enum:["conditional-duty","project-adoption"]},objectName:{type:"string"},attribute:{type:"string"},condition:{type:"string"},value:{type:"string"},instruction:{type:"string"},evidence:{type:"array",minItems:1,items:{type:"object",properties:{sourceId:{type:"string"},quote:{type:"string"}},required:["sourceId","quote"],additionalProperties:!1}}},required:["category","objectName","attribute","condition","value","instruction","evidence"],additionalProperties:!1}}},required:["action","answer","reason","factIds","sourceIds"],additionalProperties:!1},F={type:"object",properties:{query:{type:"string",description:"工程、分部或清单项目的实际字面子串;*列出本轮全部成员,不使用空格拼接多个备选词。"},offset:{type:"integer",minimum:0,description:"使用同一查询回执nextOffset继续分页;换查询从0开始。"},limit:{type:"integer",minimum:1,maximum:8}},required:["query"],additionalProperties:!1};class G extends Error{constructor(a,b,c,d){super(b,{cause:d}),this.code=a,this.name="OPERATION_TIMEOUT"===a?"TimeoutError":"OPERATION_ABORTED"===a?"AbortError":"ChiefReadingOperationError",this.reads=[...c.reads],this.attempts=[...c.attempts],this.errors=[...c.errors]}}let H={name:"finish_source_reading",description:"结束本次普通目录及原文定位阶段;可说明已提供的真实资料足够,避免无必要重复读。这里只结束准备,不能确认工法或宣称方案已核定,后续独立进行专业推理提交。",parameters:{type:"object",properties:{reason:{type:"string",minLength:1}},required:["reason"],additionalProperties:!1}};async function I(a){a=(0,B.DQ)(a);let b=[],c=[],d=[],e={reads:b,attempts:c,errors:d},f=a.signal??new AbortController().signal,g=()=>{if(f.aborted){let g=f.reason,h=g?.name==="TimeoutError",i=void 0===g||g?.name==="AbortError",j=h?"OPERATION_TIMEOUT":i?"OPERATION_ABORTED":"OPERATION_FAILED",k=h?"本地主控查证操作期限已到达;保留已读回执,方案保持未测状态":i?"用户中止主控查证;未采用后续读取或提交结果":g instanceof Error?g.message:`外部运行信号终止主控查证:${String(g)}`,l=`${j}: ${k}`;throw d.includes(l)||(d.push(l),a.onProgress(b,c,d)),new G(j,k,e,f.reason)}};try{return await (0,B.Uq)({diagnostics:a.diagnostics,signal:f,callKind:a.callOptions?.callKind??"supervisor-decision"},async()=>{let h=a.submission??{name:"submit_chief_decision",description:"查证完毕后提交本任务裁决。工程控制继续接受来源、量纲、算术和独立适用性审查;guidance只提供定性指引。",parameters:E};if(!/^[A-Za-z0-9_-]{1,64}$/u.test(h.name)||["read_frozen_source","read_frozen_cad","read_frozen_work_packages",H.name].includes(h.name)||!h.description.trim()||!h.parameters||"object"!=typeof h.parameters||Array.isArray(h.parameters))throw Error("主控提交工具声明无效或与读取工具重名");g(),b.push(...a.initialSourceQueries.map(b=>({kind:"source",query:b,result:n(a.project,b)})));let i=!1,j=!a.readingCallOptions,k=new Set(z(b)),l=b.length,m=new Set,o=a=>{let c=z(b.slice(l));l=b.length;let d=c.some(a=>!k.has(a));if(c.forEach(a=>k.add(a)),d)return void m.clear();if(m.has(a))throw new G(i?"PLAN_VALIDATION_FAILED":"READING_NO_PROGRESS",`主控重复无进展,未发布裁决:${a}。保留已读证据与实际错误,未决不代表没有要求`,e);m.add(a)},p=[],q=[{name:"read_frozen_source",description:"读取本轮冻结的完整解析原文,保留条件与真实来源,可继续nextOffset;零命中不证明工程资料没有。",parameters:C},...a.readCad?[{name:"read_frozen_cad",description:"读取本轮真实CAD图框、标注或几何。无图框时annotations可用非空实际字面query定位候选,再按rootBindings中真实rootInstanceId读annotations或geometry,也可从instances目录定位;源handle和裸坐标不自动成为工程部位或施工参数,空query不全图返回。",parameters:D}]:[],...a.readWorkPackages?[{name:"read_frozen_work_packages",description:"读取本轮冻结的原始清单成员,保留对象、完整特征、数量单位和真实来源。按nextOffset继续完整记录;清单计价量不自动成为施工控制值,零命中不证明工程资料没有。",parameters:F}]:[],h],s=[{role:"user",content:[a.prompt,...a.readingCallOptions?["当前先执行普通源查证阶段,只定位实际目录、清单成员与完整原文,不在此阶段确认工法。已有真实提供的资料足够时可用finish_source_reading说明理由结束准备;之后才使用专业推理提交完整方案。"]:[],a.submission?`通过实际工具查证,禁止把尚未读到的资料、清单成员、图框、单位或部位关系当作已确认。真实证据或分页游标有进展即可继续;重复空结果、失败或同一控制反馈后具体保留未决,不编造已核定关系。最终通过${h.name}提交;读取和提交不放在同一轮。`:"通过实际工具查证,禁止把尚未读到的图框、单位或部位关系当作已确认。真实证据或分页游标有进展即可继续;反复没有新证据时具体保留未决,不代写含糊施工正文。最终裁决通过submit_chief_decision提交;读取和提交不放在同一轮。",JSON.stringify({initialReadingReceipts:b})].join("\n")}],t=new Set,u=()=>{let c=y(a.project,b).filter(a=>!t.has(a.sourceId));c.forEach(a=>t.add(a.sourceId)),c.length&&s.push({role:"user",content:`【实际读取恢复的冻结原文来源】${JSON.stringify(c)}。提交sourceIds和evidence.sourceId只能选择这些sourceId;cad-read、图框、实体和清单成员ID只作读取定位。完整原文可读不代表工程采用许可,仍须独立核对象、条件、版本和用途。`});let d=a.readingContext?.(b);d?.trim()&&s.push({role:"user",content:`【冻结读取后的真实只读上下文】
123
- ${d}`})};for(b.length&&(a.onProgress(b,c,d),u());;){g();let e=j?a.callOptions:a.readingCallOptions,k=j?q:[...q.filter(a=>a.name!==h.name&&"read_frozen_cad"!==a.name),H],l=await (0,r.Qf)(()=>(a.caller??r._v)({system:a.system??"你是负责专业边界、资料口径和作者协作的主智能体,使用实际工具查清工程对象及工况后裁决。",messages:s,tools:k,requireToolCall:!1,taskKind:e?.taskKind??"reasoning",diagnostics:a.diagnostics,signal:f,callKind:e?.callKind??"supervisor-decision",maxTokens:e?.maxTokens??12e3,temperature:0}),f);if(c.push(l??null),a.onProgress(b,c,d),g(),!l)throw Error("主控模型未返回有效响应,未执行读取或裁决");if(s.push({role:"assistant",content:l.content,toolCalls:l.toolCalls,...void 0!==l.thinkingContent?{thinkingContent:l.thinkingContent}:{}}),l.responseMetadata?.completed===!1){let e="本轮模型响应被截断,读取或提交均未执行;须根据实际响应容量返回完整工具请求,未闭合内容不执行";for(let a of(d.push(e),l.toolCalls))s.push({role:"tool",toolCallId:a.id,content:JSON.stringify({accepted:!1,performed:!1,error:e})});s.push({role:"user",content:e}),a.onProgress(b,c,d),o(e);continue}if(!l.toolCalls.length){d.push("本轮仅返回普通文本,未执行读取或裁决"),s.push({role:"user",content:`本轮普通文字未作为工程裁决执行。请调用已提供的读取工具继续查证,或调用${h.name}提交有实际依据的裁决。`}),a.onProgress(b,c,d),o("普通文字未执行工具裁决");continue}let t=l.toolCalls.filter(a=>a.name===H.name);if(!j&&(t.length||l.toolCalls.some(a=>a.name===h.name))){let e;if(1!==t.length||1!==l.toolCalls.length)e="普通源查证阶段不执行方案提交;结束准备与读取须分轮,之后用专业推理完整提交";else try{let a=JSON.parse(t[0].arguments);if(!a||"object"!=typeof a||Array.isArray(a)||Object.keys(a).some(a=>"reason"!==a)||"string"!=typeof a.reason||!a.reason.trim())throw Error("结束源查证须说明实际资料是否已足够及剩余未核事项");j=!0,m.clear(),p.push({reason:a.reason,engineeringDecision:"not-evaluated"})}catch(a){e=a instanceof Error?a.message:String(a)}for(let a of(e&&d.push(e),l.toolCalls))s.push({role:"tool",toolCallId:a.id,content:JSON.stringify(e?{performed:!1,accepted:!1,error:e}:{performed:!0,stage:"source-reading-finished",engineeringDecision:"not-evaluated",instruction:`准备阶段已结束;下一轮按专业推理调用${h.name}完整提交,当前没有采用任何工法候选`})});a.onProgress(b,c,d),u(),e&&o(e);continue}let v=l.toolCalls.filter(a=>a.name===h.name);if(1===v.length&&1===l.toolCalls.length){let e=y(a.project,b);try{let d=JSON.parse(v[0].arguments);return await (0,r.Qf)(()=>Promise.resolve(a.validateSubmission?.(d,e,b)),f),g(),{raw:d,reads:b,attempts:c,sources:e,...p.length?{preparationReceipts:p}:{}}}catch(h){g(),i=!0;let e=h instanceof Error?h.message:String(h);d.push(e);let f=e.includes("图纸泛指")||e.includes("转交图示")||e.includes("后续审批")?"把 instruction 改写成「对象+部位+工序动作+控制要求」的可执行句;删除“按图/按设计图/按审批/以…为准/待深化/报审后执行”等指向语,来源证明仍保留在 evidence 中。":e.includes("控制值须为明确数值及单位")?"单一工程控制值只能是明确数值+单位;来源原文是范围或约数时不得作为工程控制值——若它是源内条件义务,改用 action=qualitative-controls 的 conditional-duty 原样保留范围与完整条件;若只需正文引用原文,改用 action=use-sources。":e.includes("缺逐项独立用途复核")?"提交须逐项覆盖全部 controls:results 的 index 依次覆盖 0..controls.length-1,每项 status 与 reason 完整;漏项或重复即整次退回。":e.includes("非定性决定不能附加未核定采用许可")?"qualitativeControls 只能与 action=qualitative-controls 同时出现;engineering-controls 只提交 controls 数组,不得附带 qualitativeControls。":e.includes("工程适用性未确认")?"全部控制项必须逐项 confirmed;证据不足的部位关系保持 unmeasured 会导致整次退回——只提交已读证据足以支撑同一对象、工况、基准与适用条件的控制,其余以 use-sources 或 request-human 保留。":e.includes("未查询的来源")||e.includes("改写了原文")?"quote 必须是本次实际读取原文中的连续原字,sourceId 只能选择已返回的 sourceId。":"";s.push({role:"tool",toolCallId:v[0].id,content:JSON.stringify({accepted:!1,performed:!1,error:e,instruction:`${a.submission?"本次提交未采用;根据真实读取回执与本次校验错误纠正当前提案,不能把缺证据的关系宣称已核定或扩大提交范围。":"本次裁决未采用;只根据已读证据纠正当前提案,不用含数字的guidance或图示指向语绕过工程控制校验。"}${f?`纠正方向:${f}`:""}`})}),a.onProgress(b,c,d),u(),o(`裁决未通过独立校验:${e}`);continue}}for(let e of l.toolCalls){let f,h;g();try{if(v.length)throw Error("读取与提交须分轮;本轮混合请求全部未执行,请先完成查证");let b=JSON.parse(e.arguments),c="read_frozen_source"===e.name?"source":"read_frozen_cad"===e.name&&a.readCad?"cad":"read_frozen_work_packages"===e.name&&a.readWorkPackages?"work-package":void 0;if(!c)throw Error("主控请求了未提供的能力");let d=Object.keys(("source"===c?C:"cad"===c?D:F).properties);if(!b||"object"!=typeof b||Object.keys(b).some(a=>!d.includes(a)))throw Error("读取定位字段无效");let g="cad"!==c||b.kind&&"frames"!==b.kind?b:{limit:24,detail:"catalog",...b};(f={kind:c,query:g}).result="source"===c?n(a.project,g):"cad"===c?a.readCad(g):a.readWorkPackages(g),h=f.result}catch(b){let a=b instanceof Error?b.message:String(b);f?f.error=a:d.push(a),h={error:a,performed:!1}}f&&b.push(f),s.push({role:"tool",toolCallId:e.id,content:JSON.stringify(h)}),a.onProgress(b,c,d)}u(),o("实际读取没有新的源材料或游标"),s.push({role:"user",content:"已保留本轮实际读取;使用nextOffset继续真实未完成分页。重复同页或空结果不表示新增证据,不凭查证动作扩大用途。"})}})}catch(a){if(a instanceof G)throw a;throw g(),new G("OPERATION_FAILED",a instanceof Error?a.message:String(a),e,a)}}var J=c(41240),K=c(68959),L=c(9090);function M(a){let{controls:b,qualitativeControls:c,...d}=a;return{...d,...a.writingControls?{controls:a.writingControls}:{},...a.writingQualitativeControls?{qualitativeControls:a.writingQualitativeControls}:{}}}let N=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function O(a){let b=new Map;return c=>({ask:async d=>{let l=a.contract.sections.find(a=>a.id===c);if(!l||"string"!=typeof d.question||!d.question.trim()||d.question.length>4e3||!Array.isArray(d.criterionIds)||!d.criterionIds.length||new Set(d.criterionIds).size!==d.criterionIds.length||d.criterionIds.some(a=>!l.criterionIds.includes(a))||void 0!==d.factQueries&&(!Array.isArray(d.factQueries)||d.factQueries.some(a=>!a||"string"!=typeof a.attribute||!a.attribute.trim()||Object.keys(a).some(a=>!["attribute","objectName"].includes(a))||void 0!==a.objectName&&"string"!=typeof a.objectName)))throw Error("主控问题必须指向当前作者的具体职责");if(void 0!==d.sourceQueries&&(!Array.isArray(d.sourceQueries)||d.sourceQueries.some(a=>Object.keys(a).some(a=>!["query","filePath","offset","limit"].includes(a)))))throw Error("原文查询须明确实际定位条件");let m=(d.sourceQueries??[]).map(b=>n(a.project,b)),r=N([c,d]),s=b.get(r);if(s)return s;let t=(async()=>{var b,n;let s,t,u,v,x,y,z,B,C=a.contract.criteria.filter(a=>d.criterionIds.includes(a.id)),D=new Set(C.flatMap(a=>a.factIds??[])),E=(d.factQueries??[]).map(b=>(0,g.j)(a.project,b));for(let a of E)if("resolved"===a.status)for(let b of a.candidates)D.add(String(b.factId));let F=a.project.facts.filter(b=>D.has((0,e.vg)(b))&&(0,f.j)(b)&&Object.hasOwn(a.project.sources,b.sourceFile)).filter(a=>!(0,i.p)(a).requiresTechnicalDecision).filter(b=>!b.resolutionRef||!!(b.resolutionRef.winnerSourceFile&&Object.hasOwn(a.project.sources,b.resolutionRef.winnerSourceFile))).map(b=>({...(0,j.YL)(a.project,b),factId:(0,e.vg)(b),sourceFile:b.resolutionRef?.winnerSourceFile??b.sourceFile,sourceRef:b.resolutionRef?b.resolutionRef.winnerSourceRef??null:b.sourceRef??null})),G=["你是专业文档的主智能体,回答作者在正式提交首稿前遇到的具体问题。",...a.sharedPlan?[`【本轮共同组织候选与真实任务接口】${JSON.stringify((0,J.E6)(a.sharedPlan,a.contract.sections,l.id))}。在既有对象、阶段与接口内裁决,发现来源冲突须说明具体冲突,不能让作者独自另换工序或把未决值写成正文。`]:[],...a.contract.deliveryPolicy?[(0,h.Jf)({projectType:a.contract.writingKnowledge?.projectType,title:l.title,responsibility:l.responsibility,contentTypes:l.contentTypes}).text]:[],"可选择 use-facts(指向给定可靠事实)、use-sources(提供已查询的完整原文)、engineering-controls(真实定量控制及推导)、qualitative-controls(实际方法/定性采用或原源条件义务,独立复核后只授指定任务用途)、guidance(定性方法与职责指引)、request-human(资料或合同需改变)。","不得编造项目数值或标准限值,guidance只给方法建议,不构成任何数值或选型采用许可。已有原文的工程决定应提交具体controls或qualitativeControls独立核定,不以笼统组织词代替。先通过明确原文查询定位条件与方法;原文可用时提供完整来源,不因尚未抽成属性就直接交回人。确需外部资料或更改合同才保留未决。数值范围仍须按对象与阶段解析,不能任选端点。不要代写整节正文。",'只返回{"action":"guidance","answer":"可执行的回答","factIds":[],"sourceIds":[],"reason":"为何这样裁决"}。use-sources的sourceIds必须选择本次原文查询实际返回的来源身份。',"engineering-controls的factIds仅为controls中实际derivation.inputFactIds的去重并集;直接引用原文、没有算式时必须返回factIds:[]。读过的候选不等于采用的推导输入,不能把待核定范围放入factIds。每项工程控制的实质决定全部写入controls,answer只解释状态,不能用图示指向语替代控制项。","engineering-controls另须controls数组,每项为{objectName,attribute,condition,value,instruction,evidence:[{sourceId,quote}],derivation?:{formula,inputFactIds,basis}}。quote须来自已查询原文的真实连续引文,value须有数值及单位,condition明确适用部位与阶段,不泛化全工程;优先使用原文明确的控制标高等可执行属性,无须强行生成统一总深度。只有已提供的可靠单值事实可作推导输入,算式用$0、$1及四则括号,服务端核量纲与算术。sourceIds为全部实际用到的原文身份,factIds为全部推导输入;执行指引不添加未经核定的参数。裁决不会改写冻结项目事实或证明整篇合格。",'qualitative-controls另须qualitativeControls:[{category:"conditional-duty|project-adoption",objectName,attribute,condition,value,instruction,evidence:[{sourceId,quote}]}]。保持源内真实承担主体、触发、例外、适用对象。conditional-duty只能忠实履行源义务,不批准候选目录参数为当前选型。project-adoption须真实当前项目采用关系,参考选项须真实selector桥,未决A不批准采用。真正定量控制仍用engineering-controls。sourceIds为实际证据身份全集,factIds为[]。',"事实查询结果含完整口径状态;ambiguous/unbound/unmeasured/needs-technical-decision不能通过任选一个候选变成已确认施工值。概况范围不得取端点或平均值冒充各部位深度,分层厚度不能当坑深。分页未完成时不能声称已核完整集合。",JSON.stringify({task:l,criteria:C,facts:F,factQueries:E,question:d,sourceFiles:[...new Set([...F.map(a=>a.sourceFile),...m.flatMap(a=>a.sources.map(a=>a.filePath)),...Object.keys(a.project.sources).filter(a=>/\.(?:dwg|dxf)$/iu.test(a))])]})].join("\n"),H=`chief:${r.slice(0,28)}`,M=async(b,d,f)=>{if(!b||!["use-facts","use-sources","engineering-controls","qualitative-controls","guidance","request-human"].includes(b.action??"")||"string"!=typeof b.answer||!b.answer.trim()||b.answer.length>3e3||"string"!=typeof b.reason||!b.reason.trim()||!Array.isArray(b.factIds)||new Set(b.factIds).size!==b.factIds.length||b.factIds.some(a=>!F.some(b=>b.factId===a))||"use-facts"===b.action&&!b.factIds.length||"guidance"===b.action&&((0,q.ei)(b.answer).length||b.factIds.length))throw Error("主智能体裁决越过事实或职责边界,未执行");let g=b.sourceIds??[];if("request-human"===b.action&&function(a){let b=new Map,c=new Map;for(let d of a){if(d.error)return!0;if("cad"===d.kind){if(!d.result)return!0;let a=d.query,b=d.result;if(!Array.isArray(b.records)||!Number.isSafeInteger(b.offset)||b.offset<0||"string"!=typeof b.parsedIdentity||"string"!=typeof b.projectSnapshotId)return!0;let e=JSON.stringify([a.filePath,a.kind??"frames",a.rootInstanceId??null,a.frameId??null,a.entityId??null,a.query??"",a.placement??"all",a.textOnly??!1,a.order??"source",a.detail??"full"]),f=c.get(e)??[];f.push({query:a,page:b}),c.set(e,f);continue}if("work-package"===d.kind&&d.result){let a=d.result;if(!0!==a.complete||a.items.length!==a.total)return!0;continue}if("source"!==d.kind||!d.result)continue;let a=d.query,e=JSON.stringify([a.filePath??null,a.query]),f=b.get(e)??[];f.push(d.result),b.set(e,f)}for(let b of c.values()){if(b.some(({page:a})=>a.parsedIdentity!==b[0].page.parsedIdentity||a.projectSnapshotId!==b[0].page.projectSnapshotId))return!0;let c=b.find(({page:a})=>null===a.nextOffset&&null!==a.total);if(["instances","frames"].includes(b[0].query.kind??"frames")&&!b[0].query.entityId&&!b[0].query.query&&b.some(({query:b,page:c})=>a.some(a=>{if("cad"!==a.kind||!a.result)return!1;let d=a.query;return d.filePath===b.filePath&&["annotations","geometry"].includes(d.kind??"")&&c.records.some(a=>void 0!==d.rootInstanceId&&a.payload.rootInstanceId===d.rootInstanceId||void 0!==d.frameId&&a.payload.id===d.frameId)})))continue;if(!c||null===c.page.total)return!0;let d=c.page.total,e=new Set;for(let{page:a}of b)for(let b=0;b<a.records.length;b+=1)e.add(a.offset+b);if(e.size!==d||[...e].some(a=>a>=d)||d>0&&!e.has(0))return!0}for(let a of b.values()){let b=a[0]?.matchedCount??0,c=new Set;for(let b of a)for(let a=0;a<b.sources.length;a+=1)c.add(b.offset+a);if(c.size!==b)return!0}return!1}(f))throw Error("相关冻结原文尚未完整定位,不能把未完成查询当作需要用户提供资料");if(!Array.isArray(g)||new Set(g).size!==g.length||g.some(a=>!d.some(b=>b.sourceId===a))||["use-sources","engineering-controls","qualitative-controls"].includes(b.action??"")&&!g.length||!["use-sources","engineering-controls","qualitative-controls","guidance"].includes(b.action??"")&&g.length)throw Error("主智能体原文选择没有冻结来源支持");if(["engineering-controls","qualitative-controls"].includes(b.action??"")&&!a.sharedPlan)throw Error("工程控制缺少本轮同版共享计划,不能声明新来源已经可以写入");let h="qualitative-controls"===b.action?await (0,L.lj)(b.qualitativeControls,{project:a.project,sources:d,task:l,criteria:C,taskId:c,planId:a.sharedPlan.id,decisionId:H,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.engineeringReviewer}):void 0;if(h){let a=new Set(h.controls.flatMap(a=>a.evidence.map(a=>a.sourceId)));if(b.factIds.length||a.size!==g.length||g.some(b=>!a.has(b)))throw Error("定性决定来源清单与实际证据不一致");v=h.sourceApplicationReceipt,u=h.review}else if(void 0!==b.qualitativeControls)throw Error("非定性决定不能附加未核定采用许可");let i="engineering-controls"===b.action?await w(b.controls,{project:a.project,sources:d,task:l,taskId:c,planId:a.sharedPlan.id,decisionId:H,criteria:C,facts:F,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.engineeringReviewer,cadReadings:f.filter(a=>"cad"===a.kind)}):void 0;if(i){let a=new Set(i.controls.flatMap(a=>a.evidence.map(a=>a.sourceId))),c=new Set(i.controls.flatMap(a=>a.derivation?.inputFactIds??[]));if(g.length!==a.size||g.some(b=>!a.has(b))||b.factIds.length!==c.size||b.factIds.some(a=>!c.has(a)))throw Error("工程裁决来源清单与实际控制项不一致");u=i.review}else if(void 0!==b.controls)throw Error("非工程裁决不能附加未经复核的控制项");let j=i?.controls.map(b=>{let{objectName:c,attribute:d,condition:f,value:g,instruction:h}=b,i=b.derivation,j=i?.inputFactIds.length===1&&"$0"===i.formula.replace(/\s/gu,"")?a.project.facts.find(a=>(0,e.vg)(a)===i.inputFactIds[0]&&a.objectName===c&&[a.fieldId,a.fieldName,a.key,(0,e.nD)(a)?.key,(0,e.nD)(a)?.label,...(0,e.nD)(a)?.aliases??[]].some(a=>a&&(0,p.K3)(a)===(0,p.K3)(d))&&(0,p.K3)(a.value)===(0,p.K3)(g)):void 0,l=j&&(0,k.mk)(a.project,(0,e.vg)(j)).factIndex;return{objectName:c,attribute:d,condition:f,value:g,instruction:h,authorReferences:"number"==typeof l?{factIndices:[l]}:i?{derivedNumbers:[{formula:i.formula,inputFactIndices:i.inputFactIds.map(b=>(0,k.mk)(a.project,b).factIndex),basis:i.basis}]}:{sourceIndices:[...new Set(b.evidence.map(a=>a.sourceIndex))]}}}),m=h?.controls.map(({evidence:b,...c})=>{let d=b.map(b=>(0,k.mk)(a.project,void 0,b.sourceId).sourceIndex);if(d.some(a=>"number"!=typeof a))throw Error("定性决定来源没有本轮完整原文序号");return{...c,authorReferences:{sourceIndices:[...new Set(d)]}}}),n=i?`以下控制已独立复核,只用于指定对象及工况。按authorReferences在实际正文片段登记对应类型:factIndices引用既定事实,derivedNumbers登记算式,sourceIndices仅用于原文直接控制。证明中的范围句不支持派生或既定单值,不能给它们另挂原文索引;不把裁决身份当作新事实来源:${JSON.stringify(j)}`:h?`以下具体定性决定已经独立核定,严格保持各自category与适用对象条件;source-obligation-only不授当前选型或施工量。实际正文仍登记sourceIndices并逐次终评,不把许可当事实:${JSON.stringify(h.controls.map(b=>({...b,evidence:b.evidence.map(b=>({...b,...(0,k.mk)(a.project,void 0,b.sourceId)}))})))}`:"use-sources"===b.action?`以下是完整冻结原文,保留条件与来源,须判断适用性后编写;不自动转为已确认的项目单值:${JSON.stringify(d.filter(a=>g.includes(a.sourceId)))}`:"use-facts"===b.action?`采用冻结模型中的下列事实及其适用对象,不扩大其范围:${JSON.stringify(F.filter(a=>b.factIds.includes(a.factId)))}`:b.answer;return i&&(v=i.sourceApplicationReceipt),{decisionId:H,taskId:c,action:b.action,answer:n,factIds:b.factIds,...g.length?{sourceIds:g}:{},...i?{controls:i.controls,writingControls:j}:{},...h?{qualitativeControls:h.controls,writingQualitativeControls:m}:{},reason:b.reason,source:"model"}};try{let b=(a,b,c)=>{x=a,y=b,z=c,s=b.at(-1)},c=a.reviewer?await A({project:a.project,prompt:G,initialSourceQueries:d.sourceQueries??[],readCad:a.readCad,onProgress:b,ask:a.reviewer}):await I({project:a.project,prompt:G,initialSourceQueries:d.sourceQueries??[],readCad:a.readCad,readWorkPackages:b=>(0,o.H)(a.project,b),onProgress:b,diagnostics:a.diagnostics,signal:a.signal,validateSubmission:async(a,b,c)=>{B=await M(a,b,c)}});if(s=c.raw,x=c.reads,y=c.attempts,t=B??await M(s,c.sources,c.reads),a.signal?.throwIfAborted(),["engineering-controls","qualitative-controls"].includes(t.action)){if(!v)throw Error("本次工程控制没有同版来源用途证明,未执行");(0,K.WI)(a.project,v)}}catch(b){if(a.signal?.aborted)throw b;t={decisionId:H,taskId:c,action:"unmeasured",answer:"本次主控裁决未通过,未核定新的事实或技术决定;不能据此认定需要用户确认。实质技术问题须具体说明对象和工况后重新查询;已完成的正文交submit_author_task,不能以本回执代替内容验收。",factIds:[],reason:b instanceof Error?b.message:String(b),source:"model-rejected"}}return a.onReceipt({decision:t,question:d,inputHash:N(G),raw:s??null,...x?{reads:x,attempts:y,readingProtocolErrors:z}:{},...void 0===u?{}:{engineeringReview:u},...["engineering-controls","qualitative-controls"].includes(t.action)&&v?{sourceApplicationReceipt:v}:{}}),b=a.diagnostics,n={at:c,decisionId:H,action:t.action,reason:t.reason,readings:d.question,source:t.source,execution:"model-rejected"===t.source?"unlanded":"performed",executionNote:"model-rejected"===t.source?"模型裁决未通过,未执行新的技术决定,不登记为人工资料缺口":"通过工具回执返回当前作者;正文是否采用由候选与合同评价核对"},b&&(b.supervisorDecisionLog??=[]).push(n),t})();return b.set(r,t),t}})}},31859:(a,b,c)=>{c.d(b,{I:()=>i});var d=c(96770),e=c(19668),f=c(43967);let g=globalThis,h=g.__customizeConfigStores??=new Map;function i(){(0,f.jF)();let a=(0,e.J0)();return h.has(a)||h.set(a,new d.ConfigStore(a)),h.get(a)}},33972:(a,b,c)=>{function d(a,b){return a.criteria.filter(a=>a.sectionId===b&&a.applicable)}function e(a,b){if(!Array.isArray(b)||b.some(b=>!Number.isSafeInteger(b)||b<0||b>=a.length)||new Set(b).size!==b.length)throw Error("职责序号必须唯一且属于当前委派任务");return b.map(b=>a[b])}c.d(b,{C:()=>d,resolveAuthorCriterionIndices:()=>e})},34027:(a,b,c)=>{c.d(b,{RT:()=>g,Ri:()=>f,zV:()=>h});var d=c(77598),e=c(73123);function f(a,b){return(0,e.gM)(a),Object.fromEntries(Object.entries(b).map(([b,c])=>{let e=a.sources[b],f=a.documents.find(a=>a.sourceFile===b);if(!e||!f||e.sourceSha256!==c.sourceSha256||e.parsedSha256!==c.parsedSha256)throw Error(`一致性来源上下文与冻结解析/源身份不一致:${b}`);let g=a.decisions.filter(a=>a.currentSourceFiles.includes(b)||a.candidateSourceFiles.includes(b)||f.domainDependencies.some(b=>b.family===a.family&&b.domain===a.domain)),h=a.declarations.filter(a=>a.sources.some(a=>a.sourceFile===b)||g.some(b=>b.declarationIds.includes(a.id))),i={version:"tender-source-context-v3",policyVersion:a.version,policyId:a.policyId,assetFingerprint:a.assetFingerprint,sourceIdentity:structuredClone(e),document:structuredClone(f),declarations:structuredClone(h),decisions:structuredClone(g),applicability:g.map(a=>({family:a.family,domain:a.domain,status:a.status,current:a.currentSourceFiles.includes(b),candidate:a.candidateSourceFiles.includes(b)}))};return[b,{...i,contextFingerprint:(0,d.createHash)("sha256").update(JSON.stringify(i)).digest("hex")}]}))}function g(a){let{contextFingerprint:b,...c}=a;if("tender-source-context-v3"!==c.version||c.policyVersion!==e.xg||b!==(0,d.createHash)("sha256").update(JSON.stringify(c)).digest("hex")||![c.policyId,c.assetFingerprint,c.sourceIdentity?.sourceSha256,c.sourceIdentity?.parsedSha256].every(a=>/^[a-f0-9]{64}$/u.test(a))||!c.document?.sourceFile?.trim()||!Array.isArray(c.document.editionScopes)||!Array.isArray(c.document.scopeEvidenceChunks)||c.document.families.some(a=>!c.document.editionScopes.some(b=>b.family===a))||c.document.scopeEvidenceChunks.some(a=>a.sha256!==(0,d.createHash)("sha256").update(a.text).digest("hex")))throw Error("职责来源适用资格缺少当前冻结源/解析/版本上下文身份或发行作用范围,或被改写")}function h(a){g(a);let b=a.document;return{document:{sourceFile:b.sourceFile,title:b.title,isClarification:b.isClarification,projectIdentifier:b.projectIdentifier,issuedAt:b.issuedAt,families:b.families,editionScopes:b.editionScopes.map(a=>({family:a.family,mode:a.mode,heading:a.heading})),domainDependencies:b.domainDependencies.map(a=>({family:a.family,domain:a.domain,quote:a.quote,authoritySources:a.authoritySources.map(a=>({sourceFile:a.sourceFile,quote:a.quote}))}))},declarations:a.declarations.map(a=>({id:a.id,family:a.family,domains:a.domains,quote:a.quote,issuedAt:a.issuedAt,projectIdentifier:a.projectIdentifier,title:a.title,sources:a.sources.map(a=>({sourceFile:a.sourceFile}))})),applicability:a.applicability,decisions:a.decisions.map(a=>({id:a.id,declarationId:a.declarationId,declarationIds:a.declarationIds,family:a.family,domain:a.domain,status:a.status,reason:a.reason,current:a.currentSourceFiles.includes(b.sourceFile),candidate:a.candidateSourceFiles.includes(b.sourceFile)}))}}},35821:(a,b,c)=>{c.d(b,{Eh:()=>f,Mv:()=>o,VN:()=>h,Iu:()=>i});var d=c(19898),e=c(73055);let f=.6,g=null;function h(){return g||(g=new d.LocalTransformersEmbeddingProvider({})),g}async function i(){if("1"!==process.env.DOCUMENT_SKIP_EMBED_PREFLIGHT)try{await h().embedQuery("生成前置检查")}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`本地语义模型预热失败(生成前置检查,可用 DOCUMENT_SKIP_EMBED_PREFLIGHT=1 跳过):${a}`,{cause:b})}}let j=new Map,k=0,l=0;async function m(a,b){let c=b?await b(a):await h().embedDocuments(a);if(c.length!==a.length)throw Error(`本地语义模型嵌入数量不一致:期望 ${a.length} 条,实际 ${c.length} 条`);return c}async function n(a,b){if("0"===process.env.DOCUMENT_EMBED_CACHE)return m(a,b);let c=Array(a.length),d=[],e=new Map;for(let b=0;b<a.length;b+=1){let f=a[b];if(f.length<=2e3){let a=j.get(f);if(a){c[b]=a,k+=1,j.delete(f),j.set(f,a);continue}}let g=e.get(f);g?g.push(b):(e.set(f,[b]),d.push(f))}if(0===d.length)return c;let f=await m(d,b),g=function(){let a=Number(process.env.DOCUMENT_EMBED_CACHE_SIZE||4e4);return Number.isFinite(a)&&a>0?a:4e4}();for(let a=0;a<d.length;a+=1){let b=d[a],h=f[a],i=e.get(b);for(let a of i)c[a]=h;if(b.length<=2e3&&(l+=i.length,j.set(b,h),j.size>g)){let a=j.keys().next().value;void 0!==a&&j.delete(a)}}return c}async function o(a,b,c){if(0===a.length||0===b.length)return()=>0;let d=[...a,...b],f=await n(d,c),g=new Map;for(let a=0;a<d.length;a++)g.has(d[a])||g.set(d[a],f[a]);return(a,b)=>{let c=g.get(a),d=g.get(b);return c&&d?(0,e.Om)(c,d):0}}},36372:(a,b,c)=>{c.d(b,{M8:()=>l,a0:()=>k,hM:()=>j});var d=c(35821),e=c(86697);let f=["对与评标活动有关的工作人员的纪律要求","评标委员会成员与投标人接触的限制","评标纪律与廉洁从业承诺要求","评审争议处理与投标澄清配合程序","评审结果确认与中标公示流程","评标办法与分值构成说明","异常低价评审与计算方式说明","清单计量与报价口径约定","投标文件实质性响应要求","投标保证金缴纳与退还程序","开标程序与投标文件递交截止时间","评标期间行为管控与资料闭环","预付款与进度款支付比例约定","履约担保与保证金缴纳退还约定","价格波动与合同价款调整约定","暂列金额与暂估价使用约定","税费计取与发票结算约定","违约责任与罚款赔偿条款"],g=["劳动力配置计划与高峰期人数安排","施工质量保证措施与验收标准","安全生产管理与教育培训要求","施工进度计划与关键线路安排","材料设备采购进场计划与检验要求","施工现场文明施工与环境保护管理","劳动纪律与班组作业管理制度","施工机械设备配置与维护保养计划","农民工工资支付保障与劳务实名制管理","材料采购质量证明与进场验收管理","工期承诺与进度考核奖惩管理"],h=/评标|投标|行贿|打招呼|递条子|廉洁|串标|围标|弄虚作假|干扰评标|纪律|澄清|中标|报价|清单计量|评审|保证金|开标|递交|争议|异常低价|评标基准价|预付款|进度款|担保|价格波动|材料调差|暂列金额|暂估价|计税|税金|发票|违约|业绩证明|类似(?:工程)?业绩|获奖|荣获|协会颁发|营业执照|资质证书|安全生产许可证|认证证书|管理体系认证|审计报告|信用等级|信用评价|社保证明|无行贿犯罪|中标查询|中标公示|中标结果|电子交易系统|公共资源交易|质疑投诉|评标委员会/u;function i(a){let b=a.sectionTitle?.trim()||"",c=(a.content||"").replace(/\s+/gu," ").slice(0,400);return b?`${b}。${c}`:c}function j(a){let b=a.sectionTitle?.trim()||a.content.replace(/\s+/gu,"").slice(0,60);return`${a.filePath}::${b}`}async function k(a,b){if(0===a.length)return{safe:[],excluded:[]};let c=a.filter(a=>h.test(i(a)));if(0===c.length)return{safe:[...a],excluded:[]};let e=c.map(i),j=await (0,d.Mv)(e,[...f],b),k=await (0,d.Mv)(e,[...g],b),l=new Set;for(let a of c){let b=i(a),c=Math.max(...f.map(a=>j(b,a))),d=Math.max(...g.map(a=>k(b,a)));c>=.6&&c>d&&l.add(a)}return{safe:a.filter(a=>!l.has(a)),excluded:[...l]}}async function l(a){return(0,e.A)({prototypes:[...f],negativePrototypes:[...g],threshold:.6,embedDocuments:a})}},36594:(a,b,c)=>{c.d(b,{LA:()=>k,Yn:()=>i,ZB:()=>j,eW:()=>l});var d=c(77598),e=c(97979),f=c(83653),g=c(57268);let h=a=>(0,d.createHash)("sha256").update(a).digest("hex");function i(a,b){let c=new Map;for(let b of a){let a=[...b.content.matchAll(/(?:发布日期|发布于|出具日期|印发日期)\s*[::]?\s*(20\d{2})\s*年\s*(\d{1,2})\s*月\s*(\d{1,2})\s*日/gu)].map(a=>`${a[1]}-${a[2].padStart(2,"0")}-${a[3].padStart(2,"0")}`);a.length&&c.set(b.filePath,[...c.get(b.filePath)??[],...a])}let g=a.flatMap(a=>{if(!["tender_document","addendum","tender","clarification","tender_text"].includes(a.roleId??""))return[];let d=b.sources[a.filePath];if(!d||void 0===a.chunkIndex)return[];let f=b.documents.find(b=>b.sourceFile===a.filePath),g=c.get(a.filePath)??[];return(0,e.Su)([{text:a.content,source:`${a.filePath} ${a.sectionTitle??""}`}]).filter(a=>a.openingDate&&"reference"!==a.openingDate.role).map(b=>({candidate:b,item:a,source:d,projectIdentifier:f?.projectIdentifier??null,issuedAt:1===new Set(g).size?g[0]:null,isClarification:f?.isClarification??!1}))}),i=new Map;for(let a of g){let b=a.candidate.openingDate,c=JSON.stringify([a.projectIdentifier,b.objectName,b.kind]),d=i.get(c)??[];d.push(a),i.set(c,d)}return[...i.values()].flatMap(a=>{let b,c=a.filter(a=>"current"===a.candidate.openingDate.role);if(!c.length)return[];let e=c.filter(a=>a.candidate.clarified),g=e.length&&c.every(a=>a.candidate.clarified||!a.isClarification)?e:c;if(new Set(g.map(a=>a.candidate.value)).size>1&&g.every(a=>a.issuedAt)){let a=[...g.map(a=>a.issuedAt)].sort().at(-1);g=g.filter(b=>b.issuedAt===a)}let i=(0,f.iC)({facts:[],overrides:[],labeledValues:g.map(a=>a.candidate)}).resolved.find(a=>"开工日期"===a.attribute);if(!i)return[];let j=g.find(a=>a.candidate.value===i.value&&i.evidence.some(b=>b.source===a.candidate.source));if(!j)return[];let k=j.candidate.openingDate,l=new Set(g.map(a=>a.candidate.value)).size>1||new Set(g.map(a=>(a.candidate.openingDate.condition??"").replace(/\s+/gu,""))).size>1,m=k.kind,n="planned"===m?"planned_start_date":"actual"===m?"actual_start_date":"construction_start_date",o="planned"===m?"计划开工日期":"actual"===m?"实际开工日期":"开工日期",p=[...new Set(l?a.filter(a=>"superseded"===a.candidate.openingDate.role).map(a=>a.candidate.value):[...i.superseded,...a.filter(a=>!g.includes(a)).map(a=>a.candidate.value)])].filter(a=>a!==i.value),q=a.map(a=>({value:a.candidate.value,sourceFile:a.item.filePath,chunkIndex:a.item.chunkIndex,quote:a.candidate.openingDate.quote}));return[{factId:`temporal:${(b=[n,k.objectName,j.item.filePath,j.item.chunkIndex,k.quote,i.value],(0,d.createHash)("sha256").update(JSON.stringify(b)).digest("hex")).slice(0,24)}`,fieldId:n,key:o,fieldName:o,objectName:k.objectName,value:i.value,confidence:l?.5:.95,sourceFile:j.item.filePath,roleId:j.item.roleId,processingType:j.item.processingType,sourceRef:{filePath:j.item.filePath,roleId:j.item.roleId,processingType:j.item.processingType,chunkIndex:j.item.chunkIndex,sectionTitle:j.item.sectionTitle,sourceSpan:k.quote,contextSpan:j.item.content},temporalConstraint:{event:"construction-start",kind:m,status:l?"unmeasured":"resolved",date:i.value,...k.condition?{condition:k.condition}:{},superseded:p,sourceSha256:j.source.sourceSha256,parsedSha256:j.source.parsedSha256,chunkSha256:h(j.item.content),quoteSha256:h(k.quote),history:q}}]})}function j(a,b){let c=b.filter(a=>a.temporalConstraint?.event==="construction-start"&&"planned"===a.temporalConstraint.kind&&"resolved"===a.temporalConstraint.status&&"项目主体"===a.objectName),d=1===new Set(c.map(a=>a.value)).size?c.slice(0,1):[];return{...a,facts:[...a.facts.filter(a=>"开工日期"!==(0,f.hf)(String(a.key??""),a.label)),...d.flatMap(a=>a.temporalConstraint.history.filter(b=>a.temporalConstraint.superseded.includes(b.value)).map(a=>({key:"开工日期",value:a.value,sourceFile:a.sourceFile})))],overrides:(a.overrides??[]).filter(a=>"date"!==(0,e.dm)(a.superseded)&&"date"!==(0,e.dm)(a.effective)),labeledValues:[...(a.labeledValues??[]).filter(a=>"开工日期"!==a.attribute),...d.map(a=>({attribute:"开工日期",value:a.value,source:`${a.sourceFile} ${a.sourceRef?.sectionTitle??""}`,clarified:!0,supersedesPriorMaterials:!1}))]}}function k(a){return a.filter(a=>a.temporalConstraint).map(a=>{let b=a.temporalConstraint,c="unmeasured"===b.status?"同一事件日期尚有未决值,须依据完整原文核定,不能任选一个日期或宣称已确定":`${a.fieldName}为${b.date};${"planned"===b.kind?"仅作进度计划起点,不得写成已确定的实际开工日":"保持该事件的原文性质"}`;return(0,g.v7)(`进度安排必须承接${a.objectName}的开工事件:${c}${b.condition?`;触发条件完整保留:${b.condition.replace(/\s+/gu,"")}`:""};仅采用现行事件口径,不新增工期或把通知条件删成固定日历承诺。`,JSON.stringify({type:"source-bound-temporal-fact",factId:a.factId,sourceFile:a.sourceFile,sourceRef:a.sourceRef,temporalConstraint:b}))})}function l(a,b){let c=(0,e.Su)([{text:a.text,source:"reviewed-duty"}]).filter(a=>a.openingDate).flatMap(c=>b.filter(b=>{let d=b.temporalConstraint,e=c.openingDate;return d?.status==="resolved"&&d.superseded.includes(c.value)&&b.objectName===e.objectName&&("unspecified"===e.kind||e.kind===d.kind)&&d.history.some(b=>b.value===c.value&&a.sources.some(a=>a.file===b.sourceFile))}).map(a=>({label:c,fact:a}))),d=new Map;for(let a of c){let b=a.label.openingDate,c=`${b.dateStartChar}:${b.dateEndChar}`,e=d.get(c)??[];e.push(a),d.set(c,e)}let f=a.text,g=[];for(let a of[...d.values()].sort((a,b)=>b[0].label.openingDate.dateStartChar-a[0].label.openingDate.dateStartChar)){if(1!==new Set(a.map(a=>a.fact.value)).size)continue;let{label:b,fact:c}=a[0],d=b.openingDate;f=f.slice(0,d.dateStartChar)+c.value+f.slice(d.dateEndChar),g.push(c)}let h=[...new Map(g.map(a=>[a.factId,a])).values()];return h.length&&(f+=`;该日期控制已经由当前完整来源更正,${h.map(a=>`${a.fieldName}仅采用${a.value}${"planned"===a.temporalConstraint.kind?"作为计划基准,不能转成实际固定开工日":""}${a.temporalConstraint.condition?`,保留${a.temporalConstraint.condition.replace(/\s+/gu,"")}`:""}`).join(";")}`),{text:f,factIds:h.map(a=>a.factId),sources:h.map(a=>({factId:a.factId,sourceFile:a.sourceFile,sourceRef:a.sourceRef,temporalConstraint:a.temporalConstraint}))}}},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,critical:i,floatDays:k}=a,l={id:b.id,phaseId:b.phaseId,objectScope:b.objectScope,workfront:b.workfront,status:c};return"organization"===j||"materials"===j?l:{...l,predecessors:b.predecessors,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,critical:i,floatDays:k}}),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,view:j,scope:{taskId:c,activityIds:[...l],completeSelectedView:!0},task:i,phases:a.phases,activityDirectory:a.production.activities.map(({input:a})=>({id:a.id,phaseId:a.phaseId,objectScope:a.objectScope,workfront:a.workfront})),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)),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":"7ea0ee326182fc159e629b4cd9354c5c800c7d5e156fcd6533182444b20d26cf","semanticFingerprints":{"projectFacts":"41eefa652f4747c9ffd348393b6f50ac9e11a6393935ba73941c53f9a8b3cd59","documentGeneration":"900d3f22becafcfd4db0d2fd4d12f511764b7771631384de34ea759d722f9af0"},"gitCommit":"7507c09e332fbc3c131d96116fd15e4acbe71320","serverVersion":"4.60.3","sourceFiles":722,"capturedAt":"2026-10-12T17:13:59.654Z"}';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
+ ${d}`})};for(b.length&&(a.onProgress(b,c,d),u());;){g();let e=j?a.callOptions:a.readingCallOptions,k=j?q:[...q.filter(a=>a.name!==h.name&&"read_frozen_cad"!==a.name),H],l=await (0,r.Qf)(()=>(a.caller??r._v)({system:a.system??"你是负责专业边界、资料口径和作者协作的主智能体,使用实际工具查清工程对象及工况后裁决。",messages:s,tools:k,requireToolCall:!1,taskKind:e?.taskKind??"reasoning",diagnostics:a.diagnostics,signal:f,callKind:e?.callKind??"supervisor-decision",maxTokens:e?.maxTokens??12e3,temperature:0}),f);if(c.push(l??null),a.onProgress(b,c,d),g(),!l)throw Error("主控模型未返回有效响应,未执行读取或裁决");if(s.push({role:"assistant",content:l.content,toolCalls:l.toolCalls,...void 0!==l.thinkingContent?{thinkingContent:l.thinkingContent}:{}}),l.responseMetadata?.completed===!1){let e="本轮模型响应被截断,读取或提交均未执行;须根据实际响应容量返回完整工具请求,未闭合内容不执行";for(let a of(d.push(e),l.toolCalls))s.push({role:"tool",toolCallId:a.id,content:JSON.stringify({accepted:!1,performed:!1,error:e})});s.push({role:"user",content:e}),a.onProgress(b,c,d),o(e);continue}if(!l.toolCalls.length){d.push("本轮仅返回普通文本,未执行读取或裁决"),s.push({role:"user",content:`本轮普通文字未作为工程裁决执行。请调用已提供的读取工具继续查证,或调用${h.name}提交有实际依据的裁决。`}),a.onProgress(b,c,d),o("普通文字未执行工具裁决");continue}let t=l.toolCalls.filter(a=>a.name===H.name);if(!j&&(t.length||l.toolCalls.some(a=>a.name===h.name))){let e;if(1!==t.length||1!==l.toolCalls.length)e="普通源查证阶段不执行方案提交;结束准备与读取须分轮,之后用专业推理完整提交";else try{let a=JSON.parse(t[0].arguments);if(!a||"object"!=typeof a||Array.isArray(a)||Object.keys(a).some(a=>"reason"!==a)||"string"!=typeof a.reason||!a.reason.trim())throw Error("结束源查证须说明实际资料是否已足够及剩余未核事项");j=!0,m.clear(),p.push({reason:a.reason,engineeringDecision:"not-evaluated"})}catch(a){e=a instanceof Error?a.message:String(a)}for(let a of(e&&d.push(e),l.toolCalls))s.push({role:"tool",toolCallId:a.id,content:JSON.stringify(e?{performed:!1,accepted:!1,error:e}:{performed:!0,stage:"source-reading-finished",engineeringDecision:"not-evaluated",instruction:`准备阶段已结束;下一轮按专业推理调用${h.name}完整提交,当前没有采用任何工法候选`})});a.onProgress(b,c,d),u(),e&&o(e);continue}let v=l.toolCalls.filter(a=>a.name===h.name);if(1===v.length&&1===l.toolCalls.length){let e=y(a.project,b);try{let d=JSON.parse(v[0].arguments);return await (0,r.Qf)(()=>Promise.resolve(a.validateSubmission?.(d,e,b)),f),g(),{raw:d,reads:b,attempts:c,sources:e,...p.length?{preparationReceipts:p}:{}}}catch(h){g(),i=!0;let e=h instanceof Error?h.message:String(h);d.push(e);let f=e.includes("图纸泛指")||e.includes("转交图示")||e.includes("后续审批")?"把 instruction 改写成「对象+部位+工序动作+控制要求」的可执行句;删除“按图/按设计图/按审批/以…为准/待深化/报审后执行”等指向语,来源证明仍保留在 evidence 中。":e.includes("控制值须为明确数值及单位")?"单一工程控制值只能是明确数值+单位;来源原文是范围或约数时不得作为工程控制值——若它是源内条件义务,改用 action=qualitative-controls 的 conditional-duty 原样保留范围与完整条件;若只需正文引用原文,改用 action=use-sources。":e.includes("缺逐项独立用途复核")?"提交须逐项覆盖全部 controls:results 的 index 依次覆盖 0..controls.length-1,每项 status 与 reason 完整;漏项或重复即整次退回。":e.includes("非定性决定不能附加未核定采用许可")?"qualitativeControls 只能与 action=qualitative-controls 同时出现;engineering-controls 只提交 controls 数组,不得附带 qualitativeControls。":e.includes("工程适用性未确认")?"全部控制项必须逐项 confirmed;证据不足的部位关系保持 unmeasured 会导致整次退回——只提交已读证据足以支撑同一对象、工况、基准与适用条件的控制,其余以 use-sources 或 request-human 保留。":e.includes("未查询的来源")||e.includes("改写了原文")?"quote 必须是本次实际读取原文中的连续原字,sourceId 只能选择已返回的 sourceId。":"";s.push({role:"tool",toolCallId:v[0].id,content:JSON.stringify({accepted:!1,performed:!1,error:e,instruction:`${a.submission?"本次提交未采用;根据真实读取回执与本次校验错误纠正当前提案,不能把缺证据的关系宣称已核定或扩大提交范围。":"本次裁决未采用;只根据已读证据纠正当前提案,不用含数字的guidance或图示指向语绕过工程控制校验。"}${f?`纠正方向:${f}`:""}`})}),a.onProgress(b,c,d),u(),o(`裁决未通过独立校验:${e}`);continue}}for(let e of l.toolCalls){let f,h;g();try{if(v.length)throw Error("读取与提交须分轮;本轮混合请求全部未执行,请先完成查证");let b=JSON.parse(e.arguments),c="read_frozen_source"===e.name?"source":"read_frozen_cad"===e.name&&a.readCad?"cad":"read_frozen_work_packages"===e.name&&a.readWorkPackages?"work-package":void 0;if(!c)throw Error("主控请求了未提供的能力");let d=Object.keys(("source"===c?C:"cad"===c?D:F).properties);if(!b||"object"!=typeof b||Object.keys(b).some(a=>!d.includes(a)))throw Error("读取定位字段无效");let g="cad"!==c||b.kind&&"frames"!==b.kind?b:{limit:24,detail:"catalog",...b};(f={kind:c,query:g}).result="source"===c?n(a.project,g):"cad"===c?a.readCad(g):a.readWorkPackages(g),h=f.result}catch(b){let a=b instanceof Error?b.message:String(b);f?f.error=a:d.push(a),h={error:a,performed:!1}}f&&b.push(f),s.push({role:"tool",toolCallId:e.id,content:JSON.stringify(h)}),a.onProgress(b,c,d)}u(),o("实际读取没有新的源材料或游标"),s.push({role:"user",content:"已保留本轮实际读取;使用nextOffset继续真实未完成分页。重复同页或空结果不表示新增证据,不凭查证动作扩大用途。"})}})}catch(a){if(a instanceof G)throw a;throw g(),new G("OPERATION_FAILED",a instanceof Error?a.message:String(a),e,a)}}var J=c(41240),K=c(68959),L=c(9090);function M(a){let{controls:b,qualitativeControls:c,...d}=a;return{...d,...a.writingControls?{controls:a.writingControls}:{},...a.writingQualitativeControls?{qualitativeControls:a.writingQualitativeControls}:{}}}let N=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex");function O(a){let b=new Map;return c=>({ask:async d=>{let l=a.contract.sections.find(a=>a.id===c);if(!l||"string"!=typeof d.question||!d.question.trim()||d.question.length>4e3||!Array.isArray(d.criterionIds)||!d.criterionIds.length||new Set(d.criterionIds).size!==d.criterionIds.length||d.criterionIds.some(a=>!l.criterionIds.includes(a))||void 0!==d.factQueries&&(!Array.isArray(d.factQueries)||d.factQueries.some(a=>!a||"string"!=typeof a.attribute||!a.attribute.trim()||Object.keys(a).some(a=>!["attribute","objectName"].includes(a))||void 0!==a.objectName&&"string"!=typeof a.objectName)))throw Error("主控问题必须指向当前作者的具体职责");if(void 0!==d.sourceQueries&&(!Array.isArray(d.sourceQueries)||d.sourceQueries.some(a=>Object.keys(a).some(a=>!["query","filePath","offset","limit"].includes(a)))))throw Error("原文查询须明确实际定位条件");let m=(d.sourceQueries??[]).map(b=>n(a.project,b)),r=N([c,d]),s=b.get(r);if(s)return s;let t=(async()=>{var b,n;let s,t,u,v,x,y,z,B,C=a.contract.criteria.filter(a=>d.criterionIds.includes(a.id)),D=new Set(C.flatMap(a=>a.factIds??[])),E=(d.factQueries??[]).map(b=>(0,g.j)(a.project,b));for(let a of E)if("resolved"===a.status)for(let b of a.candidates)D.add(String(b.factId));let F=a.project.facts.filter(b=>D.has((0,e.vg)(b))&&(0,f.j)(b)&&Object.hasOwn(a.project.sources,b.sourceFile)).filter(a=>!(0,i.p)(a).requiresTechnicalDecision).filter(b=>!b.resolutionRef||!!(b.resolutionRef.winnerSourceFile&&Object.hasOwn(a.project.sources,b.resolutionRef.winnerSourceFile))).map(b=>({...(0,j.YL)(a.project,b),factId:(0,e.vg)(b),sourceFile:b.resolutionRef?.winnerSourceFile??b.sourceFile,sourceRef:b.resolutionRef?b.resolutionRef.winnerSourceRef??null:b.sourceRef??null})),G=["你是专业文档的主智能体,回答作者在正式提交首稿前遇到的具体问题。",...a.sharedPlan?[`【本轮共同组织候选与真实任务接口】${JSON.stringify((0,J.E6)(a.sharedPlan,a.contract.sections,l.id))}。在既有对象、阶段与接口内裁决,发现来源冲突须说明具体冲突,不能让作者独自另换工序或把未决值写成正文。`]:[],...a.contract.deliveryPolicy?[(0,h.Jf)({projectType:a.contract.writingKnowledge?.projectType,title:l.title,responsibility:l.responsibility,contentTypes:l.contentTypes}).text]:[],"可选择 use-facts(指向给定可靠事实)、use-sources(提供已查询的完整原文)、engineering-controls(真实定量控制及推导)、qualitative-controls(实际方法/定性采用或原源条件义务,独立复核后只授指定任务用途)、guidance(定性方法与职责指引)、request-human(资料或合同需改变)。","不得编造项目数值或标准限值,guidance只给方法建议,不构成任何数值或选型采用许可。已有原文的工程决定应提交具体controls或qualitativeControls独立核定,不以笼统组织词代替。先通过明确原文查询定位条件与方法;原文可用时提供完整来源,不因尚未抽成属性就直接交回人。确需外部资料或更改合同才保留未决。数值范围仍须按对象与阶段解析,不能任选端点。不要代写整节正文。",'只返回{"action":"guidance","answer":"可执行的回答","factIds":[],"sourceIds":[],"reason":"为何这样裁决"}。use-sources的sourceIds必须选择本次原文查询实际返回的来源身份。',"engineering-controls的factIds仅为controls中实际derivation.inputFactIds的去重并集;直接引用原文、没有算式时必须返回factIds:[]。读过的候选不等于采用的推导输入,不能把待核定范围放入factIds。每项工程控制的实质决定全部写入controls,answer只解释状态,不能用图示指向语替代控制项。","engineering-controls另须controls数组,每项为{objectName,attribute,condition,value,instruction,evidence:[{sourceId,quote}],derivation?:{formula,inputFactIds,basis}}。quote须来自已查询原文的真实连续引文,value须有数值及单位,condition明确适用部位与阶段,不泛化全工程;优先使用原文明确的控制标高等可执行属性,无须强行生成统一总深度。只有已提供的可靠单值事实可作推导输入,算式用$0、$1及四则括号,服务端核量纲与算术。sourceIds为全部实际用到的原文身份,factIds为全部推导输入;执行指引不添加未经核定的参数。裁决不会改写冻结项目事实或证明整篇合格。",'qualitative-controls另须qualitativeControls:[{category:"conditional-duty|project-adoption",objectName,attribute,condition,value,instruction,evidence:[{sourceId,quote}]}]。保持源内真实承担主体、触发、例外、适用对象。conditional-duty只能忠实履行源义务,不批准候选目录参数为当前选型。project-adoption须真实当前项目采用关系,参考选项须真实selector桥,未决A不批准采用。真正定量控制仍用engineering-controls。sourceIds为实际证据身份全集,factIds为[]。',"事实查询结果含完整口径状态;ambiguous/unbound/unmeasured/needs-technical-decision不能通过任选一个候选变成已确认施工值。概况范围不得取端点或平均值冒充各部位深度,分层厚度不能当坑深。分页未完成时不能声称已核完整集合。",JSON.stringify({task:l,criteria:C,facts:F,factQueries:E,question:d,sourceFiles:[...new Set([...F.map(a=>a.sourceFile),...m.flatMap(a=>a.sources.map(a=>a.filePath)),...Object.keys(a.project.sources).filter(a=>/\.(?:dwg|dxf)$/iu.test(a))])]})].join("\n"),H=`chief:${r.slice(0,28)}`,M=async(b,d,f)=>{if(!b||!["use-facts","use-sources","engineering-controls","qualitative-controls","guidance","request-human"].includes(b.action??"")||"string"!=typeof b.answer||!b.answer.trim()||b.answer.length>3e3||"string"!=typeof b.reason||!b.reason.trim()||!Array.isArray(b.factIds)||new Set(b.factIds).size!==b.factIds.length||b.factIds.some(a=>!F.some(b=>b.factId===a))||"use-facts"===b.action&&!b.factIds.length||"guidance"===b.action&&((0,q.ei)(b.answer).length||b.factIds.length))throw Error("主智能体裁决越过事实或职责边界,未执行");let g=b.sourceIds??[];if("request-human"===b.action&&function(a){let b=new Map,c=new Map;for(let d of a){if(d.error)return!0;if("cad"===d.kind){if(!d.result)return!0;let a=d.query,b=d.result;if(!Array.isArray(b.records)||!Number.isSafeInteger(b.offset)||b.offset<0||"string"!=typeof b.parsedIdentity||"string"!=typeof b.projectSnapshotId)return!0;let e=JSON.stringify([a.filePath,a.kind??"frames",a.rootInstanceId??null,a.frameId??null,a.entityId??null,a.query??"",a.placement??"all",a.textOnly??!1,a.order??"source",a.detail??"full"]),f=c.get(e)??[];f.push({query:a,page:b}),c.set(e,f);continue}if("work-package"===d.kind&&d.result){let a=d.result;if(!0!==a.complete||a.items.length!==a.total)return!0;continue}if("source"!==d.kind||!d.result)continue;let a=d.query,e=JSON.stringify([a.filePath??null,a.query]),f=b.get(e)??[];f.push(d.result),b.set(e,f)}for(let b of c.values()){if(b.some(({page:a})=>a.parsedIdentity!==b[0].page.parsedIdentity||a.projectSnapshotId!==b[0].page.projectSnapshotId))return!0;let c=b.find(({page:a})=>null===a.nextOffset&&null!==a.total);if(["instances","frames"].includes(b[0].query.kind??"frames")&&!b[0].query.entityId&&!b[0].query.query&&b.some(({query:b,page:c})=>a.some(a=>{if("cad"!==a.kind||!a.result)return!1;let d=a.query;return d.filePath===b.filePath&&["annotations","geometry"].includes(d.kind??"")&&c.records.some(a=>void 0!==d.rootInstanceId&&a.payload.rootInstanceId===d.rootInstanceId||void 0!==d.frameId&&a.payload.id===d.frameId)})))continue;if(!c||null===c.page.total)return!0;let d=c.page.total,e=new Set;for(let{page:a}of b)for(let b=0;b<a.records.length;b+=1)e.add(a.offset+b);if(e.size!==d||[...e].some(a=>a>=d)||d>0&&!e.has(0))return!0}for(let a of b.values()){let b=a[0]?.matchedCount??0,c=new Set;for(let b of a)for(let a=0;a<b.sources.length;a+=1)c.add(b.offset+a);if(c.size!==b)return!0}return!1}(f))throw Error("相关冻结原文尚未完整定位,不能把未完成查询当作需要用户提供资料");if(!Array.isArray(g)||new Set(g).size!==g.length||g.some(a=>!d.some(b=>b.sourceId===a))||["use-sources","engineering-controls","qualitative-controls"].includes(b.action??"")&&!g.length||!["use-sources","engineering-controls","qualitative-controls","guidance"].includes(b.action??"")&&g.length)throw Error("主智能体原文选择没有冻结来源支持");if(["engineering-controls","qualitative-controls"].includes(b.action??"")&&!a.sharedPlan)throw Error("工程控制缺少本轮同版共享计划,不能声明新来源已经可以写入");let h="qualitative-controls"===b.action?await (0,L.lj)(b.qualitativeControls,{project:a.project,sources:d,task:l,criteria:C,taskId:c,planId:a.sharedPlan.id,decisionId:H,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.engineeringReviewer}):void 0;if(h){let a=new Set(h.controls.flatMap(a=>a.evidence.map(a=>a.sourceId)));if(b.factIds.length||a.size!==g.length||g.some(b=>!a.has(b)))throw Error("定性决定来源清单与实际证据不一致");v=h.sourceApplicationReceipt,u=h.review}else if(void 0!==b.qualitativeControls)throw Error("非定性决定不能附加未核定采用许可");let i="engineering-controls"===b.action?await w(b.controls,{project:a.project,sources:d,task:l,taskId:c,planId:a.sharedPlan.id,decisionId:H,criteria:C,facts:F,diagnostics:a.diagnostics,signal:a.signal,reviewer:a.engineeringReviewer,cadReadings:f.filter(a=>"cad"===a.kind)}):void 0;if(i){let a=new Set(i.controls.flatMap(a=>a.evidence.map(a=>a.sourceId))),c=new Set(i.controls.flatMap(a=>a.derivation?.inputFactIds??[]));if(g.length!==a.size||g.some(b=>!a.has(b))||b.factIds.length!==c.size||b.factIds.some(a=>!c.has(a)))throw Error("工程裁决来源清单与实际控制项不一致");u=i.review}else if(void 0!==b.controls)throw Error("非工程裁决不能附加未经复核的控制项");let j=i?.controls.map(b=>{let{objectName:c,attribute:d,condition:f,value:g,instruction:h}=b,i=b.derivation,j=i?.inputFactIds.length===1&&"$0"===i.formula.replace(/\s/gu,"")?a.project.facts.find(a=>(0,e.vg)(a)===i.inputFactIds[0]&&a.objectName===c&&[a.fieldId,a.fieldName,a.key,(0,e.nD)(a)?.key,(0,e.nD)(a)?.label,...(0,e.nD)(a)?.aliases??[]].some(a=>a&&(0,p.K3)(a)===(0,p.K3)(d))&&(0,p.K3)(a.value)===(0,p.K3)(g)):void 0,l=j&&(0,k.mk)(a.project,(0,e.vg)(j)).factIndex;return{objectName:c,attribute:d,condition:f,value:g,instruction:h,authorReferences:"number"==typeof l?{factIndices:[l]}:i?{derivedNumbers:[{formula:i.formula,inputFactIndices:i.inputFactIds.map(b=>(0,k.mk)(a.project,b).factIndex),basis:i.basis}]}:{sourceIndices:[...new Set(b.evidence.map(a=>a.sourceIndex))]}}}),m=h?.controls.map(({evidence:b,...c})=>{let d=b.map(b=>(0,k.mk)(a.project,void 0,b.sourceId).sourceIndex);if(d.some(a=>"number"!=typeof a))throw Error("定性决定来源没有本轮完整原文序号");return{...c,authorReferences:{sourceIndices:[...new Set(d)]}}}),n=i?`以下控制已独立复核,只用于指定对象及工况。按authorReferences在实际正文片段登记对应类型:factIndices引用既定事实,derivedNumbers登记算式,sourceIndices仅用于原文直接控制。证明中的范围句不支持派生或既定单值,不能给它们另挂原文索引;不把裁决身份当作新事实来源:${JSON.stringify(j)}`:h?`以下具体定性决定已经独立核定,严格保持各自category与适用对象条件;source-obligation-only不授当前选型或施工量。实际正文仍登记sourceIndices并逐次终评,不把许可当事实:${JSON.stringify(h.controls.map(b=>({...b,evidence:b.evidence.map(b=>({...b,...(0,k.mk)(a.project,void 0,b.sourceId)}))})))}`:"use-sources"===b.action?`以下是完整冻结原文,保留条件与来源,须判断适用性后编写;不自动转为已确认的项目单值:${JSON.stringify(d.filter(a=>g.includes(a.sourceId)))}`:"use-facts"===b.action?`采用冻结模型中的下列事实及其适用对象,不扩大其范围:${JSON.stringify(F.filter(a=>b.factIds.includes(a.factId)))}`:b.answer;return i&&(v=i.sourceApplicationReceipt),{decisionId:H,taskId:c,action:b.action,answer:n,factIds:b.factIds,...g.length?{sourceIds:g}:{},...i?{controls:i.controls,writingControls:j}:{},...h?{qualitativeControls:h.controls,writingQualitativeControls:m}:{},reason:b.reason,source:"model"}};try{let b=(a,b,c)=>{x=a,y=b,z=c,s=b.at(-1)},c=a.reviewer?await A({project:a.project,prompt:G,initialSourceQueries:d.sourceQueries??[],readCad:a.readCad,onProgress:b,ask:a.reviewer}):await I({project:a.project,prompt:G,initialSourceQueries:d.sourceQueries??[],readCad:a.readCad,readWorkPackages:b=>(0,o.H)(a.project,b),onProgress:b,diagnostics:a.diagnostics,signal:a.signal,validateSubmission:async(a,b,c)=>{B=await M(a,b,c)}});if(s=c.raw,x=c.reads,y=c.attempts,t=B??await M(s,c.sources,c.reads),a.signal?.throwIfAborted(),["engineering-controls","qualitative-controls"].includes(t.action)){if(!v)throw Error("本次工程控制没有同版来源用途证明,未执行");(0,K.WI)(a.project,v)}}catch(b){if(a.signal?.aborted)throw b;t={decisionId:H,taskId:c,action:"unmeasured",answer:"本次主控裁决未通过,未核定新的事实或技术决定;不能据此认定需要用户确认。实质技术问题须具体说明对象和工况后重新查询;已完成的正文交submit_author_task,不能以本回执代替内容验收。",factIds:[],reason:b instanceof Error?b.message:String(b),source:"model-rejected"}}return a.onReceipt({decision:t,question:d,inputHash:N(G),raw:s??null,...x?{reads:x,attempts:y,readingProtocolErrors:z}:{},...void 0===u?{}:{engineeringReview:u},...["engineering-controls","qualitative-controls"].includes(t.action)&&v?{sourceApplicationReceipt:v}:{}}),b=a.diagnostics,n={at:c,decisionId:H,action:t.action,reason:t.reason,readings:d.question,source:t.source,execution:"model-rejected"===t.source?"unlanded":"performed",executionNote:"model-rejected"===t.source?"模型裁决未通过,未执行新的技术决定,不登记为人工资料缺口":"通过工具回执返回当前作者;正文是否采用由候选与合同评价核对"},b&&(b.supervisorDecisionLog??=[]).push(n),t})();return b.set(r,t),t}})}},31859:(a,b,c)=>{c.d(b,{I:()=>i});var d=c(96770),e=c(19668),f=c(43967);let g=globalThis,h=g.__customizeConfigStores??=new Map;function i(){(0,f.jF)();let a=(0,e.J0)();return h.has(a)||h.set(a,new d.ConfigStore(a)),h.get(a)}},33972:(a,b,c)=>{function d(a,b){return a.criteria.filter(a=>a.sectionId===b&&a.applicable)}function e(a,b){if(!Array.isArray(b)||b.some(b=>!Number.isSafeInteger(b)||b<0||b>=a.length)||new Set(b).size!==b.length)throw Error("职责序号必须唯一且属于当前委派任务");return b.map(b=>a[b])}c.d(b,{C:()=>d,resolveAuthorCriterionIndices:()=>e})},34027:(a,b,c)=>{c.d(b,{RT:()=>g,Ri:()=>f,zV:()=>h});var d=c(77598),e=c(73123);function f(a,b){return(0,e.gM)(a),Object.fromEntries(Object.entries(b).map(([b,c])=>{let e=a.sources[b],f=a.documents.find(a=>a.sourceFile===b);if(!e||!f||e.sourceSha256!==c.sourceSha256||e.parsedSha256!==c.parsedSha256)throw Error(`一致性来源上下文与冻结解析/源身份不一致:${b}`);let g=a.decisions.filter(a=>a.currentSourceFiles.includes(b)||a.candidateSourceFiles.includes(b)||f.domainDependencies.some(b=>b.family===a.family&&b.domain===a.domain)),h=a.declarations.filter(a=>a.sources.some(a=>a.sourceFile===b)||g.some(b=>b.declarationIds.includes(a.id))),i={version:"tender-source-context-v3",policyVersion:a.version,policyId:a.policyId,assetFingerprint:a.assetFingerprint,sourceIdentity:structuredClone(e),document:structuredClone(f),declarations:structuredClone(h),decisions:structuredClone(g),applicability:g.map(a=>({family:a.family,domain:a.domain,status:a.status,current:a.currentSourceFiles.includes(b),candidate:a.candidateSourceFiles.includes(b)}))};return[b,{...i,contextFingerprint:(0,d.createHash)("sha256").update(JSON.stringify(i)).digest("hex")}]}))}function g(a){let{contextFingerprint:b,...c}=a;if("tender-source-context-v3"!==c.version||c.policyVersion!==e.xg||b!==(0,d.createHash)("sha256").update(JSON.stringify(c)).digest("hex")||![c.policyId,c.assetFingerprint,c.sourceIdentity?.sourceSha256,c.sourceIdentity?.parsedSha256].every(a=>/^[a-f0-9]{64}$/u.test(a))||!c.document?.sourceFile?.trim()||!Array.isArray(c.document.editionScopes)||!Array.isArray(c.document.scopeEvidenceChunks)||c.document.families.some(a=>!c.document.editionScopes.some(b=>b.family===a))||c.document.scopeEvidenceChunks.some(a=>a.sha256!==(0,d.createHash)("sha256").update(a.text).digest("hex")))throw Error("职责来源适用资格缺少当前冻结源/解析/版本上下文身份或发行作用范围,或被改写")}function h(a){g(a);let b=a.document;return{document:{sourceFile:b.sourceFile,title:b.title,isClarification:b.isClarification,projectIdentifier:b.projectIdentifier,issuedAt:b.issuedAt,families:b.families,editionScopes:b.editionScopes.map(a=>({family:a.family,mode:a.mode,heading:a.heading})),domainDependencies:b.domainDependencies.map(a=>({family:a.family,domain:a.domain,quote:a.quote,authoritySources:a.authoritySources.map(a=>({sourceFile:a.sourceFile,quote:a.quote}))}))},declarations:a.declarations.map(a=>({id:a.id,family:a.family,domains:a.domains,quote:a.quote,issuedAt:a.issuedAt,projectIdentifier:a.projectIdentifier,title:a.title,sources:a.sources.map(a=>({sourceFile:a.sourceFile}))})),applicability:a.applicability,decisions:a.decisions.map(a=>({id:a.id,declarationId:a.declarationId,declarationIds:a.declarationIds,family:a.family,domain:a.domain,status:a.status,reason:a.reason,current:a.currentSourceFiles.includes(b.sourceFile),candidate:a.candidateSourceFiles.includes(b.sourceFile)}))}}},35821:(a,b,c)=>{c.d(b,{Eh:()=>f,Mv:()=>o,VN:()=>h,Iu:()=>i});var d=c(19898),e=c(73055);let f=.6,g=null;function h(){return g||(g=new d.LocalTransformersEmbeddingProvider({})),g}async function i(){if("1"!==process.env.DOCUMENT_SKIP_EMBED_PREFLIGHT)try{await h().embedQuery("生成前置检查")}catch(b){let a=b instanceof Error?b.message:String(b);throw Error(`本地语义模型预热失败(生成前置检查,可用 DOCUMENT_SKIP_EMBED_PREFLIGHT=1 跳过):${a}`,{cause:b})}}let j=new Map,k=0,l=0;async function m(a,b){let c=b?await b(a):await h().embedDocuments(a);if(c.length!==a.length)throw Error(`本地语义模型嵌入数量不一致:期望 ${a.length} 条,实际 ${c.length} 条`);return c}async function n(a,b){if("0"===process.env.DOCUMENT_EMBED_CACHE)return m(a,b);let c=Array(a.length),d=[],e=new Map;for(let b=0;b<a.length;b+=1){let f=a[b];if(f.length<=2e3){let a=j.get(f);if(a){c[b]=a,k+=1,j.delete(f),j.set(f,a);continue}}let g=e.get(f);g?g.push(b):(e.set(f,[b]),d.push(f))}if(0===d.length)return c;let f=await m(d,b),g=function(){let a=Number(process.env.DOCUMENT_EMBED_CACHE_SIZE||4e4);return Number.isFinite(a)&&a>0?a:4e4}();for(let a=0;a<d.length;a+=1){let b=d[a],h=f[a],i=e.get(b);for(let a of i)c[a]=h;if(b.length<=2e3&&(l+=i.length,j.set(b,h),j.size>g)){let a=j.keys().next().value;void 0!==a&&j.delete(a)}}return c}async function o(a,b,c){if(0===a.length||0===b.length)return()=>0;let d=[...a,...b],f=await n(d,c),g=new Map;for(let a=0;a<d.length;a++)g.has(d[a])||g.set(d[a],f[a]);return(a,b)=>{let c=g.get(a),d=g.get(b);return c&&d?(0,e.Om)(c,d):0}}},36372:(a,b,c)=>{c.d(b,{M8:()=>l,a0:()=>k,hM:()=>j});var d=c(35821),e=c(86697);let f=["对与评标活动有关的工作人员的纪律要求","评标委员会成员与投标人接触的限制","评标纪律与廉洁从业承诺要求","评审争议处理与投标澄清配合程序","评审结果确认与中标公示流程","评标办法与分值构成说明","异常低价评审与计算方式说明","清单计量与报价口径约定","投标文件实质性响应要求","投标保证金缴纳与退还程序","开标程序与投标文件递交截止时间","评标期间行为管控与资料闭环","预付款与进度款支付比例约定","履约担保与保证金缴纳退还约定","价格波动与合同价款调整约定","暂列金额与暂估价使用约定","税费计取与发票结算约定","违约责任与罚款赔偿条款"],g=["劳动力配置计划与高峰期人数安排","施工质量保证措施与验收标准","安全生产管理与教育培训要求","施工进度计划与关键线路安排","材料设备采购进场计划与检验要求","施工现场文明施工与环境保护管理","劳动纪律与班组作业管理制度","施工机械设备配置与维护保养计划","农民工工资支付保障与劳务实名制管理","材料采购质量证明与进场验收管理","工期承诺与进度考核奖惩管理"],h=/评标|投标|行贿|打招呼|递条子|廉洁|串标|围标|弄虚作假|干扰评标|纪律|澄清|中标|报价|清单计量|评审|保证金|开标|递交|争议|异常低价|评标基准价|预付款|进度款|担保|价格波动|材料调差|暂列金额|暂估价|计税|税金|发票|违约|业绩证明|类似(?:工程)?业绩|获奖|荣获|协会颁发|营业执照|资质证书|安全生产许可证|认证证书|管理体系认证|审计报告|信用等级|信用评价|社保证明|无行贿犯罪|中标查询|中标公示|中标结果|电子交易系统|公共资源交易|质疑投诉|评标委员会/u;function i(a){let b=a.sectionTitle?.trim()||"",c=(a.content||"").replace(/\s+/gu," ").slice(0,400);return b?`${b}。${c}`:c}function j(a){let b=a.sectionTitle?.trim()||a.content.replace(/\s+/gu,"").slice(0,60);return`${a.filePath}::${b}`}async function k(a,b){if(0===a.length)return{safe:[],excluded:[]};let c=a.filter(a=>h.test(i(a)));if(0===c.length)return{safe:[...a],excluded:[]};let e=c.map(i),j=await (0,d.Mv)(e,[...f],b),k=await (0,d.Mv)(e,[...g],b),l=new Set;for(let a of c){let b=i(a),c=Math.max(...f.map(a=>j(b,a))),d=Math.max(...g.map(a=>k(b,a)));c>=.6&&c>d&&l.add(a)}return{safe:a.filter(a=>!l.has(a)),excluded:[...l]}}async function l(a){return(0,e.A)({prototypes:[...f],negativePrototypes:[...g],threshold:.6,embedDocuments:a})}},36594:(a,b,c)=>{c.d(b,{LA:()=>k,Yn:()=>i,ZB:()=>j,eW:()=>l});var d=c(77598),e=c(97979),f=c(83653),g=c(57268);let h=a=>(0,d.createHash)("sha256").update(a).digest("hex");function i(a,b){let c=new Map;for(let b of a){let a=[...b.content.matchAll(/(?:发布日期|发布于|出具日期|印发日期)\s*[::]?\s*(20\d{2})\s*年\s*(\d{1,2})\s*月\s*(\d{1,2})\s*日/gu)].map(a=>`${a[1]}-${a[2].padStart(2,"0")}-${a[3].padStart(2,"0")}`);a.length&&c.set(b.filePath,[...c.get(b.filePath)??[],...a])}let g=a.flatMap(a=>{if(!["tender_document","addendum","tender","clarification","tender_text"].includes(a.roleId??""))return[];let d=b.sources[a.filePath];if(!d||void 0===a.chunkIndex)return[];let f=b.documents.find(b=>b.sourceFile===a.filePath),g=c.get(a.filePath)??[];return(0,e.Su)([{text:a.content,source:`${a.filePath} ${a.sectionTitle??""}`}]).filter(a=>a.openingDate&&"reference"!==a.openingDate.role).map(b=>({candidate:b,item:a,source:d,projectIdentifier:f?.projectIdentifier??null,issuedAt:1===new Set(g).size?g[0]:null,isClarification:f?.isClarification??!1}))}),i=new Map;for(let a of g){let b=a.candidate.openingDate,c=JSON.stringify([a.projectIdentifier,b.objectName,b.kind]),d=i.get(c)??[];d.push(a),i.set(c,d)}return[...i.values()].flatMap(a=>{let b,c=a.filter(a=>"current"===a.candidate.openingDate.role);if(!c.length)return[];let e=c.filter(a=>a.candidate.clarified),g=e.length&&c.every(a=>a.candidate.clarified||!a.isClarification)?e:c;if(new Set(g.map(a=>a.candidate.value)).size>1&&g.every(a=>a.issuedAt)){let a=[...g.map(a=>a.issuedAt)].sort().at(-1);g=g.filter(b=>b.issuedAt===a)}let i=(0,f.iC)({facts:[],overrides:[],labeledValues:g.map(a=>a.candidate)}).resolved.find(a=>"开工日期"===a.attribute);if(!i)return[];let j=g.find(a=>a.candidate.value===i.value&&i.evidence.some(b=>b.source===a.candidate.source));if(!j)return[];let k=j.candidate.openingDate,l=new Set(g.map(a=>a.candidate.value)).size>1||new Set(g.map(a=>(a.candidate.openingDate.condition??"").replace(/\s+/gu,""))).size>1,m=k.kind,n="planned"===m?"planned_start_date":"actual"===m?"actual_start_date":"construction_start_date",o="planned"===m?"计划开工日期":"actual"===m?"实际开工日期":"开工日期",p=[...new Set(l?a.filter(a=>"superseded"===a.candidate.openingDate.role).map(a=>a.candidate.value):[...i.superseded,...a.filter(a=>!g.includes(a)).map(a=>a.candidate.value)])].filter(a=>a!==i.value),q=a.map(a=>({value:a.candidate.value,sourceFile:a.item.filePath,chunkIndex:a.item.chunkIndex,quote:a.candidate.openingDate.quote}));return[{factId:`temporal:${(b=[n,k.objectName,j.item.filePath,j.item.chunkIndex,k.quote,i.value],(0,d.createHash)("sha256").update(JSON.stringify(b)).digest("hex")).slice(0,24)}`,fieldId:n,key:o,fieldName:o,objectName:k.objectName,value:i.value,confidence:l?.5:.95,sourceFile:j.item.filePath,roleId:j.item.roleId,processingType:j.item.processingType,sourceRef:{filePath:j.item.filePath,roleId:j.item.roleId,processingType:j.item.processingType,chunkIndex:j.item.chunkIndex,sectionTitle:j.item.sectionTitle,sourceSpan:k.quote,contextSpan:j.item.content},temporalConstraint:{event:"construction-start",kind:m,status:l?"unmeasured":"resolved",date:i.value,...k.condition?{condition:k.condition}:{},superseded:p,sourceSha256:j.source.sourceSha256,parsedSha256:j.source.parsedSha256,chunkSha256:h(j.item.content),quoteSha256:h(k.quote),history:q}}]})}function j(a,b){let c=b.filter(a=>a.temporalConstraint?.event==="construction-start"&&"planned"===a.temporalConstraint.kind&&"resolved"===a.temporalConstraint.status&&"项目主体"===a.objectName),d=1===new Set(c.map(a=>a.value)).size?c.slice(0,1):[];return{...a,facts:[...a.facts.filter(a=>"开工日期"!==(0,f.hf)(String(a.key??""),a.label)),...d.flatMap(a=>a.temporalConstraint.history.filter(b=>a.temporalConstraint.superseded.includes(b.value)).map(a=>({key:"开工日期",value:a.value,sourceFile:a.sourceFile})))],overrides:(a.overrides??[]).filter(a=>"date"!==(0,e.dm)(a.superseded)&&"date"!==(0,e.dm)(a.effective)),labeledValues:[...(a.labeledValues??[]).filter(a=>"开工日期"!==a.attribute),...d.map(a=>({attribute:"开工日期",value:a.value,source:`${a.sourceFile} ${a.sourceRef?.sectionTitle??""}`,clarified:!0,supersedesPriorMaterials:!1}))]}}function k(a){return a.filter(a=>a.temporalConstraint).map(a=>{let b=a.temporalConstraint,c="unmeasured"===b.status?"同一事件日期尚有未决值,须依据完整原文核定,不能任选一个日期或宣称已确定":`${a.fieldName}为${b.date};${"planned"===b.kind?"仅作进度计划起点,不得写成已确定的实际开工日":"保持该事件的原文性质"}`;return(0,g.v7)(`进度安排必须承接${a.objectName}的开工事件:${c}${b.condition?`;触发条件完整保留:${b.condition.replace(/\s+/gu,"")}`:""};仅采用现行事件口径,不新增工期或把通知条件删成固定日历承诺。`,JSON.stringify({type:"source-bound-temporal-fact",factId:a.factId,sourceFile:a.sourceFile,sourceRef:a.sourceRef,temporalConstraint:b}))})}function l(a,b){let c=(0,e.Su)([{text:a.text,source:"reviewed-duty"}]).filter(a=>a.openingDate).flatMap(c=>b.filter(b=>{let d=b.temporalConstraint,e=c.openingDate;return d?.status==="resolved"&&d.superseded.includes(c.value)&&b.objectName===e.objectName&&("unspecified"===e.kind||e.kind===d.kind)&&d.history.some(b=>b.value===c.value&&a.sources.some(a=>a.file===b.sourceFile))}).map(a=>({label:c,fact:a}))),d=new Map;for(let a of c){let b=a.label.openingDate,c=`${b.dateStartChar}:${b.dateEndChar}`,e=d.get(c)??[];e.push(a),d.set(c,e)}let f=a.text,g=[];for(let a of[...d.values()].sort((a,b)=>b[0].label.openingDate.dateStartChar-a[0].label.openingDate.dateStartChar)){if(1!==new Set(a.map(a=>a.fact.value)).size)continue;let{label:b,fact:c}=a[0],d=b.openingDate;f=f.slice(0,d.dateStartChar)+c.value+f.slice(d.dateEndChar),g.push(c)}let h=[...new Map(g.map(a=>[a.factId,a])).values()];return h.length&&(f+=`;该日期控制已经由当前完整来源更正,${h.map(a=>`${a.fieldName}仅采用${a.value}${"planned"===a.temporalConstraint.kind?"作为计划基准,不能转成实际固定开工日":""}${a.temporalConstraint.condition?`,保留${a.temporalConstraint.condition.replace(/\s+/gu,"")}`:""}`).join(";")}`),{text:f,factIds:h.map(a=>a.factId),sources:h.map(a=>({factId:a.factId,sourceFile:a.sourceFile,sourceRef:a.sourceRef,temporalConstraint:a.temporalConstraint}))}}},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,critical:i,floatDays:k}=a,l={id:b.id,phaseId:b.phaseId,objectScope:b.objectScope,workfront:b.workfront,status:c};return"organization"===j||"materials"===j?l:{...l,predecessors:b.predecessors,startDay:d,endDay:e,startDate:f,endDate:g,durationDays:h,critical:i,floatDays:k}}),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":"77a0c591cb44f2d0fda8be7c18cd915e32ecb5272d201914c0e332124a63d539","semanticFingerprints":{"projectFacts":"54d6e428a3824c57e416b54151a779e3a624d364d0a6f7449ad1b9c6e857d2c4","documentGeneration":"4b1749e6872df9590c193bb0745efa6a3336d9ac715dacbb756624ea15d34731"},"gitCommit":"7507c09e332fbc3c131d96116fd15e4acbe71320","serverVersion":"4.60.4","sourceFiles":723,"capturedAt":"2026-10-12T18:13:53.498Z"}';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},是写作方法先验,不是项目事实或已核现行标准】
124
126
  ${f.join("\n")}
125
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)}
126
128
  本任务相关功能指引仅在其被委派的职责内采用:
@@ -139,4 +141,4 @@ ${a.content}`).join("\n"))};return V(s),b.onPhase?.(`技术义务发现:${s.en
139
141
  ${b.map((a,b)=>`${b+1}. ${a}`).join("\n")}
140
142
  ${(0,v.TP)("以上为系统提取的招标要求全局口径:本段提示词文字本身(编号、括号说明等元话语)禁止复述进正文")}`}let _=.35;function aa(a){return`${a.element} ${a.sourceText}`.slice(0,120)}function ab(a,b,c){let d=[],e=[],f=b.map(a=>J(a.title)).filter(Boolean);for(let b of a){let a=aa(b),g="",h=0;for(let b of f){let d=c(a,b);d>h&&(h=d,g=b)}let i={requirement:b,chapterTitle:g,score:h,lowConfidence:h<_};if(!g||i.lowConfidence){e.push(i);continue}d.push(i)}return{assignments:d,unattached:e}}function ac(a,b,c,d){if(d)return(0,t.tv)((0,s.Gl)(a),"structure-assignments.json",{createdAt:new Date().toISOString(),attached:b.length,unattached:c.length,assignments:b,unattachedItems:c},d).assetPath;let e=r.join((0,s.Gl)(a),"assets");q.mkdirSync(e,{recursive:!0});let f=r.join(e,"structure-assignments.json");return q.writeFileSync(f,JSON.stringify({createdAt:new Date().toISOString(),attached:b.length,unattached:c.length,assignments:b,unattachedItems:c},null,2),"utf8"),f}},89249:(a,b,c)=>{c.d(b,{De:()=>u,IL:()=>t,XT:()=>k,cT:()=>z,mf:()=>j,pN:()=>g,wI:()=>f});var d=c(85354),e=c(97979);function f(a){return(a.match(/�|￿/gu)?.length||0)>=2||Array.from(a).some(a=>{let b=a.charCodeAt(0);return 65533===b||b<32&&9!==b&&10!==b&&13!==b})}function g(a){let b=RegExp(`(?:${e.yJ})\\s*[::]?\\s*`,"u").exec(a);return b?a.slice((b.index??0)+b[0].length).trim():a}let h=String.raw`日历天|个?\s*月|天|周|年|小时|分钟`,i=RegExp(String.raw`\d+(?:\.\d+)?\s*(?:${h})`,"u"),j=/^20\d{2}\s*(?:年\s*\d{1,2}\s*月|[.\-/]\d{1,2}(?:[.\-/]|$))/u,k=["duration","date","frequency","money","ratio","measure","count","rebar-grade","diameter","plain"],l=/20\d{2}\s*年(?:\s*\d{1,2}\s*月(?:\s*\d{1,2}\s*[日号])?)?|20\d{2}\s*[.\-/]\s*\d{1,2}(?:\s*[.\-/]\s*\d{1,2})?/gu,m=/每\s*(?:日|天|月|周|年|季|旬)|按\s*(?:月|季|周|日|期|进度)|自然月|月度|月报|旬报|前\s*\d+\s*(?:天|日|个月|月|周|小时)|前\s*(?:报送|提交|上报|报审|递交|送达)/u,n=/\d+(?:\.\d+)?\s*(?:亿元|万元|元)/u,o=/\d+(?:\.\d+)?\s*[%%]|百分之/u,p=d.wA.split("|").filter(a=>Object.prototype.hasOwnProperty.call(d.eu,a.toLowerCase())).join("|"),q=d.wA.split("|").filter(a=>!Object.prototype.hasOwnProperty.call(d.eu,a.toLowerCase())).join("|"),r=RegExp(String.raw`\d+(?:\.\d+)?\s*(?:${p}|${"mm|cm|平方公里|平方千米|万立方米"})`,"u"),s=RegExp(String.raw`\d+(?:\.\d+)?\s*(?:${q}|${"处|层|项|间|部|条|只|位|人|棵|辆|艘|面|口"})`,"u");function t(a){let b=String(a??"").trim();return b?/^(?:HRB|HPB)\s*\d{3,4}[A-Z]?$/iu.test(b)?"rebar-grade":/^(?:[ΦφØ]\s*\d+(?:\.\d+)?|直径\s*\d+(?:\.\d+)?\s*(?:mm|毫米))$/iu.test(b)?"diameter":m.test(b)?"frequency":i.test(b.replace(l," "))?"duration":b.match(l)?"date":n.test(b)?"money":o.test(b)?"ratio":r.test(b)?"measure":s.test(b)?"count":"plain":"plain"}function u(a){let b=String(a||""),c=b.replace(/^(?:招标人|招标单位|建设单位|发包人|项目名称|工程名称|项目编号|招标项目编号|标段名称|建设地点|建设规模|招标范围|计划工期|合同工期|质量标准|质量目标)[::]\s*/u,"");return c!==b?c:b.replace(/^[一-龥]{2,10}[::]\s*(?=(?:20\d{2}\s*年|\d+\s*(?:日历天|天|个月|月|年)))/u,"")}let v=/bill_of_quantities|drawing|table/iu,w=/\.(?:dwg|dxf|png|jpe?g|xls[xm]?)$/iu,x=/项目名称|工程名称|招标人|建设单位|发包人|采购人|招标单位|建设地点|工程地点|项目地点/u,y=/工期|周期|进度|节点|里程碑/u;function z(a,b){return!((x.test(a)||y.test(a))&&(v.test(b.roleId||"")||w.test(b.sourceFile||"")))}},97372:(a,b,c)=>{c.d(b,{t3:()=>N,Ix:()=>O,renderAuthorTableRecord:()=>Q,r2:()=>W,renderAuthorUnit:()=>R,validateAuthorTaskOutput:()=>V});var d=c(27939),e=c(50369),f=c(33972),g=c(77598),h=c(85354);let i=(a,b)=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`${b}必须是对象`);return a},j=(a,b)=>{if(!Array.isArray(a))throw Error(`${b}必须是完整数组`);return a},k=(a,b,c)=>{if(Object.keys(a).some(a=>!b.includes(a)))throw Error(`${c}含协议外字段`)},l=["projectNumbers","normativeNumbers","derivedNumbers","plannedNumbers"],m=()=>({factBindings:[],sourceBindings:[],projectNumbers:[],normativeNumbers:[],derivedNumbers:[],plannedNumbers:[],productionNumbers:[],sectionReferences:[]});var n=c(15557),o=c(63327),p=c(9848),q=c(15254),r=c(44616),s=c(10170),t=c(66620),u=c(80999),v=c(23313),w=c(4001),x=c(63007),y=c(12031),z=c(68959),A=c(74812),B=c(55740);let C="author-task-output-v1-2026-10-06",D=(a,b)=>{if("string"!=typeof a||!a.trim())throw Error(`${b}必须是非空文本`);return a},E=(a,b)=>{if(!Array.isArray(a))throw Error(`${b}必须是完整数组`);return a},F=(a,b)=>{if(!a||"object"!=typeof a||Array.isArray(a))throw Error(`${b}必须是对象`);return a},G=(a,b)=>{if(new Set(a).size!==a.length)throw Error(`${b}身份重复`)},H=(a,b,c)=>{let d=Object.keys(a).filter(a=>!b.includes(a));if(d.length)throw Error(`${c}包含协议外字段,不能丢弃内容后当完整提交:${d.join("、")}`)},I=(a,b)=>{let c=D(a,b);if(/\r|\n|```|^\s*#{1,3}\s/u.test(c))throw Error(`${b}不得夹带章节或多行正文`);return c},J=a=>a.replace(/\\/gu,"\\\\").replace(/\|/gu,"\\|").replace(/\r?\n/gu,"<br>"),K=a=>JSON.stringify(a.replace(/\r?\n/gu," ")),L=(a,b)=>{let c={...a};for(let a of b){let b=c[a];(null==b||"string"==typeof b&&!b.trim()||Array.isArray(b)&&!b.length)&&delete c[a]}return c};function M(a){let b=[],c=structuredClone(a),d=(a,c,d)=>{for(let e of Object.keys(a))c.includes(e)||(delete a[e],b.push(`${d}/${e} 非正文键已移除`))},e=(a,c)=>{if(!Array.isArray(a))return a;let e=[];return a.forEach((a,f)=>{if(!a||"object"!=typeof a||Array.isArray(a))return void e.push(a);if(Object.hasOwn(a,"sectionIndex")){if("string"==typeof a.text&&a.text.trim())throw Error('小节引用片段含协议外字段 text:引用片段的连接语须写在该片段前后,片段内只保留 {"sectionIndex":序号}');d(a,["sectionIndex"],`${c}/${f}`),e.push(a);return}if(1===Object.keys(a).length&&""===a.text)return void b.push(`${c}/${f} 空片段已移除`);d(a,v.kj,`${c}/${f}`),e.push(a)}),e},f=(a,b)=>(!a||"object"!=typeof a||Array.isArray(a)||(d(a,v.XU,b),Array.isArray(a.parts)&&(a.parts=e(a.parts,`${b}/parts`)),Array.isArray(a.columns)&&a.columns.forEach((a,c)=>{a&&"object"==typeof a&&!Array.isArray(a)&&d(a,v.$h,`${b}/columns/${c}`)}),Array.isArray(a.rows)&&a.rows.forEach((a,c)=>{!(!a||"object"!=typeof a||Array.isArray(a))&&(d(a,["id","cells",...v.fd],`${b}/rows/${c}`),Array.isArray(a.cells)&&a.cells.forEach((a,f)=>{!(!a||"object"!=typeof a||Array.isArray(a))&&(d(a,["parts",...v.fd],`${b}/rows/${c}/cells/${f}`),Array.isArray(a.parts)&&(a.parts=e(a.parts,`${b}/rows/${c}/cells/${f}/parts`)))}))}),Array.isArray(a.nodes)&&a.nodes.forEach((a,c)=>{!(!a||"object"!=typeof a||Array.isArray(a))&&(d(a,v.RP,`${b}/nodes/${c}`),Array.isArray(a.parts)&&(a.parts=e(a.parts,`${b}/nodes/${c}/parts`)))}),Array.isArray(a.edges)&&a.edges.forEach((a,c)=>{!(!a||"object"!=typeof a||Array.isArray(a))&&(d(a,v.Ib,`${b}/edges/${c}`),Array.isArray(a.parts)&&(a.parts=e(a.parts,`${b}/edges/${c}/parts`)))})),a);for(let a of["paragraphs","tables","figures"])Array.isArray(c[a])&&(c[a]=c[a].map((b,c)=>f(b,`${a}/${c}`)));if(d(c,v.Ue,""),b.length){let b=(0,v.IO)(a),d=(0,v.IO)(c);if(!b||!d||b.bodyHash!==d.bodyHash)throw Error("提交形状修正会改变正文内容,不能静默接收;请按 compact-v7 协议重新提交")}return{value:c,repairs:b}}function N(a){if(!a||"object"!=typeof a||Array.isArray(a)||!("compact-v7"===a.format||["paragraphs","tables","figures"].some(b=>Object.hasOwn(a,b))))return[];try{return M(a).repairs}catch{return[]}}function O(a,b){if(a&&"object"==typeof a&&!Array.isArray(a)){if("string"==typeof a.version&&"string"==typeof a.contractId&&"string"==typeof a.projectSnapshotId&&"string"==typeof a.taskId&&Array.isArray(a.units))return a;let c=a.format;if(Array.isArray(a.units))throw Error("作者提交含 units 旧形态:请以 compact-v7(paragraphs/tables/figures/decisionRequests)重新提交");if(void 0!==c&&"compact-v7"!==c)throw Error(`作者提交 format 无效(${String(c)}):请以 compact-v7 提交,或省略该字段`);if("compact-v7"===c||["paragraphs","tables","figures","decisionRequests","revisionReason"].some(b=>Object.hasOwn(a,b))){let{value:c}=M(a);return c.format="compact-v7",P(c,b)}}return P(a,b)}function P(a,b){if(!a||"object"!=typeof a||"compact-v7"!==a.format)return a;let c=F(a,"当前作者提交"),d=(0,u.XN)(b.contract),e=function(a,b={}){let c=i(a,"正文引用产物");k(c,["format","paragraphs","tables","figures","decisionRequests","revisionReason"],"正文引用产物");let d=(a,c,d=!0,e)=>{let f=m(),g=j(a,"正文片段");if(!g.length)throw Error("正文片段不能为空");let n=g.map((a,c)=>{let d=i(a,"正文片段"),e=c?i(g[c-1],"正文片段"):void 0,f=e&&Object.hasOwn(e,"sectionIndex")&&Object.hasOwn(d,"sectionIndex")?"、":"";return{part:d,text:(a=>{if(Object.hasOwn(a,"sectionIndex")){if(k(a,["sectionIndex"],"真实小节引用片段"),!Number.isSafeInteger(a.sectionIndex)||0>Number(a.sectionIndex)||!b.sections?.[Number(a.sectionIndex)])throw Error("小节引用序号不在当前冻结合同");return b.sections[Number(a.sectionIndex)].label}if("string"!=typeof a.text||!a.text.trim())throw Error("正文片段须保留非空实际原文");return a.text})(d),separator:f}}),o=n.map(a=>a.separator+a.text).join(""),p=0;return{text:n.map(({part:a,text:g,separator:m})=>{let n=(p+=m.length)+g.length;if(Object.hasOwn(a,"sectionIndex"))return f.sectionReferences.push({sectionId:b.sections[Number(a.sectionIndex)].sectionId,quote:g,textRange:{start:p,end:n},...void 0===c?{}:{columnKey:c},...e}),p=n,m+g;k(a,["text","factIndices","sourceIndices","productionNumberIndices",...l],"正文片段");let q=/(?:^|[^A-Za-z\d])[+−-]?\d+(?:\.\d+)?\s*$/u.test(g)?RegExp(`^\\s*(?:${h.RD})(?![A-Za-z0-9])`,"iu").exec(o.slice(n))?.[0]??"":"",r={quote:o.slice(p,n+q.length),...d?{textRange:{start:p,end:n+q.length}}:{},...void 0===c?{}:{columnKey:c}};if(p+=g.length,Object.hasOwn(a,"productionNumberIndices")){let b=j(a.productionNumberIndices,"本轮施工生产计划数值序号");if(new Set(b).size!==b.length||b.some(a=>!Number.isSafeInteger(a)||0>Number(a)))throw Error("施工生产计划数值序号重复或无效");for(let a of b)f.productionNumbers.push({index:a,...r})}for(let[b,c,d]of[["factIndices","factBindings","factIndex"],["sourceIndices","sourceBindings","sourceIndex"]]){if(!Object.hasOwn(a,b))continue;let e=j(a[b],"冻结引用序号");if(new Set(e).size!==e.length||e.some(a=>!Number.isSafeInteger(a)||0>Number(a)))throw Error("正文片段引用序号重复或无效");for(let a of e)f[c].push({[d]:a,...r})}let s={projectNumbers:["factIndex"],normativeNumbers:["factIndex","version","scope"],derivedNumbers:["formula","inputFactIndices","basis"],plannedNumbers:["basis","constraints"]};for(let b of l)if(Object.hasOwn(a,b))for(let c of j(a[b],b)){let a=i(c,b);k(a,s[b],b),f[b].push({...a,...r})}return m+g}).join(""),refs:f}},e=j(c.paragraphs,"段落").map(a=>{let b=i(a,"段落");k(b,["id","heading","criterionIndices","parts"],"段落");let{parts:c,...e}=b,f=d(c);return{...e,text:f.text,...f.refs}});return{paragraphs:e,tables:j(c.tables,"表格").map(a=>{let b=i(a,"表格");k(b,["id","heading","criterionIndices","caption","columns","rows"],"表格");let c=j(b.columns,"表格字段").map(a=>i(a,"表格字段")),e=j(b.rows,"表格记录").map(a=>{let b=i(a,"表格记录");k(b,["id","cells"],"表格记录");let e=j(b.cells,"表格单元格");if(e.length!==c.length)throw Error("正文引用表格记录与字段不守恒");let f=m(),g=e.map((a,b)=>{let e=i(a,"表格单元格");if(k(e,["parts"],"表格单元格"),"string"!=typeof c[b].key||!c[b].key)throw Error("表格字段身份无效");let g=d(e.parts,c[b].key);for(let a of Object.keys(f))f[a].push(...g.refs[a]);return g.text});return{id:b.id,cells:g,...f}});return{...b,rows:e}}),figures:j(c.figures,"图件").map(a=>{let b=i(a,"图件");k(b,["id","heading","criterionIndices","caption","nodes","edges","layout"],"图件");let c=m(),e=j(b.nodes,"图件节点").map(a=>{let b=i(a,"图件节点");k(b,["id","parts"],"图件节点");let e=d(b.parts,void 0,!1,{nodeId:b.id});for(let a of Object.keys(c))c[a].push(...e.refs[a]);return{id:b.id,label:e.text}}),f=j(b.edges,"图件关系").map((a,b)=>{let e=i(a,"图件关系");if(k(e,["from","to","parts"],"图件关系"),!Object.hasOwn(e,"parts"))return{from:e.from,to:e.to};let f=d(e.parts,void 0,!1,{edgeIndex:b});for(let a of Object.keys(c))c[a].push(...f.refs[a]);return{from:e.from,to:e.to,label:f.text}});return{...b,nodes:e,edges:f,...c}}),decisionRequests:c.decisionRequests,revisionReason:c.revisionReason}}({...c,tables:E(c.tables,"表格").map(a=>{let b=F(a,"表格");return{...b,rows:E(b.rows,"表格记录").map((a,b)=>({...F(a,"表格记录"),id:`row-${b+1}`}))}})},{sections:b.contract.sections.map(a=>({sectionId:a.id,label:d.sections.get(a.id)}))}),g=(0,f.C)(b.contract,b.taskId),n=a=>(0,f.resolveAuthorCriterionIndices)(g.map(a=>a.id),E(a,"职责序号")),o=a=>{if(!Number.isSafeInteger(a)||1>Number(a))throw Error("单元ID必须为正整数");return`${b.taskId}:unit:${a}`},p=[],q=[],s=[],v=(a,c)=>{let d={...a};for(let a of["factBindings","sourceBindings","projectNumbers","normativeNumbers","derivedNumbers","plannedNumbers","productionNumbers","sectionReferences"]){for(let e of E(d[a],a)){let{factIndex:d,sourceIndex:f,inputFactIndices:g,...h}=F(e,a);if("sectionReferences"===a)s.push({...h,...c});else if("plannedNumbers"===a)q.push({...c,quote:h.quote,..."columnKey"in h?{columnKey:h.columnKey}:{},..."textRange"in h?{textRange:h.textRange}:{},source:{kind:"planned-arrangement",basis:h.basis,constraints:h.constraints}});else{if(!b.projectModel)throw Error("冻结引用必须由本轮实际项目还原");if("factBindings"===a||"sourceBindings"===a)p.push({...h,...c,factId:(0,r.lu)(b.projectModel,"sourceBindings"===a?"source":"fact","sourceBindings"===a?f:d),..."sourceBindings"===a?{sourceKind:"source-excerpt"}:{}});else{let e,{quote:f,columnKey:i,textRange:j,...k}=h;if("productionNumbers"===a){let{planId:a,reference:c}=(0,t.tF)(b.projectModel,b.taskId,k.index);e={kind:"production-plan",planId:a,index:k.index,use:c.kind}}else e="derivedNumbers"===a?{kind:"derived",...k,inputFactIds:E(g,"推导输入序号").map(a=>(0,r.lu)(b.projectModel,"fact",a))}:{kind:"projectNumbers"===a?"project-fact":"normative-reference",...k,factId:(0,r.lu)(b.projectModel,"fact",d)};q.push({...c,quote:f,...void 0===i?{}:{columnKey:i},...void 0===j?{}:{textRange:j},source:e})}}}delete d[a]}return d},w=[];for(let[a,b]of[["paragraphs","paragraph"],["tables","table"],["figures","figure"]])for(let c of E(e[a],a)){let d=F(c,a),e=o(d.id),f="table"===b?{...d,rows:E(d.rows,"表格记录").map(a=>{let b=F(a,"表格记录"),c=v(b,{unitId:e,rowId:b.id}),f=E(c.cells,"表格字段值"),g=E(d.columns,"表格字段").map(a=>F(a,"表格字段"));return{...c,cells:Object.fromEntries(g.map((a,b)=>[D(a.key,"字段key"),f[b]]))}})}:v(d,{unitId:e}),{criterionIndices:g,...h}=f=L(f,["heading"]);w.push({...h,kind:b,id:e,criterionIds:n(g)})}return w.sort((a,b)=>Number(String(a.id).split(":").at(-1))-Number(String(b.id).split(":").at(-1))),{version:C,contractId:b.contract.id,projectSnapshotId:b.contract.projectSnapshotId,taskId:b.taskId,units:w,factBindings:p,numericBindings:q,sectionReferences:s,decisionRequests:E(c.decisionRequests,"未决请求").map(a=>{let{criterionIndices:b,...c}=F(a,"未决请求");return{...c,criterionIds:n(b)}}),...void 0===c.revisionReason?{}:{revisionReason:c.revisionReason}}}function Q(a,b){return`| ${a.columns.map(a=>J(b.cells[a.key])).join(" | ")} |`}function R(a,b=4,c,d){let e=a.heading?.trim().replace(/^\d+(?:[..]\d+)*[\s、..]+/u,"").trim(),f=e===d?.trim()||"paragraph"!==a.kind&&e===a.caption.trim(),g=e&&!f?`${"#".repeat(b)} ${e}
141
143
 
142
- `:"";if("paragraph"===a.kind)return g+a.text;if("table"===a.kind)return g+[a.caption,"",`| ${a.columns.map(a=>J(a.title+(a.unit?`(${a.unit})`:""))).join(" | ")} |`,`| ${a.columns.map(()=>"---").join(" | ")} |`,...a.rows.map(b=>Q(a,b))].join("\n");let h=new Map(a.nodes.map((a,b)=>[a.id,`n${b}`]));if(c){let b=a.caption.replace(/\[|\]/gu,""),d=c(a);if(void 0===d)return g+a.caption;let e="string"==typeof d?[d]:d;if(!e.length)throw Error("图件渲染不能返回空资产集合");return g+[a.caption,...e.map((a,c)=>`![${b}${c?"(续)":""}](${a})`)].join("\n\n")}return g+[a.caption,"","```mermaid","flowchart TD",...a.nodes.map(a=>` ${h.get(a.id)}[${K(a.label)}]`),...a.edges.map(a=>` ${h.get(a.from)} -->${a.label?`|${K(a.label)}|`:""} ${h.get(a.to)}`),"```"].join("\n")}function S(a,b){let c=(0,q.K3)(b),d=(0,q.K3)(a);if(!c)return!1;for(let a=d.indexOf(c);a>=0;a=d.indexOf(c,a+1)){let b=d[a-1]??"",e=d[a+c.length]??"";if(!(/\d/u.test(c)&&(/\d/u.test(b)||/[a-z0-9]$/u.test(c)&&/[a-z0-9]/u.test(e))||/^[a-z]/u.test(c)&&/[a-z0-9]/u.test(b))&&!(/^[+-]?\d/u.test(c)&&/[.+\-±]/u.test(b)))return!0}return!1}function T(a){let b=[],c=0;for(let d=0;d<a.length;d+=1){let e=a[d];(/[。;;]/u.test(e)||/[,,]/u.test(e)&&!(/\d/u.test(a[d-1]??"")&&/\d/u.test(a[d+1]??"")))&&(b.push(a.slice(c,d)),c=d+1)}return b.push(a.slice(c)),b}function U(a,b,c){return T(a).some(a=>(0,q.K3)(a).includes((0,q.K3)(b))&&S(a,c)&&!/不(?:得)?(?:采用|使用)|禁止采用|禁止使用/u.test(a))}function V(a,b,c={}){let f;(0,n.oH)(b.contract);let i=function(a,b){let c=[],d=(e,f)=>{if(Array.isArray(e))return e.map((a,b)=>d(a,`${f}[${b}]`));if(!e||"object"!=typeof e)return e;let g={};for(let[a,h]of Object.entries(e)){if(!f&&"annotations"===a){if(!Array.isArray(h)||h.some(a=>!a||"object"!=typeof a||Object.keys(a).some(a=>!["path","field","value"].includes(a))||"string"!=typeof a.path||"string"!=typeof a.field||"string"!=typeof a.value))throw Error("协议注记台账无效");c.push(...h);continue}if(b&&/^(?:units|paragraphs|tables|figures)\[\d+\]$/u.test(f)&&/^(?:criterionIndices|criterionIds|factIndices|sourceIndices)_note$/u.test(a)&&"string"==typeof h){c.push({path:f,field:a,value:h});continue}g[a]=d(h,f?`${f}.${a}`:a)}if(b&&/^(?:units|paragraphs|tables|figures)\[\d+\]$/u.test(f)){let b=!f.startsWith("units[")||"format"in a?"criterionIndices":"criterionIds";Object.hasOwn(g,b)||(g[b]=[])}return g};return{value:d(a,""),annotations:c}}(a,!!c.preserveQualityDefects),j=F(O(i.value,{contract:b.contract,taskId:b.taskId,projectModel:b.projectModel}),"作者产物");if(H(j,["version","contractId","projectSnapshotId","taskId","units","factBindings","decisionRequests","numericBindings","sectionReferences","revisionReason"],"作者产物"),j.version!==C||j.contractId!==b.contract.id||j.projectSnapshotId!==b.projectModel.snapshotId||j.projectSnapshotId!==b.contract.projectSnapshotId||j.taskId!==b.taskId)throw Error("作者产物的协议、任务、合同或项目版本不一致");let k=b.contract.sections.find(a=>a.id===b.taskId);if(!k)throw Error("作者产物的任务不在冻结合同中");let l=new Set(b.contract.criteria.filter(a=>a.sectionId===k.id&&a.applicable).map(a=>a.id)),m=new Set,r=[],v=new Set,J=[],K=[],L=[],M=(a,b=l)=>{if(!c.preserveQualityDefects)throw Error(a);for(let c of(r.push(a),b))v.add(c)},N=(a,b=!1)=>{if(!c.preserveQualityDefects&&!(b&&c.deferSourceParaphrases))throw Error(a);J.push(a)};for(let a of i.annotations)N(`作者协议注记留档,不能作为正文或职责完成证据:${a.path}.${a.field}=${a.value}`);let P=a=>{let b=E(a,"评价项ID").map(a=>D(a,"评价项ID"));if(G(b,"评价项"),b.some(a=>!l.has(a)))throw Error("作者单元包含任务范围外评价项");return b.length||N("作者单元缺少职责标注,保留原文与完整合同分母,不自动补绑职责"),b.forEach(a=>m.add(a)),b},Q=E(j.units,"作者信息单元").map(a=>{let b=F(a,"信息单元"),c=D(b.id,"单元ID");if(!c.startsWith(`${k.id}:unit:`)||!/^[A-Za-z0-9:._-]+$/u.test(c))throw Error("作者单元ID必须属于本任务");let d={id:c,criterionIds:P(b.criterionIds),...b.heading?{heading:I(b.heading,"单元标题")}:{}};if("paragraph"===b.kind){H(b,["id","kind","criterionIds","heading","text"],"段落");let a=D(b.text,"段落正文");if(/^#{1,6}\s/mu.test(a)||/```|^\|.+\|$/mu.test(a)||/\r?\n\s*\r?\n/u.test(a))throw Error("段落不得夹带新章节、表格或多个不透明段落;标题放在 heading,段落分别提交");return{...d,kind:"paragraph",text:a}}if("table"===b.kind){H(b,["id","kind","criterionIds","heading","caption","columns","rows"],"表格");let a=E(b.columns,"表格字段").map(a=>{let b=F(a,"表格字段");return H(b,["key","title","unit"],"表格字段"),{key:D(b.key,"字段ID"),title:D(b.title,"字段名"),...b.unit?{unit:D(b.unit,"单位")}:{}}});if(!a.length)throw Error("表格没有字段");G(a.map(a=>a.key),"表格字段");let c=new Set(a.map(a=>a.key)),e=E(b.rows,"表格完整记录").map(b=>{let d=F(b,"表格记录");H(d,["id","cells"],"表格记录");let e=F(d.cells,"表格单元格");if(Object.keys(e).length!==c.size||Object.keys(e).some(a=>!c.has(a)))throw Error("表格记录字段与表头不守恒");let f=Object.fromEntries(a.map(a=>[a.key,D(e[a.key],"表格单元格")]));return{id:D(d.id,"表格记录ID"),cells:f}});if(!e.length)throw Error("表格没有数据记录");return G(e.map(a=>a.id),"表格记录"),{...d,kind:"table",caption:I(b.caption,"表名"),columns:a,rows:e}}if("figure"===b.kind){H(b,["id","kind","criterionIds","heading","caption","nodes","edges","layout"],"图件");let a=E(b.nodes,"图件节点").map(a=>{let b=F(a,"图件节点");return H(b,["id","label"],"图件节点"),{id:D(b.id,"图节点ID"),label:D(b.label,"图节点内容")}});if(!a.length)throw Error("图件没有节点");G(a.map(a=>a.id),"图件节点");let c=new Set(a.map(a=>a.id)),f=E(b.edges,"图件关系").map(a=>{let b=F(a,"图件关系");H(b,["from","to","label"],"图件关系");let d=D(b.from,"图起点"),e=D(b.to,"图终点");if(!c.has(d)||!c.has(e))throw Error("图件关系引用了不存在的节点");return{from:d,to:e,...b.label?{label:D(b.label,"图关系内容")}:{}}});return{...d,kind:"figure",caption:I(b.caption,"图名"),nodes:a,edges:f,...b.layout?{layout:(0,e.Q)(b.layout,a.map(a=>a.id),f)}:{}}}throw Error("作者信息单元类型不合法")});if(G(Q.map(a=>a.id),"作者单元"),b.contract.deliveryPolicy)for(let a of Q){let b="paragraph"===a.kind?a.text:"table"===a.kind?a.rows.map(a=>Object.values(a.cells).join(" ")).join("\n"):[a.caption,...a.nodes.map(a=>a.label),...a.edges.map(a=>a.label??"")].join("\n");for(let c of(0,d.G0)(b))M(`单元${a.id}:${c}`,a.criterionIds.length?a.criterionIds:l);"figure"===a.kind&&/总平面|场地布置|平面布置/u.test(a.caption)&&!a.layout&&M(`单元${a.id}:节点边关系图没有设施空间位置与线路,不能冒充施工平面布置图`,a.criterionIds.length?a.criterionIds:l),"figure"===a.kind&&a.layout&&!/示意/u.test(a.caption)&&M(`单元${a.id}:相对坐标布置须明确为示意,不能冒充测量比例或现场定位图`,a.criterionIds.length?a.criterionIds:l)}let W=(0,u.XN)(b.contract),X=void 0===j.sectionReferences?void 0:E(j.sectionReferences,"真实小节引用").map(a=>{let b,c=F(a,"真实小节引用");H(c,["unitId","sectionId","quote","textRange","rowId","columnKey","nodeId","edgeIndex"],"真实小节引用");let d=D(c.unitId,"引用单元"),e=D(c.sectionId,"真实目标小节"),f=D(c.quote,"实际小节标签"),g=Q.find(a=>a.id===d),h=W.sections.get(e);if(!g||!h||h!==f)throw Error("小节引用身份或展示标签不属于当前真实合同");if("paragraph"===g.kind){if(["rowId","columnKey","nodeId","edgeIndex"].some(a=>void 0!==c[a]))throw Error("段落小节引用不能冒用其他载体定位");b=g.text}else if("table"===g.kind){if(void 0!==c.nodeId||void 0!==c.edgeIndex)throw Error("表格小节引用不能冒用图定位");let a=g.rows.find(a=>a.id===c.rowId),d=g.columns.find(a=>a.key===c.columnKey);if(!a||!d)throw Error("小节引用必须指向实际表格记录和字段");b=a.cells[d.key]}else{if(void 0!==c.rowId||void 0!==c.columnKey||void 0!==c.nodeId==(void 0!==c.edgeIndex))throw Error("图件小节引用须指向唯一真实节点或关系");b=void 0!==c.nodeId?g.nodes.find(a=>a.id===c.nodeId)?.label??"":Number.isSafeInteger(c.edgeIndex)&&Number(c.edgeIndex)>=0?g.edges[Number(c.edgeIndex)]?.label??"":""}let i=F(c.textRange,"小节引用UTF16位置");if(H(i,["start","end"],"小节引用UTF16位置"),!Number.isSafeInteger(i.start)||!Number.isSafeInteger(i.end)||0>Number(i.start)||Number(i.end)<=Number(i.start)||Number(i.end)>b.length||b.slice(Number(i.start),Number(i.end))!==f)throw Error("小节引用位置没有对齐这一处真实正文");return{...c,unitId:d,sectionId:e,quote:f,textRange:{start:Number(i.start),end:Number(i.end)}}});for(let a of Q)for(let b of"paragraph"===a.kind?[{text:a.text}]:"table"===a.kind?a.rows.flatMap(a=>Object.entries(a.cells).map(([b,c])=>({text:c,rowId:a.id,columnKey:b}))):[...a.nodes.map(a=>({text:a.label,nodeId:a.id})),...a.edges.map((a,b)=>({text:a.label??"",edgeIndex:b}))]){let c=b;for(let b of W.sections.values())for(let d=c.text.indexOf(b);d>=0;d=c.text.indexOf(b,d+b.length))X?.some(e=>e.unitId===a.id&&e.quote===b&&e.textRange.start===d&&e.rowId===c.rowId&&e.columnKey===c.columnKey&&e.nodeId===c.nodeId&&e.edgeIndex===c.edgeIndex)||M(`手抄小节编号标题缺少真实接口绑定:${b};使用实际sectionIndex并说明实施接口`,a.criterionIds);for(let b of c.text.matchAll(/(?<!附)表\d+(?![-..\d])/gu))M(`正文存在悬挂数字表号引用:${b[0]};应引用实际题注编号或上表/下表及表名`,a.criterionIds);/(?:招标文件|合同|设计文件)[^。;;]{0,24}附表\d+/u.test(c.text)&&M("正文用外部附表指向代替本任务具体执行要求;核实原表后明确本项目职责与配置,不由接收器删除或补写正文",a.criterionIds)}let Y=E(j.decisionRequests,"决定请求").map(a=>{let b=F(a,"决定请求");return H(b,["id","question","reason","criterionIds"],"决定请求"),{id:D(b.id,"请求ID"),question:D(b.question,"待决定问题"),reason:D(b.reason,"决定依据缺口"),criterionIds:P(b.criterionIds)}});for(let a of(G(Y.map(a=>a.id),"决定请求"),m.size!==l.size&&N(`作者任务未覆盖完整评价集合:缺 ${[...l].filter(a=>!m.has(a)).join("、")}`),b.contract.criteria.filter(a=>l.has(a.id)&&a.carrier)))if(!Q.some(b=>b.kind===a.carrier&&b.criterionIds.includes(a.id))&&!Y.some(b=>b.criterionIds.includes(a.id))){let b=`载体义务必须由真实${"table"===a.carrier?"表格":"图件"}单元完成,或明确保留未决事项:${a.id}`;Q.some(b=>b.kind===a.carrier)?N(b):M(b)}let Z=E(j.factBindings,"事实绑定").map(a=>{let d=F(a,"事实绑定"),e=D(d.unitId,"事实所在单元"),f=D(d.factId,"事实ID"),g=D(d.quote,"事实断言");if(H(d,["unitId","factId","quote","rowId","columnKey","sourceKind","textRange"],"事实绑定"),void 0!==d.sourceKind&&"source-excerpt"!==d.sourceKind)throw Error("事实绑定来源角色非法");let h={..."source-excerpt"===d.sourceKind?{sourceKind:"source-excerpt"}:{},...d.textRange?{textRange:d.textRange}:{}};void 0!==d.rowId&&D(d.rowId,"事实记录ID"),void 0!==d.columnKey&&D(d.columnKey,"事实字段ID");try{let a,i,l=Q.find(a=>a.id===e),m=[...b.projectModel.facts,...b.projectModel.sourceControls??[]].find(a=>(0,o.vg)(a)===f);if("source-excerpt"===d.sourceKind&&(!/^source-excerpt:[a-f0-9]{24}$/u.test(f)||m?.roleId!=="verified-source-excerpt"))throw Error("原文引用须使用实际冻结sourceEvidenceId,不能借项目单值ID或自造ID");if(!l||!m||!Object.hasOwn(b.projectModel.sources,m.sourceFile)||!(0,s.j)(m))throw Error("事实绑定不属于冻结项目或缺少可靠来源");if(void 0!==d.textRange){let a=F(d.textRange,"正文引用位置");H(a,["start","end"],"正文引用位置");let b="paragraph"===l.kind?l.text:"table"===l.kind?l.rows.find(a=>a.id===d.rowId)?.cells[String(d.columnKey)]:void 0;if("string"!=typeof b||!Number.isSafeInteger(a.start)||!Number.isSafeInteger(a.end)||0>Number(a.start)||Number(a.end)<=Number(a.start)||Number(a.end)>b.length||b.slice(Number(a.start),Number(a.end))!==g)throw Error("正文引用位置没有对应实际原文片段,不能给另一处同值借用出处")}let n=(m.resolutionRef?.winnerSourceRef??m.sourceRef)?.cadInterpretation;if(n&&n.parsedIdentity!==b.projectModel.sources[m.resolutionRef?.winnerSourceFile??m.sourceFile]?.sha256)throw Error("已复核CAD属性的解析身份不属于本轮冻结来源,不能直接转挂新图纸");if(n&&(0,q.K3)(m.value)!==(0,q.K3)(`${n.rawValue}${n.unit}`))throw Error("CAD属性的生效值与实际复核值不一致");if(b.contract.deliveryPolicy&&!k.contentTypes.includes("project")&&(0,p.p)(m).requiresTechnicalDecision)throw Error("工程几何概述或未决属性不能作为已核定的施工控制值;须按对象、部位、工况与单位完成主控技术裁决");let r=R(l),u=g,v=!0,A=!1,C=!1,G=m.resolutionRef?.winnerSourceRef?.sourceSpan??m.sourceRef?.sourceSpan,I="source-excerpt"===d.sourceKind?E(j.factBindings,"事实绑定").filter(a=>{let b=F(a,"事实绑定");return"source-excerpt"===b.sourceKind&&b.unitId===e&&b.quote===g&&b.rowId===d.rowId&&b.columnKey===d.columnKey&&JSON.stringify(b.textRange??null)===JSON.stringify(d.textRange??null)}).map(a=>[...b.projectModel.facts,...b.projectModel.sourceControls??[]].find(b=>(0,o.vg)(b)===F(a,"事实绑定").factId)).filter(a=>!!(a&&"verified-source-excerpt"===a.roleId&&(0,s.j)(a)&&Object.hasOwn(b.projectModel.sources,a.sourceFile))):[m],J=[...new Set(I.flatMap(a=>(0,t._1)(b.projectModel,a)))],M=!(0,o.nD)(m)&&/[\u4e00-\u9fff]/u.test(m.value)&&m.value.length>=12&&("verified-source-excerpt"===m.roleId||G&&(0,q.K3)(G).includes((0,q.K3)(m.value))),O=(a,b="")=>{if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)return;let h=b?`${a}${b}`:a,i=(0,t.ei)(h),j=M&&(i.length>0||0===J.length)&&i.every(a=>J.includes(a));if((S(h,m.value)||j)&&(!m.objectName||"项目主体"===m.objectName||("table"===l.kind?(0,q.K3)(r).includes((0,q.K3)(m.objectName)):U(a,m.objectName,m.value))))return N(`作者引用定位未对齐正文,真实对象和值需独立核验:${e}/${f}`,!0),A=!0,L.push({unitId:e,factId:f,submittedQuote:g,verifiedQuote:a,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{}}),K.push({unitId:e,factId:f,quote:a,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{}}),h};if("table"===l.kind){let b=D(d.rowId,"表格事实记录ID"),c=D(d.columnKey,"表格事实字段ID"),e=l.rows.find(a=>a.id===b);if(!e||!e.cells[c])throw Error("表格事实绑定不在指定记录与字段中");r=Object.values(e.cells).join(" ");let f=l.columns.find(a=>a.key===c)?.unit;if((0,q.dP)(e.cells[c],g))f&&!S(g,m.value)&&(u=`${g}${f}`);else{let a=O(e.cells[c],f);if(!a)throw Error("表格事实绑定不在指定记录与字段中");u=a}a={rowId:b,columnKey:c}}else if(!(0,q.dP)(r,g)){let a;for(let b of"paragraph"===l.kind?(l.text.match(/[^。!?]+[。!?]?/gu)??[]).map(a=>a.trim()).filter(Boolean):l.nodes.map(a=>a.label))if(a=O(b))break;if(!a)throw Error("事实断言不在绑定信息单元中");u=a}if("verified-source-excerpt"===m.roleId){if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)throw Error("原文片段引用须独立来源复验,不能按项目单值直接准入");if((0,t.ei)(u).some(a=>!J.includes(a)))throw Error("原文片段没有支持该数值,不能补造参数");for(let a of[...(0,w.$_)([{filePath:m.sourceFile,content:"table"===l.kind?r:u,chapterId:k.chapterId,score:1,source:"written-assertion-check"}]),...(0,o.UT)([{filePath:m.sourceFile,processingType:"drawing",content:"table"===l.kind?r:u}])]){let c=(0,o.nD)(a);if(!c||"project_scope"===c.key)continue;let d=(0,p.p)(a);if(b.contract.deliveryPolicy&&!k.contentTypes.includes("project")&&"design-geometry"===d.role&&("range"===d.precision||"approximate"===d.precision))throw Error("原文中的几何范围或约数不能绕过技术核定成为施工控制值;须按具体部位与工况采用已核准控制属性");let e=(0,x.j)(b.projectModel,{attribute:c.key,..."project_scale"===c.key?{objectName:"项目主体"}:{}});if("resolved"===e.status&&e.value&&!S(a.value,e.value))throw Error(`原文引用不能覆盖已裁决的项目单值:${c.label}`)}A||K.push({unitId:e,factId:f,quote:g,...a,...h.textRange?{textRange:h.textRange}:{}})}else if(!S(u,m.value)){let i=(0,t.ei)(u),j=(0,o.nD)(m),l=j?.key,n=l&&["project_name","owner","project_location","quality_standard"].includes(l)&&!i.length?(0,w.$_)([{filePath:m.sourceFile,content:u,chapterId:k.chapterId,score:1,source:"written-assertion-check"}]):void 0,p=/^(?:本(?:项目|工程|标段))(?:(?:的)?(?:施工|质量|安全|进度|管理|组织|现场|技术|资源|人员|材料|设备|交接|责任|检查|控制|验收|保障|实施|编制|安排|工作|措施|体系))*[,。;、\s]*$/u.test(u);if(c.preserveQualityDefects&&p&&n&&!n.some(a=>(0,o.nD)(a)?.key===l))N(`事实标注没有在该段陈述这一项目属性,属于多余上下文标注,不能作为落实证据:${e}/${f}`),v=!1;else if(c.preserveQualityDefects&&"quality_standard"===l&&!i.length&&n&&!n.some(a=>(0,o.nD)(a)?.key===l))N(`质量标准引用尚需区分实际属性断言与程序上下文标注:${e}/${f}`),K.push({unitId:e,factId:f,quote:g,...a,...h,reviewPurpose:"reference-relevance"}),v=!1;else if(c.preserveQualityDefects&&J.length&&!i.length)N(`事实标注没有陈述该定量属性的值,不能作为落实证据:${e}/${f}`),v=!1;else if((c.preserveQualityDefects||c.deferSourceParaphrases)&&j?.valueType==="text"&&"project_name"!==l&&!J.length&&!i.length&&(0,y.P)(b.projectModel,m))K.push({unitId:e,factId:f,quote:g,...a,...h});else{if(!c.preserveQualityDefects&&!c.deferSourceParaphrases||!M||!i.length&&J.length>0||i.some(a=>!J.includes(a)))throw Error("事实断言没有正确引用该事实的生效值");A||K.push({unitId:e,factId:f,quote:g,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{},...h.textRange?{textRange:h.textRange}:{}})}}if(v&&"paragraph"===l.kind&&m.objectName&&"项目主体"!==m.objectName&&!U(u,m.objectName,m.value)){let a=(0,q.K3)(l.text),b=(0,q.K3)(g),d=a.indexOf(b),h=d>=0&&0>a.indexOf(b,d+b.length)?T(l.text).filter(a=>(0,q.dP)(a,g)&&U(a,m.objectName,m.value)):[];if(1===h.length){if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)throw Error("短引文的段内对象定位须独立复验");u=h[0],L.push({unitId:e,factId:f,submittedQuote:g,verifiedQuote:h[0]}),K.some(a=>a.unitId===e&&a.factId===f&&a.quote===h[0])||K.push({unitId:e,factId:f,quote:h[0]})}else if(c.preserveQualityDefects||c.deferSourceParaphrases){let a=function(a,b,c,d){let e=(0,q.K3)(c),f=(a.match(/[^。;;!?]+[。;;!?]?/gu)??[]).filter(a=>(0,q.dP)(a,b)&&(0,q.K3)(a).includes(e)&&S(a,d));if(1!==f.length)return;let g=f[0],h=T(g).filter(a=>(0,q.K3)(a).includes(e));if(!(!h.length||h.some(a=>(0,t.ei)(a).length>0||/不(?:得)?(?:采用|使用)|禁止采用|禁止使用/u.test(a))))return g}(l.text,g,m.objectName,m.value);a&&(C=!0,i=a,K.push({unitId:e,factId:f,quote:a}))}}let P="table"===l.kind?r:i??u;if(v&&m.objectName&&"项目主体"!==m.objectName&&!(0,q.K3)(P).includes((0,q.K3)(m.objectName)))throw Error("事实绑定对象与该断言或表格记录不一致");if(v&&"table"!==l.kind&&m.objectName&&"项目主体"!==m.objectName&&!U(u,m.objectName,m.value)&&!C)throw Error("事实的对象和值不属于同一断言,不能用整段中的不同句子证明绑定");if(b.contract.deliveryPolicy&&(n||G&&/对于|(?:当|若)[^。;\n]{1,50}(?:时|则)|仅(?:在|对|用于|适用于)|限于|适用于/u.test(G))&&!K.some(a=>a.unitId===e&&a.factId===f&&a.quote===u)&&K.push({unitId:e,factId:f,quote:u,...a,...h.textRange&&u===g?{textRange:h.textRange}:{}}),v&&b.contract.deliveryPolicy){let c=(0,t._1)(b.projectModel,m),d=(0,t.ei)(u),i=d.length>0||"other"!==(0,p.p)(m).role||!!(0,B.Y)(m).domain||!!n,j=(0,z.jh)(b.projectModel,k.id,m,d),l=(0,z.W5)(b.projectModel,k.id,m),o=i||l?void 0:(()=>{try{return(0,z.tS)({project:b.projectModel,taskId:k.id,fact:m,usage:"verified-source-excerpt"===m.roleId?"source-reference":"project-fact",quantitativeValues:[],assertedText:u})}catch{return}})(),q=j?{reviewPurpose:"claim-applicability",claimCategory:"unmeasured",sourceApplication:j}:i?{reviewPurpose:"source-applicability",sourceApplication:(0,z.tS)({project:b.projectModel,taskId:k.id,fact:m,usage:"verified-source-excerpt"===m.roleId?"source-reference":"project-fact",quantitativeValues:d.filter(a=>c.includes(a)),assertedText:u})}:{reviewPurpose:"claim-applicability",claimCategory:"unmeasured",...l||o?{sourceApplication:l??o}:{}},r=K.find(b=>b.unitId===e&&b.factId===f&&b.quote===u&&b.rowId===a?.rowId&&b.columnKey===a?.columnKey);r?Object.assign(r,q):K.push({unitId:e,factId:f,quote:u,...a,...h.textRange&&u===g?{textRange:h.textRange}:{},...q})}return{unitId:e,factId:f,quote:g,...a,...h}}catch(i){let a=Q.find(a=>a.id===e),c=b.contract.criteria.filter(a=>l.has(a.id)&&("facts"===a.dimension||a.factIds?.includes(f)||k.contentTypes.includes("method")&&(0,t.ei)(g).length>0&&"methods"===a.dimension&&/控制点|参数与依据|控制参数|持续时间及推导依据/u.test(a.description))).filter(b=>"facts"===b.dimension||!a||a.criterionIds.includes(b.id)).map(a=>a.id);return M(i instanceof Error?i.message:String(i),c),{unitId:e,factId:f,quote:g,...void 0!==d.rowId?{rowId:String(d.rowId)}:{},...void 0!==d.columnKey?{columnKey:String(d.columnKey)}:{},...h}}});if(c.preserveQualityDefects&&void 0!==j.numericBindings)for(let a of E(j.numericBindings,"定量登记")){let b=F(a,"定量登记");for(let a of(H(b,["unitId","quote","rowId","columnKey","source","textRange"],"定量登记"),D(b.unitId,"定量单元ID"),D(b.quote,"定量断言"),["rowId","columnKey"]))void 0!==b[a]&&D(b[a],a);let c=F(b.source,"定量来源"),d={"project-fact":["factId"],"normative-reference":["factId","version","scope"],derived:["formula","inputFactIds","basis"],"planned-arrangement":["basis","constraints"],"production-plan":["planId","index","use"]}[String(c.kind)];if(!d)throw Error("定量来源类型非法");for(let a of(H(c,["kind",...d],"定量来源"),d))if("inputFactIds"===a||"constraints"===a)E(c[a],a).forEach(b=>D(b,a));else if("index"===a){if(!Number.isSafeInteger(c.index)||0>Number(c.index))throw Error("生产数值序号无效")}else D(c[a],a)}let $=Z.map(a=>{let b=L.find(b=>b.unitId===a.unitId&&b.factId===a.factId&&b.submittedQuote===a.quote&&b.rowId===a.rowId&&b.columnKey===a.columnKey);return b&&!a.textRange?{...a,quote:b.verifiedQuote}:a}),_=c.preserveQualityDefects&&Array.isArray(j.numericBindings)?j.numericBindings.filter(a=>a.source?.kind==="planned-arrangement"&&!(0,t.ei)(a.quote).length&&!RegExp(`\\d|[一二三四五六七八九十百千万]+(?:${h.RD})`,"u").test(a.quote)):[];for(let a of _)N(`无数值的拟定措施被多余登记在数值类别,保留正文但不能算定量依据:${a.unitId}`);let aa=Array.isArray(j.numericBindings)?j.numericBindings.filter(a=>!_.includes(a)):j.numericBindings;try{f=(0,t.Db)(aa,{units:Q,project:b.projectModel,factBindings:$,required:"required-v1"===b.contract.numericSourcePolicy,taskId:k.id,requireSourceApplications:!!b.contract.deliveryPolicy}),_.length&&(f=j.numericBindings)}catch(c){let a=b.contract.criteria.filter(a=>l.has(a.id)&&("facts"===a.dimension||"methods"===a.dimension&&/控制点|参数与依据|控制参数|持续时间及推导依据/u.test(a.description)||"understanding"===a.dimension)).map(a=>a.id);M(c instanceof Error?c.message:String(c),a),f=j.numericBindings}let ab={version:C,contractId:b.contract.id,projectSnapshotId:b.projectModel.snapshotId,taskId:k.id,units:Q,factBindings:Z,decisionRequests:Y,...f?{numericBindings:f}:{},...X?{sectionReferences:X}:{},...i.annotations.length?{annotations:i.annotations}:{}},ac=Q.length?[`${"#".repeat(k.headingLevel??3)} ${k.title}`,...Q.map(a=>R(a,(k.headingLevel??3)+1,void 0,k.title))].join("\n\n"):"",ad=(0,A.b)({contract:b.contract,section:k,project:b.projectModel});return{output:ab,section:k,markdown:ac,contentHash:(0,g.createHash)("sha256").update(JSON.stringify(ab)).digest("hex"),pendingCriterionIds:[...new Set([...Y.flatMap(a=>a.criterionIds),...v,...ad.issues.flatMap(a=>a.criterionIds)])],..."ready"===ad.status?{}:{writingReadiness:ad},...r.length?{qualityIssues:r}:{},...J.length?{annotationIssues:J}:{},...K.length?{sourceReviewRequests:K}:{},...L.length?{locatorEvidence:L}:{},qualityMeasured:!1}}function W(a){let b=(0,f.C)(a.contract,a.section.id),c=new Set(b.flatMap(a=>a.factIds??[])),d=a.projectModel?.facts.find(a=>c.has((0,o.vg)(a))&&(0,s.j)(a)&&!(0,p.p)(a).requiresTechnicalDecision&&1===(0,t.ei)(a.value).length&&a.value.length<=100),e=d&&a.projectModel?(0,r.bV)(a.projectModel).factIndices.get((0,o.vg)(d)):void 0;return["【作者产物协议】完成取证与必要规划后,通过submit_author_task提交本节完整产物,只输出compact-v7在实际正文片段上登记来源的形式。合同、项目及任务身份由已委派上下文还原。",'output={format:"compact-v7",paragraphs:[{id:1,parts:[{text:"一段完整专业正文"}],criterionIndices:[0]}],tables:[],figures:[],decisionRequests:[]}。','场地布置示意图在figures中提供layout:{coordinateSystem:"relative-schematic",placements:[{nodeId,x,y,width,height}],routes:[{edgeIndex,points:[{x,y}]}]}。全部坐标属于0~1图框,逐节点安排区域且不重叠,逐关系给真实拟定线路;不是现场尺寸,不能输出虚构比例或方位。caption明确为布置示意图。工序/接口关系图不填写layout。',"段落、单元格和图件文字由parts按顺序直接拼接,每项为{text,factIndices?,sourceIndices?,projectNumbers?,normativeNumbers?,derivedNumbers?,plannedNumbers?}。text就是实际交付文字;出处只在同一片段的索引与数值字段登记,片段内不写任何出处文字或位置标识——服务端从片段实际所属载体生成引用原句和位置,不猜出处、不改写或增删正文。","跨小节接口使用独立片段{sectionIndex:序号},由服务端恢复这一真实合同的编号和标题;正文文字中禁止出现任何小节的「编号+标题」原样(如「6.2 材料与过程控制」),也禁止把编号标题清单连排成句——一律用{sectionIndex}片段,连接语(如“分别见”“由…承担”)由你写在片段前后;该片段不能另填text或出处。前后实施接口句仍由你按实际职责写;引用标签不代表目标正文已经产出或质量通过,实际缺项保留待办。","图表caption只写实际主题,不自行填写表号或图号;服务器按章顺序和真实载体统一编排。引用本节表格用“上表/下表+实际表名”;跨小节使用sectionIndex引用对应真实小节并说明接口,不猜写其他作者的表号,不把来源图纸编号当本技术标的图号。",`本轮真实小节引用字典:${JSON.stringify(a.contract.sections.map((b,c)=>({sectionIndex:c,label:(0,u.XN)(a.contract).sections.get(b.id),contentTypes:b.contentTypes})))}。只按真实接口选择目标,不按编号猜专业职责。`,"单元id用稳定正整数。criterionIndices从0开始,明确选择本单元实际完成的下列职责;不能默认绑定全节。每段分别提交,parts拼接后不夹带标题、表格或多个段落;必要的内部小标题用heading。不同事实断言分片登记其来源,普通定性方法片段不必附来源数组。不要为了分片拆碎工程逻辑和上下文。","固定小节标题由服务端输出,内部heading不要重复本节标题;表格或图件已有caption,不再用相同heading重复一次表名/图名。同一内部主题连续多段,只在开始处填写heading,后文直接承接。",'tables条目为{id,caption:"非空实际表名",columns:[{key,title,unit?}],rows:[{cells:[{parts:[{text:"实际字段值"}]}]}],criterionIndices};行身份由服务端按真实行序生成,记录内只写cells。每条cells必须与columns等长,每格在自己的parts登记来源,不在行级复制引用。figures条目为{id,caption:"非空实际图名",nodes:[{id,parts}],edges:[{from,to,parts?}],layout?,criterionIndices},所有端点须存在。三类单元共用唯一正整数id,按正文实际顺序编号;顺序本身就是正文次序。没有的类别保留空数组,不创建空载体。',"片段的factIndices=[factIndex]只选择已提供且实际陈述的冻结属性,如工期属性支持540日历天,不能拿面积属性支持楼层。factIndex从0开始,只写序号。正文与来源使用同一片段,避免另抄来源中的措辞成为假引用。","片段的sourceIndices=[sourceIndex]引用尚未抽成独立属性的完整原文。sourceIndex取已提供记录或query_project_facts/search_evidence/read_source/query_work_packages返回的原文序号;factIndex与sourceIndex是独立索引,不能代用或猜序号;身份一律由服务端还原。不同来源支持的断言分别登记。服务端只还原身份和实际原文位置,不推定来源已经支持,仍独立核验对象、范围、条件与含义。","自主提出的工序方法、岗位分工、审批巡查和异常闭环属于本方案措施,不是资料既定事实;定性措施不必附事实绑定。不要拿“承包人应编制预案”等泛条款给自己新增的整套响应分级背书,也不要把方案动作冒充资料原文已有。资料约束如实引用,实施方法由你按项目风险、条件和专业知识展开,其可执行性由方法与义务评价核验。自拟数值仍须明确标为拟定,登记依据和约束。","当前已提供的同源施工生产计划数值用parts.productionNumberIndices=[本任务已授权序号]登记,服务端还原当前plan/contract/project身份和planned或derived用途。正文明确拟定或计算,并准确保留目录量值、完整单位和实际对象工况;计划目录不等于资料既定事实或已核工程采用,不写成confirmed,真实产能或计算缺口仍保留未决。","decisionRequests=[{id,question,reason,criterionIndices}],真实未决问题明确保留;没有时返回[]。资料未明不能编造事实,也不能删除该职责。",...a.contract.numericSourcePolicy?["每个带单位数值及强度等级、牌号、管径须在其实际片段中有factIndices、sourceIndices或分类来源登记。所有分类来源条目只写归类依据,不写引文与定位;其对应断言就是所属片段的实际text。","出处按每一处实际断言登记,同一工期、层数或控制值在另一句/段/记录再次出现,也在那一处附对应引用;第一处引用不会覆盖后来重复值。一个片段包含面积、栋数、层数等不同属性时,分别选择支持各属性的真实序号,不能借“1栋10层”的事实为同片段的用地面积背书。无依据的24小时、100%或其他数值不能当通用措施加入;先查询真实依据,或用完整定性动作表述。",'projectNumbers条目另填factIndex(可靠冻结属性序号,仍须事实绑定证明对象);normativeNumbers填写factIndex、version、scope(实际冻结记录及可核原文,不能填文件名、规范名或自创序号);derivedNumbers填写formula:"$0/$1"、inputFactIndices和basis(输入各含一个明确数值,结果精确一致);plannedNumbers填写basis和constraints(正文及对应表格记录明确“拟定/拟配置/拟安排”,不冒充资料事实)。没有的类别返回[],不填写其他类别的字段;无依据时保留定性或真实未决。',"规范名称、规范编号(如GB50242)、条款号和日期本身不是定量控制值,不填入normativeNumbers;作为依据引用时用真实片段的factIndices/sourceIndices绑定原文。规范中的控制值才填normativeNumbers,并核对版本与适用范围。已有属性引用覆盖的项目数值无需重复登记projectNumbers。"]:[],...a.contract.criteria.filter(a=>!a.chapterId&&a.applicable).map(a=>`【全文共同约束】${(0,n.Av)(a)}`),`【当前固定任务】${a.section.id}:${a.section.title}`,...d&&void 0!==e?[`本轮真实冻结属性引用示例(仅说明登记方法,不要求重复写正文):${JSON.stringify({attribute:d.fieldName??d.key,objectName:d.objectName,value:d.value,parts:[{text:`${d.fieldName??d.key}为${d.value}。`,factIndices:[e]}]})}。示例仅演示登记,实际正文保持项目适用条件并避免无必要重复。`]:[],`本节职责序号:${JSON.stringify(b.map((a,b)=>({index:b,description:(0,n.Av)(a),...a.carrier?{carrier:a.carrier}:{}})))}。所有职责须有实质信息单元或明确未决请求,不省略。`,"首次写入不填写revisionReason,由服务端登记真实首次稿;已有接收稿的修改须在revisionReason说明具体原因。协议标注纠正使用correct_author_submission,只选择服务端已保留的submissionIndex和需改标注,不再次生成全部段落、表行或图件;实质正文改写必须另行完整提交并如实计账。全部任务共享累计返工预算,不反复重写提高分数。提交结构完整不等于质量通过,后续仍执行冻结合同评价。不要额外返回另一份Markdown。"].join("\n")}},97979:(a,b,c)=>{function d(a){let b=String(a||"").trim();return b?/\d{4}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日/u.test(b)?"date":/\d+(?:\.\d+)?\s*(?:万元|亿元|元)/u.test(b)&&!/\d+(?:\.\d+)?\s*(?:万元|元)\s*\//u.test(b)?"money":/(?:GB|JGJ|CJJ|DB|CECS|ISO|IEC|JTG|SL|DL|YB|HG)\s*\/?\s*T?\s*[\d.]+/iu.test(b)?"standard":/(?:C\d{2,3}|HRB\d{3,4}|HPB\d{3}|DN\s*\d+|Φ\s*\d+|φ\s*\d+|\d+(?:\.\d+)?\s*(?:mm|cm|kV|MPa|kPa|kW|W|A|V))/u.test(b)?"spec":/\d+(?:\.\d+)?\s*(?:m2|m3|m²|m³|㎡|m|km|kg|t|吨|个|座|套|台|根|块|株|棵|处|项|日历天|天|层|樘|扇|片|组|件|孔|盏)/u.test(b)?"measure":"text":"text"}c.d(b,{Oq:()=>j,Su:()=>r,UD:()=>i,dm:()=>d,f2:()=>k,yJ:()=>e});let e="变更修改为|变更为|变更至|澄清为|澄清修改为|修改为|调整为|调整至|更正为|修正为|现为|现改为|更改为",f=/[。;;\n]/u,g=RegExp("\\d{4}\\s*年\\s*\\d{1,2}\\s*月\\s*\\d{1,2}\\s*日|\\d+(?:\\.\\d+)?\\s*(?:万元|亿元|日历天|个?月|天|m2|m3|m\xb2|m\xb3|㎡|mm|cm|km|m|kg|t|吨|个|座|套|台|根|块|樘|扇|片|组|件|孔|盏|项|处|层|kV|MPa|kPa|kW|W|A|V|%)|(?:GB|JGJ|CJJ|DB|CECS|ISO|IEC)\\s*/?\\s*T?\\s*[\\d.]+(?:-\\d{2,4})?","giu"),h=/(?:第\s*)?(\d{1,2}(?:\.\d{1,2}){1,3})\s*(?:条|项|款)?/u;function i(a){let b=RegExp(`(${e})\\s*[::]?\\s*(${g.source}|[\\u4e00-\\u9fa5]{2,12})`,"u"),c=RegExp(g.source,"gu"),i=RegExp(`([\\u4e00-\\u9fa5]{2,8})\\s*[::]\\s*(${g.source})`,"gu"),j=[],k=new Set,l=a=>{let b=`${a.superseded}\u0000${a.effective}`;a.superseded===a.effective||k.has(b)||(k.add(b),j.push(a))},m=/变更|澄清|补疑|补遗|调整为|修改为|更正/;for(let g of a){let a=String(g.text||"");if(a&&m.test(a))for(let j of a.split(f)){let a=j.replace(/\s+/gu,"");if(a.length<4)continue;let f=function(a){let b=[],c=h.exec(a)?.[1];c&&b.push(c);let d=a.match(/[一-龥]{2,8}(?=[::))]?(?:为|是|按|采用|统一|变更|澄清|调整))/gu);for(let c of(d&&b.push(...d.slice(0,3)),a.matchAll(/([一-龥]{2,12})\s*[::]\s*(?=\d)/gu)))b.push(c[1].replace(/^(?:原|现|本工程|本项目)/u,""));return/计划工期|合同工期|总工期/u.test(a)&&b.push("计划工期"),[...new Set(b)]}(a),k=b.exec(a);if(k){let b=k[2].trim();if(!/\d/u.test(b)||RegExp(e,"u").test(b))continue;let h=d(b);for(let e of[...a.slice(0,k.index).matchAll(c)].map(a=>a[0].trim()))e!==b&&d(e)===h&&l({superseded:e,effective:b,scope:f,evidence:[{source:g.source,snippet:a.slice(0,120)}],kind:"override"});continue}let m=[...a.matchAll(i)];if(m.length>=2){let b=new Map;for(let a of m){let c=b.get(a[1])||[];c.push(a[2].trim()),b.set(a[1],c)}for(let[c,d]of b){let b=[...new Set(d)];b.length<2||l({superseded:b[0],effective:b[b.length-1],scope:[...new Set([...f,c])],evidence:[{source:g.source,snippet:a.slice(0,120)}],kind:"override"})}}}}return j}function j(a){let b=new Map;for(let c of a){let a=`${c.superseded}\u0000${c.scope.join("|")}`,d=b.get(a);if(!d){b.set(a,c);continue}let e=(d.effective===c.superseded,{...c,superseded:d.superseded,evidence:[...d.evidence,...c.evidence],scope:[...new Set([...d.scope,...c.scope])]});b.set(a,e)}return[...b.values()]}function k(a,b){if(!b||0===b.length)return 0;let c=0;for(let d of a){let a=function(a,b){let c=String(a||""),d=[];for(let a of b)"override"===a.kind&&a.superseded&&c.includes(a.superseded)&&(c=c.replace(RegExp(a.superseded.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"gu"),(b,e)=>{if(e>0&&/[\d.,]/u.test(c[e-1]))return b;let f=Math.max(c.lastIndexOf("。",e-1),c.lastIndexOf(";",e-1),c.lastIndexOf(";",e-1),c.lastIndexOf("\n",e-1))+1,g=c.slice(f,e);if(!function(a,b){if(!a.length)return!1;if(a.some(a=>/计划工期|合同工期|总工期|^工期$/u.test(a))){let a=[...b.matchAll(/(?:计划|合同|总)?工期|周期|期限|节点|阶段|地下|租赁|养护/gu)].at(-1)?.[0];return!!(a&&/^(?:计划|合同|总)?工期$/u.test(a))}return a.some(a=>{let c=a.replace(/^(?:原|现|本工程|本项目)/u,"");return c.length>=2&&b.includes(c)})}(a.scope,g))return b;let h=c.slice(Math.max(f,e-12),e+b.length+12);return/原(?:为|值|内容|计划|合同|招标)|此前|由[^,。;]{0,12}(?:变更|调整)|变更过程/u.test(h)?b:(d.push({from:b,to:a.effective}),a.effective)}));return{text:c,applied:d}}(String(d.content??""),b);0!==a.applied.length&&(d.content=a.text,c+=1)}return c}let l=[{attribute:"合同金额",re:/(?:最高投标限价|招标控制价|合同估算价(?:格)?|工程估算价|投标限价)(?<gap>[^。;\n]{0,16}?)(?:现)?(?:调整)?为?\s*[::]?\s*(?<num>[\d,]+(?:\.\d+)?)\s*(?<unit>亿元|万元|元)/u},{attribute:"计划工期",re:/(?:计划工期|合同工期|总工期)(?<gap>[^。;\n]{0,16}?)(?<num>[\d,]+(?:\.\d+)?)\s*个?\s*日历天/u},{attribute:"暂列金额",re:/(?:暂列金额|暂列金)(?<gap>[^。;\n\d]{0,12}?)(?<num>[\d,]+(?:\.\d+)?)\s*(?<unit>亿元|万元|元)/u},{attribute:"抗震设防烈度",re:/抗震设防烈度[::\s为是]*(?<num>[6-9]\s*度)(?!\s*(?:及|以上|以下|至))/u},{attribute:"地震加速度",re:/(?:设计基本)?地震加速度[::\s为是]*(?<num>\d(?:\.\d+)?\s*g(?![a-z]))/u},{attribute:"场地类别",re:/场地类别[^。;\n]{0,32}?(?<num>(?:[ⅠⅡⅢⅣ]+|[IV]{1,3})\s*类)/u},{attribute:"地基基础设计等级",re:/地基基础设计等级[::\s为是]*(?<num>[甲乙丙]\s*级)/u},{attribute:"抗震设防类别",re:/(?:建筑)?抗震设防类别[::\s为是]*(?<num>[甲乙丙丁]\s*类)(?!型)/u}],m=RegExp(`(?:${e})\\s*[::]?\\s*(\\d{1,4})\\s*个?\\s*日历天`,"u"),n=/(?:计划工期|合同工期|总工期|工期)/u,o=/(?:暂列|暂估|分部分项|单项工程|单位工程|措施项目|其他项目|规费|税金|人工费|材料费|机械费|管理费|利润|单价|合价)/u,p=/现澄清为|现变更为|澄清为如下|澄清修改为|变更修改为|现调整为|全部作废|以本次[^。;\n]{0,10}为准|以澄清[^。;\n]{0,6}为准/u,q=/^\s*(?:\d{1,2}\s*[、..]|问\s*[::])/u;function r(a){let b=[],c=/作废|以本次(?:招标)?答疑附件(?:中材料)?为准|以澄清(?:文件)?为准/u;for(let d of a){let a=String(d.text||"");if(!a)continue;let f=/(?<label>(?:计划|实际|拟定)?开工(?:日期|时间))(?<gap>[^。;;]{0,32}?)(?<num>20\d{2}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日)/gu;for(let c of a.matchAll(f)){let f=c.groups.gap,g=c.groups.num.replace(/\s+/gu,""),h=/^(\d{4})年(\d{1,2})月(\d{1,2})日$/u.exec(g),i=`${Number(h[1])}年${Number(h[2])}月${Number(h[3])}日`,j=new Date(Date.UTC(Number(h[1]),Number(h[2])-1,Number(h[3])));if(j.getUTCFullYear()!==Number(h[1])||j.getUTCMonth()!==Number(h[2])-1||j.getUTCDate()!==Number(h[3]))continue;let k=Math.max(a.lastIndexOf("。",c.index),a.lastIndexOf(";",c.index),a.lastIndexOf(";",c.index))+1,l=a.slice(c.index+c[0].length).search(/[。;;]/u),m=l<0?a.length:c.index+c[0].length+l+1,n=a.slice(k,m),o=a.slice(Math.max(k,c.index-32),c.index);if(/未(?:确定|明确)|不(?:是|采用|作为)|不得|取消|作废|开标|发布|支付|签订/u.test(f)||/(?:不采用|不是|不得采用|已取消)\s*$/u.test(o))continue;let q=c.groups.label,r=/[((]([^()()]*?开工(?:通知|令)[^()()]*?)[))]/u.exec(n)?.[1]??/((?:具体|实际)开工(?:日期|时间)[^。;;]{0,80}?以[^。;;]{0,80}?开工(?:通知|令)[^。;;]{0,20}?为准)/u.exec(n)?.[1],s=/([\d一二三四五六七八九十A-Za-z]+(?:号楼|#楼|标段|工区|栋))\s*$/u.exec(o)?.[1]??"项目主体",t=o.split(/[,,。;;]|\n\s*\n/u).at(-1),u=/(?:见|详见|参见)[^,,。;;]{0,24}$/u.test(t)?"reference":/原(?:招标文件|招标公告|合同|内容)?\s*$/u.test(t)?"superseded":"current",v=a.slice(k,c.index+c[0].length-c.groups.num.length);b.push({attribute:"开工日期",value:i,source:d.source,supersedesPriorMaterials:!1,clarified:"current"===u&&(RegExp(e,"u").test(f)||p.test(v)),openingDate:{kind:/实际/u.test(q)?"actual":/计划|拟定/u.test(q)||r?"planned":"unspecified",role:u,objectName:s,...r?{condition:r}:{},quote:n,sourceStartChar:k,sourceEndChar:m,dateStartChar:c.index+c[0].length-c.groups.num.length,dateEndChar:c.index+c[0].length}})}let g=!1;for(let f of a.split(/\n\s*\n/u))for(let a of(q.test(f)&&/[??]/u.test(f)&&(g=!1),p.test(f)&&(g=!0),f.split(/[。;;\n]/u))){let f;if(a.length<6)continue;let h=c.test(a),i=g||p.test(a),j=n.test(a)?m.exec(a)?.[1]:void 0;j&&b.push({attribute:"计划工期",value:`${j}日历天`,source:d.source,supersedesPriorMaterials:h,clarified:i});let k=a.search(/(?:暂列金额|暂列金)/u),q=k>=0?RegExp(`(?:${e})\\s*[::]?\\s*(\\d+(?:\\.\\d+)?)\\s*(亿元|万元|元)`,"gu"):void 0;if(q){for(let b of a.matchAll(q))if((b.index??0)>k){f=b;break}}for(let c of(f&&b.push({attribute:"暂列金额",value:`${f[1]}${f[2]||""}`,source:d.source,supersedesPriorMaterials:h,clarified:i}),l)){if("计划工期"===c.attribute&&j||"暂列金额"===c.attribute&&f)continue;let e=c.re.exec(a);if(!e?.groups)continue;let g=e.groups.num?.replace(/,/gu,"")||"";if(!g||o.test(e.groups.gap||""))continue;let k="合同金额"===c.attribute||"暂列金额"===c.attribute?`${g}${e.groups.unit||""}`:"计划工期"===c.attribute?`${g}日历天`:g.trim();b.push({attribute:c.attribute,value:k,source:d.source,supersedesPriorMaterials:h,clarified:i})}}}return b}}};
144
+ `:"";if("paragraph"===a.kind)return g+a.text;if("table"===a.kind)return g+[a.caption,"",`| ${a.columns.map(a=>J(a.title+(a.unit?`(${a.unit})`:""))).join(" | ")} |`,`| ${a.columns.map(()=>"---").join(" | ")} |`,...a.rows.map(b=>Q(a,b))].join("\n");let h=new Map(a.nodes.map((a,b)=>[a.id,`n${b}`]));if(c){let b=a.caption.replace(/\[|\]/gu,""),d=c(a);if(void 0===d)return g+a.caption;let e="string"==typeof d?[d]:d;if(!e.length)throw Error("图件渲染不能返回空资产集合");return g+[a.caption,...e.map((a,c)=>`![${b}${c?"(续)":""}](${a})`)].join("\n\n")}return g+[a.caption,"","```mermaid","flowchart TD",...a.nodes.map(a=>` ${h.get(a.id)}[${K(a.label)}]`),...a.edges.map(a=>` ${h.get(a.from)} -->${a.label?`|${K(a.label)}|`:""} ${h.get(a.to)}`),"```"].join("\n")}function S(a,b){let c=(0,q.K3)(b),d=(0,q.K3)(a);if(!c)return!1;for(let a=d.indexOf(c);a>=0;a=d.indexOf(c,a+1)){let b=d[a-1]??"",e=d[a+c.length]??"";if(!(/\d/u.test(c)&&(/\d/u.test(b)||/[a-z0-9]$/u.test(c)&&/[a-z0-9]/u.test(e))||/^[a-z]/u.test(c)&&/[a-z0-9]/u.test(b))&&!(/^[+-]?\d/u.test(c)&&/[.+\-±]/u.test(b)))return!0}return!1}function T(a){let b=[],c=0;for(let d=0;d<a.length;d+=1){let e=a[d];(/[。;;]/u.test(e)||/[,,]/u.test(e)&&!(/\d/u.test(a[d-1]??"")&&/\d/u.test(a[d+1]??"")))&&(b.push(a.slice(c,d)),c=d+1)}return b.push(a.slice(c)),b}function U(a,b,c){return T(a).some(a=>(0,q.K3)(a).includes((0,q.K3)(b))&&S(a,c)&&!/不(?:得)?(?:采用|使用)|禁止采用|禁止使用/u.test(a))}function V(a,b,c={}){let f;(0,n.oH)(b.contract);let i=function(a,b){let c=[],d=(e,f)=>{if(Array.isArray(e))return e.map((a,b)=>d(a,`${f}[${b}]`));if(!e||"object"!=typeof e)return e;let g={};for(let[a,h]of Object.entries(e)){if(!f&&"annotations"===a){if(!Array.isArray(h)||h.some(a=>!a||"object"!=typeof a||Object.keys(a).some(a=>!["path","field","value"].includes(a))||"string"!=typeof a.path||"string"!=typeof a.field||"string"!=typeof a.value))throw Error("协议注记台账无效");c.push(...h);continue}if(b&&/^(?:units|paragraphs|tables|figures)\[\d+\]$/u.test(f)&&/^(?:criterionIndices|criterionIds|factIndices|sourceIndices)_note$/u.test(a)&&"string"==typeof h){c.push({path:f,field:a,value:h});continue}g[a]=d(h,f?`${f}.${a}`:a)}if(b&&/^(?:units|paragraphs|tables|figures)\[\d+\]$/u.test(f)){let b=!f.startsWith("units[")||"format"in a?"criterionIndices":"criterionIds";Object.hasOwn(g,b)||(g[b]=[])}return g};return{value:d(a,""),annotations:c}}(a,!!c.preserveQualityDefects),j=F(O(i.value,{contract:b.contract,taskId:b.taskId,projectModel:b.projectModel}),"作者产物");if(H(j,["version","contractId","projectSnapshotId","taskId","units","factBindings","decisionRequests","numericBindings","sectionReferences","revisionReason"],"作者产物"),j.version!==C||j.contractId!==b.contract.id||j.projectSnapshotId!==b.projectModel.snapshotId||j.projectSnapshotId!==b.contract.projectSnapshotId||j.taskId!==b.taskId)throw Error("作者产物的协议、任务、合同或项目版本不一致");let k=b.contract.sections.find(a=>a.id===b.taskId);if(!k)throw Error("作者产物的任务不在冻结合同中");let l=new Set(b.contract.criteria.filter(a=>a.sectionId===k.id&&a.applicable).map(a=>a.id)),m=new Set,r=[],v=new Set,J=[],K=[],L=[],M=(a,b=l)=>{if(!c.preserveQualityDefects)throw Error(a);for(let c of(r.push(a),b))v.add(c)},N=(a,b=!1)=>{if(!c.preserveQualityDefects&&!(b&&c.deferSourceParaphrases))throw Error(a);J.push(a)};for(let a of i.annotations)N(`作者协议注记留档,不能作为正文或职责完成证据:${a.path}.${a.field}=${a.value}`);let P=a=>{let b=E(a,"评价项ID").map(a=>D(a,"评价项ID"));if(G(b,"评价项"),b.some(a=>!l.has(a)))throw Error("作者单元包含任务范围外评价项");return b.length||N("作者单元缺少职责标注,保留原文与完整合同分母,不自动补绑职责"),b.forEach(a=>m.add(a)),b},Q=E(j.units,"作者信息单元").map(a=>{let b=F(a,"信息单元"),c=D(b.id,"单元ID");if(!c.startsWith(`${k.id}:unit:`)||!/^[A-Za-z0-9:._-]+$/u.test(c))throw Error("作者单元ID必须属于本任务");let d={id:c,criterionIds:P(b.criterionIds),...b.heading?{heading:I(b.heading,"单元标题")}:{}};if("paragraph"===b.kind){H(b,["id","kind","criterionIds","heading","text"],"段落");let a=D(b.text,"段落正文");if(/^#{1,6}\s/mu.test(a)||/```|^\|.+\|$/mu.test(a)||/\r?\n\s*\r?\n/u.test(a))throw Error("段落不得夹带新章节、表格或多个不透明段落;标题放在 heading,段落分别提交");return{...d,kind:"paragraph",text:a}}if("table"===b.kind){H(b,["id","kind","criterionIds","heading","caption","columns","rows"],"表格");let a=E(b.columns,"表格字段").map(a=>{let b=F(a,"表格字段");return H(b,["key","title","unit"],"表格字段"),{key:D(b.key,"字段ID"),title:D(b.title,"字段名"),...b.unit?{unit:D(b.unit,"单位")}:{}}});if(!a.length)throw Error("表格没有字段");G(a.map(a=>a.key),"表格字段");let c=new Set(a.map(a=>a.key)),e=E(b.rows,"表格完整记录").map(b=>{let d=F(b,"表格记录");H(d,["id","cells"],"表格记录");let e=F(d.cells,"表格单元格");if(Object.keys(e).length!==c.size||Object.keys(e).some(a=>!c.has(a)))throw Error("表格记录字段与表头不守恒");let f=Object.fromEntries(a.map(a=>[a.key,D(e[a.key],"表格单元格")]));return{id:D(d.id,"表格记录ID"),cells:f}});if(!e.length)throw Error("表格没有数据记录");return G(e.map(a=>a.id),"表格记录"),{...d,kind:"table",caption:I(b.caption,"表名"),columns:a,rows:e}}if("figure"===b.kind){H(b,["id","kind","criterionIds","heading","caption","nodes","edges","layout"],"图件");let a=E(b.nodes,"图件节点").map(a=>{let b=F(a,"图件节点");return H(b,["id","label"],"图件节点"),{id:D(b.id,"图节点ID"),label:D(b.label,"图节点内容")}});if(!a.length)throw Error("图件没有节点");G(a.map(a=>a.id),"图件节点");let c=new Set(a.map(a=>a.id)),f=E(b.edges,"图件关系").map(a=>{let b=F(a,"图件关系");H(b,["from","to","label"],"图件关系");let d=D(b.from,"图起点"),e=D(b.to,"图终点");if(!c.has(d)||!c.has(e))throw Error("图件关系引用了不存在的节点");return{from:d,to:e,...b.label?{label:D(b.label,"图关系内容")}:{}}});return{...d,kind:"figure",caption:I(b.caption,"图名"),nodes:a,edges:f,...b.layout?{layout:(0,e.Q)(b.layout,a.map(a=>a.id),f)}:{}}}throw Error("作者信息单元类型不合法")});if(G(Q.map(a=>a.id),"作者单元"),b.contract.deliveryPolicy)for(let a of Q){let b="paragraph"===a.kind?a.text:"table"===a.kind?a.rows.map(a=>Object.values(a.cells).join(" ")).join("\n"):[a.caption,...a.nodes.map(a=>a.label),...a.edges.map(a=>a.label??"")].join("\n");for(let c of(0,d.G0)(b))M(`单元${a.id}:${c}`,a.criterionIds.length?a.criterionIds:l);"figure"===a.kind&&/总平面|场地布置|平面布置/u.test(a.caption)&&!a.layout&&M(`单元${a.id}:节点边关系图没有设施空间位置与线路,不能冒充施工平面布置图`,a.criterionIds.length?a.criterionIds:l),"figure"===a.kind&&a.layout&&!/示意/u.test(a.caption)&&M(`单元${a.id}:相对坐标布置须明确为示意,不能冒充测量比例或现场定位图`,a.criterionIds.length?a.criterionIds:l)}let W=(0,u.XN)(b.contract),X=void 0===j.sectionReferences?void 0:E(j.sectionReferences,"真实小节引用").map(a=>{let b,c=F(a,"真实小节引用");H(c,["unitId","sectionId","quote","textRange","rowId","columnKey","nodeId","edgeIndex"],"真实小节引用");let d=D(c.unitId,"引用单元"),e=D(c.sectionId,"真实目标小节"),f=D(c.quote,"实际小节标签"),g=Q.find(a=>a.id===d),h=W.sections.get(e);if(!g||!h||h!==f)throw Error("小节引用身份或展示标签不属于当前真实合同");if("paragraph"===g.kind){if(["rowId","columnKey","nodeId","edgeIndex"].some(a=>void 0!==c[a]))throw Error("段落小节引用不能冒用其他载体定位");b=g.text}else if("table"===g.kind){if(void 0!==c.nodeId||void 0!==c.edgeIndex)throw Error("表格小节引用不能冒用图定位");let a=g.rows.find(a=>a.id===c.rowId),d=g.columns.find(a=>a.key===c.columnKey);if(!a||!d)throw Error("小节引用必须指向实际表格记录和字段");b=a.cells[d.key]}else{if(void 0!==c.rowId||void 0!==c.columnKey||void 0!==c.nodeId==(void 0!==c.edgeIndex))throw Error("图件小节引用须指向唯一真实节点或关系");b=void 0!==c.nodeId?g.nodes.find(a=>a.id===c.nodeId)?.label??"":Number.isSafeInteger(c.edgeIndex)&&Number(c.edgeIndex)>=0?g.edges[Number(c.edgeIndex)]?.label??"":""}let i=F(c.textRange,"小节引用UTF16位置");if(H(i,["start","end"],"小节引用UTF16位置"),!Number.isSafeInteger(i.start)||!Number.isSafeInteger(i.end)||0>Number(i.start)||Number(i.end)<=Number(i.start)||Number(i.end)>b.length||b.slice(Number(i.start),Number(i.end))!==f)throw Error("小节引用位置没有对齐这一处真实正文");return{...c,unitId:d,sectionId:e,quote:f,textRange:{start:Number(i.start),end:Number(i.end)}}});for(let a of Q)for(let b of"paragraph"===a.kind?[{text:a.text}]:"table"===a.kind?a.rows.flatMap(a=>Object.entries(a.cells).map(([b,c])=>({text:c,rowId:a.id,columnKey:b}))):[...a.nodes.map(a=>({text:a.label,nodeId:a.id})),...a.edges.map((a,b)=>({text:a.label??"",edgeIndex:b}))]){let c=b;for(let b of W.sections.values())for(let d=c.text.indexOf(b);d>=0;d=c.text.indexOf(b,d+b.length))X?.some(e=>e.unitId===a.id&&e.quote===b&&e.textRange.start===d&&e.rowId===c.rowId&&e.columnKey===c.columnKey&&e.nodeId===c.nodeId&&e.edgeIndex===c.edgeIndex)||M(`手抄小节编号标题缺少真实接口绑定:${b};使用实际sectionIndex并说明实施接口`,a.criterionIds);for(let b of c.text.matchAll(/(?<!附)表\d+(?![-..\d])/gu))M(`正文存在悬挂数字表号引用:${b[0]};应引用实际题注编号或上表/下表及表名`,a.criterionIds);/(?:招标文件|合同|设计文件)[^。;;]{0,24}附表\d+/u.test(c.text)&&M("正文用外部附表指向代替本任务具体执行要求;核实原表后明确本项目职责与配置,不由接收器删除或补写正文",a.criterionIds)}let Y=E(j.decisionRequests,"决定请求").map(a=>{let b=F(a,"决定请求");return H(b,["id","question","reason","criterionIds"],"决定请求"),{id:D(b.id,"请求ID"),question:D(b.question,"待决定问题"),reason:D(b.reason,"决定依据缺口"),criterionIds:P(b.criterionIds)}});for(let a of(G(Y.map(a=>a.id),"决定请求"),m.size!==l.size&&N(`作者任务未覆盖完整评价集合:缺 ${[...l].filter(a=>!m.has(a)).join("、")}`),b.contract.criteria.filter(a=>l.has(a.id)&&a.carrier)))if(!Q.some(b=>b.kind===a.carrier&&b.criterionIds.includes(a.id))&&!Y.some(b=>b.criterionIds.includes(a.id))){let b=`载体义务必须由真实${"table"===a.carrier?"表格":"图件"}单元完成,或明确保留未决事项:${a.id}`;Q.some(b=>b.kind===a.carrier)?N(b):M(b)}let Z=E(j.factBindings,"事实绑定").map(a=>{let d=F(a,"事实绑定"),e=D(d.unitId,"事实所在单元"),f=D(d.factId,"事实ID"),g=D(d.quote,"事实断言");if(H(d,["unitId","factId","quote","rowId","columnKey","sourceKind","textRange"],"事实绑定"),void 0!==d.sourceKind&&"source-excerpt"!==d.sourceKind)throw Error("事实绑定来源角色非法");let h={..."source-excerpt"===d.sourceKind?{sourceKind:"source-excerpt"}:{},...d.textRange?{textRange:d.textRange}:{}};void 0!==d.rowId&&D(d.rowId,"事实记录ID"),void 0!==d.columnKey&&D(d.columnKey,"事实字段ID");try{let a,i,l=Q.find(a=>a.id===e),m=[...b.projectModel.facts,...b.projectModel.sourceControls??[]].find(a=>(0,o.vg)(a)===f);if("source-excerpt"===d.sourceKind&&(!/^source-excerpt:[a-f0-9]{24}$/u.test(f)||m?.roleId!=="verified-source-excerpt"))throw Error("原文引用须使用实际冻结sourceEvidenceId,不能借项目单值ID或自造ID");if(!l||!m||!Object.hasOwn(b.projectModel.sources,m.sourceFile)||!(0,s.j)(m))throw Error("事实绑定不属于冻结项目或缺少可靠来源");if(void 0!==d.textRange){let a=F(d.textRange,"正文引用位置");H(a,["start","end"],"正文引用位置");let b="paragraph"===l.kind?l.text:"table"===l.kind?l.rows.find(a=>a.id===d.rowId)?.cells[String(d.columnKey)]:void 0;if("string"!=typeof b||!Number.isSafeInteger(a.start)||!Number.isSafeInteger(a.end)||0>Number(a.start)||Number(a.end)<=Number(a.start)||Number(a.end)>b.length||b.slice(Number(a.start),Number(a.end))!==g)throw Error("正文引用位置没有对应实际原文片段,不能给另一处同值借用出处")}let n=(m.resolutionRef?.winnerSourceRef??m.sourceRef)?.cadInterpretation;if(n&&n.parsedIdentity!==b.projectModel.sources[m.resolutionRef?.winnerSourceFile??m.sourceFile]?.sha256)throw Error("已复核CAD属性的解析身份不属于本轮冻结来源,不能直接转挂新图纸");if(n&&(0,q.K3)(m.value)!==(0,q.K3)(`${n.rawValue}${n.unit}`))throw Error("CAD属性的生效值与实际复核值不一致");if(b.contract.deliveryPolicy&&!k.contentTypes.includes("project")&&(0,p.p)(m).requiresTechnicalDecision)throw Error("工程几何概述或未决属性不能作为已核定的施工控制值;须按对象、部位、工况与单位完成主控技术裁决");let r=R(l),u=g,v=!0,A=!1,C=!1,G=m.resolutionRef?.winnerSourceRef?.sourceSpan??m.sourceRef?.sourceSpan,I="source-excerpt"===d.sourceKind?E(j.factBindings,"事实绑定").filter(a=>{let b=F(a,"事实绑定");return"source-excerpt"===b.sourceKind&&b.unitId===e&&b.quote===g&&b.rowId===d.rowId&&b.columnKey===d.columnKey&&JSON.stringify(b.textRange??null)===JSON.stringify(d.textRange??null)}).map(a=>[...b.projectModel.facts,...b.projectModel.sourceControls??[]].find(b=>(0,o.vg)(b)===F(a,"事实绑定").factId)).filter(a=>!!(a&&"verified-source-excerpt"===a.roleId&&(0,s.j)(a)&&Object.hasOwn(b.projectModel.sources,a.sourceFile))):[m],J=[...new Set(I.flatMap(a=>(0,t._1)(b.projectModel,a)))],M=!(0,o.nD)(m)&&/[\u4e00-\u9fff]/u.test(m.value)&&m.value.length>=12&&("verified-source-excerpt"===m.roleId||G&&(0,q.K3)(G).includes((0,q.K3)(m.value))),O=(a,b="")=>{if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)return;let h=b?`${a}${b}`:a,i=(0,t.ei)(h),j=M&&(i.length>0||0===J.length)&&i.every(a=>J.includes(a));if((S(h,m.value)||j)&&(!m.objectName||"项目主体"===m.objectName||("table"===l.kind?(0,q.K3)(r).includes((0,q.K3)(m.objectName)):U(a,m.objectName,m.value))))return N(`作者引用定位未对齐正文,真实对象和值需独立核验:${e}/${f}`,!0),A=!0,L.push({unitId:e,factId:f,submittedQuote:g,verifiedQuote:a,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{}}),K.push({unitId:e,factId:f,quote:a,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{}}),h};if("table"===l.kind){let b=D(d.rowId,"表格事实记录ID"),c=D(d.columnKey,"表格事实字段ID"),e=l.rows.find(a=>a.id===b);if(!e||!e.cells[c])throw Error("表格事实绑定不在指定记录与字段中");r=Object.values(e.cells).join(" ");let f=l.columns.find(a=>a.key===c)?.unit;if((0,q.dP)(e.cells[c],g))f&&!S(g,m.value)&&(u=`${g}${f}`);else{let a=O(e.cells[c],f);if(!a)throw Error("表格事实绑定不在指定记录与字段中");u=a}a={rowId:b,columnKey:c}}else if(!(0,q.dP)(r,g)){let a;for(let b of"paragraph"===l.kind?(l.text.match(/[^。!?]+[。!?]?/gu)??[]).map(a=>a.trim()).filter(Boolean):l.nodes.map(a=>a.label))if(a=O(b))break;if(!a)throw Error("事实断言不在绑定信息单元中");u=a}if("verified-source-excerpt"===m.roleId){if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)throw Error("原文片段引用须独立来源复验,不能按项目单值直接准入");if((0,t.ei)(u).some(a=>!J.includes(a)))throw Error("原文片段没有支持该数值,不能补造参数");for(let a of[...(0,w.$_)([{filePath:m.sourceFile,content:"table"===l.kind?r:u,chapterId:k.chapterId,score:1,source:"written-assertion-check"}]),...(0,o.UT)([{filePath:m.sourceFile,processingType:"drawing",content:"table"===l.kind?r:u}])]){let c=(0,o.nD)(a);if(!c||"project_scope"===c.key)continue;let d=(0,p.p)(a);if(b.contract.deliveryPolicy&&!k.contentTypes.includes("project")&&"design-geometry"===d.role&&("range"===d.precision||"approximate"===d.precision))throw Error("原文中的几何范围或约数不能绕过技术核定成为施工控制值;须按具体部位与工况采用已核准控制属性");let e=(0,x.j)(b.projectModel,{attribute:c.key,..."project_scale"===c.key?{objectName:"项目主体"}:{}});if("resolved"===e.status&&e.value&&!S(a.value,e.value))throw Error(`原文引用不能覆盖已裁决的项目单值:${c.label}`)}A||K.push({unitId:e,factId:f,quote:g,...a,...h.textRange?{textRange:h.textRange}:{}})}else if(!S(u,m.value)){let i=(0,t.ei)(u),j=(0,o.nD)(m),l=j?.key,n=l&&["project_name","owner","project_location","quality_standard"].includes(l)&&!i.length?(0,w.$_)([{filePath:m.sourceFile,content:u,chapterId:k.chapterId,score:1,source:"written-assertion-check"}]):void 0,p=/^(?:本(?:项目|工程|标段))(?:(?:的)?(?:施工|质量|安全|进度|管理|组织|现场|技术|资源|人员|材料|设备|交接|责任|检查|控制|验收|保障|实施|编制|安排|工作|措施|体系))*[,。;、\s]*$/u.test(u);if(c.preserveQualityDefects&&p&&n&&!n.some(a=>(0,o.nD)(a)?.key===l))N(`事实标注没有在该段陈述这一项目属性,属于多余上下文标注,不能作为落实证据:${e}/${f}`),v=!1;else if(c.preserveQualityDefects&&"quality_standard"===l&&!i.length&&n&&!n.some(a=>(0,o.nD)(a)?.key===l))N(`质量标准引用尚需区分实际属性断言与程序上下文标注:${e}/${f}`),K.push({unitId:e,factId:f,quote:g,...a,...h,reviewPurpose:"reference-relevance"}),v=!1;else if(c.preserveQualityDefects&&J.length&&!i.length)N(`事实标注没有陈述该定量属性的值,不能作为落实证据:${e}/${f}`),v=!1;else if((c.preserveQualityDefects||c.deferSourceParaphrases)&&j?.valueType==="text"&&"project_name"!==l&&!J.length&&!i.length&&(0,y.P)(b.projectModel,m))K.push({unitId:e,factId:f,quote:g,...a,...h});else{if(!c.preserveQualityDefects&&!c.deferSourceParaphrases||!M||!i.length&&J.length>0||i.some(a=>!J.includes(a)))throw Error("事实断言没有正确引用该事实的生效值");A||K.push({unitId:e,factId:f,quote:g,...d.rowId?{rowId:String(d.rowId)}:{},...d.columnKey?{columnKey:String(d.columnKey)}:{},...h.textRange?{textRange:h.textRange}:{}})}}if(v&&"paragraph"===l.kind&&m.objectName&&"项目主体"!==m.objectName&&!U(u,m.objectName,m.value)){let a=(0,q.K3)(l.text),b=(0,q.K3)(g),d=a.indexOf(b),h=d>=0&&0>a.indexOf(b,d+b.length)?T(l.text).filter(a=>(0,q.dP)(a,g)&&U(a,m.objectName,m.value)):[];if(1===h.length){if(!c.preserveQualityDefects&&!c.deferSourceParaphrases)throw Error("短引文的段内对象定位须独立复验");u=h[0],L.push({unitId:e,factId:f,submittedQuote:g,verifiedQuote:h[0]}),K.some(a=>a.unitId===e&&a.factId===f&&a.quote===h[0])||K.push({unitId:e,factId:f,quote:h[0]})}else if(c.preserveQualityDefects||c.deferSourceParaphrases){let a=function(a,b,c,d){let e=(0,q.K3)(c),f=(a.match(/[^。;;!?]+[。;;!?]?/gu)??[]).filter(a=>(0,q.dP)(a,b)&&(0,q.K3)(a).includes(e)&&S(a,d));if(1!==f.length)return;let g=f[0],h=T(g).filter(a=>(0,q.K3)(a).includes(e));if(!(!h.length||h.some(a=>(0,t.ei)(a).length>0||/不(?:得)?(?:采用|使用)|禁止采用|禁止使用/u.test(a))))return g}(l.text,g,m.objectName,m.value);a&&(C=!0,i=a,K.push({unitId:e,factId:f,quote:a}))}}let P="table"===l.kind?r:i??u;if(v&&m.objectName&&"项目主体"!==m.objectName&&!(0,q.K3)(P).includes((0,q.K3)(m.objectName)))throw Error("事实绑定对象与该断言或表格记录不一致");if(v&&"table"!==l.kind&&m.objectName&&"项目主体"!==m.objectName&&!U(u,m.objectName,m.value)&&!C)throw Error("事实的对象和值不属于同一断言,不能用整段中的不同句子证明绑定");if(b.contract.deliveryPolicy&&(n||G&&/对于|(?:当|若)[^。;\n]{1,50}(?:时|则)|仅(?:在|对|用于|适用于)|限于|适用于/u.test(G))&&!K.some(a=>a.unitId===e&&a.factId===f&&a.quote===u)&&K.push({unitId:e,factId:f,quote:u,...a,...h.textRange&&u===g?{textRange:h.textRange}:{}}),v&&b.contract.deliveryPolicy){let c=(0,t._1)(b.projectModel,m),d=(0,t.ei)(u),i=d.length>0||"other"!==(0,p.p)(m).role||!!(0,B.Y)(m).domain||!!n,j=(0,z.jh)(b.projectModel,k.id,m,d),l=(0,z.W5)(b.projectModel,k.id,m),o=i||l?void 0:(()=>{try{return(0,z.tS)({project:b.projectModel,taskId:k.id,fact:m,usage:"verified-source-excerpt"===m.roleId?"source-reference":"project-fact",quantitativeValues:[],assertedText:u})}catch{return}})(),q=j?{reviewPurpose:"claim-applicability",claimCategory:"unmeasured",sourceApplication:j}:i?{reviewPurpose:"source-applicability",sourceApplication:(0,z.tS)({project:b.projectModel,taskId:k.id,fact:m,usage:"verified-source-excerpt"===m.roleId?"source-reference":"project-fact",quantitativeValues:d.filter(a=>c.includes(a)),assertedText:u})}:{reviewPurpose:"claim-applicability",claimCategory:"unmeasured",...l||o?{sourceApplication:l??o}:{}},r=K.find(b=>b.unitId===e&&b.factId===f&&b.quote===u&&b.rowId===a?.rowId&&b.columnKey===a?.columnKey);r?Object.assign(r,q):K.push({unitId:e,factId:f,quote:u,...a,...h.textRange&&u===g?{textRange:h.textRange}:{},...q})}return{unitId:e,factId:f,quote:g,...a,...h}}catch(i){let a=Q.find(a=>a.id===e),c=b.contract.criteria.filter(a=>l.has(a.id)&&("facts"===a.dimension||a.factIds?.includes(f)||k.contentTypes.includes("method")&&(0,t.ei)(g).length>0&&"methods"===a.dimension&&/控制点|参数与依据|控制参数|持续时间及推导依据/u.test(a.description))).filter(b=>"facts"===b.dimension||!a||a.criterionIds.includes(b.id)).map(a=>a.id);return M(i instanceof Error?i.message:String(i),c),{unitId:e,factId:f,quote:g,...void 0!==d.rowId?{rowId:String(d.rowId)}:{},...void 0!==d.columnKey?{columnKey:String(d.columnKey)}:{},...h}}});if(c.preserveQualityDefects&&void 0!==j.numericBindings)for(let a of E(j.numericBindings,"定量登记")){let b=F(a,"定量登记");for(let a of(H(b,["unitId","quote","rowId","columnKey","source","textRange"],"定量登记"),D(b.unitId,"定量单元ID"),D(b.quote,"定量断言"),["rowId","columnKey"]))void 0!==b[a]&&D(b[a],a);let c=F(b.source,"定量来源"),d={"project-fact":["factId"],"normative-reference":["factId","version","scope"],derived:["formula","inputFactIds","basis"],"planned-arrangement":["basis","constraints"],"production-plan":["planId","index","use"]}[String(c.kind)];if(!d)throw Error("定量来源类型非法");for(let a of(H(c,["kind",...d],"定量来源"),d))if("inputFactIds"===a||"constraints"===a)E(c[a],a).forEach(b=>D(b,a));else if("index"===a){if(!Number.isSafeInteger(c.index)||0>Number(c.index))throw Error("生产数值序号无效")}else D(c[a],a)}let $=Z.map(a=>{let b=L.find(b=>b.unitId===a.unitId&&b.factId===a.factId&&b.submittedQuote===a.quote&&b.rowId===a.rowId&&b.columnKey===a.columnKey);return b&&!a.textRange?{...a,quote:b.verifiedQuote}:a}),_=c.preserveQualityDefects&&Array.isArray(j.numericBindings)?j.numericBindings.filter(a=>a.source?.kind==="planned-arrangement"&&!(0,t.ei)(a.quote).length&&!RegExp(`\\d|[一二三四五六七八九十百千万]+(?:${h.RD})`,"u").test(a.quote)):[];for(let a of _)N(`无数值的拟定措施被多余登记在数值类别,保留正文但不能算定量依据:${a.unitId}`);let aa=Array.isArray(j.numericBindings)?j.numericBindings.filter(a=>!_.includes(a)):j.numericBindings;try{f=(0,t.Db)(aa,{units:Q,project:b.projectModel,factBindings:$,required:"required-v1"===b.contract.numericSourcePolicy,taskId:k.id,requireSourceApplications:!!b.contract.deliveryPolicy}),_.length&&(f=j.numericBindings)}catch(c){let a=b.contract.criteria.filter(a=>l.has(a.id)&&("facts"===a.dimension||"methods"===a.dimension&&/控制点|参数与依据|控制参数|持续时间及推导依据/u.test(a.description)||"understanding"===a.dimension)).map(a=>a.id);M(c instanceof Error?c.message:String(c),a),f=j.numericBindings}let ab={version:C,contractId:b.contract.id,projectSnapshotId:b.projectModel.snapshotId,taskId:k.id,units:Q,factBindings:Z,decisionRequests:Y,...f?{numericBindings:f}:{},...X?{sectionReferences:X}:{},...i.annotations.length?{annotations:i.annotations}:{}},ac=Q.length?[`${"#".repeat(k.headingLevel??3)} ${k.title}`,...Q.map(a=>R(a,(k.headingLevel??3)+1,void 0,k.title))].join("\n\n"):"",ad=(0,A.b)({contract:b.contract,section:k,project:b.projectModel});return{output:ab,section:k,markdown:ac,contentHash:(0,g.createHash)("sha256").update(JSON.stringify(ab)).digest("hex"),pendingCriterionIds:[...new Set([...Y.flatMap(a=>a.criterionIds),...v,...ad.issues.flatMap(a=>a.criterionIds)])],..."ready"===ad.status?{}:{writingReadiness:ad},...r.length?{qualityIssues:r}:{},...J.length?{annotationIssues:J}:{},...K.length?{sourceReviewRequests:K}:{},...L.length?{locatorEvidence:L}:{},qualityMeasured:!1}}function W(a){let b=(0,f.C)(a.contract,a.section.id),c=new Set(b.flatMap(a=>a.factIds??[])),d=a.projectModel?.facts.find(a=>c.has((0,o.vg)(a))&&(0,s.j)(a)&&!(0,p.p)(a).requiresTechnicalDecision&&1===(0,t.ei)(a.value).length&&a.value.length<=100),e=d&&a.projectModel?(0,r.bV)(a.projectModel).factIndices.get((0,o.vg)(d)):void 0;return{shared:["【作者产物协议】完成取证与必要规划后,通过submit_author_task提交本节完整产物,只输出compact-v7在实际正文片段上登记来源的形式。合同、项目及任务身份由已委派上下文还原。",'output={format:"compact-v7",paragraphs:[{id:1,parts:[{text:"一段完整专业正文"}],criterionIndices:[0]}],tables:[],figures:[],decisionRequests:[]}。','场地布置示意图在figures中提供layout:{coordinateSystem:"relative-schematic",placements:[{nodeId,x,y,width,height}],routes:[{edgeIndex,points:[{x,y}]}]}。全部坐标属于0~1图框,逐节点安排区域且不重叠,逐关系给真实拟定线路;不是现场尺寸,不能输出虚构比例或方位。caption明确为布置示意图。工序/接口关系图不填写layout。',"段落、单元格和图件文字由parts按顺序直接拼接,每项为{text,factIndices?,sourceIndices?,projectNumbers?,normativeNumbers?,derivedNumbers?,plannedNumbers?}。text就是实际交付文字;出处只在同一片段的索引与数值字段登记,片段内不写任何出处文字或位置标识——服务端从片段实际所属载体生成引用原句和位置,不猜出处、不改写或增删正文。","跨小节接口使用独立片段{sectionIndex:序号},由服务端恢复这一真实合同的编号和标题;正文文字中禁止出现任何小节的「编号+标题」原样(如「6.2 材料与过程控制」),也禁止把编号标题清单连排成句——一律用{sectionIndex}片段,连接语(如“分别见”“由…承担”)由你写在片段前后;该片段不能另填text或出处。前后实施接口句仍由你按实际职责写;引用标签不代表目标正文已经产出或质量通过,实际缺项保留待办。","图表caption只写实际主题,不自行填写表号或图号;服务器按章顺序和真实载体统一编排。引用本节表格用“上表/下表+实际表名”;跨小节使用sectionIndex引用对应真实小节并说明接口,不猜写其他作者的表号,不把来源图纸编号当本技术标的图号。",`本轮真实小节引用字典:${JSON.stringify(a.contract.sections.map((b,c)=>({sectionIndex:c,label:(0,u.XN)(a.contract).sections.get(b.id),contentTypes:b.contentTypes})))}。只按真实接口选择目标,不按编号猜专业职责。`,"单元id用稳定正整数。criterionIndices从0开始,明确选择本单元实际完成的下列职责;不能默认绑定全节。每段分别提交,parts拼接后不夹带标题、表格或多个段落;必要的内部小标题用heading。不同事实断言分片登记其来源,普通定性方法片段不必附来源数组。不要为了分片拆碎工程逻辑和上下文。","固定小节标题由服务端输出,内部heading不要重复本节标题;表格或图件已有caption,不再用相同heading重复一次表名/图名。同一内部主题连续多段,只在开始处填写heading,后文直接承接。",'tables条目为{id,caption:"非空实际表名",columns:[{key,title,unit?}],rows:[{cells:[{parts:[{text:"实际字段值"}]}]}],criterionIndices};行身份由服务端按真实行序生成,记录内只写cells。每条cells必须与columns等长,每格在自己的parts登记来源,不在行级复制引用。figures条目为{id,caption:"非空实际图名",nodes:[{id,parts}],edges:[{from,to,parts?}],layout?,criterionIndices},所有端点须存在。三类单元共用唯一正整数id,按正文实际顺序编号;顺序本身就是正文次序。没有的类别保留空数组,不创建空载体。',"片段的factIndices=[factIndex]只选择已提供且实际陈述的冻结属性,如工期属性支持540日历天,不能拿面积属性支持楼层。factIndex从0开始,只写序号。正文与来源使用同一片段,避免另抄来源中的措辞成为假引用。","片段的sourceIndices=[sourceIndex]引用尚未抽成独立属性的完整原文。sourceIndex取已提供记录或query_project_facts/search_evidence/read_source/query_work_packages返回的原文序号;factIndex与sourceIndex是独立索引,不能代用或猜序号;身份一律由服务端还原。不同来源支持的断言分别登记。服务端只还原身份和实际原文位置,不推定来源已经支持,仍独立核验对象、范围、条件与含义。","自主提出的工序方法、岗位分工、审批巡查和异常闭环属于本方案措施,不是资料既定事实;定性措施不必附事实绑定。不要拿“承包人应编制预案”等泛条款给自己新增的整套响应分级背书,也不要把方案动作冒充资料原文已有。资料约束如实引用,实施方法由你按项目风险、条件和专业知识展开,其可执行性由方法与义务评价核验。自拟数值仍须明确标为拟定,登记依据和约束。","当前已提供的同源施工生产计划数值用parts.productionNumberIndices=[本任务已授权序号]登记,服务端还原当前plan/contract/project身份和planned或derived用途。正文明确拟定或计算,并准确保留目录量值、完整单位和实际对象工况;计划目录不等于资料既定事实或已核工程采用,不写成confirmed,真实产能或计算缺口仍保留未决。","decisionRequests=[{id,question,reason,criterionIndices}],真实未决问题明确保留;没有时返回[]。资料未明不能编造事实,也不能删除该职责。",...a.contract.numericSourcePolicy?["每个带单位数值及强度等级、牌号、管径须在其实际片段中有factIndices、sourceIndices或分类来源登记。所有分类来源条目只写归类依据,不写引文与定位;其对应断言就是所属片段的实际text。","出处按每一处实际断言登记,同一工期、层数或控制值在另一句/段/记录再次出现,也在那一处附对应引用;第一处引用不会覆盖后来重复值。一个片段包含面积、栋数、层数等不同属性时,分别选择支持各属性的真实序号,不能借“1栋10层”的事实为同片段的用地面积背书。无依据的24小时、100%或其他数值不能当通用措施加入;先查询真实依据,或用完整定性动作表述。",'projectNumbers条目另填factIndex(可靠冻结属性序号,仍须事实绑定证明对象);normativeNumbers填写factIndex、version、scope(实际冻结记录及可核原文,不能填文件名、规范名或自创序号);derivedNumbers填写formula:"$0/$1"、inputFactIndices和basis(输入各含一个明确数值,结果精确一致);plannedNumbers填写basis和constraints(正文及对应表格记录明确“拟定/拟配置/拟安排”,不冒充资料事实)。没有的类别返回[],不填写其他类别的字段;无依据时保留定性或真实未决。',"规范名称、规范编号(如GB50242)、条款号和日期本身不是定量控制值,不填入normativeNumbers;作为依据引用时用真实片段的factIndices/sourceIndices绑定原文。规范中的控制值才填normativeNumbers,并核对版本与适用范围。已有属性引用覆盖的项目数值无需重复登记projectNumbers。"]:[],...a.contract.criteria.filter(a=>!a.chapterId&&a.applicable).map(a=>`【全文共同约束】${(0,n.Av)(a)}`),"首次写入不填写revisionReason,由服务端登记真实首次稿;已有接收稿的修改须在revisionReason说明具体原因。协议标注纠正使用correct_author_submission,只选择服务端已保留的submissionIndex和需改标注,不再次生成全部段落、表行或图件;实质正文改写必须另行完整提交并如实计账。各任务的实质正文修改如实计入累计返工记录,不为提高分数反复重写。提交结构完整不等于质量通过,后续仍执行冻结合同评价。不要额外返回另一份Markdown。"].join("\n"),task:[`【当前固定任务】${a.section.id}:${a.section.title}`,...d&&void 0!==e?[`本轮真实冻结属性引用示例(仅说明登记方法,不要求重复写正文):${JSON.stringify({attribute:d.fieldName??d.key,objectName:d.objectName,value:d.value,parts:[{text:`${d.fieldName??d.key}为${d.value}。`,factIndices:[e]}]})}。示例仅演示登记,实际正文保持项目适用条件并避免无必要重复。`]:[],`本节职责序号:${JSON.stringify(b.map((a,b)=>({index:b,description:(0,n.Av)(a),...a.carrier?{carrier:a.carrier}:{}})))}。所有职责须有实质信息单元或明确未决请求,不省略。`].join("\n")}}},97979:(a,b,c)=>{function d(a){let b=String(a||"").trim();return b?/\d{4}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日/u.test(b)?"date":/\d+(?:\.\d+)?\s*(?:万元|亿元|元)/u.test(b)&&!/\d+(?:\.\d+)?\s*(?:万元|元)\s*\//u.test(b)?"money":/(?:GB|JGJ|CJJ|DB|CECS|ISO|IEC|JTG|SL|DL|YB|HG)\s*\/?\s*T?\s*[\d.]+/iu.test(b)?"standard":/(?:C\d{2,3}|HRB\d{3,4}|HPB\d{3}|DN\s*\d+|Φ\s*\d+|φ\s*\d+|\d+(?:\.\d+)?\s*(?:mm|cm|kV|MPa|kPa|kW|W|A|V))/u.test(b)?"spec":/\d+(?:\.\d+)?\s*(?:m2|m3|m²|m³|㎡|m|km|kg|t|吨|个|座|套|台|根|块|株|棵|处|项|日历天|天|层|樘|扇|片|组|件|孔|盏)/u.test(b)?"measure":"text":"text"}c.d(b,{Oq:()=>j,Su:()=>r,UD:()=>i,dm:()=>d,f2:()=>k,yJ:()=>e});let e="变更修改为|变更为|变更至|澄清为|澄清修改为|修改为|调整为|调整至|更正为|修正为|现为|现改为|更改为",f=/[。;;\n]/u,g=RegExp("\\d{4}\\s*年\\s*\\d{1,2}\\s*月\\s*\\d{1,2}\\s*日|\\d+(?:\\.\\d+)?\\s*(?:万元|亿元|日历天|个?月|天|m2|m3|m\xb2|m\xb3|㎡|mm|cm|km|m|kg|t|吨|个|座|套|台|根|块|樘|扇|片|组|件|孔|盏|项|处|层|kV|MPa|kPa|kW|W|A|V|%)|(?:GB|JGJ|CJJ|DB|CECS|ISO|IEC)\\s*/?\\s*T?\\s*[\\d.]+(?:-\\d{2,4})?","giu"),h=/(?:第\s*)?(\d{1,2}(?:\.\d{1,2}){1,3})\s*(?:条|项|款)?/u;function i(a){let b=RegExp(`(${e})\\s*[::]?\\s*(${g.source}|[\\u4e00-\\u9fa5]{2,12})`,"u"),c=RegExp(g.source,"gu"),i=RegExp(`([\\u4e00-\\u9fa5]{2,8})\\s*[::]\\s*(${g.source})`,"gu"),j=[],k=new Set,l=a=>{let b=`${a.superseded}\u0000${a.effective}`;a.superseded===a.effective||k.has(b)||(k.add(b),j.push(a))},m=/变更|澄清|补疑|补遗|调整为|修改为|更正/;for(let g of a){let a=String(g.text||"");if(a&&m.test(a))for(let j of a.split(f)){let a=j.replace(/\s+/gu,"");if(a.length<4)continue;let f=function(a){let b=[],c=h.exec(a)?.[1];c&&b.push(c);let d=a.match(/[一-龥]{2,8}(?=[::))]?(?:为|是|按|采用|统一|变更|澄清|调整))/gu);for(let c of(d&&b.push(...d.slice(0,3)),a.matchAll(/([一-龥]{2,12})\s*[::]\s*(?=\d)/gu)))b.push(c[1].replace(/^(?:原|现|本工程|本项目)/u,""));return/计划工期|合同工期|总工期/u.test(a)&&b.push("计划工期"),[...new Set(b)]}(a),k=b.exec(a);if(k){let b=k[2].trim();if(!/\d/u.test(b)||RegExp(e,"u").test(b))continue;let h=d(b);for(let e of[...a.slice(0,k.index).matchAll(c)].map(a=>a[0].trim()))e!==b&&d(e)===h&&l({superseded:e,effective:b,scope:f,evidence:[{source:g.source,snippet:a.slice(0,120)}],kind:"override"});continue}let m=[...a.matchAll(i)];if(m.length>=2){let b=new Map;for(let a of m){let c=b.get(a[1])||[];c.push(a[2].trim()),b.set(a[1],c)}for(let[c,d]of b){let b=[...new Set(d)];b.length<2||l({superseded:b[0],effective:b[b.length-1],scope:[...new Set([...f,c])],evidence:[{source:g.source,snippet:a.slice(0,120)}],kind:"override"})}}}}return j}function j(a){let b=new Map;for(let c of a){let a=`${c.superseded}\u0000${c.scope.join("|")}`,d=b.get(a);if(!d){b.set(a,c);continue}let e=(d.effective===c.superseded,{...c,superseded:d.superseded,evidence:[...d.evidence,...c.evidence],scope:[...new Set([...d.scope,...c.scope])]});b.set(a,e)}return[...b.values()]}function k(a,b){if(!b||0===b.length)return 0;let c=0;for(let d of a){let a=function(a,b){let c=String(a||""),d=[];for(let a of b)"override"===a.kind&&a.superseded&&c.includes(a.superseded)&&(c=c.replace(RegExp(a.superseded.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),"gu"),(b,e)=>{if(e>0&&/[\d.,]/u.test(c[e-1]))return b;let f=Math.max(c.lastIndexOf("。",e-1),c.lastIndexOf(";",e-1),c.lastIndexOf(";",e-1),c.lastIndexOf("\n",e-1))+1,g=c.slice(f,e);if(!function(a,b){if(!a.length)return!1;if(a.some(a=>/计划工期|合同工期|总工期|^工期$/u.test(a))){let a=[...b.matchAll(/(?:计划|合同|总)?工期|周期|期限|节点|阶段|地下|租赁|养护/gu)].at(-1)?.[0];return!!(a&&/^(?:计划|合同|总)?工期$/u.test(a))}return a.some(a=>{let c=a.replace(/^(?:原|现|本工程|本项目)/u,"");return c.length>=2&&b.includes(c)})}(a.scope,g))return b;let h=c.slice(Math.max(f,e-12),e+b.length+12);return/原(?:为|值|内容|计划|合同|招标)|此前|由[^,。;]{0,12}(?:变更|调整)|变更过程/u.test(h)?b:(d.push({from:b,to:a.effective}),a.effective)}));return{text:c,applied:d}}(String(d.content??""),b);0!==a.applied.length&&(d.content=a.text,c+=1)}return c}let l=[{attribute:"合同金额",re:/(?:最高投标限价|招标控制价|合同估算价(?:格)?|工程估算价|投标限价)(?<gap>[^。;\n]{0,16}?)(?:现)?(?:调整)?为?\s*[::]?\s*(?<num>[\d,]+(?:\.\d+)?)\s*(?<unit>亿元|万元|元)/u},{attribute:"计划工期",re:/(?:计划工期|合同工期|总工期)(?<gap>[^。;\n]{0,16}?)(?<num>[\d,]+(?:\.\d+)?)\s*个?\s*日历天/u},{attribute:"暂列金额",re:/(?:暂列金额|暂列金)(?<gap>[^。;\n\d]{0,12}?)(?<num>[\d,]+(?:\.\d+)?)\s*(?<unit>亿元|万元|元)/u},{attribute:"抗震设防烈度",re:/抗震设防烈度[::\s为是]*(?<num>[6-9]\s*度)(?!\s*(?:及|以上|以下|至))/u},{attribute:"地震加速度",re:/(?:设计基本)?地震加速度[::\s为是]*(?<num>\d(?:\.\d+)?\s*g(?![a-z]))/u},{attribute:"场地类别",re:/场地类别[^。;\n]{0,32}?(?<num>(?:[ⅠⅡⅢⅣ]+|[IV]{1,3})\s*类)/u},{attribute:"地基基础设计等级",re:/地基基础设计等级[::\s为是]*(?<num>[甲乙丙]\s*级)/u},{attribute:"抗震设防类别",re:/(?:建筑)?抗震设防类别[::\s为是]*(?<num>[甲乙丙丁]\s*类)(?!型)/u}],m=RegExp(`(?:${e})\\s*[::]?\\s*(\\d{1,4})\\s*个?\\s*日历天`,"u"),n=/(?:计划工期|合同工期|总工期|工期)/u,o=/(?:暂列|暂估|分部分项|单项工程|单位工程|措施项目|其他项目|规费|税金|人工费|材料费|机械费|管理费|利润|单价|合价)/u,p=/现澄清为|现变更为|澄清为如下|澄清修改为|变更修改为|现调整为|全部作废|以本次[^。;\n]{0,10}为准|以澄清[^。;\n]{0,6}为准/u,q=/^\s*(?:\d{1,2}\s*[、..]|问\s*[::])/u;function r(a){let b=[],c=/作废|以本次(?:招标)?答疑附件(?:中材料)?为准|以澄清(?:文件)?为准/u;for(let d of a){let a=String(d.text||"");if(!a)continue;let f=/(?<label>(?:计划|实际|拟定)?开工(?:日期|时间))(?<gap>[^。;;]{0,32}?)(?<num>20\d{2}\s*年\s*\d{1,2}\s*月\s*\d{1,2}\s*日)/gu;for(let c of a.matchAll(f)){let f=c.groups.gap,g=c.groups.num.replace(/\s+/gu,""),h=/^(\d{4})年(\d{1,2})月(\d{1,2})日$/u.exec(g),i=`${Number(h[1])}年${Number(h[2])}月${Number(h[3])}日`,j=new Date(Date.UTC(Number(h[1]),Number(h[2])-1,Number(h[3])));if(j.getUTCFullYear()!==Number(h[1])||j.getUTCMonth()!==Number(h[2])-1||j.getUTCDate()!==Number(h[3]))continue;let k=Math.max(a.lastIndexOf("。",c.index),a.lastIndexOf(";",c.index),a.lastIndexOf(";",c.index))+1,l=a.slice(c.index+c[0].length).search(/[。;;]/u),m=l<0?a.length:c.index+c[0].length+l+1,n=a.slice(k,m),o=a.slice(Math.max(k,c.index-32),c.index);if(/未(?:确定|明确)|不(?:是|采用|作为)|不得|取消|作废|开标|发布|支付|签订/u.test(f)||/(?:不采用|不是|不得采用|已取消)\s*$/u.test(o))continue;let q=c.groups.label,r=/[((]([^()()]*?开工(?:通知|令)[^()()]*?)[))]/u.exec(n)?.[1]??/((?:具体|实际)开工(?:日期|时间)[^。;;]{0,80}?以[^。;;]{0,80}?开工(?:通知|令)[^。;;]{0,20}?为准)/u.exec(n)?.[1],s=/([\d一二三四五六七八九十A-Za-z]+(?:号楼|#楼|标段|工区|栋))\s*$/u.exec(o)?.[1]??"项目主体",t=o.split(/[,,。;;]|\n\s*\n/u).at(-1),u=/(?:见|详见|参见)[^,,。;;]{0,24}$/u.test(t)?"reference":/原(?:招标文件|招标公告|合同|内容)?\s*$/u.test(t)?"superseded":"current",v=a.slice(k,c.index+c[0].length-c.groups.num.length);b.push({attribute:"开工日期",value:i,source:d.source,supersedesPriorMaterials:!1,clarified:"current"===u&&(RegExp(e,"u").test(f)||p.test(v)),openingDate:{kind:/实际/u.test(q)?"actual":/计划|拟定/u.test(q)||r?"planned":"unspecified",role:u,objectName:s,...r?{condition:r}:{},quote:n,sourceStartChar:k,sourceEndChar:m,dateStartChar:c.index+c[0].length-c.groups.num.length,dateEndChar:c.index+c[0].length}})}let g=!1;for(let f of a.split(/\n\s*\n/u))for(let a of(q.test(f)&&/[??]/u.test(f)&&(g=!1),p.test(f)&&(g=!0),f.split(/[。;;\n]/u))){let f;if(a.length<6)continue;let h=c.test(a),i=g||p.test(a),j=n.test(a)?m.exec(a)?.[1]:void 0;j&&b.push({attribute:"计划工期",value:`${j}日历天`,source:d.source,supersedesPriorMaterials:h,clarified:i});let k=a.search(/(?:暂列金额|暂列金)/u),q=k>=0?RegExp(`(?:${e})\\s*[::]?\\s*(\\d+(?:\\.\\d+)?)\\s*(亿元|万元|元)`,"gu"):void 0;if(q){for(let b of a.matchAll(q))if((b.index??0)>k){f=b;break}}for(let c of(f&&b.push({attribute:"暂列金额",value:`${f[1]}${f[2]||""}`,source:d.source,supersedesPriorMaterials:h,clarified:i}),l)){if("计划工期"===c.attribute&&j||"暂列金额"===c.attribute&&f)continue;let e=c.re.exec(a);if(!e?.groups)continue;let g=e.groups.num?.replace(/,/gu,"")||"";if(!g||o.test(e.groups.gap||""))continue;let k="合同金额"===c.attribute||"暂列金额"===c.attribute?`${g}${e.groups.unit||""}`:"计划工期"===c.attribute?`${g}日历天`:g.trim();b.push({attribute:c.attribute,value:k,source:d.source,supersedesPriorMaterials:h,clarified:i})}}}return b}}};