Setting the file. One moment. Knowledge Observation · Rp Telemetry · wix/skills · Skills Docslib/knowledge-observation.js
lib/knowledge-observation.js
JavaScript·34 lines·3 KB
=
[
'resolved-mapping'
,
'deferred-field'
,
'deferred-record'
,
'verified-repair'
];
5const LEVELS = ['schema-reviewed','mapping-examples','read-back','not-verified'];
6const KEYS = ['findingClass','targetRef','operation','toolkitVersion','outcome','verificationLevel','affectedCount'];
7function publicOperation(targetRef, operation) {
8 if (targetRef === 'unregistered' && operation === 'unregistered') return true;
9 if (!/^[a-z0-9-]+\/[a-z0-9-]+$/.test(targetRef || '')) return false;
10 let k;
11 try { const [domain,entity] = targetRef.split('/'); k = JSON.parse(fs.readFileSync(path.join(__dirname,'../../rp-target-wix/domains',domain,'entities',entity+'.json'))); } catch { return false; }
12 const writers = require('../../rp-target-wix/lib/wix-writers');
13 return operation === k.preferredWrite?.writerId || (writers.WRITE_BUILDERS_BY_ENTITY[targetRef] || []).includes(operation) ||
14 Object.entries(k.operationContracts || {}).some(([name,c]) => name === operation || c.aliases?.includes(operation)) ||
15 (['sendGuardedRawRequest','buildGuardedRawRequest'].includes(operation) && require('../../../lib/target-import-support').rawRequestEntity(targetRef)) ||
16 require('../../../lib/target-import-support').alternateWriter(targetRef, operation)?.ok === true;
17}
18function validate(input) {
19 if (!input || typeof input !== 'object' || Array.isArray(input) || Object.keys(input).some(k => !KEYS.includes(k)) || KEYS.some(k => !Object.hasOwn(input,k)) ||
20 !CLASSES.includes(input.findingClass) || !OUTCOMES.includes(input.outcome) || !LEVELS.includes(input.verificationLevel) ||
21 !publicOperation(input.targetRef,input.operation) || !/^(unknown|\d+\.\d+\.\d+)$/.test(input.toolkitVersion) ||
22 !(input.affectedCount === null || Number.isSafeInteger(input.affectedCount) && input.affectedCount >= 0) ||
23 (input.outcome === 'verified-repair' && input.verificationLevel !== 'read-back')) throw new Error('knowledge_observation_invalid');
24 const result = Object.fromEntries(KEYS.map(k => [k,input[k]]));
25 return {...result, schemaVersion:1, signature:crypto.createHash('sha256').update(JSON.stringify([result.findingClass,result.targetRef,result.operation])).digest('hex')};
26}
27function event(input) {
28 const safe = {...input};
29 if (!publicOperation(safe.targetRef,safe.operation)) { safe.targetRef='unregistered'; safe.operation='unregistered'; }
30 return {event_type:'skill_coverage_gap',subtype:safe.findingClass==='conflicting-knowledge'?'ambiguous_instruction':'path_not_covered',
31 stage:safe.outcome==='verified-repair'?'import':'mapping',skill:safe.outcome==='verified-repair'?'rp-execute-import':'rp-mapper',severity:'degraded',
32 what_happened:'A mapping knowledge observation was recorded.',knowledge_observation:safe};
33}
34module.exports = {validate,event,publicOperation};