31 lines
1.9 KiB
JavaScript
31 lines
1.9 KiB
JavaScript
import {createHash} from 'node:crypto';
|
||
import {splitAnalysisText} from './analysis-parts.mjs';
|
||
|
||
/** Scan every source part, accepting only literal requirements located in that part. */
|
||
export async function sourceRequirements(text,run,{signal}={}) {
|
||
const parts=splitAnalysisText(text,6000),results=new Map();
|
||
for(let start=0;start<parts.length;start+=2) {
|
||
signal?.throwIfAborted();
|
||
await Promise.all(parts.slice(start,start+2).map(async part=>{
|
||
const result=await run(part,parts.length);
|
||
signal?.throwIfAborted();
|
||
if(!Array.isArray(result?.requirements))throw new Error('Kaynak şartları geçerli liste olarak çıkarılamadı. Denetim tamamlanmadı.');
|
||
const rows=[];
|
||
for(const entry of result.requirements) {
|
||
const quote=entry?.quote;
|
||
if(typeof quote!=='string' || quote.trim().length<15 || !part.text.includes(quote))
|
||
throw new Error('Çıkarılan şartın kaynak alıntısı doğrulanamadı. Denetim tamamlanmadı.');
|
||
const offset=part.text.indexOf(quote);
|
||
rows.push({quote,part:part.index+1,start:part.start+offset,end:part.start+offset+quote.length});
|
||
}
|
||
results.set(part.index,rows);
|
||
}));
|
||
}
|
||
signal?.throwIfAborted();
|
||
const evidence=parts.flatMap(part=>results.get(part.index));
|
||
const unique=[...new Map(evidence.map(row=>[JSON.stringify([row.start,row.end]),row])).values()];
|
||
return {requirements:unique.map(row=>`Kaynak bölüm ${row.part} (karakter ${row.start+1}–${row.end}): ${row.quote}`),
|
||
sourceReview:{sourceHash:createHash('sha256').update(text).digest('hex'),sourceCharacters:text.length,scannedParts:parts.length,selectedRequirements:unique.length,evidence:unique},
|
||
scope:'Kaynak metnin tüm parçaları şart seçimi için tarandı; denetim, seçilen gerçek alıntılar ve verilen kalem/koşul listesiyle sınırlıdır. AI şart atlayabilir; parça sınırları, bağlam ve çelişen hükümler resmi dokümanda ayrıca kontrol edilmelidir.'};
|
||
}
|