@cdot65/prisma-airs-cli 1.0.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/README.md +42 -0
- package/dist/airs/management.d.ts +58 -0
- package/dist/airs/management.d.ts.map +1 -0
- package/dist/airs/management.js +287 -0
- package/dist/airs/management.js.map +1 -0
- package/dist/airs/modelsecurity.d.ts +74 -0
- package/dist/airs/modelsecurity.d.ts.map +1 -0
- package/dist/airs/modelsecurity.js +337 -0
- package/dist/airs/modelsecurity.js.map +1 -0
- package/dist/airs/promptsets.d.ts +50 -0
- package/dist/airs/promptsets.d.ts.map +1 -0
- package/dist/airs/promptsets.js +133 -0
- package/dist/airs/promptsets.js.map +1 -0
- package/dist/airs/redteam.d.ts +45 -0
- package/dist/airs/redteam.d.ts.map +1 -0
- package/dist/airs/redteam.js +219 -0
- package/dist/airs/redteam.js.map +1 -0
- package/dist/airs/runtime.d.ts +27 -0
- package/dist/airs/runtime.d.ts.map +1 -0
- package/dist/airs/runtime.js +158 -0
- package/dist/airs/runtime.js.map +1 -0
- package/dist/airs/scanner.d.ts +22 -0
- package/dist/airs/scanner.d.ts.map +1 -0
- package/dist/airs/scanner.js +62 -0
- package/dist/airs/scanner.js.map +1 -0
- package/dist/airs/types.d.ts +683 -0
- package/dist/airs/types.d.ts.map +1 -0
- package/dist/airs/types.js +6 -0
- package/dist/airs/types.js.map +1 -0
- package/dist/audit/evaluator.d.ts +17 -0
- package/dist/audit/evaluator.d.ts.map +1 -0
- package/dist/audit/evaluator.js +82 -0
- package/dist/audit/evaluator.js.map +1 -0
- package/dist/audit/report.d.ts +38 -0
- package/dist/audit/report.d.ts.map +1 -0
- package/dist/audit/report.js +141 -0
- package/dist/audit/report.js.map +1 -0
- package/dist/audit/runner.d.ts +18 -0
- package/dist/audit/runner.d.ts.map +1 -0
- package/dist/audit/runner.js +60 -0
- package/dist/audit/runner.js.map +1 -0
- package/dist/audit/types.d.ts +53 -0
- package/dist/audit/types.d.ts.map +1 -0
- package/dist/audit/types.js +5 -0
- package/dist/audit/types.js.map +1 -0
- package/dist/cli/bulk-scan-state.d.ts +15 -0
- package/dist/cli/bulk-scan-state.d.ts.map +1 -0
- package/dist/cli/bulk-scan-state.js +20 -0
- package/dist/cli/bulk-scan-state.js.map +1 -0
- package/dist/cli/commands/audit.d.ts +4 -0
- package/dist/cli/commands/audit.d.ts.map +1 -0
- package/dist/cli/commands/audit.js +113 -0
- package/dist/cli/commands/audit.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +4 -0
- package/dist/cli/commands/generate.d.ts.map +1 -0
- package/dist/cli/commands/generate.js +231 -0
- package/dist/cli/commands/generate.js.map +1 -0
- package/dist/cli/commands/list.d.ts +4 -0
- package/dist/cli/commands/list.d.ts.map +1 -0
- package/dist/cli/commands/list.js +23 -0
- package/dist/cli/commands/list.js.map +1 -0
- package/dist/cli/commands/modelsecurity.d.ts +4 -0
- package/dist/cli/commands/modelsecurity.d.ts.map +1 -0
- package/dist/cli/commands/modelsecurity.js +499 -0
- package/dist/cli/commands/modelsecurity.js.map +1 -0
- package/dist/cli/commands/redteam.d.ts +4 -0
- package/dist/cli/commands/redteam.d.ts.map +1 -0
- package/dist/cli/commands/redteam.js +630 -0
- package/dist/cli/commands/redteam.js.map +1 -0
- package/dist/cli/commands/report.d.ts +4 -0
- package/dist/cli/commands/report.d.ts.map +1 -0
- package/dist/cli/commands/report.js +116 -0
- package/dist/cli/commands/report.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +4 -0
- package/dist/cli/commands/resume.d.ts.map +1 -0
- package/dist/cli/commands/resume.js +138 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/runtime.d.ts +3 -0
- package/dist/cli/commands/runtime.d.ts.map +1 -0
- package/dist/cli/commands/runtime.js +582 -0
- package/dist/cli/commands/runtime.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +46 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/parse-input.d.ts +9 -0
- package/dist/cli/parse-input.d.ts.map +1 -0
- package/dist/cli/parse-input.js +109 -0
- package/dist/cli/parse-input.js.map +1 -0
- package/dist/cli/prompts.d.ts +9 -0
- package/dist/cli/prompts.d.ts.map +1 -0
- package/dist/cli/prompts.js +90 -0
- package/dist/cli/prompts.js.map +1 -0
- package/dist/cli/renderer/audit.d.ts +8 -0
- package/dist/cli/renderer/audit.d.ts.map +1 -0
- package/dist/cli/renderer/audit.js +44 -0
- package/dist/cli/renderer/audit.js.map +1 -0
- package/dist/cli/renderer/common.d.ts +3 -0
- package/dist/cli/renderer/common.d.ts.map +1 -0
- package/dist/cli/renderer/common.js +6 -0
- package/dist/cli/renderer/common.js.map +1 -0
- package/dist/cli/renderer/generate.d.ts +29 -0
- package/dist/cli/renderer/generate.d.ts.map +1 -0
- package/dist/cli/renderer/generate.js +132 -0
- package/dist/cli/renderer/generate.js.map +1 -0
- package/dist/cli/renderer/index.d.ts +7 -0
- package/dist/cli/renderer/index.d.ts.map +1 -0
- package/dist/cli/renderer/index.js +7 -0
- package/dist/cli/renderer/index.js.map +1 -0
- package/dist/cli/renderer/modelsecurity.d.ts +34 -0
- package/dist/cli/renderer/modelsecurity.d.ts.map +1 -0
- package/dist/cli/renderer/modelsecurity.js +285 -0
- package/dist/cli/renderer/modelsecurity.js.map +1 -0
- package/dist/cli/renderer/redteam.d.ts +152 -0
- package/dist/cli/renderer/redteam.d.ts.map +1 -0
- package/dist/cli/renderer/redteam.js +294 -0
- package/dist/cli/renderer/redteam.js.map +1 -0
- package/dist/cli/renderer/runtime.d.ts +87 -0
- package/dist/cli/renderer/runtime.d.ts.map +1 -0
- package/dist/cli/renderer/runtime.js +230 -0
- package/dist/cli/renderer/runtime.js.map +1 -0
- package/dist/config/loader.d.ts +3 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +65 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +78 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +44 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/core/constraints.d.ts +18 -0
- package/dist/core/constraints.d.ts.map +1 -0
- package/dist/core/constraints.js +75 -0
- package/dist/core/constraints.js.map +1 -0
- package/dist/core/loop.d.ts +54 -0
- package/dist/core/loop.d.ts.map +1 -0
- package/dist/core/loop.js +462 -0
- package/dist/core/loop.js.map +1 -0
- package/dist/core/metrics.d.ts +13 -0
- package/dist/core/metrics.d.ts.map +1 -0
- package/dist/core/metrics.js +73 -0
- package/dist/core/metrics.js.map +1 -0
- package/dist/core/types.d.ts +175 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +5 -0
- package/dist/core/types.js.map +1 -0
- package/dist/index.d.ts +35 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +49 -0
- package/dist/index.js.map +1 -0
- package/dist/llm/prompts/analyze-results.d.ts +3 -0
- package/dist/llm/prompts/analyze-results.d.ts.map +1 -0
- package/dist/llm/prompts/analyze-results.js +52 -0
- package/dist/llm/prompts/analyze-results.js.map +1 -0
- package/dist/llm/prompts/generate-companion.d.ts +3 -0
- package/dist/llm/prompts/generate-companion.d.ts.map +1 -0
- package/dist/llm/prompts/generate-companion.js +42 -0
- package/dist/llm/prompts/generate-companion.js.map +1 -0
- package/dist/llm/prompts/generate-tests.d.ts +3 -0
- package/dist/llm/prompts/generate-tests.d.ts.map +1 -0
- package/dist/llm/prompts/generate-tests.js +46 -0
- package/dist/llm/prompts/generate-tests.js.map +1 -0
- package/dist/llm/prompts/generate-topic.d.ts +4 -0
- package/dist/llm/prompts/generate-topic.d.ts.map +1 -0
- package/dist/llm/prompts/generate-topic.js +41 -0
- package/dist/llm/prompts/generate-topic.js.map +1 -0
- package/dist/llm/prompts/improve-topic.d.ts +3 -0
- package/dist/llm/prompts/improve-topic.d.ts.map +1 -0
- package/dist/llm/prompts/improve-topic.js +77 -0
- package/dist/llm/prompts/improve-topic.js.map +1 -0
- package/dist/llm/prompts/simplify-topic.d.ts +3 -0
- package/dist/llm/prompts/simplify-topic.d.ts.map +1 -0
- package/dist/llm/prompts/simplify-topic.js +50 -0
- package/dist/llm/prompts/simplify-topic.js.map +1 -0
- package/dist/llm/provider.d.ts +21 -0
- package/dist/llm/provider.d.ts.map +1 -0
- package/dist/llm/provider.js +76 -0
- package/dist/llm/provider.js.map +1 -0
- package/dist/llm/schemas.d.ts +97 -0
- package/dist/llm/schemas.d.ts.map +1 -0
- package/dist/llm/schemas.js +24 -0
- package/dist/llm/schemas.js.map +1 -0
- package/dist/llm/service.d.ts +30 -0
- package/dist/llm/service.d.ts.map +1 -0
- package/dist/llm/service.js +273 -0
- package/dist/llm/service.js.map +1 -0
- package/dist/memory/diff.d.ts +4 -0
- package/dist/memory/diff.d.ts.map +1 -0
- package/dist/memory/diff.js +24 -0
- package/dist/memory/diff.js.map +1 -0
- package/dist/memory/extractor.d.ts +15 -0
- package/dist/memory/extractor.d.ts.map +1 -0
- package/dist/memory/extractor.js +133 -0
- package/dist/memory/extractor.js.map +1 -0
- package/dist/memory/injector.d.ts +22 -0
- package/dist/memory/injector.d.ts.map +1 -0
- package/dist/memory/injector.js +90 -0
- package/dist/memory/injector.js.map +1 -0
- package/dist/memory/prompts/extract-learnings.d.ts +3 -0
- package/dist/memory/prompts/extract-learnings.d.ts.map +1 -0
- package/dist/memory/prompts/extract-learnings.js +40 -0
- package/dist/memory/prompts/extract-learnings.js.map +1 -0
- package/dist/memory/schemas.d.ts +63 -0
- package/dist/memory/schemas.d.ts.map +1 -0
- package/dist/memory/schemas.js +13 -0
- package/dist/memory/schemas.js.map +1 -0
- package/dist/memory/store.d.ts +28 -0
- package/dist/memory/store.d.ts.map +1 -0
- package/dist/memory/store.js +103 -0
- package/dist/memory/store.js.map +1 -0
- package/dist/memory/types.d.ts +55 -0
- package/dist/memory/types.d.ts.map +1 -0
- package/dist/memory/types.js +6 -0
- package/dist/memory/types.js.map +1 -0
- package/dist/persistence/store.d.ts +21 -0
- package/dist/persistence/store.d.ts.map +1 -0
- package/dist/persistence/store.js +77 -0
- package/dist/persistence/store.js.map +1 -0
- package/dist/persistence/types.d.ts +23 -0
- package/dist/persistence/types.d.ts.map +1 -0
- package/dist/persistence/types.js +2 -0
- package/dist/persistence/types.js.map +1 -0
- package/dist/report/html.d.ts +6 -0
- package/dist/report/html.d.ts.map +1 -0
- package/dist/report/html.js +200 -0
- package/dist/report/html.js.map +1 -0
- package/dist/report/json.d.ts +11 -0
- package/dist/report/json.d.ts.map +1 -0
- package/dist/report/json.js +74 -0
- package/dist/report/json.js.map +1 -0
- package/dist/report/types.d.ts +58 -0
- package/dist/report/types.d.ts.map +1 -0
- package/dist/report/types.js +5 -0
- package/dist/report/types.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory system types — cross-run learning persistence that lets
|
|
3
|
+
* future runs benefit from past refinement insights.
|
|
4
|
+
*/
|
|
5
|
+
import type { CustomTopic, EfficacyMetrics } from '../core/types.js';
|
|
6
|
+
export interface IterationDiff {
|
|
7
|
+
fromIteration: number;
|
|
8
|
+
toIteration: number;
|
|
9
|
+
descriptionChanged: boolean;
|
|
10
|
+
examplesChanged: boolean;
|
|
11
|
+
examplesAdded: string[];
|
|
12
|
+
examplesRemoved: string[];
|
|
13
|
+
descriptionBefore: string;
|
|
14
|
+
descriptionAfter: string;
|
|
15
|
+
metricDelta: {
|
|
16
|
+
coverage: number;
|
|
17
|
+
tpr: number;
|
|
18
|
+
tnr: number;
|
|
19
|
+
accuracy: number;
|
|
20
|
+
f1: number;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
export interface Learning {
|
|
24
|
+
id: string;
|
|
25
|
+
runId: string;
|
|
26
|
+
extractedAt: string;
|
|
27
|
+
topicCategory: string;
|
|
28
|
+
topicDescription: string;
|
|
29
|
+
insight: string;
|
|
30
|
+
strategy: string;
|
|
31
|
+
outcome: 'improved' | 'degraded' | 'neutral';
|
|
32
|
+
changeType: 'description-only' | 'examples-only' | 'both' | 'initial';
|
|
33
|
+
metrics: {
|
|
34
|
+
coverage: number;
|
|
35
|
+
tpr: number;
|
|
36
|
+
tnr: number;
|
|
37
|
+
accuracy: number;
|
|
38
|
+
f1: number;
|
|
39
|
+
};
|
|
40
|
+
corroborations: number;
|
|
41
|
+
tags: string[];
|
|
42
|
+
}
|
|
43
|
+
export interface TopicMemory {
|
|
44
|
+
category: string;
|
|
45
|
+
updatedAt: string;
|
|
46
|
+
learnings: Learning[];
|
|
47
|
+
bestKnown: {
|
|
48
|
+
runId: string;
|
|
49
|
+
iteration: number;
|
|
50
|
+
topic: CustomTopic;
|
|
51
|
+
metrics: EfficacyMetrics;
|
|
52
|
+
} | null;
|
|
53
|
+
antiPatterns: string[];
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAKrE,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,eAAe,EAAE,OAAO,CAAC;IACzB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,EAAE,MAAM,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;CACH;AAKD,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAC;IAC7C,UAAU,EAAE,kBAAkB,GAAG,eAAe,GAAG,MAAM,GAAG,SAAS,CAAC;IACtE,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;QACZ,QAAQ,EAAE,MAAM,CAAC;QACjB,EAAE,EAAE,MAAM,CAAC;KACZ,CAAC;IACF,cAAc,EAAE,MAAM,CAAC;IACvB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAKD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,SAAS,EAAE;QACT,KAAK,EAAE,MAAM,CAAC;QACd,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,WAAW,CAAC;QACnB,OAAO,EAAE,eAAe,CAAC;KAC1B,GAAG,IAAI,CAAC;IACT,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/memory/types.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { RunState } from '../core/types.js';
|
|
2
|
+
import type { RunStateSummary, RunStore } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* JSON file-based run state persistence.
|
|
5
|
+
* Stores one file per run at `{dir}/{runId}.json` with atomic writes.
|
|
6
|
+
*/
|
|
7
|
+
export declare class JsonFileStore implements RunStore {
|
|
8
|
+
private readonly dir;
|
|
9
|
+
/** @param dir - Directory for run state JSON files. */
|
|
10
|
+
constructor(dir: string);
|
|
11
|
+
/** Save a run state to disk, creating the directory if needed. */
|
|
12
|
+
save(run: RunState): Promise<void>;
|
|
13
|
+
/** Load a run state by ID, or null if not found. */
|
|
14
|
+
load(id: string): Promise<RunState | null>;
|
|
15
|
+
/** List summaries of all persisted runs. */
|
|
16
|
+
list(): Promise<RunStateSummary[]>;
|
|
17
|
+
/** Delete a run state by ID. No-op if it doesn't exist. */
|
|
18
|
+
delete(id: string): Promise<void>;
|
|
19
|
+
private filePath;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/persistence/store.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE5D;;;GAGG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAEhC,OAAO,CAAC,QAAQ,CAAC,GAAG;IADhC,uDAAuD;gBAC1B,GAAG,EAAE,MAAM;IAExC,kEAAkE;IAC5D,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;IASxC,oDAAoD;IAC9C,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC;IAShD,4CAA4C;IACtC,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC;IA8BxC,2DAA2D;IACrD,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQvC,OAAO,CAAC,QAAQ;CAGjB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { mkdir, readdir, readFile, unlink, writeFile } from 'node:fs/promises';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
/**
|
|
4
|
+
* JSON file-based run state persistence.
|
|
5
|
+
* Stores one file per run at `{dir}/{runId}.json` with atomic writes.
|
|
6
|
+
*/
|
|
7
|
+
export class JsonFileStore {
|
|
8
|
+
dir;
|
|
9
|
+
/** @param dir - Directory for run state JSON files. */
|
|
10
|
+
constructor(dir) {
|
|
11
|
+
this.dir = dir;
|
|
12
|
+
}
|
|
13
|
+
/** Save a run state to disk, creating the directory if needed. */
|
|
14
|
+
async save(run) {
|
|
15
|
+
await mkdir(this.dir, { recursive: true });
|
|
16
|
+
const filePath = this.filePath(run.id);
|
|
17
|
+
const tmp = `${filePath}.tmp`;
|
|
18
|
+
await writeFile(tmp, JSON.stringify(run, null, 2), 'utf-8');
|
|
19
|
+
await writeFile(filePath, JSON.stringify(run, null, 2), 'utf-8');
|
|
20
|
+
await unlink(tmp).catch(() => { });
|
|
21
|
+
}
|
|
22
|
+
/** Load a run state by ID, or null if not found. */
|
|
23
|
+
async load(id) {
|
|
24
|
+
try {
|
|
25
|
+
const data = await readFile(this.filePath(id), 'utf-8');
|
|
26
|
+
return JSON.parse(data);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/** List summaries of all persisted runs. */
|
|
33
|
+
async list() {
|
|
34
|
+
let files;
|
|
35
|
+
try {
|
|
36
|
+
files = await readdir(this.dir);
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return [];
|
|
40
|
+
}
|
|
41
|
+
const summaries = [];
|
|
42
|
+
for (const file of files) {
|
|
43
|
+
if (!file.endsWith('.json'))
|
|
44
|
+
continue;
|
|
45
|
+
try {
|
|
46
|
+
const data = await readFile(join(this.dir, file), 'utf-8');
|
|
47
|
+
const run = JSON.parse(data);
|
|
48
|
+
summaries.push({
|
|
49
|
+
id: run.id,
|
|
50
|
+
createdAt: run.createdAt,
|
|
51
|
+
updatedAt: run.updatedAt,
|
|
52
|
+
status: run.status,
|
|
53
|
+
currentIteration: run.currentIteration,
|
|
54
|
+
bestCoverage: run.bestCoverage,
|
|
55
|
+
topicDescription: run.userInput.topicDescription,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// skip corrupted files
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return summaries;
|
|
63
|
+
}
|
|
64
|
+
/** Delete a run state by ID. No-op if it doesn't exist. */
|
|
65
|
+
async delete(id) {
|
|
66
|
+
try {
|
|
67
|
+
await unlink(this.filePath(id));
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// ignore if doesn't exist
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
filePath(id) {
|
|
74
|
+
return join(this.dir, `${id}.json`);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/persistence/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RunState } from '../core/types.js';
|
|
2
|
+
/** Contract for run state persistence backends. */
|
|
3
|
+
export interface RunStore {
|
|
4
|
+
/** Save or overwrite a run state. */
|
|
5
|
+
save(run: RunState): Promise<void>;
|
|
6
|
+
/** Load a run state by ID, or null if not found. */
|
|
7
|
+
load(id: string): Promise<RunState | null>;
|
|
8
|
+
/** List summaries of all persisted runs. */
|
|
9
|
+
list(): Promise<RunStateSummary[]>;
|
|
10
|
+
/** Delete a run state by ID. */
|
|
11
|
+
delete(id: string): Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
/** Lightweight summary of a persisted run for listing. */
|
|
14
|
+
export interface RunStateSummary {
|
|
15
|
+
id: string;
|
|
16
|
+
createdAt: string;
|
|
17
|
+
updatedAt: string;
|
|
18
|
+
status: RunState['status'];
|
|
19
|
+
currentIteration: number;
|
|
20
|
+
bestCoverage: number;
|
|
21
|
+
topicDescription: string;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,mDAAmD;AACnD,MAAM,WAAW,QAAQ;IACvB,qCAAqC;IACrC,IAAI,CAAC,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,oDAAoD;IACpD,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IAC3C,4CAA4C;IAC5C,IAAI,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACnC,gCAAgC;IAChC,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3B,gBAAgB,EAAE,MAAM,CAAC;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAoB,YAAY,EAAuB,MAAM,YAAY,CAAC;AAqJtF,wBAAgB,eAAe,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAoE5D"}
|
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML report builder — self-contained HTML from ReportOutput.
|
|
3
|
+
*/
|
|
4
|
+
function esc(s) {
|
|
5
|
+
return s
|
|
6
|
+
.replace(/&/g, '&')
|
|
7
|
+
.replace(/</g, '<')
|
|
8
|
+
.replace(/>/g, '>')
|
|
9
|
+
.replace(/"/g, '"');
|
|
10
|
+
}
|
|
11
|
+
function pct(n) {
|
|
12
|
+
return `${(n * 100).toFixed(1)}%`;
|
|
13
|
+
}
|
|
14
|
+
function delta(n) {
|
|
15
|
+
const sign = n >= 0 ? '+' : '';
|
|
16
|
+
return `${sign}${(n * 100).toFixed(1)}%`;
|
|
17
|
+
}
|
|
18
|
+
function deltaClass(n) {
|
|
19
|
+
if (n > 0)
|
|
20
|
+
return 'positive';
|
|
21
|
+
if (n < 0)
|
|
22
|
+
return 'negative';
|
|
23
|
+
return 'neutral';
|
|
24
|
+
}
|
|
25
|
+
function renderMetricsTable(m) {
|
|
26
|
+
return `<table class="metrics">
|
|
27
|
+
<tr><th>Coverage</th><td>${pct(m.coverage)}</td></tr>
|
|
28
|
+
<tr><th>Accuracy</th><td>${pct(m.accuracy)}</td></tr>
|
|
29
|
+
<tr><th>TPR</th><td>${pct(m.truePositiveRate)}</td></tr>
|
|
30
|
+
<tr><th>TNR</th><td>${pct(m.trueNegativeRate)}</td></tr>
|
|
31
|
+
<tr><th>F1</th><td>${pct(m.f1Score)}</td></tr>
|
|
32
|
+
<tr><th>TP</th><td>${m.truePositives}</td></tr>
|
|
33
|
+
<tr><th>TN</th><td>${m.trueNegatives}</td></tr>
|
|
34
|
+
<tr><th>FP</th><td>${m.falsePositives}</td></tr>
|
|
35
|
+
<tr><th>FN</th><td>${m.falseNegatives}</td></tr>
|
|
36
|
+
<tr><th>Regressions</th><td>${m.regressionCount}</td></tr>
|
|
37
|
+
</table>`;
|
|
38
|
+
}
|
|
39
|
+
function renderTestTable(tests) {
|
|
40
|
+
const rows = tests
|
|
41
|
+
.map((t) => `<tr class="${t.correct ? 'pass' : 'fail'}">
|
|
42
|
+
<td>${esc(t.prompt)}</td>
|
|
43
|
+
<td>${t.expectedTriggered ? 'Yes' : 'No'}</td>
|
|
44
|
+
<td>${t.actualTriggered ? 'Yes' : 'No'}</td>
|
|
45
|
+
<td>${t.correct ? 'Pass' : 'Fail'}</td>
|
|
46
|
+
<td>${esc(t.category)}</td>
|
|
47
|
+
<td>${t.source ? esc(t.source) : '-'}</td>
|
|
48
|
+
<td>${t.scanAction}</td>
|
|
49
|
+
</tr>`)
|
|
50
|
+
.join('\n');
|
|
51
|
+
return `<table class="tests">
|
|
52
|
+
<thead><tr>
|
|
53
|
+
<th>Prompt</th><th>Expected</th><th>Actual</th><th>Result</th>
|
|
54
|
+
<th>Category</th><th>Source</th><th>Action</th>
|
|
55
|
+
</tr></thead>
|
|
56
|
+
<tbody>${rows}</tbody>
|
|
57
|
+
</table>`;
|
|
58
|
+
}
|
|
59
|
+
function renderIteration(iter) {
|
|
60
|
+
const examplesHtml = iter.topic.examples.length > 0
|
|
61
|
+
? `<ul>${iter.topic.examples.map((e) => `<li>${esc(e)}</li>`).join('')}</ul>`
|
|
62
|
+
: '<p>None</p>';
|
|
63
|
+
const analysisHtml = `
|
|
64
|
+
<p>${esc(iter.analysis.summary)}</p>
|
|
65
|
+
${iter.analysis.falsePositivePatterns.length > 0 ? `<p><strong>FP Patterns:</strong> ${iter.analysis.falsePositivePatterns.map(esc).join('; ')}</p>` : ''}
|
|
66
|
+
${iter.analysis.falseNegativePatterns.length > 0 ? `<p><strong>FN Patterns:</strong> ${iter.analysis.falseNegativePatterns.map(esc).join('; ')}</p>` : ''}
|
|
67
|
+
${iter.analysis.suggestions.length > 0 ? `<p><strong>Suggestions:</strong> ${iter.analysis.suggestions.map(esc).join('; ')}</p>` : ''}
|
|
68
|
+
`;
|
|
69
|
+
const testsHtml = iter.tests ? `<h4>Test Results</h4>${renderTestTable(iter.tests)}` : '';
|
|
70
|
+
return `<section class="iteration">
|
|
71
|
+
<h3>Iteration ${iter.iteration}</h3>
|
|
72
|
+
<p class="meta">Duration: ${(iter.durationMs / 1000).toFixed(1)}s | ${iter.timestamp}</p>
|
|
73
|
+
<h4>Topic</h4>
|
|
74
|
+
<p><strong>${esc(iter.topic.name)}</strong></p>
|
|
75
|
+
<p>${esc(iter.topic.description)}</p>
|
|
76
|
+
<h4>Examples</h4>
|
|
77
|
+
${examplesHtml}
|
|
78
|
+
<h4>Metrics</h4>
|
|
79
|
+
${renderMetricsTable(iter.metrics)}
|
|
80
|
+
<h4>Analysis</h4>
|
|
81
|
+
${analysisHtml}
|
|
82
|
+
${testsHtml}
|
|
83
|
+
</section>`;
|
|
84
|
+
}
|
|
85
|
+
function renderTrends(iterations) {
|
|
86
|
+
if (iterations.length < 2)
|
|
87
|
+
return '';
|
|
88
|
+
const rows = iterations
|
|
89
|
+
.map((iter) => `<tr>
|
|
90
|
+
<td>${iter.iteration}</td>
|
|
91
|
+
<td>${pct(iter.metrics.coverage)}</td>
|
|
92
|
+
<td>${pct(iter.metrics.truePositiveRate)}</td>
|
|
93
|
+
<td>${pct(iter.metrics.trueNegativeRate)}</td>
|
|
94
|
+
<td>${pct(iter.metrics.accuracy)}</td>
|
|
95
|
+
<td>${pct(iter.metrics.f1Score)}</td>
|
|
96
|
+
<td>${iter.metrics.falsePositives}</td>
|
|
97
|
+
<td>${iter.metrics.falseNegatives}</td>
|
|
98
|
+
</tr>`)
|
|
99
|
+
.join('\n');
|
|
100
|
+
return `<section class="trends">
|
|
101
|
+
<h2>Iteration Trends</h2>
|
|
102
|
+
<table class="metrics">
|
|
103
|
+
<thead><tr>
|
|
104
|
+
<th>Iter</th><th>Coverage</th><th>TPR</th><th>TNR</th>
|
|
105
|
+
<th>Accuracy</th><th>F1</th><th>FP</th><th>FN</th>
|
|
106
|
+
</tr></thead>
|
|
107
|
+
<tbody>${rows}</tbody>
|
|
108
|
+
</table>
|
|
109
|
+
</section>`;
|
|
110
|
+
}
|
|
111
|
+
function renderDiff(diff) {
|
|
112
|
+
const d = diff.metricsDelta;
|
|
113
|
+
return `<section class="diff">
|
|
114
|
+
<h2>Run Comparison</h2>
|
|
115
|
+
<table class="metrics">
|
|
116
|
+
<thead><tr><th>Metric</th><th>${esc(diff.baseRunId)}</th><th>${esc(diff.compareRunId)}</th><th>Delta</th></tr></thead>
|
|
117
|
+
<tbody>
|
|
118
|
+
<tr><td>Coverage</td><td>${pct(diff.baseMetrics.coverage)}</td><td>${pct(diff.compareMetrics.coverage)}</td><td class="${deltaClass(d.coverage)}">${delta(d.coverage)}</td></tr>
|
|
119
|
+
<tr><td>TPR</td><td>${pct(diff.baseMetrics.truePositiveRate)}</td><td>${pct(diff.compareMetrics.truePositiveRate)}</td><td class="${deltaClass(d.tpr)}">${delta(d.tpr)}</td></tr>
|
|
120
|
+
<tr><td>TNR</td><td>${pct(diff.baseMetrics.trueNegativeRate)}</td><td>${pct(diff.compareMetrics.trueNegativeRate)}</td><td class="${deltaClass(d.tnr)}">${delta(d.tnr)}</td></tr>
|
|
121
|
+
<tr><td>Accuracy</td><td>${pct(diff.baseMetrics.accuracy)}</td><td>${pct(diff.compareMetrics.accuracy)}</td><td class="${deltaClass(d.accuracy)}">${delta(d.accuracy)}</td></tr>
|
|
122
|
+
<tr><td>F1</td><td>${pct(diff.baseMetrics.f1Score)}</td><td>${pct(diff.compareMetrics.f1Score)}</td><td class="${deltaClass(d.f1)}">${delta(d.f1)}</td></tr>
|
|
123
|
+
</tbody>
|
|
124
|
+
</table>
|
|
125
|
+
<h3>Topic Comparison</h3>
|
|
126
|
+
<div class="topic-diff">
|
|
127
|
+
<div><h4>Base</h4><p><strong>${esc(diff.baseTopic.name)}</strong></p><p>${esc(diff.baseTopic.description)}</p></div>
|
|
128
|
+
<div><h4>Compare</h4><p><strong>${esc(diff.compareTopic.name)}</strong></p><p>${esc(diff.compareTopic.description)}</p></div>
|
|
129
|
+
</div>
|
|
130
|
+
</section>`;
|
|
131
|
+
}
|
|
132
|
+
export function buildReportHtml(report) {
|
|
133
|
+
const iterationsHtml = report.iterations.map(renderIteration).join('\n');
|
|
134
|
+
const trendsHtml = renderTrends(report.iterations);
|
|
135
|
+
const diffHtml = report.diff ? renderDiff(report.diff) : '';
|
|
136
|
+
return `<!DOCTYPE html>
|
|
137
|
+
<html lang="en">
|
|
138
|
+
<head>
|
|
139
|
+
<meta charset="UTF-8">
|
|
140
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
141
|
+
<title>Prisma AIRS CLI Report — ${esc(report.run.id)}</title>
|
|
142
|
+
<style>
|
|
143
|
+
* { margin: 0; padding: 0; box-sizing: border-box; }
|
|
144
|
+
body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif; max-width: 1200px; margin: 0 auto; padding: 2rem; background: #f8f9fa; color: #212529; }
|
|
145
|
+
h1 { font-size: 1.8rem; margin-bottom: 0.5rem; }
|
|
146
|
+
h2 { font-size: 1.4rem; margin: 1.5rem 0 0.75rem; border-bottom: 2px solid #dee2e6; padding-bottom: 0.25rem; }
|
|
147
|
+
h3 { font-size: 1.1rem; margin: 1rem 0 0.5rem; }
|
|
148
|
+
h4 { font-size: 0.95rem; margin: 0.75rem 0 0.25rem; color: #495057; }
|
|
149
|
+
.header { background: #212529; color: #fff; padding: 1.5rem; border-radius: 8px; margin-bottom: 1.5rem; }
|
|
150
|
+
.header h1 { color: #fff; }
|
|
151
|
+
.header .meta { color: #adb5bd; font-size: 0.9rem; }
|
|
152
|
+
.summary { display: grid; grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); gap: 1rem; margin-bottom: 1.5rem; }
|
|
153
|
+
.summary-card { background: #fff; padding: 1rem; border-radius: 6px; border: 1px solid #dee2e6; }
|
|
154
|
+
.summary-card .label { font-size: 0.8rem; color: #6c757d; text-transform: uppercase; }
|
|
155
|
+
.summary-card .value { font-size: 1.3rem; font-weight: 600; }
|
|
156
|
+
table { width: 100%; border-collapse: collapse; margin: 0.5rem 0 1rem; }
|
|
157
|
+
th, td { padding: 0.5rem 0.75rem; text-align: left; border-bottom: 1px solid #dee2e6; }
|
|
158
|
+
th { background: #f1f3f5; font-size: 0.85rem; text-transform: uppercase; color: #495057; }
|
|
159
|
+
.pass td:nth-child(4) { color: #2b8a3e; font-weight: 600; }
|
|
160
|
+
.fail td:nth-child(4) { color: #c92a2a; font-weight: 600; }
|
|
161
|
+
.iteration { background: #fff; padding: 1.25rem; border-radius: 6px; border: 1px solid #dee2e6; margin-bottom: 1rem; }
|
|
162
|
+
.meta { font-size: 0.85rem; color: #868e96; }
|
|
163
|
+
.positive { color: #2b8a3e; }
|
|
164
|
+
.negative { color: #c92a2a; }
|
|
165
|
+
.neutral { color: #868e96; }
|
|
166
|
+
.trends { background: #fff; padding: 1.25rem; border-radius: 6px; border: 1px solid #dee2e6; margin-bottom: 1rem; }
|
|
167
|
+
.diff { background: #fff; padding: 1.25rem; border-radius: 6px; border: 1px solid #dee2e6; margin-bottom: 1rem; }
|
|
168
|
+
.topic-diff { display: grid; grid-template-columns: 1fr 1fr; gap: 1rem; }
|
|
169
|
+
.tests { font-size: 0.85rem; }
|
|
170
|
+
.tests td:first-child { max-width: 400px; word-break: break-word; }
|
|
171
|
+
</style>
|
|
172
|
+
</head>
|
|
173
|
+
<body>
|
|
174
|
+
<div class="header">
|
|
175
|
+
<h1>Prisma AIRS CLI Evaluation Report</h1>
|
|
176
|
+
<p class="meta">Generated ${esc(report.generatedAt)} | Run ${esc(report.run.id)}</p>
|
|
177
|
+
</div>
|
|
178
|
+
|
|
179
|
+
<div class="summary">
|
|
180
|
+
<div class="summary-card"><div class="label">Status</div><div class="value">${esc(report.run.status)}</div></div>
|
|
181
|
+
<div class="summary-card"><div class="label">Intent</div><div class="value">${esc(report.run.intent)}</div></div>
|
|
182
|
+
<div class="summary-card"><div class="label">Best Coverage</div><div class="value">${pct(report.run.bestCoverage)}</div></div>
|
|
183
|
+
<div class="summary-card"><div class="label">Iterations</div><div class="value">${report.run.totalIterations}</div></div>
|
|
184
|
+
<div class="summary-card"><div class="label">Best Iteration</div><div class="value">#${report.run.bestIteration}</div></div>
|
|
185
|
+
<div class="summary-card"><div class="label">Profile</div><div class="value">${esc(report.run.profileName)}</div></div>
|
|
186
|
+
</div>
|
|
187
|
+
|
|
188
|
+
<h2>Topic</h2>
|
|
189
|
+
<p>${esc(report.run.topicDescription)}</p>
|
|
190
|
+
|
|
191
|
+
${trendsHtml}
|
|
192
|
+
|
|
193
|
+
<h2>Iterations</h2>
|
|
194
|
+
${iterationsHtml}
|
|
195
|
+
|
|
196
|
+
${diffHtml}
|
|
197
|
+
</body>
|
|
198
|
+
</html>`;
|
|
199
|
+
}
|
|
200
|
+
//# sourceMappingURL=html.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/report/html.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,CAAC;SACL,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,GAAG,CAAC,CAAS;IACpB,OAAO,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AACpC,CAAC;AAED,SAAS,KAAK,CAAC,CAAS;IACtB,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IAC/B,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;AAC3C,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAC7B,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,UAAU,CAAC;IAC7B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,kBAAkB,CAAC,CAAkB;IAC5C,OAAO;+BACsB,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;+BACf,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;0BACpB,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;0BACvB,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;yBACxB,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC;yBACd,CAAC,CAAC,aAAa;yBACf,CAAC,CAAC,aAAa;yBACf,CAAC,CAAC,cAAc;yBAChB,CAAC,CAAC,cAAc;kCACP,CAAC,CAAC,eAAe;WACxC,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,KAAmB;IAC1C,MAAM,IAAI,GAAG,KAAK;SACf,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,cAAc,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YACrC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC;YACb,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAClC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAChC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC3B,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;YACf,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG;YAC9B,CAAC,CAAC,UAAU;UACd,CACL;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;aAKI,IAAI;WACN,CAAC;AACZ,CAAC;AAED,SAAS,eAAe,CAAC,IAAsB;IAC7C,MAAM,YAAY,GAChB,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAC,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO;QAC7E,CAAC,CAAC,aAAa,CAAC;IAEpB,MAAM,YAAY,GAAG;SACd,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;MAC7B,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oCAAoC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;MACvJ,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oCAAoC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;MACvJ,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,oCAAoC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE;GACtI,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,wBAAwB,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1F,OAAO;oBACW,IAAI,CAAC,SAAS;gCACF,CAAC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,SAAS;;iBAEvE,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SAC5B,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;;MAE9B,YAAY;;MAEZ,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;;MAEhC,YAAY;MACZ,SAAS;aACF,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,UAA8B;IAClD,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,IAAI,GAAG,UAAU;SACpB,GAAG,CACF,CAAC,IAAI,EAAE,EAAE,CACP;YACI,IAAI,CAAC,SAAS;YACd,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;YAClC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC1B,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;YACzB,IAAI,CAAC,OAAO,CAAC,cAAc;YAC3B,IAAI,CAAC,OAAO,CAAC,cAAc;UAC7B,CACL;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,OAAO;;;;;;;eAOM,IAAI;;aAEN,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,IAAa;IAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC;IAC5B,OAAO;;;sCAG6B,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC;;mCAExD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;8BAC/I,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;8BAChJ,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,gBAAgB,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,gBAAgB,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC;mCAC3I,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC;6BAChJ,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,mBAAmB,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;;;;;qCAKpH,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;wCACvE,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC;;aAE3G,CAAC;AACd,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAoB;IAClD,MAAM,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE5D,OAAO;;;;;oCAK2B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;gCAmCtB,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;;;;kFAID,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;kFACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC;yFACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;sFAC/B,MAAM,CAAC,GAAG,CAAC,eAAe;2FACrB,MAAM,CAAC,GAAG,CAAC,aAAa;mFAChC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC;;;;OAIvG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC;;IAEnC,UAAU;;;IAGV,cAAc;;IAEd,QAAQ;;QAEJ,CAAC;AACT,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON report builder — pure function mapping RunState to structured ReportOutput.
|
|
3
|
+
*/
|
|
4
|
+
import type { RunState } from '../core/types.js';
|
|
5
|
+
import type { ReportOutput } from './types.js';
|
|
6
|
+
export interface BuildReportOptions {
|
|
7
|
+
includeTests?: boolean;
|
|
8
|
+
diffRun?: RunState | null;
|
|
9
|
+
}
|
|
10
|
+
export declare function buildReportJson(run: RunState, options?: BuildReportOptions): ReportOutput;
|
|
11
|
+
//# sourceMappingURL=json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../../src/report/json.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAoB,YAAY,EAAuB,MAAM,YAAY,CAAC;AAEtF,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,OAAO,CAAC,EAAE,QAAQ,GAAG,IAAI,CAAC;CAC3B;AAED,wBAAgB,eAAe,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,GAAE,kBAAuB,GAAG,YAAY,CAqD7F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON report builder — pure function mapping RunState to structured ReportOutput.
|
|
3
|
+
*/
|
|
4
|
+
export function buildReportJson(run, options = {}) {
|
|
5
|
+
const iterations = run.iterations.map((iter) => {
|
|
6
|
+
const summary = {
|
|
7
|
+
iteration: iter.iteration,
|
|
8
|
+
timestamp: iter.timestamp,
|
|
9
|
+
durationMs: iter.durationMs,
|
|
10
|
+
topic: iter.topic,
|
|
11
|
+
metrics: iter.metrics,
|
|
12
|
+
analysis: iter.analysis,
|
|
13
|
+
};
|
|
14
|
+
if (options.includeTests) {
|
|
15
|
+
summary.tests = iter.testResults.map((r) => {
|
|
16
|
+
const detail = {
|
|
17
|
+
prompt: r.testCase.prompt,
|
|
18
|
+
expectedTriggered: r.testCase.expectedTriggered,
|
|
19
|
+
actualTriggered: r.actualTriggered,
|
|
20
|
+
correct: r.correct,
|
|
21
|
+
category: r.testCase.category,
|
|
22
|
+
scanAction: r.scanAction,
|
|
23
|
+
};
|
|
24
|
+
if (r.testCase.source) {
|
|
25
|
+
detail.source = r.testCase.source;
|
|
26
|
+
}
|
|
27
|
+
return detail;
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
return summary;
|
|
31
|
+
});
|
|
32
|
+
const report = {
|
|
33
|
+
version: 1,
|
|
34
|
+
generatedAt: new Date().toISOString(),
|
|
35
|
+
run: {
|
|
36
|
+
id: run.id,
|
|
37
|
+
createdAt: run.createdAt,
|
|
38
|
+
status: run.status,
|
|
39
|
+
intent: run.userInput.intent,
|
|
40
|
+
topicDescription: run.userInput.topicDescription,
|
|
41
|
+
profileName: run.userInput.profileName,
|
|
42
|
+
bestIteration: run.bestIteration,
|
|
43
|
+
bestCoverage: run.bestCoverage,
|
|
44
|
+
totalIterations: run.iterations.length,
|
|
45
|
+
},
|
|
46
|
+
iterations,
|
|
47
|
+
};
|
|
48
|
+
if (options.diffRun) {
|
|
49
|
+
report.diff = buildDiff(run, options.diffRun);
|
|
50
|
+
}
|
|
51
|
+
return report;
|
|
52
|
+
}
|
|
53
|
+
function buildDiff(baseRun, compareRun) {
|
|
54
|
+
const baseIter = baseRun.iterations[baseRun.bestIteration - 1];
|
|
55
|
+
const compareIter = compareRun.iterations[compareRun.bestIteration - 1];
|
|
56
|
+
const baseMetrics = baseIter.metrics;
|
|
57
|
+
const compareMetrics = compareIter.metrics;
|
|
58
|
+
return {
|
|
59
|
+
baseRunId: baseRun.id,
|
|
60
|
+
compareRunId: compareRun.id,
|
|
61
|
+
metricsDelta: {
|
|
62
|
+
coverage: compareMetrics.coverage - baseMetrics.coverage,
|
|
63
|
+
tpr: compareMetrics.truePositiveRate - baseMetrics.truePositiveRate,
|
|
64
|
+
tnr: compareMetrics.trueNegativeRate - baseMetrics.trueNegativeRate,
|
|
65
|
+
accuracy: compareMetrics.accuracy - baseMetrics.accuracy,
|
|
66
|
+
f1: compareMetrics.f1Score - baseMetrics.f1Score,
|
|
67
|
+
},
|
|
68
|
+
baseMetrics,
|
|
69
|
+
compareMetrics,
|
|
70
|
+
baseTopic: baseIter.topic,
|
|
71
|
+
compareTopic: compareIter.topic,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/report/json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structured evaluation report types — JSON/HTML export for run results.
|
|
3
|
+
*/
|
|
4
|
+
import type { AnalysisReport, CustomTopic, EfficacyMetrics } from '../core/types.js';
|
|
5
|
+
/** Top-level report output structure. */
|
|
6
|
+
export interface ReportOutput {
|
|
7
|
+
version: 1;
|
|
8
|
+
generatedAt: string;
|
|
9
|
+
run: RunSummary;
|
|
10
|
+
iterations: IterationSummary[];
|
|
11
|
+
diff?: RunDiff;
|
|
12
|
+
}
|
|
13
|
+
export interface RunSummary {
|
|
14
|
+
id: string;
|
|
15
|
+
createdAt: string;
|
|
16
|
+
status: string;
|
|
17
|
+
intent: 'allow' | 'block';
|
|
18
|
+
topicDescription: string;
|
|
19
|
+
profileName: string;
|
|
20
|
+
bestIteration: number;
|
|
21
|
+
bestCoverage: number;
|
|
22
|
+
totalIterations: number;
|
|
23
|
+
}
|
|
24
|
+
export interface IterationSummary {
|
|
25
|
+
iteration: number;
|
|
26
|
+
timestamp: string;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
topic: CustomTopic;
|
|
29
|
+
metrics: EfficacyMetrics;
|
|
30
|
+
analysis: AnalysisReport;
|
|
31
|
+
tests?: TestDetail[];
|
|
32
|
+
}
|
|
33
|
+
export interface TestDetail {
|
|
34
|
+
prompt: string;
|
|
35
|
+
expectedTriggered: boolean;
|
|
36
|
+
actualTriggered: boolean;
|
|
37
|
+
correct: boolean;
|
|
38
|
+
category: string;
|
|
39
|
+
source?: string;
|
|
40
|
+
scanAction: 'allow' | 'block';
|
|
41
|
+
}
|
|
42
|
+
export interface RunDiff {
|
|
43
|
+
baseRunId: string;
|
|
44
|
+
compareRunId: string;
|
|
45
|
+
metricsDelta: MetricsDelta;
|
|
46
|
+
baseMetrics: EfficacyMetrics;
|
|
47
|
+
compareMetrics: EfficacyMetrics;
|
|
48
|
+
baseTopic: CustomTopic;
|
|
49
|
+
compareTopic: CustomTopic;
|
|
50
|
+
}
|
|
51
|
+
export interface MetricsDelta {
|
|
52
|
+
coverage: number;
|
|
53
|
+
tpr: number;
|
|
54
|
+
tnr: number;
|
|
55
|
+
accuracy: number;
|
|
56
|
+
f1: number;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/report/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAErF,yCAAyC;AACzC,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,CAAC,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,UAAU,CAAC;IAChB,UAAU,EAAE,gBAAgB,EAAE,CAAC;IAC/B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,WAAW,CAAC;IACnB,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,CAAC;IAC3B,eAAe,EAAE,OAAO,CAAC;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,GAAG,OAAO,CAAC;CAC/B;AAED,MAAM,WAAW,OAAO;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,YAAY,CAAC;IAC3B,WAAW,EAAE,eAAe,CAAC;IAC7B,cAAc,EAAE,eAAe,CAAC;IAChC,SAAS,EAAE,WAAW,CAAC;IACvB,YAAY,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,MAAM,CAAC;CACZ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/report/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|