@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
@@ -8,9 +8,9 @@
8
8
  ${o}
9
9
 
10
10
  资料:
11
- ${d}`,{signal:e,temperature:0,diagnostics:f,callKind:"fact-extraction",contextLayers:{l0:q.length,l3:(0,n.CX)([d])}})}finally{k&&clearInterval(k)}for(let a of c?.facts??[])a&&"string"==typeof a.key&&r.push(a);g?.({...h,factsSoFar:r.length,phase:"done",elapsedMs:Date.now()-i})}if((0,p.Te)(e),!r?.length)return{facts:[],stages:h};let z=[],A=0,B=0;for(let a of r){if(!a.key||!a.value)continue;let b=u.get(String(a.evidenceId||"").trim().toUpperCase());if(!b){A+=1;continue}let c=k.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key),d=(0,p.lG)(a.value),e=(0,m.K3)(d),f="string"==typeof a.sourceSpan&&a.sourceSpan.trim()?a.sourceSpan.trim():b.content.split(/[。;;\n]/u).find(a=>(0,m.K3)(a).includes(e));if(!e||!f||!(0,m.K3)(b.content).includes((0,m.K3)(f))||!(0,m.K3)(f).includes(e)||k.length>0&&!c||a.objectName&&!f.includes(a.objectName)){B+=1;continue}if(c?.id==="excavation_depth"||/^(?:基坑)?(?:开挖)?深度$/u.test(c?.name??a.key)){let a=(0,t.B)(f,/基坑开挖深度|基坑深度|开挖深度/u);if(a?(0,m.K3)(a)!==e:void 0===(0,t._)(f,/基坑开挖深度|基坑深度|开挖深度/u)){B+=1;continue}}z.push({key:c?.name||a.key,fieldId:c?.id||a.fieldId,fieldName:c?.name||a.fieldName,value:d,objectName:a.objectName,...a.controlContext&&["exact","upper-bound","lower-bound","range"].includes(a.controlContext.relation)&&"string"==typeof a.controlContext.condition&&a.controlContext.objectName===a.objectName&&a.controlContext.attribute&&f.includes(a.controlContext.attribute)&&(!a.controlContext.condition||f.includes(a.controlContext.condition))&&(!a.controlContext.baseline||f.includes(a.controlContext.baseline))&&(0,m.K3)(a.controlContext.quote)===(0,m.K3)(f)?{controlContext:a.controlContext}:{},sourceFile:b.filePath,roleId:b.roleId||"llm",processingType:b.processingType,confidence:"number"==typeof a.confidence&&Number.isFinite(a.confidence)?Math.max(0,Math.min(1,a.confidence)):.8,sourceRef:{filePath:b.filePath,roleId:b.roleId||"llm",processingType:b.processingType,sectionTitle:b.sectionTitle,chunkIndex:b.chunkIndex,sourceSpan:f}})}return{facts:z,stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${z.length} 条事实${A>0?`(丢弃 ${A} 条无效来源编号)`:""}${B>0?`(拒收 ${B} 条无原文支持或对象错配事实)`:""}`}]}}let B=["投标保证金的金额、收款账户名称、开户行与账号","电子投标文件加密方式与解密方式","开标时间、开标地点与开标程序","评标委员会组成与评标办法","招标人联系人、联系电话、邮箱与地址","投标文件递交方式与递交截止时间","空白表格填写说明与上传下载指引","公共资源交易平台监督管理部门"],C=/签章|盖章|联系人|联系电话|电话|邮箱|解密方式|开标时间|开标地点|评标办法|评标委员会|投标保证金|保证金账户|电子交易系统|空白|填写|上传|下载|递交方式|递交截止|公共资源交易监督管理|监管部门|开评标程序|采购范围|是否|符合/u;async function D(a,b,c=i.p4,d){let e=(b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.fieldName||a.key))]).filter(a=>(function(a,b){let c=(0,i.oC)(b,a);return c?"single"===c.cardinality&&"ignore"!==c.conflictPolicy&&"allow_multiple"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期|劳动力高峰|装配率|支护形式|创优奖惩|抗震设防烈度|地震加速度|场地类别|地基基础设计等级|抗震设防类别/u.test(a)})(a,c)),f=[...new Set(a.map(a=>(0,p.lG)(a.value).trim()).filter(a=>C.test(a)))],g=await (0,q.Mv)(f,B,d),h=a=>B.some(b=>g(a,b)>=.6),k=[];for(let b of e){let d=a.filter(a=>a.key===b||a.fieldName===b||(0,i.oC)(c,a.fieldName||a.key)?.name===b),e=new Map;for(let a of d){if(!(0,j.cT)(b,a))continue;let d=function(a,b,c){let d=G((0,p.lG)(a).trim());if((0,r.j4)(d))return;let e=(0,j.De)((0,j.pN)(d));if(!e||(0,r.j4)(e)||(0,i.d2)(b,e)||(0,i.rF)(b,e)||(0,j.wI)(e)||/\|/u.test(e)||/^#+\s*/u.test(e)||/见(?:招标公告|投标人须知|前附表|本项目|补疑)|资料参数行摘要/u.test(e)||j.mf.test(e.replace(/\s+/gu,""))&&/投标|开标|递交|评标|公示|中标|截标/u.test(e))return;let f=e.match(/\d+\s*日历天/u)?.[0]?.replace(/\s+/gu,"");if(f&&/工期|日历天|开工日期|竣工/u.test(e))return{value:f,domain:(0,j.IL)(f)};let g=(0,m.K3)((0,p.lG)(e));if(g&&!(g.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(e)&&!(C.test(e)&&c?.(e)))return{value:g,domain:(0,j.IL)(g)}}(a.value,c,h);if(!d)continue;let f=e.get(d.value);e.set(d.value,{items:[...f?.items||[],a],domain:d.domain})}if(!(e.size<=1))for(let a of 1===new Set([...e.values()].map(a=>a.domain)).size?[[...e]]:j.XT.map(a=>[...e].filter(([,b])=>b.domain===a))){let c=new Map(a);if(c.size<=1)continue;let d=[...c.values()].slice(0,4).map(a=>`${(0,p.lG)(a.items[0].value).slice(0,120)}(${[...new Set(a.items.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");k.push(`事实冲突:${b} 存在多个来源值:${d}`)}}return k}function E(a){return(0,p.lG)(a).replace(/\s*[##]{1,6}\s*/gu,"")}function F(a){return(0,p.lG)(a).replace(/[\u00A0\u2002-\u200B\u3000]/gu," ").replace(/([\p{Script=Han}])\s+([\p{Script=Han}])/gu,"$1$2").replace(/(\d)\s+(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/(合同|投资|工程|项目)\s*估\s*算\s*(?:价格|价)/gu,"$1估算价").replace(/计划\s*工\s*期/gu,"计划工期").replace(/合同\s*工\s*期/gu,"合同工期").replace(/质量\s*标\s*准/gu,"质量标准").replace(/建设\s*地\s*点/gu,"建设地点").replace(/建设\s*规\s*模/gu,"建设规模").replace(/招标\s*范\s*围/gu,"招标范围").replace(/最高\s*投\s*标\s*限\s*价/gu,"最高投标限价").replace(/招标\s*控\s*制\s*价/gu,"招标控制价").replace(/[::]\s*/gu,":").replace(/\s+/gu," ").trim()}function G(a){return a.replace(/[((【[]?\s*(?:\d{1,2}(?:[..]\d{1,2}){0,3}\s*)?(?:招标项目编号|招标编号|项目编号|工程编号|标段编号|采购编号|项目代码)\s*[::为是]?\s*[A-Za-z0-9][A-Za-z0-9\-_.()()]{3,79}\s*[))】\]]?\s*$/u,"").trim()}let H=[{fieldId:"project_name",key:"项目名称",fieldName:"项目名称",pattern:/(?:项目名称|工程名称|招标项目名称)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_code",key:"项目编号",fieldName:"项目编号",pattern:/(?:项目编号|招标项目编号|工程编号)[::\s为是]+([A-Za-z0-9\-_.()()]{4,80})/u},{fieldId:"owner",key:"招标人",fieldName:"招标人",pattern:/(?:招标人|建设单位|发包人)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_location",key:"建设地点",fieldName:"建设地点",pattern:/建设地点[::\s为是]+([^\n。;;]{2,100})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/建设规模[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/(?:拟|计划|规划|目标|力争|预计|期望|远期|未来|设想|建议|预期|争取)[^,,。;;\n]{0,12}?(?<![地上地下])总?建筑面积(?:约|约为|约计|共计|为)?\s*[\d,,.]+\s*(?:㎡|m²|m2|平方米)|((?<![地上地下])总?建筑面积(?:约|约为|约计|共计|为)?\s*[\d,,.]+\s*(?:㎡|m²|m2|平方米))/u},{fieldId:"project_scope",key:"招标范围",fieldName:"招标范围",pattern:/招标范围[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"schedule_requirement",key:"计划工期",fieldName:"周期要求",pattern:/(?:(?:计划工期|合同工期|总工期)[::\s为是约]*|工期[::\s为是约]+)([^\n。;;]{0,40}?\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)(?:[^\n。;;]{0,30})?)/u},{fieldId:"quality_standard",key:"质量标准",fieldName:"质量标准",pattern:/质量标准[::\s为是]+([^\n。;;]{1,60})/u},{fieldId:"project_investment_estimate",key:"合同估算价格",fieldName:"项目投资估算",pattern:/(?:合同估算价格|合同估算价|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价)[::\s为是约]+([^\n。;;]{0,80}?\d+(?:\.\d+)?\s*(?:万元|元))/u},{fieldId:"labor_peak",key:"劳动力高峰人数",fieldName:"劳动力高峰人数",pattern:/(?:劳动力|用工|作业人员|施工人员)[^。;;\n]{0,40}?(?:高峰|峰值)[^。;;\n]{0,20}?(\d+(?:\.\d+)?\s*人)/u},{fieldId:"labor_peak",key:"劳动力高峰人数",fieldName:"劳动力高峰人数",pattern:/(?:高峰(?:期)?(?:劳动力|用工|人数|作业人员)|高峰期人数)[^。;;\n]{0,20}?(\d+(?:\.\d+)?\s*人)/u},{fieldId:"assembly_rate",key:"装配率",fieldName:"装配率",pattern:/(?:装配率|装配式建筑占比|装配式比例|装配式建筑面积占比)[^。;;\n]{0,16}?(\d+(?:\.\d+)?\s*%)/u},{fieldId:"foundation_support_form",key:"基坑支护形式",fieldName:"基坑支护形式",pattern:/(?:基坑支护(?:形式|方式|方案)?|支护(?:形式|方式))[^。;;\n]{0,10}?(?:采用|为|:|:|\s)([^。;;\n]{2,60})/u},{fieldId:"award_clause",key:"创优奖惩条款",fieldName:"创优奖惩条款",pattern:/(?:创优(?:目标|奖惩)?|优质优价)[^。;;\n]{0,60}?(\d+(?:\.\d+)?\s*万元)/u},{fieldId:"award_clause",key:"创优奖惩条款",fieldName:"创优奖惩条款",pattern:/(?:确保|争创|力争|争获)?[\u4e00-\u9fa5]{2,6}[杯奖][^。;;\n]{0,60}?(\d+(?:\.\d+)?\s*万元)/u},{fieldId:"seismic_fortification",key:"抗震设防烈度",fieldName:"抗震设防烈度",pattern:/抗震设防烈度[::\s为是]*([6-9]\s*度)(?!\s*(?:及|以上|以下|至))/u},{fieldId:"seismic_acceleration",key:"地震加速度",fieldName:"地震加速度",pattern:/(?:设计基本)?地震加速度[::\s为是]*(\d(?:\.\d+)?\s*g(?![a-z]))/u},{fieldId:"seismic_site_category",key:"场地类别",fieldName:"场地类别",pattern:/场地类别[^。;\n]{0,32}?((?:[ⅠⅡⅢⅣ]+|[IV]{1,3})\s*类)/u},{fieldId:"foundation_design_grade",key:"地基基础设计等级",fieldName:"地基基础设计等级",pattern:/地基基础设计等级[::\s为是]*([甲乙丙]\s*级)/u},{fieldId:"seismic_protection_category",key:"建筑抗震设防类别",fieldName:"建筑抗震设防类别",pattern:/(?:建筑)?抗震设防类别[::\s为是]*([甲乙丙丁]\s*类)(?!型)/u}];function I(a){return a.split(/(?:\d+(?:\.\d+)+)?(?:招标项目名称|工程名称|项目名称|招标项目编号|项目编号|标段划分|招标项目标段编号|建设地点|建设规模|合同估算价(?:格)?|计划工期|招标范围|项目类别|质量标准|其他)\s*[::]/u)[0].trim()}function J(a,b){let c=F((0,p.lG)(b));return!(!a||!c||c.length>260||/###|第\s*\d+\s*页|共\s*\d+\s*页|律师代理费|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应/u.test(c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c)||/条款号|条款名称|编列内容|澄清为如下|现澄清|答疑文件|补遗书|投标人须知前附表/u.test(c))&&("schedule_requirement"===a?c.length<=90&&/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(c)&&!/^(?:计划)?开工日期\s*[::]/u.test(c)&&!/(?<=[日天])\s*[0-9]+(?:\.[0-9]+)?(?=[\s]*(?:招标|建设|质量|合同|项目|工程|资金|投标|开标|评标|付款|工期|开工|计划|计价|现场|资质|标段|[,,。;;]|$))/u.test(c):"quality_standard"===a?c.length<=40&&/合格|优良|一次性验收|国家.*验收|达到/u.test(c)&&!/工期|投标|技术标准|\d[..、]/u.test(c):"project_name"===a?c.length<=120&&/项目|工程|学院|宿舍|楼|校区|施工总承包/u.test(c)&&!/序号|参数|配线架|交换机|跳线|额定|接口|UPS|项目特征|工程量|计量单位|R\d+C\d+|COL\d+|计算基础|计算基数|费率|计价表|分部分项|增值税|工程名称.*工程名称|项目名称.*项目名称|±\d/u.test(c):"owner"===a?c.length>=4&&c.length<=80&&/公司|大学|局|委员会|中心|处|院|所|校|集团|有限|股份|责任|管理|政府|管委会|办事处|指挥部/u.test(c)&&!/将报|监督管理部门|投标人|中标|负责解释|见招标|详见|空白|填写/u.test(c):"project_location"===a?c.length<=120&&!/见招标公告|详见|投标/u.test(c):"project_scope"===a?c.length<=220&&/施工|工程|道路|建筑|安装|拆除|设计|改造|装修|绿化|图纸|土石方|清单|总承包/u.test(c)&&!/^[((]\s*\d+[))]/u.test(c)&&!/具备.{0,24}(?:证书|考核合格|安全生产考核)/u.test(c)&&!/^(?:见|详见)(?:本项目)?(?:招标|投标人|前附)/u.test(c):"project_code"===a?/^[A-Za-z0-9\-_.()()]+$/u.test(c)&&c.length<=80&&!/\.\d+$/u.test(c):"project_scale"===a?c.length<=100&&/(?:m²|㎡|平方米|m2|km|米|公里|亩|公顷|栋|幢|座|处|户|层|个)/u.test(c)&&!/招标范围/u.test(c):"project_investment_estimate"===a?c.length<=100&&/\d+(?:\.\d+)?\s*(?:万元|元)/u.test(c):"labor_peak"===a?c.length<=40&&/\d+(?:\.\d+)?\s*人/u.test(c):"assembly_rate"===a?c.length<=20&&/\d+(?:\.\d+)?\s*%/u.test(c):"foundation_support_form"===a?c.length<=60&&/放坡|锚|桩|喷|开挖|护坡|土钉|地下连续墙|支撑/u.test(c)&&!/子项名称_\d|R\d+C\d+/iu.test(c):"award_clause"===a?c.length<=120&&/\d+(?:\.\d+)?\s*万元/u.test(c)&&!/评标|保证金/u.test(c):c.length<=220)}function K(a){let b=[],c=new Set;for(let d of a){let a=E((0,p.lG)(d.content)),e=new Set;for(let[f,g,h]of[["project_name","(?:招标项目名称|项目名称|工程名称)","项目名称"],["project_scope","(?:招标范围|施工范围)","招标范围"]])for(let i of a.matchAll(RegExp(`${g}[::]\\s*([^。;;]+)`,"gu"))){let a=I(i[1]),g=F(a).replace(/\s+/gu,"");if(!J(f,g))continue;let j=`${d.filePath}:${f}:${g}`;e.add(f),c.has(j)||(c.add(j),b.push({key:h,fieldName:h,fieldId:f,value:g,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:i[0].slice(0,i[0].length-i[1].length)+a}}))}let f=!1;for(let e of a.matchAll(/建设规模[::\s]+([\s\S]{1,1200}?)(?=\r?\n\s*(?:#{1,6}\s*)?\d+(?:\.\d+)+[^\n::]{0,15}[::]|$)/gu)){let a=e[1].replace(/\s/gu,"");if(!/本项目|本工程/u.test(a))continue;let g=/(?:用地内)?总建筑面积(?:[((][^))]{1,20}[))])?(?:共计|约为|约|为)?([\d,,]+(?:\.\d+)?)\s*(平方米|㎡|m²|m2)/iu.exec(a);if(!g||/拆除/u.test(a.slice(Math.max(0,g.index-30),g.index+g[0].length+20)))continue;let h=`${g[1]}${g[2]}`,i=`${d.filePath}:project_scale:项目主体:${h}`;if(c.has(i)){f=!0;continue}c.add(i),f=!0,b.push({key:"建设规模",fieldName:"建设规模",fieldId:"project_scale",objectName:"项目主体",value:h,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:e[0]}})}for(let g of a.replace(/(\d)\s*\r?\n\s*(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/([\d,,.]+(?:平方|立方|㎡|m²|m2|m)?)\s*\r?\n\s*(米|m|㎡|m2|m²)/gu,"$1$2").split(/\r?\n/u).flatMap(a=>{let b=F(a);return b.length>260?b.split(/(?=\d+(?:\.\d+)?\s*[^\s::]{2,12}[::])/u):[b]}).filter(Boolean))if(!/报价明细|综合单价|税率|增值税|利润|结算/u.test(g)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g))for(let a of H){if(e.has(a.fieldId))continue;let h=a.pattern.exec(g),i=h?.[1]?.trim();if("project_scale"===a.fieldId&&/拆除/u.test(`${d.sectionTitle??""} ${g}`)&&i){let a=/现场有(.{1,40}?)需要拆除/u.exec(d.sectionTitle??"")?.[1],e=`${d.filePath}:demolition_area:${i}`;c.has(e)||(c.add(e),b.push({key:"拆除建筑面积",fieldName:"拆除建筑面积",fieldId:"demolition_area",value:i,...a?{objectName:a}:{},sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:a?.9:.6,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:g}}));continue}if("project_scale"===a.fieldId&&f||("owner"===a.fieldId&&i&&(i=i.split(/\s+[WH]\s*[=::]|(?:\d+(?:\.\d+)+)?(?:项目业主|资金来源|项目出资比例|资金落实情况|联系人|建设地点|设计单位)\s*[::]/u)[0].replace(/\d+(?:\.\d+)+$/u,"").trim()),!i||!J(a.fieldId,i)))continue;let j=`${d.filePath}:${a.fieldId}:${i}`;c.has(j)||(c.add(j),b.push({key:a.key,fieldName:a.fieldName,fieldId:a.fieldId,value:i,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:g}}))}}return b}let L=/\||第\s*\d+\s*页|共\s*\d+\s*页|[##]{1,6}| 资料参数行摘要|(?<=[日天])\s*[0-9]+(?:\.[0-9]+)?(?=[\s]*(?:招标|建设|质量|合同|项目|工程|资金|投标|开标|评标|付款|工期|开工|计划|计价|现场|资质|标段|[0-9]{1,3}[.、.]|[,,。;;]|$))/u,M=/规模|范围|工期|周期|project_scope|project_scale/iu,N=/^[A-Za-z0-9\-_.()()]+$/u,O=/(?:招标项目编号|项目编号|工程编号|标段编号|合同编号|编号)[::为是]*([A-Za-z0-9][A-Za-z0-9\-_.()()]{3,79})/gu;function P(a){return"project_code"===a.fieldId||/编号|代码/u.test(`${a.fieldName||""}${a.key||""}`)}function Q(a,b,c){let d,e=[];for(let f of a){let a=(0,p.lG)(f.value).trim();if(!a)continue;let g=L.exec(a),h=a;g&&(h=a.slice(0,g.index).replace(/[\s::,,、;;\-—|]+$/u,"").trim()),P(f)||(h=G(h));let i=h!==a;if(h.length<2){c.dropped+=1;continue}let j=P(f);if(j&&!N.test(h)||h.length>120&&!M.test(`${f.fieldId||""} ${f.fieldName||""} ${f.key||""}`)){c.dropped+=1;continue}let k=!1;if(j&&h.length>=4){let a=[...(d||=function(a){let b=new Map;for(let c of a)for(let a of E((0,p.lG)(c.content)).replace(/\s+/gu,"").matchAll(O)){let c=a[1];c&&b.set(c,(b.get(c)||0)+1)}return b}(b)).entries()].filter(([a])=>a.length>=h.length+2&&a.startsWith(h)),c=a.sort((a,b)=>b[1]-a[1]||a[0].length-b[0].length)[0]?.[0];c&&(h=c,k=!0)}i&&(c.truncated+=1),k&&(c.repaired+=1),e.push(h===a?f:{...f,value:h})}return e}function R(a){let b={localFacts:function(a,b,c){let d=(0,l.Uy)(b,c),e=d.map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=/规模|scale|工期|周期/iu.test(a)?"[^。]{2,220}":/范围|project_scope|项目名称|工程名称|project_name/iu.test(a)?"[^。;;]+":"[^\n,。;;]+";return RegExp(`${b}[::\\s]+(${c})`,"u")}(a.name)})),f=d.map(a=>a.name).filter(Boolean),g=[];for(let b of a)for(let{field:a,pattern:c}of e){if(!(0,l.I2)(b,a))continue;let d=b.content.match(c),e=d?.[1]?.trim();if(!e)continue;e=E(e).replace(/\s+/gu,""),/范围|project_scope|项目名称|工程名称|project_name/iu.test(a.name)&&(e=I(e)),e=e.replace(/(?<=[日天])[0-9]+(?:\.[0-9]+)?(?=(?:招标范围|质量标准|建设规模|计划工期|合同估算|项目名称|项目编号|建设地点|招标人|资金来源|投标人资格|资质要求|开标|评标|付款|计价|现场条件|开工日期|合同工期|工期要求|[0-9]{1,3}[.、.]|[,,。;;]|$))/u,"");let h=f.filter(b=>b!==a.name).map(a=>e.indexOf(a)).filter(a=>a>0);h.length>0&&(e=e.slice(0,Math.min(...h)));let j=(0,u.nD)({key:a.name,fieldId:a.id,fieldName:a.name});(!j||J(j.key,e))&&(!e||!(e.length<=220)||(0,i.rF)(i.p4,e)||(0,i.d2)(i.p4,e)||g.some(b=>b.fieldId===a.id&&b.value===e)||g.push({key:a.name,fieldId:a.id,fieldName:a.name,value:e,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:.8,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle,chunkIndex:b.chunkIndex,sourceSpan:d[0]}}))}return g}(a.evidence,a.template,a.spec),projectBasicFacts:K(a.evidence),structuredTables:function(a,b={}){let c=[],d=[],i=new Set;for(let j of a.filter(a=>"table"===a.processingType||"structured_data"===a.processingType||"bill_of_quantities"===a.processingType)){if(i.has(j.filePath))continue;let a=f.extname(j.filePath).toLowerCase();if(!b.parsedOnly&&[".xlsx",".xls",".csv"].includes(a)){let a=(0,h.aY)(),b=(0,h.NW)(a),l=f.isAbsolute(j.filePath)?j.filePath:e.existsSync(f.join(b,j.filePath))?f.join(b,j.filePath):f.join(a,j.filePath);if(e.existsSync(l))try{d.push(...function(a,b){let c=e.statSync(a),d=`${a}:${b.roleId||"table"}`,f=v.get(d);if(f&&f.mtimeMs===c.mtimeMs&&f.size===c.size)return f.tables;let h=function(a,b){let c=g.readFile(a,{cellDates:!0,sheetStubs:!1}),d=[];for(let a of c.SheetNames){let e=c.Sheets[a],f=g.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let h=(0,k.detectSmartTableHeader)(f),i=h.headers,j=f.slice(h.headerIndex+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&d.push({tableType:b.roleId||"table",sheet:a,headers:i,rows:j,sourceFile:b.filePath,sourceRange:e["!ref"]})}return d}(a,b);return v.size>500&&v.clear(),v.set(d,{mtimeMs:c.mtimeMs,size:c.size,tables:h}),h}(l,j)),i.add(j.filePath);continue}catch(a){c.push(`${j.filePath}:${a instanceof Error?a.message:String(a)}`)}}let l=j.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(l.length<2)continue;let m=l[0].includes("|")?"|":l[0].includes(" ")?" ":",",n=l.map(a=>{let b="|"===m?a.replace(/^\|/u,"").replace(/\|$/u,""):a;if(","!==m)return b.split(m).map(a=>a.trim());let c=[],d="",e=!1;for(let a=0;a<b.length;a+=1){let f=b[a];'"'===f?e&&'"'===b[a+1]?(d+='"',a+=1):e=!e:","!==f||e?d+=f:(c.push(d.trim()),d="")}return c.push(d.trim()),c}).filter(a=>a.length>1&&a.some(Boolean)&&!a.every(a=>/^:?-{3,}:?$/u.test(a)));if(n.length<2)continue;let o=n[0],p=d.find(a=>a.sourceFile===j.filePath&&a.sourceRange===j.sectionTitle&&JSON.stringify(a.headers)===JSON.stringify(o)),q=n.slice(1).filter(a=>JSON.stringify(a)!==JSON.stringify(o));p?p.rows.push(...q):d.push({tableType:j.roleId||"table",headers:o,rows:q,sourceFile:j.filePath,sheet:j.sectionTitle,sourceRange:j.sectionTitle})}return c.length>0&&console.warn(`[facts] 工作簿解析失败 ${c.length} 份,已回退文本猜表(保真度下降):${c.slice(0,5).join(";")}`),d}(a.evidence,{parsedOnly:a.parsedOnly})},c={truncated:0,dropped:0,repaired:0};if(b.localFacts=Q(b.localFacts,a.evidence,c),b.projectBasicFacts=Q(b.projectBasicFacts,a.evidence,c),a.diagnostics&&(c.truncated>0||c.dropped>0||c.repaired>0)){let b=a.diagnostics.factSanitize||={truncated:0,dropped:0,repaired:0};b.truncated+=c.truncated,b.dropped+=c.dropped,b.repaired+=c.repaired}return{...b,factSanitize:c}}function S(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}function T(a){return`${a.key} ${a.fieldName||""} ${a.value} ${a.roleId} ${a.processingType||""} ${a.sourceFile}`}function U(a){return/合同估算价|合同估算价格|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价/u.test(a)}function V(a){let b=T(a);return!U(b)&&/投标保证金|发票类型|开标时间|公共资源交易监督管理|不良行为记录|投诉举报|资质投诉|投标承诺|违约金|中标服务费|交易平台|保证金账户|投标有效期|报价明细|投标报价|单价|合价|税率|增值税|利润|结算/u.test(b)}function W(a,b,c,d){let e=a.filter(a=>(0,i.d2)(d,T(a))||(0,i.E1)(d,T(a))),f=a.filter(a=>{let b=T(a);return a.confidence>=.58&&!V(a)&&!(0,i.rF)(d,b)&&!(0,i.d2)(d,b)&&!(0,i.E1)(d,b)}),g=[...b.filter(a=>!V(a)),...f.filter(a=>o.test(T(a)))].filter((a,b,c)=>c.findIndex(b=>b.sourceFile===a.sourceFile&&b.value===a.value&&b.key===a.key)===b).slice(0,360),h=f.filter(a=>"table"===a.processingType||/table|sheet|表格|清单|明细|数据|参数行摘要/u.test(T(a))),j=f.filter(a=>"drawing"===a.processingType||/drawing|dwg|图纸|施工图|设计图|平面图|剖面图|大样图|详图/u.test(T(a)));return{reliableFacts:f.slice(0,500),parameterFacts:g,tableFacts:h.slice(0,240),drawingFacts:j.slice(0,240),billFacts:c.slice(0,240),diagnostics:e.slice(0,120)}}function X(a,b){return a.filter(a=>{let c=`${a.key} ${a.fieldName||""} ${a.value}`;return o.test(c)&&(!(0,i.rF)(b,c)||U(c))&&!(0,i.d2)(b,c)})}function Y(a){return a.filter(a=>"table"===a.processingType||"structured_data"===a.processingType||"bill_of_quantities"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/u.test(`${a.roleId} ${a.sourceFile}`))}let Z=/[\u3400-\u4DBF\u{20000}-\u{3FFFF}]/gu,$=/(?:R\d+C\d+|COL\d+|第\d+行第\d+列)/giu;function _(a,b){for(let c of a.matchAll(/([\u4e00-\u9fa5]{2,8}?(?:镇|乡|县|市|区|街道|村))[^。;;\n]{0,24}?(?:项目|工程)/gu))if(c[1]!==b)return!0;return!1}function aa(a){let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`,c=F((0,p.lG)(a.value)).trim();if(!c)return a;if(/项目名称|工程名称|project_name/u.test(b)){if(C.test(c))return a;let b=c.replace(/^(?:项目|工程)名称[::]\s*/u,"").trim();if(!(/项目|工程/u.test(b)&&!/(?:[||]|序号|合计|金额|第\d*页|共\d*页)/u.test(b)&&b.length>=3&&b.length<=80))return{...a,value:""}}if(/招标人|建设单位|发包人|tenderee/u.test(b)){if($.test(c))return a;let b=c.replace(/^招标人[::]\s*/u,"").trim();if(!(/(?:政府|公司|局|委员会|集团|学院|大学|中心|研究院|设计院|事务所|管理处|指挥部|医院|学校|村委会|居委会)(?:[((][^))]*[))])?$/u.test(b)&&b.length<=60))return{...a,value:""}}return a}function ab(a){let b=a.filter(a=>!function(a){let b=(0,p.lG)(a.value);if(!b)return!1;let c=[...b.matchAll(Z)].length;if(c>0){let a=[...b.matchAll(/[\u3400-\u4DBF\u4E00-\u9FFF\u{20000}-\u{3FFFF}]/gu)].length;if(b.length<=40||a>0&&c/a>=.2)return!0}return!!$.test(b)&&!!(b.replace($,"").trim().length<=24)}(a)).map(aa).filter(a=>(0,p.lG)(a.value).trim().length>0).filter(a=>!(0,r.j4)((0,p.lG)(a.value),{allowProse:!0,includePoolNoise:!1})),c=b.find(a=>("项目名称"===a.key||"project_name"===a.fieldId)&&(0,p.lG)(a.value).trim().length>=6),d=c?F((0,p.lG)(c.value)).trim():"",e=d?function(a){let b=a.match(/([\u4e00-\u9fa5]{2,8}?(?:镇|乡|县|市|区|街道|村))/u);return b?.[1]}(d):void 0;return e?b.map(a=>{let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`,c=F((0,p.lG)(a.value)).trim();if(!c)return a;if(/招标范围|施工范围/u.test(b)){let b=c.split(/[。;;\n]/u).map(a=>a.trim()).filter(Boolean);if(b.length<=1)return _(c,e)?{...a,value:""}:a;let d=b.filter(a=>!_(a,e));return 0===d.length?{...a,value:""}:{...a,value:d.join(";")}}return/项目名称候选|项目名称|工程名称/u.test(b)&&_(c,e)?{...a,value:""}:a}).filter(a=>(0,p.lG)(a.value).trim().length>0):b}async function ac(a,b=[],c=[],d,e=i.p4){a=ab(a);let f=b=>a.filter(a=>b.some(b=>`${a.key} ${a.fieldName||""}`.includes(b))),g=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),h=X(a,e),j=Y(a),l=(function(a){let b=[],c=/工程名称|序号|项目编码|项目名称|项目特征|计量\s*单位|工程量|金额|综合单价|合价|人工费|机械费|暂估价|分部小计|本页|续表|合计|汇总/u;for(let d of a){let a=(0,k.locateTableColumns)(d.headers);if((a.name??-1)<0&&(a.feature??-1)<0)continue;let e=(a.seq??-1)>=0;for(let f of d.rows){let g=e?(f[a.seq??0]||"").trim():"",h=(a.name??-1)>=0?(f[a.name??0]||"").trim():"",i=(a.feature??-1)>=0?(f[a.feature??0]||"").trim():"",j=(a.unit??-1)>=0?(f[a.unit??0]||"").trim():"",k=(a.quantity??-1)>=0?(f[a.quantity??0]||"").trim():"";if(e&&!/^\d+$/.test(g)||!h||!i||c.test(`${h}${i}`))continue;let l=k&&j?`${k}${j}`:k||j;b.push({key:`清单条目:${h}`,fieldName:"清单条目",fieldId:"bill_item",objectName:/(?:部位|位置)[::]\s*([^\s,。;、||()()]{1,20})/u.exec(i)?.[1]?.trim()||h,value:`${i.slice(0,160)}${l?`|工程量:${l}`:""}`,sourceFile:d.sourceFile,roleId:"bill_of_quantities",processingType:"bill_of_quantities",confidence:.92,sourceRef:{filePath:d.sourceFile,roleId:"bill_of_quantities",processingType:"bill_of_quantities",sectionTitle:d.sheet}})}}return b})(b).slice(0,600),m=function(a){let b={},c=(a,c,d,e,f)=>{if(!a||!d)return;let g=d.replace(/[,,。\s]+$/u,"").slice(0,40),h=b[a]||=[];h.some(a=>a.location===c&&a.spec===g)||h.push({location:c,spec:g,quantity:e||void 0,sourceFile:f})};for(let b of a){let a=(b.key||"").replace(/^清单条目:/u,"");if(!a)continue;let d=(0,p.lG)(b.value),e=/|工程量:(.+)$/u.exec(d)?.[1]??"",f=d.replace(/|工程量:.+$/u,""),g=function(a){let b=[];for(let c of a.split(/[;;]/u)){let a=c.replace(/^\s*\d+[.、]\s*/u,"").trim(),d=a.search(/[::]/u);if(d>0){let c=a.slice(0,d).trim(),e=a.slice(d+1).trim();c.length>=2&&c.length<=20&&e&&b.push({label:c,value:e})}}return b}(f),h=!1;for(let{label:d,value:f}of g){if(w.some(a=>d.includes(a))){h=!0,c(d,a,f,e,b.sourceFile);continue}let g=f.match(x)?.[0];g&&g!==f&&c(y(g),a,g,e,b.sourceFile)}if(!h)for(let d of f.match(x)||[])c(y(d),a,d,e,b.sourceFile)}return b}(l),n=(function(a){let b=[];for(let c of a){let a=`${c.key||""}${c.fieldName||""}${c.fieldId||""}`,d=(0,p.lG)(c.value);if(/建设规模/u.test(a)&&/占地|用地/u.test(d)&&/建筑面积/u.test(d)){let a=d.search(/(?:总)?占地/u),e=d.search(/(?:单体)?总?建筑面积/u);if(a>=0&&e>a){let f=d.slice(a,e).replace(/^[,,、\s]+/u,"").replace(/[,,、\s]+$/u,"").trim(),g=d.slice(e).trim();if(f&&g){b.push({...c,key:"总占地面积",fieldName:"总占地面积",fieldId:void 0,value:f}),b.push({...c,key:"单体建筑面积",fieldName:"单体建筑面积",value:g});continue}}}b.push(c)}return b})(a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))).slice(0,80),o=W(a,h,j,e);return{project:n,schedule:f(["工期","开工","竣工","节点","周期"]),quality:f(["质量","验收"]),safety:f(["安全","风险"]),resources:f(["劳动力","材料","机械","设备","资源"]),tables:b,drawings:g("drawing"),bills:j,preciseFacts:h,rules:g("rule"),specifications:g("specification"),schemaFacts:S(a,d),factIndex:o,billItemFacts:l,specAuthorityMap:m,missing:[...new Set(c)],conflicts:await D(a,d,e)}}function ad(a){let b=ab(a.facts),c=a.profile||i.p4,d=a.preciseFacts??X(b,c),e=a.bills??Y(b);return{schemaFacts:S(b,{factFields:a.factFields}),factIndex:W(b,d,e,c)}}},6455:(a,b,c)=>{c.d(b,{AY:()=>C,DZ:()=>B,O5:()=>D,cs:()=>j});var d=c(77598),e=c(11685);let f="tender-clarification-source-group-v2",g="tender-source-group-accounting-v2",h=/^(?:问题|疑问|提问|咨询|质疑|问)[一二三四五六七八九十\d]{0,3}[::]|[??]\s*$/u,i=/(?:请问|请明确|请确认|请澄清)[::]\s*$/u,j=/^(?:回复|答复|答疑|答|澄清|释义)[::]/u,k=RegExp(`(?:^|\\n)${j.source.slice(1)}`,"u"),l=/^[((](\d{1,2}|[一二三四五六七八九十])[))]/u,m=/(?:请问|请明确|请确认|请澄清|(?:^|\n)(?:问题|疑问|提问|咨询|质疑|问)[一二三四五六七八九十\d]{0,3}[::])/u,n=/[??]\s*$/u,o=/[??。!!;;]\s*$/u,p=/^\s*(?:\d{1,3}[..、]|第[一二三四五六七八九十百\d]+[章节条])/u,q=/^[a-f0-9]{64}$/u,r=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),s=a=>(0,d.createHash)("sha256").update(a).digest("hex"),t=a=>r(a);function u(a,b){return r({version:f,groupFingerprint:a.fingerprint,sourceSpans:b})}function v(a){let b=a.versionContext;return a.file&&b?.document.sourceFile===a.file&&q.test(b.sourceIdentity.sourceSha256)&&q.test(b.sourceIdentity.parsedSha256)?b.sourceIdentity:void 0}function w(a,b){let c=v(a),d=v(b),e=a.sourceSpans?.at(-1),f=b.sourceSpans?.[0];return!!(c&&d&&a.file===b.file&&c.sourceSha256===d.sourceSha256&&c.parsedSha256===d.parsedSha256&&e&&f&&e.file===f.file&&void 0!==e.chunkIndex&&void 0!==f.chunkIndex&&f.chunkIndex>=e.chunkIndex&&f.chunkIndex<=e.chunkIndex+1&&(f.chunkIndex!==e.chunkIndex||f.start>=e.end))}function x(a,b){let c=v(a),d=v(b);return!!(c&&d&&a.file===b.file&&c.sourceSha256===d.sourceSha256&&c.parsedSha256===d.parsedSha256)}function y(a,b,c,d){if(!x(a,b)||void 0!==c.sourceGroup||c.file!==a.file||!Array.isArray(c.sourceSpans)||!c.sourceSpans.length||c.sourceSpansSha256!==(0,e.y)(c.sourceSpans))throw Error("问题续行缺少真实同源物理证明");d(c);let f=[...a.sourceSpans??[],...b.sourceSpans??[]],g=a.sourceSpans?.at(-1),h=b.sourceSpans?.[0];if(!g||!h||void 0===g.chunkIndex||void 0===h.chunkIndex||h.chunkIndex<g.chunkIndex||h.chunkIndex===g.chunkIndex&&h.start<g.end)throw Error("问题续行原成员范围逆序或缺失");let i=f.map(a=>c.sourceSpans.flatMap((b,c)=>!function(a,b){let c={...b};return void 0===a.sourceGapBefore&&delete c.sourceGapBefore,void 0===a.sourceNativeTextBridgeBefore&&delete c.sourceNativeTextBridgeBefore,JSON.stringify(c)===JSON.stringify(a)}(a,b)?[]:[c]));if(i.some(a=>1!==a.length)||i.some((a,b)=>b>0&&a[0]<=i[b-1][0])||i[0]?.[0]!==0||i.at(-1)?.[0]!==c.sourceSpans.length-1)throw Error("问题续行证明未完整保留两端原成员spans及原顺序");let j=i[a.sourceSpans.length-1][0],k=i[a.sourceSpans.length][0],l=new Set(i.map(a=>a[0]));if(c.sourceSpans.some((a,b)=>!l.has(b)&&(b<=j||b>=k)))throw Error("问题续行证明借用了原成员之外的正文");let m=c.sourceSpans.slice(j+1,k+1).flatMap(a=>a.sourceNativeTextBridgeBefore?[a.sourceNativeTextBridgeBefore]:[]);if(c.sourceSpans.some((a,b)=>!l.has(b))&&!m.length)throw Error("问题续行新增页布局spans缺少真实原生页面证明");if(m.some(b=>b.file!==a.file||b.sourceSha256!==v(a).sourceSha256)||a.section!==b.section&&!m.length)throw Error("问题续行跨页/栏目缺少本物理文件原生页面证明");if(g.chunkIndex!==h.chunkIndex&&!c.sourceSpans.slice(j+1,k+1).some(a=>a.sourceNativeTextBridgeBefore||a.sourceGapBefore))throw Error("问题续行跨chunk缺少原生页面或真实空白gap证明")}function z(a){let b=k.exec(a);return!!(b&&!a.slice(0,b.index).trim())}function A(a,b,c,d){let e={end:b+1,continuations:[]},f=a[b];if(!v(f)||!f.sourceSpans?.length||k.test(f.text))return e;let g=a[b-1];if(g&&x(g,f)&&m.test(g.text)&&!n.test(g.text)&&!k.test(g.text)&&!m.test(f.text)&&!p.test(f.text)&&!l.test(f.text.trim()))return e;let j=i.test(f.text);if(!j&&!h.test(f.text)&&!m.test(f.text))return e;if(!j){let g=a[b+1];if(h.test(f.text)&&o.test(f.text)&&g&&w(f,g)&&!g.clauseNo&&!g.sourceSpans?.[0]?.logicalBoundaryBefore&&z(g.text))return{end:b+2,continuations:[]};if(!d||n.test(f.text))return e;let i=[],j=b+1;for(;j<a.length;){let f=a[j-1],g=a[j];if(!x(f,g)||g.clauseNo||g.sourceSpans?.[0]?.logicalBoundaryBefore||l.test(g.text.trim())||p.test(g.text))break;let h=function(a){let b=k.exec(a),c=b?a.slice(0,b.index):a;if(!(!c.trim()||b&&!n.test(c)||c.split(/\r?\n/u).some(a=>l.test(a.trim())||p.test(a)||m.test(a))))return{complete:n.test(c),containsReply:!!b}}(g.text);if(!h)break;let o=d.proveContinuation(f,g);if(!o)break;if(y(f,g,o,c),i.push({fromOffset:j-1-b,toOffset:j-b,proofBinding:o}),h.containsReply)return{end:j+1,continuations:i};if(h.complete){let b=a[j+1];return b&&w(g,b)&&!b.clauseNo&&!b.sourceSpans?.[0]?.logicalBoundaryBefore&&z(b.text)?{end:j+2,continuations:i}:e}j+=1}return e}let q=b+1,r=1,s=b+1;for(;q<a.length;){let b=a[q];if(!w(a[q-1],b)||function(a){let b=l.exec(a.trim());if(b)return/^\d+$/u.test(b[1])?Number(b[1]):"一二三四五六七八九十".indexOf(b[1])+1}(b.text)!==r||!h.test(b.text))break;if(k.test(b.text)){q+=1,s=q,r+=1;continue}let c=a[q+1];if(!c||!w(b,c)||c.clauseNo||c.sourceSpans?.[0]?.logicalBoundaryBefore||!z(c.text))break;q+=2,s=q,r+=1}return{end:s,continuations:[]}}function B(a,b){let c=a.sourceGroup;if(!c||c.version!==f||"\n\n"!==c.separator||c.sourceFile!==a.file||!q.test(c.sourceIdentity?.sourceSha256??"")||!q.test(c.sourceIdentity?.parsedSha256??"")||!Array.isArray(c.members)||c.members.length<2||!Array.isArray(c.questionContinuations))throw Error("问答源组缺少当前同源完整成员及投影身份");let d=0,g=new Set;for(let[a,f]of c.members.entries()){if(!Number.isSafeInteger(f.sourceOrdinal)||f.sourceOrdinal<0||g.has(f.sourceOrdinal)||a>0&&f.sourceOrdinal!==c.members[a-1].sourceOrdinal+1||f.file!==c.sourceFile||"string"!=typeof f.text||!f.text.trim()||f.start!==d||f.end!==d+f.text.length||!f.sourceSpans?.length||f.sourceSpansSha256!==(0,e.y)(f.sourceSpans))throw Error("问答源组成员原序号/原文/UTF16投影/原spans身份不一致");b({text:f.text,file:f.file,sourceSpans:f.sourceSpans,sourceSpansSha256:f.sourceSpansSha256}),g.add(f.sourceOrdinal),d=f.end+2*(a<c.members.length-1)}let h=c.members.map(a=>({...a,versionContext:{sourceIdentity:c.sourceIdentity,document:{sourceFile:c.sourceFile,isClarification:!0}}})),i=new Map;for(let a of c.questionContinuations){let d=c.members.find(b=>b.sourceOrdinal===a.fromSourceOrdinal),e=c.members.find(b=>b.sourceOrdinal===a.toSourceOrdinal),f=JSON.stringify([a.fromSourceOrdinal,a.toSourceOrdinal]);if(!d||!e||e.sourceOrdinal!==d.sourceOrdinal+1||i.has(f))throw Error("问题续行证明关联了未知/重复原成员");y(h[c.members.indexOf(d)],h[c.members.indexOf(e)],a.proofBinding,b),i.set(f,a.proofBinding)}let j=A(h,0,b,{proveContinuation:(a,b)=>i.get(JSON.stringify([h.indexOf(a)+c.members[0].sourceOrdinal,h.indexOf(b)+c.members[0].sourceOrdinal]))});if(j.end!==h.length||j.continuations.length!==i.size)throw Error("问答源组成员不是完整结构问题与答复,不能关联未知邻项");let k=c.members.map(a=>a.text).join("\n\n"),l=c.members.flatMap(a=>a.sourceSpans),{fingerprint:m,...n}=c;if(k!==a.text||s(k)!==c.textSha256||r(c.members)!==c.membersSha256||t(n)!==m||JSON.stringify(a.sourceSpans)!==JSON.stringify(l)||a.sourceSpansSha256!==u(c,l))throw Error("问答源组原母投影/成员守恒或独立来源组指纹不一致")}function C(a){if(!a||a.version!==g||!Number.isSafeInteger(a.rawCount)||a.rawCount<0||!Number.isSafeInteger(a.groupCount)||a.groupCount<0||a.reduction!==a.rawCount-a.groupCount||!Array.isArray(a.groups)||a.groups.length!==a.groupCount)throw Error("原始源单元与判审源组账缺失或不闭合");let b=new Set,c=0;if(a.groups.forEach((d,e)=>{if(d.judgmentIndex!==e||!Array.isArray(d.rawOrdinals)||!d.rawOrdinals.length||d.rawOrdinals.length>1&&(!q.test(d.sourceGroupFingerprint??"")||!d.sourceFile?.trim()||!q.test(d.parentFingerprint??"")||!q.test(d.sourceSpansSha256??""))||1===d.rawOrdinals.length&&void 0!==d.sourceGroupFingerprint)throw Error("判审源组缺少其真实原单元组身份");d.rawOrdinals.forEach(d=>{if(!Number.isSafeInteger(d)||d!==c||d>=a.rawCount||b.has(d))throw Error("源组成员没有按完整原始inventory唯一连续覆盖");b.add(d),c+=1})}),b.size!==a.rawCount)throw Error("源组账未保全原始来源分母")}function D(a,b,c){a.forEach(b);let d=[],e=[];for(let g=0;g<a.length;){let h=A(a,g,b,c),i=h.end,j=a.slice(g,i),k=j[0];if(j.length>1){let a=0,c=j.map((b,c)=>{let d={sourceOrdinal:g+c,text:b.text,file:b.file,...void 0===b.section?{}:{section:b.section},...void 0===b.clauseNo?{}:{clauseNo:b.clauseNo},sourceSpans:b.sourceSpans,sourceSpansSha256:b.sourceSpansSha256,start:a,end:a+b.text.length};return a=d.end+2,d}),d=c.map(a=>a.text).join("\n\n"),e={version:f,sourceFile:k.file,sourceIdentity:{...v(k)},separator:"\n\n",members:c,questionContinuations:h.continuations.map(({fromOffset:a,toOffset:b,proofBinding:c})=>({fromSourceOrdinal:g+a,toSourceOrdinal:g+b,proofBinding:c})),textSha256:s(d),membersSha256:r(c)},i={...e,fingerprint:t(e)},l=c.flatMap(a=>a.sourceSpans);B(k={...k,text:d,sourceGroup:i,sourceSpans:l,sourceSpansSha256:u(i,l)},b)}e.push({judgmentIndex:d.length,rawOrdinals:Array.from({length:i-g},(a,b)=>g+b),...k.sourceGroup?{sourceGroupFingerprint:k.sourceGroup.fingerprint,sourceFile:k.sourceGroup.sourceFile,parentFingerprint:k.sourceGroup.textSha256,sourceSpansSha256:k.sourceSpansSha256}:{}}),d.push(k),g=i}let h={version:g,rawCount:a.length,groupCount:d.length,reduction:a.length-d.length,groups:e};return C(h),{clauses:d,accounting:h}}},7148:(a,b,c)=>{c.d(b,{Q0:()=>g,RD:()=>i,Sn:()=>f,eu:()=>d,wA:()=>h});let d={米:"m",m:"m",延长米:"m",公里:"km",千米:"km",km:"km",平方米:"m2",平方:"m2","㎡":"m2","m\xb2":"m2",m2:"m2",立方米:"m3",方:"m3","m\xb3":"m3",m3:"m3",吨:"t",t:"t",千克:"kg",公斤:"kg",kg:"kg"},e=[["m3","m\xb3","立方米","方"],["m2","m\xb2","㎡","平方米"],["m","米","延长米"],["t","吨"],["kg","千克","公斤"],["km","公里","千米"]];function f(a){let b=String(a||"").trim().toLowerCase();return Object.prototype.hasOwnProperty.call(d,b)?d[b]:b}function g(a,b){let c=String(a||"").trim().toLowerCase(),d=String(b||"").trim().toLowerCase();return!c||!d||c===d||f(c)===f(d)||e.some(a=>a.includes(c)&&a.includes(d))}let h="平方米|立方米|m2|m3|m\xb2|m\xb3|㎡|延长米|公里|千米|kg|km|吨|座|个|套|盏|台|根|块|樘|扇|片|组|件|孔|米|m|t",i=[...new Set([...h.split("|"),"日历天","工作日","小时","分钟","个月","毫米","厘米","兆帕","千瓦","万元","亿元","台班","日","周","秒","mm","cm","MPa","kW","天","月","年","人","层","栋","%","%","dB(A)","dB","分贝","℃","\xb0C","kPa","Pa","kN","N","kV","V","A","Hz","rpm","m/s","mm/s","m\xb3/h","m3/h","L/s","μg/m\xb3","μg/m3","mg/m\xb3","mg/m3","克","g","亩","公顷","hm2","hm\xb2","平米","公斤","千克","升","毫升","L","ml","mL","元","度","级","星","辆","Wp","kWp","MWp"])].sort((a,b)=>b.length-a.length).map(a=>a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")).join("|")},7661:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(12866),f=c(59948);let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),h=a=>"string"==typeof a?a.replace(/\r\n/gu,"\n").split("\n").map(a=>a.trim()).join("\n"):Array.isArray(a)?a.map(h):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,b])=>[a,h(b)])):a;function i(a,b,c,d){if(c.contractId!==a.id||b.contractId!==a.id)throw Error("写作指标的首稿、模型和合同身份不一致");let i=new Map(c.findings.map(a=>[a.criterionId,a])),j=new Map(c.findings.map(a=>[a.criterionId,a.status])),k=a=>"met"===j.get(a)&&["professional","strong"].includes(i.get(a)?.qualityLevel??"unmeasured"),l=a.criteria.filter(a=>a.applicable&&!a.chapterId),m=new Set(c.sourceReviews?.filter(a=>"met"!==a.status).map(a=>a.taskId)),n=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&&!m.has(c.id)&&d.length>0&&d.every(a=>k(a.id))}}),o=a.criteria.filter(a=>a.applicable&&a.sectionId).reduce((a,b)=>a+b.weight,0),p=0,q=0,r=0,s=0,t=0;for(let c of a.sections){let d=b.tasks[c.id];if(!d)continue;let f=b.taskAttempts[c.id]?.firstComplete===!0&&!d.firstCandidate.qualityIssues?.length&&!m.has(c.id),k=new Map(d.firstCandidate.output.units.map(a=>[a.id,a])),l=a.criteria.filter(a=>a.applicable&&a.sectionId===c.id),n=new Set;for(let a of d.current.output.units){s+=1;let m=f&&b.c0TaskHashes?.[c.id]!==null?k.get(a.id):void 0,o=(0,e.renderAuthorUnit)(a).length;q+=o;let p=d.firstCandidate.output.factBindings.filter(b=>b.unitId===a.id),u=d.current.output.factBindings.filter(b=>b.unitId===a.id),v=d.firstCandidate.output.numericBindings?.filter(b=>b.unitId===a.id)??[],w=d.current.output.numericBindings?.filter(b=>b.unitId===a.id)??[],x=l.filter(b=>{let c=i.get(b.id)?.authorUnitIds;return void 0===c?a.criterionIds.includes(b.id):c.includes(a.id)});m&&g(h(m))===g(h(a))&&g(p)===g(u)&&g(v)===g(w)&&x.length>0&&x.every(a=>"met"===j.get(a.id))&&a.criterionIds.every(a=>"met"===j.get(a))&&(n.add(a.id),t+=1,r+=o)}for(let e of a.criteria.filter(a=>a.applicable&&a.sectionId===c.id)){let a=i.get(e.id)?.authorUnitIds,g=(!f||b.c0TaskHashes?.[c.id]===null?[]:d.firstCandidate.output.units).filter(b=>void 0!==a?a.includes(b.id):b.criterionIds.includes(e.id));g.length&&"met"===j.get(e.id)&&(p+=e.weight*g.filter(a=>n.has(a.id)).length/g.length)}}let{missingUsageCalls:u,totalTokens:v,repairTokens:w}=(0,f.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:n,firstPassRate:n.length?n.filter(a=>a.firstQualityPassed).length/n.length:null,documentConditionsPassed:l.every(a=>k(a.id)),unresolvedDocumentCriterionIds:l.filter(a=>!k(a.id)).map(a=>a.id),retention:{fixedWeight:o,retainedWeight:p,conservativeWeightRatio:o?p/o:null,evidencePolicy:"confirmed-applicable-criterion-unit-evidence-v1",currentUnits:s,retainedUnits:t,contentChars:q,retainedContentChars:r,charRatio:q?r/q:null},rework:b.rework,generationTokens:{totalTokens:u?null:v,repairTokens:u?null:w,repairRatio:!u&&v?w/v:null,missingUsageCalls:u,purposePolicy:"首候选后的写作调用及明确轻修保守计入chapter-repair;资料理解、规划和纯审查单独报告"},calibration:"initial-unvalidated",expertValidated:!1}}},7942:(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)}},8014:(a,b,c)=>{c.d(b,{QE:()=>i,cq:()=>h,qd:()=>j,uP:()=>k});var d=c(77598),e=c(17529);let f=a=>(0,d.createHash)("sha256").update(a).digest("hex");function g(a){if((0,e.ky)(a),!Number.isSafeInteger(a.index)||a.index<0||a.parentFingerprint!==f(a.text)||!a.file||!a.sourceSpans?.length||!a.sourceSpansSha256||![a.sourceIdentity?.sourceSha256,a.sourceIdentity?.parsedSha256,a.contextFingerprint].every(a=>"string"==typeof a&&/^[a-f0-9]{64}$/u.test(a)))throw Error("发现证据缺少当前完整母本/原始跨度/来源身份");let b=a.sourceGroup?.members??[{text:a.text,start:0,end:a.text.length,sourceSpans:a.sourceSpans,sourceOrdinal:void 0}],c=0,d=b.map((d,e)=>{let g=d.start,h=b[e+1]?.start??a.text.length;if(a.text.slice(g,d.end)!==d.text||!d.sourceSpans.length||h<d.end||a.text.slice(d.end,h).replace(/\s/gu,""))throw Error("发现证据成员/分隔不属于当前完整原母位置");let i=d.sourceSpans.map(a=>({sourceSpanOrdinal:c++,...void 0===d.sourceOrdinal?{}:{sourceOrdinal:d.sourceOrdinal},file:a.file,...void 0===a.chunkIndex?{}:{chunkIndex:a.chunkIndex},chunkSha256:a.chunkSha256,start:a.start,end:a.end,rawTextSha256:f(a.rawText)})),j=a.text.slice(g,h),k={version:"tender-discovery-source-evidence-v3",index:a.index,parentFingerprint:a.parentFingerprint,file:a.file,sourceIdentity:a.sourceIdentity,contextFingerprint:a.contextFingerprint,sourceSpansSha256:a.sourceSpansSha256,groupFingerprint:a.sourceGroup?.fingerprint,evidenceIndex:e,start:g,end:h,physicalSpans:i};return{evidenceId:`E${a.index}.${e}@${f(JSON.stringify(k)).slice(0,24)}`,evidenceIndex:e,start:g,end:h,quote:j,quoteSha256:f(j),physicalSpans:i}});if(!d.length||0!==d[0].start||d.at(-1).end!==a.text.length||d.map(a=>a.quote).join("")!==a.text)throw Error("发现证据显示未完整覆盖原母,不能裁剪正文");return d}function h(a,b){if(!Array.isArray(b)||!b.length||b.some(a=>"string"!=typeof a||!a)||new Set(b).size!==b.length)throw Error("发现候选必须选择显式唯一当前 evidenceIds,不能复制引文或按位置猜测");let c=new Map(g(a).map(a=>[a.evidenceId,a]));return b.map(a=>{let b=c.get(a);if(!b)throw Error(`发现 evidenceId 不属于当前原母/成员/跨度:${a}`);return b}).sort((a,b)=>a.start-b.start)}function i(a){return{sourceId:`S${a.index}`,section:a.section,clauseNo:a.clauseNo,originalSource:g(a).map(b=>({evidenceRef:`S${a.index}/M${b.evidenceIndex}`,text:b.quote,...b.physicalSpans[0]?.sourceOrdinal===void 0?{}:{memberOrdinal:b.physicalSpans[0].sourceOrdinal}}))}}function j(a,b){let c=new Map(g(a).map(b=>[`S${a.index}/M${b.evidenceIndex}`,b]));if(!Array.isArray(b)||!b.length||b.some(a=>"string"!=typeof a)||new Set(b).size!==b.length)throw Error("发现候选必须选择当前明确提供的唯一evidenceRefs");return b.map(a=>{let b=c.get(a);if(!b)throw Error(`发现evidenceRef不属于当前原母显式成员:${a}`);return b}).sort((a,b)=>a.start-b.start)}function k(a){let b=new Map;for(let c of a)for(let a of g(c)){let d=`S${c.index}/M${a.evidenceIndex}`;if(b.has(d))throw Error("当前批次原文引用身份重复");b.set(d,{unit:c,quote:a})}return a=>{if(!Array.isArray(a)||!a.length||a.some(a=>"string"!=typeof a)||new Set(a).size!==a.length)throw Error("候选必须选择当前明确提供的唯一evidenceRefs");let c=a.map(a=>{let c=b.get(a);if(!c)throw Error(`evidenceRef不属于当前批次真实原文:${a}`);return c}),d=c[0].unit;if(c.some(a=>a.unit!==d))throw Error("一个候选不能混用不同母本引用;按实际独立职责分开提交");return{unit:d,quotes:c.map(a=>a.quote).sort((a,b)=>a.start-b.start)}}}},10025:(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}},10501:(a,b,c)=>{c.d(b,{j:()=>m});var d=c(11628),e=c(14409),f=c(11248),g=c(28068),h=c(31037),i=c(92050),j=c(91898),k=c(57656),l=c(13518);function m(a,b){let c=b.attribute.trim(),m=e.nC.find(a=>a.key===c||a.label===c||a.aliases.includes(c)),n=[...a.facts,...a.sourceControls??[]].filter(a=>(m?(0,e.nD)(a)?.key===m.key:a.fieldId===c||a.fieldName===c||a.key===c)&&(!b.valueDomain||(0,d.IL)(a.value)===b.valueDomain)),o=m&&e.zT.has(m.key),p=n.filter(a=>!b.objectName||a.objectName===b.objectName||o&&"项目主体"===b.objectName&&!a.objectName),q=n.filter(a=>!a.objectName&&!o),r=new Map(p.filter(b=>Object.hasOwn(a.sources,b.resolutionRef?.winnerSourceFile??b.sourceFile)).map(b=>[b,(0,l.Q)(a,b)])),s=p.filter(b=>Object.hasOwn(a.sources,b.sourceFile)&&(0,g.j)(b)&&(!b.resolutionRef||!!(b.resolutionRef.winnerSourceFile&&Object.hasOwn(a.sources,b.resolutionRef.winnerSourceFile)))&&r.get(b)?.status==="eligible"),t=new Set(s.map(a=>(0,f.K3)(a.value))),u=new Set(s.map(a=>a.objectName).filter(Boolean)),v=s.filter(a=>a.controlContext),w=new Map;for(let a of v){let b=a.controlContext,c=JSON.stringify([b.objectName,b.attribute,b.condition,b.baseline,b.relation]),d=w.get(c)??new Set;d.add((0,f.K3)(a.value)),w.set(c,d)}let x=[...w.values()].some(a=>a.size>1),y=p.length&&p.every(a=>"technical_parameter"===a.fieldId),z=y&&p.some(b=>r.get(b)?.status==="eligible"&&(0,h.P)(a,b)),A=n.length?p.some(a=>r.get(a)?.status==="unresolved")?"needs-source-version-decision":s.some(a=>(0,j.p)(a).requiresTechnicalDecision)?"needs-technical-decision":!q.length||b.objectName&&p.length?s.length?x?"ambiguous":v.length===s.length&&(w.size>1||v.some(a=>"exact"!==a.controlContext.relation))?"conditioned":y&&v.length!==s.length?"needs-context-interpretation":t.size>1||!b.objectName&&u.size>1?"ambiguous":"resolved":z?"needs-context-interpretation":"unmeasured":"unbound":"unmeasured",B=[];for(let b of p){let c=b.resolutionRef?.winnerSourceFile??b.sourceFile,f=b.resolutionRef?b.resolutionRef.winnerSourceRef??null:b.sourceRef??null,g={factId:(0,e.vg)(b),...(0,i.mk)(a,(0,e.vg)(b),(0,h.P)(a,b)),objectName:b.objectName??(o?"项目主体":null),attribute:b.fieldId||b.fieldName||b.key,value:b.value,valueDomain:(0,d.IL)(b.value),technicalMeaning:(0,j.p)(b),sourceFile:c,sourceFingerprint:a.sources[c]?.sha256??null,sourceVersionEligibility:r.get(b)??{status:"unmeasured",decisionIds:[],reason:"没有对应当前冻结解析来源身份"},sourceSemantics:b.sourceSemantics??(0,k.Q)(f?.roleId??b.roleId,f?.processingType??b.processingType),sourceRef:f,sourceEvidenceId:(0,h.P)(a,b),resolutionRef:b.resolutionRef??null,derivation:b.derivation??null,temporalConstraint:b.temporalConstraint??null,confidence:b.confidence};B.push({...g,controlContext:b.controlContext??null})}let C=new Set(p.map(b=>(0,h.P)(a,b)).filter(Boolean)),D=(a.sourceControls??[]).filter(a=>C.has((0,e.vg)(a))).map(b=>({sourceEvidenceId:(0,e.vg)(b),...(0,i.mk)(a,void 0,(0,e.vg)(b)),sourceFile:b.sourceFile,chunkIndex:b.sourceRef?.chunkIndex,value:b.value}));return{snapshotId:a.snapshotId,attribute:c,objectName:b.objectName??null,status:A,value:"resolved"===A?s[0].value:null,candidates:B,totalCandidates:p.length,complete:!0,statusScope:"all-matching-facts",unboundCandidates:b.objectName?q.map(a=>(0,e.vg)(a)):[],unboundTotal:q.length,sourceEvidence:D,diagnosis:{phase:n.length?p.length?"needs-source-version-decision"===A?"source-use":"unbound"===A?"object-binding":"needs-technical-decision"===A||"needs-context-interpretation"===A||"conditioned"===A?"control-context":"ambiguous"===A?"value-resolution":s.length?"resolved":"fact-admission":"object-binding":"attribute-extraction",matchingAttributeRecords:n.length,matchingObjectRecords:p.length,qualifiedRecords:s.length,sourceCorpusSearched:!1,provesMissingSource:!1,nextAction:n.length?p.length?"needs-context-interpretation"===A?"完整原文已返回;解释实际对象、属性和条件,不将裸数字多值当作冲突":"conditioned"===A?"按每条完整工况与控制性质分别使用,不压成全项目单值":"resolved"===A?"使用已提供事实及出处,不重复查询同一属性":"核对候选的具体来源、条件或准入原因,未决不表示原文缺料":q.length?"属性候选尚未关联指定对象;按已有原文上下文解释,不要求用户逐项核定":"已有其他对象的属性记录,指定对象未命中;核对具体对象及别名,不能说原文没有数据":"属性库未命中;按本任务具体问题检索冻结原文,不能凭属性零命中认定原文缺料"}}}},10806:(a,b,c)=>{c.d(b,{b:()=>f});var d=c(14409),e=c(28068);function f(a){let{contract:b,section:c,project:f}=a;if(b.projectSnapshotId!==f.snapshotId||!b.sections.some(a=>a.id===c.id&&a.chapterId===c.chapterId))throw Error("作者任务准入不属于当前固定合同和项目快照");let g=b.criteria.filter(a=>a.applicable&&a.admission?.status==="unmeasured"&&(a.sectionId===c.id||!a.sectionId&&a.chapterId===c.chapterId)).map(a=>({...a.admission,reason:a.description,criterionIds:[a.id],factIds:[...a.factIds??[]]}));for(let a of b.criteria.filter(a=>a.applicable&&a.sectionId===c.id))for(let b of a.factIds??[]){let c=[...f.facts,...f.sourceControls??[]].find(a=>(0,d.vg)(a)===b);!(c&&(0,e.j)(c)&&Object.hasOwn(f.sources,c.sourceFile)&&(!c.resolutionRef||c.resolutionRef.winnerSourceFile&&Object.hasOwn(f.sources,c.resolutionRef.winnerSourceFile)))&&(g.some(c=>c.criterionIds.includes(a.id)&&c.factIds.includes(b))||g.push({status:"unmeasured",code:c?.temporalConstraint?.status==="unmeasured"?"unmeasured-temporal-control":"unmeasured-required-fact",effect:a.admission?.effect??"candidate-review",reason:c?.temporalConstraint?.status==="unmeasured"?"本任务引用的开工事件日期或条件尚未核定,不能用于时间断言":"本任务必用事实尚无可直接使用的已确认值",criterionIds:[a.id],factIds:[b]}))}return a.sharedTask&&"planned"!==a.sharedTask.status&&g.push({status:"unmeasured",code:"shared-task-plan-pending",effect:"candidate-review",reason:a.sharedTask.reason??"本任务组织安排尚未确认;可提交有证据的正文候选,实际方法与条件仍须取证",criterionIds:[],factIds:[]}),{contractId:b.id,taskId:c.id,status:g.some(a=>"task-block"===a.effect)?"blocked":g.length?"candidate-review":"ready",issues:g}}},11189:(a,b,c)=>{c.d(b,{X4:()=>j,Yn:()=>i});var d=c(77598),e=c(22496),f=c(26927);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}}))}}},11248:(a,b,c)=>{c.d(b,{Hr:()=>l,K3:()=>m,PQ:()=>q,dP:()=>s,iw:()=>o,tR:()=>r});var d=c(7148);let e=/[A-Za-z0-9%+-.,]/gu,f="[+−-]?\\d+(?:\\.\\d+)?",g="(?:毫米|厘米|米|mm|cm|m)",h=`${f}\\s*(?:${g})?`,i=`(?:${h}\\s*[\xd7xX**]\\s*)+${f}\\s*(?:${g}|\\(${g}\\)|(${g}))`,j=RegExp(`(?<![A-Za-z\\d])(?:${i})(?![A-Za-z\\d])|(?<![A-Za-z\\d])[+−-]?\\d+(?:\\.\\d+)?\\s*(?:\xb0\\s*C|${d.RD})(?![A-Za-z])|(?<![A-Za-z\\d])(?:C[1-9]\\d{1,2}|(?:HRB|HRBF|HPB)\\d{3}[E]?|Q\\d{3}[A-E]?|P\\d{1,2}|M\\d{1,3}(?:\\.\\d+)?|LOD\\s*\\d+(?:\\.\\d+)?|DN\\d+|[Φφ∅⌀\xd8\xf8]\\s*\\d+(?:\\.\\d+)?)(?![A-Za-z\\d])`,"giu");function k(a){let b=a.charCodeAt(0);return b>=65281&&b<=65374?String.fromCharCode(b-65248):a}function l(a){return a.replace(e,k).replace(/−/gu,"-").replace(/\s+/gu,"").replace(/(?<=\d)[~~](?=[+-]?\d)/gu,"~").replace(/[—–‑﹣]/gu,"-").replace(/[×X**]/gu,"x").replace(/[%]/gu,"%").replace(/‰/gu,"permille").replace(/平方米|平方|平米|m²|㎡/giu,"m2").replace(/公顷|hm²/giu,"hm2").replace(/立方米|立方|m³/giu,"m3").replace(/毫升/gu,"ml").replace(/升/gu,"l").replace(/千米|公里/gu,"km").replace(/毫米/gu,"mm").replace(/厘米/gu,"cm").replace(/米/gu,"m").replace(/千克|公斤/gu,"kg").replace(/克/gu,"g").replace(/吨/gu,"t").replace(/人民币万元|万元人民币/gu,"万元").replace(/人民币元|元人民币|¥/gu,"元").replace(/日历天|自然日/gu,"天").replace(/工作日/gu,"工作天").replace(/个月/gu,"月").replace(/小时/gu,"h").replace(/分钟/gu,"min").replace(/兆帕/gu,"mpa").replace(/千帕/gu,"kpa").replace(/千牛/gu,"kn").replace(/牛/gu,"n").replace(/千瓦/gu,"kw").replace(/兆瓦/gu,"mw").replace(/瓦/gu,"w").replace(/千伏/gu,"kv").replace(/伏/gu,"v").replace(/毫安/gu,"ma").replace(/安培|安/gu,"a").replace(/赫兹/gu,"hz").replace(/摄氏度/gu,"℃").replace(/°\s*C/giu,"℃").replace(/百分之\s*(\d+(?:\.\d+)?)/gu,"$1%").replace(/千分之\s*(\d+(?:\.\d+)?)/gu,"$1permille").replace(/直径\s*(\d+(?:\.\d+)?)/gu,"φ$1").replace(/[Φφ]\s*(\d+(?:\.\d+)?)(?:mm)?/giu,"φ$1").replace(/DN\s*(\d+)/giu,"dn$1").replace(/D\s*(\d+)(?=\b|[^a-z0-9])/giu,"d$1").replace(/\b(KN|MPA|KPA|KW|MW|KV|HZ|DN)\b/giu,a=>a.toLowerCase()).replace(/[,,、。;;::||()()【】\]《》<>"“”'‘’[]/gu,"")}function m(a){return l(a).toLowerCase()}function n(a){let b=/^([+-]?\d+)(?:\.(\d+))?$/u.exec(a);if(!b)return a;let c=(b[2]??"").replace(/0+$/u,"");return`${b[1]}${c?`.${c}`:""}`}function o(a){let b=p(a);if(void 0!==b)return b;let c=m(a),d=/^([+-]?\d+(?:\.\d+)?)(.*)$/u.exec(c);return d?`${n(d[1])}${d[2]}`:c}function p(a){let b=a.replace(e,k).replace(/−/gu,"-").trim();if(!RegExp(`^(?:${i})$`,"iu").test(b))return;let c=b.split(/[×xX**]/u).map(a=>m(a)).map(a=>/^([+-]?\d+(?:\.\d+)?)(mm|cm|m)?$/u.exec(a));if(c.some(a=>!a))return;let d=c.at(-1)[2];if(!d)return;let f=c.map(a=>a[2]??d),g=c.map(a=>n(a[1]));return f.every(a=>a===d)?`${g.join("x")}${d}`:g.map((a,b)=>`${a}${f[b]}`).join("x")}function q(a){return[...a.replace(e,k).replace(/−/gu,"-").matchAll(j)].map(b=>{let c=a.slice(b.index,b.index+b[0].length);return{index:b.index,raw:c,value:p(c)??m(c).replace(/^[Φφ∅⌀Øø]/u,"φ")}})}function r(a){return a.replace(e,k).replace(j,a=>p(a)??m(a)).replace(/(?<=\d)[~~](?=[+-]?\d)/gu,"~").replace(/\s+/gu,"")}function s(a,b){let c=r(b);if(!c)return!1;let d=r(a);for(let a=d.indexOf(c);a>=0;a=d.indexOf(c,a+1))if(!(/^[+-]?\d/u.test(c)&&/[\d.+-]/u.test(d[a-1]??""))&&!(/[A-Za-z\d]$/u.test(c)&&/[A-Za-z\d]/u.test(d[a+c.length]??"")))return!0;return!1}},11628:(a,b,c)=>{c.d(b,{De:()=>u,IL:()=>t,XT:()=>k,cT:()=>z,mf:()=>j,pN:()=>g,wI:()=>f});var d=c(7148),e=c(10025);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||"")))}},11685:(a,b,c)=>{c.d(b,{y:()=>e});var d=c(77598);let e=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex")},12152:(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})},12866:(a,b,c)=>{c.d(b,{t3:()=>N,Ix:()=>O,renderAuthorTableRecord:()=>Q,r2:()=>W,renderAuthorUnit:()=>R,validateAuthorTaskOutput:()=>V});var d=c(54233),e=c(71783),f=c(37377),g=c(77598),h=c(7148);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(35091),o=c(14409),p=c(91898),q=c(11248),r=c(92050),s=c(28068),t=c(58214),u=c(57349),v=c(56999),w=c(4456),x=c(10501),y=c(31037),z=c(94173),A=c(10806),B=c(13518);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}
11
+ ${d}`,{signal:e,temperature:0,diagnostics:f,callKind:"fact-extraction",contextLayers:{l0:q.length,l3:(0,n.CX)([d])}})}finally{k&&clearInterval(k)}for(let a of c?.facts??[])a&&"string"==typeof a.key&&r.push(a);g?.({...h,factsSoFar:r.length,phase:"done",elapsedMs:Date.now()-i})}if((0,p.Te)(e),!r?.length)return{facts:[],stages:h};let z=[],A=0,B=0;for(let a of r){if(!a.key||!a.value)continue;let b=u.get(String(a.evidenceId||"").trim().toUpperCase());if(!b){A+=1;continue}let c=k.find(b=>b.id===a.fieldId||b.name===a.fieldName||b.name===a.key),d=(0,p.lG)(a.value),e=(0,m.K3)(d),f="string"==typeof a.sourceSpan&&a.sourceSpan.trim()?a.sourceSpan.trim():b.content.split(/[。;;\n]/u).find(a=>(0,m.K3)(a).includes(e));if(!e||!f||!(0,m.K3)(b.content).includes((0,m.K3)(f))||!(0,m.K3)(f).includes(e)||k.length>0&&!c||a.objectName&&!f.includes(a.objectName)){B+=1;continue}if(c?.id==="excavation_depth"||/^(?:基坑)?(?:开挖)?深度$/u.test(c?.name??a.key)){let a=(0,t.B)(f,/基坑开挖深度|基坑深度|开挖深度/u);if(a?(0,m.K3)(a)!==e:void 0===(0,t._)(f,/基坑开挖深度|基坑深度|开挖深度/u)){B+=1;continue}}z.push({key:c?.name||a.key,fieldId:c?.id||a.fieldId,fieldName:c?.name||a.fieldName,value:d,objectName:a.objectName,...a.controlContext&&["exact","upper-bound","lower-bound","range"].includes(a.controlContext.relation)&&"string"==typeof a.controlContext.condition&&a.controlContext.objectName===a.objectName&&a.controlContext.attribute&&f.includes(a.controlContext.attribute)&&(!a.controlContext.condition||f.includes(a.controlContext.condition))&&(!a.controlContext.baseline||f.includes(a.controlContext.baseline))&&(0,m.K3)(a.controlContext.quote)===(0,m.K3)(f)?{controlContext:a.controlContext}:{},sourceFile:b.filePath,roleId:b.roleId||"llm",processingType:b.processingType,confidence:"number"==typeof a.confidence&&Number.isFinite(a.confidence)?Math.max(0,Math.min(1,a.confidence)):.8,sourceRef:{filePath:b.filePath,roleId:b.roleId||"llm",processingType:b.processingType,sectionTitle:b.sectionTitle,chunkIndex:b.chunkIndex,sourceSpan:f}})}return{facts:z,stages:[{type:"fact_extraction",roleId:"llm-json",status:"success",message:`LLM 按动态 schema 抽取 ${z.length} 条事实${A>0?`(丢弃 ${A} 条无效来源编号)`:""}${B>0?`(拒收 ${B} 条无原文支持或对象错配事实)`:""}`}]}}let B=["投标保证金的金额、收款账户名称、开户行与账号","电子投标文件加密方式与解密方式","开标时间、开标地点与开标程序","评标委员会组成与评标办法","招标人联系人、联系电话、邮箱与地址","投标文件递交方式与递交截止时间","空白表格填写说明与上传下载指引","公共资源交易平台监督管理部门"],C=/签章|盖章|联系人|联系电话|电话|邮箱|解密方式|开标时间|开标地点|评标办法|评标委员会|投标保证金|保证金账户|电子交易系统|空白|填写|上传|下载|递交方式|递交截止|公共资源交易监督管理|监管部门|开评标程序|采购范围|是否|符合/u;async function D(a,b,c=i.p4,d){let e=(b?.factFields.map(a=>a.name)||[...new Set(a.map(a=>a.fieldName||a.key))]).filter(a=>(function(a,b){let c=(0,i.oC)(b,a);return c?"single"===c.cardinality&&"ignore"!==c.conflictPolicy&&"allow_multiple"!==c.conflictPolicy:/项目名称|工程名称|招标人|建设地点|建筑面积|结构形式|层数|工期|质量标准|合同价格形式|绿色建筑等级|投标有效期|质保期|劳动力高峰|装配率|支护形式|创优奖惩|抗震设防烈度|地震加速度|场地类别|地基基础设计等级|抗震设防类别/u.test(a)})(a,c)),f=[...new Set(a.map(a=>(0,p.lG)(a.value).trim()).filter(a=>C.test(a)))],g=await (0,q.Mv)(f,B,d),h=a=>B.some(b=>g(a,b)>=.6),k=[];for(let b of e){let d=a.filter(a=>a.key===b||a.fieldName===b||(0,i.oC)(c,a.fieldName||a.key)?.name===b),e=new Map;for(let a of d){if(!(0,j.cT)(b,a))continue;let d=function(a,b,c){let d=G((0,p.lG)(a).trim());if((0,r.j4)(d))return;let e=(0,j.De)((0,j.pN)(d));if(!e||(0,r.j4)(e)||(0,i.d2)(b,e)||(0,i.rF)(b,e)||(0,j.wI)(e)||/\|/u.test(e)||/^#+\s*/u.test(e)||/见(?:招标公告|投标人须知|前附表|本项目|补疑)|资料参数行摘要/u.test(e)||j.mf.test(e.replace(/\s+/gu,""))&&/投标|开标|递交|评标|公示|中标|截标/u.test(e))return;let f=e.match(/\d+\s*日历天/u)?.[0]?.replace(/\s+/gu,"");if(f&&/工期|日历天|开工日期|竣工/u.test(e))return{value:f,domain:(0,j.IL)(f)};let g=(0,m.K3)((0,p.lG)(e));if(g&&!(g.length>80)&&/[\d年月日%]|合格|一星|二星|三星|总价合同|单价合同|承台|框架|装配式/u.test(e)&&!(C.test(e)&&c?.(e)))return{value:g,domain:(0,j.IL)(g)}}(a.value,c,h);if(!d)continue;let f=e.get(d.value);e.set(d.value,{items:[...f?.items||[],a],domain:d.domain})}if(!(e.size<=1))for(let a of 1===new Set([...e.values()].map(a=>a.domain)).size?[[...e]]:j.XT.map(a=>[...e].filter(([,b])=>b.domain===a))){let c=new Map(a);if(c.size<=1)continue;let d=[...c.values()].slice(0,4).map(a=>`${(0,p.lG)(a.items[0].value).slice(0,120)}(${[...new Set(a.items.map(a=>a.sourceFile))].slice(0,3).join("、")})`).join(" vs ");k.push(`事实冲突:${b} 存在多个来源值:${d}`)}}return k}function E(a){return(0,p.lG)(a).replace(/\s*[##]{1,6}\s*/gu,"")}function F(a){return(0,p.lG)(a).replace(/[\u00A0\u2002-\u200B\u3000]/gu," ").replace(/([\p{Script=Han}])\s+([\p{Script=Han}])/gu,"$1$2").replace(/(\d)\s+(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/(合同|投资|工程|项目)\s*估\s*算\s*(?:价格|价)/gu,"$1估算价").replace(/计划\s*工\s*期/gu,"计划工期").replace(/合同\s*工\s*期/gu,"合同工期").replace(/质量\s*标\s*准/gu,"质量标准").replace(/建设\s*地\s*点/gu,"建设地点").replace(/建设\s*规\s*模/gu,"建设规模").replace(/招标\s*范\s*围/gu,"招标范围").replace(/最高\s*投\s*标\s*限\s*价/gu,"最高投标限价").replace(/招标\s*控\s*制\s*价/gu,"招标控制价").replace(/[::]\s*/gu,":").replace(/\s+/gu," ").trim()}function G(a){return a.replace(/[((【[]?\s*(?:\d{1,2}(?:[..]\d{1,2}){0,3}\s*)?(?:招标项目编号|招标编号|项目编号|工程编号|标段编号|采购编号|项目代码)\s*[::为是]?\s*[A-Za-z0-9][A-Za-z0-9\-_.()()]{3,79}\s*[))】\]]?\s*$/u,"").trim()}let H=[{fieldId:"project_name",key:"项目名称",fieldName:"项目名称",pattern:/(?:项目名称|工程名称|招标项目名称)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_code",key:"项目编号",fieldName:"项目编号",pattern:/(?:项目编号|招标项目编号|工程编号)[::\s为是]+([A-Za-z0-9\-_.()()]{4,80})/u},{fieldId:"owner",key:"招标人",fieldName:"招标人",pattern:/(?:招标人|建设单位|发包人)[::\s为是]+([^\n。;;]{2,120})/u},{fieldId:"project_location",key:"建设地点",fieldName:"建设地点",pattern:/建设地点[::\s为是]+([^\n。;;]{2,100})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/建设规模[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"project_scale",key:"建设规模",fieldName:"建设规模",pattern:/(?:拟|计划|规划|目标|力争|预计|期望|远期|未来|设想|建议|预期|争取)[^,,。;;\n]{0,12}?(?<![地上地下])总?建筑面积(?:约|约为|约计|共计|为)?\s*[\d,,.]+\s*(?:㎡|m²|m2|平方米)|((?<![地上地下])总?建筑面积(?:约|约为|约计|共计|为)?\s*[\d,,.]+\s*(?:㎡|m²|m2|平方米))/u},{fieldId:"project_scope",key:"招标范围",fieldName:"招标范围",pattern:/招标范围[::\s为是]+([^\n。;;]{2,220})/u},{fieldId:"schedule_requirement",key:"计划工期",fieldName:"周期要求",pattern:/(?:(?:计划工期|合同工期|总工期)[::\s为是约]*|工期[::\s为是约]+)([^\n。;;]{0,40}?\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)(?:[^\n。;;]{0,30})?)/u},{fieldId:"quality_standard",key:"质量标准",fieldName:"质量标准",pattern:/质量标准[::\s为是]+([^\n。;;]{1,60})/u},{fieldId:"project_investment_estimate",key:"合同估算价格",fieldName:"项目投资估算",pattern:/(?:合同估算价格|合同估算价|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价)[::\s为是约]+([^\n。;;]{0,80}?\d+(?:\.\d+)?\s*(?:万元|元))/u},{fieldId:"labor_peak",key:"劳动力高峰人数",fieldName:"劳动力高峰人数",pattern:/(?:劳动力|用工|作业人员|施工人员)[^。;;\n]{0,40}?(?:高峰|峰值)[^。;;\n]{0,20}?(\d+(?:\.\d+)?\s*人)/u},{fieldId:"labor_peak",key:"劳动力高峰人数",fieldName:"劳动力高峰人数",pattern:/(?:高峰(?:期)?(?:劳动力|用工|人数|作业人员)|高峰期人数)[^。;;\n]{0,20}?(\d+(?:\.\d+)?\s*人)/u},{fieldId:"assembly_rate",key:"装配率",fieldName:"装配率",pattern:/(?:装配率|装配式建筑占比|装配式比例|装配式建筑面积占比)[^。;;\n]{0,16}?(\d+(?:\.\d+)?\s*%)/u},{fieldId:"foundation_support_form",key:"基坑支护形式",fieldName:"基坑支护形式",pattern:/(?:基坑支护(?:形式|方式|方案)?|支护(?:形式|方式))[^。;;\n]{0,10}?(?:采用|为|:|:|\s)([^。;;\n]{2,60})/u},{fieldId:"award_clause",key:"创优奖惩条款",fieldName:"创优奖惩条款",pattern:/(?:创优(?:目标|奖惩)?|优质优价)[^。;;\n]{0,60}?(\d+(?:\.\d+)?\s*万元)/u},{fieldId:"award_clause",key:"创优奖惩条款",fieldName:"创优奖惩条款",pattern:/(?:确保|争创|力争|争获)?[\u4e00-\u9fa5]{2,6}[杯奖][^。;;\n]{0,60}?(\d+(?:\.\d+)?\s*万元)/u},{fieldId:"seismic_fortification",key:"抗震设防烈度",fieldName:"抗震设防烈度",pattern:/抗震设防烈度[::\s为是]*([6-9]\s*度)(?!\s*(?:及|以上|以下|至))/u},{fieldId:"seismic_acceleration",key:"地震加速度",fieldName:"地震加速度",pattern:/(?:设计基本)?地震加速度[::\s为是]*(\d(?:\.\d+)?\s*g(?![a-z]))/u},{fieldId:"seismic_site_category",key:"场地类别",fieldName:"场地类别",pattern:/场地类别[^。;\n]{0,32}?((?:[ⅠⅡⅢⅣ]+|[IV]{1,3})\s*类)/u},{fieldId:"foundation_design_grade",key:"地基基础设计等级",fieldName:"地基基础设计等级",pattern:/地基基础设计等级[::\s为是]*([甲乙丙]\s*级)/u},{fieldId:"seismic_protection_category",key:"建筑抗震设防类别",fieldName:"建筑抗震设防类别",pattern:/(?:建筑)?抗震设防类别[::\s为是]*([甲乙丙丁]\s*类)(?!型)/u}];function I(a){return a.split(/(?:\d+(?:\.\d+)+)?(?:招标项目名称|工程名称|项目名称|招标项目编号|项目编号|标段划分|招标项目标段编号|建设地点|建设规模|合同估算价(?:格)?|计划工期|招标范围|项目类别|质量标准|其他)\s*[::]/u)[0].trim()}function J(a,b){let c=F((0,p.lG)(b));return!(!a||!c||c.length>260||/###|第\s*\d+\s*页|共\s*\d+\s*页|律师代理费|投标文件的编制|备选投标方案|投标将被否决|投标人提供|投标有效期|电子交易系统|公共资源交易监督管理部门|中标候选|评标委员会|实质性内容作出响应/u.test(c)||/签章|盖章|联系人|联系电话|电话|邮箱|解密|开标|评标|保证金|交易系统|空白|填写|上传|下载|递交/u.test(c)||/条款号|条款名称|编列内容|澄清为如下|现澄清|答疑文件|补遗书|投标人须知前附表/u.test(c))&&("schedule_requirement"===a?c.length<=90&&/\d+(?:\.\d+)?\s*(?:日历天|天|个月|月|年)/u.test(c)&&!/^(?:计划)?开工日期\s*[::]/u.test(c)&&!/(?<=[日天])\s*[0-9]+(?:\.[0-9]+)?(?=[\s]*(?:招标|建设|质量|合同|项目|工程|资金|投标|开标|评标|付款|工期|开工|计划|计价|现场|资质|标段|[,,。;;]|$))/u.test(c):"quality_standard"===a?c.length<=40&&/合格|优良|一次性验收|国家.*验收|达到/u.test(c)&&!/工期|投标|技术标准|\d[..、]/u.test(c):"project_name"===a?c.length<=120&&/项目|工程|学院|宿舍|楼|校区|施工总承包/u.test(c)&&!/序号|参数|配线架|交换机|跳线|额定|接口|UPS|项目特征|工程量|计量单位|R\d+C\d+|COL\d+|计算基础|计算基数|费率|计价表|分部分项|增值税|工程名称.*工程名称|项目名称.*项目名称|±\d/u.test(c):"owner"===a?c.length>=4&&c.length<=80&&/公司|大学|局|委员会|中心|处|院|所|校|集团|有限|股份|责任|管理|政府|管委会|办事处|指挥部/u.test(c)&&!/将报|监督管理部门|投标人|中标|负责解释|见招标|详见|空白|填写/u.test(c):"project_location"===a?c.length<=120&&!/见招标公告|详见|投标/u.test(c):"project_scope"===a?c.length<=220&&/施工|工程|道路|建筑|安装|拆除|设计|改造|装修|绿化|图纸|土石方|清单|总承包/u.test(c)&&!/^[((]\s*\d+[))]/u.test(c)&&!/具备.{0,24}(?:证书|考核合格|安全生产考核)/u.test(c)&&!/^(?:见|详见)(?:本项目)?(?:招标|投标人|前附)/u.test(c):"project_code"===a?/^[A-Za-z0-9\-_.()()]+$/u.test(c)&&c.length<=80&&!/\.\d+$/u.test(c):"project_scale"===a?c.length<=100&&/(?:m²|㎡|平方米|m2|km|米|公里|亩|公顷|栋|幢|座|处|户|层|个)/u.test(c)&&!/招标范围/u.test(c):"project_investment_estimate"===a?c.length<=100&&/\d+(?:\.\d+)?\s*(?:万元|元)/u.test(c):"labor_peak"===a?c.length<=40&&/\d+(?:\.\d+)?\s*人/u.test(c):"assembly_rate"===a?c.length<=20&&/\d+(?:\.\d+)?\s*%/u.test(c):"foundation_support_form"===a?c.length<=60&&/放坡|锚|桩|喷|开挖|护坡|土钉|地下连续墙|支撑/u.test(c)&&!/子项名称_\d|R\d+C\d+/iu.test(c):"award_clause"===a?c.length<=120&&/\d+(?:\.\d+)?\s*万元/u.test(c)&&!/评标|保证金/u.test(c):c.length<=220)}function K(a){let b=[],c=new Set;for(let d of a){let a=E((0,p.lG)(d.content)),e=new Set;for(let[f,g,h]of[["project_name","(?:招标项目名称|项目名称|工程名称)","项目名称"],["project_scope","(?:招标范围|施工范围)","招标范围"]])for(let i of a.matchAll(RegExp(`${g}[::]\\s*([^。;;]+)`,"gu"))){let a=I(i[1]),g=F(a).replace(/\s+/gu,"");if(!J(f,g))continue;let j=`${d.filePath}:${f}:${g}`;e.add(f),c.has(j)||(c.add(j),b.push({key:h,fieldName:h,fieldId:f,value:g,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:i[0].slice(0,i[0].length-i[1].length)+a}}))}let f=!1;for(let e of a.matchAll(/建设规模[::\s]+([\s\S]{1,1200}?)(?=\r?\n\s*(?:#{1,6}\s*)?\d+(?:\.\d+)+[^\n::]{0,15}[::]|$)/gu)){let a=e[1].replace(/\s/gu,"");if(!/本项目|本工程/u.test(a))continue;let g=/(?:用地内)?总建筑面积(?:[((][^))]{1,20}[))])?(?:共计|约为|约|为)?([\d,,]+(?:\.\d+)?)\s*(平方米|㎡|m²|m2)/iu.exec(a);if(!g||/拆除/u.test(a.slice(Math.max(0,g.index-30),g.index+g[0].length+20)))continue;let h=`${g[1]}${g[2]}`,i=`${d.filePath}:project_scale:项目主体:${h}`;if(c.has(i)){f=!0;continue}c.add(i),f=!0,b.push({key:"建设规模",fieldName:"建设规模",fieldId:"project_scale",objectName:"项目主体",value:h,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:e[0]}})}for(let g of a.replace(/(\d)\s*\r?\n\s*(日历天|天|个月|月|年|万元|元|㎡|平方米|米|m|mm|MPa|kPa|%)/giu,"$1$2").replace(/([\d,,.]+(?:平方|立方|㎡|m²|m2|m)?)\s*\r?\n\s*(米|m|㎡|m2|m²)/gu,"$1$2").split(/\r?\n/u).flatMap(a=>{let b=F(a);return b.length>260?b.split(/(?=\d+(?:\.\d+)?\s*[^\s::]{2,12}[::])/u):[b]}).filter(Boolean))if(!/报价明细|综合单价|税率|增值税|利润|结算/u.test(g)||/合同估算价|合同估算价格|投资估算|最高投标限价|招标控制价/u.test(g))for(let a of H){if(e.has(a.fieldId))continue;let h=a.pattern.exec(g),i=h?.[1]?.trim();if("project_scale"===a.fieldId&&/拆除/u.test(`${d.sectionTitle??""} ${g}`)&&i){let a=/现场有(.{1,40}?)需要拆除/u.exec(d.sectionTitle??"")?.[1],e=`${d.filePath}:demolition_area:${i}`;c.has(e)||(c.add(e),b.push({key:"拆除建筑面积",fieldName:"拆除建筑面积",fieldId:"demolition_area",value:i,...a?{objectName:a}:{},sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:a?.9:.6,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:g}}));continue}if("project_scale"===a.fieldId&&f||("owner"===a.fieldId&&i&&(i=i.split(/\s+[WH]\s*[=::]|(?:\d+(?:\.\d+)+)?(?:项目业主|资金来源|项目出资比例|资金落实情况|联系人|建设地点|设计单位)\s*[::]/u)[0].replace(/\d+(?:\.\d+)+$/u,"").trim()),!i||!J(a.fieldId,i)))continue;let j=`${d.filePath}:${a.fieldId}:${i}`;c.has(j)||(c.add(j),b.push({key:a.key,fieldName:a.fieldName,fieldId:a.fieldId,value:i,sourceFile:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",confidence:.9,sourceRef:{filePath:d.filePath,roleId:d.roleId||"project_basic_fact",processingType:d.processingType||"reference",sectionTitle:d.sectionTitle,chunkIndex:d.chunkIndex,sourceSpan:g}}))}}return b}let L=/\||第\s*\d+\s*页|共\s*\d+\s*页|[##]{1,6}| 资料参数行摘要|(?<=[日天])\s*[0-9]+(?:\.[0-9]+)?(?=[\s]*(?:招标|建设|质量|合同|项目|工程|资金|投标|开标|评标|付款|工期|开工|计划|计价|现场|资质|标段|[0-9]{1,3}[.、.]|[,,。;;]|$))/u,M=/规模|范围|工期|周期|project_scope|project_scale/iu,N=/^[A-Za-z0-9\-_.()()]+$/u,O=/(?:招标项目编号|项目编号|工程编号|标段编号|合同编号|编号)[::为是]*([A-Za-z0-9][A-Za-z0-9\-_.()()]{3,79})/gu;function P(a){return"project_code"===a.fieldId||/编号|代码/u.test(`${a.fieldName||""}${a.key||""}`)}function Q(a,b,c){let d,e=[];for(let f of a){let a=(0,p.lG)(f.value).trim();if(!a)continue;let g=L.exec(a),h=a;g&&(h=a.slice(0,g.index).replace(/[\s::,,、;;\-—|]+$/u,"").trim()),P(f)||(h=G(h));let i=h!==a;if(h.length<2){c.dropped+=1;continue}let j=P(f);if(j&&!N.test(h)||h.length>120&&!M.test(`${f.fieldId||""} ${f.fieldName||""} ${f.key||""}`)){c.dropped+=1;continue}let k=!1;if(j&&h.length>=4){let a=[...(d||=function(a){let b=new Map;for(let c of a)for(let a of E((0,p.lG)(c.content)).replace(/\s+/gu,"").matchAll(O)){let c=a[1];c&&b.set(c,(b.get(c)||0)+1)}return b}(b)).entries()].filter(([a])=>a.length>=h.length+2&&a.startsWith(h)),c=a.sort((a,b)=>b[1]-a[1]||a[0].length-b[0].length)[0]?.[0];c&&(h=c,k=!0)}i&&(c.truncated+=1),k&&(c.repaired+=1),e.push(h===a?f:{...f,value:h})}return e}function R(a){let b={localFacts:function(a,b,c){let d=(0,l.Uy)(b,c),e=d.map(a=>({field:a,pattern:function(a){let b=a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&"),c=/规模|scale|工期|周期/iu.test(a)?"[^。]{2,220}":/范围|project_scope|项目名称|工程名称|project_name/iu.test(a)?"[^。;;]+":"[^\n,。;;]+";return RegExp(`${b}[::\\s]+(${c})`,"u")}(a.name)})),f=d.map(a=>a.name).filter(Boolean),g=[];for(let b of a)for(let{field:a,pattern:c}of e){if(!(0,l.I2)(b,a))continue;let d=b.content.match(c),e=d?.[1]?.trim();if(!e)continue;e=E(e).replace(/\s+/gu,""),/范围|project_scope|项目名称|工程名称|project_name/iu.test(a.name)&&(e=I(e)),e=e.replace(/(?<=[日天])[0-9]+(?:\.[0-9]+)?(?=(?:招标范围|质量标准|建设规模|计划工期|合同估算|项目名称|项目编号|建设地点|招标人|资金来源|投标人资格|资质要求|开标|评标|付款|计价|现场条件|开工日期|合同工期|工期要求|[0-9]{1,3}[.、.]|[,,。;;]|$))/u,"");let h=f.filter(b=>b!==a.name).map(a=>e.indexOf(a)).filter(a=>a>0);h.length>0&&(e=e.slice(0,Math.min(...h)));let j=(0,u.nD)({key:a.name,fieldId:a.id,fieldName:a.name});(!j||J(j.key,e))&&(!e||!(e.length<=220)||(0,i.rF)(i.p4,e)||(0,i.d2)(i.p4,e)||g.some(b=>b.fieldId===a.id&&b.value===e)||g.push({key:a.name,fieldId:a.id,fieldName:a.name,value:e,sourceFile:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,confidence:.8,sourceRef:{filePath:b.filePath,roleId:b.roleId||"unknown",processingType:b.processingType,sectionTitle:b.sectionTitle,chunkIndex:b.chunkIndex,sourceSpan:d[0]}}))}return g}(a.evidence,a.template,a.spec),projectBasicFacts:K(a.evidence),structuredTables:function(a,b={}){let c=[],d=[],i=new Set;for(let j of a.filter(a=>"table"===a.processingType||"structured_data"===a.processingType||"bill_of_quantities"===a.processingType)){if(i.has(j.filePath))continue;let a=f.extname(j.filePath).toLowerCase();if(!b.parsedOnly&&[".xlsx",".xls",".csv"].includes(a)){let a=(0,h.aY)(),b=(0,h.NW)(a),l=f.isAbsolute(j.filePath)?j.filePath:e.existsSync(f.join(b,j.filePath))?f.join(b,j.filePath):f.join(a,j.filePath);if(e.existsSync(l))try{d.push(...function(a,b){let c=e.statSync(a),d=`${a}:${b.roleId||"table"}`,f=v.get(d);if(f&&f.mtimeMs===c.mtimeMs&&f.size===c.size)return f.tables;let h=function(a,b){let c=g.readFile(a,{cellDates:!0,sheetStubs:!1}),d=[];for(let a of c.SheetNames){let e=c.Sheets[a],f=g.utils.sheet_to_json(e,{header:1,raw:!1,defval:""}).map(a=>a.map(a=>String(a).trim())).filter(a=>a.some(Boolean));if(f.length<2)continue;let h=(0,k.detectSmartTableHeader)(f),i=h.headers,j=f.slice(h.headerIndex+1).map(a=>a.slice(0,i.length)).filter(a=>a.some(Boolean));0!==j.length&&d.push({tableType:b.roleId||"table",sheet:a,headers:i,rows:j,sourceFile:b.filePath,sourceRange:e["!ref"]})}return d}(a,b);return v.size>500&&v.clear(),v.set(d,{mtimeMs:c.mtimeMs,size:c.size,tables:h}),h}(l,j)),i.add(j.filePath);continue}catch(a){c.push(`${j.filePath}:${a instanceof Error?a.message:String(a)}`)}}let l=j.content.split("\n").map(a=>a.trim()).filter(Boolean).filter(a=>a.includes("|")||a.includes(" ")||a.includes(","));if(l.length<2)continue;let m=l[0].includes("|")?"|":l[0].includes(" ")?" ":",",n=l.map(a=>{let b="|"===m?a.replace(/^\|/u,"").replace(/\|$/u,""):a;if(","!==m)return b.split(m).map(a=>a.trim());let c=[],d="",e=!1;for(let a=0;a<b.length;a+=1){let f=b[a];'"'===f?e&&'"'===b[a+1]?(d+='"',a+=1):e=!e:","!==f||e?d+=f:(c.push(d.trim()),d="")}return c.push(d.trim()),c}).filter(a=>a.length>1&&a.some(Boolean)&&!a.every(a=>/^:?-{3,}:?$/u.test(a)));if(n.length<2)continue;let o=n[0],p=d.find(a=>a.sourceFile===j.filePath&&a.sourceRange===j.sectionTitle&&JSON.stringify(a.headers)===JSON.stringify(o)),q=n.slice(1).filter(a=>JSON.stringify(a)!==JSON.stringify(o));p?p.rows.push(...q):d.push({tableType:j.roleId||"table",headers:o,rows:q,sourceFile:j.filePath,sheet:j.sectionTitle,sourceRange:j.sectionTitle})}return c.length>0&&console.warn(`[facts] 工作簿解析失败 ${c.length} 份,已回退文本猜表(保真度下降):${c.slice(0,5).join(";")}`),d}(a.evidence,{parsedOnly:a.parsedOnly})},c={truncated:0,dropped:0,repaired:0};if(b.localFacts=Q(b.localFacts,a.evidence,c),b.projectBasicFacts=Q(b.projectBasicFacts,a.evidence,c),a.diagnostics&&(c.truncated>0||c.dropped>0||c.repaired>0)){let b=a.diagnostics.factSanitize||={truncated:0,dropped:0,repaired:0};b.truncated+=c.truncated,b.dropped+=c.dropped,b.repaired+=c.repaired}return{...b,factSanitize:c}}function S(a,b){let c={};for(let d of b?.factFields||[])c[d.id]=a.filter(a=>a.fieldId===d.id||a.key===d.name||a.fieldName===d.name);return c}function T(a){return`${a.key} ${a.fieldName||""} ${a.value} ${a.roleId} ${a.processingType||""} ${a.sourceFile}`}function U(a){return/合同估算价|合同估算价格|投资估算|估算价格|工程估算价|项目估算价|最高投标限价|招标控制价/u.test(a)}function V(a){let b=T(a);return!U(b)&&/投标保证金|发票类型|开标时间|公共资源交易监督管理|不良行为记录|投诉举报|资质投诉|投标承诺|违约金|中标服务费|交易平台|保证金账户|投标有效期|报价明细|投标报价|单价|合价|税率|增值税|利润|结算/u.test(b)}function W(a,b,c,d){let e=a.filter(a=>(0,i.d2)(d,T(a))||(0,i.E1)(d,T(a))),f=a.filter(a=>{let b=T(a);return a.confidence>=.58&&!V(a)&&!(0,i.rF)(d,b)&&!(0,i.d2)(d,b)&&!(0,i.E1)(d,b)}),g=[...b.filter(a=>!V(a)),...f.filter(a=>o.test(T(a)))].filter((a,b,c)=>c.findIndex(b=>b.sourceFile===a.sourceFile&&b.value===a.value&&b.key===a.key)===b).slice(0,360),h=f.filter(a=>"table"===a.processingType||/table|sheet|表格|清单|明细|数据|参数行摘要/u.test(T(a))),j=f.filter(a=>"drawing"===a.processingType||/drawing|dwg|图纸|施工图|设计图|平面图|剖面图|大样图|详图/u.test(T(a)));return{reliableFacts:f.slice(0,500),parameterFacts:g,tableFacts:h.slice(0,240),drawingFacts:j.slice(0,240),billFacts:c.slice(0,240),diagnostics:e.slice(0,120)}}function X(a,b){return a.filter(a=>{let c=`${a.key} ${a.fieldName||""} ${a.value}`;return o.test(c)&&(!(0,i.rF)(b,c)||U(c))&&!(0,i.d2)(b,c)})}function Y(a){return a.filter(a=>"table"===a.processingType||"structured_data"===a.processingType||"bill_of_quantities"===a.processingType||/bill|boq|table|sheet|data|表格|列表|明细|数据/u.test(`${a.roleId} ${a.sourceFile}`))}let Z=/[\u3400-\u4DBF\u{20000}-\u{3FFFF}]/gu,$=/(?:R\d+C\d+|COL\d+|第\d+行第\d+列)/giu;function _(a,b){for(let c of a.matchAll(/([\u4e00-\u9fa5]{2,8}?(?:镇|乡|县|市|区|街道|村))[^。;;\n]{0,24}?(?:项目|工程)/gu))if(c[1]!==b)return!0;return!1}function aa(a){let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`,c=F((0,p.lG)(a.value)).trim();if(!c)return a;if(/项目名称|工程名称|project_name/u.test(b)){if(C.test(c))return a;let b=c.replace(/^(?:项目|工程)名称[::]\s*/u,"").trim();if(!(/项目|工程/u.test(b)&&!/(?:[||]|序号|合计|金额|第\d*页|共\d*页)/u.test(b)&&b.length>=3&&b.length<=80))return{...a,value:""}}if(/招标人|建设单位|发包人|tenderee/u.test(b)){if($.test(c))return a;let b=c.replace(/^招标人[::]\s*/u,"").trim();if(!(/(?:政府|公司|局|委员会|集团|学院|大学|中心|研究院|设计院|事务所|管理处|指挥部|医院|学校|村委会|居委会)(?:[((][^))]*[))])?$/u.test(b)&&b.length<=60))return{...a,value:""}}return a}function ab(a){let b=a.filter(a=>!function(a){let b=(0,p.lG)(a.value);if(!b)return!1;let c=[...b.matchAll(Z)].length;if(c>0){let a=[...b.matchAll(/[\u3400-\u4DBF\u4E00-\u9FFF\u{20000}-\u{3FFFF}]/gu)].length;if(b.length<=40||a>0&&c/a>=.2)return!0}return!!$.test(b)&&!!(b.replace($,"").trim().length<=24)}(a)).map(aa).filter(a=>(0,p.lG)(a.value).trim().length>0).filter(a=>!(0,r.j4)((0,p.lG)(a.value),{allowProse:!0,includePoolNoise:!1})),c=b.find(a=>("项目名称"===a.key||"project_name"===a.fieldId)&&(0,p.lG)(a.value).trim().length>=6),d=c?F((0,p.lG)(c.value)).trim():"",e=d?function(a){let b=a.match(/([\u4e00-\u9fa5]{2,8}?(?:镇|乡|县|市|区|街道|村))/u);return b?.[1]}(d):void 0;return e?b.map(a=>{let b=`${a.key||""}${a.fieldName||""}${a.fieldId||""}`,c=F((0,p.lG)(a.value)).trim();if(!c)return a;if(/招标范围|施工范围/u.test(b)){let b=c.split(/[。;;\n]/u).map(a=>a.trim()).filter(Boolean);if(b.length<=1)return _(c,e)?{...a,value:""}:a;let d=b.filter(a=>!_(a,e));return 0===d.length?{...a,value:""}:{...a,value:d.join(";")}}return/项目名称候选|项目名称|工程名称/u.test(b)&&_(c,e)?{...a,value:""}:a}).filter(a=>(0,p.lG)(a.value).trim().length>0):b}async function ac(a,b=[],c=[],d,e=i.p4){a=ab(a);let f=b=>a.filter(a=>b.some(b=>`${a.key} ${a.fieldName||""}`.includes(b))),g=b=>a.filter(a=>a.processingType===b||a.roleId.includes(b)),h=X(a,e),j=Y(a),l=(function(a){let b=[],c=/工程名称|序号|项目编码|项目名称|项目特征|计量\s*单位|工程量|金额|综合单价|合价|人工费|机械费|暂估价|分部小计|本页|续表|合计|汇总/u;for(let d of a){let a=(0,k.locateTableColumns)(d.headers);if((a.name??-1)<0&&(a.feature??-1)<0)continue;let e=(a.seq??-1)>=0;for(let f of d.rows){let g=e?(f[a.seq??0]||"").trim():"",h=(a.name??-1)>=0?(f[a.name??0]||"").trim():"",i=(a.feature??-1)>=0?(f[a.feature??0]||"").trim():"",j=(a.unit??-1)>=0?(f[a.unit??0]||"").trim():"",k=(a.quantity??-1)>=0?(f[a.quantity??0]||"").trim():"";if(e&&!/^\d+$/.test(g)||!h||!i||c.test(`${h}${i}`))continue;let l=k&&j?`${k}${j}`:k||j;b.push({key:`清单条目:${h}`,fieldName:"清单条目",fieldId:"bill_item",objectName:/(?:部位|位置)[::]\s*([^\s,。;、||()()]{1,20})/u.exec(i)?.[1]?.trim()||h,value:`${i.slice(0,160)}${l?`|工程量:${l}`:""}`,sourceFile:d.sourceFile,roleId:"bill_of_quantities",processingType:"bill_of_quantities",confidence:.92,sourceRef:{filePath:d.sourceFile,roleId:"bill_of_quantities",processingType:"bill_of_quantities",sectionTitle:d.sheet}})}}return b})(b).slice(0,600),m=function(a){let b={},c=(a,c,d,e,f)=>{if(!a||!d)return;let g=d.replace(/[,,。\s]+$/u,"").slice(0,40),h=b[a]||=[];h.some(a=>a.location===c&&a.spec===g)||h.push({location:c,spec:g,quantity:e||void 0,sourceFile:f})};for(let b of a){let a=(b.key||"").replace(/^清单条目:/u,"");if(!a)continue;let d=(0,p.lG)(b.value),e=/|工程量:(.+)$/u.exec(d)?.[1]??"",f=d.replace(/|工程量:.+$/u,""),g=function(a){let b=[];for(let c of a.split(/[;;]/u)){let a=c.replace(/^\s*\d+[.、]\s*/u,"").trim(),d=a.search(/[::]/u);if(d>0){let c=a.slice(0,d).trim(),e=a.slice(d+1).trim();c.length>=2&&c.length<=20&&e&&b.push({label:c,value:e})}}return b}(f),h=!1;for(let{label:d,value:f}of g){if(w.some(a=>d.includes(a))){h=!0,c(d,a,f,e,b.sourceFile);continue}let g=f.match(x)?.[0];g&&g!==f&&c(y(g),a,g,e,b.sourceFile)}if(!h)for(let d of f.match(x)||[])c(y(d),a,d,e,b.sourceFile)}return b}(l),n=(function(a){let b=[];for(let c of a){let a=`${c.key||""}${c.fieldName||""}${c.fieldId||""}`,d=(0,p.lG)(c.value);if(/建设规模/u.test(a)&&/占地|用地/u.test(d)&&/建筑面积/u.test(d)){let a=d.search(/(?:总)?占地/u),e=d.search(/(?:单体)?总?建筑面积/u);if(a>=0&&e>a){let f=d.slice(a,e).replace(/^[,,、\s]+/u,"").replace(/[,,、\s]+$/u,"").trim(),g=d.slice(e).trim();if(f&&g){b.push({...c,key:"总占地面积",fieldName:"总占地面积",fieldId:void 0,value:f}),b.push({...c,key:"单体建筑面积",fieldName:"单体建筑面积",value:g});continue}}}b.push(c)}return b})(a.filter(a=>/项目名称|工程名称|项目编号|招标项目编号|招标人|建设单位|发包人|建设地点|建设规模|招标范围|计划工期|合同工期|周期要求|质量标准|合同估算|投资估算|最高投标限价|招标控制价/u.test(`${a.key||""}${a.fieldName||""}${a.fieldId||""}`))).slice(0,80),o=W(a,h,j,e);return{project:n,schedule:f(["工期","开工","竣工","节点","周期"]),quality:f(["质量","验收"]),safety:f(["安全","风险"]),resources:f(["劳动力","材料","机械","设备","资源"]),tables:b,drawings:g("drawing"),bills:j,preciseFacts:h,rules:g("rule"),specifications:g("specification"),schemaFacts:S(a,d),factIndex:o,billItemFacts:l,specAuthorityMap:m,missing:[...new Set(c)],conflicts:await D(a,d,e)}}function ad(a){let b=ab(a.facts),c=a.profile||i.p4,d=a.preciseFacts??X(b,c),e=a.bills??Y(b);return{schemaFacts:S(b,{factFields:a.factFields}),factIndex:W(b,d,e,c)}}},6455:(a,b,c)=>{c.d(b,{AY:()=>C,DZ:()=>B,O5:()=>D,cs:()=>j});var d=c(77598),e=c(11685);let f="tender-clarification-source-group-v2",g="tender-source-group-accounting-v2",h=/^(?:问题|疑问|提问|咨询|质疑|问)[一二三四五六七八九十\d]{0,3}[::]|[??]\s*$/u,i=/(?:请问|请明确|请确认|请澄清)[::]\s*$/u,j=/^(?:回复|答复|答疑|答|澄清|释义)[::]/u,k=RegExp(`(?:^|\\n)${j.source.slice(1)}`,"u"),l=/^[((](\d{1,2}|[一二三四五六七八九十])[))]/u,m=/(?:请问|请明确|请确认|请澄清|(?:^|\n)(?:问题|疑问|提问|咨询|质疑|问)[一二三四五六七八九十\d]{0,3}[::])/u,n=/[??]\s*$/u,o=/[??。!!;;]\s*$/u,p=/^\s*(?:\d{1,3}[..、]|第[一二三四五六七八九十百\d]+[章节条])/u,q=/^[a-f0-9]{64}$/u,r=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),s=a=>(0,d.createHash)("sha256").update(a).digest("hex"),t=a=>r(a);function u(a,b){return r({version:f,groupFingerprint:a.fingerprint,sourceSpans:b})}function v(a){let b=a.versionContext;return a.file&&b?.document.sourceFile===a.file&&q.test(b.sourceIdentity.sourceSha256)&&q.test(b.sourceIdentity.parsedSha256)?b.sourceIdentity:void 0}function w(a,b){let c=v(a),d=v(b),e=a.sourceSpans?.at(-1),f=b.sourceSpans?.[0];return!!(c&&d&&a.file===b.file&&c.sourceSha256===d.sourceSha256&&c.parsedSha256===d.parsedSha256&&e&&f&&e.file===f.file&&void 0!==e.chunkIndex&&void 0!==f.chunkIndex&&f.chunkIndex>=e.chunkIndex&&f.chunkIndex<=e.chunkIndex+1&&(f.chunkIndex!==e.chunkIndex||f.start>=e.end))}function x(a,b){let c=v(a),d=v(b);return!!(c&&d&&a.file===b.file&&c.sourceSha256===d.sourceSha256&&c.parsedSha256===d.parsedSha256)}function y(a,b,c,d){if(!x(a,b)||void 0!==c.sourceGroup||c.file!==a.file||!Array.isArray(c.sourceSpans)||!c.sourceSpans.length||c.sourceSpansSha256!==(0,e.y)(c.sourceSpans))throw Error("问题续行缺少真实同源物理证明");d(c);let f=[...a.sourceSpans??[],...b.sourceSpans??[]],g=a.sourceSpans?.at(-1),h=b.sourceSpans?.[0];if(!g||!h||void 0===g.chunkIndex||void 0===h.chunkIndex||h.chunkIndex<g.chunkIndex||h.chunkIndex===g.chunkIndex&&h.start<g.end)throw Error("问题续行原成员范围逆序或缺失");let i=f.map(a=>c.sourceSpans.flatMap((b,c)=>!function(a,b){let c={...b};return void 0===a.sourceGapBefore&&delete c.sourceGapBefore,void 0===a.sourceNativeTextBridgeBefore&&delete c.sourceNativeTextBridgeBefore,JSON.stringify(c)===JSON.stringify(a)}(a,b)?[]:[c]));if(i.some(a=>1!==a.length)||i.some((a,b)=>b>0&&a[0]<=i[b-1][0])||i[0]?.[0]!==0||i.at(-1)?.[0]!==c.sourceSpans.length-1)throw Error("问题续行证明未完整保留两端原成员spans及原顺序");let j=i[a.sourceSpans.length-1][0],k=i[a.sourceSpans.length][0],l=new Set(i.map(a=>a[0]));if(c.sourceSpans.some((a,b)=>!l.has(b)&&(b<=j||b>=k)))throw Error("问题续行证明借用了原成员之外的正文");let m=c.sourceSpans.slice(j+1,k+1).flatMap(a=>a.sourceNativeTextBridgeBefore?[a.sourceNativeTextBridgeBefore]:[]);if(c.sourceSpans.some((a,b)=>!l.has(b))&&!m.length)throw Error("问题续行新增页布局spans缺少真实原生页面证明");if(m.some(b=>b.file!==a.file||b.sourceSha256!==v(a).sourceSha256)||a.section!==b.section&&!m.length)throw Error("问题续行跨页/栏目缺少本物理文件原生页面证明");if(g.chunkIndex!==h.chunkIndex&&!c.sourceSpans.slice(j+1,k+1).some(a=>a.sourceNativeTextBridgeBefore||a.sourceGapBefore))throw Error("问题续行跨chunk缺少原生页面或真实空白gap证明")}function z(a){let b=k.exec(a);return!!(b&&!a.slice(0,b.index).trim())}function A(a,b,c,d){let e={end:b+1,continuations:[]},f=a[b];if(!v(f)||!f.sourceSpans?.length||k.test(f.text))return e;let g=a[b-1];if(g&&x(g,f)&&m.test(g.text)&&!n.test(g.text)&&!k.test(g.text)&&!m.test(f.text)&&!p.test(f.text)&&!l.test(f.text.trim()))return e;let j=i.test(f.text);if(!j&&!h.test(f.text)&&!m.test(f.text))return e;if(!j){let g=a[b+1];if(h.test(f.text)&&o.test(f.text)&&g&&w(f,g)&&!g.clauseNo&&!g.sourceSpans?.[0]?.logicalBoundaryBefore&&z(g.text))return{end:b+2,continuations:[]};if(!d||n.test(f.text))return e;let i=[],j=b+1;for(;j<a.length;){let f=a[j-1],g=a[j];if(!x(f,g)||g.clauseNo||g.sourceSpans?.[0]?.logicalBoundaryBefore||l.test(g.text.trim())||p.test(g.text))break;let h=function(a){let b=k.exec(a),c=b?a.slice(0,b.index):a;if(!(!c.trim()||b&&!n.test(c)||c.split(/\r?\n/u).some(a=>l.test(a.trim())||p.test(a)||m.test(a))))return{complete:n.test(c),containsReply:!!b}}(g.text);if(!h)break;let o=d.proveContinuation(f,g);if(!o)break;if(y(f,g,o,c),i.push({fromOffset:j-1-b,toOffset:j-b,proofBinding:o}),h.containsReply)return{end:j+1,continuations:i};if(h.complete){let b=a[j+1];return b&&w(g,b)&&!b.clauseNo&&!b.sourceSpans?.[0]?.logicalBoundaryBefore&&z(b.text)?{end:j+2,continuations:i}:e}j+=1}return e}let q=b+1,r=1,s=b+1;for(;q<a.length;){let b=a[q];if(!w(a[q-1],b)||function(a){let b=l.exec(a.trim());if(b)return/^\d+$/u.test(b[1])?Number(b[1]):"一二三四五六七八九十".indexOf(b[1])+1}(b.text)!==r||!h.test(b.text))break;if(k.test(b.text)){q+=1,s=q,r+=1;continue}let c=a[q+1];if(!c||!w(b,c)||c.clauseNo||c.sourceSpans?.[0]?.logicalBoundaryBefore||!z(c.text))break;q+=2,s=q,r+=1}return{end:s,continuations:[]}}function B(a,b){let c=a.sourceGroup;if(!c||c.version!==f||"\n\n"!==c.separator||c.sourceFile!==a.file||!q.test(c.sourceIdentity?.sourceSha256??"")||!q.test(c.sourceIdentity?.parsedSha256??"")||!Array.isArray(c.members)||c.members.length<2||!Array.isArray(c.questionContinuations))throw Error("问答源组缺少当前同源完整成员及投影身份");let d=0,g=new Set;for(let[a,f]of c.members.entries()){if(!Number.isSafeInteger(f.sourceOrdinal)||f.sourceOrdinal<0||g.has(f.sourceOrdinal)||a>0&&f.sourceOrdinal!==c.members[a-1].sourceOrdinal+1||f.file!==c.sourceFile||"string"!=typeof f.text||!f.text.trim()||f.start!==d||f.end!==d+f.text.length||!f.sourceSpans?.length||f.sourceSpansSha256!==(0,e.y)(f.sourceSpans))throw Error("问答源组成员原序号/原文/UTF16投影/原spans身份不一致");b({text:f.text,file:f.file,sourceSpans:f.sourceSpans,sourceSpansSha256:f.sourceSpansSha256}),g.add(f.sourceOrdinal),d=f.end+2*(a<c.members.length-1)}let h=c.members.map(a=>({...a,versionContext:{sourceIdentity:c.sourceIdentity,document:{sourceFile:c.sourceFile,isClarification:!0}}})),i=new Map;for(let a of c.questionContinuations){let d=c.members.find(b=>b.sourceOrdinal===a.fromSourceOrdinal),e=c.members.find(b=>b.sourceOrdinal===a.toSourceOrdinal),f=JSON.stringify([a.fromSourceOrdinal,a.toSourceOrdinal]);if(!d||!e||e.sourceOrdinal!==d.sourceOrdinal+1||i.has(f))throw Error("问题续行证明关联了未知/重复原成员");y(h[c.members.indexOf(d)],h[c.members.indexOf(e)],a.proofBinding,b),i.set(f,a.proofBinding)}let j=A(h,0,b,{proveContinuation:(a,b)=>i.get(JSON.stringify([h.indexOf(a)+c.members[0].sourceOrdinal,h.indexOf(b)+c.members[0].sourceOrdinal]))});if(j.end!==h.length||j.continuations.length!==i.size)throw Error("问答源组成员不是完整结构问题与答复,不能关联未知邻项");let k=c.members.map(a=>a.text).join("\n\n"),l=c.members.flatMap(a=>a.sourceSpans),{fingerprint:m,...n}=c;if(k!==a.text||s(k)!==c.textSha256||r(c.members)!==c.membersSha256||t(n)!==m||JSON.stringify(a.sourceSpans)!==JSON.stringify(l)||a.sourceSpansSha256!==u(c,l))throw Error("问答源组原母投影/成员守恒或独立来源组指纹不一致")}function C(a){if(!a||a.version!==g||!Number.isSafeInteger(a.rawCount)||a.rawCount<0||!Number.isSafeInteger(a.groupCount)||a.groupCount<0||a.reduction!==a.rawCount-a.groupCount||!Array.isArray(a.groups)||a.groups.length!==a.groupCount)throw Error("原始源单元与判审源组账缺失或不闭合");let b=new Set,c=0;if(a.groups.forEach((d,e)=>{if(d.judgmentIndex!==e||!Array.isArray(d.rawOrdinals)||!d.rawOrdinals.length||d.rawOrdinals.length>1&&(!q.test(d.sourceGroupFingerprint??"")||!d.sourceFile?.trim()||!q.test(d.parentFingerprint??"")||!q.test(d.sourceSpansSha256??""))||1===d.rawOrdinals.length&&void 0!==d.sourceGroupFingerprint)throw Error("判审源组缺少其真实原单元组身份");d.rawOrdinals.forEach(d=>{if(!Number.isSafeInteger(d)||d!==c||d>=a.rawCount||b.has(d))throw Error("源组成员没有按完整原始inventory唯一连续覆盖");b.add(d),c+=1})}),b.size!==a.rawCount)throw Error("源组账未保全原始来源分母")}function D(a,b,c){a.forEach(b);let d=[],e=[];for(let g=0;g<a.length;){let h=A(a,g,b,c),i=h.end,j=a.slice(g,i),k=j[0];if(j.length>1){let a=0,c=j.map((b,c)=>{let d={sourceOrdinal:g+c,text:b.text,file:b.file,...void 0===b.section?{}:{section:b.section},...void 0===b.clauseNo?{}:{clauseNo:b.clauseNo},sourceSpans:b.sourceSpans,sourceSpansSha256:b.sourceSpansSha256,start:a,end:a+b.text.length};return a=d.end+2,d}),d=c.map(a=>a.text).join("\n\n"),e={version:f,sourceFile:k.file,sourceIdentity:{...v(k)},separator:"\n\n",members:c,questionContinuations:h.continuations.map(({fromOffset:a,toOffset:b,proofBinding:c})=>({fromSourceOrdinal:g+a,toSourceOrdinal:g+b,proofBinding:c})),textSha256:s(d),membersSha256:r(c)},i={...e,fingerprint:t(e)},l=c.flatMap(a=>a.sourceSpans);B(k={...k,text:d,sourceGroup:i,sourceSpans:l,sourceSpansSha256:u(i,l)},b)}e.push({judgmentIndex:d.length,rawOrdinals:Array.from({length:i-g},(a,b)=>g+b),...k.sourceGroup?{sourceGroupFingerprint:k.sourceGroup.fingerprint,sourceFile:k.sourceGroup.sourceFile,parentFingerprint:k.sourceGroup.textSha256,sourceSpansSha256:k.sourceSpansSha256}:{}}),d.push(k),g=i}let h={version:g,rawCount:a.length,groupCount:d.length,reduction:a.length-d.length,groups:e};return C(h),{clauses:d,accounting:h}}},7148:(a,b,c)=>{c.d(b,{Q0:()=>g,RD:()=>i,Sn:()=>f,eu:()=>d,wA:()=>h});let d={米:"m",m:"m",延长米:"m",公里:"km",千米:"km",km:"km",平方米:"m2",平方:"m2","㎡":"m2","m\xb2":"m2",m2:"m2",立方米:"m3",方:"m3","m\xb3":"m3",m3:"m3",吨:"t",t:"t",千克:"kg",公斤:"kg",kg:"kg"},e=[["m3","m\xb3","立方米","方"],["m2","m\xb2","㎡","平方米"],["m","米","延长米"],["t","吨"],["kg","千克","公斤"],["km","公里","千米"]];function f(a){let b=String(a||"").trim().toLowerCase();return Object.prototype.hasOwnProperty.call(d,b)?d[b]:b}function g(a,b){let c=String(a||"").trim().toLowerCase(),d=String(b||"").trim().toLowerCase();return!c||!d||c===d||f(c)===f(d)||e.some(a=>a.includes(c)&&a.includes(d))}let h="平方米|立方米|m2|m3|m\xb2|m\xb3|㎡|延长米|公里|千米|kg|km|吨|座|个|套|盏|台|根|块|樘|扇|片|组|件|孔|米|m|t",i=[...new Set([...h.split("|"),"日历天","工作日","小时","分钟","个月","毫米","厘米","兆帕","千瓦","万元","亿元","台班","日","周","秒","mm","cm","MPa","kW","天","月","年","人","层","栋","%","%","dB(A)","dB","分贝","℃","\xb0C","kPa","Pa","kN","N","kV","V","A","Hz","rpm","m/s","mm/s","m\xb3/h","m3/h","L/s","μg/m\xb3","μg/m3","mg/m\xb3","mg/m3","克","g","亩","公顷","hm2","hm\xb2","平米","公斤","千克","升","毫升","L","ml","mL","元","度","级","星","辆","Wp","kWp","MWp"])].sort((a,b)=>b.length-a.length).map(a=>a.replace(/[.*+?^${}()|[\]\\]/gu,"\\$&")).join("|")},7661:(a,b,c)=>{c.d(b,{s:()=>i});var d=c(77598),e=c(12866),f=c(59948);let g=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),h=a=>"string"==typeof a?a.replace(/\r\n/gu,"\n").split("\n").map(a=>a.trim()).join("\n"):Array.isArray(a)?a.map(h):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).map(([a,b])=>[a,h(b)])):a;function i(a,b,c,d){if(c.contractId!==a.id||b.contractId!==a.id)throw Error("写作指标的首稿、模型和合同身份不一致");let i=new Map(c.findings.map(a=>[a.criterionId,a])),j=new Map(c.findings.map(a=>[a.criterionId,a.status])),k=a=>"met"===j.get(a)&&["professional","strong"].includes(i.get(a)?.qualityLevel??"unmeasured"),l=a.criteria.filter(a=>a.applicable&&!a.chapterId),m=new Set(c.sourceReviews?.filter(a=>"met"!==a.status).map(a=>a.taskId)),n=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&&!m.has(c.id)&&d.length>0&&d.every(a=>k(a.id))}}),o=a.criteria.filter(a=>a.applicable&&a.sectionId).reduce((a,b)=>a+b.weight,0),p=0,q=0,r=0,s=0,t=0;for(let c of a.sections){let d=b.tasks[c.id];if(!d)continue;let f=b.taskAttempts[c.id]?.firstComplete===!0&&!d.firstCandidate.qualityIssues?.length&&!m.has(c.id),k=new Map(d.firstCandidate.output.units.map(a=>[a.id,a])),l=a.criteria.filter(a=>a.applicable&&a.sectionId===c.id),n=new Set;for(let a of d.current.output.units){s+=1;let m=f&&b.c0TaskHashes?.[c.id]!==null?k.get(a.id):void 0,o=(0,e.renderAuthorUnit)(a).length;q+=o;let p=d.firstCandidate.output.factBindings.filter(b=>b.unitId===a.id),u=d.current.output.factBindings.filter(b=>b.unitId===a.id),v=d.firstCandidate.output.numericBindings?.filter(b=>b.unitId===a.id)??[],w=d.current.output.numericBindings?.filter(b=>b.unitId===a.id)??[],x=l.filter(b=>{let c=i.get(b.id)?.authorUnitIds;return void 0===c?a.criterionIds.includes(b.id):c.includes(a.id)});m&&g(h(m))===g(h(a))&&g(p)===g(u)&&g(v)===g(w)&&x.length>0&&x.every(a=>"met"===j.get(a.id))&&a.criterionIds.every(a=>"met"===j.get(a))&&(n.add(a.id),t+=1,r+=o)}for(let e of a.criteria.filter(a=>a.applicable&&a.sectionId===c.id)){let a=i.get(e.id)?.authorUnitIds,g=(!f||b.c0TaskHashes?.[c.id]===null?[]:d.firstCandidate.output.units).filter(b=>void 0!==a?a.includes(b.id):b.criterionIds.includes(e.id));g.length&&"met"===j.get(e.id)&&(p+=e.weight*g.filter(a=>n.has(a.id)).length/g.length)}}let{missingUsageCalls:u,totalTokens:v,repairTokens:w}=(0,f.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:n,firstPassRate:n.length?n.filter(a=>a.firstQualityPassed).length/n.length:null,documentConditionsPassed:l.every(a=>k(a.id)),unresolvedDocumentCriterionIds:l.filter(a=>!k(a.id)).map(a=>a.id),retention:{fixedWeight:o,retainedWeight:p,conservativeWeightRatio:o?p/o:null,evidencePolicy:"confirmed-applicable-criterion-unit-evidence-v1",currentUnits:s,retainedUnits:t,contentChars:q,retainedContentChars:r,charRatio:q?r/q:null},rework:b.rework,generationTokens:{totalTokens:u?null:v,repairTokens:u?null:w,repairRatio:!u&&v?w/v:null,missingUsageCalls:u,purposePolicy:"首候选后的写作调用及明确轻修保守计入chapter-repair;资料理解、规划和纯审查单独报告"},calibration:"initial-unvalidated",expertValidated:!1}}},7942:(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)}},8014:(a,b,c)=>{c.d(b,{QE:()=>i,cq:()=>h,qd:()=>j,uP:()=>k});var d=c(77598),e=c(17529);let f=a=>(0,d.createHash)("sha256").update(a).digest("hex");function g(a){if((0,e.ky)(a),!Number.isSafeInteger(a.index)||a.index<0||a.parentFingerprint!==f(a.text)||!a.file||!a.sourceSpans?.length||!a.sourceSpansSha256||![a.sourceIdentity?.sourceSha256,a.sourceIdentity?.parsedSha256,a.contextFingerprint].every(a=>"string"==typeof a&&/^[a-f0-9]{64}$/u.test(a)))throw Error("发现证据缺少当前完整母本/原始跨度/来源身份");let b=a.sourceGroup?.members??[{text:a.text,start:0,end:a.text.length,sourceSpans:a.sourceSpans,sourceOrdinal:void 0}],c=0,d=b.map((d,e)=>{let g=d.start,h=b[e+1]?.start??a.text.length;if(a.text.slice(g,d.end)!==d.text||!d.sourceSpans.length||h<d.end||a.text.slice(d.end,h).replace(/\s/gu,""))throw Error("发现证据成员/分隔不属于当前完整原母位置");let i=d.sourceSpans.map(a=>({sourceSpanOrdinal:c++,...void 0===d.sourceOrdinal?{}:{sourceOrdinal:d.sourceOrdinal},file:a.file,...void 0===a.chunkIndex?{}:{chunkIndex:a.chunkIndex},chunkSha256:a.chunkSha256,start:a.start,end:a.end,rawTextSha256:f(a.rawText)})),j=a.text.slice(g,h),k={version:"tender-discovery-source-evidence-v3",index:a.index,parentFingerprint:a.parentFingerprint,file:a.file,sourceIdentity:a.sourceIdentity,contextFingerprint:a.contextFingerprint,sourceSpansSha256:a.sourceSpansSha256,groupFingerprint:a.sourceGroup?.fingerprint,evidenceIndex:e,start:g,end:h,physicalSpans:i};return{evidenceId:`E${a.index}.${e}@${f(JSON.stringify(k)).slice(0,24)}`,evidenceIndex:e,start:g,end:h,quote:j,quoteSha256:f(j),physicalSpans:i}});if(!d.length||0!==d[0].start||d.at(-1).end!==a.text.length||d.map(a=>a.quote).join("")!==a.text)throw Error("发现证据显示未完整覆盖原母,不能裁剪正文");return d}function h(a,b){if(!Array.isArray(b)||!b.length||b.some(a=>"string"!=typeof a||!a)||new Set(b).size!==b.length)throw Error("发现候选必须选择显式唯一当前 evidenceIds,不能复制引文或按位置猜测");let c=new Map(g(a).map(a=>[a.evidenceId,a]));return b.map(a=>{let b=c.get(a);if(!b)throw Error(`发现 evidenceId 不属于当前原母/成员/跨度:${a}`);return b}).sort((a,b)=>a.start-b.start)}function i(a){return{sourceId:`S${a.index}`,section:a.section,clauseNo:a.clauseNo,originalSource:g(a).map(b=>({evidenceRef:`S${a.index}/M${b.evidenceIndex}`,text:b.quote,...b.physicalSpans[0]?.sourceOrdinal===void 0?{}:{memberOrdinal:b.physicalSpans[0].sourceOrdinal}}))}}function j(a,b){let c=new Map(g(a).map(b=>[`S${a.index}/M${b.evidenceIndex}`,b]));if(!Array.isArray(b)||!b.length||b.some(a=>"string"!=typeof a)||new Set(b).size!==b.length)throw Error("发现候选必须选择当前明确提供的唯一evidenceRefs");return b.map(a=>{let b=c.get(a);if(!b)throw Error(`发现evidenceRef不属于当前原母显式成员:${a}`);return b}).sort((a,b)=>a.start-b.start)}function k(a){let b=new Map;for(let c of a)for(let a of g(c)){let d=`S${c.index}/M${a.evidenceIndex}`;if(b.has(d))throw Error("当前批次原文引用身份重复");b.set(d,{unit:c,quote:a})}return a=>{if(!Array.isArray(a)||!a.length||a.some(a=>"string"!=typeof a)||new Set(a).size!==a.length)throw Error("候选必须选择当前明确提供的唯一evidenceRefs");let c=a.map(a=>{let c=b.get(a);if(!c)throw Error(`evidenceRef不属于当前批次真实原文:${a}`);return c}),d=c[0].unit;if(c.some(a=>a.unit!==d))throw Error("一个候选不能混用不同母本引用;按实际独立职责分开提交");return{unit:d,quotes:c.map(a=>a.quote).sort((a,b)=>a.start-b.start)}}}},10025:(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}},10501:(a,b,c)=>{c.d(b,{j:()=>m});var d=c(11628),e=c(14409),f=c(11248),g=c(28068),h=c(31037),i=c(92050),j=c(91898),k=c(57656),l=c(13518);function m(a,b){let c=b.attribute.trim(),m=e.nC.find(a=>a.key===c||a.label===c||a.aliases.includes(c)),n=[...a.facts,...a.sourceControls??[]].filter(a=>(m?(0,e.nD)(a)?.key===m.key:a.fieldId===c||a.fieldName===c||a.key===c)&&(!b.valueDomain||(0,d.IL)(a.value)===b.valueDomain)),o=m&&e.zT.has(m.key),p=n.filter(a=>!b.objectName||a.objectName===b.objectName||o&&"项目主体"===b.objectName&&!a.objectName),q=n.filter(a=>!a.objectName&&!o),r=new Map(p.filter(b=>Object.hasOwn(a.sources,b.resolutionRef?.winnerSourceFile??b.sourceFile)).map(b=>[b,(0,l.Q)(a,b)])),s=p.filter(b=>Object.hasOwn(a.sources,b.sourceFile)&&(0,g.j)(b)&&(!b.resolutionRef||!!(b.resolutionRef.winnerSourceFile&&Object.hasOwn(a.sources,b.resolutionRef.winnerSourceFile)))&&r.get(b)?.status==="eligible"),t=new Set(s.map(a=>(0,f.K3)(a.value))),u=new Set(s.map(a=>a.objectName).filter(Boolean)),v=s.filter(a=>a.controlContext),w=new Map;for(let a of v){let b=a.controlContext,c=JSON.stringify([b.objectName,b.attribute,b.condition,b.baseline,b.relation]),d=w.get(c)??new Set;d.add((0,f.K3)(a.value)),w.set(c,d)}let x=[...w.values()].some(a=>a.size>1),y=p.length&&p.every(a=>"technical_parameter"===a.fieldId),z=y&&p.some(b=>r.get(b)?.status==="eligible"&&(0,h.P)(a,b)),A=n.length?p.some(a=>r.get(a)?.status==="unresolved")?"needs-source-version-decision":s.some(a=>(0,j.p)(a).requiresTechnicalDecision)?"needs-technical-decision":!q.length||b.objectName&&p.length?s.length?x?"ambiguous":v.length===s.length&&(w.size>1||v.some(a=>"exact"!==a.controlContext.relation))?"conditioned":y&&v.length!==s.length?"needs-context-interpretation":t.size>1||!b.objectName&&u.size>1?"ambiguous":"resolved":z?"needs-context-interpretation":"unmeasured":"unbound":"unmeasured",B=[];for(let b of p){let c=b.resolutionRef?.winnerSourceFile??b.sourceFile,f=b.resolutionRef?b.resolutionRef.winnerSourceRef??null:b.sourceRef??null,g={factId:(0,e.vg)(b),...(0,i.mk)(a,(0,e.vg)(b),(0,h.P)(a,b)),objectName:b.objectName??(o?"项目主体":null),attribute:b.fieldId||b.fieldName||b.key,value:b.value,valueDomain:(0,d.IL)(b.value),technicalMeaning:(0,j.p)(b),sourceFile:c,sourceFingerprint:a.sources[c]?.sha256??null,sourceVersionEligibility:r.get(b)??{status:"unmeasured",decisionIds:[],reason:"没有对应当前冻结解析来源身份"},sourceSemantics:b.sourceSemantics??(0,k.Q)(f?.roleId??b.roleId,f?.processingType??b.processingType),sourceRef:f,sourceEvidenceId:(0,h.P)(a,b),resolutionRef:b.resolutionRef??null,derivation:b.derivation??null,temporalConstraint:b.temporalConstraint??null,confidence:b.confidence};B.push({...g,controlContext:b.controlContext??null})}let C=new Set(p.map(b=>(0,h.P)(a,b)).filter(Boolean)),D=(a.sourceControls??[]).filter(a=>C.has((0,e.vg)(a))).map(b=>({sourceEvidenceId:(0,e.vg)(b),...(0,i.mk)(a,void 0,(0,e.vg)(b)),sourceFile:b.sourceFile,chunkIndex:b.sourceRef?.chunkIndex,value:b.value}));return{snapshotId:a.snapshotId,attribute:c,objectName:b.objectName??null,status:A,value:"resolved"===A?s[0].value:null,candidates:B,totalCandidates:p.length,complete:!0,statusScope:"all-matching-facts",unboundCandidates:b.objectName?q.map(a=>(0,e.vg)(a)):[],unboundTotal:q.length,sourceEvidence:D,diagnosis:{phase:n.length?p.length?"needs-source-version-decision"===A?"source-use":"unbound"===A?"object-binding":"needs-technical-decision"===A||"needs-context-interpretation"===A||"conditioned"===A?"control-context":"ambiguous"===A?"value-resolution":s.length?"resolved":"fact-admission":"object-binding":"attribute-extraction",matchingAttributeRecords:n.length,matchingObjectRecords:p.length,qualifiedRecords:s.length,sourceCorpusSearched:!1,provesMissingSource:!1,nextAction:n.length?p.length?"needs-context-interpretation"===A?"完整原文已返回;解释实际对象、属性和条件,不将裸数字多值当作冲突":"conditioned"===A?"按每条完整工况与控制性质分别使用,不压成全项目单值":"resolved"===A?"使用已提供事实及出处,不重复查询同一属性":"核对候选的具体来源、条件或准入原因,未决不表示原文缺料":q.length?"属性候选尚未关联指定对象;按已有原文上下文解释,不要求用户逐项核定":"已有其他对象的属性记录,指定对象未命中;核对具体对象及别名,不能说原文没有数据":"属性库未命中;按本任务具体问题检索冻结原文,不能凭属性零命中认定原文缺料"}}}},10806:(a,b,c)=>{c.d(b,{b:()=>f});var d=c(14409),e=c(28068);function f(a){let{contract:b,section:c,project:f}=a;if(b.projectSnapshotId!==f.snapshotId||!b.sections.some(a=>a.id===c.id&&a.chapterId===c.chapterId))throw Error("作者任务准入不属于当前固定合同和项目快照");let g=b.criteria.filter(a=>a.applicable&&a.admission?.status==="unmeasured"&&(a.sectionId===c.id||!a.sectionId&&a.chapterId===c.chapterId)).map(a=>({...a.admission,reason:a.description,criterionIds:[a.id],factIds:[...a.factIds??[]]}));for(let a of b.criteria.filter(a=>a.applicable&&a.sectionId===c.id))for(let b of a.factIds??[]){let c=[...f.facts,...f.sourceControls??[]].find(a=>(0,d.vg)(a)===b);!(c&&(0,e.j)(c)&&Object.hasOwn(f.sources,c.sourceFile)&&(!c.resolutionRef||c.resolutionRef.winnerSourceFile&&Object.hasOwn(f.sources,c.resolutionRef.winnerSourceFile)))&&(g.some(c=>c.criterionIds.includes(a.id)&&c.factIds.includes(b))||g.push({status:"unmeasured",code:c?.temporalConstraint?.status==="unmeasured"?"unmeasured-temporal-control":"unmeasured-required-fact",effect:a.admission?.effect??"candidate-review",reason:c?.temporalConstraint?.status==="unmeasured"?"本任务引用的开工事件日期或条件尚未核定,不能用于时间断言":"本任务必用事实尚无可直接使用的已确认值",criterionIds:[a.id],factIds:[b]}))}return a.sharedTask&&"planned"!==a.sharedTask.status&&g.push({status:"unmeasured",code:"shared-task-plan-pending",effect:"candidate-review",reason:a.sharedTask.reason??"本任务组织安排尚未确认;可提交有证据的正文候选,实际方法与条件仍须取证",criterionIds:[],factIds:[]}),{contractId:b.id,taskId:c.id,status:g.some(a=>"task-block"===a.effect)?"blocked":g.length?"candidate-review":"ready",issues:g}}},11189:(a,b,c)=>{c.d(b,{X4:()=>j,Yn:()=>i});var d=c(77598),e=c(22496),f=c(26927);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}}))}}},11248:(a,b,c)=>{c.d(b,{Hr:()=>l,K3:()=>m,PQ:()=>q,dP:()=>s,iw:()=>o,tR:()=>r});var d=c(7148);let e=/[A-Za-z0-9%+-.,]/gu,f="[+−-]?\\d+(?:\\.\\d+)?",g="(?:毫米|厘米|米|mm|cm|m)",h=`${f}\\s*(?:${g})?`,i=`(?:${h}\\s*[\xd7xX**]\\s*)+${f}\\s*(?:${g}|\\(${g}\\)|(${g}))`,j=RegExp(`(?<![A-Za-z\\d])(?:${i})(?![A-Za-z\\d])|(?<![A-Za-z\\d])[+−-]?\\d+(?:\\.\\d+)?\\s*(?:\xb0\\s*C|${d.RD})(?![A-Za-z])|(?<![A-Za-z\\d])(?:C[1-9]\\d{1,2}|(?:HRB|HRBF|HPB)\\d{3}[E]?|Q\\d{3}[A-E]?|P\\d{1,2}|M\\d{1,3}(?:\\.\\d+)?|LOD\\s*\\d+(?:\\.\\d+)?|DN\\d+|[Φφ∅⌀\xd8\xf8]\\s*\\d+(?:\\.\\d+)?)(?![A-Za-z\\d])`,"giu");function k(a){let b=a.charCodeAt(0);return b>=65281&&b<=65374?String.fromCharCode(b-65248):a}function l(a){return a.replace(e,k).replace(/−/gu,"-").replace(/\s+/gu,"").replace(/(?<=\d)[~~](?=[+-]?\d)/gu,"~").replace(/[—–‑﹣]/gu,"-").replace(/[×X**]/gu,"x").replace(/[%]/gu,"%").replace(/‰/gu,"permille").replace(/平方米|平方|平米|m²|㎡/giu,"m2").replace(/公顷|hm²/giu,"hm2").replace(/立方米|立方|m³/giu,"m3").replace(/毫升/gu,"ml").replace(/升/gu,"l").replace(/千米|公里/gu,"km").replace(/毫米/gu,"mm").replace(/厘米/gu,"cm").replace(/米/gu,"m").replace(/千克|公斤/gu,"kg").replace(/克/gu,"g").replace(/吨/gu,"t").replace(/人民币万元|万元人民币/gu,"万元").replace(/人民币元|元人民币|¥/gu,"元").replace(/日历天|自然日/gu,"天").replace(/工作日/gu,"工作天").replace(/个月/gu,"月").replace(/小时/gu,"h").replace(/分钟/gu,"min").replace(/兆帕/gu,"mpa").replace(/千帕/gu,"kpa").replace(/千牛/gu,"kn").replace(/牛/gu,"n").replace(/千瓦/gu,"kw").replace(/兆瓦/gu,"mw").replace(/瓦/gu,"w").replace(/千伏/gu,"kv").replace(/伏/gu,"v").replace(/毫安/gu,"ma").replace(/安培|安/gu,"a").replace(/赫兹/gu,"hz").replace(/摄氏度/gu,"℃").replace(/°\s*C/giu,"℃").replace(/百分之\s*(\d+(?:\.\d+)?)/gu,"$1%").replace(/千分之\s*(\d+(?:\.\d+)?)/gu,"$1permille").replace(/直径\s*(\d+(?:\.\d+)?)/gu,"φ$1").replace(/[Φφ]\s*(\d+(?:\.\d+)?)(?:mm)?/giu,"φ$1").replace(/DN\s*(\d+)/giu,"dn$1").replace(/D\s*(\d+)(?=\b|[^a-z0-9])/giu,"d$1").replace(/\b(KN|MPA|KPA|KW|MW|KV|HZ|DN)\b/giu,a=>a.toLowerCase()).replace(/[,,、。;;::||()()【】\]《》<>"“”'‘’[]/gu,"")}function m(a){return l(a).toLowerCase()}function n(a){let b=/^([+-]?\d+)(?:\.(\d+))?$/u.exec(a);if(!b)return a;let c=(b[2]??"").replace(/0+$/u,"");return`${b[1]}${c?`.${c}`:""}`}function o(a){let b=p(a);if(void 0!==b)return b;let c=m(a),d=/^([+-]?\d+(?:\.\d+)?)(.*)$/u.exec(c);return d?`${n(d[1])}${d[2]}`:c}function p(a){let b=a.replace(e,k).replace(/−/gu,"-").trim();if(!RegExp(`^(?:${i})$`,"iu").test(b))return;let c=b.split(/[×xX**]/u).map(a=>m(a)).map(a=>/^([+-]?\d+(?:\.\d+)?)(mm|cm|m)?$/u.exec(a));if(c.some(a=>!a))return;let d=c.at(-1)[2];if(!d)return;let f=c.map(a=>a[2]??d),g=c.map(a=>n(a[1]));return f.every(a=>a===d)?`${g.join("x")}${d}`:g.map((a,b)=>`${a}${f[b]}`).join("x")}function q(a){return[...a.replace(e,k).replace(/−/gu,"-").matchAll(j)].map(b=>{let c=a.slice(b.index,b.index+b[0].length);return{index:b.index,raw:c,value:p(c)??m(c).replace(/^[Φφ∅⌀Øø]/u,"φ")}})}function r(a){return a.replace(e,k).replace(j,a=>p(a)??m(a)).replace(/(?<=\d)[~~](?=[+-]?\d)/gu,"~").replace(/\s+/gu,"")}function s(a,b){let c=r(b);if(!c)return!1;let d=r(a);for(let a=d.indexOf(c);a>=0;a=d.indexOf(c,a+1))if(!(/^[+-]?\d/u.test(c)&&/[\d.+-]/u.test(d[a-1]??""))&&!(/[A-Za-z\d]$/u.test(c)&&/[A-Za-z\d]/u.test(d[a+c.length]??"")))return!0;return!1}},11628:(a,b,c)=>{c.d(b,{De:()=>u,IL:()=>t,XT:()=>k,cT:()=>z,mf:()=>j,pN:()=>g,wI:()=>f});var d=c(7148),e=c(10025);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||"")))}},11685:(a,b,c)=>{c.d(b,{y:()=>e});var d=c(77598);let e=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex")},12152:(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})},12866:(a,b,c)=>{c.d(b,{t3:()=>N,Ix:()=>O,renderAuthorTableRecord:()=>Q,r2:()=>W,renderAuthorUnit:()=>R,validateAuthorTaskOutput:()=>V});var d=c(54233),e=c(71783),f=c(37377),g=c(77598),h=c(7148);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(35091),o=c(14409),p=c(91898),q=c(11248),r=c(92050),s=c(28068),t=c(58214),u=c(57349),v=c(56999),w=c(4456),x=c(10501),y=c(31037),z=c(94173),A=c(10806),B=c(13518);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}
12
12
 
13
- `:"";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")}},12969:(a,b,c)=>{c.d(b,{a:()=>h,n:()=>i});var d=c(27723);let e=a=>a.replace(/\s/gu,"").replace(/[-—]/gu,"-").toUpperCase(),f=a=>e(a).replace(/[《》]/gu,""),g=a=>/^[\s《》(())::,,;;。]*(?:(?:标准)?编号[\s::]*)?[\s《》(())::,,;;。]*$/u.test(a);function h(a,b){let c=b.flatMap(a=>a.units.flatMap(a=>"table"===a.kind?a.rows.map(a=>Object.values(a.cells)):("paragraph"===a.kind?[a.text]:[a.caption,...a.nodes.map(a=>a.label),...a.edges.map(a=>a.label??"")]).map(a=>[a]))),h=[];for(let b of a.uses){let a=b.name?.text,i=b.code?.text,j=[a,i].filter(Boolean).join(" / "),k=!!(a&&i&&/[--—]\s*\d{4}$/u.test(i));(k?c.some(b=>b.some(b=>(function(a,b,c){return(0,d.Z5)(a).some(d=>{if(e(d.code.text)!==e(c))return!1;if(d.name)return e(d.name.text)===e(b);let f=a.indexOf(b);for(;f>=0;){let c=f+b.length;if(c<=d.code.start&&g(a.slice(c,d.code.start))||f>=d.code.end&&g(a.slice(d.code.end,f)))return!0;f=a.indexOf(b,c)}return!1})})(b,a,i))||b.some(b=>f(b)===f(a))&&b.some(b=>(0,d.Z5)(b).some(b=>e(b.code.text)===e(i)&&(!b.name||e(b.name.text)===e(a))))):c.some(b=>(!a||b.some(b=>e(b).includes(e(a))))&&(!i||b.some(a=>(0,d.Z5)(a).some(a=>e(a.code.text)===e(i))))))?k||h.push({rowId:b.id,useIds:[b.id],status:"unmeasured",message:`实际引用${j}已列字面记录,但正文名称、完整编号或版本未明确,完整依据覆盖仍未判定;不得借其他版本补齐`}):h.push({rowId:b.id,useIds:[b.id],status:"not-met",message:`正文实际引用未在编制依据同一记录覆盖:${j};实际位置 ${b.taskId}/${b.unitId}/${b.field}${b.rowId?`/${b.rowId}/${b.columnKey}`:""}`})}return h}function i(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}},13518:(a,b,c)=>{c.d(b,{Q:()=>g,Y:()=>f});var d=c(91898),e=c(44753);function f(a){let b=(0,d.p)(a);return{sourceFile:a.resolutionRef?.winnerSourceFile??a.sourceFile,quote:(a.resolutionRef?.winnerSourceRef??a.sourceRef)?.sourceSpan??a.value,sourceChunkIndex:(a.resolutionRef?.winnerSourceRef??a.sourceRef)?.chunkIndex,usage:"project-fact",attribute:a.fieldId??a.key,objectScope:a.objectName,assertedText:a.value,..."recommended_brand"===a.fieldId?{domain:"procurement-brand"}:"other"!==b.role?{domain:"construction-method"}:{}}}function g(a,b){return(0,e.bz)(a,f(b))}},13571:(a,b,c)=>{function d(a){let b=a.trim(),c=[],d="",e=0,f=!1;for(let a of b)(f="|"===a&&e%2==0)?(c.push(d.trim()),d=""):d+=a,e="\\"===a?e+1:0;return c.push(d.trim()),b.startsWith("|")&&c.shift(),f&&c.pop(),c}function e(a){let b=String(a||"").split("\n"),c=[],e=0;for(;e<b.length;){if(!b[e].trim().startsWith("|")){e+=1;continue}let a=e;for(;e<b.length&&b[e].trim().startsWith("|");)e+=1;let f=b.slice(a,e);if(f.length<3)continue;let g=f.findIndex(a=>/^\|[\s:|-]+\|?$/u.test(a.trim()));if(g<=0)continue;let h=d(f[0]).filter(a=>a.length>0).length;if(h<2)continue;let i=a>0?b[a-1].trim():"",j=/^表\s*[\d一二三四五六七八九十]+/u.test(i)?i:"";for(let b=g+1;b<f.length;b+=1){if(/^\|[\s:|-]+\|?$/u.test(f[b].trim()))continue;let e=d(f[b]).length;e!==h&&c.push({caption:j,line:a+1,expected:h,actual:e,rowLine:a+b+1})}}return c}c.d(b,{ql:()=>e}),c(22157)},13807:(a,b,c)=>{c.d(b,{Su:()=>k,hM:()=>p,jV:()=>o,mo:()=>i,pM:()=>m,rh:()=>l,zm:()=>j});let d=["pause","abort","resume","repair","resize","status","requirement"],e={pause:"暂停生成",abort:"中止生成",resume:"继续生成(修复式续跑)",repair:"定点修复",resize:"调整范围",status:"询问状态",requirement:"补充要求"},f={一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9,十:10};function g(a,b={}){let c={},d=[],e=b.chapters??[],h=a.match(/@([\w.:\-一-龥]+)/u)?.[1];h&&(c.nodeId=h,d.push(`结构化槽位:\`@${h}\``));let i=a.match(/第\s*([一二两三四五六七八九十\d]{1,3})\s*章/u)?.[1];if(i){let a=function(a){let b=a.trim();if(/^\d+$/u.test(b))return Number(b);if(void 0!==f[b])return f[b];let c=b.match(/^十([一二三四五六七八九])?$/u);if(c)return 10+(c[1]?f[c[1]]:0);let d=b.match(/^([二三四五六七八九])十([一二三四五六七八九])?$/u);if(d)return 10*f[d[1]]+(d[2]?f[d[2]]:0)}(i),b=void 0!==a?e[a-1]:void 0;b?(c.chapterId=b.id,c.chapterTitle=b.title,d.push(`结构化槽位:第 ${i} 章 ⇒ 「${b.title}」`)):0===e.length?d.push(`识别到"第 ${i} 章"但当前没有章清单可比对(不猜)`):d.push(`识别到"第 ${i} 章"但超出既有 ${e.length} 章(不猜)`)}else{let b=e.filter(b=>b.title&&a.includes(b.title)).sort((a,b)=>b.title.length-a.title.length);b.length>0&&(c.chapterId=b[0].id,c.chapterTitle=b[0].title,d.push(`结构化槽位:正文点名片名「${b[0].title}」`))}let j=a.match(/第\s*([一二两三四五六七八九十\d]{1,3})\s*块/u)?.[1];j&&(c.blockTitle=`第 ${j} 块`,d.push(`结构化槽位:第 ${j} 块(块序,按章内块序定位)`));let k=[...new Set([...a.matchAll(/\b([a-z][a-z0-9]+(?:-[a-z0-9]+){1,4})\b/gu)].map(a=>a[1]))];if(k.length>0){let a=b.criteriaIds&&b.criteriaIds.length>0?k.filter(a=>b.criteriaIds.includes(a)):k;a.length>0&&(c.criteria=a,d.push(`结构化槽位:判据 id「${a.join("、")}」${b.criteriaIds&&b.criteriaIds.length>0?"(在既有判据清单里)":""}`))}let l=a.match(/(\d+(?:\.\d+)?)\s*万\s*字/u)?.[1],m=a.match(/(\d{3,})\s*字(?!符)/u)?.[1],n=a.match(/(\d{1,3})\s*%/u)?.[1];return l?(c.value=Math.round(1e4*Number(l)),d.push(`结构化槽位:篇幅 ${l} 万字 ⇒ ${c.value} 字`)):m?(c.value=Number(m),d.push(`结构化槽位:篇幅 ${m} 字`)):n&&(c.value=Number(n),d.push(`结构化槽位:比例 ${n}%(按比例调整)`)),{target:c,reasons:d}}let h=[{kind:"abort",pattern:/中止|终止|取消(本次|这次|生成)|不(做了|要了|用写了)|停止生成/u,reason:"规则:中止类措辞"},{kind:"pause",pattern:/暂停|先停|停一下|等一下|缓一缓|别写了/u,reason:"规则:暂停类措辞"},{kind:"resume",pattern:/继续(生成|写|吧|跑)?|接着(写|生成|跑)|恢复生成|再跑(一遍)?|重跑一遍|继续生成/u,reason:"规则:继续类措辞"},{kind:"status",pattern:/现在(在)?(干|做)什么|进度|状态|卡在哪|为什么(卡|停|失败|没|失守)|什么情况|怎么回事|到哪(一步)?了|还要多久/u,reason:"规则:状态问询措辞"},{kind:"repair",pattern:/修复|修一下|修一修|改一下|重写|补写|定向修|按.*修|把.*(改|修|重写)/u,reason:"规则:修复类措辞"},{kind:"resize",pattern:/压到|缩到|缩到|扩到|篇幅|字数(目标|要求|不够|太多)|减(少)?(章|篇)|跳过|先不管|删掉.*章|追加.*章/u,reason:"规则:范围调整措辞"},{kind:"requirement",pattern:/别忘了|记得(写|加|补)|补充(要求|一点|说明)|要求(加上|增加)|注意(写上|补上)|还要(写|加|包含)/u,reason:"规则:补充要求措辞"}];function i(a){return{system:`你是文档生成系统的指令分类器。
13
+ `:"";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")}}},12969:(a,b,c)=>{c.d(b,{a:()=>h,n:()=>i});var d=c(27723);let e=a=>a.replace(/\s/gu,"").replace(/[-—]/gu,"-").toUpperCase(),f=a=>e(a).replace(/[《》]/gu,""),g=a=>/^[\s《》(())::,,;;。]*(?:(?:标准)?编号[\s::]*)?[\s《》(())::,,;;。]*$/u.test(a);function h(a,b){let c=b.flatMap(a=>a.units.flatMap(a=>"table"===a.kind?a.rows.map(a=>Object.values(a.cells)):("paragraph"===a.kind?[a.text]:[a.caption,...a.nodes.map(a=>a.label),...a.edges.map(a=>a.label??"")]).map(a=>[a]))),h=[];for(let b of a.uses){let a=b.name?.text,i=b.code?.text,j=[a,i].filter(Boolean).join(" / "),k=!!(a&&i&&/[--—]\s*\d{4}$/u.test(i));(k?c.some(b=>b.some(b=>(function(a,b,c){return(0,d.Z5)(a).some(d=>{if(e(d.code.text)!==e(c))return!1;if(d.name)return e(d.name.text)===e(b);let f=a.indexOf(b);for(;f>=0;){let c=f+b.length;if(c<=d.code.start&&g(a.slice(c,d.code.start))||f>=d.code.end&&g(a.slice(d.code.end,f)))return!0;f=a.indexOf(b,c)}return!1})})(b,a,i))||b.some(b=>f(b)===f(a))&&b.some(b=>(0,d.Z5)(b).some(b=>e(b.code.text)===e(i)&&(!b.name||e(b.name.text)===e(a))))):c.some(b=>(!a||b.some(b=>e(b).includes(e(a))))&&(!i||b.some(a=>(0,d.Z5)(a).some(a=>e(a.code.text)===e(i))))))?k||h.push({rowId:b.id,useIds:[b.id],status:"unmeasured",message:`实际引用${j}已列字面记录,但正文名称、完整编号或版本未明确,完整依据覆盖仍未判定;不得借其他版本补齐`}):h.push({rowId:b.id,useIds:[b.id],status:"not-met",message:`正文实际引用未在编制依据同一记录覆盖:${j};实际位置 ${b.taskId}/${b.unitId}/${b.field}${b.rowId?`/${b.rowId}/${b.columnKey}`:""}`})}return h}function i(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}},13518:(a,b,c)=>{c.d(b,{Q:()=>g,Y:()=>f});var d=c(91898),e=c(44753);function f(a){let b=(0,d.p)(a);return{sourceFile:a.resolutionRef?.winnerSourceFile??a.sourceFile,quote:(a.resolutionRef?.winnerSourceRef??a.sourceRef)?.sourceSpan??a.value,sourceChunkIndex:(a.resolutionRef?.winnerSourceRef??a.sourceRef)?.chunkIndex,usage:"project-fact",attribute:a.fieldId??a.key,objectScope:a.objectName,assertedText:a.value,..."recommended_brand"===a.fieldId?{domain:"procurement-brand"}:"other"!==b.role?{domain:"construction-method"}:{}}}function g(a,b){return(0,e.bz)(a,f(b))}},13571:(a,b,c)=>{function d(a){let b=a.trim(),c=[],d="",e=0,f=!1;for(let a of b)(f="|"===a&&e%2==0)?(c.push(d.trim()),d=""):d+=a,e="\\"===a?e+1:0;return c.push(d.trim()),b.startsWith("|")&&c.shift(),f&&c.pop(),c}function e(a){let b=String(a||"").split("\n"),c=[],e=0;for(;e<b.length;){if(!b[e].trim().startsWith("|")){e+=1;continue}let a=e;for(;e<b.length&&b[e].trim().startsWith("|");)e+=1;let f=b.slice(a,e);if(f.length<3)continue;let g=f.findIndex(a=>/^\|[\s:|-]+\|?$/u.test(a.trim()));if(g<=0)continue;let h=d(f[0]).filter(a=>a.length>0).length;if(h<2)continue;let i=a>0?b[a-1].trim():"",j=/^表\s*[\d一二三四五六七八九十]+/u.test(i)?i:"";for(let b=g+1;b<f.length;b+=1){if(/^\|[\s:|-]+\|?$/u.test(f[b].trim()))continue;let e=d(f[b]).length;e!==h&&c.push({caption:j,line:a+1,expected:h,actual:e,rowLine:a+b+1})}}return c}c.d(b,{ql:()=>e}),c(22157)},13807:(a,b,c)=>{c.d(b,{Su:()=>k,hM:()=>p,jV:()=>o,mo:()=>i,pM:()=>m,rh:()=>l,zm:()=>j});let d=["pause","abort","resume","repair","resize","status","requirement"],e={pause:"暂停生成",abort:"中止生成",resume:"继续生成(修复式续跑)",repair:"定点修复",resize:"调整范围",status:"询问状态",requirement:"补充要求"},f={一:1,二:2,两:2,三:3,四:4,五:5,六:6,七:7,八:8,九:9,十:10};function g(a,b={}){let c={},d=[],e=b.chapters??[],h=a.match(/@([\w.:\-一-龥]+)/u)?.[1];h&&(c.nodeId=h,d.push(`结构化槽位:\`@${h}\``));let i=a.match(/第\s*([一二两三四五六七八九十\d]{1,3})\s*章/u)?.[1];if(i){let a=function(a){let b=a.trim();if(/^\d+$/u.test(b))return Number(b);if(void 0!==f[b])return f[b];let c=b.match(/^十([一二三四五六七八九])?$/u);if(c)return 10+(c[1]?f[c[1]]:0);let d=b.match(/^([二三四五六七八九])十([一二三四五六七八九])?$/u);if(d)return 10*f[d[1]]+(d[2]?f[d[2]]:0)}(i),b=void 0!==a?e[a-1]:void 0;b?(c.chapterId=b.id,c.chapterTitle=b.title,d.push(`结构化槽位:第 ${i} 章 ⇒ 「${b.title}」`)):0===e.length?d.push(`识别到"第 ${i} 章"但当前没有章清单可比对(不猜)`):d.push(`识别到"第 ${i} 章"但超出既有 ${e.length} 章(不猜)`)}else{let b=e.filter(b=>b.title&&a.includes(b.title)).sort((a,b)=>b.title.length-a.title.length);b.length>0&&(c.chapterId=b[0].id,c.chapterTitle=b[0].title,d.push(`结构化槽位:正文点名片名「${b[0].title}」`))}let j=a.match(/第\s*([一二两三四五六七八九十\d]{1,3})\s*块/u)?.[1];j&&(c.blockTitle=`第 ${j} 块`,d.push(`结构化槽位:第 ${j} 块(块序,按章内块序定位)`));let k=[...new Set([...a.matchAll(/\b([a-z][a-z0-9]+(?:-[a-z0-9]+){1,4})\b/gu)].map(a=>a[1]))];if(k.length>0){let a=b.criteriaIds&&b.criteriaIds.length>0?k.filter(a=>b.criteriaIds.includes(a)):k;a.length>0&&(c.criteria=a,d.push(`结构化槽位:判据 id「${a.join("、")}」${b.criteriaIds&&b.criteriaIds.length>0?"(在既有判据清单里)":""}`))}let l=a.match(/(\d+(?:\.\d+)?)\s*万\s*字/u)?.[1],m=a.match(/(\d{3,})\s*字(?!符)/u)?.[1],n=a.match(/(\d{1,3})\s*%/u)?.[1];return l?(c.value=Math.round(1e4*Number(l)),d.push(`结构化槽位:篇幅 ${l} 万字 ⇒ ${c.value} 字`)):m?(c.value=Number(m),d.push(`结构化槽位:篇幅 ${m} 字`)):n&&(c.value=Number(n),d.push(`结构化槽位:比例 ${n}%(按比例调整)`)),{target:c,reasons:d}}let h=[{kind:"abort",pattern:/中止|终止|取消(本次|这次|生成)|不(做了|要了|用写了)|停止生成/u,reason:"规则:中止类措辞"},{kind:"pause",pattern:/暂停|先停|停一下|等一下|缓一缓|别写了/u,reason:"规则:暂停类措辞"},{kind:"resume",pattern:/继续(生成|写|吧|跑)?|接着(写|生成|跑)|恢复生成|再跑(一遍)?|重跑一遍|继续生成/u,reason:"规则:继续类措辞"},{kind:"status",pattern:/现在(在)?(干|做)什么|进度|状态|卡在哪|为什么(卡|停|失败|没|失守)|什么情况|怎么回事|到哪(一步)?了|还要多久/u,reason:"规则:状态问询措辞"},{kind:"repair",pattern:/修复|修一下|修一修|改一下|重写|补写|定向修|按.*修|把.*(改|修|重写)/u,reason:"规则:修复类措辞"},{kind:"resize",pattern:/压到|缩到|缩到|扩到|篇幅|字数(目标|要求|不够|太多)|减(少)?(章|篇)|跳过|先不管|删掉.*章|追加.*章/u,reason:"规则:范围调整措辞"},{kind:"requirement",pattern:/别忘了|记得(写|加|补)|补充(要求|一点|说明)|要求(加上|增加)|注意(写上|补上)|还要(写|加|包含)/u,reason:"规则:补充要求措辞"}];function i(a){return{system:`你是文档生成系统的指令分类器。
14
14
  把用户的一句话归到下面这组标签里的**恰好一个**;不确定就回 "unknown"。
15
15
  标签集:${d.join(" / ")}
16
16
  pause=暂停;abort=中止;resume=继续生成;repair=修某一处;resize=改篇幅/范围;status=问进度或原因;requirement=补充写作要求。
@@ -46,7 +46,7 @@ ${b.trim()}
46
46
  ${f.join("\n")}
47
47
  ${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)}
48
48
  本任务相关功能指引仅在其被委派的职责内采用:
49
- ${b.map(a=>`${a.label}:${a.guidance}`).join("\n")}`}}},48346:(a,b,c)=>{c.d(b,{E6:()=>f,Zw:()=>e});var d=c(87777);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}))}}},48479:(a,b,c)=>{c.d(b,{Ng:()=>z,Ts:()=>k,Wl:()=>y,bT:()=>u,bg:()=>m,sI:()=>i});var d=c(73024),e=c(51750),f=c(66764),g=c(15762);let h={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 i(a,b,c="completed",d){let e=h[b];y(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:j(b),type:e.type,title:e.title,status:c,..."string"==typeof d&&d.length>0?{metrics:x(d)}:{}})}function j(a){return`phase:${a}`}function k(a){return`chapter:${a}`}let l={running:"running",success:"completed",failed:"failed",partial:"repairing",skipped:"blocked"};function m(a,b={}){let c;try{c=(0,e.g0)(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 g=new Map;for(let a of d.values())a.parentId&&g.set(a.parentId,[...g.get(a.parentId)??[],a]);let h=new Set(["round.decide"]),i=0,j=Date.now(),k=[...d.values()].filter(a=>!n.has(a.status));if(0===k.length)return 0;let l=a=>{let b=0,c=a;for(;c.parentId&&d.has(c.parentId)&&b<64;)c=d.get(c.parentId),b+=1;return b},o=[...k].sort((a,b)=>l(b)-l(a)),p=new Map,q=a=>p.get(a.id)??a.status;for(let c of o){let d=g.get(c.id)??[];if(0===d.length){let d=b.documentOutcome?h.has(c.type)&&"completed"===b.documentOutcome?"completed":"completed"===b.documentOutcome?"blocked":b.documentOutcome:h.has(c.type)?"completed":"running";if("running"===d)continue;(0,e.Rr)(a,{id:c.id,status:d,completedAt:j,metrics:b.documentOutcome?{closedBySweep:!0,closedAtDocumentEnd:!0,documentOutcome:b.documentOutcome}:{closedBySweep:!0,closedRecordNode:!0}},{baseDir:b.baseDir}),p.set(c.id,d),i+=1,b.documentOutcome;continue}if(d.some(a=>!n.has(q(a))))continue;let k=(0,f.TY)(d.map(a=>q(a)))??"completed";(0,e.Rr)(a,{id:c.id,status:k,completedAt:j,metrics:{closedBySweep:!0,closedChildren:d.length,...b.documentOutcome?{closedAtDocumentEnd:!0}:{}}},{baseDir:b.baseDir}),p.set(c.id,k),i+=1}return i}let n=new Set(["completed","failed","blocked","paused"]),o={"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 p(a){let b=a.replace(/[^A-Za-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"");return b.length>0?b.slice(0,48):"none"}function q(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 r(a){return"chapter_generation"===a.type||/^agent-chapter-task-/u.test(a.roleId||"")}let s=globalThis,t=s.__customizeAgentNodeLedgers??=new Map;function u(){t.clear()}function v(a,b){let c=(0,e.M)(a,b),f=t.get(c);if(f&&(0,d.existsSync)(c))return f;let g=(0,e.g0)(a,b),h=new Map,i=0;for(let a of g)h.set(a.id,a.seq),Number.isFinite(a.seq)&&(i=Math.max(i,a.seq+1));let j={nodes:new Map(g.map(a=>[a.id,a])),seqById:h,nextSeq:i};return t.set(c,j),j}function w(a){return"string"==typeof a.title&&a.title.length>0?a.title:String(a.type)}function x(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 y(a,b){let c=function(a){let b=o[a];if(!b)throw new e.fd("node-log-node-invalid",`批次「${String(a)}」未在迁移台账内(S10.1:逐批迁移)。要迁移新的一批:先在 emitNode.ts 的台账注释与 EMIT_NODE_BATCHES 里登记,再改调用点——半个批次(同一事实两个写入者)比不迁移更糟。`);return b}(b.batch),d=b.stage,f=b.baseDir??a.nodeLogBaseDir??a.global?.nodeLogBaseDir,i=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),m=i?v(i,f):void 0,s=d?.roleId,t=b.round,u=b.type??(s&&void 0!==t?"round":void 0)??c.typeByStageType[d?.type??""]??c.fallbackType,y=b.title??(s&&void 0!==t?d?.subtitle??(d?w(d):void 0):void 0)??(d?w(d):void 0)??String(u),z=void 0!==t&&t>1&&!y.includes(`第 ${t} 轮`)?`${y} \xb7 第 ${t} 轮`:y,B=b.status??(d?l[d.status]:void 0)??"running",C=b.progress??d?.progress,D=C&&"completed"===B&&"number"==typeof C.total&&C.total>0&&"number"==typeof C.current&&C.current<C.total?{...C,current:C.total}:C,E=b.issues??function(a){let b=a?.details;if(Array.isArray(b)&&0!==b.length)return b.map(a=>({level:"info",message:a,source:g.BI}))}(d),F={...x(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!==t?{roundIteration:t}:{},...b.metrics??{}};if(!i||!m)return{...void 0!==t?{round:t}:{},skippedNodes:"no-doc-id"};let G=b.id??(d?s&&void 0!==t?`round:${s}`:`st.${p(d.type)}.${p(d.roleId||"none")}.${q(r(d)?[d.type,d.roleId||"",d.promptId||"",d.subtitle||"",d.order??""].join("::"):[d.type,d.roleId||"",d.promptId||""].join("::"))}`:`${p(u)}.${q(`${b.parentId??j(c.phase)}::${z}`)}`),H=b.chapterId??(d&&r(d)?function(a){let b=/^agent-chapter-task-(.+)$/u.exec(a.roleId||"");return b?.[1]}(d):void 0),I=b.parentId??(H?k(H):void 0)??j(c.phase),J=f?{baseDir:f}:{},K=I.startsWith("chapter:")?b.chapterTitle:I.startsWith("round:")?b.parentTitle??d?.subtitle??d?.title:b.parentTitle;!function a(b,c,d,f){if(d.nodes.has(c))return;let g=function(a){let b=/^phase:(.+)$/u.exec(a);if(b){let a=h[b[1]];if(a)return{type:a.type,title:a.title}}return a.startsWith("chapter:")?{type:"chapter",title:a.slice(8),parentId:j("write")}:a.startsWith("round:")?{type:"round",title:a.slice(6),parentId:j("close")}:void 0}(c);if(!g)throw new e.fd("node-log-node-invalid",`parentId「${c}」不是本桥认识的结构化 id(phase:* / chapter:* / round:* 三种前缀)。裸 id 的父节点必须先由某个调用点自己 emit 出来——否则补丁会打在空气上(node-log-patch-target-missing)。要新增结构层:在 parseStructuralId 与 PHASE_ROOTS 里显式登记,不要就地拼字符串。`);g.parentId&&a(b,g.parentId,d,{baseDir:f.baseDir});let i=d.nextSeq;d.nextSeq+=1;let k={id:c,...void 0!==g.parentId?{parentId:g.parentId}:{},type:g.type,title:f.title??g.title,seq:i,status:"running",startedAt:Date.now()};(0,e.tS)(b,k,f.baseDir?{baseDir:f.baseDir}:{}),d.nodes.set(k.id,k),d.seqById.set(k.id,i)}(i,I,m,{...void 0!==K?{title:K}:{},...J});let L=m.nodes.get(G),M=b.startedAt??L?.startedAt??Date.now(),N=void 0!==L&&!n.has(L.status),O=n.has(B)&&!N,P=b.completedAt??(n.has(B)?O?M:Date.now():void 0),Q=O?{...F,instantEvent:!0}:F;if(L){let a={id:G,status:B,...L.title!==z?{title:z}:{},...void 0!==D?{progress:D}:{},...Object.keys(Q).length>0?{metrics:Q}:{},...void 0!==E?{issues:E}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{},...void 0!==P?{completedAt:P}:{}};(0,e.Rr)(i,a,J),m.nodes.set(G,A(L,a))}else{let a={id:G,parentId:I,type:u,title:z,seq:m.nextSeq,status:B,startedAt:M,...void 0!==P?{completedAt:P}:{},...void 0!==D?{progress:D}:{},...Object.keys(Q).length>0?{metrics:Q}:{},...void 0!==E?{issues:E}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{}};return(0,e.tS)(i,a,J),m.seqById.set(G,a.seq),m.nextSeq+=1,m.nodes.set(G,a),{nodeId:G,seq:a.seq,status:B,...void 0!==t?{round:t}:{}}}return{nodeId:G,seq:m.seqById.get(G)??L.seq,status:B,...void 0!==t?{round:t}:{}}}function z(a,b,c){if("string"!=typeof a||0===a.length)return 0;let d=v(a,c),f=c?{baseDir:c}:{},g=Date.now(),h=x(b),i=0;for(let b of[...d.nodes.values()]){if("running"!==b.status)continue;let c={...b.metrics,...h},j={id:b.id,status:"failed",...Object.keys(c).length>0?{metrics:c}:{},completedAt:g};(0,e.Rr)(a,j,f),d.nodes.set(b.id,A(b,j)),i+=1}return i}function A(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),d}},49761:(a,b,c)=>{function d(a){return String(a??"").replace(/[!-~]/gu,a=>String.fromCharCode(a.charCodeAt(0)-65248)).replace(/[\s\u3000,。、;:!?!?…·—\--~~"'`“”‘’()()【】[\]《》<>「」]/gu,"").toLowerCase()}function e(a){return String(a??"").replace(/[,。;:!?]/gu,a=>({",":",","。":".",";":";",":":":","!":"!","?":"?"})[a]??a).replace(/\s+/gu,"")}function f(a,b=()=>""){return{recordEvidenceCall:({tool:b,term:c})=>{if(!a.evidenceCallLog)return;let d=String(c??"").trim();d&&a.evidenceCallLog.push({tool:b,term:d})},declareMissing:({item:c,reason:e,evidence:f})=>{let g=a.evidenceCallLog,h=g?f.filter(a=>!function(a,b){let c=d(a);return!!c&&b.some(a=>{let b=d(a.term);return!!b&&(b.includes(c)||c.includes(b))})}(a,g)):[],i=g&&f.length>0&&h.length===f.length?`;⚠未取证:所列 ${f.length} 处均对不上本块取证记录(本块取证调用 ${g.length} 次)`:"",j=`${b()?`${b()}:`:""}${c}(${e}${f.length>0?`;证据:${f.slice(0,3).join("、")}`:""}${i})`;a.missingItems.push(j),a.missingItemDetails?.push({item:c,reason:e,evidence:[...f],location:b(),at:Date.now()}),a.onIssue?.([((a,b,c,d=a)=>({level:b,severity:c,category:"evidence_coverage",message:a,suggestion:'按缺口说明补资料或在正文中显式声明(`declare_missing` 的出口是"如实说不知道",不是"略过")',provenance:{detectorId:"agent-declare",fingerprint:d}}))(`写作期声明缺料:${j}`,"warning","warning",`declare-missing\u0000${c}`)])},declareUnfixable:({issue:c,reason:d})=>{a.unfixableDeclarations.push({issue:c,reason:d,declaredAt:b(),declaredAtMs:Date.now()}),a.onIssue?.([{...c,message:`写作期声明不可修:${c.message}(${d})`}])},requestClarification:({question:c,blocking:d})=>{let f=e(c);a.clarificationRequests.some(a=>e(a.question)===f)||a.clarificationRequests.push({question:f,blocking:d,askedAt:b(),askedAtMs:Date.now(),status:"pending"}),a.onIssue?.([{level:d?"error":"info",severity:d?"blocker":"suggestion",category:"professional_chain",message:`待答口径裁决(${d?"已挂起等人":"记账继续"}):${f}`,suggestion:"按 A5.2「让人选」形态给出候选与来源后,由人点选;未答前按权威阶梯最高候选先写并复查",provenance:{detectorId:"agent-request-clarification",fingerprint:`clarification\u0000${f}`}}])},listDefects:()=>a.defects()}}c.d(b,{M2:()=>f})},50732:(a,b,c)=>{c.d(b,{f:()=>d});function d(a){let b=a.models.active;if(b){let c=a.models.list.find(a=>a.name===b.name&&a.provider===b.provider);if(!c)throw Error("当前选定模型不在配置列表中,请明确选择后重新开始");if(!a.providers[c.provider])throw Error("当前选定模型的供应商尚未配置;本次不会自动选用其他模型")}return a}},51326:(a,b,c)=>{c.d(b,{O5:()=>r,Q6:()=>n,ST:()=>m,c9:()=>p,er:()=>o,uj:()=>q});var d=c(29281),e=c(60251),f=c(77598),g=c(50732),h=c(12152);let i=new WeakMap,j=new WeakMap,k=new WeakMap,l=new WeakMap;function m(a){if(i.has(a))return;i.set(a,function a(b){if(b&&"object"==typeof b){for(let c of Object.values(b))a(c);Object.freeze(b)}return b}(JSON.parse(JSON.stringify((0,d.I)().load()))));let b=(0,h.C)("documentGeneration")??(0,h.S)()?.sourceFingerprint;b&&k.set(a,b)}function n(a){i.has(a)||m(a);let b=(0,g.f)(i.get(a)),c=b.models.active,d=c&&b.models.list.find(a=>a.name===c.name&&a.provider===c.provider);return(0,f.createHash)("sha256").update(JSON.stringify({active:c,selected:d,provider:d?b.providers[d.provider]:null})).digest("hex")}function o(a,b){i.has(b)||m(b),j.set(a,i.get(b)),l.delete(a);let c=k.get(b);c&&l.set(a,c)}function p(a){if(a??=(0,e.dS)()){let b=j.get(a);if(!b)throw Error("本次模型调用缺少运行开始时冻结的模型配置,不能使用实时配置代替");return(0,g.f)(b)}return(0,g.f)((0,d.I)().load())}function q(a){let b=(a??=(0,e.dS)())&&j.get(a);return b?(0,g.f)(b):void 0}function r(a){return(a??=(0,e.dS)())&&l.get(a)}},51750:(a,b,c)=>{c.d(b,{jq:()=>l,fd:()=>m,tS:()=>t,Rr:()=>u,M:()=>o,pc:()=>v,g0:()=>w});var d=c(73024),e=c(76760),f=c(70949),g=c(66764);let h=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"]),i=new Set(["failed","paused","repairing","blocked","running","pending","completed"]);function j(a){return"string"==typeof a&&i.has(a)}let k=["id","parentId","type","title","seq","status","startedAt","completedAt","progress","metrics","issues","payloadRef"],l=1;class m extends Error{constructor(a,b,c={},d){super(b,d),this.code=a,this.detail=c,this.name="NodeLogError"}}let n=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function o(a,b){var c;return e.join((c=b,e.join(c??(0,f.Gl)(),"drafts")),`${p(a)}.nodes.jsonl`)}function p(a){if("string"!=typeof a||!n.test(a))throw new m("node-log-doc-id-invalid",`文档 id 不合法:「${String(a)}」(须为字母数字开头、仅含字母数字/._-、长度 ≤128)`);return a}function q(a){var b;if(!a||"object"!=typeof a)throw new m("node-log-node-invalid","节点必须是对象");let c=new Set(k),d=Object.keys(a).filter(a=>!c.has(a));if(d.length>0)throw new m("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 m("node-log-node-invalid","节点 id 不得为空(id 是 rollup 视图的聚合键)");if(void 0!==a.parentId&&("string"!=typeof a.parentId||0===a.parentId.length))throw new m("node-log-node-invalid",`节点 ${a.id} 的 parentId 必须是非空字符串`);if(a.parentId===a.id)throw new m("node-log-node-invalid",`节点 ${a.id} 的 parentId 指向自己(自环会让 children 派生进入死循环)`);if(!("string"==typeof(b=a.type)&&h.has(b)))throw new m("node-log-node-invalid",`节点 ${a.id} 的 type「${String(a.type)}」不在 附录 D.1 的闭集内`);if(!j(a.status))throw new m("node-log-node-invalid",`节点 ${a.id} 的 status「${String(a.status)}」不是合法状态`);if("string"!=typeof a.title)throw new m("node-log-node-invalid",`节点 ${a.id} 缺 title(8.4 的"这个节点做了什么"要靠它)`);if(!Number.isFinite(a.seq))throw new m("node-log-node-invalid",`节点 ${a.id} 的 seq 必须是有限数(节流会 splice 掉数组位置,顺序只能靠它)`);if(!Number.isFinite(a.startedAt))throw new m("node-log-node-invalid",`节点 ${a.id} 的 startedAt 必须是有限数`);if(void 0!==a.completedAt&&!Number.isFinite(a.completedAt))throw new m("node-log-node-invalid",`节点 ${a.id} 的 completedAt 必须是有限数`)}function r(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||0===a.id.length)throw new m("node-log-node-invalid","status/rollup 事件必须带非空 id(补丁要打在谁身上)");if(void 0!==a.startedAt)throw new m("node-log-node-invalid",`补丁不得改写 ${a.id} 的 startedAt(存在事实,不是状态)`);if(void 0!==a.status&&!j(a.status))throw new m("node-log-node-invalid",`补丁 ${a.id} 的 status「${String(a.status)}」不是合法状态`);let b=new Set([...k,"id"]);b.delete("startedAt");let c=Object.keys(a).filter(a=>!b.has(a));if(c.length>0)throw new m("node-log-node-invalid",`补丁 ${a.id} 含 8.2 之外的字段:${c.join("/")}`)}function s(a,b){let c,f=p(a.docId),g=o(f,b),h=a.t??Date.now();if("upsert"===a.op){var i;q(a.node),c={v:l,t:h,op:"upsert",node:{id:(i=a.node).id,...void 0!==i.parentId?{parentId:i.parentId}:{},type:i.type,title:i.title,seq:i.seq,status:i.status,startedAt:i.startedAt,...void 0!==i.completedAt?{completedAt:i.completedAt}:{},...void 0!==i.progress?{progress:i.progress}:{},...void 0!==i.metrics?{metrics:i.metrics}:{},...void 0!==i.issues?{issues:i.issues}:{},...void 0!==i.payloadRef?{payloadRef:i.payloadRef}:{}}}}else r(a.node),c={v:l,t:h,op:a.op,node:{...a.node}};let j=`${JSON.stringify(c)}
49
+ ${b.map(a=>`${a.label}:${a.guidance}`).join("\n")}`}}},48346:(a,b,c)=>{c.d(b,{E6:()=>f,Zw:()=>e});var d=c(87777);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}))}}},48479:(a,b,c)=>{c.d(b,{Ng:()=>z,Ts:()=>k,Wl:()=>y,bT:()=>u,bg:()=>m,sI:()=>i});var d=c(73024),e=c(51750),f=c(66764),g=c(15762);let h={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 i(a,b,c="completed",d){let e=h[b];y(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:j(b),type:e.type,title:e.title,status:c,..."string"==typeof d&&d.length>0?{metrics:x(d)}:{}})}function j(a){return`phase:${a}`}function k(a){return`chapter:${a}`}let l={running:"running",success:"completed",failed:"failed",partial:"repairing",skipped:"blocked"};function m(a,b={}){let c;try{c=(0,e.g0)(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 g=new Map;for(let a of d.values())a.parentId&&g.set(a.parentId,[...g.get(a.parentId)??[],a]);let h=new Set(["round.decide"]),i=0,j=Date.now(),k=[...d.values()].filter(a=>!n.has(a.status));if(0===k.length)return 0;let l=a=>{let b=0,c=a;for(;c.parentId&&d.has(c.parentId)&&b<64;)c=d.get(c.parentId),b+=1;return b},o=[...k].sort((a,b)=>l(b)-l(a)),p=new Map,q=a=>p.get(a.id)??a.status;for(let c of o){let d=g.get(c.id)??[];if(0===d.length){let d=b.documentOutcome?h.has(c.type)&&"completed"===b.documentOutcome?"completed":"completed"===b.documentOutcome?"blocked":b.documentOutcome:h.has(c.type)?"completed":"running";if("running"===d)continue;(0,e.Rr)(a,{id:c.id,status:d,completedAt:j,metrics:b.documentOutcome?{closedBySweep:!0,closedAtDocumentEnd:!0,documentOutcome:b.documentOutcome}:{closedBySweep:!0,closedRecordNode:!0}},{baseDir:b.baseDir}),p.set(c.id,d),i+=1,b.documentOutcome;continue}if(d.some(a=>!n.has(q(a))))continue;let k=(0,f.TY)(d.map(a=>q(a)))??"completed";(0,e.Rr)(a,{id:c.id,status:k,completedAt:j,metrics:{closedBySweep:!0,closedChildren:d.length,...b.documentOutcome?{closedAtDocumentEnd:!0}:{}}},{baseDir:b.baseDir}),p.set(c.id,k),i+=1}return i}let n=new Set(["completed","failed","blocked","paused"]),o={"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 p(a){let b=a.replace(/[^A-Za-z0-9._-]+/gu,"-").replace(/^-+|-+$/gu,"");return b.length>0?b.slice(0,48):"none"}function q(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 r(a){return"chapter_generation"===a.type||/^agent-chapter-task-/u.test(a.roleId||"")}let s=globalThis,t=s.__customizeAgentNodeLedgers??=new Map;function u(){t.clear()}function v(a,b){let c=(0,e.M)(a,b),f=t.get(c);if(f&&(0,d.existsSync)(c))return f;let g=(0,e.g0)(a,b),h=new Map,i=0;for(let a of g)h.set(a.id,a.seq),Number.isFinite(a.seq)&&(i=Math.max(i,a.seq+1));let j={nodes:new Map(g.map(a=>[a.id,a])),seqById:h,nextSeq:i};return t.set(c,j),j}function w(a){return"string"==typeof a.title&&a.title.length>0?a.title:String(a.type)}function x(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 y(a,b){let c=function(a){let b=o[a];if(!b)throw new e.fd("node-log-node-invalid",`批次「${String(a)}」未在迁移台账内(S10.1:逐批迁移)。要迁移新的一批:先在 emitNode.ts 的台账注释与 EMIT_NODE_BATCHES 里登记,再改调用点——半个批次(同一事实两个写入者)比不迁移更糟。`);return b}(b.batch),d=b.stage,f=b.baseDir??a.nodeLogBaseDir??a.global?.nodeLogBaseDir,i=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),m=i?v(i,f):void 0,s=d?.roleId,t=b.round,u=b.type??(s&&void 0!==t?"round":void 0)??c.typeByStageType[d?.type??""]??c.fallbackType,y=b.title??(s&&void 0!==t?d?.subtitle??(d?w(d):void 0):void 0)??(d?w(d):void 0)??String(u),z=void 0!==t&&t>1&&!y.includes(`第 ${t} 轮`)?`${y} \xb7 第 ${t} 轮`:y,B=b.status??(d?l[d.status]:void 0)??"running",C=b.progress??d?.progress,D=C&&"completed"===B&&"number"==typeof C.total&&C.total>0&&"number"==typeof C.current&&C.current<C.total?{...C,current:C.total}:C,E=b.issues??function(a){let b=a?.details;if(Array.isArray(b)&&0!==b.length)return b.map(a=>({level:"info",message:a,source:g.BI}))}(d),F={...x(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!==t?{roundIteration:t}:{},...b.metrics??{}};if(!i||!m)return{...void 0!==t?{round:t}:{},skippedNodes:"no-doc-id"};let G=b.id??(d?s&&void 0!==t?`round:${s}`:`st.${p(d.type)}.${p(d.roleId||"none")}.${q(r(d)?[d.type,d.roleId||"",d.promptId||"",d.subtitle||"",d.order??""].join("::"):[d.type,d.roleId||"",d.promptId||""].join("::"))}`:`${p(u)}.${q(`${b.parentId??j(c.phase)}::${z}`)}`),H=b.chapterId??(d&&r(d)?function(a){let b=/^agent-chapter-task-(.+)$/u.exec(a.roleId||"");return b?.[1]}(d):void 0),I=b.parentId??(H?k(H):void 0)??j(c.phase),J=f?{baseDir:f}:{},K=I.startsWith("chapter:")?b.chapterTitle:I.startsWith("round:")?b.parentTitle??d?.subtitle??d?.title:b.parentTitle;!function a(b,c,d,f){if(d.nodes.has(c))return;let g=function(a){let b=/^phase:(.+)$/u.exec(a);if(b){let a=h[b[1]];if(a)return{type:a.type,title:a.title}}return a.startsWith("chapter:")?{type:"chapter",title:a.slice(8),parentId:j("write")}:a.startsWith("round:")?{type:"round",title:a.slice(6),parentId:j("close")}:void 0}(c);if(!g)throw new e.fd("node-log-node-invalid",`parentId「${c}」不是本桥认识的结构化 id(phase:* / chapter:* / round:* 三种前缀)。裸 id 的父节点必须先由某个调用点自己 emit 出来——否则补丁会打在空气上(node-log-patch-target-missing)。要新增结构层:在 parseStructuralId 与 PHASE_ROOTS 里显式登记,不要就地拼字符串。`);g.parentId&&a(b,g.parentId,d,{baseDir:f.baseDir});let i=d.nextSeq;d.nextSeq+=1;let k={id:c,...void 0!==g.parentId?{parentId:g.parentId}:{},type:g.type,title:f.title??g.title,seq:i,status:"running",startedAt:Date.now()};(0,e.tS)(b,k,f.baseDir?{baseDir:f.baseDir}:{}),d.nodes.set(k.id,k),d.seqById.set(k.id,i)}(i,I,m,{...void 0!==K?{title:K}:{},...J});let L=m.nodes.get(G),M=b.startedAt??L?.startedAt??Date.now(),N=void 0!==L&&!n.has(L.status),O=n.has(B)&&!N,P=b.completedAt??(n.has(B)?O?M:Date.now():void 0),Q=O?{...F,instantEvent:!0}:F;if(L){let a={id:G,status:B,...L.title!==z?{title:z}:{},...void 0!==D?{progress:D}:{},...Object.keys(Q).length>0?{metrics:Q}:{},...void 0!==E?{issues:E}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{},...void 0!==P?{completedAt:P}:{}};(0,e.Rr)(i,a,J),m.nodes.set(G,A(L,a))}else{let a={id:G,parentId:I,type:u,title:z,seq:m.nextSeq,status:B,startedAt:M,...void 0!==P?{completedAt:P}:{},...void 0!==D?{progress:D}:{},...Object.keys(Q).length>0?{metrics:Q}:{},...void 0!==E?{issues:E}:{},...void 0!==b.payloadRef?{payloadRef:b.payloadRef}:{}};return(0,e.tS)(i,a,J),m.seqById.set(G,a.seq),m.nextSeq+=1,m.nodes.set(G,a),{nodeId:G,seq:a.seq,status:B,...void 0!==t?{round:t}:{}}}return{nodeId:G,seq:m.seqById.get(G)??L.seq,status:B,...void 0!==t?{round:t}:{}}}function z(a,b,c){if("string"!=typeof a||0===a.length)return 0;let d=v(a,c),f=c?{baseDir:c}:{},g=Date.now(),h=x(b),i=0;for(let b of[...d.nodes.values()]){if("running"!==b.status)continue;let c={...b.metrics,...h},j={id:b.id,status:"failed",...Object.keys(c).length>0?{metrics:c}:{},completedAt:g};(0,e.Rr)(a,j,f),d.nodes.set(b.id,A(b,j)),i+=1}return i}function A(a,b){let c=Object.fromEntries(Object.entries(b).filter(([,a])=>void 0!==a)),d={...a,...c,id:a.id,startedAt:a.startedAt};return void 0!==c.metrics&&void 0!==a.metrics&&(d.metrics={...a.metrics,...c.metrics}),d}},49761:(a,b,c)=>{function d(a){return String(a??"").replace(/[!-~]/gu,a=>String.fromCharCode(a.charCodeAt(0)-65248)).replace(/[\s\u3000,。、;:!?!?…·—\--~~"'`“”‘’()()【】[\]《》<>「」]/gu,"").toLowerCase()}function e(a){return String(a??"").replace(/[,。;:!?]/gu,a=>({",":",","。":".",";":";",":":":","!":"!","?":"?"})[a]??a).replace(/\s+/gu,"")}function f(a,b=()=>""){return{recordEvidenceCall:({tool:b,term:c})=>{if(!a.evidenceCallLog)return;let d=String(c??"").trim();d&&a.evidenceCallLog.push({tool:b,term:d})},declareMissing:({item:c,reason:e,evidence:f})=>{let g=a.evidenceCallLog,h=g?f.filter(a=>!function(a,b){let c=d(a);return!!c&&b.some(a=>{let b=d(a.term);return!!b&&(b.includes(c)||c.includes(b))})}(a,g)):[],i=g&&f.length>0&&h.length===f.length?`;⚠未取证:所列 ${f.length} 处均对不上本块取证记录(本块取证调用 ${g.length} 次)`:"",j=`${b()?`${b()}:`:""}${c}(${e}${f.length>0?`;证据:${f.slice(0,3).join("、")}`:""}${i})`;a.missingItems.push(j),a.missingItemDetails?.push({item:c,reason:e,evidence:[...f],location:b(),at:Date.now()}),a.onIssue?.([((a,b,c,d=a)=>({level:b,severity:c,category:"evidence_coverage",message:a,suggestion:'按缺口说明补资料或在正文中显式声明(`declare_missing` 的出口是"如实说不知道",不是"略过")',provenance:{detectorId:"agent-declare",fingerprint:d}}))(`写作期声明缺料:${j}`,"warning","warning",`declare-missing\u0000${c}`)])},declareUnfixable:({issue:c,reason:d})=>{a.unfixableDeclarations.push({issue:c,reason:d,declaredAt:b(),declaredAtMs:Date.now()}),a.onIssue?.([{...c,message:`写作期声明不可修:${c.message}(${d})`}])},requestClarification:({question:c,blocking:d})=>{let f=e(c);a.clarificationRequests.some(a=>e(a.question)===f)||a.clarificationRequests.push({question:f,blocking:d,askedAt:b(),askedAtMs:Date.now(),status:"pending"}),a.onIssue?.([{level:d?"error":"info",severity:d?"blocker":"suggestion",category:"professional_chain",message:`待答口径裁决(${d?"已挂起等人":"记账继续"}):${f}`,suggestion:"按 A5.2「让人选」形态给出候选与来源后,由人点选;未答前按权威阶梯最高候选先写并复查",provenance:{detectorId:"agent-request-clarification",fingerprint:`clarification\u0000${f}`}}])},listDefects:()=>a.defects()}}c.d(b,{M2:()=>f})},50732:(a,b,c)=>{c.d(b,{f:()=>d});function d(a){let b=a.models.active;if(b){let c=a.models.list.find(a=>a.name===b.name&&a.provider===b.provider);if(!c)throw Error("当前选定模型不在配置列表中,请明确选择后重新开始");if(!a.providers[c.provider])throw Error("当前选定模型的供应商尚未配置;本次不会自动选用其他模型")}return a}},51326:(a,b,c)=>{c.d(b,{O5:()=>r,Q6:()=>n,ST:()=>m,c9:()=>p,er:()=>o,uj:()=>q});var d=c(29281),e=c(60251),f=c(77598),g=c(50732),h=c(12152);let i=new WeakMap,j=new WeakMap,k=new WeakMap,l=new WeakMap;function m(a){if(i.has(a))return;i.set(a,function a(b){if(b&&"object"==typeof b){for(let c of Object.values(b))a(c);Object.freeze(b)}return b}(JSON.parse(JSON.stringify((0,d.I)().load()))));let b=(0,h.C)("documentGeneration")??(0,h.S)()?.sourceFingerprint;b&&k.set(a,b)}function n(a){i.has(a)||m(a);let b=(0,g.f)(i.get(a)),c=b.models.active,d=c&&b.models.list.find(a=>a.name===c.name&&a.provider===c.provider);return(0,f.createHash)("sha256").update(JSON.stringify({active:c,selected:d,provider:d?b.providers[d.provider]:null})).digest("hex")}function o(a,b){i.has(b)||m(b),j.set(a,i.get(b)),l.delete(a);let c=k.get(b);c&&l.set(a,c)}function p(a){if(a??=(0,e.dS)()){let b=j.get(a);if(!b)throw Error("本次模型调用缺少运行开始时冻结的模型配置,不能使用实时配置代替");return(0,g.f)(b)}return(0,g.f)((0,d.I)().load())}function q(a){let b=(a??=(0,e.dS)())&&j.get(a);return b?(0,g.f)(b):void 0}function r(a){return(a??=(0,e.dS)())&&l.get(a)}},51750:(a,b,c)=>{c.d(b,{jq:()=>l,fd:()=>m,tS:()=>t,Rr:()=>u,M:()=>o,pc:()=>v,g0:()=>w});var d=c(73024),e=c(76760),f=c(70949),g=c(66764);let h=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"]),i=new Set(["failed","paused","repairing","blocked","running","pending","completed"]);function j(a){return"string"==typeof a&&i.has(a)}let k=["id","parentId","type","title","seq","status","startedAt","completedAt","progress","metrics","issues","payloadRef"],l=1;class m extends Error{constructor(a,b,c={},d){super(b,d),this.code=a,this.detail=c,this.name="NodeLogError"}}let n=/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/u;function o(a,b){var c;return e.join((c=b,e.join(c??(0,f.Gl)(),"drafts")),`${p(a)}.nodes.jsonl`)}function p(a){if("string"!=typeof a||!n.test(a))throw new m("node-log-doc-id-invalid",`文档 id 不合法:「${String(a)}」(须为字母数字开头、仅含字母数字/._-、长度 ≤128)`);return a}function q(a){var b;if(!a||"object"!=typeof a)throw new m("node-log-node-invalid","节点必须是对象");let c=new Set(k),d=Object.keys(a).filter(a=>!c.has(a));if(d.length>0)throw new m("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 m("node-log-node-invalid","节点 id 不得为空(id 是 rollup 视图的聚合键)");if(void 0!==a.parentId&&("string"!=typeof a.parentId||0===a.parentId.length))throw new m("node-log-node-invalid",`节点 ${a.id} 的 parentId 必须是非空字符串`);if(a.parentId===a.id)throw new m("node-log-node-invalid",`节点 ${a.id} 的 parentId 指向自己(自环会让 children 派生进入死循环)`);if(!("string"==typeof(b=a.type)&&h.has(b)))throw new m("node-log-node-invalid",`节点 ${a.id} 的 type「${String(a.type)}」不在 附录 D.1 的闭集内`);if(!j(a.status))throw new m("node-log-node-invalid",`节点 ${a.id} 的 status「${String(a.status)}」不是合法状态`);if("string"!=typeof a.title)throw new m("node-log-node-invalid",`节点 ${a.id} 缺 title(8.4 的"这个节点做了什么"要靠它)`);if(!Number.isFinite(a.seq))throw new m("node-log-node-invalid",`节点 ${a.id} 的 seq 必须是有限数(节流会 splice 掉数组位置,顺序只能靠它)`);if(!Number.isFinite(a.startedAt))throw new m("node-log-node-invalid",`节点 ${a.id} 的 startedAt 必须是有限数`);if(void 0!==a.completedAt&&!Number.isFinite(a.completedAt))throw new m("node-log-node-invalid",`节点 ${a.id} 的 completedAt 必须是有限数`)}function r(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||0===a.id.length)throw new m("node-log-node-invalid","status/rollup 事件必须带非空 id(补丁要打在谁身上)");if(void 0!==a.startedAt)throw new m("node-log-node-invalid",`补丁不得改写 ${a.id} 的 startedAt(存在事实,不是状态)`);if(void 0!==a.status&&!j(a.status))throw new m("node-log-node-invalid",`补丁 ${a.id} 的 status「${String(a.status)}」不是合法状态`);let b=new Set([...k,"id"]);b.delete("startedAt");let c=Object.keys(a).filter(a=>!b.has(a));if(c.length>0)throw new m("node-log-node-invalid",`补丁 ${a.id} 含 8.2 之外的字段:${c.join("/")}`)}function s(a,b){let c,f=p(a.docId),g=o(f,b),h=a.t??Date.now();if("upsert"===a.op){var i;q(a.node),c={v:l,t:h,op:"upsert",node:{id:(i=a.node).id,...void 0!==i.parentId?{parentId:i.parentId}:{},type:i.type,title:i.title,seq:i.seq,status:i.status,startedAt:i.startedAt,...void 0!==i.completedAt?{completedAt:i.completedAt}:{},...void 0!==i.progress?{progress:i.progress}:{},...void 0!==i.metrics?{metrics:i.metrics}:{},...void 0!==i.issues?{issues:i.issues}:{},...void 0!==i.payloadRef?{payloadRef:i.payloadRef}:{}}}}else r(a.node),c={v:l,t:h,op:a.op,node:{...a.node}};let j=`${JSON.stringify(c)}
50
50
  `;try{d.mkdirSync(e.dirname(g),{recursive:!0}),d.appendFileSync(g,j,"utf8")}catch(a){throw new m("node-log-write-failed",`节点日志写入失败(S3.2:节点日志是唯一真相源,不可静默丢 ⇒ 停止生成并上报):${g}:${a instanceof Error?a.message:String(a)}`,{docId:f,file:g},{cause:a})}return c}function t(a,b,c={}){return s({docId:a,op:"upsert",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function u(a,b,c={}){return s({docId:a,op:"status",node:b,...void 0!==c.t?{t:c.t}:{}},c.baseDir)}function v(a,b){let c,e=p(a),f=o(e,b);try{c=d.readFileSync(f,"utf8")}catch(a){if("ENOENT"===a.code)return{nodes:[],records:[],lineCount:0,tornTail:!1};throw a}let h=c.endsWith("\n"),i=!h&&c.length>0,j=c.lastIndexOf("\n"),k=h?c.slice(0,-1):j>=0?c.slice(0,j):"",n=""===k?[]:k.split("\n"),s=[];for(let a=0;a<n.length;a+=1){let b,c=n[a];if(""!==c.trim()){try{b=JSON.parse(c)}catch(b){throw new m("node-log-corrupt",`节点日志第 ${a+1} 行不是合法 JSON(文件损坏或被外部改写):${f}`,{docId:e,file:f,line:a+1},{cause:b})}s.push(function(a,b,c,d){let e=(a,e)=>new m("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(a.v!==l)throw e(`版本 v=${String(a.v)} 无法识别(本版本只认 ${l})`);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 q(a.node),{v:l,t:a.t,op:"upsert",node:a.node};return r(a.node),{v:l,t:a.t,op:a.op,node:a.node}}catch(a){throw e(`的 node 不合法(${a instanceof Error?a.message:String(a)})`,a)}}(b,e,f,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 m("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(g.o3)}(s,e,f),records:s,lineCount:n.length,tornTail:i}}function w(a,b){return v(a,b).nodes}},52639:(a,b,c)=>{c.d(b,{$O:()=>B,Lf:()=>t,SD:()=>z,_C:()=>A,b2:()=>u,iJ:()=>C});var d=c(71001);let e="[☑√✔✓■●◼☒⊠▣]",f="[\\uFE0E\\uFE0F\\s()()【】\\[\\]〔〕]*";function g(a){let b=[...a],c=`${b[0]}\\s*${b[1]}`;return[RegExp(`${e}${f}${c}`,"u"),RegExp(`${c}${f}${e}`,"u")]}let h=g("暗标"),i=g("明标");function j(a,b){for(let c of b){let b=c.exec(a);if(b)return(b[0]||"").trim()}}let k={初号:42,小初:36,一号:26,小一:24,二号:22,小二:18,三号:16,小三:15,四号:14,小四:12,五号:10.5,小五:9,六号:7.5,小六:6.5};function l(a){let b=String(a||"").replace(/[((][^))]*[))]/gu,"").trim();if(b)return({仿宋_GB2312:'"仿宋_GB2312", "FangSong_GB2312", "仿宋", FangSong, serif',仿宋:'"仿宋", FangSong, serif',楷体_GB2312:'"楷体_GB2312", "KaiTi_GB2312", "楷体", KaiTi, serif',楷体:'"楷体", KaiTi, serif',宋体:'"宋体", SimSun, serif',黑体:'"黑体", SimHei, sans-serif'})[b]||`"${b}", serif`}function m(a){let b=String(a||"").replace(/\s+/gu,"");if(!b)return;let c=k[b];if(void 0!==c)return`${c}pt`;let d=/([\d.]+)\s*(?:pt|磅)?/iu.exec(b);return d&&Number.isFinite(Number(d[1]))?`${Number(d[1])}pt`:void 0}let n=/(?:纸张|纸型|用纸)\s*(?:规格|大小|型号)?\s*[::]?\s*(A3|A4|A5)\b|(A3|A4|A5)\s*(?:幅面|纸型|纸张)/iu,o=String.raw`([\d.]+\s*(?:cm|mm|厘米|毫米|inch|in|英寸|pt|磅))`,p=/(?:全文|通篇|全篇|统一|一律)[^。;;\n]{0,8}(?:采用|使用|为|用)\s*([一-鿿A-Za-z_0-9]{2,10})\s*字?体/u,q=/(?:不少于|不低于|至少|最少)\s*(\d{1,4})\s*页/u,r=[/(?:总页数|页数|篇幅)\s*(?:约|大约|控制在)?\s*(\d{1,4})\s*页/u,/(\d{1,4})\s*页左右/u],s=[/(?:总页数|页数|篇幅)\s*上限\s*[::]?\s*(\d{1,4})\s*页/u,/(?:不得超过|不超过|不得超出|不得超|不高于)\s*[::]?\s*(\d{1,4})\s*页/u];function t(a,b){if(!b)return{settings:a,applied:[]};let c=[],d={...a||{}},e={...d.page||{}},f={...d.typography||{}},g={...d.targetPages||{}},h=l(b.bodyFont);h&&(f.bodyFont=h,c.push(`正文字体=${h}`));let i=l(b.headingFont);i&&(f.headingFont=i,c.push(`标题字体=${i}`));let j=m(b.bodySize);j&&(f.bodySize=j,c.push(`正文字号=${j}`));let k=m(b.headingSize);k&&(f.titleSize=k,c.push(`标题字号=${k}`));let n=function(a){let b=/([\d.]+)/u.exec(String(a||""));return b&&Number.isFinite(Number(b[1]))?`${Number(b[1])}pt`:void 0}(b.lineHeight);if(n&&(f.lineHeight=n,c.push(`行距=${n}`)),b.gutter&&(e.gutter=b.gutter,c.push(`装订线=${b.gutter}`)),"number"==typeof b.pageLimit&&b.pageLimit>0&&(g.max=b.pageLimit,c.push(`页数上限=${b.pageLimit}`)),!h&&!i){let a=l(b.fontFamily);a&&(f.fontFamily=a,c.push(`通用字体=${a}`))}for(let[a,d,f]of(b.paper&&(e.paper=b.paper,c.push(`纸张=${b.paper}`)),[["marginTop",b.marginTop,"上"],["marginRight",b.marginRight,"右"],["marginBottom",b.marginBottom,"下"],["marginLeft",b.marginLeft,"左"]]))d&&(e[a]=d,c.push(`${f}边距=${d}`));return"number"==typeof b.pageMin&&b.pageMin>0&&(g.min=b.pageMin,c.push(`页数下限=${b.pageMin}`)),"number"==typeof b.pageTarget&&b.pageTarget>0&&(g.target=b.pageTarget,c.push(`目标页数=${b.pageTarget}`)),d.page=e,d.typography=f,Object.keys(g).length>0&&(d.targetPages=g),{settings:d,applied:c}}function u(a){return t(void 0,a).settings}function v(a,b){let c=b.exec(a);return c?(c[0]||"").trim():void 0}let w=[/正文(?:部分)?[\s\S]{0,16}?(?:不得|不允许|禁止|严禁)[\s\S]{0,16}?(?:使用|出现|插入|包含|采用|列入|设置|添加|附带|有|存在)[\s\S]{0,8}?(?:任何|所有|全部|其它|其他)?(?:表格|图表|框图)/u,/(?:不得|不允许|禁止|严禁)[\s\S]{0,10}?(?:在)?正文(?:部分|中|内|里)?[\s\S]{0,10}?(?:使用|出现|插入|包含|采用|列入|设置|添加|附带|有|存在)[\s\S]{0,8}?(?:任何|所有|全部|其它|其他)?(?:表格|图表|框图)/u,/(?:任何|所有|全部|其它|其他)?(?:表格|图表|框图)[\s\S]{0,16}?(?:一律|均|全部|都)?(?:不得|不允许|禁止|严禁)[\s\S]{0,12}?(?:出现|写入|进入|列入|使用|用于|插入)[\s\S]{0,12}?正文/u,/正文(?:部分)?[\s\S]{0,12}?(?:一律|均|只能|仅)[\s\S]{0,8}?(?:纯文字|文字表述|文字叙述|文字描述)(?![\s\S]{0,2}?(?:结合|及|与|和))/u],x=/颜色|彩色|单色|黑白|无关|不相干|非文字需要/u,y=[/文字(?:表述|叙述|说明|描述)?[\s\S]{0,4}?(?:结合|相结合)[\s\S]{0,4}?(?:图表|表格|框图)/u,/除(?:采用)?文字(?:表述|叙述)?外[\s\S]{0,4}?(?:可|可以)?附[\s\S]{0,4}?(?:下列|如下|相关|相应)?(?:图表|表格|框图)/u,/(?:横道图|网络图|进度(?:表|图)|平面布置图|框图|表格|图表)[\s\S]{0,26}?(?:自行确定|由投标人自定|不作规定|不作限制|不做要求)/u,/(?:表格|图表|框图)[\s\S]{0,16}?(?:可采用|可用|可以使用|应采用)[\s\S]{0,6}?A3/u,/(?:施工进度(?:表|图)?|总进度(?:表|图|计划)?|进度计划)[\s\S]{0,8}?(?:可|应)?采用[\s\S]{0,6}?(?:网络图|横道图)/u,/(?:图表|框图|表格)[\s\S]{0,10}?(?:一律|均|全部)[\s\S]{0,6}?单(?:黑色|色)/u,/图表及格式要求附后/u];function z(a){let b=[...a.tenderTexts,a.requirement||""].filter(Boolean).join("\n").replace(/\\n/gu,"\n").replace(/\r/gu,""),c=[],e=function(a){let b=[];for(let c of a.matchAll(/施工组织设计\s*采用\s*[::]?/gu)){let d=c.index||0;b.push(a.slice(d,d+320))}return b}(b),f=e.length>0?e.join("\n"):b,g=j(f,h),k=j(f,i),l=g?"blind":"open";g?c.push(`标书类型勾选证据:${g}`):k?c.push(`标书类型勾选证据:${k}`):c.push("业务默认口径:未勾选暗标,按明标编制(非招标原文条款)");let m=v(b,/正文内不允许[\s\S]{0,24}?出现非文字需要的其他任何符号和标志/u),t=v(b,/不得有图片和扉页|不得有图片/u),u=v(b,/(?:图表|框图|图件)[^。;\n]{0,10}?(?:不得|禁止|不允许)|不得(?:使用|出现|采用|有)?[^。;\n]{0,6}?(?:图表|框图|图件)/u),z=j(b,w),A=j(b,y),B=z&&!x.test(z)?z:void 0,C=B?"forbidden":"allowed";B?c.push(`正文禁表证据:${B}`):(A&&c.push(`正文表格允许证据:${A}`),m&&c.push(`排版格式证据:${m}(禁与投标内容无关符号标记的排版条款,不构成正文禁表)`));let D=/明示或暗示具体投标人|以往的施工业绩/u.test(b),E=function(a,b={}){return{bodyFigurePolicy:"blind"===a||b.noFigureSentence?"forbidden":"allowed",bodyDiagramPolicy:b.noDiagramSentence?"forbidden":"allowed",identityMarksForbidden:"blind"===a||!!b.identityMarksClause}}(l,{noFigureSentence:!!t,identityMarksClause:D,noDiagramSentence:!!u}),F=E.bodyFigurePolicy,G=E.bodyDiagramPolicy;t&&c.push(`图片口径证据:${t}`),u&&c.push(`图件口径证据(招标明示禁图表/框图):${u}`);let H=(0,d.eB)(b).titles.map(a=>{let b=a.replace(/^附表\s*/u,"").split(/\s+/u)[0]||"",c=a.replace(/^附表\s*[一二三四五六七八九十\d]{1,3}\s*/u,"").trim();return{no:b,title:a,kind:/网络图|进度图|横道图|开.*竣工|总平面/u.test(c)?"figure":"table"}});H.length>0&&c.push(`文末附表清单 ${H.length} 项:${H.map(a=>a.title).join("、")}`);let I=/正文(?:部分)?(?:一律|均)?采用\s*(小?[一二三四五六七八九十]号)?\s*([\u4e00-\u9fffA-Za-z_]{2,10})/u.exec(b),J=/大标题用\s*([小]?[一二三四五六七八九十]号)\s*([\u4e00-\u9fffA-Za-z_]{2,10})/u.exec(b),K=/装订线\s*([\d.]+\s*[-~-—]\s*[\d.]+\s*cm|[\d.]+\s*cm)/u.exec(b),L=/行间距为固定值\s*(\d+)\s*磅/u.exec(b),M=Number(s.map(a=>a.exec(b)?.[1]).find(Boolean))||void 0,N=I?.[2]?`${I[2]}${/GB2312/iu.test(b)?"(GB2312)":""}`:void 0,O=J?.[2]||void 0,P=function(a){let b={},c=(a,c)=>{if(c)for(let d of a)b[d]=c.replace(/\s+/gu,"").replace(/(?:厘米|公分|cm)$/iu,"cm").replace(/(?:毫米|mm)$/iu,"mm").replace(/(?:英寸|inch|in)$/iu,"in").replace(/(?:磅|pt)$/iu,"pt")},d=RegExp(`(?:上下左右|四边|四侧)[^\\d]{0,10}${o}`,"u"),e=RegExp(`(?:上下|上、下)[^\\d]{0,10}${o}`,"u"),f=RegExp(`(?:左右|左、右)[^\\d]{0,10}${o}`,"u"),g=RegExp(`(?:^|[^以上下左右])(上|下|左|右)\\s*(?:页边距|边距)?\\s*[::]?\\s*(?:为|是|均|各)?\\s*${o}`,"u");for(let b of[...a.matchAll(/[^。;;\n]{0,24}(?:页边距|页边空白|边距)[^。;;\n]{0,80}/gu)].map(a=>a[0]||"")){c(["marginTop","marginRight","marginBottom","marginLeft"],d.exec(b)?.[1]),c(["marginTop","marginBottom"],e.exec(b)?.[1]),c(["marginLeft","marginRight"],f.exec(b)?.[1]);let a=g.exec(b);a?.[1]&&a[2]&&c([{上:"marginTop",下:"marginBottom",左:"marginLeft",右:"marginRight"}[a[1]]],a[2])}return b}(b),Q=Number(q.exec(b)?.[1])||void 0,R=Q?void 0:r.map(a=>a.exec(b)?.[1]).find(Boolean),S=[];for(let b of a.tenderEvidence??a.tenderTexts.map(a=>({content:a,filePath:void 0,chunkIndex:void 0})))for(let[a,c]of[["max",s],["min",[q]],["target",r]]){let d=Number(c.map(a=>a.exec(b.content)?.[1]).find(Boolean));if(!d)continue;let e=/建议编制要求|建议[^。;\n]*(?:篇幅|页数)|推荐[^。;\n]*(?:篇幅|页数)/u.test(b.content);S.push({kind:a,value:d,status:e?"recommendation":"unmeasured",sourceFile:b.filePath,chunkIndex:b.chunkIndex,text:b.content,reason:e?"完整母源明确为建议编制要求;不转成强制交付页数":"编号和量值已定位,条款适用对象及是否强制尚未独立核定"})}let T={monoColor:!!/一律单黑色|全部单黑色|均单黑色/u.test(b)||void 0,cover:"forbidden",headersFooters:/不需编制页眉、页脚|不编制页眉|不需要页眉|不需编制页眉/u.test(b)?"forbidden":void 0,bodyFont:N,bodySize:I?.[1]||void 0,headingSize:J?.[1]||void 0,headingFont:O,gutter:K?.[1]?.replace(/\s+/gu,"")||void 0,lineHeight:L?.[1]?`固定值${L[1]}磅`:void 0,pageLimit:M,fontFamily:N||O?void 0:function(a){let b=p.exec(a)?.[1]?.trim();if(b)return b.replace(/字$/u,"")||void 0}(b),paper:(n.exec(b)?.[1]||n.exec(b)?.[2])?.toUpperCase()||void 0,...P,pageMin:Q&&Q>0?Q:void 0,pageTarget:Number(R)>0?Number(R):void 0,...S.length?{pageEvidence:S}:{}},U=[T.marginTop?`上${T.marginTop}`:"",T.marginRight?`右${T.marginRight}`:"",T.marginBottom?`下${T.marginBottom}`:"",T.marginLeft?`左${T.marginLeft}`:""].filter(Boolean),V=[T.paper?`纸张=${T.paper}`:"",U.length>0?`页边距=${U.join("/")}`:"",T.fontFamily?`通用字体=${T.fontFamily}`:"",T.pageMin?`页数下限=${T.pageMin}`:"",T.pageTarget?`目标页数=${T.pageTarget}`:"",T.pageLimit?`页数上限=${T.pageLimit}`:""].filter(Boolean);V.length>0&&c.push(`格式证据:${V.join(";")}`),D&&c.push("投标人身份禁语证据:任何部位、任何条文出现明示或暗示具体投标人的说明及标记(包括以往的施工业绩等)");let W=E.identityMarksForbidden,X=[];if("forbidden"===C&&(a.requiredTables||[]).length>0)for(let b of a.requiredTables||[]){let a=b.trim();if(!a)continue;let c=H.find(b=>(function(a,b){let c=a.replace(/^附表\s*[一二三四五六七八九十\d]{1,3}\s*/u,"").replace(/\s+/gu,"").replace(/表$/u,""),d=b.replace(/\s+/gu,"").replace(/表$/u,"");return!!c&&!!d&&(c.includes(d)||d.includes(c))})(b.title,a));X.push({rule:`提示词必需表格《${a}》`,source:"用户提示词",resolution:c?`招标正文禁表(显式禁表句):该表已收敛入文末《${c.title}》,正文不再输出表格`:"招标正文禁表(显式禁表句):该表取消表格形式,数据以对应章节文字表述呈现"})}return{bidType:l,bodyTablePolicy:C,bodyFigurePolicy:F,bodyDiagramPolicy:G,appendixPlan:H,formatRules:T,identityMarksForbidden:W,conflicts:X,evidence:c}}function A(a){return a?.bodyTablePolicy==="forbidden"}function B(a){return a?.bodyDiagramPolicy==="forbidden"}function C(a){let b="blind"===a.bidType?"暗标":"明标",c=[`标书类型:${b}`,`正文表格:${"forbidden"===a.bodyTablePolicy?"禁表格(招标显式禁表句)":"允许(表格按系统表格计划输出)"}`,`正文图片:${"forbidden"===a.bodyFigurePolicy?"禁图片(位图/照片/图纸图像)":"允许"}`,`正文图件:${"forbidden"===a.bodyDiagramPolicy?"禁图表/框图(招标明示)":"允许(系统按蓝图数据统一出图)"}`,a.appendixPlan.length>0?`文末附表 ${a.appendixPlan.length} 项(表类 ${a.appendixPlan.filter(a=>"table"===a.kind).length} / 图类 ${a.appendixPlan.filter(a=>"figure"===a.kind).length})`:"未识别文末附表清单","不生成封面;目录由实际正文结构生成",...a.formatRules.pageLimit?[`总页数上限 ${a.formatRules.pageLimit} 页(来源格式信息;本轮仅作排版参考)`]:[]];return{status:"success",message:`标书编制规格:${c.join(";")}`,details:[...a.evidence.map(a=>`判定依据:${a}`),...a.appendixPlan.map(a=>`附表${a.no}:${a.title}(具体职责由主控合同核定)`),a.formatRules.gutter?`格式:装订线 ${a.formatRules.gutter}${a.formatRules.lineHeight?`、行距${a.formatRules.lineHeight}`:""}`:"",a.formatRules.bodyFont?`格式:正文 ${[a.formatRules.bodySize,a.formatRules.bodyFont].filter(Boolean).join(" ")}${a.formatRules.headingSize?`、大标题 ${a.formatRules.headingSize}`:""}`:"","格式:不设内封面(终稿移除封面块)",a.formatRules.monoColor?"格式:图表一律单黑色":"",a.identityMarksForbidden?"身份禁语:正文不得出现投标人名称/以往业绩等标记":"",...a.conflicts.map(a=>`冲突裁决:${a.rule}——${a.resolution}`)].filter(Boolean)}}},54233:(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图件必须承载对应专业信息:工序或接口关系用关系图,场地布置用实际相对位置、设施区域及通行/管线线路的平面示意;图内相对坐标不是现场尺寸。需要测量尺度或真实定位时以已核事实支持,数据缺失进入主控问题,不把流程图冒称真实场地平面图。"},54331:(a,b,c)=>{c.d(b,{chiefDecisionWritingContext:()=>M,w:()=>O});var d=c(77598),e=c(14409),f=c(28068),g=c(10501),h=c(47103),i=c(91898),j=c(92450),k=c(92050),l=c(57656),m=c(44753);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(21015),p=c(11248),q=c(58214),r=c(99956),s=c(54233),t=c(60010),u=c(37502);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(35405);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(60251);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:`【冻结读取后的真实只读上下文】
51
51
  ${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(48346),K=c(94173),L=c(21284);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}})}},54451:(a,b,c)=>{c.d(b,{$X:()=>l,D:()=>u,II:()=>t,Iw:()=>w,Kj:()=>n,Su:()=>i,XI:()=>j,Z9:()=>v,dn:()=>s,nY:()=>p,p$:()=>m});var d=c(16698);let e=0;function f(){return{budget:{},documentCalls:0,documentTokens:0,cacheHitTokens:0,cacheMissTokens:0,documentCostUsd:0,unpricedCalls:0,stops:[],id:e+=1}}let g=new WeakMap,h=f();function i(a){if(!a)return h;let b=g.get(a);return b||(b=f(),g.set(a,b)),b}function j(a,b){if(b.budget){let c={};for(let a of["maxTurnsPerBlock","maxToolCallsPerBlock","maxCallsPerChapter","maxCallsPerDocument","maxTokensPerDocument"]){let d=b.budget[a];if(void 0!==d){if(!Number.isSafeInteger(d)||d<1)throw Error(`显式资源上限 ${a} 必须是正整数`);c[a]=d}}a.budget={...a.budget,...c}}if(void 0!==b.costCeilingUsd){if(!Number.isFinite(b.costCeilingUsd)||b.costCeilingUsd<=0)throw Error("显式成本上限必须为正数");a.costCeilingUsd=b.costCeilingUsd}return a}let k=new d.AsyncLocalStorage;function l(a,b){let c=i(a.instance);if(j(c,{budget:a.budget,costCeilingUsd:a.costCeilingUsd}),a.sharedRecord&&(a.sharedRecord.id!==a.chapterId||a.sharedRecord.meterId!==c.id))throw Error("调度器不能借用其他章节或文档的预算记录");let d=a.sharedRecord??{id:a.chapterId,calls:0,tokens:0,startedAt:a.now??Date.now(),refusals:0,meterId:c.id,lastProgressAt:a.now??Date.now()};return k.run({meter:c,record:d},b)}function m(a=Date.now()){let b=k.getStore()?.record;b&&(b.lastProgressAt=a)}function n(){return k.getStore()?.record}function o(a,b,c=Date.now()){if(a){if(a.stop)return a.stop;if(void 0!==b.maxCallsPerChapter&&a.calls>=b.maxCallsPerChapter)return{kind:"chapter-calls",scope:"chapter",escalation:"unfixable",observed:a.calls,limit:b.maxCallsPerChapter,message:`章预算耗尽(本章 LLM 调用 ${a.calls}/${b.maxCallsPerChapter}):本章停止续写,已产出块保留`}}}function p(a){return a.documentStop?a.documentStop:void 0!==a.budget.maxCallsPerDocument&&a.documentCalls>=a.budget.maxCallsPerDocument?{kind:"document-calls",scope:"document",escalation:"C",observed:a.documentCalls,limit:a.budget.maxCallsPerDocument,message:`文档预算耗尽(全文 LLM 调用 ${a.documentCalls}/${a.budget.maxCallsPerDocument}):停止生成;已完成的块与章保留交付,未完成的按缺章进交付复核清单`}:void 0!==a.budget.maxTokensPerDocument&&a.documentTokens>=a.budget.maxTokensPerDocument?{kind:"document-tokens",scope:"document",escalation:"C",observed:a.documentTokens,limit:a.budget.maxTokensPerDocument,message:`文档 token 预算耗尽(${a.documentTokens}/${a.budget.maxTokensPerDocument}${function(a){let b=a.cacheHitTokens+a.cacheMissTokens;return b<=0?"":`,其中输入 ${a.cacheHitTokens.toLocaleString()}/${b.toLocaleString()} 为缓存命中(${(100*a.cacheHitTokens/b).toFixed(1)}%;供应商实际token计量,费用另据已知价目记录)`}(a)}):停止生成;已完成的块与章保留交付,未完成的按缺章进交付复核清单`}:void 0!==a.costCeilingUsd&&a.documentCostUsd>a.costCeilingUsd?{kind:"cost-ceiling",scope:"document",escalation:"C",observed:a.documentCostUsd,limit:a.costCeilingUsd,message:`单文档成本上限触发($${a.documentCostUsd.toFixed(4)} > $${a.costCeilingUsd}):C 级升级并停止生成;已完成的块与章保留交付,未完成的按缺章进交付复核清单`}:void 0}function q(a){let b=n();return b&&b.meterId===a.id?b:void 0}function r(a,b){a.stops.some(a=>a.kind===b.kind)||a.stops.push(b)}function s(a,b){let c=Number.isFinite(b.tokens)&&(b.tokens||0)>0?Math.floor(b.tokens):0;a.documentCalls+=1,a.documentTokens+=c,Number.isFinite(b.cacheHitTokens)&&(b.cacheHitTokens||0)>0&&(a.cacheHitTokens+=Math.floor(b.cacheHitTokens)),Number.isFinite(b.cacheMissTokens)&&(b.cacheMissTokens||0)>0&&(a.cacheMissTokens+=Math.floor(b.cacheMissTokens)),void 0!==b.costUsd&&(a.documentCostUsd+=b.costUsd),!1===b.priced&&(a.unpricedCalls+=1);let d=q(a);d&&(d.calls+=1,d.tokens+=c);let e=p(a)??o(d,a.budget,b.now);return e&&(r(a,e),"chapter"===e.scope&&d?d.stop=d.stop??e:a.documentStop=a.documentStop??e),e}function t(a,b=Date.now()){if(a===h)return;let c=q(a),d=p(a)??o(c,a.budget,b);if(d)return"chapter"===d.scope&&c?c.stop=c.stop??d:a.documentStop=a.documentStop??d,r(a,d),d}function u(a){let b=q(a);b&&(b.refusals+=1)}function v(a,b=Date.now()){return q(a)?.stop??o(q(a),a.budget,b)}function w(a){return q(a)?.refusals??0}},56999:(a,b,c)=>{c.d(b,{$h:()=>q,Br:()=>l,IO:()=>k,Ib:()=>s,QN:()=>w,RP:()=>r,Ue:()=>m,XU:()=>p,fd:()=>n,kj:()=>o});var d=c(77598);let e=a=>a&&"object"==typeof a&&!Array.isArray(a)?a:void 0,f=a=>Array.isArray(a)?a:[],g=a=>"string"==typeof a?a:"",h=a=>{let b=e(a);return b?Array.isArray(b.parts)?b.parts.map(a=>{let b=e(a);return Number.isSafeInteger(b?.sectionIndex)?`⟪section:${b.sectionIndex}⟫`:g(b?.text)}).join(""):g(b.text??b.label):g(a)},i=a=>(0,d.createHash)("sha256").update(JSON.stringify(a)).digest("hex"),j=a=>"string"==typeof a?a.replace(/\r\n/gu,"\n").split("\n").map(a=>a.trim()).join("\n"):Array.isArray(a)?a.map(j):e(a)?Object.fromEntries(Object.entries(a).map(([a,b])=>[a,j(b)])):a;function k(a){let b=e(a);if(!b)return;let c=[],d=0,k=0,l=0,m=0,n=(a,b)=>{let i=e(a);if(!i)return;let j=b??g(i.kind),o="number"==typeof i.id?i.id:Number(g(i.id).match(/:unit:(\d+)$/u)?.[1])||c.length+1,p=g(i.heading);if("paragraph"===j){let a=h(i);for(let b of(d+=a.length,c.push({order:o,body:{kind:j,heading:p,text:a}}),f(i.tables)))n(b,"table")}else if("table"===j){let a=f(i.columns).map(a=>{let b=e(a);return{title:g(b?.title),unit:g(b?.unit)}}),b=f(i.rows).map(a=>{let b=e(a);return b?{cells:Array.isArray(b.cells)?b.cells.map(h):f(i.columns).map(a=>g(e(b.cells)?.[g(e(a)?.key)]))}:{invalidRow:a}});k+=b.length,c.push({order:o,body:{kind:j,heading:p,caption:g(i.caption),columns:a,rows:b}})}else if("figure"===j){let a=f(i.nodes),b=new Map(a.map((a,b)=>[e(a)?.id,b])),d=a.map(h),k=f(i.edges).map(a=>{let c=e(a);return{from:b.get(c?.from)??c?.from,to:b.get(c?.to)??c?.to,label:h(c)}});l+=d.length,m+=k.length,c.push({order:o,body:{kind:j,heading:p,caption:g(i.caption),nodes:d,edges:k,...i.layout?{layout:i.layout}:{}}})}};if(Array.isArray(b.units))b.units.forEach(a=>n(a));else for(let[a,c]of[["paragraphs","paragraph"],["tables","table"],["figures","figure"]])f(b[a]).forEach(a=>n(a,c));if(!d&&!k&&!l)return;let o={units:c.sort((a,b)=>a.order-b.order).map(a=>a.body),decisions:f(b.decisionRequests).map(a=>({question:g(e(a)?.question),reason:g(e(a)?.reason)}))};return{projection:o,bodyHash:i(o),formattingHash:i(j(o)),paragraphChars:d,tableRows:k,figureNodes:l,figureEdges:m}}function l(a,b){let c=k(a),d=k(b);if(!d)return{kind:"unmeasured",addedChars:0,removedChars:0,replacedChars:0};let e={bodyHash:d.bodyHash,...c?{previousBodyHash:c.bodyHash}:{},paragraphChars:d.paragraphChars,tableRows:d.tableRows,figureNodes:d.figureNodes,figureEdges:d.figureEdges},f=c?c.bodyHash===d.bodyHash?"unchanged-body":c.formattingHash===d.formattingHash?"formatting-only":"content-changed":"first-observed-body";if("content-changed"!==f)return{...e,kind:f,addedChars:0,removedChars:0,replacedChars:0};let g=JSON.stringify(c.projection),h=JSON.stringify(d.projection),i=0;for(;i<g.length&&i<h.length&&g[i]===h[i];)i++;let j=0;for(;j<g.length-i&&j<h.length-i&&g[g.length-j-1]===h[h.length-j-1];)j++;return{...e,kind:f,addedChars:Math.max(0,h.length-g.length),removedChars:Math.max(0,g.length-h.length),replacedChars:Math.min(g.length-i-j,h.length-i-j)}}let m=["format","paragraphs","tables","figures","decisionRequests","revisionReason"],n=["factBindings","sourceBindings","projectNumbers","normativeNumbers","derivedNumbers","plannedNumbers","productionNumberIndices","sectionReferences"],o=["text","sectionIndex","factIndices","sourceIndices","productionNumberIndices","projectNumbers","normativeNumbers","derivedNumbers","plannedNumbers"],p=["id","heading","criterionIndices","caption","parts","columns","rows","nodes","edges","layout",...n],q=["key","title","unit"],r=["id","parts"],s=["from","to","parts"],t=/^\/(?:revisionReason|(?:paragraphs|tables|figures)\/\d+\/criterionIndices|decisionRequests\/\d+\/criterionIndices|(?:paragraphs\/\d+\/parts\/\d+|tables\/\d+\/rows\/\d+\/cells\/\d+\/parts\/\d+|figures\/\d+\/(?:nodes|edges)\/\d+\/parts\/\d+)\/(?:factIndices|sourceIndices|projectNumbers|normativeNumbers|derivedNumbers|plannedNumbers|productionNumberIndices))$/u,u=a=>{let b=a.trim();return b.startsWith("/")?b:`/${b.replace(/^\./u,"").replace(/\[(\d+)\]/gu,"/$1").replace(/\./gu,"/")}`},v=new Set([...m,...p,...o,...q,...r,...s,"id","cells","parts","from","to","question","reason","criterionIndices","caption"]);function w(a,b){if(!e(a)||!b.length)throw Error("协议纠正须选择已保留原稿及实际标注修改");let c=structuredClone(a),d=new Set,f=a=>{let b=a.slice(1).split("/"),d=b.pop(),f=c;for(let c of b)if(!(f=Array.isArray(f)?/^\d+$/u.test(c)?f[Number(c)]:void 0:e(f)?.[c])||"object"!=typeof f)throw Error(`协议纠正位置不在已保留原稿:${a}`);if(!f||"object"!=typeof f)throw Error(`协议纠正字段位置无效:${a}`);return{owner:f,last:d}};for(let a of b){let b=u(a.path);if(d.has(b))throw Error(`协议纠正不能改变正文、载体或重复修改同字段:${a.path}`);d.add(b);let c=a.op??"annotation";if("remove-unknown-field"===c){let{owner:c,last:d}=f(b);if(Array.isArray(c)||!Object.hasOwn(c,d))throw Error(`删除键不在已保留原稿:${a.path}`);if(v.has(d))throw Error(`该键属于提交协议,不能以形状纠正删除:${a.path}`);delete c[d];continue}if("drop-empty-fragment"===c){let{owner:c,last:d}=f(b);if(!Array.isArray(c)||!/^\d+$/u.test(d))throw Error(`空片段纠正须指向片段数组中的实际元素:${a.path}`);let g=e(c[Number(d)]);if(!g||1!==Object.keys(g).length||""!==g.text)throw Error(`只能删除仅含空text的片段:${a.path}`);c.splice(Number(d),1);continue}if(!t.test(b))throw Error(`协议纠正不能改变正文、载体或重复修改同字段:${a.path}`);let{owner:g,last:h}=f(b),i=e(g);if(!i)throw Error(`协议纠正字段位置无效:${a.path}`);let j=JSON.parse(a.valueJson);if("revisionReason"===h?"string"!=typeof j:!Array.isArray(j))throw Error(`协议纠正字段类型无效:${a.path}`);i[h]=j}let g=k(a),h=k(c);if(!g||!h||g.bodyHash!==h.bodyHash)throw Error("协议纠正没有守恒原段落、表行与图件数据");return c}},57349:(a,b,c)=>{c.d(b,{F3:()=>i,XN:()=>f,Yh:()=>h,a1:()=>g,lM:()=>j});let d=/^第[一二三四五六七八九十百零〇\d]+章\s*/u,e=/^\d+(?:\.\d+)*[.、.]?\s*/u;function f(a){let b=new Map,c=new Map;return a.chapters.forEach((f,g)=>{let h=g+1;b.set(f.id,`第${h}章 ${f.title.replace(d,"").replace(e,"").trim()}`);let i=0,j=new Map;for(let b of f.sectionIds){let d=a.sections.find(a=>a.id===b),f=d.title.replace(e,"").trim();if((d.headingLevel??3)===4&&d.parentSectionId){let a=c.get(d.parentSectionId);if(!a)throw Error("子小节必须位于所属父小节之后");let e=(j.get(d.parentSectionId)??0)+1;j.set(d.parentSectionId,e),c.set(b,`${a.split(" ")[0]}.${e} ${f}`)}else i+=1,c.set(b,`${h}.${i} ${f}`)}}),{chapters:b,sections:c}}function g(a){let b=!1;for(let c of a.split(/\r?\n/u)){if(/^\s*#{1,6}\s+目录\s*$/u.test(c)){b=!0;continue}if(/^\s*#{1,6}\s+/u.test(c)){b=!1;continue}if(!(b||!c.trim()||/^\s*(?:[-*_]\s*){3,}$/u.test(c)||/^\s*```[^`]*$/u.test(c)))return!0}return!1}function h(a){let b=a.filter(a=>g(a.content)).map(a=>{let b=/^##\s+(.+)$/mu.exec(a.content.trimStart());return b?.index===0&&b[1].replace(d,"")===a.title.replace(d,"")?a.content:`## ${a.title}
52
52
 
@@ -122,12 +122,14 @@ ${c}`;if("delete"===d)return a.split(/\r?\n/u).filter(a=>!aS(a).includes(e)).joi
122
122
 
123
123
  `:"";return`${e}${d(b)}
124
124
  ${d(b.map(()=>"---"))}
125
- ${c.map(a=>d(a)).join("\n")}`}(a.spec);return aX(b,"insert_table",c,a.at,d)}let a1={name:"insert_table",description:w("在锚点处插入一张 Markdown 表格(先过表块守卫:表头 + 分隔线 + ≥1 行数据,且各行列数与表头一致),再走与 patch 相同的事务与边界。",'正文需要以正式表格承载清单/参数/对照关系时(表格是评价规则里的加分承载面);或某处"应该有一张表"而目前只有一段罗列句时。','正文禁表场景(招标显式禁表)——那时表会被判为结构缺陷;也不要拿它插"见下表"式的空表或没有表头的表(守卫会直接拒绝);表格内容必须有资料依据,不得为了好看编数据。'),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id"),spec:x.obj("表格规格",{headers:x.arr("表头单元格(非空)",x.str("表头")),rows:x.arr("数据行(≥1 行,每行列数须与表头一致)",x.arr("一行单元格",x.str("单元格"))),caption:x.str("表名/表注(可选;有则作为表前一行输出)")},["headers","rows"]),at:x.obj("插入位置锚点",{text:x.str("锚点原文(逐字取自当前草稿)")},["text"])},["nodeId","spec","at"]),idempotent:!1,idempotentViaSnapshot:!0,handler:a0};async function a2(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw k("nodeId 不能为空");let d=b.document;if(!d)throw n("文档事务能力(`ctx.document.commitSection`)","运行时注入:接 `chapterLoop` 的块推进/提交记账");let e=d.readSection(c);if("string"!=typeof e)throw m(`节点「${c}」不存在或尚无草稿正文,不能提交`);if(!e.trim())throw k(`节点「${c}」正文为空,不能提交(空块提交会把"没写"标成"写完")`);return"function"==typeof d.commitSection&&await d.commitSection(c),{nodeId:c,committed:!0,committedAt:Date.now(),note:d.commitSection?"已通过事务通道提交":'事务通道未提供 commitSection 钩子;本次仅返回提交回执(S1.3 的显式化目的:让画布能显示"这块定了")'}}let a3={name:"commit_section",description:w('显式提交一个小节的草稿(现在靠"不返回 toolCall"隐式表达;显式化以便画布显示与循环判定)。','这一块确实写完了、不再改时(提交是**块推进的信号**,也是"我认账"的声明)。',"还想再改(提交后再改会走到重开路径,代价更高);正文为空时提交会被直接拒绝——它只提交已有正文;不能替代当前任务完成与来源核验。"),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id")},["nodeId"]),idempotent:!0,handler:a2};async function a4(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw k("nodeId 不能为空");if(!a?.anchor||"string"!=typeof a.anchor.text)throw k("anchor.text 必填(要删的那句/那行的原文)");return aX(b,"delete_span",c,a.anchor,"")}let a5={name:"delete_span",description:w("删除锚点命中的整句/整行(`applyChapterPatch` 的空 replacement 删除语义),走同一套 4.4 边界与事务。","确定某句是污染内容时必须删(来源罗列句、内部术语句、元话语声明句、重复句)——**删得掉比改得像更重要**;`check` 报了某句类缺陷而改写无法消除时。",'只是"这句写得不好"(那是 `patch_section` 改写,删除会丢信息);一次删掉大段正文(净字数下限会直接拒绝,且删内容比补内容更容易伤到实质判据);也不要连着删多句——每删一句都要有独立的判据依据(`explain_defect` 可查)。'),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id"),anchor:x.obj("要删除的语句锚点(逐字取自当前草稿)",{text:x.str("锚点原文")},["text"])},["nodeId","anchor"]),idempotent:!1,idempotentViaSnapshot:!0,handler:a4},a6={name:"submit_author_task",description:w("将完整段落、表格、流程图和事实绑定提交到当前冻结作者任务。","取证与必要决定完成后,按作者产物协议提交完整单元集合;任务、合同、快照与评价项由运行时核对。","不能用于扩大合同、换任务、删掉必需评价项或宣称专业质量通过。未决请求如实保留,不得编造事实补足。"),scope:"document-draft",inputSchema:x.object({output:aQ},["output"]),idempotent:!1,idempotentViaSnapshot:!0,handler:async(a,b)=>{if(!b.authorTask)throw n("authorTask","当前运行尚未绑定结构化作者任务");try{return await b.authorTask.submit(a.output)}catch(a){throw k(a instanceof Error?a.message:String(a))}}},a7={name:"correct_author_submission",scope:"document-draft",idempotent:!1,idempotentViaSnapshot:!0,description:w("在服务端保留的真实作者原稿上纠正职责/来源标注或清理协议外形状,不重新输出正文。","提交失败回执给出submissionIndex后,指定错误位置的JSON路径(JSON指针或a[0].b形式);所有段落、表行、图数据守恒后再按同一任务验证。","不能改text/parts文字、标题、表头、行、图节点/关系或未决问题;remove-unknown-field只能删非正文键,drop-empty-fragment只能删仅含空text的片段;实质正文修改另行完整submit并如实计账。纠正不授予来源采用或专业质量通过。"),inputSchema:x.object({submissionIndex:x.int("本任务失败回执给出的实际原稿序号,从0开始"),changes:x.arr("必要的标注或形状纠正",x.obj("纠正项",{path:x.str("实际JSON路径:标注字段,或待清理的协议外键/空片段位置。支持 /a/0/b 与 a[0].b 两种写法"),valueJson:x.str('标注字段的新JSON值(数组或revisionReason字符串);删除类操作填"null"'),op:x.enumStr("操作类别;省略按标注纠正处理",["annotation","remove-unknown-field","drop-empty-fragment"])},["path","valueJson"]),{minItems:1})},["submissionIndex","changes"]),handler:async(a,b)=>{if(!b.authorTask?.correct)throw n("authorTask.correct","当前运行没有已保留原稿纠正器");try{return await b.authorTask.correct(a.submissionIndex,a.changes)}catch(a){throw k(a instanceof Error?a.message:String(a))}}},a8=[{name:"ask_chief",scope:"document-plan",idempotent:!0,description:w("将当前任务的具体职责或方法问题交给主智能体,立即取得结构化裁决及其身份。","提交首稿前确定方法边界、部位工况及定量控制时;提供sourceQueries取得完整依据,主控可给经独立复核的工程控制项及原文序号。按实际任务问题继续查证,同一问题复用已有回执;先使用已给出的合同与完整必要资料,未完成对象不得假称已核定。","普通写作无需调用;不能请求主控代写正文、编造参数或扩大合同。request-human 必须保留为未决请求。"),inputSchema:x.object({question:x.str("具体可回答的问题"),criterionIndices:x.arr("作者协议已给出的当前任务职责序号,从0开始,不复制或猜长ID",x.int("当前任务实际职责序号"),{minItems:1}),sourceQueries:x.arr("先查冻结原文中实际对象与条件,完整片段分页;query各词均须命中,可继续nextOffset",x.obj("一项原文查询",{query:x.str("真实对象或术语,以空格连接同时命中的词"),filePath:x.str("已冻结的完整文件路径,可省略"),offset:x.int("从零开始的匹配片段偏移"),limit:x.int("一次1至8个完整片段")},["query"])),factQueries:x.arr("问题所需的真实事实属性及对象,按完整对象控制组查证;主控从冻结事实查询,不限于评价项原先绑定的事实",{...x.object({attribute:x.str("实际属性名称"),objectName:x.str("实际对象名称,可省略")},["attribute"]),description:"一项冻结事实查询"})},["question","criterionIndices"]),handler:async(a,b)=>{let d;if(!b.chief)throw n("chief","当前运行未绑定主智能体裁决通道");if(!b.authorTask)throw n("当前作者职责索引","主控须绑定已委派任务的同一职责序号表");if(Object.keys(a).some(a=>!["question","criterionIndices","sourceQueries","factQueries"].includes(a)))throw k("主控提问只接受当前criterionIndices协议,不转换退役ID输入");let{resolveAuthorCriterionIndices:e}=await Promise.resolve().then(c.bind(c,37377)),{criterionIndices:f,...g}=a;try{if(!(d=e(b.authorTask.criterionIds,f)).length)throw Error("主控问题须绑定本任务实际职责")}catch(a){throw k(a instanceof Error?a.message:String(a))}let{chiefDecisionWritingContext:h}=await Promise.resolve().then(c.bind(c,54331));return h(await b.chief.ask({...g,criterionIds:d}))}},a6,a7,aZ,a_,a1,a3,a5];async function a9(a,b){let c=String(a?.item??"").trim(),d=String(a?.reason??"").trim();if(!c)throw k('item 不能为空(要写清"缺的是什么",不能是"某些资料")');if(d.length<4)throw k("reason 太短:必须说明**为什么缺**(招标未给/图纸未含/资料未上传),否则人手无法接续");let e=Array.isArray(a?.evidence)?a.evidence.map(a=>String(a??"").trim()).filter(Boolean):[];if(0===e.length)throw k('evidence 不能为空:请列出**已经找过的地方**(`search_evidence` 的查询词 + 命中的文件/页,或 `discover_files` 的结果)。空证据的声明等价于"我没找,直接报缺"——那是拿声明当偷懒通道。');let f=b.audit;if(!f)throw n("审计状态写入能力(`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 ba={name:"declare_missing",description:w("上报当前任务确需但尚无可靠依据的具体项目属性,保留实际查证记录供主控判断。声明不降低职责或质量要求。","query_project_facts、query_work_packages、query_cad_context、search_evidence、read_source或discover_files的实际回执仍不能核定所需属性,并已向主控提出具体问题时;如实区分未读完、读取失败、适用关系未核定与资料确实缺失。","不把零命中或未预加载当作全部资料缺失;先通过ask_chief核查职责和技术口径。不能编造查证记录,也不能用声明替代必须完成的施工决定或在正文中写后台状态。"),scope:"audit-state",inputSchema:x.object({item:x.str("缺的是什么(具体到字段/参数/图名,如「基坑支护设计参数:锚索张拉锁定值」)"),reason:x.str("为什么缺(招标未给 / 图纸未含 / 资料未上传 / 与已有资料矛盾且无权威可裁)"),evidence:x.arr('已经找过的地方(≥1 条;写查询词与命中的文件/页,或说明"已遍历资料清单,无此文件")',x.str("一条搜寻记录"))},["item","reason","evidence"]),idempotent:!0,handler:a9};async function bb(a,b){let c=a?.issue;if(!c||"object"!=typeof c)throw k("issue 必填(要声明的是**哪一条缺陷**,不能泛指)");let d=String(c.message??"").trim();if(!d)throw k("issue.message 不能为空(缺陷必须有可读的说明)");let e=c.level;if("error"!==e&&"warning"!==e&&"info"!==e)throw k("issue.level 必须是 error / warning / info 之一");let f=String(a?.reason??"").trim();if(f.length<8)throw k("reason 太短:必须说明实际查证、主控判断或提交拒绝的结果,以及当前不能完成的具体原因;不得编造尝试或为了声明反复改写。");let g=b.audit;if(!g)throw n("审计状态写入能力(`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 bc(a,b){let c=String(a?.question??"").trim();if(c.length<8)throw k('question 太短:必须写成**一个可回答的问题**(并列候选与各自来源,见 A5.2「让人选」),不写成"我判不了,你来看"');if("boolean"!=typeof a?.blocking)throw k("blocking 必填且必须是布尔:它决定本次是**挂起等人**还是**记账继续**,不能靠默认值蒙混");if(!/[??]|是否|哪一|哪个|请确认|请裁定/u.test(c))throw k("question 缺少疑问形态(未见 ?/? 或 是否/哪一/请确认 等):请写成一个**可回答**的问题,并列出候选与来源");let d=b.audit;if(!d)throw n("审计状态写入能力(`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 bd=[ba,{name:"declare_unfixable",description:w("记录当前固定任务无法完成的具体阻断及真实原因,保留已生成的正确内容与查证回执;声明不会将任务标为完成。","依据实际源读取、主控裁决或结构化提交拒绝,能够指出仍未满足的具体职责或控制条件时;无法完成是工程或来源条件限制时可直接上报,不要求先改写若干轮。","不能跳过难点、虚构修复次数或把工具故障解释为资料缺失。专业疑问先用ask_chief,仍未核定的控制点保留decisionRequests;不得扩大冻结任务或用重复改写消耗预算。"),scope:"audit-state",inputSchema:x.object({issue:x.anyObj("实际未满足职责或控制条件的具体阻断对象,须含真实level与message;已收到校验问题时保留原样"),reason:x.str("实际源读取、主控判断或提交拒绝的结果,以及仍不能完成的原因;不编造改写次数")},["issue","reason"]),idempotent:!0,handler:bb},{name:"request_clarification",description:w("向人提出一个**可回答的口径裁决问题**(写进待答槽;`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:x.object({question:x.str("可回答的问题(须含疑问形态 + 候选值与各自来源 + 权威级;建议附上你的建议)"),blocking:x.bool("true = 挂起等人;false = 记账继续。**必填**(不给默认值:挂起与否是决策,不是格式)")},["question","blocking"]),idempotent:!0,handler:bc}];function be(a){return String(a??"").replace(/\s+/gu,"").replace(/[::==]/gu,"=").toLowerCase()}async function bf(a,b){let c=(Array.isArray(a?.facts)?a.facts:[]).map(a=>String(a??"").trim()).filter(Boolean);if(0===c.length)throw k("facts 不能为空:请列出**本块实际写进正文**的事实键(从「本主题块专属事实」清单里取)");let d=b.factPlacement;if(!d)throw n("事实落位记账能力(`ctx.factPlacement`)","运行时注入:由章写作层按**本块分配的事实清单**构造(`agentToolWiring.factPlacementFor`)");let e=[],f=[];for(let a of c){let b=function(a,b){let c=be(a);if(c)for(let a of b){let b=be(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 k(`报出的 ${c.length} 条**一条都不在本块可见事实里**(可能是别的节的事实或写错了键)。本块可见的是:${a||"(本块没有专属事实——那就不必调用本工具)"}`)}return{recorded:!0,accepted:e,unknown:f,acceptedCount:e.length,note:"已按**本块可见事实**记账(集合连接:判定不再只靠字面命中)。这是观测面不是门:漏报不会让本节失败,但会让「哪块漏了哪条」少一条写手侧的证词——写下正文之后顺手报一次即可,不必逐条核对。"+(f.length>0?`(${f.length} 条不在本块可见事实里,只回执、未落账)`:"")}}let bg=[{name:"record_fact_placement",description:w('回报"本节实际用上了哪几条事实"(**逐条回链**):系统按**集合连接**记账,"参数/事实是否落位"不再只靠字面匹配去猜。',"正文写完(或 `commit_section` / `patch_section` 落地)之后,如果本节用了「本主题块专属事实」清单里的条目——把**用上的那几个键**报一次。一次调用报完,不必逐段调。",'**不要把它当验收清单**(漏报不会让本节失败,系统仍有字面判定的兜底);**不要报清单外的键**(那些不落账,只会出现在回执里);**不要为了凑数把没用的事实也报上**——账是给"哪块漏了哪条"用的,报了假的等于把缺口藏起来。'),scope:"readonly",inputSchema:x.object({facts:x.arr("本节实际用上的事实键(写「本主题块专属事实」清单里的键即可,如「计划工期」)",x.str("一个事实键"))},["facts"]),idempotent:!0,handler:bf}],bh={error:0,warning:1,info:2},bi={blocker:0,warning:1,suggestion:2};function bj(a){return((a.severity?bi[a.severity]:void 0)??3)*10+(bh[a.level]??3)}async function bk(a,b){let c=b.audit;if(!c||"function"!=typeof c.listDefects)throw n("缺陷清单读取能力(`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 k("scope 若要给,必须是对象 `{chapterId?}`");let e=await c.listDefects(d);if(!Array.isArray(e))throw k("缺陷清单能力返回了非数组——返回形状是接口的一部分,不能含糊");return[...e].sort((a,b)=>{let c=bj(a)-bj(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 bl=[{name:"list_defects",description:w('读出当前文档的缺陷清单(阻断级优先排序,可带 `chapterId` 缩小范围)。这是"我现在还欠什么"的账本。','每轮收尾前对账;或不确定"还有什么没解决"时(比凭记忆列缺陷可靠得多——记忆里的缺陷清单总是偏乐观)。','**不要拿它当 `check` 的替代**:`check` 是对**指定文本**现跑判据(能看到"我刚改的这版有没有引入新问题"),`list_defects` 读的是**已入账**的历史清单(可能滞后于你刚做的改动)。改完正文必须 `check` 复验,不能靠 `list_defects` 变没变来确认。'),scope:"audit-state",inputSchema:x.object({scope:x.obj("范围(可选)",{chapterId:x.str("只看某一章的缺陷")})}),idempotent:!0,handler:bk}];var bm=c(13424),bn=c(67680),bo=c(45304),bp=c(21312);function bq(a){if(Array.isArray(a.skills))return{skills:a.skills,invalidRecords:[],source:"ctx"};let b=(0,bo.LU)();return{skills:b.skills,invalidRecords:b.invalid,source:"store"}}function br(a,b,c=!1){return{id:a.id,displayName:(0,bm.zg)(a),version:a.version,source:a.source,enabled:a.enabled,chapterDomain:a.match.chapterDomain,chapterDomainLabel:bm.tv[a.match.chapterDomain]??a.match.chapterDomain,projectTypes:[...a.match.projectTypes],projectTypeLabels:a.match.projectTypes.map(a=>bm.zK[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 bs(a,b){let c=String(a??"").trim();if(!c)throw k(`${b} 必填(${bm.Av.join(" / ")})。**刻意不给默认值**:传 general 会让只声明了 building/municipal 等类型的技能静默不命中,而"少加载了技能"是看不见的缺陷。工程类型取自项目设定或招标文件,不要猜。`);if(!bm.Av.includes(c))throw k(`${b} 取值「${c}」不在闭集内(${bm.Av.join(" / ")})`);return c}async function bt(a,b){let c=String(a?.chapterTitle??"").trim();if(!c)throw k("chapterTitle 不能为空(技能按章标题解析章域,空标题推不出任何域)");let d=bs(a?.projectType,"projectType"),e=Array.isArray(a?.sections)?a.sections.map(a=>String(a??"").trim()).filter(Boolean):[],f=bq(b);if(0===f.skills.length)throw n("技能池(`ctx.skills` 或技能库)","运行时注入 `ctx.skills`(内置与用户技能池)。空池应查明加载原因,不能报告专业知识已经加载。");let g=(0,bn.mG)(c,e,d,f.skills),h=f.skills.filter(a=>!a.enabled).length;return{chapterTitle:c,projectType:d,matched:g.map(a=>br(a,(0,bn.mJ)(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 bu={name:"match_skills",description:w("按章标题、小节标题和工程类型匹配技能,返回领域候选摘要及命中依据;候选节名不改变本次冻结合同。","**本章开工前**的定位阶段(`:378`:「专业参考可取得」是定位阶段的成功判据);换章、改标题、改工程类型后要重跑。","**写完才调**——那时结构已定,看契约只剩事后辩解;也**不要凭摘要里的节名自己补全契约**(摘要是索引不是内容,用 `load_skill` 取全量);`projectType` 不要猜(猜错会让应命中的技能静默不加载,见工具参数说明)。"),scope:"skill-store",inputSchema:x.object({chapterTitle:x.str("章标题(用模板里的正式名;技能按它解析章域)"),sections:x.arr("本章的小节标题(用于小节关键词门;可空)",x.str("小节标题")),projectType:x.str(`工程类型(${bm.Av.join(" / ")};**必填,不给默认值**)`)},["chapterTitle","projectType"]),idempotent:!0,handler:bt};async function bv(a,b){let c=String(a?.skillId??"").trim();if(!c)throw k("skillId 不能为空");let d=bq(b),e=d.skills.find(a=>a.id===c);if(!e){let a=d.skills.map(a=>a.id).sort().join("、");throw m(`技能「${c}」不存在。当前池内可用技能:${a||"(池为空)"}`)}if(!e.enabled)throw k(`技能「${c}」已停用,不能加载。`);let f=(0,bp.aU)(e),g=(0,bp.DH)(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 bw={name:"load_skill",description:w("读取一个技能的工艺知识、写作正反例与禁配。示例只教表达,不作为本项目事实;固定任务作者不获得另一套结构或验收要求。","需要补充当前职责相关领域知识时,从已命中技能中按需读取;正文职责与层级由本次冻结合同确定。","一次把池里所有技能全 load 进来(每个技能 1.5–2.2KB,几个就顶满工具结果上限,而且用不到的契约只会干扰判断)——只加载当前任务相关技能;也不要在写作中途反复重 load(本轮已冻结知识未变化,重复取等于烧上下文)。"),scope:"skill-store",inputSchema:x.object({skillId:x.str("技能 id(取自 `match_skills` 或 `list_skills`)")},["skillId"]),idempotent:!0,handler:bv};async function bx(a,b){let c=a?.filter;if(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)))throw k("filter 若要给,必须是对象 `{source?, projectType?, chapterDomain?}`");if(c?.source!==void 0&&"builtin"!==c.source&&"user"!==c.source)throw k("filter.source 只能是 builtin 或 user");if(c?.chapterDomain!==void 0&&!bm.ii.includes(String(c.chapterDomain)))throw k(`filter.chapterDomain 取值「${String(c.chapterDomain)}」不在闭集内(${bm.ii.join(" / ")})`);let d=c?.projectType===void 0?void 0:bs(c.projectType,"filter.projectType"),e=bq(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=>br(a)),total:e.skills.length,filteredOut:e.skills.length-f.length,disabledCount:e.skills.filter(a=>!a.enabled).length,invalidRecords:e.invalidRecords,availableDomains:bm.ii.map(a=>({id:a,label:bm.tv[a]??a})),availableProjectTypes:bm.Av.map(a=>({id:a,label:bm.zK[a]??a})),note:`技能库共 ${e.skills.length} 个,过滤后 ${f.length} 个(含 disabled)。**\`disabled\` 的技能也列出来**:禁用是用户的显式决定,不报出来就没人知道"这条技能为什么没生效"。缺省工程类型为 ${bm.ij}(本工具只做过滤,不参与匹配,故给默认值无副作用)。`}}let by={name:"list_skills",description:w("列出技能库(可按 `source` / `projectType` / `chapterDomain` 过滤),返回摘要与可用枚举值(含 disabled 项)。",'需要知道"这个库到底有哪些技能"时:新项目立项、怀疑某个技能该在却没匹配上、或要看用户自定义技能(`source: "user"`)时。',"**不要拿它替代 `match_skills`**:本工具只做过滤、不做章标题匹配,列出来的不等于本章该用的;也不要在写作过程中反复列(技能库在一次运行内不变,重复列等于烧上下文)。"),scope:"skill-store",inputSchema:x.object({filter:x.obj("过滤条件(可选;都给即取交集)",{source:x.enumStr("技能来源",["builtin","user"]),projectType:x.enumStr("工程类型",bm.Av),chapterDomain:x.enumStr("章域(闭集)",bm.ii)})}),idempotent:!0,handler:bx},bz=["match_skills","load_skill","list_skills","discover_files","inspect_asset"],bA=["lookup_authoritative","query_project_facts"],bB=a=>a.map(a=>a.name),bC=(...a)=>[...new Set(a.flat())],bD={locate:bz,plan:bC(bz,bA,["expand_scope"]),generate:bC(bz,bA,bB(ah),bB(aj),bB(ax),bB(a8),bB(bd),bB(bg)),finalize:bC(bB(aj),bB(a8),bB(bd),bB(bl))},bE=["locate","plan","generate","finalize"];function bF(a){return bE.filter(b=>bD[b].includes(a))}let bG=[{id:"A.1-evidence",tools:ah},{id:"A.2-verdict",tools:aj},{id:"A.3-compute",tools:ax},{id:"A.4-authoring",tools:a8},{id:"A.6-declare",tools:bd},{id:"A.11-fact-placement",tools:bg},{id:"A.8-meta",tools:bl},{id:"A.9-skills",tools:[bu,bw,by]}],bH=bG.flatMap(a=>a.tools.map(a=>({...a,stages:bF(a.name)}))),bI=new Map(bH.map(a=>[a.name,a]));function bJ(a){return bH.filter(b=>b.stages.includes(a))}async function bK(a,b,c){let d=Date.now(),e=bI.get(a);if(e&&c.allowedTools&&!c.allowedTools.includes(a))return r(a,m(`工具「${a}」不在当前任务实际开放的能力范围中`),d);if(e&&c.stage&&!bF(a).includes(c.stage))return r(a,m(`工具「${a}」不允许在 ${c.stage} 阶段调用(允许阶段:${bF(a).join("、")||"无"})`),d);if(!e)return r(a,m(`未注册的工具「${a}」。已注册 ${bH.length} 个:${bH.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 r(a,k(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=p.filter(a=>a.pattern.test(b)).map(a=>a.id);return{suspicious:c.length>0,patterns:[...new Set(c)].sort()}}(q(f)),h={ok:!0,tool:a,data:f,bytes:q(f).length,elapsedMs:Math.max(0,Date.now()-d)};return g.suspicious&&(h.injection=g),h}catch(b){return r(a,function(a){if(a instanceof i)return a;let b=a instanceof Error?a.message:String(a);return new i("INTERNAL",`工具内部异常:${b}`)}(b),d)}}Object.fromEntries(bG.map(a=>[a.id,a.tools.length]));var bL=c(69971),bM=c(35091),bN=c(12866),bO=c(77598);let bP=["items","chunks","candidates","sourceEvidence","records","units","skills","matched","activities","plannedResources","numbers","materials"],bQ=a=>Array.isArray(a)?a.map(bQ):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,bQ(b)])):a,bR=a=>(0,bO.createHash)("sha256").update(JSON.stringify(bQ(a))).digest("hex");var bS=c(80408),bT=c(56999);function bU(a){let b=String(a.projectRoot??"").trim(),c=b?(0,z.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=(0,h.LI)(c,a);f.ok?d.push(f.absolute):e.push(`${a}(${(0,h.vZ)(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:(0,C.M2)(a.audit,a.locationOf)}:{},...a.authoritative?{authoritative:a.authoritative}:{},...a.projectModel?{projectModel:a.projectModel}:{}};return a.contractScoped&&(f.allowedTools=(0,bL.F)(f)),f}async function bV(a){let b=String(a.nodeId??"").trim()||"current";if(!0!==a.contractScoped)throw Error("作者生成必须使用冻结合同,不能退回旧Markdown写作");let c=(0,bM.O3)(a.diagnostics,a.chapterId??"",a.blockTitle??b);if(!c||!a.diagnostics||!a.toolContext?.projectModel)throw Error("固定作者任务缺少合同、诊断账或项目快照接线");let g=`${a.system}
125
+ ${c.map(a=>d(a)).join("\n")}`}(a.spec);return aX(b,"insert_table",c,a.at,d)}let a1={name:"insert_table",description:w("在锚点处插入一张 Markdown 表格(先过表块守卫:表头 + 分隔线 + ≥1 行数据,且各行列数与表头一致),再走与 patch 相同的事务与边界。",'正文需要以正式表格承载清单/参数/对照关系时(表格是评价规则里的加分承载面);或某处"应该有一张表"而目前只有一段罗列句时。','正文禁表场景(招标显式禁表)——那时表会被判为结构缺陷;也不要拿它插"见下表"式的空表或没有表头的表(守卫会直接拒绝);表格内容必须有资料依据,不得为了好看编数据。'),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id"),spec:x.obj("表格规格",{headers:x.arr("表头单元格(非空)",x.str("表头")),rows:x.arr("数据行(≥1 行,每行列数须与表头一致)",x.arr("一行单元格",x.str("单元格"))),caption:x.str("表名/表注(可选;有则作为表前一行输出)")},["headers","rows"]),at:x.obj("插入位置锚点",{text:x.str("锚点原文(逐字取自当前草稿)")},["text"])},["nodeId","spec","at"]),idempotent:!1,idempotentViaSnapshot:!0,handler:a0};async function a2(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw k("nodeId 不能为空");let d=b.document;if(!d)throw n("文档事务能力(`ctx.document.commitSection`)","运行时注入:接 `chapterLoop` 的块推进/提交记账");let e=d.readSection(c);if("string"!=typeof e)throw m(`节点「${c}」不存在或尚无草稿正文,不能提交`);if(!e.trim())throw k(`节点「${c}」正文为空,不能提交(空块提交会把"没写"标成"写完")`);return"function"==typeof d.commitSection&&await d.commitSection(c),{nodeId:c,committed:!0,committedAt:Date.now(),note:d.commitSection?"已通过事务通道提交":'事务通道未提供 commitSection 钩子;本次仅返回提交回执(S1.3 的显式化目的:让画布能显示"这块定了")'}}let a3={name:"commit_section",description:w('显式提交一个小节的草稿(现在靠"不返回 toolCall"隐式表达;显式化以便画布显示与循环判定)。','这一块确实写完了、不再改时(提交是**块推进的信号**,也是"我认账"的声明)。',"还想再改(提交后再改会走到重开路径,代价更高);正文为空时提交会被直接拒绝——它只提交已有正文;不能替代当前任务完成与来源核验。"),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id")},["nodeId"]),idempotent:!0,handler:a2};async function a4(a,b){let c=String(a?.nodeId??"").trim();if(!c)throw k("nodeId 不能为空");if(!a?.anchor||"string"!=typeof a.anchor.text)throw k("anchor.text 必填(要删的那句/那行的原文)");return aX(b,"delete_span",c,a.anchor,"")}let a5={name:"delete_span",description:w("删除锚点命中的整句/整行(`applyChapterPatch` 的空 replacement 删除语义),走同一套 4.4 边界与事务。","确定某句是污染内容时必须删(来源罗列句、内部术语句、元话语声明句、重复句)——**删得掉比改得像更重要**;`check` 报了某句类缺陷而改写无法消除时。",'只是"这句写得不好"(那是 `patch_section` 改写,删除会丢信息);一次删掉大段正文(净字数下限会直接拒绝,且删内容比补内容更容易伤到实质判据);也不要连着删多句——每删一句都要有独立的判据依据(`explain_defect` 可查)。'),scope:"document-draft",inputSchema:x.object({nodeId:x.str("目标节点 id"),anchor:x.obj("要删除的语句锚点(逐字取自当前草稿)",{text:x.str("锚点原文")},["text"])},["nodeId","anchor"]),idempotent:!1,idempotentViaSnapshot:!0,handler:a4},a6={name:"submit_author_task",description:w("将完整段落、表格、流程图和事实绑定提交到当前冻结作者任务。","取证与必要决定完成后,按作者产物协议提交完整单元集合;任务、合同、快照与评价项由运行时核对。","不能用于扩大合同、换任务、删掉必需评价项或宣称专业质量通过。未决请求如实保留,不得编造事实补足。"),scope:"document-draft",inputSchema:x.object({output:aQ},["output"]),idempotent:!1,idempotentViaSnapshot:!0,handler:async(a,b)=>{if(!b.authorTask)throw n("authorTask","当前运行尚未绑定结构化作者任务");try{return await b.authorTask.submit(a.output)}catch(a){throw k(a instanceof Error?a.message:String(a))}}},a7={name:"correct_author_submission",scope:"document-draft",idempotent:!1,idempotentViaSnapshot:!0,description:w("在服务端保留的真实作者原稿上纠正职责/来源标注或清理协议外形状,不重新输出正文。","提交失败回执给出submissionIndex后,指定错误位置的JSON路径(JSON指针或a[0].b形式);所有段落、表行、图数据守恒后再按同一任务验证。","不能改text/parts文字、标题、表头、行、图节点/关系或未决问题;remove-unknown-field只能删非正文键,drop-empty-fragment只能删仅含空text的片段;实质正文修改另行完整submit并如实计账。纠正不授予来源采用或专业质量通过。"),inputSchema:x.object({submissionIndex:x.int("本任务失败回执给出的实际原稿序号,从0开始"),changes:x.arr("必要的标注或形状纠正",x.obj("纠正项",{path:x.str("实际JSON路径:标注字段,或待清理的协议外键/空片段位置。支持 /a/0/b 与 a[0].b 两种写法"),valueJson:x.str('标注字段的新JSON值(数组或revisionReason字符串);删除类操作填"null"'),op:x.enumStr("操作类别;省略按标注纠正处理",["annotation","remove-unknown-field","drop-empty-fragment"])},["path","valueJson"]),{minItems:1})},["submissionIndex","changes"]),handler:async(a,b)=>{if(!b.authorTask?.correct)throw n("authorTask.correct","当前运行没有已保留原稿纠正器");try{return await b.authorTask.correct(a.submissionIndex,a.changes)}catch(a){throw k(a instanceof Error?a.message:String(a))}}},a8=[{name:"ask_chief",scope:"document-plan",idempotent:!0,description:w("将当前任务的具体职责或方法问题交给主智能体,立即取得结构化裁决及其身份。","提交首稿前确定方法边界、部位工况及定量控制时;提供sourceQueries取得完整依据,主控可给经独立复核的工程控制项及原文序号。按实际任务问题继续查证,同一问题复用已有回执;先使用已给出的合同与完整必要资料,未完成对象不得假称已核定。","普通写作无需调用;不能请求主控代写正文、编造参数或扩大合同。request-human 必须保留为未决请求。"),inputSchema:x.object({question:x.str("具体可回答的问题"),criterionIndices:x.arr("作者协议已给出的当前任务职责序号,从0开始,不复制或猜长ID",x.int("当前任务实际职责序号"),{minItems:1}),sourceQueries:x.arr("先查冻结原文中实际对象与条件,完整片段分页;query各词均须命中,可继续nextOffset",x.obj("一项原文查询",{query:x.str("真实对象或术语,以空格连接同时命中的词"),filePath:x.str("已冻结的完整文件路径,可省略"),offset:x.int("从零开始的匹配片段偏移"),limit:x.int("一次1至8个完整片段")},["query"])),factQueries:x.arr("问题所需的真实事实属性及对象,按完整对象控制组查证;主控从冻结事实查询,不限于评价项原先绑定的事实",{...x.object({attribute:x.str("实际属性名称"),objectName:x.str("实际对象名称,可省略")},["attribute"]),description:"一项冻结事实查询"})},["question","criterionIndices"]),handler:async(a,b)=>{let d;if(!b.chief)throw n("chief","当前运行未绑定主智能体裁决通道");if(!b.authorTask)throw n("当前作者职责索引","主控须绑定已委派任务的同一职责序号表");if(Object.keys(a).some(a=>!["question","criterionIndices","sourceQueries","factQueries"].includes(a)))throw k("主控提问只接受当前criterionIndices协议,不转换退役ID输入");let{resolveAuthorCriterionIndices:e}=await Promise.resolve().then(c.bind(c,37377)),{criterionIndices:f,...g}=a;try{if(!(d=e(b.authorTask.criterionIds,f)).length)throw Error("主控问题须绑定本任务实际职责")}catch(a){throw k(a instanceof Error?a.message:String(a))}let{chiefDecisionWritingContext:h}=await Promise.resolve().then(c.bind(c,54331));return h(await b.chief.ask({...g,criterionIds:d}))}},a6,a7,aZ,a_,a1,a3,a5];async function a9(a,b){let c=String(a?.item??"").trim(),d=String(a?.reason??"").trim();if(!c)throw k('item 不能为空(要写清"缺的是什么",不能是"某些资料")');if(d.length<4)throw k("reason 太短:必须说明**为什么缺**(招标未给/图纸未含/资料未上传),否则人手无法接续");let e=Array.isArray(a?.evidence)?a.evidence.map(a=>String(a??"").trim()).filter(Boolean):[];if(0===e.length)throw k('evidence 不能为空:请列出**已经找过的地方**(`search_evidence` 的查询词 + 命中的文件/页,或 `discover_files` 的结果)。空证据的声明等价于"我没找,直接报缺"——那是拿声明当偷懒通道。');let f=b.audit;if(!f)throw n("审计状态写入能力(`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 ba={name:"declare_missing",description:w("上报当前任务确需但尚无可靠依据的具体项目属性,保留实际查证记录供主控判断。声明不降低职责或质量要求。","query_project_facts、query_work_packages、query_cad_context、search_evidence、read_source或discover_files的实际回执仍不能核定所需属性,并已向主控提出具体问题时;如实区分未读完、读取失败、适用关系未核定与资料确实缺失。","不把零命中或未预加载当作全部资料缺失;先通过ask_chief核查职责和技术口径。不能编造查证记录,也不能用声明替代必须完成的施工决定或在正文中写后台状态。"),scope:"audit-state",inputSchema:x.object({item:x.str("缺的是什么(具体到字段/参数/图名,如「基坑支护设计参数:锚索张拉锁定值」)"),reason:x.str("为什么缺(招标未给 / 图纸未含 / 资料未上传 / 与已有资料矛盾且无权威可裁)"),evidence:x.arr('已经找过的地方(≥1 条;写查询词与命中的文件/页,或说明"已遍历资料清单,无此文件")',x.str("一条搜寻记录"))},["item","reason","evidence"]),idempotent:!0,handler:a9};async function bb(a,b){let c=a?.issue;if(!c||"object"!=typeof c)throw k("issue 必填(要声明的是**哪一条缺陷**,不能泛指)");let d=String(c.message??"").trim();if(!d)throw k("issue.message 不能为空(缺陷必须有可读的说明)");let e=c.level;if("error"!==e&&"warning"!==e&&"info"!==e)throw k("issue.level 必须是 error / warning / info 之一");let f=String(a?.reason??"").trim();if(f.length<8)throw k("reason 太短:必须说明实际查证、主控判断或提交拒绝的结果,以及当前不能完成的具体原因;不得编造尝试或为了声明反复改写。");let g=b.audit;if(!g)throw n("审计状态写入能力(`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 bc(a,b){let c=String(a?.question??"").trim();if(c.length<8)throw k('question 太短:必须写成**一个可回答的问题**(并列候选与各自来源,见 A5.2「让人选」),不写成"我判不了,你来看"');if("boolean"!=typeof a?.blocking)throw k("blocking 必填且必须是布尔:它决定本次是**挂起等人**还是**记账继续**,不能靠默认值蒙混");if(!/[??]|是否|哪一|哪个|请确认|请裁定/u.test(c))throw k("question 缺少疑问形态(未见 ?/? 或 是否/哪一/请确认 等):请写成一个**可回答**的问题,并列出候选与来源");let d=b.audit;if(!d)throw n("审计状态写入能力(`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 bd=[ba,{name:"declare_unfixable",description:w("记录当前固定任务无法完成的具体阻断及真实原因,保留已生成的正确内容与查证回执;声明不会将任务标为完成。","依据实际源读取、主控裁决或结构化提交拒绝,能够指出仍未满足的具体职责或控制条件时;无法完成是工程或来源条件限制时可直接上报,不要求先改写若干轮。","不能跳过难点、虚构修复次数或把工具故障解释为资料缺失。专业疑问先用ask_chief,仍未核定的控制点保留decisionRequests;不得扩大冻结任务或用重复改写消耗预算。"),scope:"audit-state",inputSchema:x.object({issue:x.anyObj("实际未满足职责或控制条件的具体阻断对象,须含真实level与message;已收到校验问题时保留原样"),reason:x.str("实际源读取、主控判断或提交拒绝的结果,以及仍不能完成的原因;不编造改写次数")},["issue","reason"]),idempotent:!0,handler:bb},{name:"request_clarification",description:w("向人提出一个**可回答的口径裁决问题**(写进待答槽;`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:x.object({question:x.str("可回答的问题(须含疑问形态 + 候选值与各自来源 + 权威级;建议附上你的建议)"),blocking:x.bool("true = 挂起等人;false = 记账继续。**必填**(不给默认值:挂起与否是决策,不是格式)")},["question","blocking"]),idempotent:!0,handler:bc}];function be(a){return String(a??"").replace(/\s+/gu,"").replace(/[::==]/gu,"=").toLowerCase()}async function bf(a,b){let c=(Array.isArray(a?.facts)?a.facts:[]).map(a=>String(a??"").trim()).filter(Boolean);if(0===c.length)throw k("facts 不能为空:请列出**本块实际写进正文**的事实键(从「本主题块专属事实」清单里取)");let d=b.factPlacement;if(!d)throw n("事实落位记账能力(`ctx.factPlacement`)","运行时注入:由章写作层按**本块分配的事实清单**构造(`agentToolWiring.factPlacementFor`)");let e=[],f=[];for(let a of c){let b=function(a,b){let c=be(a);if(c)for(let a of b){let b=be(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 k(`报出的 ${c.length} 条**一条都不在本块可见事实里**(可能是别的节的事实或写错了键)。本块可见的是:${a||"(本块没有专属事实——那就不必调用本工具)"}`)}return{recorded:!0,accepted:e,unknown:f,acceptedCount:e.length,note:"已按**本块可见事实**记账(集合连接:判定不再只靠字面命中)。这是观测面不是门:漏报不会让本节失败,但会让「哪块漏了哪条」少一条写手侧的证词——写下正文之后顺手报一次即可,不必逐条核对。"+(f.length>0?`(${f.length} 条不在本块可见事实里,只回执、未落账)`:"")}}let bg=[{name:"record_fact_placement",description:w('回报"本节实际用上了哪几条事实"(**逐条回链**):系统按**集合连接**记账,"参数/事实是否落位"不再只靠字面匹配去猜。',"正文写完(或 `commit_section` / `patch_section` 落地)之后,如果本节用了「本主题块专属事实」清单里的条目——把**用上的那几个键**报一次。一次调用报完,不必逐段调。",'**不要把它当验收清单**(漏报不会让本节失败,系统仍有字面判定的兜底);**不要报清单外的键**(那些不落账,只会出现在回执里);**不要为了凑数把没用的事实也报上**——账是给"哪块漏了哪条"用的,报了假的等于把缺口藏起来。'),scope:"readonly",inputSchema:x.object({facts:x.arr("本节实际用上的事实键(写「本主题块专属事实」清单里的键即可,如「计划工期」)",x.str("一个事实键"))},["facts"]),idempotent:!0,handler:bf}],bh={error:0,warning:1,info:2},bi={blocker:0,warning:1,suggestion:2};function bj(a){return((a.severity?bi[a.severity]:void 0)??3)*10+(bh[a.level]??3)}async function bk(a,b){let c=b.audit;if(!c||"function"!=typeof c.listDefects)throw n("缺陷清单读取能力(`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 k("scope 若要给,必须是对象 `{chapterId?}`");let e=await c.listDefects(d);if(!Array.isArray(e))throw k("缺陷清单能力返回了非数组——返回形状是接口的一部分,不能含糊");return[...e].sort((a,b)=>{let c=bj(a)-bj(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 bl=[{name:"list_defects",description:w('读出当前文档的缺陷清单(阻断级优先排序,可带 `chapterId` 缩小范围)。这是"我现在还欠什么"的账本。','每轮收尾前对账;或不确定"还有什么没解决"时(比凭记忆列缺陷可靠得多——记忆里的缺陷清单总是偏乐观)。','**不要拿它当 `check` 的替代**:`check` 是对**指定文本**现跑判据(能看到"我刚改的这版有没有引入新问题"),`list_defects` 读的是**已入账**的历史清单(可能滞后于你刚做的改动)。改完正文必须 `check` 复验,不能靠 `list_defects` 变没变来确认。'),scope:"audit-state",inputSchema:x.object({scope:x.obj("范围(可选)",{chapterId:x.str("只看某一章的缺陷")})}),idempotent:!0,handler:bk}];var bm=c(13424),bn=c(67680),bo=c(45304),bp=c(21312);function bq(a){if(Array.isArray(a.skills))return{skills:a.skills,invalidRecords:[],source:"ctx"};let b=(0,bo.LU)();return{skills:b.skills,invalidRecords:b.invalid,source:"store"}}function br(a,b,c=!1){return{id:a.id,displayName:(0,bm.zg)(a),version:a.version,source:a.source,enabled:a.enabled,chapterDomain:a.match.chapterDomain,chapterDomainLabel:bm.tv[a.match.chapterDomain]??a.match.chapterDomain,projectTypes:[...a.match.projectTypes],projectTypeLabels:a.match.projectTypes.map(a=>bm.zK[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 bs(a,b){let c=String(a??"").trim();if(!c)throw k(`${b} 必填(${bm.Av.join(" / ")})。**刻意不给默认值**:传 general 会让只声明了 building/municipal 等类型的技能静默不命中,而"少加载了技能"是看不见的缺陷。工程类型取自项目设定或招标文件,不要猜。`);if(!bm.Av.includes(c))throw k(`${b} 取值「${c}」不在闭集内(${bm.Av.join(" / ")})`);return c}async function bt(a,b){let c=String(a?.chapterTitle??"").trim();if(!c)throw k("chapterTitle 不能为空(技能按章标题解析章域,空标题推不出任何域)");let d=bs(a?.projectType,"projectType"),e=Array.isArray(a?.sections)?a.sections.map(a=>String(a??"").trim()).filter(Boolean):[],f=bq(b);if(0===f.skills.length)throw n("技能池(`ctx.skills` 或技能库)","运行时注入 `ctx.skills`(内置与用户技能池)。空池应查明加载原因,不能报告专业知识已经加载。");let g=(0,bn.mG)(c,e,d,f.skills),h=f.skills.filter(a=>!a.enabled).length;return{chapterTitle:c,projectType:d,matched:g.map(a=>br(a,(0,bn.mJ)(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 bu={name:"match_skills",description:w("按章标题、小节标题和工程类型匹配技能,返回领域候选摘要及命中依据;候选节名不改变本次冻结合同。","**本章开工前**的定位阶段(`:378`:「专业参考可取得」是定位阶段的成功判据);换章、改标题、改工程类型后要重跑。","**写完才调**——那时结构已定,看契约只剩事后辩解;也**不要凭摘要里的节名自己补全契约**(摘要是索引不是内容,用 `load_skill` 取全量);`projectType` 不要猜(猜错会让应命中的技能静默不加载,见工具参数说明)。"),scope:"skill-store",inputSchema:x.object({chapterTitle:x.str("章标题(用模板里的正式名;技能按它解析章域)"),sections:x.arr("本章的小节标题(用于小节关键词门;可空)",x.str("小节标题")),projectType:x.str(`工程类型(${bm.Av.join(" / ")};**必填,不给默认值**)`)},["chapterTitle","projectType"]),idempotent:!0,handler:bt};async function bv(a,b){let c=String(a?.skillId??"").trim();if(!c)throw k("skillId 不能为空");let d=bq(b),e=d.skills.find(a=>a.id===c);if(!e){let a=d.skills.map(a=>a.id).sort().join("、");throw m(`技能「${c}」不存在。当前池内可用技能:${a||"(池为空)"}`)}if(!e.enabled)throw k(`技能「${c}」已停用,不能加载。`);let f=(0,bp.aU)(e),g=(0,bp.DH)(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 bw={name:"load_skill",description:w("读取一个技能的工艺知识、写作正反例与禁配。示例只教表达,不作为本项目事实;固定任务作者不获得另一套结构或验收要求。","需要补充当前职责相关领域知识时,从已命中技能中按需读取;正文职责与层级由本次冻结合同确定。","一次把池里所有技能全 load 进来(每个技能 1.5–2.2KB,几个就顶满工具结果上限,而且用不到的契约只会干扰判断)——只加载当前任务相关技能;也不要在写作中途反复重 load(本轮已冻结知识未变化,重复取等于烧上下文)。"),scope:"skill-store",inputSchema:x.object({skillId:x.str("技能 id(取自 `match_skills` 或 `list_skills`)")},["skillId"]),idempotent:!0,handler:bv};async function bx(a,b){let c=a?.filter;if(void 0!==c&&("object"!=typeof c||null===c||Array.isArray(c)))throw k("filter 若要给,必须是对象 `{source?, projectType?, chapterDomain?}`");if(c?.source!==void 0&&"builtin"!==c.source&&"user"!==c.source)throw k("filter.source 只能是 builtin 或 user");if(c?.chapterDomain!==void 0&&!bm.ii.includes(String(c.chapterDomain)))throw k(`filter.chapterDomain 取值「${String(c.chapterDomain)}」不在闭集内(${bm.ii.join(" / ")})`);let d=c?.projectType===void 0?void 0:bs(c.projectType,"filter.projectType"),e=bq(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=>br(a)),total:e.skills.length,filteredOut:e.skills.length-f.length,disabledCount:e.skills.filter(a=>!a.enabled).length,invalidRecords:e.invalidRecords,availableDomains:bm.ii.map(a=>({id:a,label:bm.tv[a]??a})),availableProjectTypes:bm.Av.map(a=>({id:a,label:bm.zK[a]??a})),note:`技能库共 ${e.skills.length} 个,过滤后 ${f.length} 个(含 disabled)。**\`disabled\` 的技能也列出来**:禁用是用户的显式决定,不报出来就没人知道"这条技能为什么没生效"。缺省工程类型为 ${bm.ij}(本工具只做过滤,不参与匹配,故给默认值无副作用)。`}}let by={name:"list_skills",description:w("列出技能库(可按 `source` / `projectType` / `chapterDomain` 过滤),返回摘要与可用枚举值(含 disabled 项)。",'需要知道"这个库到底有哪些技能"时:新项目立项、怀疑某个技能该在却没匹配上、或要看用户自定义技能(`source: "user"`)时。',"**不要拿它替代 `match_skills`**:本工具只做过滤、不做章标题匹配,列出来的不等于本章该用的;也不要在写作过程中反复列(技能库在一次运行内不变,重复列等于烧上下文)。"),scope:"skill-store",inputSchema:x.object({filter:x.obj("过滤条件(可选;都给即取交集)",{source:x.enumStr("技能来源",["builtin","user"]),projectType:x.enumStr("工程类型",bm.Av),chapterDomain:x.enumStr("章域(闭集)",bm.ii)})}),idempotent:!0,handler:bx},bz=["match_skills","load_skill","list_skills","discover_files","inspect_asset"],bA=["lookup_authoritative","query_project_facts"],bB=a=>a.map(a=>a.name),bC=(...a)=>[...new Set(a.flat())],bD={locate:bz,plan:bC(bz,bA,["expand_scope"]),generate:bC(bz,bA,bB(ah),bB(aj),bB(ax),bB(a8),bB(bd),bB(bg)),finalize:bC(bB(aj),bB(a8),bB(bd),bB(bl))},bE=["locate","plan","generate","finalize"];function bF(a){return bE.filter(b=>bD[b].includes(a))}let bG=[{id:"A.1-evidence",tools:ah},{id:"A.2-verdict",tools:aj},{id:"A.3-compute",tools:ax},{id:"A.4-authoring",tools:a8},{id:"A.6-declare",tools:bd},{id:"A.11-fact-placement",tools:bg},{id:"A.8-meta",tools:bl},{id:"A.9-skills",tools:[bu,bw,by]}],bH=bG.flatMap(a=>a.tools.map(a=>({...a,stages:bF(a.name)}))),bI=new Map(bH.map(a=>[a.name,a]));function bJ(a){return bH.filter(b=>b.stages.includes(a))}async function bK(a,b,c){let d=Date.now(),e=bI.get(a);if(e&&c.allowedTools&&!c.allowedTools.includes(a))return r(a,m(`工具「${a}」不在当前任务实际开放的能力范围中`),d);if(e&&c.stage&&!bF(a).includes(c.stage))return r(a,m(`工具「${a}」不允许在 ${c.stage} 阶段调用(允许阶段:${bF(a).join("、")||"无"})`),d);if(!e)return r(a,m(`未注册的工具「${a}」。已注册 ${bH.length} 个:${bH.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 r(a,k(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=p.filter(a=>a.pattern.test(b)).map(a=>a.id);return{suspicious:c.length>0,patterns:[...new Set(c)].sort()}}(q(f)),h={ok:!0,tool:a,data:f,bytes:q(f).length,elapsedMs:Math.max(0,Date.now()-d)};return g.suspicious&&(h.injection=g),h}catch(b){return r(a,function(a){if(a instanceof i)return a;let b=a instanceof Error?a.message:String(a);return new i("INTERNAL",`工具内部异常:${b}`)}(b),d)}}Object.fromEntries(bG.map(a=>[a.id,a.tools.length]));var bL=c(69971),bM=c(35091),bN=c(12866),bO=c(77598);let bP=["items","chunks","candidates","sourceEvidence","records","units","skills","matched","activities","plannedResources","numbers","materials"],bQ=a=>Array.isArray(a)?a.map(bQ):a&&"object"==typeof a?Object.fromEntries(Object.entries(a).sort(([a],[b])=>a.localeCompare(b)).map(([a,b])=>[a,bQ(b)])):a,bR=a=>(0,bO.createHash)("sha256").update(JSON.stringify(bQ(a))).digest("hex");var bS=c(80408),bT=c(56999);function bU(a){let b=String(a.projectRoot??"").trim(),c=b?(0,z.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=(0,h.LI)(c,a);f.ok?d.push(f.absolute):e.push(`${a}(${(0,h.vZ)(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:(0,C.M2)(a.audit,a.locationOf)}:{},...a.authoritative?{authoritative:a.authoritative}:{},...a.projectModel?{projectModel:a.projectModel}:{}};return a.contractScoped&&(f.allowedTools=(0,bL.F)(f)),f}async function bV(a){let b=String(a.nodeId??"").trim()||"current";if(!0!==a.contractScoped)throw Error("作者生成必须使用冻结合同,不能退回旧Markdown写作");let c=(0,bM.O3)(a.diagnostics,a.chapterId??"",a.blockTitle??b);if(!c||!a.diagnostics||!a.toolContext?.projectModel)throw Error("固定作者任务缺少合同、诊断账或项目快照接线");let g=(0,bN.r2)({...c,projectModel:a.toolContext?.projectModel}),h=`${a.system}
126
126
 
127
- ${(0,bN.r2)({...c,projectModel:a.toolContext?.projectModel})}
128
- 最终正文通过结构化任务产物提交;内容、事实和专业要求仍须完整遵守,格式标记与自评说明不写入信息单元。`,h=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 bP){if(!Array.isArray(d[b]))continue;let e=[];for(let[f,i]of d[b].entries()){let d=bR(i),j=bR([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} 字符
129
- ${j}`};return b.set(c,k),k})}(),i=[],j=0,l=[],m=a.maxTokens,n=await (0,E.Bj)({system:g,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,I.H)(a.toolContext.projectModel,{query:"*",memberIds:[...a.preloadedMemberIds]})}]:[],...a.preloadedConstructionPlan?[{toolName:"query_construction_plan",ok:!0,data:a.preloadedConstructionPlan}]:[]],budget:(0,B.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:n,toolCallLimit:p,turn:q})=>{let t,u,v,w;a.signal?.throwIfAborted();let x=(0,B.Iw)((0,B.Su)(a.diagnostics)),z=[...bJ("locate"),...bJ("plan"),...bJ("generate")],C=new Set((0,bL.F)(a.toolContext)),E=[...new Map(z.map(a=>[a.name,a])).values()].filter(b=>C.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}}),F=h(n),G=!1,H=m,I=await (0,A._v)({system:g,messages:F,tools:E,requireToolCall:!0,taskKind:"structuredGeneration",onRawResponse:e=>{if(w=e,v=void 0,G=!0,u=(0,y.TF)(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:q,response:e,request:{system:g,messages:F,tools:E,maxTokens:H,requireToolCall:!0}}),e.responseMetadata?.finishReason==="length"){(0,d.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:q,toolCalls:e.toolCalls.length,reason:"作者工具输出被供应商截断;完整原响应已归档,暂停核查单任务协议与实际思考开销,不重写整任务或继续整包取证"},"model-output-truncated");let c=e.requestMetadata?.maxTokens,f=void 0!==H?Math.ceil(1.5*H):void 0!==c?Math.ceil(1.5*c):void 0,g=e.requestMetadata?.outputCap;v={kind:"incomplete-output",sentOutputBudget:c??null,nextOutputBudget:(m=void 0===f?void 0:void 0===g?f:Math.min(f,g))??null,finishReason:"length"}}else e.responseMetadata?.protocolFailure&&(v={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"))&&(0,bS.E7)(a.diagnostics,c.section.id,!1)},callKind:(0,bS.OD)(a.diagnostics,c.section.id)?"chapter-repair":"chapter-writing",stablePrefixChars:a.stablePrefixChars,maxTokens:H,signal:a.signal,diagnostics:a.diagnostics});if(a.signal?.throwIfAborted(),G||(u=(0,y.TF)(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:q,response:I})),!G&&I?.responseMetadata?.completed===!1&&I.toolCalls.some(a=>"submit_author_task"===a.name)&&(0,bS.E7)(a.diagnostics,c.section.id,!1),!I){if(w?.responseMetadata?.protocolFailure==="invalid-tool-arguments"&&Array.isArray(w.rawToolCalls)){let a=w.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&&E.some(b=>b.name===a.name))){let b=[{role:"assistant",content:w.content,...void 0===w.thinkingContent?{}:{thinkingContent:w.thinkingContent},toolCalls:a},...a.map(a=>({role:"tool",toolCallId:a.id,content:s(r(a.name,k(`本次参数未执行:${JSON.stringify(w.droppedToolCalls??[])};只纠正语法结构,保留前述原字全部正文、表格和图数据`),Date.now()))}))];return{text:"",toolCalls:[],protocolRecovery:v,toolMessages:b}}}let b=(0,B.Su)(a.diagnostics);if((0,B.Iw)(b)>x||(0,B.nY)(b)||(0,B.Z9)(b)){let a=(0,B.nY)(b)??(0,B.Z9)(b);return{text:"",toolCalls:[],refused:{kind:a?.kind??"budget",message:a?.message??"预算耗尽:本次调用未发起"}}}return{text:"",toolCalls:[],...v?{protocolRecovery:v,toolMessages:[{role:"user",content:`上一工具响应未接纳。实际协议回执:${JSON.stringify(v)}。解析失败或未报告finish_reason不能证明输出额度不足,不凭空扩大预算;原始有意义文字完整保留。保留完整原任务和已取得证据,纠正实际工具参数语法与标注;已有服务端保留的可解析原稿使用correct_author_submission,不重新生成它的段落、表行或图数据;不得补造事实。`}]}:{}}}let J=[],K=[],L=[],M=[],N=async(b,d)=>{let e;if(I.responseMetadata?.completed!==!0)throw Error("作者响应未完整结束,不能提交为完整任务");if(void 0!==a.maxAuthorSubmissions&&j>=a.maxAuthorSubmissions)throw Error("本任务的定向内容修改次数已用完,不能再次改稿");try{e=(0,bN.Ix)(b,{contract:c.contract,taskId:c.section.id,projectModel:a.toolContext?.projectModel}),await a.beforeAuthorSubmit?.(e)}catch(b){throw(0,bS.E7)(a.diagnostics,c.section.id,!1),b}let f=(0,bS.Y1)(a.diagnostics,c.section.id,e,e&&"object"==typeof e&&"string"==typeof e.revisionReason?e.revisionReason:void 0,{preserveFirstDraft:!a.beforeAuthorSubmit});for(let b of(j+=1,(0,y.cG)(a.diagnostics,f,u,d),t=f.markdown,f.output.decisionRequests))await a.toolContext.audit?.requestClarification({question:b.question,blocking:!0});return{taskId:f.output.taskId,contentHash:f.contentHash,pendingCriterionIds:f.pendingCriterionIds}},O={...a.toolContext,stage:"generate",allowedTools:E.map(a=>a.name),authorTask:{criterionIds:(0,e.C)(c.contract,c.section.id).map(a=>a.id),submit:async a=>{let b=l.length,c={output:structuredClone(a),accepted:!1,rawCallId:u??null};l.push(c);try{let b=await N(a);c.accepted=!0;let d=(0,bN.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,bT.QN)(c.output,b);c.output=d;let e=await N(d,{submissionIndex:a,originalRawCallId:c.rawCallId,changes:b});return c.accepted=!0,e}}},P=void 0!==p?Math.max(0,p):I.toolCalls.length,Q=a=>"submit_author_task"===a||"correct_author_submission"===a,R=I.toolCalls.find(a=>Q(a.name)),S=new Set([...I.toolCalls.filter(a=>!Q(a.name)).slice(0,Math.max(0,P-(R||void 0!==p&&E.some(a=>"submit_author_task"===a.name)?1:0))),...R&&P>0?[R]:[]]),T=I.toolCalls.filter(a=>S.has(a)),U=I.toolCalls.length-T.length;for(let b of(U>0&&(console.warn(`[agent-tools] 单轮工具调用超块级预算,已截断 ${U} 次(限额 ${p})`),a.onToolIssue?.([{level:"warning",category:"structure",owner:"system",message:`本轮工具调用超出块级上限,已执行前 ${T.length} 次、截断 ${U} 次——请合并查询或减少工具调用`,suggestion:"下一轮只调真正需要的工具;剩余额度见块预算"}])),T)){let c,d;a.signal?.throwIfAborted();let e=Date.now();try{c=(0,f.parseJsonWithoutDuplicateKeys)(b.arguments||"{}")}catch(a){d=a instanceof Error?a.message:String(a)}let g=d?r(b.name,k(d),e):await bK(b.name,c,O);if(a.signal?.throwIfAborted(),K.push(g.ok?{toolName:b.name,ok:!0,data:g.data}:{toolName:b.name,ok:!1,error:{code:g.error.code}}),g.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&&O.audit?.recordEvidenceCall&&O.audit.recordEvidenceCall({tool:b.name,term:a})}0===L.length&&L.push({role:"assistant",content:I.content??"",toolCalls:T.map(a=>({id:a.id,name:a.name,arguments:a.arguments})),...void 0!==I.thinkingContent?{thinkingContent:I.thinkingContent}:{}}),L.push({role:"tool",content:s(g),toolCallId:b.id});let h=g.ok?g.injection:void 0;h?.suspicious&&M.push({tool:b.name,patterns:h.patterns}),J.push({toolName:b.name,ok:g.ok,durMs:Date.now()-e,summary:g.ok?`ok ${g.bytes??0}B${h?.suspicious?" \xb7 疑似注入(按数据对待)":""}`:`${g.error.code}`})}if(i.push(...J),M.length>0){let c=M.map(a=>`${a.tool}(${a.patterns.join("、")})`).join(";");a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${M.length} 处:${c}——已按数据对待并记节点 issue`);try{a.onToolIssue?a.onToolIssue(M.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})——该内容已按数据对待(模型侧带「${o}」前缀),本节正文不得因它改变写作口径`,suggestion:"人工复核该资料:若确为提示注入,请把该文件移出资料范围后重跑本节;正文中据其写出的事实须另行核实来源。",...a.nodeId?{sectionTitle:a.nodeId}:{},provenance:{detectorId:"suspicious-injection",fingerprint:(0,D.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=`工具结果命中疑似注入 ${M.length} 处:${c}——**节点 issue 未落库**(${b}):命中未被静默丢弃,但记账不完整`),console.error(`[agent-tools] 记录疑似注入节点 issue 失败(${c}):${b}`,d)}}let V=L.length>0?[...L,...U?[{role:"user",content:`该原始响应另有${U}个工具请求未执行,不能将它们当成取证结果。正文提交额度已经预留;依据实际已给的资料与已完成取证写作,真实缺口留作未决事项,不再猜属性或遍历全部资料。`}]:[]]:[];return{text:t??"",...void 0!==t?{committed:t}:{},toolCalls:J,toolMessages:V,toolResults:K}}}),p=l.filter(a=>!a.accepted).length;if(("unfixable"===n.kind||"no_content"===n.kind)&&"no-progress"===n.cause&&(0,d.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:n.turn,toolCalls:n.toolCalls,reason:n.reason}),a.onOutcome?.(p?{...n,rejectedSubmissions:p}: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 q=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 q&&(a.diagnostics&&(a.diagnostics.llm.lastInfo=`${a.diagnostics.llm.lastInfo??""};本块残余 ${"unfixable"===n.kind?n.residual:0} 未收敛`),a.toolContext?.audit?.declareUnfixable(q)),n.content}},96241:(a,b,c)=>{function d(a,b){let c=a.match(/[≤≥±]?[A-Za-z0-9][A-Za-z0-9._%/+−-]*|[\s\S]/gu)??[],d=[],e="";for(let a of c)e&&Array.from(e+a).length>b&&(d.push(e),e=""),e+=a;return e&&d.push(e),d}c.d(b,{rZ:()=>m,D0:()=>n});var e=c(71783);let f=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;");var g=c(77598),h=c(73024),i=c.n(h),j=c(76760),k=c.n(j);let l=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;");function m(a){if(!/^[A-Za-z0-9_-]+$/u.test(a.documentId))throw Error("图件文档身份无效");let b=new Map;return{renderer:c=>{let h=(0,g.createHash)("sha256").update(JSON.stringify(c)).digest("hex"),j=function(a){if(a.layout)return function(a){let b=(0,e.Q)(a.layout,a.nodes.map(a=>a.id),a.edges),c=d(a.caption,40),g=27*Math.max(0,c.length-2),h={x:35,y:95+g,width:930,height:590},i=[],j=a=>({x:h.x+a.x*h.width,y:h.y+a.y*h.height}),k=b.routes.map(b=>{let c=b.points.map(j),e=a.edges[b.edgeIndex].label,g=c.slice(1).map((a,b)=>Math.hypot(a.x-c[b].x,a.y-c[b].y)),i=g.reduce((a,b)=>a+b,0)/2,k=c[0];for(let a=0;a<g.length;a++){if(i<=g[a]&&g[a]>0){let b=i/g[a];k={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}i-=g[a]}let l=d(e??"",40),m=20*l.length;if(m>h.height)throw Error("空间路线完整标签无法在图中清晰显示,须调整图件布局");let n=Math.min(600,Math.max(0,...l.map(a=>15*Array.from(a).length))),o=Math.max(h.x+n/2,Math.min(h.x+h.width-n/2,k.x)),p=Math.max(h.y+m,Math.min(h.y+h.height-10,k.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"/>${l.length?`<rect x="${o-n/2-3}" y="${p-m+3}" width="${n+6}" height="${m}" fill="white"/><text x="${o}" y="${p-m+20}" text-anchor="middle" font-size="15" fill="#334155">${l.map((a,b)=>`<tspan x="${o}" dy="${20*!!b}">${f(a)}</tspan>`).join("")}</text>`:""}</g>`}),l=b.placements.map(b=>{let c=a.nodes.find(a=>a.id===b.nodeId),e=j(b),g=b.width*h.width,k=b.height*h.height,l=20,m=[];for(;l>=12;l--){let a=Math.max(1,Math.floor((g-16)/l));if((m=d(c.label,a)).length*(l+5)+12<=k&&m.every(a=>Array.from(a).length*l<=g-16))break}if(l<12){let b=a.nodes.findIndex(a=>a.id===c.id)+1,d=Array.from(c.label).reduce((a,b,c)=>{let d=Math.floor(c/48);return a[d]=(a[d]??"")+b,a},[]);return i.push({nodeId:c.id,number:b,lines:d}),`<g data-source-node="${f(c.id)}"><title>${f(c.label)}</title><rect x="${e.x}" y="${e.y}" width="${g}" height="${k}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/><text x="${e.x+g/2}" y="${e.y+k/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="${e.x}" y="${e.y}" width="${g}" height="${k}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${m.map((a,b)=>`<text x="${e.x+g/2}" y="${e.y+(k-m.length*(l+5))/2+l+b*(l+5)}" font-size="${l}" text-anchor="middle">${f(a)}</text>`).join("")}</g>`}),m=h.y+h.height+28,n=i.map(a=>{let b=a.lines.map((b,c)=>`<text x="35" y="${m+24*c}" font-size="16">${c?"":`${a.number}&#160;&#160;`}${f(b)}</text>`).join("");return m+=24*a.lines.length+8,`<g data-label-legend-for="${f(a.nodeId)}">${b}</g>`}).join(""),o=Math.max(760+g,m+62);return`<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="${o}" viewBox="0 0 1000 ${o}" 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="${h.x}" y="${h.y}" width="${h.width}" height="${h.height}" fill="none" stroke="#94a3b8"/>${k.join("")}${l.join("")}${n}<text x="35" y="${o-35}" font-size="16">相对位置布置示意${i.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=>d(a.label,10)),c=Math.min(3,a.nodes.length),g=Math.max(66,...b.map(a=>24*a.length+24)),h=new Map(a.nodes.map((a,b)=>[a.id,Math.floor(b/c)])),i=new Map;for(let b of a.edges)h.get(b.from)<h.get(b.to)&&i.set(h.get(b.from),(i.get(h.get(b.from))??0)+1);let j=g+Math.max(105,22*Math.max(0,...i.values())+45),k=125+Math.ceil(a.nodes.length/c)*j,m=new Map(a.nodes.map((a,b)=>[a.id,{x:40+b%c*295,y:110+Math.floor(b/c)*j}])),n=new Map,o=0,p=[{x:450-19*Array.from(a.caption).length/2,y:10,width:19*Array.from(a.caption).length,height:32}],q=[],r=a.edges.map((a,b)=>{let c,d,e,f,h=m.get(a.from),i=m.get(a.to),j=h.x+115,k=h.y+g,r=i.x+115,s=i.y,t=!1;if(h.y===i.y&&i.x>h.x&&i.x-h.x<320){let a=h.y+g/2,b=h.y-20;c=`M${h.x+230},${a} H${h.x+230+14} V${b} H${i.x-14} V${a} H${i.x-9}`,d=`${i.x-2},${a} ${i.x-11},${a-5} ${i.x-11},${a+5}`,e=(h.x+230+i.x)/2,f=b-7}else if(h.y<i.y){let a=n.get(h.y)??0;n.set(h.y,a+1);let b=k+28+22*a;c=`M${j},${k} V${b} H${r} V${s-9}`,d=`${r},${s-2} ${r-5},${s-11} ${r+5},${s-11}`,e=(j+r)/2,f=b-8}else{let a=12-28*o++,g=Math.max(52,i.y-(24+b%3*12));c=`M${j},${h.y} V${h.y-20} H${a} V${g} H${r} V${s-9}`,d=`${r},${s-2} ${r-5},${s-11} ${r+5},${s-11}`,e=a-12,f=(h.y-20+g)/2,t=!0}let u=a.label?16*Array.from(a.label).length+12:0;a.label&&p.push(t?{x:e-18,y:f-u/2,width:24,height:u}:{x:e-u/2,y:f-18,width:u,height:24});let v=a.label?`<g ${t?`transform="rotate(-90 ${e} ${f})"`:""}><rect x="${e-u/2}" y="${f-18}" width="${u}" height="24" fill="white"/><text x="${e}" y="${f}" text-anchor="middle" font-size="16" fill="#334155">${l(a.label)}</text></g>`:"";return q.push(v),`<g data-source-edge="${b}" data-from="${l(a.from)}" data-to="${l(a.to)}"><path d="${c}" fill="none" stroke="#475569" stroke-width="1.6"/><polygon points="${d}" fill="#475569"/></g>`}),s=a.nodes.map((a,c)=>{let{x:d,y:e}=m.get(a.id);return`<g data-source-node="${l(a.id)}"><rect x="${d}" y="${e}" width="230" height="${g}" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${b[c].map((a,f)=>`<text x="${d+115}" y="${e+(g-24*b[c].length)/2+20+24*f}" font-size="20" text-anchor="middle">${l(a)}</text>`).join("")}</g>`}),t=Math.floor(Math.min(0,...p.map(a=>a.x-10))),u=Math.ceil(Math.max(900,...p.map(a=>a.x+a.width+10))),v=Math.floor(Math.min(0,...p.map(a=>a.y-10))),w=Math.ceil(Math.max(k,...p.map(a=>a.y+a.height+10))),x=u-t,y=w-v;return`<svg xmlns="http://www.w3.org/2000/svg" width="${x}" height="${y}" viewBox="0 0 ${x} ${y}" data-source-offset-y="${-v}" role="img"><title>${l(a.caption)}</title><desc>${l(JSON.stringify({nodes:a.nodes,edges:a.edges}))}</desc><rect width="100%" height="100%" fill="white"/><g transform="translate(${-t} ${-v})" 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">${l(a.caption)}</text>${r.join("")}${q.join("")}${s.join("")}</g></svg>`}(c),m=(0,g.createHash)("sha256").update(j).digest("hex");if((j.match(/data-source-node=/gu)??[]).length!==c.nodes.length||(j.match(/data-source-edge=/gu)??[]).length!==c.edges.length)throw Error("图件节点或关系渲染不守恒");let n=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>`})}(j),o=n.map((d,e)=>{let f=(0,g.createHash)("sha256").update(d).digest("hex"),l=`author-graph-${f}.svg`,o=k().join(a.generatedDir,"assets","figures",l);if(i().mkdirSync(k().dirname(o),{recursive:!0}),i().existsSync(o)){if(i().readFileSync(o,"utf8")!==d)throw Error("既有图件资产与原结构化单元身份不一致")}else{let a=`${o}.${process.pid}.tmp`;i().writeFileSync(a,d),i().renameSync(a,o)}let p=/data-source-range="(\d+):(\d+)"/u.exec(d),q=Number(/data-source-offset-y="(\d+)"/u.exec(j)?.[1]??0),r=p?[...j.matchAll(/data-source-node="([^"]+)"><rect\b[^>]*\by="(\d+)"/gu)].filter(a=>Number(a[2])+q>=Number(p[1])&&Number(a[2])+q<Number(p[2])).map(a=>a[1]):c.nodes.map(a=>a.id);return b.set(`${h}:${e}`,{unitId:c.id,sourceHash:h,sourceSvgHash:m,svgHash:f,file:o,nodes:c.nodes.length,edges:c.edges.length,...n.length>1?{panels:n.length,panelIndex:e,visibleNodeIds:r}:{}}),`/api/documents/generated/${a.documentId}/figure/${l}?projectRoot=${encodeURIComponent(a.projectRoot)}`});return 1===o.length?o[0]:o},receipts:()=>[...b.values()]}}function n(a){return Object.values(a.tasks).some(a=>a.current.output.units.some(a=>"figure"===a.kind))}},97797:(a,b,c)=>{c.d(b,{B:()=>l,_:()=>k});let d="[+−\\-\xb1]?(?:\\d{1,3}(?:[,,]\\d{3})+|\\d+)(?:\\.\\d+)?",e="(?:毫米|厘米|米|mm|cm|m)",f="(?![a-zA-Z\\d.%\xb2\xb3/^]|\\s*(?:[\xb2\xb3/%^]|每))",g="[\\s::=为约]*";function h(a,b){let c=new RegExp(b.source,b.flags.replace(/[gy]/gu,"")).exec(a);if(!c)return;let d=a.slice(0,c.index).trim(),f=a.slice(c.index+c[0].length),g=RegExp(`^\\s*[((]\\s*(${e})\\s*[))]`,"iu").exec(f);return{before:d,after:g?f.slice(g[0].length):f,unit:g?.[1]}}function i(a){return/^(?:mm|毫米)$/iu.test(a)?"mm":/^(?:cm|厘米)$/iu.test(a)?"cm":/^(?:m|米)$/iu.test(a)?"m":void 0}function j(a,b){let c=i(b);if(!c)return;let d=a.replace(/[,,]/gu,"").replace("−","-"),e=/^([+\-±]?)(\d+)(?:\.(\d+))?$/u.exec(d);if(!e||"\xb1"===e[1]&&/[1-9]/u.test(`${e[2]}${e[3]??""}`))return;let f="mm"===c?3:2*("cm"===c),g=e[2].padStart(f+1,"0"),h=g.length-f,j=Number(`${"-"===e[1]?"-":""}${g.slice(0,h)}.${g.slice(h)}${e[3]??""}`);return Number.isFinite(j)?j:void 0}function k(a,b){let c=h(a,b);if(!c)return;let k=`(${d})\\s*(${e})${c.unit?"?":""}${f}`,l=RegExp(`^${g}${k}`,"iu").exec(c.after),m=RegExp(`^${k}\\s*$`,"iu").exec(c.before),n=l??m,o=n?.[2]??c.unit;if(!n||!o||c.unit&&n[2]&&i(c.unit)!==i(n[2]))return;let p=l?c.after.slice(l[0].length).trim():c.after.trim();if(!/^(?:及)?(?:以上|以下)|^(?:[~~—–-]|至)\s*[+−-]?\d/u.test(p)&&(l||!p||/^[。;;,,))]+$/u.test(p)))return j(n[1],o)}function l(a,b){let c=h(a,b);if(!c)return;let k=`(${d})\\s*(${e})?\\s*(?:[~~—–-]|至)\\s*(${d})\\s*(${e})${c.unit?"?":""}${f}`,l=RegExp(`^${g}${k}`,"iu").exec(c.after)??RegExp(`^${k}\\s*$`,"iu").exec(c.before),m=l?.[4]??c.unit;if(!l||!m||c.unit&&[l[2],l[4]].some(a=>a&&i(a)!==i(c.unit)))return;let n=j(l[1],l[2]??m),o=j(l[3],m);return void 0!==n&&void 0!==o&&n>=0&&o>=n?`${n}~${o}m`:void 0}},99956:(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(54451),g=c(73024),h=c(76760),i=c(22157);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(51326),q=c(60251),r=c(63129),s=c(58978),t=c(59948),u=c(80572);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}
130
- ${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}
127
+ ${g.shared}
128
+ 最终正文通过结构化任务产物提交;内容、事实和专业要求仍须完整遵守,格式标记与自评说明不写入信息单元。`,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 bP){if(!Array.isArray(d[b]))continue;let e=[];for(let[f,i]of d[b].entries()){let d=bR(i),j=bR([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} 字符
129
+ ${j}`};return b.set(c,k),k})}(),j=[],l=0,m=[],n=a.maxTokens,p=await (0,E.Bj)({system:h,initialMessages:[{role:"user",content:`${a.prompt}
130
+
131
+ ${g.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,I.H)(a.toolContext.projectModel,{query:"*",memberIds:[...a.preloadedMemberIds]})}]:[],...a.preloadedConstructionPlan?[{toolName:"query_construction_plan",ok:!0,data:a.preloadedConstructionPlan}]:[]],budget:(0,B.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:p,turn:q})=>{let t,u,v,w;a.signal?.throwIfAborted();let x=(0,B.Iw)((0,B.Su)(a.diagnostics)),z=[...bJ("locate"),...bJ("plan"),...bJ("generate")],C=new Set((0,bL.F)(a.toolContext)),E=[...new Map(z.map(a=>[a.name,a])).values()].filter(b=>C.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}}),F=i(g),G=!1,H=n,I=await (0,A._v)({system:h,messages:F,tools:E,requireToolCall:!0,taskKind:"composition",onRawResponse:e=>{if(w=e,v=void 0,G=!0,u=(0,y.TF)(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:q,response:e,request:{system:h,messages:F,tools:E,maxTokens:H,requireToolCall:!0}}),e.responseMetadata?.finishReason==="length"){(0,d.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:q,toolCalls:e.toolCalls.length,reason:"作者工具输出被供应商截断;完整原响应已归档,暂停核查单任务协议与实际思考开销,不重写整任务或继续整包取证"},"model-output-truncated");let c=e.requestMetadata?.maxTokens,f=void 0!==H?Math.ceil(1.5*H):void 0!==c?Math.ceil(1.5*c):void 0,g=e.requestMetadata?.outputCap;v={kind:"incomplete-output",sentOutputBudget:c??null,nextOutputBudget:(n=void 0===f?void 0:void 0===g?f:Math.min(f,g))??null,finishReason:"length"}}else e.responseMetadata?.protocolFailure&&(v={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"))&&(0,bS.E7)(a.diagnostics,c.section.id,!1)},callKind:(0,bS.OD)(a.diagnostics,c.section.id)?"chapter-repair":"chapter-writing",stablePrefixChars:a.stablePrefixChars,maxTokens:H,signal:a.signal,diagnostics:a.diagnostics});if(a.signal?.throwIfAborted(),G||(u=(0,y.TF)(a.diagnostics,{chapterId:a.chapterId??"",blockTitle:a.blockTitle??b,turn:q,response:I})),!G&&I?.responseMetadata?.completed===!1&&I.toolCalls.some(a=>"submit_author_task"===a.name)&&(0,bS.E7)(a.diagnostics,c.section.id,!1),!I){if(w?.responseMetadata?.protocolFailure==="invalid-tool-arguments"&&Array.isArray(w.rawToolCalls)){let a=w.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&&E.some(b=>b.name===a.name))){let b=[{role:"assistant",content:w.content,...void 0===w.thinkingContent?{}:{thinkingContent:w.thinkingContent},toolCalls:a},...a.map(a=>({role:"tool",toolCallId:a.id,content:s(r(a.name,k(`本次参数未执行:${JSON.stringify(w.droppedToolCalls??[])};只纠正语法结构,保留前述原字全部正文、表格和图数据`),Date.now()))}))];return{text:"",toolCalls:[],protocolRecovery:v,toolMessages:b}}}let b=(0,B.Su)(a.diagnostics);if((0,B.Iw)(b)>x||(0,B.nY)(b)||(0,B.Z9)(b)){let a=(0,B.nY)(b)??(0,B.Z9)(b);return{text:"",toolCalls:[],refused:{kind:a?.kind??"budget",message:a?.message??"预算耗尽:本次调用未发起"}}}return{text:"",toolCalls:[],...v?{protocolRecovery:v,toolMessages:[{role:"user",content:`上一工具响应未接纳。实际协议回执:${JSON.stringify(v)}。解析失败或未报告finish_reason不能证明输出额度不足,不凭空扩大预算;原始有意义文字完整保留。保留完整原任务和已取得证据,纠正实际工具参数语法与标注;已有服务端保留的可解析原稿使用correct_author_submission,不重新生成它的段落、表行或图数据;不得补造事实。`}]}:{}}}let J=[],K=[],L=[],M=[],N=async(b,d)=>{let e;if(I.responseMetadata?.completed!==!0)throw Error("作者响应未完整结束,不能提交为完整任务");if(void 0!==a.maxAuthorSubmissions&&l>=a.maxAuthorSubmissions)throw Error("本任务的定向内容修改次数已用完,不能再次改稿");try{e=(0,bN.Ix)(b,{contract:c.contract,taskId:c.section.id,projectModel:a.toolContext?.projectModel}),await a.beforeAuthorSubmit?.(e)}catch(b){throw(0,bS.E7)(a.diagnostics,c.section.id,!1),b}let f=(0,bS.Y1)(a.diagnostics,c.section.id,e,e&&"object"==typeof e&&"string"==typeof e.revisionReason?e.revisionReason:void 0,{preserveFirstDraft:!a.beforeAuthorSubmit});for(let b of(l+=1,(0,y.cG)(a.diagnostics,f,u,d),t=f.markdown,f.output.decisionRequests))await a.toolContext.audit?.requestClarification({question:b.question,blocking:!0});return{taskId:f.output.taskId,contentHash:f.contentHash,pendingCriterionIds:f.pendingCriterionIds}},O={...a.toolContext,stage:"generate",allowedTools:E.map(a=>a.name),authorTask:{criterionIds:(0,e.C)(c.contract,c.section.id).map(a=>a.id),submit:async a=>{let b=m.length,c={output:structuredClone(a),accepted:!1,rawCallId:u??null};m.push(c);try{let b=await N(a);c.accepted=!0;let d=(0,bN.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=m[a];if(!c||c.accepted)throw Error("只能纠正本任务当前实际未接收原稿");let d=(0,bT.QN)(c.output,b);c.output=d;let e=await N(d,{submissionIndex:a,originalRawCallId:c.rawCallId,changes:b});return c.accepted=!0,e}}},P=void 0!==p?Math.max(0,p):I.toolCalls.length,Q=a=>"submit_author_task"===a||"correct_author_submission"===a,R=I.toolCalls.find(a=>Q(a.name)),S=new Set([...I.toolCalls.filter(a=>!Q(a.name)).slice(0,Math.max(0,P-(R||void 0!==p&&E.some(a=>"submit_author_task"===a.name)?1:0))),...R&&P>0?[R]:[]]),T=I.toolCalls.filter(a=>S.has(a)),U=I.toolCalls.length-T.length;for(let b of(U>0&&(console.warn(`[agent-tools] 单轮工具调用超块级预算,已截断 ${U} 次(限额 ${p})`),a.onToolIssue?.([{level:"warning",category:"structure",owner:"system",message:`本轮工具调用超出块级上限,已执行前 ${T.length} 次、截断 ${U} 次——请合并查询或减少工具调用`,suggestion:"下一轮只调真正需要的工具;剩余额度见块预算"}])),T)){let c,d;a.signal?.throwIfAborted();let e=Date.now();try{c=(0,f.parseJsonWithoutDuplicateKeys)(b.arguments||"{}")}catch(a){d=a instanceof Error?a.message:String(a)}let g=d?r(b.name,k(d),e):await bK(b.name,c,O);if(a.signal?.throwIfAborted(),K.push(g.ok?{toolName:b.name,ok:!0,data:g.data}:{toolName:b.name,ok:!1,error:{code:g.error.code}}),g.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&&O.audit?.recordEvidenceCall&&O.audit.recordEvidenceCall({tool:b.name,term:a})}0===L.length&&L.push({role:"assistant",content:I.content??"",toolCalls:T.map(a=>({id:a.id,name:a.name,arguments:a.arguments})),...void 0!==I.thinkingContent?{thinkingContent:I.thinkingContent}:{}}),L.push({role:"tool",content:s(g),toolCallId:b.id});let h=g.ok?g.injection:void 0;h?.suspicious&&M.push({tool:b.name,patterns:h.patterns}),J.push({toolName:b.name,ok:g.ok,durMs:Date.now()-e,summary:g.ok?`ok ${g.bytes??0}B${h?.suspicious?" \xb7 疑似注入(按数据对待)":""}`:`${g.error.code}`})}if(j.push(...J),M.length>0){let c=M.map(a=>`${a.tool}(${a.patterns.join("、")})`).join(";");a.diagnostics&&(a.diagnostics.llm.lastInfo=`工具结果命中疑似注入 ${M.length} 处:${c}——已按数据对待并记节点 issue`);try{a.onToolIssue?a.onToolIssue(M.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})——该内容已按数据对待(模型侧带「${o}」前缀),本节正文不得因它改变写作口径`,suggestion:"人工复核该资料:若确为提示注入,请把该文件移出资料范围后重跑本节;正文中据其写出的事实须另行核实来源。",...a.nodeId?{sectionTitle:a.nodeId}:{},provenance:{detectorId:"suspicious-injection",fingerprint:(0,D.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=`工具结果命中疑似注入 ${M.length} 处:${c}——**节点 issue 未落库**(${b}):命中未被静默丢弃,但记账不完整`),console.error(`[agent-tools] 记录疑似注入节点 issue 失败(${c}):${b}`,d)}}let V=L.length>0?[...L,...U?[{role:"user",content:`该原始响应另有${U}个工具请求未执行,不能将它们当成取证结果。正文提交额度已经预留;依据实际已给的资料与已完成取证写作,真实缺口留作未决事项,不再猜属性或遍历全部资料。`}]:[]]:[];return{text:t??"",...void 0!==t?{committed:t}:{},toolCalls:J,toolMessages:V,toolResults:K}}}),q=m.filter(a=>!a.accepted).length;if(("unfixable"===p.kind||"no_content"===p.kind)&&"no-progress"===p.cause&&(0,d.wD)({nodeId:b,chapterId:a.chapterId,title:a.blockTitle,turn:p.turn,toolCalls:p.toolCalls,reason:p.reason}),a.onOutcome?.(q?{...p,rejectedSubmissions:q}:p),"no_content"===p.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环未产出正文:${p.reason}`);return}if("budget_refused"===p.kind){a.diagnostics&&(a.diagnostics.llm.lastError=`写手循环被预算挡回(${p.refused.kind}):${p.reason}`);return}"unfixable"===p.kind&&a.diagnostics&&(a.diagnostics.llm.lastInfo=`写手循环停止(${p.cause}),保留当前候选(残余 ${p.residual}):${p.reason}`);let t=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} —— 提交当前最好草稿,缺口由块账与导出门禁承载`}}(p);return t&&(a.diagnostics&&(a.diagnostics.llm.lastInfo=`${a.diagnostics.llm.lastInfo??""};本块残余 ${"unfixable"===p.kind?p.residual:0} 未收敛`),a.toolContext?.audit?.declareUnfixable(t)),p.content}},96241:(a,b,c)=>{function d(a,b){let c=a.match(/[≤≥±]?[A-Za-z0-9][A-Za-z0-9._%/+−-]*|[\s\S]/gu)??[],d=[],e="";for(let a of c)e&&Array.from(e+a).length>b&&(d.push(e),e=""),e+=a;return e&&d.push(e),d}c.d(b,{rZ:()=>m,D0:()=>n});var e=c(71783);let f=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;");var g=c(77598),h=c(73024),i=c.n(h),j=c(76760),k=c.n(j);let l=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&apos;");function m(a){if(!/^[A-Za-z0-9_-]+$/u.test(a.documentId))throw Error("图件文档身份无效");let b=new Map;return{renderer:c=>{let h=(0,g.createHash)("sha256").update(JSON.stringify(c)).digest("hex"),j=function(a){if(a.layout)return function(a){let b=(0,e.Q)(a.layout,a.nodes.map(a=>a.id),a.edges),c=d(a.caption,40),g=27*Math.max(0,c.length-2),h={x:35,y:95+g,width:930,height:590},i=[],j=a=>({x:h.x+a.x*h.width,y:h.y+a.y*h.height}),k=b.routes.map(b=>{let c=b.points.map(j),e=a.edges[b.edgeIndex].label,g=c.slice(1).map((a,b)=>Math.hypot(a.x-c[b].x,a.y-c[b].y)),i=g.reduce((a,b)=>a+b,0)/2,k=c[0];for(let a=0;a<g.length;a++){if(i<=g[a]&&g[a]>0){let b=i/g[a];k={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}i-=g[a]}let l=d(e??"",40),m=20*l.length;if(m>h.height)throw Error("空间路线完整标签无法在图中清晰显示,须调整图件布局");let n=Math.min(600,Math.max(0,...l.map(a=>15*Array.from(a).length))),o=Math.max(h.x+n/2,Math.min(h.x+h.width-n/2,k.x)),p=Math.max(h.y+m,Math.min(h.y+h.height-10,k.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"/>${l.length?`<rect x="${o-n/2-3}" y="${p-m+3}" width="${n+6}" height="${m}" fill="white"/><text x="${o}" y="${p-m+20}" text-anchor="middle" font-size="15" fill="#334155">${l.map((a,b)=>`<tspan x="${o}" dy="${20*!!b}">${f(a)}</tspan>`).join("")}</text>`:""}</g>`}),l=b.placements.map(b=>{let c=a.nodes.find(a=>a.id===b.nodeId),e=j(b),g=b.width*h.width,k=b.height*h.height,l=20,m=[];for(;l>=12;l--){let a=Math.max(1,Math.floor((g-16)/l));if((m=d(c.label,a)).length*(l+5)+12<=k&&m.every(a=>Array.from(a).length*l<=g-16))break}if(l<12){let b=a.nodes.findIndex(a=>a.id===c.id)+1,d=Array.from(c.label).reduce((a,b,c)=>{let d=Math.floor(c/48);return a[d]=(a[d]??"")+b,a},[]);return i.push({nodeId:c.id,number:b,lines:d}),`<g data-source-node="${f(c.id)}"><title>${f(c.label)}</title><rect x="${e.x}" y="${e.y}" width="${g}" height="${k}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/><text x="${e.x+g/2}" y="${e.y+k/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="${e.x}" y="${e.y}" width="${g}" height="${k}" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${m.map((a,b)=>`<text x="${e.x+g/2}" y="${e.y+(k-m.length*(l+5))/2+l+b*(l+5)}" font-size="${l}" text-anchor="middle">${f(a)}</text>`).join("")}</g>`}),m=h.y+h.height+28,n=i.map(a=>{let b=a.lines.map((b,c)=>`<text x="35" y="${m+24*c}" font-size="16">${c?"":`${a.number}&#160;&#160;`}${f(b)}</text>`).join("");return m+=24*a.lines.length+8,`<g data-label-legend-for="${f(a.nodeId)}">${b}</g>`}).join(""),o=Math.max(760+g,m+62);return`<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="${o}" viewBox="0 0 1000 ${o}" 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="${h.x}" y="${h.y}" width="${h.width}" height="${h.height}" fill="none" stroke="#94a3b8"/>${k.join("")}${l.join("")}${n}<text x="35" y="${o-35}" font-size="16">相对位置布置示意${i.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=>d(a.label,10)),c=Math.min(3,a.nodes.length),g=Math.max(66,...b.map(a=>24*a.length+24)),h=new Map(a.nodes.map((a,b)=>[a.id,Math.floor(b/c)])),i=new Map;for(let b of a.edges)h.get(b.from)<h.get(b.to)&&i.set(h.get(b.from),(i.get(h.get(b.from))??0)+1);let j=g+Math.max(105,22*Math.max(0,...i.values())+45),k=125+Math.ceil(a.nodes.length/c)*j,m=new Map(a.nodes.map((a,b)=>[a.id,{x:40+b%c*295,y:110+Math.floor(b/c)*j}])),n=new Map,o=0,p=[{x:450-19*Array.from(a.caption).length/2,y:10,width:19*Array.from(a.caption).length,height:32}],q=[],r=a.edges.map((a,b)=>{let c,d,e,f,h=m.get(a.from),i=m.get(a.to),j=h.x+115,k=h.y+g,r=i.x+115,s=i.y,t=!1;if(h.y===i.y&&i.x>h.x&&i.x-h.x<320){let a=h.y+g/2,b=h.y-20;c=`M${h.x+230},${a} H${h.x+230+14} V${b} H${i.x-14} V${a} H${i.x-9}`,d=`${i.x-2},${a} ${i.x-11},${a-5} ${i.x-11},${a+5}`,e=(h.x+230+i.x)/2,f=b-7}else if(h.y<i.y){let a=n.get(h.y)??0;n.set(h.y,a+1);let b=k+28+22*a;c=`M${j},${k} V${b} H${r} V${s-9}`,d=`${r},${s-2} ${r-5},${s-11} ${r+5},${s-11}`,e=(j+r)/2,f=b-8}else{let a=12-28*o++,g=Math.max(52,i.y-(24+b%3*12));c=`M${j},${h.y} V${h.y-20} H${a} V${g} H${r} V${s-9}`,d=`${r},${s-2} ${r-5},${s-11} ${r+5},${s-11}`,e=a-12,f=(h.y-20+g)/2,t=!0}let u=a.label?16*Array.from(a.label).length+12:0;a.label&&p.push(t?{x:e-18,y:f-u/2,width:24,height:u}:{x:e-u/2,y:f-18,width:u,height:24});let v=a.label?`<g ${t?`transform="rotate(-90 ${e} ${f})"`:""}><rect x="${e-u/2}" y="${f-18}" width="${u}" height="24" fill="white"/><text x="${e}" y="${f}" text-anchor="middle" font-size="16" fill="#334155">${l(a.label)}</text></g>`:"";return q.push(v),`<g data-source-edge="${b}" data-from="${l(a.from)}" data-to="${l(a.to)}"><path d="${c}" fill="none" stroke="#475569" stroke-width="1.6"/><polygon points="${d}" fill="#475569"/></g>`}),s=a.nodes.map((a,c)=>{let{x:d,y:e}=m.get(a.id);return`<g data-source-node="${l(a.id)}"><rect x="${d}" y="${e}" width="230" height="${g}" rx="6" fill="#f8fafc" stroke="#334155" stroke-width="1.5"/>${b[c].map((a,f)=>`<text x="${d+115}" y="${e+(g-24*b[c].length)/2+20+24*f}" font-size="20" text-anchor="middle">${l(a)}</text>`).join("")}</g>`}),t=Math.floor(Math.min(0,...p.map(a=>a.x-10))),u=Math.ceil(Math.max(900,...p.map(a=>a.x+a.width+10))),v=Math.floor(Math.min(0,...p.map(a=>a.y-10))),w=Math.ceil(Math.max(k,...p.map(a=>a.y+a.height+10))),x=u-t,y=w-v;return`<svg xmlns="http://www.w3.org/2000/svg" width="${x}" height="${y}" viewBox="0 0 ${x} ${y}" data-source-offset-y="${-v}" role="img"><title>${l(a.caption)}</title><desc>${l(JSON.stringify({nodes:a.nodes,edges:a.edges}))}</desc><rect width="100%" height="100%" fill="white"/><g transform="translate(${-t} ${-v})" 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">${l(a.caption)}</text>${r.join("")}${q.join("")}${s.join("")}</g></svg>`}(c),m=(0,g.createHash)("sha256").update(j).digest("hex");if((j.match(/data-source-node=/gu)??[]).length!==c.nodes.length||(j.match(/data-source-edge=/gu)??[]).length!==c.edges.length)throw Error("图件节点或关系渲染不守恒");let n=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>`})}(j),o=n.map((d,e)=>{let f=(0,g.createHash)("sha256").update(d).digest("hex"),l=`author-graph-${f}.svg`,o=k().join(a.generatedDir,"assets","figures",l);if(i().mkdirSync(k().dirname(o),{recursive:!0}),i().existsSync(o)){if(i().readFileSync(o,"utf8")!==d)throw Error("既有图件资产与原结构化单元身份不一致")}else{let a=`${o}.${process.pid}.tmp`;i().writeFileSync(a,d),i().renameSync(a,o)}let p=/data-source-range="(\d+):(\d+)"/u.exec(d),q=Number(/data-source-offset-y="(\d+)"/u.exec(j)?.[1]??0),r=p?[...j.matchAll(/data-source-node="([^"]+)"><rect\b[^>]*\by="(\d+)"/gu)].filter(a=>Number(a[2])+q>=Number(p[1])&&Number(a[2])+q<Number(p[2])).map(a=>a[1]):c.nodes.map(a=>a.id);return b.set(`${h}:${e}`,{unitId:c.id,sourceHash:h,sourceSvgHash:m,svgHash:f,file:o,nodes:c.nodes.length,edges:c.edges.length,...n.length>1?{panels:n.length,panelIndex:e,visibleNodeIds:r}:{}}),`/api/documents/generated/${a.documentId}/figure/${l}?projectRoot=${encodeURIComponent(a.projectRoot)}`});return 1===o.length?o[0]:o},receipts:()=>[...b.values()]}}function n(a){return Object.values(a.tasks).some(a=>a.current.output.units.some(a=>"figure"===a.kind))}},97797:(a,b,c)=>{c.d(b,{B:()=>l,_:()=>k});let d="[+−\\-\xb1]?(?:\\d{1,3}(?:[,,]\\d{3})+|\\d+)(?:\\.\\d+)?",e="(?:毫米|厘米|米|mm|cm|m)",f="(?![a-zA-Z\\d.%\xb2\xb3/^]|\\s*(?:[\xb2\xb3/%^]|每))",g="[\\s::=为约]*";function h(a,b){let c=new RegExp(b.source,b.flags.replace(/[gy]/gu,"")).exec(a);if(!c)return;let d=a.slice(0,c.index).trim(),f=a.slice(c.index+c[0].length),g=RegExp(`^\\s*[((]\\s*(${e})\\s*[))]`,"iu").exec(f);return{before:d,after:g?f.slice(g[0].length):f,unit:g?.[1]}}function i(a){return/^(?:mm|毫米)$/iu.test(a)?"mm":/^(?:cm|厘米)$/iu.test(a)?"cm":/^(?:m|米)$/iu.test(a)?"m":void 0}function j(a,b){let c=i(b);if(!c)return;let d=a.replace(/[,,]/gu,"").replace("−","-"),e=/^([+\-±]?)(\d+)(?:\.(\d+))?$/u.exec(d);if(!e||"\xb1"===e[1]&&/[1-9]/u.test(`${e[2]}${e[3]??""}`))return;let f="mm"===c?3:2*("cm"===c),g=e[2].padStart(f+1,"0"),h=g.length-f,j=Number(`${"-"===e[1]?"-":""}${g.slice(0,h)}.${g.slice(h)}${e[3]??""}`);return Number.isFinite(j)?j:void 0}function k(a,b){let c=h(a,b);if(!c)return;let k=`(${d})\\s*(${e})${c.unit?"?":""}${f}`,l=RegExp(`^${g}${k}`,"iu").exec(c.after),m=RegExp(`^${k}\\s*$`,"iu").exec(c.before),n=l??m,o=n?.[2]??c.unit;if(!n||!o||c.unit&&n[2]&&i(c.unit)!==i(n[2]))return;let p=l?c.after.slice(l[0].length).trim():c.after.trim();if(!/^(?:及)?(?:以上|以下)|^(?:[~~—–-]|至)\s*[+−-]?\d/u.test(p)&&(l||!p||/^[。;;,,))]+$/u.test(p)))return j(n[1],o)}function l(a,b){let c=h(a,b);if(!c)return;let k=`(${d})\\s*(${e})?\\s*(?:[~~—–-]|至)\\s*(${d})\\s*(${e})${c.unit?"?":""}${f}`,l=RegExp(`^${g}${k}`,"iu").exec(c.after)??RegExp(`^${k}\\s*$`,"iu").exec(c.before),m=l?.[4]??c.unit;if(!l||!m||c.unit&&[l[2],l[4]].some(a=>a&&i(a)!==i(c.unit)))return;let n=j(l[1],l[2]??m),o=j(l[3],m);return void 0!==n&&void 0!==o&&n>=0&&o>=n?`${n}~${o}m`:void 0}},99956:(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(54451),g=c(73024),h=c(76760),i=c(22157);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(51326),q=c(60251),r=c(63129),s=c(58978),t=c(59948),u=c(80572);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}
132
+ ${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}
131
133
  只返回 JSON,不要返回 markdown。`:a},{role:"user",content:f?`${b}
132
134
 
133
135
  (重要:缩短思考过程,直接给出最终结论。)`: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。":""}