livrare lot 2

This commit is contained in:
EVOTECH IT SRL 2026-07-10 03:39:53 -07:00
commit 8ecc78e729
763 changed files with 164593 additions and 0 deletions

View file

@ -0,0 +1,84 @@
/**
* Helpers for building + persisting a minimal AnalysisSession when a single
* component runs standalone (i.e. /techniques/analyze, not /pipeline/analyze).
*
* Replaces old saveAndSyncComponent + syncToPostgres flow.
*/
import type { AnalysisSession, InputType } from '../../shared/types/analysis-session';
import { log } from '../../shared/logger';
import { getPersistServiceInstance } from '../_init';
interface BuildOpts {
sessionId: string;
userId?: string;
userEmail?: string;
inputType: InputType;
inputText?: string;
inputUrl?: string;
mediaUrl?: string;
result: any;
/** 'techniques' | 'ai_tampered' | 'claims' | 'source_assessment'. Defaults to 'techniques'. */
component?: string;
durationMs: number;
llmUsage?: any[];
}
export function buildStandaloneSession(opts: BuildOpts): AnalysisSession {
const now = new Date().toISOString();
const comp = opts.component || 'techniques';
let llm_usage = null;
if (opts.llmUsage && opts.llmUsage.length > 0) {
const summary = { calls: opts.llmUsage.length, prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 };
for (const e of opts.llmUsage) {
summary.prompt_tokens += e.prompt_tokens;
summary.completion_tokens += e.completion_tokens;
summary.total_tokens += e.total_tokens;
}
llm_usage = { total: summary, by_component: { [comp]: summary } };
}
return {
session_id: opts.sessionId,
user_id: opts.userId || null,
user_email: opts.userEmail || null,
input_type: opts.inputType,
input_text: opts.inputText || null,
input_url: opts.inputUrl || null,
input_media_url: opts.mediaUrl || null,
input_hash: null,
status: 'completed',
components_run: [comp],
components_skipped: ['ai_tampered', 'claims', 'domain', 'verdict'].filter(c => c !== comp),
risk_score: null,
risk_category: null,
risk_level: null,
confidence: null,
confidence_level: null,
started_at: new Date(Date.now() - opts.durationMs).toISOString(),
completed_at: now,
total_duration_ms: opts.durationMs,
scenario_applied: null,
topic_applied: null,
source_app: 'web',
api_version: 'v3',
created_at: now,
techniques: comp === 'techniques' ? opts.result : null,
ai_tampered: comp === 'ai_tampered' ? opts.result : null,
claims: comp === 'claims' ? opts.result : null,
domain: null,
source_assessment: comp === 'source_assessment' ? opts.result : null,
verdict: null,
llm_usage,
};
}
/**
* Fire-and-forget persist for standalone component runs.
* Uses PersistService (Redis + PG). Logs but does not throw on failure
* caller has already returned a response by then.
*/
export function persistStandaloneResult(opts: BuildOpts, logPrefix = 'StandaloneSession'): void {
if (!opts.userId) return;
const session = buildStandaloneSession(opts);
getPersistServiceInstance().persist(session)
.catch(err => log.error(`[${logPrefix}] Persist error:`, (err as Error).message));
}