import {splitAnalysisText} from './analysis-parts.mjs'; import {qualifyOfferAudit} from './offer-audit.mjs'; /** Audit every supplied requirement against every draft part, without generic AI-schema merging. */ export async function auditOfferInParts(requirements, draft, run, {signal} = {}) { signal?.throwIfAborted(); const groups=[];let current=[],size=0; for(const requirement of requirements) { if(requirement.length>8000) throw new Error('Tek bir denetim gerekliliği çok uzun. Kaynak maddeyi ayrı gerekliliklere ayırın.'); if(current.length && size+requirement.length>8000){groups.push(current);current=[];size=0;} current.push(requirement);size+=requirement.length+10; } if(current.length)groups.push(current); const parts=splitAnalysisText(draft,10000),jobs=groups.flatMap((group,g)=>parts.map(part=>({group,g,part}))),results=[]; for(let i=0;i{ try { const output=await run(job.group,job.part.text); results.push({...job,review:qualifyOfferAudit(output,job.group,job.part.text)}); } catch(error){results.push({...job,error:String(error.message || error)});} })); } signal?.throwIfAborted(); if(!results.some(result=>result.review))throw new Error('Taslağın hiçbir bölümü denetlenemedi. Yeniden deneyin.'); const merged=[]; for(const [g,group] of groups.entries()) for(const requirement of group) { const matching=results.filter(result=>result.g===g); const rows=matching.flatMap(result=>result.review?.maddeler.filter(row=>row.gereklilik===requirement) || []); const verified=rows.find(row=>row.durum==='karsilaniyor'); const failed=matching.some(result=>result.error); merged.push(failed ? {gereklilik:requirement,durum:'belirsiz',oneri:'Taslağın bazı bölümleri denetlenemedi. Yeniden deneyin.'} : verified || (rows.length===parts.length && rows.every(row=>row.durum==='eksik') ? {gereklilik:requirement,durum:'eksik'} : {gereklilik:requirement,durum:'belirsiz'})); } const review=qualifyOfferAudit({maddeler:merged},requirements,draft); return {...review,auditReview:{draftParts:parts.length,requirementGroups:groups.length,failedCalls:results.filter(row=>row.error).length}, kapsam:review.kapsam+' Uzun taslak bölümler halinde kontrol edilir; bölümler arasına yayılan bir kanıt elle kontrol gerektirebilir.'}; }