113 lines
3.8 KiB
JavaScript
113 lines
3.8 KiB
JavaScript
"use strict";
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.saveTrace = saveTrace;
|
|
exports.listTraces = listTraces;
|
|
exports.getTrace = getTrace;
|
|
exports.savePreset = savePreset;
|
|
exports.listPresets = listPresets;
|
|
exports.saveEvalCase = saveEvalCase;
|
|
exports.redactRequestPayload = redactRequestPayload;
|
|
const fs_1 = __importDefault(require("fs"));
|
|
const path_1 = __importDefault(require("path"));
|
|
const config_1 = require("../config");
|
|
const files_1 = require("../utils/files");
|
|
function redactSecrets(payload) {
|
|
const output = { ...payload };
|
|
delete output.apiKey;
|
|
return output;
|
|
}
|
|
function isNoSpaceError(error) {
|
|
const code = error?.code;
|
|
return code === "ENOSPC";
|
|
}
|
|
function saveTrace(record) {
|
|
try {
|
|
(0, files_1.ensureDir)(config_1.TRACES_DIR);
|
|
const target = path_1.default.resolve(config_1.TRACES_DIR, `${record.trace_id}.json`);
|
|
(0, files_1.writeJsonFile)(target, record);
|
|
}
|
|
catch (error) {
|
|
if (isNoSpaceError(error)) {
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
function listTraces(limit = 100) {
|
|
(0, files_1.ensureDir)(config_1.TRACES_DIR);
|
|
const files = fs_1.default
|
|
.readdirSync(config_1.TRACES_DIR)
|
|
.filter((item) => item.endsWith(".json"))
|
|
.sort((a, b) => {
|
|
const pa = path_1.default.resolve(config_1.TRACES_DIR, a);
|
|
const pb = path_1.default.resolve(config_1.TRACES_DIR, b);
|
|
return fs_1.default.statSync(pb).mtimeMs - fs_1.default.statSync(pa).mtimeMs;
|
|
})
|
|
.slice(0, limit);
|
|
return files.map((fileName) => {
|
|
const raw = fs_1.default.readFileSync(path_1.default.resolve(config_1.TRACES_DIR, fileName), "utf-8");
|
|
const item = JSON.parse(raw);
|
|
return {
|
|
trace_id: item.trace_id,
|
|
timestamp: item.timestamp,
|
|
model: item.model,
|
|
question_short: item.user_question_raw.slice(0, 110),
|
|
confidence: item.confidence,
|
|
validation_passed: item.validation_result.passed,
|
|
route_hint: item.route_hint,
|
|
save_status: "saved"
|
|
};
|
|
});
|
|
}
|
|
function getTrace(traceId) {
|
|
(0, files_1.ensureDir)(config_1.TRACES_DIR);
|
|
const target = path_1.default.resolve(config_1.TRACES_DIR, `${traceId}.json`);
|
|
if (!fs_1.default.existsSync(target)) {
|
|
return null;
|
|
}
|
|
const raw = fs_1.default.readFileSync(target, "utf-8");
|
|
return JSON.parse(raw);
|
|
}
|
|
function savePreset(preset) {
|
|
try {
|
|
(0, files_1.ensureDir)(config_1.PRESETS_DIR);
|
|
(0, files_1.writeJsonFile)(path_1.default.resolve(config_1.PRESETS_DIR, `${preset.id}.json`), preset);
|
|
}
|
|
catch (error) {
|
|
if (isNoSpaceError(error)) {
|
|
return;
|
|
}
|
|
throw error;
|
|
}
|
|
}
|
|
function listPresets() {
|
|
(0, files_1.ensureDir)(config_1.PRESETS_DIR);
|
|
return fs_1.default
|
|
.readdirSync(config_1.PRESETS_DIR)
|
|
.filter((item) => item.endsWith(".json"))
|
|
.map((fileName) => {
|
|
const raw = fs_1.default.readFileSync(path_1.default.resolve(config_1.PRESETS_DIR, fileName), "utf-8");
|
|
return JSON.parse(raw);
|
|
})
|
|
.sort((a, b) => b.updatedAt.localeCompare(a.updatedAt));
|
|
}
|
|
function saveEvalCase(casePayload) {
|
|
const id = String(casePayload.case_id ?? `NQ-${Date.now()}`);
|
|
try {
|
|
(0, files_1.ensureDir)(config_1.EVAL_CASES_DIR);
|
|
(0, files_1.writeJsonFile)(path_1.default.resolve(config_1.EVAL_CASES_DIR, `${id}.json`), casePayload);
|
|
}
|
|
catch (error) {
|
|
if (!isNoSpaceError(error)) {
|
|
throw error;
|
|
}
|
|
}
|
|
return id;
|
|
}
|
|
function redactRequestPayload(payload) {
|
|
return redactSecrets(payload);
|
|
}
|