promptfoo 0.115.3 → 0.115.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/drizzle/0015_zippy_wallop.sql +29 -0
- package/dist/drizzle/meta/0015_snapshot.json +1003 -0
- package/dist/drizzle/meta/_journal.json +7 -0
- package/dist/package.json +1 -1
- package/dist/src/app/assets/{index-BXsrbFYA.js → index-DwIrymQd.js} +169 -169
- package/dist/src/app/assets/{source-map-support-CNXJ1-7r.js → source-map-support-UIopcc8W.js} +1 -1
- package/dist/src/app/assets/{sync-CYtWtmxM.js → sync-CqTZoCfS.js} +1 -1
- package/dist/src/app/index.html +1 -1
- package/dist/src/database/tables.d.ts +365 -0
- package/dist/src/database/tables.d.ts.map +1 -1
- package/dist/src/database/tables.js +48 -1
- package/dist/src/database/tables.js.map +1 -1
- package/dist/src/evaluator.d.ts.map +1 -1
- package/dist/src/evaluator.js +46 -4
- package/dist/src/evaluator.js.map +1 -1
- package/dist/src/redteam/commands/generate.d.ts.map +1 -1
- package/dist/src/redteam/commands/generate.js +0 -2
- package/dist/src/redteam/commands/generate.js.map +1 -1
- package/dist/src/server/routes/traces.d.ts +2 -0
- package/dist/src/server/routes/traces.d.ts.map +1 -0
- package/dist/src/server/routes/traces.js +45 -0
- package/dist/src/server/routes/traces.js.map +1 -0
- package/dist/src/server/server.d.ts.map +1 -1
- package/dist/src/server/server.js +2 -0
- package/dist/src/server/server.js.map +1 -1
- package/dist/src/tracing/evaluatorTracing.d.ts +39 -0
- package/dist/src/tracing/evaluatorTracing.d.ts.map +1 -0
- package/dist/src/tracing/evaluatorTracing.js +189 -0
- package/dist/src/tracing/evaluatorTracing.js.map +1 -0
- package/dist/src/tracing/otlpReceiver.d.ts +21 -0
- package/dist/src/tracing/otlpReceiver.d.ts.map +1 -0
- package/dist/src/tracing/otlpReceiver.js +278 -0
- package/dist/src/tracing/otlpReceiver.js.map +1 -0
- package/dist/src/tracing/store.d.ts +33 -0
- package/dist/src/tracing/store.d.ts.map +1 -0
- package/dist/src/tracing/store.js +170 -0
- package/dist/src/tracing/store.js.map +1 -0
- package/dist/src/types/index.d.ts +606 -0
- package/dist/src/types/index.d.ts.map +1 -1
- package/dist/src/types/index.js +77 -0
- package/dist/src/types/index.js.map +1 -1
- package/dist/src/types/providers.d.ts +4 -0
- package/dist/src/types/providers.d.ts.map +1 -1
- package/dist/src/types/providers.js.map +1 -1
- package/dist/src/util/config/load.d.ts.map +1 -1
- package/dist/src/util/config/load.js +3 -0
- package/dist/src/util/config/load.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.TraceStore = void 0;
|
|
7
|
+
exports.getTraceStore = getTraceStore;
|
|
8
|
+
const crypto_1 = require("crypto");
|
|
9
|
+
const drizzle_orm_1 = require("drizzle-orm");
|
|
10
|
+
const database_1 = require("../database");
|
|
11
|
+
const tables_1 = require("../database/tables");
|
|
12
|
+
const logger_1 = __importDefault(require("../logger"));
|
|
13
|
+
class TraceStore {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.db = null;
|
|
16
|
+
}
|
|
17
|
+
getDatabase() {
|
|
18
|
+
if (!this.db) {
|
|
19
|
+
logger_1.default.debug('[TraceStore] Initializing database connection');
|
|
20
|
+
this.db = (0, database_1.getDb)();
|
|
21
|
+
}
|
|
22
|
+
return this.db;
|
|
23
|
+
}
|
|
24
|
+
async createTrace(trace) {
|
|
25
|
+
try {
|
|
26
|
+
logger_1.default.debug(`[TraceStore] Creating trace ${trace.traceId} for evaluation ${trace.evaluationId}`);
|
|
27
|
+
const db = this.getDatabase();
|
|
28
|
+
await db.insert(tables_1.tracesTable).values({
|
|
29
|
+
id: (0, crypto_1.randomUUID)(),
|
|
30
|
+
traceId: trace.traceId,
|
|
31
|
+
evaluationId: trace.evaluationId,
|
|
32
|
+
testCaseId: trace.testCaseId,
|
|
33
|
+
metadata: trace.metadata,
|
|
34
|
+
});
|
|
35
|
+
logger_1.default.debug(`[TraceStore] Successfully created trace ${trace.traceId}`);
|
|
36
|
+
}
|
|
37
|
+
catch (error) {
|
|
38
|
+
logger_1.default.error(`[TraceStore] Failed to create trace: ${error}`);
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
async addSpans(traceId, spans, options) {
|
|
43
|
+
try {
|
|
44
|
+
logger_1.default.debug(`[TraceStore] Adding ${spans.length} spans to trace ${traceId}`);
|
|
45
|
+
const db = this.getDatabase();
|
|
46
|
+
// Only verify trace exists if not skipping the check (for OTLP scenarios)
|
|
47
|
+
if (options?.skipTraceCheck) {
|
|
48
|
+
logger_1.default.debug(`[TraceStore] Skipping trace existence check for OTLP scenario`);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
logger_1.default.debug(`[TraceStore] Verifying trace ${traceId} exists`);
|
|
52
|
+
const trace = await db
|
|
53
|
+
.select()
|
|
54
|
+
.from(tables_1.tracesTable)
|
|
55
|
+
.where((0, drizzle_orm_1.eq)(tables_1.tracesTable.traceId, traceId))
|
|
56
|
+
.limit(1);
|
|
57
|
+
if (trace.length === 0) {
|
|
58
|
+
logger_1.default.warn(`[TraceStore] Trace ${traceId} not found, skipping spans`);
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
logger_1.default.debug(`[TraceStore] Trace ${traceId} found, proceeding with span insertion`);
|
|
62
|
+
}
|
|
63
|
+
// Insert spans
|
|
64
|
+
const spanRecords = spans.map((span) => {
|
|
65
|
+
logger_1.default.debug(`[TraceStore] Preparing span ${span.spanId} (${span.name}) for insertion`);
|
|
66
|
+
return {
|
|
67
|
+
id: (0, crypto_1.randomUUID)(),
|
|
68
|
+
traceId,
|
|
69
|
+
spanId: span.spanId,
|
|
70
|
+
parentSpanId: span.parentSpanId,
|
|
71
|
+
name: span.name,
|
|
72
|
+
startTime: span.startTime,
|
|
73
|
+
endTime: span.endTime,
|
|
74
|
+
attributes: span.attributes,
|
|
75
|
+
statusCode: span.statusCode,
|
|
76
|
+
statusMessage: span.statusMessage,
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
await db.insert(tables_1.spansTable).values(spanRecords);
|
|
80
|
+
logger_1.default.debug(`[TraceStore] Successfully added ${spans.length} spans to trace ${traceId}`);
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
logger_1.default.error(`[TraceStore] Failed to add spans: ${error}`);
|
|
84
|
+
throw error;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async getTracesByEvaluation(evaluationId) {
|
|
88
|
+
try {
|
|
89
|
+
logger_1.default.debug(`[TraceStore] Fetching traces for evaluation ${evaluationId}`);
|
|
90
|
+
const db = this.getDatabase();
|
|
91
|
+
// Get all traces for the evaluation
|
|
92
|
+
const traces = await db
|
|
93
|
+
.select()
|
|
94
|
+
.from(tables_1.tracesTable)
|
|
95
|
+
.where((0, drizzle_orm_1.eq)(tables_1.tracesTable.evaluationId, evaluationId));
|
|
96
|
+
logger_1.default.debug(`[TraceStore] Found ${traces.length} traces for evaluation ${evaluationId}`);
|
|
97
|
+
// Get spans for each trace
|
|
98
|
+
const tracesWithSpans = await Promise.all(traces.map(async (trace) => {
|
|
99
|
+
logger_1.default.debug(`[TraceStore] Fetching spans for trace ${trace.traceId}`);
|
|
100
|
+
const spans = await db
|
|
101
|
+
.select()
|
|
102
|
+
.from(tables_1.spansTable)
|
|
103
|
+
.where((0, drizzle_orm_1.eq)(tables_1.spansTable.traceId, trace.traceId));
|
|
104
|
+
logger_1.default.debug(`[TraceStore] Found ${spans.length} spans for trace ${trace.traceId}`);
|
|
105
|
+
return {
|
|
106
|
+
...trace,
|
|
107
|
+
spans,
|
|
108
|
+
};
|
|
109
|
+
}));
|
|
110
|
+
logger_1.default.debug(`[TraceStore] Returning ${tracesWithSpans.length} traces with spans`);
|
|
111
|
+
return tracesWithSpans;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
logger_1.default.error(`[TraceStore] Failed to get traces for evaluation: ${error}`);
|
|
115
|
+
throw error;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
async getTrace(traceId) {
|
|
119
|
+
try {
|
|
120
|
+
logger_1.default.debug(`[TraceStore] Fetching trace ${traceId}`);
|
|
121
|
+
const db = this.getDatabase();
|
|
122
|
+
const traces = await db
|
|
123
|
+
.select()
|
|
124
|
+
.from(tables_1.tracesTable)
|
|
125
|
+
.where((0, drizzle_orm_1.eq)(tables_1.tracesTable.traceId, traceId))
|
|
126
|
+
.limit(1);
|
|
127
|
+
if (traces.length === 0) {
|
|
128
|
+
logger_1.default.debug(`[TraceStore] Trace ${traceId} not found`);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const trace = traces[0];
|
|
132
|
+
logger_1.default.debug(`[TraceStore] Found trace ${traceId}, fetching spans`);
|
|
133
|
+
const spans = await db.select().from(tables_1.spansTable).where((0, drizzle_orm_1.eq)(tables_1.spansTable.traceId, traceId));
|
|
134
|
+
logger_1.default.debug(`[TraceStore] Found ${spans.length} spans for trace ${traceId}`);
|
|
135
|
+
return {
|
|
136
|
+
...trace,
|
|
137
|
+
spans,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger_1.default.error(`[TraceStore] Failed to get trace: ${error}`);
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
async deleteOldTraces(retentionDays) {
|
|
146
|
+
try {
|
|
147
|
+
logger_1.default.debug(`[TraceStore] Deleting traces older than ${retentionDays} days`);
|
|
148
|
+
const db = this.getDatabase();
|
|
149
|
+
const cutoffTime = Date.now() - retentionDays * 24 * 60 * 60 * 1000;
|
|
150
|
+
// Delete old traces (spans will be cascade deleted due to foreign key)
|
|
151
|
+
await db.delete(tables_1.tracesTable).where((0, drizzle_orm_1.lt)(tables_1.tracesTable.createdAt, cutoffTime));
|
|
152
|
+
logger_1.default.debug(`[TraceStore] Successfully deleted traces older than ${retentionDays} days`);
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
logger_1.default.error(`[TraceStore] Failed to delete old traces: ${error}`);
|
|
156
|
+
throw error;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
exports.TraceStore = TraceStore;
|
|
161
|
+
// Singleton instance
|
|
162
|
+
let traceStore = null;
|
|
163
|
+
function getTraceStore() {
|
|
164
|
+
if (!traceStore) {
|
|
165
|
+
logger_1.default.debug('[TraceStore] Creating new TraceStore instance');
|
|
166
|
+
traceStore = new TraceStore();
|
|
167
|
+
}
|
|
168
|
+
return traceStore;
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/tracing/store.ts"],"names":[],"mappings":"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"}
|