@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.
Files changed (234) hide show
  1. package/README.md +42 -0
  2. package/dist/airs/management.d.ts +58 -0
  3. package/dist/airs/management.d.ts.map +1 -0
  4. package/dist/airs/management.js +287 -0
  5. package/dist/airs/management.js.map +1 -0
  6. package/dist/airs/modelsecurity.d.ts +74 -0
  7. package/dist/airs/modelsecurity.d.ts.map +1 -0
  8. package/dist/airs/modelsecurity.js +337 -0
  9. package/dist/airs/modelsecurity.js.map +1 -0
  10. package/dist/airs/promptsets.d.ts +50 -0
  11. package/dist/airs/promptsets.d.ts.map +1 -0
  12. package/dist/airs/promptsets.js +133 -0
  13. package/dist/airs/promptsets.js.map +1 -0
  14. package/dist/airs/redteam.d.ts +45 -0
  15. package/dist/airs/redteam.d.ts.map +1 -0
  16. package/dist/airs/redteam.js +219 -0
  17. package/dist/airs/redteam.js.map +1 -0
  18. package/dist/airs/runtime.d.ts +27 -0
  19. package/dist/airs/runtime.d.ts.map +1 -0
  20. package/dist/airs/runtime.js +158 -0
  21. package/dist/airs/runtime.js.map +1 -0
  22. package/dist/airs/scanner.d.ts +22 -0
  23. package/dist/airs/scanner.d.ts.map +1 -0
  24. package/dist/airs/scanner.js +62 -0
  25. package/dist/airs/scanner.js.map +1 -0
  26. package/dist/airs/types.d.ts +683 -0
  27. package/dist/airs/types.d.ts.map +1 -0
  28. package/dist/airs/types.js +6 -0
  29. package/dist/airs/types.js.map +1 -0
  30. package/dist/audit/evaluator.d.ts +17 -0
  31. package/dist/audit/evaluator.d.ts.map +1 -0
  32. package/dist/audit/evaluator.js +82 -0
  33. package/dist/audit/evaluator.js.map +1 -0
  34. package/dist/audit/report.d.ts +38 -0
  35. package/dist/audit/report.d.ts.map +1 -0
  36. package/dist/audit/report.js +141 -0
  37. package/dist/audit/report.js.map +1 -0
  38. package/dist/audit/runner.d.ts +18 -0
  39. package/dist/audit/runner.d.ts.map +1 -0
  40. package/dist/audit/runner.js +60 -0
  41. package/dist/audit/runner.js.map +1 -0
  42. package/dist/audit/types.d.ts +53 -0
  43. package/dist/audit/types.d.ts.map +1 -0
  44. package/dist/audit/types.js +5 -0
  45. package/dist/audit/types.js.map +1 -0
  46. package/dist/cli/bulk-scan-state.d.ts +15 -0
  47. package/dist/cli/bulk-scan-state.d.ts.map +1 -0
  48. package/dist/cli/bulk-scan-state.js +20 -0
  49. package/dist/cli/bulk-scan-state.js.map +1 -0
  50. package/dist/cli/commands/audit.d.ts +4 -0
  51. package/dist/cli/commands/audit.d.ts.map +1 -0
  52. package/dist/cli/commands/audit.js +113 -0
  53. package/dist/cli/commands/audit.js.map +1 -0
  54. package/dist/cli/commands/generate.d.ts +4 -0
  55. package/dist/cli/commands/generate.d.ts.map +1 -0
  56. package/dist/cli/commands/generate.js +231 -0
  57. package/dist/cli/commands/generate.js.map +1 -0
  58. package/dist/cli/commands/list.d.ts +4 -0
  59. package/dist/cli/commands/list.d.ts.map +1 -0
  60. package/dist/cli/commands/list.js +23 -0
  61. package/dist/cli/commands/list.js.map +1 -0
  62. package/dist/cli/commands/modelsecurity.d.ts +4 -0
  63. package/dist/cli/commands/modelsecurity.d.ts.map +1 -0
  64. package/dist/cli/commands/modelsecurity.js +499 -0
  65. package/dist/cli/commands/modelsecurity.js.map +1 -0
  66. package/dist/cli/commands/redteam.d.ts +4 -0
  67. package/dist/cli/commands/redteam.d.ts.map +1 -0
  68. package/dist/cli/commands/redteam.js +630 -0
  69. package/dist/cli/commands/redteam.js.map +1 -0
  70. package/dist/cli/commands/report.d.ts +4 -0
  71. package/dist/cli/commands/report.d.ts.map +1 -0
  72. package/dist/cli/commands/report.js +116 -0
  73. package/dist/cli/commands/report.js.map +1 -0
  74. package/dist/cli/commands/resume.d.ts +4 -0
  75. package/dist/cli/commands/resume.d.ts.map +1 -0
  76. package/dist/cli/commands/resume.js +138 -0
  77. package/dist/cli/commands/resume.js.map +1 -0
  78. package/dist/cli/commands/runtime.d.ts +3 -0
  79. package/dist/cli/commands/runtime.d.ts.map +1 -0
  80. package/dist/cli/commands/runtime.js +582 -0
  81. package/dist/cli/commands/runtime.js.map +1 -0
  82. package/dist/cli/index.d.ts +3 -0
  83. package/dist/cli/index.d.ts.map +1 -0
  84. package/dist/cli/index.js +46 -0
  85. package/dist/cli/index.js.map +1 -0
  86. package/dist/cli/parse-input.d.ts +9 -0
  87. package/dist/cli/parse-input.d.ts.map +1 -0
  88. package/dist/cli/parse-input.js +109 -0
  89. package/dist/cli/parse-input.js.map +1 -0
  90. package/dist/cli/prompts.d.ts +9 -0
  91. package/dist/cli/prompts.d.ts.map +1 -0
  92. package/dist/cli/prompts.js +90 -0
  93. package/dist/cli/prompts.js.map +1 -0
  94. package/dist/cli/renderer/audit.d.ts +8 -0
  95. package/dist/cli/renderer/audit.d.ts.map +1 -0
  96. package/dist/cli/renderer/audit.js +44 -0
  97. package/dist/cli/renderer/audit.js.map +1 -0
  98. package/dist/cli/renderer/common.d.ts +3 -0
  99. package/dist/cli/renderer/common.d.ts.map +1 -0
  100. package/dist/cli/renderer/common.js +6 -0
  101. package/dist/cli/renderer/common.js.map +1 -0
  102. package/dist/cli/renderer/generate.d.ts +29 -0
  103. package/dist/cli/renderer/generate.d.ts.map +1 -0
  104. package/dist/cli/renderer/generate.js +132 -0
  105. package/dist/cli/renderer/generate.js.map +1 -0
  106. package/dist/cli/renderer/index.d.ts +7 -0
  107. package/dist/cli/renderer/index.d.ts.map +1 -0
  108. package/dist/cli/renderer/index.js +7 -0
  109. package/dist/cli/renderer/index.js.map +1 -0
  110. package/dist/cli/renderer/modelsecurity.d.ts +34 -0
  111. package/dist/cli/renderer/modelsecurity.d.ts.map +1 -0
  112. package/dist/cli/renderer/modelsecurity.js +285 -0
  113. package/dist/cli/renderer/modelsecurity.js.map +1 -0
  114. package/dist/cli/renderer/redteam.d.ts +152 -0
  115. package/dist/cli/renderer/redteam.d.ts.map +1 -0
  116. package/dist/cli/renderer/redteam.js +294 -0
  117. package/dist/cli/renderer/redteam.js.map +1 -0
  118. package/dist/cli/renderer/runtime.d.ts +87 -0
  119. package/dist/cli/renderer/runtime.d.ts.map +1 -0
  120. package/dist/cli/renderer/runtime.js +230 -0
  121. package/dist/cli/renderer/runtime.js.map +1 -0
  122. package/dist/config/loader.d.ts +3 -0
  123. package/dist/config/loader.d.ts.map +1 -0
  124. package/dist/config/loader.js +65 -0
  125. package/dist/config/loader.js.map +1 -0
  126. package/dist/config/schema.d.ts +78 -0
  127. package/dist/config/schema.d.ts.map +1 -0
  128. package/dist/config/schema.js +44 -0
  129. package/dist/config/schema.js.map +1 -0
  130. package/dist/core/constraints.d.ts +18 -0
  131. package/dist/core/constraints.d.ts.map +1 -0
  132. package/dist/core/constraints.js +75 -0
  133. package/dist/core/constraints.js.map +1 -0
  134. package/dist/core/loop.d.ts +54 -0
  135. package/dist/core/loop.d.ts.map +1 -0
  136. package/dist/core/loop.js +462 -0
  137. package/dist/core/loop.js.map +1 -0
  138. package/dist/core/metrics.d.ts +13 -0
  139. package/dist/core/metrics.d.ts.map +1 -0
  140. package/dist/core/metrics.js +73 -0
  141. package/dist/core/metrics.js.map +1 -0
  142. package/dist/core/types.d.ts +175 -0
  143. package/dist/core/types.d.ts.map +1 -0
  144. package/dist/core/types.js +5 -0
  145. package/dist/core/types.js.map +1 -0
  146. package/dist/index.d.ts +35 -0
  147. package/dist/index.d.ts.map +1 -0
  148. package/dist/index.js +49 -0
  149. package/dist/index.js.map +1 -0
  150. package/dist/llm/prompts/analyze-results.d.ts +3 -0
  151. package/dist/llm/prompts/analyze-results.d.ts.map +1 -0
  152. package/dist/llm/prompts/analyze-results.js +52 -0
  153. package/dist/llm/prompts/analyze-results.js.map +1 -0
  154. package/dist/llm/prompts/generate-companion.d.ts +3 -0
  155. package/dist/llm/prompts/generate-companion.d.ts.map +1 -0
  156. package/dist/llm/prompts/generate-companion.js +42 -0
  157. package/dist/llm/prompts/generate-companion.js.map +1 -0
  158. package/dist/llm/prompts/generate-tests.d.ts +3 -0
  159. package/dist/llm/prompts/generate-tests.d.ts.map +1 -0
  160. package/dist/llm/prompts/generate-tests.js +46 -0
  161. package/dist/llm/prompts/generate-tests.js.map +1 -0
  162. package/dist/llm/prompts/generate-topic.d.ts +4 -0
  163. package/dist/llm/prompts/generate-topic.d.ts.map +1 -0
  164. package/dist/llm/prompts/generate-topic.js +41 -0
  165. package/dist/llm/prompts/generate-topic.js.map +1 -0
  166. package/dist/llm/prompts/improve-topic.d.ts +3 -0
  167. package/dist/llm/prompts/improve-topic.d.ts.map +1 -0
  168. package/dist/llm/prompts/improve-topic.js +77 -0
  169. package/dist/llm/prompts/improve-topic.js.map +1 -0
  170. package/dist/llm/prompts/simplify-topic.d.ts +3 -0
  171. package/dist/llm/prompts/simplify-topic.d.ts.map +1 -0
  172. package/dist/llm/prompts/simplify-topic.js +50 -0
  173. package/dist/llm/prompts/simplify-topic.js.map +1 -0
  174. package/dist/llm/provider.d.ts +21 -0
  175. package/dist/llm/provider.d.ts.map +1 -0
  176. package/dist/llm/provider.js +76 -0
  177. package/dist/llm/provider.js.map +1 -0
  178. package/dist/llm/schemas.d.ts +97 -0
  179. package/dist/llm/schemas.d.ts.map +1 -0
  180. package/dist/llm/schemas.js +24 -0
  181. package/dist/llm/schemas.js.map +1 -0
  182. package/dist/llm/service.d.ts +30 -0
  183. package/dist/llm/service.d.ts.map +1 -0
  184. package/dist/llm/service.js +273 -0
  185. package/dist/llm/service.js.map +1 -0
  186. package/dist/memory/diff.d.ts +4 -0
  187. package/dist/memory/diff.d.ts.map +1 -0
  188. package/dist/memory/diff.js +24 -0
  189. package/dist/memory/diff.js.map +1 -0
  190. package/dist/memory/extractor.d.ts +15 -0
  191. package/dist/memory/extractor.d.ts.map +1 -0
  192. package/dist/memory/extractor.js +133 -0
  193. package/dist/memory/extractor.js.map +1 -0
  194. package/dist/memory/injector.d.ts +22 -0
  195. package/dist/memory/injector.d.ts.map +1 -0
  196. package/dist/memory/injector.js +90 -0
  197. package/dist/memory/injector.js.map +1 -0
  198. package/dist/memory/prompts/extract-learnings.d.ts +3 -0
  199. package/dist/memory/prompts/extract-learnings.d.ts.map +1 -0
  200. package/dist/memory/prompts/extract-learnings.js +40 -0
  201. package/dist/memory/prompts/extract-learnings.js.map +1 -0
  202. package/dist/memory/schemas.d.ts +63 -0
  203. package/dist/memory/schemas.d.ts.map +1 -0
  204. package/dist/memory/schemas.js +13 -0
  205. package/dist/memory/schemas.js.map +1 -0
  206. package/dist/memory/store.d.ts +28 -0
  207. package/dist/memory/store.d.ts.map +1 -0
  208. package/dist/memory/store.js +103 -0
  209. package/dist/memory/store.js.map +1 -0
  210. package/dist/memory/types.d.ts +55 -0
  211. package/dist/memory/types.d.ts.map +1 -0
  212. package/dist/memory/types.js +6 -0
  213. package/dist/memory/types.js.map +1 -0
  214. package/dist/persistence/store.d.ts +21 -0
  215. package/dist/persistence/store.d.ts.map +1 -0
  216. package/dist/persistence/store.js +77 -0
  217. package/dist/persistence/store.js.map +1 -0
  218. package/dist/persistence/types.d.ts +23 -0
  219. package/dist/persistence/types.d.ts.map +1 -0
  220. package/dist/persistence/types.js +2 -0
  221. package/dist/persistence/types.js.map +1 -0
  222. package/dist/report/html.d.ts +6 -0
  223. package/dist/report/html.d.ts.map +1 -0
  224. package/dist/report/html.js +200 -0
  225. package/dist/report/html.js.map +1 -0
  226. package/dist/report/json.d.ts +11 -0
  227. package/dist/report/json.d.ts.map +1 -0
  228. package/dist/report/json.js +74 -0
  229. package/dist/report/json.js.map +1 -0
  230. package/dist/report/types.d.ts +58 -0
  231. package/dist/report/types.d.ts.map +1 -0
  232. package/dist/report/types.js +5 -0
  233. package/dist/report/types.js.map +1 -0
  234. 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,6 @@
1
+ /**
2
+ * Memory system types — cross-run learning persistence that lets
3
+ * future runs benefit from past refinement insights.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=types.js.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/persistence/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * HTML report builder — self-contained HTML from ReportOutput.
3
+ */
4
+ import type { ReportOutput } from './types.js';
5
+ export declare function buildReportHtml(report: ReportOutput): string;
6
+ //# sourceMappingURL=html.d.ts.map
@@ -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, '&amp;')
7
+ .replace(/</g, '&lt;')
8
+ .replace(/>/g, '&gt;')
9
+ .replace(/"/g, '&quot;');
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":"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"}
@@ -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,5 @@
1
+ /**
2
+ * Structured evaluation report types — JSON/HTML export for run results.
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/report/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}