80 lines
2.6 KiB
JavaScript
80 lines
2.6 KiB
JavaScript
var fs = require('fs');
|
|
var assetStore = require('../src/gep/assetStore');
|
|
var a2a = require('../src/gep/a2a');
|
|
var memGraph = require('../src/gep/memoryGraphAdapter');
|
|
var contentHash = require('../src/gep/contentHash');
|
|
var a2aProto = require('../src/gep/a2aProtocol');
|
|
|
|
function readStdin() {
|
|
try { return fs.readFileSync(0, 'utf8'); } catch (e) { return ''; }
|
|
}
|
|
|
|
function parseSignalsFromEnv() {
|
|
var raw = process.env.A2A_SIGNALS || '';
|
|
if (!raw) return [];
|
|
try {
|
|
var maybe = JSON.parse(raw);
|
|
if (Array.isArray(maybe)) return maybe.map(String).filter(Boolean);
|
|
} catch (e) {}
|
|
return String(raw).split(',').map(function (s) { return s.trim(); }).filter(Boolean);
|
|
}
|
|
|
|
function main() {
|
|
var args = process.argv.slice(2);
|
|
var inputPath = '';
|
|
for (var i = 0; i < args.length; i++) {
|
|
if (args[i] && !args[i].startsWith('--')) { inputPath = args[i]; break; }
|
|
}
|
|
var source = process.env.A2A_SOURCE || 'external';
|
|
var factor = Number.isFinite(Number(process.env.A2A_EXTERNAL_CONFIDENCE_FACTOR))
|
|
? Number(process.env.A2A_EXTERNAL_CONFIDENCE_FACTOR) : 0.6;
|
|
|
|
var text = inputPath ? a2a.readTextIfExists(inputPath) : readStdin();
|
|
var parsed = a2a.parseA2AInput(text);
|
|
var signals = parseSignalsFromEnv();
|
|
|
|
var accepted = 0;
|
|
var rejected = 0;
|
|
var emitDecisions = process.env.A2A_EMIT_DECISIONS === 'true';
|
|
|
|
for (var j = 0; j < parsed.length; j++) {
|
|
var obj = parsed[j];
|
|
if (!a2a.isAllowedA2AAsset(obj)) continue;
|
|
|
|
if (obj.asset_id && typeof obj.asset_id === 'string') {
|
|
if (!contentHash.verifyAssetId(obj)) {
|
|
rejected += 1;
|
|
if (emitDecisions) {
|
|
try {
|
|
var dm = a2aProto.buildDecision({ assetId: obj.asset_id, localId: obj.id, decision: 'reject', reason: 'asset_id integrity check failed' });
|
|
a2aProto.getTransport().send(dm);
|
|
} catch (e) {}
|
|
}
|
|
continue;
|
|
}
|
|
}
|
|
|
|
var staged = a2a.lowerConfidence(obj, { source: source, factor: factor });
|
|
if (!staged) continue;
|
|
|
|
assetStore.appendExternalCandidateJsonl(staged);
|
|
try { memGraph.recordExternalCandidate({ asset: staged, source: source, signals: signals }); } catch (e) {}
|
|
|
|
if (emitDecisions) {
|
|
try {
|
|
var dm2 = a2aProto.buildDecision({ assetId: staged.asset_id, localId: staged.id, decision: 'quarantine', reason: 'staged as external candidate' });
|
|
a2aProto.getTransport().send(dm2);
|
|
} catch (e) {}
|
|
}
|
|
|
|
accepted += 1;
|
|
}
|
|
|
|
process.stdout.write('accepted=' + accepted + ' rejected=' + rejected + '\n');
|
|
}
|
|
|
|
try { main(); } catch (e) {
|
|
process.stderr.write((e && e.message ? e.message : String(e)) + '\n');
|
|
process.exit(1);
|
|
}
|