@agentlensai/server 0.6.0 → 0.8.0
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/db/benchmark-store.d.ts +74 -0
- package/dist/db/benchmark-store.d.ts.map +1 -0
- package/dist/db/benchmark-store.js +268 -0
- package/dist/db/benchmark-store.js.map +1 -0
- package/dist/db/guardrail-store.d.ts +34 -0
- package/dist/db/guardrail-store.d.ts.map +1 -0
- package/dist/db/guardrail-store.js +221 -0
- package/dist/db/guardrail-store.js.map +1 -0
- package/dist/db/migrate.d.ts.map +1 -1
- package/dist/db/migrate.js +112 -0
- package/dist/db/migrate.js.map +1 -1
- package/dist/db/schema.sqlite.d.ts +58 -1
- package/dist/db/schema.sqlite.d.ts.map +1 -1
- package/dist/db/schema.sqlite.js +6 -0
- package/dist/db/schema.sqlite.js.map +1 -1
- package/dist/db/sqlite-store.d.ts +12 -0
- package/dist/db/sqlite-store.d.ts.map +1 -1
- package/dist/db/sqlite-store.js +47 -0
- package/dist/db/sqlite-store.js.map +1 -1
- package/dist/db/tenant-scoped-store.d.ts +1 -0
- package/dist/db/tenant-scoped-store.d.ts.map +1 -1
- package/dist/db/tenant-scoped-store.js +3 -0
- package/dist/db/tenant-scoped-store.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/benchmark/engine.d.ts +24 -0
- package/dist/lib/benchmark/engine.d.ts.map +1 -0
- package/dist/lib/benchmark/engine.js +159 -0
- package/dist/lib/benchmark/engine.js.map +1 -0
- package/dist/lib/benchmark/metric-aggregator.d.ts +38 -0
- package/dist/lib/benchmark/metric-aggregator.d.ts.map +1 -0
- package/dist/lib/benchmark/metric-aggregator.js +159 -0
- package/dist/lib/benchmark/metric-aggregator.js.map +1 -0
- package/dist/lib/benchmark/statistical.d.ts +51 -0
- package/dist/lib/benchmark/statistical.d.ts.map +1 -0
- package/dist/lib/benchmark/statistical.js +381 -0
- package/dist/lib/benchmark/statistical.js.map +1 -0
- package/dist/lib/guardrails/actions.d.ts +28 -0
- package/dist/lib/guardrails/actions.d.ts.map +1 -0
- package/dist/lib/guardrails/actions.js +126 -0
- package/dist/lib/guardrails/actions.js.map +1 -0
- package/dist/lib/guardrails/conditions.d.ts +13 -0
- package/dist/lib/guardrails/conditions.d.ts.map +1 -0
- package/dist/lib/guardrails/conditions.js +188 -0
- package/dist/lib/guardrails/conditions.js.map +1 -0
- package/dist/lib/guardrails/engine.d.ts +24 -0
- package/dist/lib/guardrails/engine.d.ts.map +1 -0
- package/dist/lib/guardrails/engine.js +122 -0
- package/dist/lib/guardrails/engine.js.map +1 -0
- package/dist/lib/replay/builder.d.ts +28 -0
- package/dist/lib/replay/builder.d.ts.map +1 -0
- package/dist/lib/replay/builder.js +482 -0
- package/dist/lib/replay/builder.js.map +1 -0
- package/dist/routes/agents.d.ts +4 -3
- package/dist/routes/agents.d.ts.map +1 -1
- package/dist/routes/agents.js +37 -12
- package/dist/routes/agents.js.map +1 -1
- package/dist/routes/benchmarks.d.ts +18 -0
- package/dist/routes/benchmarks.d.ts.map +1 -0
- package/dist/routes/benchmarks.js +312 -0
- package/dist/routes/benchmarks.js.map +1 -0
- package/dist/routes/guardrails.d.ts +18 -0
- package/dist/routes/guardrails.d.ts.map +1 -0
- package/dist/routes/guardrails.js +184 -0
- package/dist/routes/guardrails.js.map +1 -0
- package/dist/routes/replay.d.ts +28 -0
- package/dist/routes/replay.d.ts.map +1 -0
- package/dist/routes/replay.js +140 -0
- package/dist/routes/replay.js.map +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark Store (Story 3.1)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for benchmarks, variants, and cached results.
|
|
5
|
+
* All operations are tenant-isolated.
|
|
6
|
+
*/
|
|
7
|
+
import type { SqliteDb } from './index.js';
|
|
8
|
+
import type { Benchmark, BenchmarkMetric, BenchmarkStatus, BenchmarkVariant, BenchmarkResults } from '@agentlensai/core';
|
|
9
|
+
export interface CreateBenchmarkInput {
|
|
10
|
+
name: string;
|
|
11
|
+
description?: string;
|
|
12
|
+
agentId?: string;
|
|
13
|
+
metrics: BenchmarkMetric[];
|
|
14
|
+
minSessionsPerVariant?: number;
|
|
15
|
+
timeRange?: {
|
|
16
|
+
from: string;
|
|
17
|
+
to: string;
|
|
18
|
+
};
|
|
19
|
+
variants: Array<{
|
|
20
|
+
name: string;
|
|
21
|
+
description?: string;
|
|
22
|
+
tag: string;
|
|
23
|
+
agentId?: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface ListBenchmarkFilters {
|
|
27
|
+
status?: BenchmarkStatus;
|
|
28
|
+
agentId?: string;
|
|
29
|
+
limit?: number;
|
|
30
|
+
offset?: number;
|
|
31
|
+
}
|
|
32
|
+
/** Benchmark with its variants */
|
|
33
|
+
export interface BenchmarkWithVariants extends Benchmark {
|
|
34
|
+
variants: BenchmarkVariant[];
|
|
35
|
+
}
|
|
36
|
+
export declare class BenchmarkStore {
|
|
37
|
+
private readonly db;
|
|
38
|
+
constructor(db: SqliteDb);
|
|
39
|
+
/**
|
|
40
|
+
* Create a benchmark with variants in a single transaction.
|
|
41
|
+
* Validates 2-10 variants.
|
|
42
|
+
*/
|
|
43
|
+
create(tenantId: string, input: CreateBenchmarkInput): BenchmarkWithVariants;
|
|
44
|
+
/**
|
|
45
|
+
* Get a benchmark by ID with its variants. Returns null if not found.
|
|
46
|
+
*/
|
|
47
|
+
getById(tenantId: string, id: string): BenchmarkWithVariants | null;
|
|
48
|
+
/**
|
|
49
|
+
* List benchmarks with optional filters. Returns paginated results.
|
|
50
|
+
*/
|
|
51
|
+
list(tenantId: string, filters?: ListBenchmarkFilters): {
|
|
52
|
+
benchmarks: BenchmarkWithVariants[];
|
|
53
|
+
total: number;
|
|
54
|
+
};
|
|
55
|
+
/**
|
|
56
|
+
* Update benchmark status with transition validation.
|
|
57
|
+
* Sets completedAt when transitioning to 'completed'.
|
|
58
|
+
*/
|
|
59
|
+
updateStatus(tenantId: string, id: string, newStatus: BenchmarkStatus): BenchmarkWithVariants;
|
|
60
|
+
/**
|
|
61
|
+
* Delete a benchmark. Only draft/cancelled can be deleted.
|
|
62
|
+
* Returns true if deleted, false if the status doesn't allow deletion.
|
|
63
|
+
*/
|
|
64
|
+
delete(tenantId: string, id: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Upsert benchmark results (cached computation results).
|
|
67
|
+
*/
|
|
68
|
+
saveResults(tenantId: string, benchmarkId: string, results: BenchmarkResults): void;
|
|
69
|
+
/**
|
|
70
|
+
* Get cached results for a benchmark, or null if none.
|
|
71
|
+
*/
|
|
72
|
+
getResults(tenantId: string, benchmarkId: string): BenchmarkResults | null;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=benchmark-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-store.d.ts","sourceRoot":"","sources":["../../src/db/benchmark-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,SAAS,EACT,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAGjB,MAAM,mBAAmB,CAAC;AA2C3B,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,SAAS,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;IACzC,QAAQ,EAAE,KAAK,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,GAAG,EAAE,MAAM,CAAC;QACZ,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,CAAC,EAAE,eAAe,CAAC;IACzB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,kCAAkC;AAClC,MAAM,WAAW,qBAAsB,SAAQ,SAAS;IACtD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CAC9B;AAiDD,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEzC;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,qBAAqB;IAsE5E;;OAEG;IACH,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,qBAAqB,GAAG,IAAI;IAkBnE;;OAEG;IACH,IAAI,CACF,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,oBAAyB,GACjC;QAAE,UAAU,EAAE,qBAAqB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAyCzD;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,GAAG,qBAAqB;IA0B7F;;;OAGG;IACH,MAAM,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO;IAc7C;;OAEG;IACH,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAqBnF;;OAEG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,gBAAgB,GAAG,IAAI;CAgB3E"}
|
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Benchmark Store (Story 3.1)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for benchmarks, variants, and cached results.
|
|
5
|
+
* All operations are tenant-isolated.
|
|
6
|
+
*/
|
|
7
|
+
import { randomUUID } from 'node:crypto';
|
|
8
|
+
import { sql } from 'drizzle-orm';
|
|
9
|
+
// ─── Valid Status Transitions ──────────────────────────────
|
|
10
|
+
const VALID_TRANSITIONS = {
|
|
11
|
+
draft: ['running', 'cancelled'],
|
|
12
|
+
running: ['completed', 'cancelled'],
|
|
13
|
+
completed: [],
|
|
14
|
+
cancelled: [],
|
|
15
|
+
};
|
|
16
|
+
// ─── Row Converters ────────────────────────────────────────
|
|
17
|
+
function rowToBenchmark(row) {
|
|
18
|
+
const benchmark = {
|
|
19
|
+
id: row.id,
|
|
20
|
+
tenantId: row.tenant_id,
|
|
21
|
+
name: row.name,
|
|
22
|
+
status: row.status,
|
|
23
|
+
metrics: JSON.parse(row.metrics),
|
|
24
|
+
minSessionsPerVariant: row.min_sessions_per_variant,
|
|
25
|
+
createdAt: row.created_at,
|
|
26
|
+
updatedAt: row.updated_at,
|
|
27
|
+
};
|
|
28
|
+
if (row.description)
|
|
29
|
+
benchmark.description = row.description;
|
|
30
|
+
if (row.agent_id)
|
|
31
|
+
benchmark.agentId = row.agent_id;
|
|
32
|
+
if (row.time_range_from && row.time_range_to) {
|
|
33
|
+
benchmark.timeRange = { from: row.time_range_from, to: row.time_range_to };
|
|
34
|
+
}
|
|
35
|
+
if (row.completed_at)
|
|
36
|
+
benchmark.completedAt = row.completed_at;
|
|
37
|
+
return benchmark;
|
|
38
|
+
}
|
|
39
|
+
function rowToVariant(row) {
|
|
40
|
+
const variant = {
|
|
41
|
+
id: row.id,
|
|
42
|
+
benchmarkId: row.benchmark_id,
|
|
43
|
+
tenantId: row.tenant_id,
|
|
44
|
+
name: row.name,
|
|
45
|
+
tag: row.tag,
|
|
46
|
+
sortOrder: row.sort_order,
|
|
47
|
+
};
|
|
48
|
+
if (row.description)
|
|
49
|
+
variant.description = row.description;
|
|
50
|
+
if (row.agent_id)
|
|
51
|
+
variant.agentId = row.agent_id;
|
|
52
|
+
return variant;
|
|
53
|
+
}
|
|
54
|
+
// ─── Store Class ───────────────────────────────────────────
|
|
55
|
+
export class BenchmarkStore {
|
|
56
|
+
db;
|
|
57
|
+
constructor(db) {
|
|
58
|
+
this.db = db;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create a benchmark with variants in a single transaction.
|
|
62
|
+
* Validates 2-10 variants.
|
|
63
|
+
*/
|
|
64
|
+
create(tenantId, input) {
|
|
65
|
+
if (input.variants.length < 2 || input.variants.length > 10) {
|
|
66
|
+
throw new Error('Benchmark must have between 2 and 10 variants');
|
|
67
|
+
}
|
|
68
|
+
const benchmarkId = randomUUID();
|
|
69
|
+
const now = new Date().toISOString();
|
|
70
|
+
const metricsJson = JSON.stringify(input.metrics);
|
|
71
|
+
// Use transaction via raw SQLite (Drizzle wraps better-sqlite3)
|
|
72
|
+
const client = this.db.$client;
|
|
73
|
+
const txn = client.transaction(() => {
|
|
74
|
+
this.db.run(sql `
|
|
75
|
+
INSERT INTO benchmarks (id, tenant_id, name, description, status, agent_id, metrics, min_sessions_per_variant, time_range_from, time_range_to, created_at, updated_at)
|
|
76
|
+
VALUES (
|
|
77
|
+
${benchmarkId}, ${tenantId}, ${input.name}, ${input.description ?? null},
|
|
78
|
+
'draft', ${input.agentId ?? null}, ${metricsJson},
|
|
79
|
+
${input.minSessionsPerVariant ?? 10},
|
|
80
|
+
${input.timeRange?.from ?? null}, ${input.timeRange?.to ?? null},
|
|
81
|
+
${now}, ${now}
|
|
82
|
+
)
|
|
83
|
+
`);
|
|
84
|
+
const variants = [];
|
|
85
|
+
for (let i = 0; i < input.variants.length; i++) {
|
|
86
|
+
const v = input.variants[i];
|
|
87
|
+
const variantId = randomUUID();
|
|
88
|
+
this.db.run(sql `
|
|
89
|
+
INSERT INTO benchmark_variants (id, benchmark_id, tenant_id, name, description, tag, agent_id, sort_order)
|
|
90
|
+
VALUES (
|
|
91
|
+
${variantId}, ${benchmarkId}, ${tenantId}, ${v.name}, ${v.description ?? null},
|
|
92
|
+
${v.tag}, ${v.agentId ?? null}, ${i}
|
|
93
|
+
)
|
|
94
|
+
`);
|
|
95
|
+
const variant = {
|
|
96
|
+
id: variantId,
|
|
97
|
+
benchmarkId,
|
|
98
|
+
tenantId,
|
|
99
|
+
name: v.name,
|
|
100
|
+
tag: v.tag,
|
|
101
|
+
sortOrder: i,
|
|
102
|
+
};
|
|
103
|
+
if (v.description)
|
|
104
|
+
variant.description = v.description;
|
|
105
|
+
if (v.agentId)
|
|
106
|
+
variant.agentId = v.agentId;
|
|
107
|
+
variants.push(variant);
|
|
108
|
+
}
|
|
109
|
+
return variants;
|
|
110
|
+
});
|
|
111
|
+
const variants = txn();
|
|
112
|
+
const benchmark = {
|
|
113
|
+
id: benchmarkId,
|
|
114
|
+
tenantId,
|
|
115
|
+
name: input.name,
|
|
116
|
+
status: 'draft',
|
|
117
|
+
metrics: input.metrics,
|
|
118
|
+
minSessionsPerVariant: input.minSessionsPerVariant ?? 10,
|
|
119
|
+
createdAt: now,
|
|
120
|
+
updatedAt: now,
|
|
121
|
+
variants,
|
|
122
|
+
};
|
|
123
|
+
if (input.description)
|
|
124
|
+
benchmark.description = input.description;
|
|
125
|
+
if (input.agentId)
|
|
126
|
+
benchmark.agentId = input.agentId;
|
|
127
|
+
if (input.timeRange)
|
|
128
|
+
benchmark.timeRange = input.timeRange;
|
|
129
|
+
return benchmark;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Get a benchmark by ID with its variants. Returns null if not found.
|
|
133
|
+
*/
|
|
134
|
+
getById(tenantId, id) {
|
|
135
|
+
const row = this.db.get(sql `
|
|
136
|
+
SELECT * FROM benchmarks WHERE id = ${id} AND tenant_id = ${tenantId}
|
|
137
|
+
`);
|
|
138
|
+
if (!row)
|
|
139
|
+
return null;
|
|
140
|
+
const variantRows = this.db.all(sql `
|
|
141
|
+
SELECT * FROM benchmark_variants
|
|
142
|
+
WHERE benchmark_id = ${id} AND tenant_id = ${tenantId}
|
|
143
|
+
ORDER BY sort_order ASC
|
|
144
|
+
`);
|
|
145
|
+
return {
|
|
146
|
+
...rowToBenchmark(row),
|
|
147
|
+
variants: variantRows.map(rowToVariant),
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* List benchmarks with optional filters. Returns paginated results.
|
|
152
|
+
*/
|
|
153
|
+
list(tenantId, filters = {}) {
|
|
154
|
+
const { status, agentId, limit = 20, offset = 0 } = filters;
|
|
155
|
+
// Build WHERE conditions dynamically
|
|
156
|
+
let whereClause = sql `WHERE tenant_id = ${tenantId}`;
|
|
157
|
+
if (status) {
|
|
158
|
+
whereClause = sql `${whereClause} AND status = ${status}`;
|
|
159
|
+
}
|
|
160
|
+
if (agentId) {
|
|
161
|
+
whereClause = sql `${whereClause} AND agent_id = ${agentId}`;
|
|
162
|
+
}
|
|
163
|
+
// Get total count
|
|
164
|
+
const countRow = this.db.get(sql `
|
|
165
|
+
SELECT COUNT(*) as cnt FROM benchmarks ${whereClause}
|
|
166
|
+
`);
|
|
167
|
+
const total = countRow?.cnt ?? 0;
|
|
168
|
+
// Get paginated results
|
|
169
|
+
const rows = this.db.all(sql `
|
|
170
|
+
SELECT * FROM benchmarks ${whereClause}
|
|
171
|
+
ORDER BY created_at DESC
|
|
172
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
173
|
+
`);
|
|
174
|
+
// Fetch variants for each benchmark
|
|
175
|
+
const benchmarks = rows.map((row) => {
|
|
176
|
+
const variantRows = this.db.all(sql `
|
|
177
|
+
SELECT * FROM benchmark_variants
|
|
178
|
+
WHERE benchmark_id = ${row.id} AND tenant_id = ${tenantId}
|
|
179
|
+
ORDER BY sort_order ASC
|
|
180
|
+
`);
|
|
181
|
+
return {
|
|
182
|
+
...rowToBenchmark(row),
|
|
183
|
+
variants: variantRows.map(rowToVariant),
|
|
184
|
+
};
|
|
185
|
+
});
|
|
186
|
+
return { benchmarks, total };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Update benchmark status with transition validation.
|
|
190
|
+
* Sets completedAt when transitioning to 'completed'.
|
|
191
|
+
*/
|
|
192
|
+
updateStatus(tenantId, id, newStatus) {
|
|
193
|
+
const current = this.getById(tenantId, id);
|
|
194
|
+
if (!current) {
|
|
195
|
+
throw new Error(`Benchmark ${id} not found`);
|
|
196
|
+
}
|
|
197
|
+
const allowed = VALID_TRANSITIONS[current.status] ?? [];
|
|
198
|
+
if (!allowed.includes(newStatus)) {
|
|
199
|
+
throw new Error(`Invalid status transition: ${current.status} → ${newStatus}`);
|
|
200
|
+
}
|
|
201
|
+
const now = new Date().toISOString();
|
|
202
|
+
const completedAt = newStatus === 'completed' ? now : null;
|
|
203
|
+
this.db.run(sql `
|
|
204
|
+
UPDATE benchmarks
|
|
205
|
+
SET status = ${newStatus}, updated_at = ${now},
|
|
206
|
+
completed_at = COALESCE(${completedAt}, completed_at)
|
|
207
|
+
WHERE id = ${id} AND tenant_id = ${tenantId}
|
|
208
|
+
`);
|
|
209
|
+
return this.getById(tenantId, id);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Delete a benchmark. Only draft/cancelled can be deleted.
|
|
213
|
+
* Returns true if deleted, false if the status doesn't allow deletion.
|
|
214
|
+
*/
|
|
215
|
+
delete(tenantId, id) {
|
|
216
|
+
const current = this.getById(tenantId, id);
|
|
217
|
+
if (!current)
|
|
218
|
+
return false;
|
|
219
|
+
if (current.status !== 'draft' && current.status !== 'cancelled') {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
this.db.run(sql `
|
|
223
|
+
DELETE FROM benchmarks WHERE id = ${id} AND tenant_id = ${tenantId}
|
|
224
|
+
`);
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Upsert benchmark results (cached computation results).
|
|
229
|
+
*/
|
|
230
|
+
saveResults(tenantId, benchmarkId, results) {
|
|
231
|
+
const id = randomUUID();
|
|
232
|
+
const variantMetricsJson = JSON.stringify(results.variants);
|
|
233
|
+
const comparisonsJson = JSON.stringify(results.comparisons);
|
|
234
|
+
// Delete any existing results for this benchmark
|
|
235
|
+
this.db.run(sql `
|
|
236
|
+
DELETE FROM benchmark_results
|
|
237
|
+
WHERE benchmark_id = ${benchmarkId} AND tenant_id = ${tenantId}
|
|
238
|
+
`);
|
|
239
|
+
this.db.run(sql `
|
|
240
|
+
INSERT INTO benchmark_results (id, benchmark_id, tenant_id, variant_metrics, comparisons, summary, computed_at)
|
|
241
|
+
VALUES (
|
|
242
|
+
${id}, ${benchmarkId}, ${tenantId},
|
|
243
|
+
${variantMetricsJson}, ${comparisonsJson},
|
|
244
|
+
${results.summary ?? null}, ${results.computedAt}
|
|
245
|
+
)
|
|
246
|
+
`);
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* Get cached results for a benchmark, or null if none.
|
|
250
|
+
*/
|
|
251
|
+
getResults(tenantId, benchmarkId) {
|
|
252
|
+
const row = this.db.get(sql `
|
|
253
|
+
SELECT * FROM benchmark_results
|
|
254
|
+
WHERE benchmark_id = ${benchmarkId} AND tenant_id = ${tenantId}
|
|
255
|
+
`);
|
|
256
|
+
if (!row)
|
|
257
|
+
return null;
|
|
258
|
+
return {
|
|
259
|
+
benchmarkId: row.benchmark_id,
|
|
260
|
+
tenantId: row.tenant_id,
|
|
261
|
+
variants: JSON.parse(row.variant_metrics),
|
|
262
|
+
comparisons: JSON.parse(row.comparisons),
|
|
263
|
+
summary: row.summary ?? '',
|
|
264
|
+
computedAt: row.computed_at,
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=benchmark-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"benchmark-store.js","sourceRoot":"","sources":["../../src/db/benchmark-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrail Store (v0.8.0 — Story 1.2)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for guardrail rules, runtime state, and trigger history.
|
|
5
|
+
* All operations are tenant-scoped.
|
|
6
|
+
*/
|
|
7
|
+
import type { SqliteDb } from './index.js';
|
|
8
|
+
import type { GuardrailRule, GuardrailState, GuardrailTriggerHistory } from '@agentlensai/core';
|
|
9
|
+
export declare class GuardrailStore {
|
|
10
|
+
private readonly db;
|
|
11
|
+
constructor(db: SqliteDb);
|
|
12
|
+
createRule(rule: GuardrailRule): void;
|
|
13
|
+
getRule(tenantId: string, ruleId: string): GuardrailRule | null;
|
|
14
|
+
listRules(tenantId: string, agentId?: string): GuardrailRule[];
|
|
15
|
+
listEnabledRules(tenantId: string, agentId?: string): GuardrailRule[];
|
|
16
|
+
updateRule(tenantId: string, ruleId: string, updates: Partial<GuardrailRule>): boolean;
|
|
17
|
+
deleteRule(tenantId: string, ruleId: string): boolean;
|
|
18
|
+
getState(tenantId: string, ruleId: string): GuardrailState | null;
|
|
19
|
+
upsertState(state: GuardrailState): void;
|
|
20
|
+
insertTrigger(trigger: GuardrailTriggerHistory): void;
|
|
21
|
+
listTriggerHistory(tenantId: string, opts?: {
|
|
22
|
+
ruleId?: string;
|
|
23
|
+
limit?: number;
|
|
24
|
+
offset?: number;
|
|
25
|
+
}): {
|
|
26
|
+
triggers: GuardrailTriggerHistory[];
|
|
27
|
+
total: number;
|
|
28
|
+
};
|
|
29
|
+
getRecentTriggers(tenantId: string, ruleId: string, limit?: number): GuardrailTriggerHistory[];
|
|
30
|
+
private _mapRule;
|
|
31
|
+
private _mapState;
|
|
32
|
+
private _mapTrigger;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=guardrail-store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-store.d.ts","sourceRoot":"","sources":["../../src/db/guardrail-store.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,EACV,aAAa,EACb,cAAc,EACd,uBAAuB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,cAAc;IACb,OAAO,CAAC,QAAQ,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAIzC,UAAU,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI;IAkBrC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI;IAO/D,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAa9D,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,aAAa,EAAE;IAkBrE,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,OAAO;IAuBtF,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IAarD,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAOjE,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAexC,aAAa,CAAC,OAAO,EAAE,uBAAuB,GAAG,IAAI;IAcrD,kBAAkB,CAChB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,GAC1D;QAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IA0CzD,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,GAAE,MAAU,GAAG,uBAAuB,EAAE;IAajG,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,WAAW;CAapB"}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Guardrail Store (v0.8.0 — Story 1.2)
|
|
3
|
+
*
|
|
4
|
+
* CRUD operations for guardrail rules, runtime state, and trigger history.
|
|
5
|
+
* All operations are tenant-scoped.
|
|
6
|
+
*/
|
|
7
|
+
import { sql } from 'drizzle-orm';
|
|
8
|
+
export class GuardrailStore {
|
|
9
|
+
db;
|
|
10
|
+
constructor(db) {
|
|
11
|
+
this.db = db;
|
|
12
|
+
}
|
|
13
|
+
// ─── Rules ───────────────────────────────────────────────
|
|
14
|
+
createRule(rule) {
|
|
15
|
+
this.db.run(sql `
|
|
16
|
+
INSERT INTO guardrail_rules (
|
|
17
|
+
id, tenant_id, name, description, enabled,
|
|
18
|
+
condition_type, condition_config, action_type, action_config,
|
|
19
|
+
agent_id, cooldown_minutes, dry_run, created_at, updated_at
|
|
20
|
+
) VALUES (
|
|
21
|
+
${rule.id}, ${rule.tenantId}, ${rule.name}, ${rule.description ?? null},
|
|
22
|
+
${rule.enabled ? 1 : 0},
|
|
23
|
+
${rule.conditionType}, ${JSON.stringify(rule.conditionConfig)},
|
|
24
|
+
${rule.actionType}, ${JSON.stringify(rule.actionConfig)},
|
|
25
|
+
${rule.agentId ?? null}, ${rule.cooldownMinutes},
|
|
26
|
+
${rule.dryRun ? 1 : 0},
|
|
27
|
+
${rule.createdAt}, ${rule.updatedAt}
|
|
28
|
+
)
|
|
29
|
+
`);
|
|
30
|
+
}
|
|
31
|
+
getRule(tenantId, ruleId) {
|
|
32
|
+
const row = this.db.get(sql `
|
|
33
|
+
SELECT * FROM guardrail_rules WHERE id = ${ruleId} AND tenant_id = ${tenantId}
|
|
34
|
+
`);
|
|
35
|
+
return row ? this._mapRule(row) : null;
|
|
36
|
+
}
|
|
37
|
+
listRules(tenantId, agentId) {
|
|
38
|
+
if (agentId) {
|
|
39
|
+
const rows = this.db.all(sql `
|
|
40
|
+
SELECT * FROM guardrail_rules WHERE tenant_id = ${tenantId} AND agent_id = ${agentId} ORDER BY created_at DESC
|
|
41
|
+
`);
|
|
42
|
+
return rows.map((r) => this._mapRule(r));
|
|
43
|
+
}
|
|
44
|
+
const rows = this.db.all(sql `
|
|
45
|
+
SELECT * FROM guardrail_rules WHERE tenant_id = ${tenantId} ORDER BY created_at DESC
|
|
46
|
+
`);
|
|
47
|
+
return rows.map((r) => this._mapRule(r));
|
|
48
|
+
}
|
|
49
|
+
listEnabledRules(tenantId, agentId) {
|
|
50
|
+
if (agentId) {
|
|
51
|
+
const rows = this.db.all(sql `
|
|
52
|
+
SELECT * FROM guardrail_rules
|
|
53
|
+
WHERE tenant_id = ${tenantId} AND enabled = 1
|
|
54
|
+
AND (agent_id IS NULL OR agent_id = ${agentId})
|
|
55
|
+
ORDER BY created_at ASC
|
|
56
|
+
`);
|
|
57
|
+
return rows.map((r) => this._mapRule(r));
|
|
58
|
+
}
|
|
59
|
+
const rows = this.db.all(sql `
|
|
60
|
+
SELECT * FROM guardrail_rules
|
|
61
|
+
WHERE tenant_id = ${tenantId} AND enabled = 1
|
|
62
|
+
ORDER BY created_at ASC
|
|
63
|
+
`);
|
|
64
|
+
return rows.map((r) => this._mapRule(r));
|
|
65
|
+
}
|
|
66
|
+
updateRule(tenantId, ruleId, updates) {
|
|
67
|
+
const existing = this.getRule(tenantId, ruleId);
|
|
68
|
+
if (!existing)
|
|
69
|
+
return false;
|
|
70
|
+
const merged = { ...existing, ...updates, updatedAt: new Date().toISOString() };
|
|
71
|
+
this.db.run(sql `
|
|
72
|
+
UPDATE guardrail_rules SET
|
|
73
|
+
name = ${merged.name},
|
|
74
|
+
description = ${merged.description ?? null},
|
|
75
|
+
enabled = ${merged.enabled ? 1 : 0},
|
|
76
|
+
condition_type = ${merged.conditionType},
|
|
77
|
+
condition_config = ${JSON.stringify(merged.conditionConfig)},
|
|
78
|
+
action_type = ${merged.actionType},
|
|
79
|
+
action_config = ${JSON.stringify(merged.actionConfig)},
|
|
80
|
+
agent_id = ${merged.agentId ?? null},
|
|
81
|
+
cooldown_minutes = ${merged.cooldownMinutes},
|
|
82
|
+
dry_run = ${merged.dryRun ? 1 : 0},
|
|
83
|
+
updated_at = ${merged.updatedAt}
|
|
84
|
+
WHERE id = ${ruleId} AND tenant_id = ${tenantId}
|
|
85
|
+
`);
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
deleteRule(tenantId, ruleId) {
|
|
89
|
+
const existing = this.getRule(tenantId, ruleId);
|
|
90
|
+
if (!existing)
|
|
91
|
+
return false;
|
|
92
|
+
this.db.run(sql `DELETE FROM guardrail_rules WHERE id = ${ruleId} AND tenant_id = ${tenantId}`);
|
|
93
|
+
// Also clean up state and history
|
|
94
|
+
this.db.run(sql `DELETE FROM guardrail_state WHERE rule_id = ${ruleId} AND tenant_id = ${tenantId}`);
|
|
95
|
+
this.db.run(sql `DELETE FROM guardrail_trigger_history WHERE rule_id = ${ruleId} AND tenant_id = ${tenantId}`);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
// ─── State ───────────────────────────────────────────────
|
|
99
|
+
getState(tenantId, ruleId) {
|
|
100
|
+
const row = this.db.get(sql `
|
|
101
|
+
SELECT * FROM guardrail_state WHERE rule_id = ${ruleId} AND tenant_id = ${tenantId}
|
|
102
|
+
`);
|
|
103
|
+
return row ? this._mapState(row) : null;
|
|
104
|
+
}
|
|
105
|
+
upsertState(state) {
|
|
106
|
+
this.db.run(sql `
|
|
107
|
+
INSERT INTO guardrail_state (rule_id, tenant_id, last_triggered_at, trigger_count, last_evaluated_at, current_value)
|
|
108
|
+
VALUES (${state.ruleId}, ${state.tenantId}, ${state.lastTriggeredAt ?? null},
|
|
109
|
+
${state.triggerCount}, ${state.lastEvaluatedAt ?? null}, ${state.currentValue ?? null})
|
|
110
|
+
ON CONFLICT (rule_id, tenant_id) DO UPDATE SET
|
|
111
|
+
last_triggered_at = ${state.lastTriggeredAt ?? null},
|
|
112
|
+
trigger_count = ${state.triggerCount},
|
|
113
|
+
last_evaluated_at = ${state.lastEvaluatedAt ?? null},
|
|
114
|
+
current_value = ${state.currentValue ?? null}
|
|
115
|
+
`);
|
|
116
|
+
}
|
|
117
|
+
// ─── Trigger History ─────────────────────────────────────
|
|
118
|
+
insertTrigger(trigger) {
|
|
119
|
+
this.db.run(sql `
|
|
120
|
+
INSERT INTO guardrail_trigger_history (
|
|
121
|
+
id, rule_id, tenant_id, triggered_at, condition_value, condition_threshold,
|
|
122
|
+
action_executed, action_result, metadata
|
|
123
|
+
) VALUES (
|
|
124
|
+
${trigger.id}, ${trigger.ruleId}, ${trigger.tenantId}, ${trigger.triggeredAt},
|
|
125
|
+
${trigger.conditionValue}, ${trigger.conditionThreshold},
|
|
126
|
+
${trigger.actionExecuted ? 1 : 0}, ${trigger.actionResult ?? null},
|
|
127
|
+
${JSON.stringify(trigger.metadata)}
|
|
128
|
+
)
|
|
129
|
+
`);
|
|
130
|
+
}
|
|
131
|
+
listTriggerHistory(tenantId, opts) {
|
|
132
|
+
const limit = opts?.limit ?? 50;
|
|
133
|
+
const offset = opts?.offset ?? 0;
|
|
134
|
+
let triggers;
|
|
135
|
+
let total;
|
|
136
|
+
if (opts?.ruleId) {
|
|
137
|
+
triggers = this.db
|
|
138
|
+
.all(sql `
|
|
139
|
+
SELECT * FROM guardrail_trigger_history
|
|
140
|
+
WHERE tenant_id = ${tenantId} AND rule_id = ${opts.ruleId}
|
|
141
|
+
ORDER BY triggered_at DESC
|
|
142
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
143
|
+
`)
|
|
144
|
+
.map((r) => this._mapTrigger(r));
|
|
145
|
+
const countRow = this.db.get(sql `
|
|
146
|
+
SELECT COUNT(*) as count FROM guardrail_trigger_history
|
|
147
|
+
WHERE tenant_id = ${tenantId} AND rule_id = ${opts.ruleId}
|
|
148
|
+
`);
|
|
149
|
+
total = countRow?.count ?? 0;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
triggers = this.db
|
|
153
|
+
.all(sql `
|
|
154
|
+
SELECT * FROM guardrail_trigger_history
|
|
155
|
+
WHERE tenant_id = ${tenantId}
|
|
156
|
+
ORDER BY triggered_at DESC
|
|
157
|
+
LIMIT ${limit} OFFSET ${offset}
|
|
158
|
+
`)
|
|
159
|
+
.map((r) => this._mapTrigger(r));
|
|
160
|
+
const countRow = this.db.get(sql `
|
|
161
|
+
SELECT COUNT(*) as count FROM guardrail_trigger_history
|
|
162
|
+
WHERE tenant_id = ${tenantId}
|
|
163
|
+
`);
|
|
164
|
+
total = countRow?.count ?? 0;
|
|
165
|
+
}
|
|
166
|
+
return { triggers, total };
|
|
167
|
+
}
|
|
168
|
+
getRecentTriggers(tenantId, ruleId, limit = 5) {
|
|
169
|
+
return this.db
|
|
170
|
+
.all(sql `
|
|
171
|
+
SELECT * FROM guardrail_trigger_history
|
|
172
|
+
WHERE tenant_id = ${tenantId} AND rule_id = ${ruleId}
|
|
173
|
+
ORDER BY triggered_at DESC
|
|
174
|
+
LIMIT ${limit}
|
|
175
|
+
`)
|
|
176
|
+
.map((r) => this._mapTrigger(r));
|
|
177
|
+
}
|
|
178
|
+
// ─── Mappers ─────────────────────────────────────────────
|
|
179
|
+
_mapRule(row) {
|
|
180
|
+
return {
|
|
181
|
+
id: row['id'],
|
|
182
|
+
tenantId: row['tenant_id'],
|
|
183
|
+
name: row['name'],
|
|
184
|
+
description: row['description'] || undefined,
|
|
185
|
+
enabled: row['enabled'] === 1 || row['enabled'] === true,
|
|
186
|
+
conditionType: row['condition_type'],
|
|
187
|
+
conditionConfig: JSON.parse(row['condition_config'] || '{}'),
|
|
188
|
+
actionType: row['action_type'],
|
|
189
|
+
actionConfig: JSON.parse(row['action_config'] || '{}'),
|
|
190
|
+
agentId: row['agent_id'] || undefined,
|
|
191
|
+
cooldownMinutes: row['cooldown_minutes'] ?? 15,
|
|
192
|
+
dryRun: row['dry_run'] === 1 || row['dry_run'] === true,
|
|
193
|
+
createdAt: row['created_at'],
|
|
194
|
+
updatedAt: row['updated_at'],
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
_mapState(row) {
|
|
198
|
+
return {
|
|
199
|
+
ruleId: row['rule_id'],
|
|
200
|
+
tenantId: row['tenant_id'],
|
|
201
|
+
lastTriggeredAt: row['last_triggered_at'] || undefined,
|
|
202
|
+
triggerCount: row['trigger_count'] ?? 0,
|
|
203
|
+
lastEvaluatedAt: row['last_evaluated_at'] || undefined,
|
|
204
|
+
currentValue: row['current_value'] != null ? row['current_value'] : undefined,
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
_mapTrigger(row) {
|
|
208
|
+
return {
|
|
209
|
+
id: row['id'],
|
|
210
|
+
ruleId: row['rule_id'],
|
|
211
|
+
tenantId: row['tenant_id'],
|
|
212
|
+
triggeredAt: row['triggered_at'],
|
|
213
|
+
conditionValue: row['condition_value'],
|
|
214
|
+
conditionThreshold: row['condition_threshold'],
|
|
215
|
+
actionExecuted: row['action_executed'] === 1 || row['action_executed'] === true,
|
|
216
|
+
actionResult: row['action_result'] || undefined,
|
|
217
|
+
metadata: JSON.parse(row['metadata'] || '{}'),
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
//# sourceMappingURL=guardrail-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"guardrail-store.js","sourceRoot":"","sources":["../../src/db/guardrail-store.ts"],"names":[],"mappings":"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"}
|
package/dist/db/migrate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/db/migrate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC3C;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG,IAAI,CAugBhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,QAAQ,GAAG;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,OAAO,CAAC;CACtB,CAoBA"}
|