18 lines
1.1 KiB
JavaScript
18 lines
1.1 KiB
JavaScript
const fields=new Set(['itemsAndSpecs','documentChecklist','qualificationCriteria','criticalRequirements','risksAndPenalties','criticalDetails','disqualificationRisks','deadlines','roadmap']);
|
|
export function verifyAnalysisCitations(result,source) {
|
|
const evidence=[];
|
|
for(const citation of Array.isArray(result.citations)?result.citations:[]) {
|
|
const match=/^([A-Za-z]+)\.(\d+)$/.exec(String(citation?.path || ''));
|
|
if(!match || !fields.has(match[1]) || !Array.isArray(result[match[1]]) || Number(match[2])>=result[match[1]].length)continue;
|
|
const quote=String(citation.quote || '').trim();
|
|
if(quote.length<12 || quote.length>1500)continue;
|
|
const start=source.indexOf(quote);
|
|
evidence.push({path:citation.path,quote,status:start<0?'not_found':source.indexOf(quote,start+1)>=0?'ambiguous':'located',
|
|
start:start<0?null:start,end:start<0?null:start+quote.length});
|
|
}
|
|
const missing=[];
|
|
for(const field of fields)for(let i=0;i<(Array.isArray(result[field])?result[field].length:0);i++)
|
|
if(!evidence.some(e=>e.path===`${field}.${i}` && e.status==='located'))missing.push(`${field}.${i}`);
|
|
return {evidence,missing};
|
|
}
|