@hasna/testers 0.0.14 → 0.0.16
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/LICENSE +170 -21
- package/dashboard/dist/assets/index-CQzkimyO.css +1 -0
- package/dashboard/dist/assets/index-D52SWwDa.js +49 -0
- package/dashboard/dist/index.html +2 -2
- package/dist/cli/index.js +11125 -5537
- package/dist/db/api-checks.d.ts +28 -0
- package/dist/db/api-checks.d.ts.map +1 -0
- package/dist/db/database.d.ts.map +1 -1
- package/dist/db/environments.d.ts +10 -0
- package/dist/db/environments.d.ts.map +1 -1
- package/dist/db/golden-answers.d.ts +89 -0
- package/dist/db/golden-answers.d.ts.map +1 -0
- package/dist/db/personas.d.ts +17 -0
- package/dist/db/personas.d.ts.map +1 -0
- package/dist/db/projects.d.ts +3 -6
- package/dist/db/projects.d.ts.map +1 -1
- package/dist/db/results.d.ts +5 -1
- package/dist/db/results.d.ts.map +1 -1
- package/dist/db/runs.d.ts.map +1 -1
- package/dist/db/scenarios.d.ts +1 -0
- package/dist/db/scenarios.d.ts.map +1 -1
- package/dist/db/seed-personas.d.ts +15 -0
- package/dist/db/seed-personas.d.ts.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4331 -2407
- package/dist/lib/ai-client.d.ts +54 -1
- package/dist/lib/ai-client.d.ts.map +1 -1
- package/dist/lib/ai-profiler.d.ts +29 -0
- package/dist/lib/ai-profiler.d.ts.map +1 -0
- package/dist/lib/api-runner.d.ts +20 -0
- package/dist/lib/api-runner.d.ts.map +1 -0
- package/dist/lib/browser-bun.d.ts +153 -0
- package/dist/lib/browser-bun.d.ts.map +1 -0
- package/dist/lib/browser.d.ts +10 -1
- package/dist/lib/browser.d.ts.map +1 -1
- package/dist/lib/ci.d.ts +5 -0
- package/dist/lib/ci.d.ts.map +1 -1
- package/dist/lib/compliance-report.d.ts +33 -0
- package/dist/lib/compliance-report.d.ts.map +1 -0
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/costs.d.ts +5 -0
- package/dist/lib/costs.d.ts.map +1 -1
- package/dist/lib/eval-runner.d.ts +94 -0
- package/dist/lib/eval-runner.d.ts.map +1 -0
- package/dist/lib/failure-analyzer.d.ts +7 -0
- package/dist/lib/failure-analyzer.d.ts.map +1 -0
- package/dist/lib/failure-explainer.d.ts +17 -0
- package/dist/lib/failure-explainer.d.ts.map +1 -0
- package/dist/lib/failure-pipeline.d.ts +11 -0
- package/dist/lib/failure-pipeline.d.ts.map +1 -1
- package/dist/lib/generator.d.ts +34 -0
- package/dist/lib/generator.d.ts.map +1 -0
- package/dist/lib/golden-monitor.d.ts +28 -0
- package/dist/lib/golden-monitor.d.ts.map +1 -0
- package/dist/lib/healer.d.ts +26 -0
- package/dist/lib/healer.d.ts.map +1 -0
- package/dist/lib/health-scan.d.ts +6 -1
- package/dist/lib/health-scan.d.ts.map +1 -1
- package/dist/lib/hybrid-runner.d.ts +100 -0
- package/dist/lib/hybrid-runner.d.ts.map +1 -0
- package/dist/lib/judge.d.ts +72 -0
- package/dist/lib/judge.d.ts.map +1 -0
- package/dist/lib/openapi-import.d.ts +7 -0
- package/dist/lib/openapi-import.d.ts.map +1 -1
- package/dist/lib/persona-diff.d.ts +27 -0
- package/dist/lib/persona-diff.d.ts.map +1 -0
- package/dist/lib/pipeline-runner.d.ts +48 -0
- package/dist/lib/pipeline-runner.d.ts.map +1 -0
- package/dist/lib/reporter.d.ts +2 -0
- package/dist/lib/reporter.d.ts.map +1 -1
- package/dist/lib/runner.d.ts +13 -1
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/scanners/a11y.d.ts +41 -0
- package/dist/lib/scanners/a11y.d.ts.map +1 -0
- package/dist/lib/scanners/injection.d.ts +54 -0
- package/dist/lib/scanners/injection.d.ts.map +1 -0
- package/dist/lib/scanners/pii-scanner.d.ts +19 -0
- package/dist/lib/scanners/pii-scanner.d.ts.map +1 -0
- package/dist/lib/scanners/pii.d.ts +17 -0
- package/dist/lib/scanners/pii.d.ts.map +1 -0
- package/dist/lib/screenshotter.d.ts.map +1 -1
- package/dist/lib/session-converter.d.ts +29 -0
- package/dist/lib/session-converter.d.ts.map +1 -0
- package/dist/lib/webhooks.d.ts +20 -1
- package/dist/lib/webhooks.d.ts.map +1 -1
- package/dist/mcp/index.js +11144 -6270
- package/dist/server/index.js +5388 -1671
- package/dist/types/index.d.ts +278 -5
- package/dist/types/index.d.ts.map +1 -1
- package/package.json +4 -4
- package/dashboard/dist/assets/index-FZ9gzLaz.js +0 -49
- package/dashboard/dist/assets/index-PT-52SEY.css +0 -1
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { GoldenAnswer, GoldenCheckResult } from "../db/golden-answers.js";
|
|
2
|
+
export interface GoldenMonitorOptions {
|
|
3
|
+
projectId?: string;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
judgeModel?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface GoldenMonitorResult {
|
|
8
|
+
checked: number;
|
|
9
|
+
passed: number;
|
|
10
|
+
drifted: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Hit golden.endpoint, score the response vs golden_answer using the judge,
|
|
14
|
+
* detect drift (score drop > 0.15 vs 7-day average), and save the result.
|
|
15
|
+
*/
|
|
16
|
+
export declare function checkGoldenAnswer(golden: GoldenAnswer, options: {
|
|
17
|
+
baseUrl: string;
|
|
18
|
+
judgeModel?: string;
|
|
19
|
+
}): Promise<GoldenCheckResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Run all enabled golden answer checks for a project (or all if no projectId).
|
|
22
|
+
*/
|
|
23
|
+
export declare function runGoldenMonitor(options: {
|
|
24
|
+
projectId?: string;
|
|
25
|
+
baseUrl: string;
|
|
26
|
+
judgeModel?: string;
|
|
27
|
+
}): Promise<GoldenMonitorResult>;
|
|
28
|
+
//# sourceMappingURL=golden-monitor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"golden-monitor.d.ts","sourceRoot":"","sources":["../../src/lib/golden-monitor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAS/E,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,iBAAiB,CAAC,CAwE5B;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GACpE,OAAO,CAAC,mBAAmB,CAAC,CA2B9B"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Self-healing selector repair.
|
|
3
|
+
*
|
|
4
|
+
* When a browser tool fails because a CSS selector can't be found,
|
|
5
|
+
* healer.ts takes a screenshot of the current page, sends it along with
|
|
6
|
+
* the original intent to the configured AI model, and asks it to identify
|
|
7
|
+
* the new correct selector.
|
|
8
|
+
*
|
|
9
|
+
* Provider-agnostic: uses the same multi-provider stack as judge.ts.
|
|
10
|
+
* Config: enabled via selfHeal: true in ~/.testers/config.json
|
|
11
|
+
*/
|
|
12
|
+
import type { Page } from "playwright";
|
|
13
|
+
export interface HealRequest {
|
|
14
|
+
page: Page;
|
|
15
|
+
failedSelector: string;
|
|
16
|
+
intent: string;
|
|
17
|
+
model?: string;
|
|
18
|
+
}
|
|
19
|
+
export interface HealResult {
|
|
20
|
+
newSelector: string | null;
|
|
21
|
+
confidence: number;
|
|
22
|
+
reasoning: string;
|
|
23
|
+
healed: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function healSelector(request: HealRequest): Promise<HealResult>;
|
|
26
|
+
//# sourceMappingURL=healer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"healer.d.ts","sourceRoot":"","sources":["../../src/lib/healer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAQvC,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,IAAI,CAAC;IACX,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAmBD,wBAAsB,YAAY,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA6G5E"}
|
|
@@ -5,8 +5,13 @@ export interface HealthScanOptions {
|
|
|
5
5
|
projectId?: string;
|
|
6
6
|
headed?: boolean;
|
|
7
7
|
timeoutMs?: number;
|
|
8
|
-
scanners?: ("console" | "network" | "links" | "performance")[];
|
|
8
|
+
scanners?: ("console" | "network" | "links" | "performance" | "injection" | "pii")[];
|
|
9
|
+
injectionEndpoint?: string;
|
|
10
|
+
injectionInputField?: string;
|
|
9
11
|
maxPages?: number;
|
|
12
|
+
piiEndpoint?: string;
|
|
13
|
+
piiSeedPii?: string[];
|
|
14
|
+
piiInputField?: string;
|
|
10
15
|
}
|
|
11
16
|
export interface HealthScanSummary {
|
|
12
17
|
url: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"health-scan.d.ts","sourceRoot":"","sources":["../../src/lib/health-scan.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"health-scan.d.ts","sourceRoot":"","sources":["../../src/lib/health-scan.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,mBAAmB,CAAC;AAI/D,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,CAAC,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,aAAa,GAAG,WAAW,GAAG,KAAK,CAAC,EAAE,CAAC;IACrF,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAElB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,UAAU,EAAE,CAAC;CACvB;AAID,wBAAsB,aAAa,CAAC,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA8E1F"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hybrid test runner — mix AI-driven steps with deterministic Playwright steps.
|
|
3
|
+
*
|
|
4
|
+
* Usage example (in a .ts script file):
|
|
5
|
+
*
|
|
6
|
+
* import type { HybridScenario } from "@hasnaxyz/testers/lib/hybrid-runner";
|
|
7
|
+
* export const scenarios: HybridScenario[] = [
|
|
8
|
+
* {
|
|
9
|
+
* name: "Login flow",
|
|
10
|
+
* steps: [
|
|
11
|
+
* { type: "navigate", url: "/login" },
|
|
12
|
+
* { type: "fill", selector: "#email", value: "test@example.com" },
|
|
13
|
+
* { type: "fill", selector: "#password", value: "secret" },
|
|
14
|
+
* { type: "click", selector: "button[type=submit]" },
|
|
15
|
+
* { type: "ai", instruction: "Verify the dashboard loaded and the user is logged in" },
|
|
16
|
+
* { type: "ai_verify", assertion: "The page shows a welcome message with the user's name" },
|
|
17
|
+
* ],
|
|
18
|
+
* },
|
|
19
|
+
* ];
|
|
20
|
+
*/
|
|
21
|
+
export type HybridStepType = "navigate" | "click" | "fill" | "wait" | "wait_for" | "screenshot" | "assert_text" | "assert_visible" | "ai" | "ai_verify";
|
|
22
|
+
export interface NavigateStep {
|
|
23
|
+
type: "navigate";
|
|
24
|
+
url: string;
|
|
25
|
+
}
|
|
26
|
+
export interface ClickStep {
|
|
27
|
+
type: "click";
|
|
28
|
+
selector: string;
|
|
29
|
+
}
|
|
30
|
+
export interface FillStep {
|
|
31
|
+
type: "fill";
|
|
32
|
+
selector: string;
|
|
33
|
+
value: string;
|
|
34
|
+
}
|
|
35
|
+
export interface WaitStep {
|
|
36
|
+
type: "wait";
|
|
37
|
+
ms: number;
|
|
38
|
+
}
|
|
39
|
+
export interface WaitForStep {
|
|
40
|
+
type: "wait_for";
|
|
41
|
+
selector: string;
|
|
42
|
+
timeoutMs?: number;
|
|
43
|
+
}
|
|
44
|
+
export interface ScreenshotStep {
|
|
45
|
+
type: "screenshot";
|
|
46
|
+
label?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface AssertTextStep {
|
|
49
|
+
type: "assert_text";
|
|
50
|
+
selector: string;
|
|
51
|
+
expected: string;
|
|
52
|
+
contains?: boolean;
|
|
53
|
+
}
|
|
54
|
+
export interface AssertVisibleStep {
|
|
55
|
+
type: "assert_visible";
|
|
56
|
+
selector: string;
|
|
57
|
+
visible?: boolean;
|
|
58
|
+
}
|
|
59
|
+
/** AI-driven step — the agent browser-tests using the instruction as the scenario description */
|
|
60
|
+
export interface AiStep {
|
|
61
|
+
type: "ai";
|
|
62
|
+
instruction: string;
|
|
63
|
+
maxTurns?: number;
|
|
64
|
+
model?: string;
|
|
65
|
+
}
|
|
66
|
+
/** AI verification step — the agent judges whether the current page state matches the assertion */
|
|
67
|
+
export interface AiVerifyStep {
|
|
68
|
+
type: "ai_verify";
|
|
69
|
+
assertion: string;
|
|
70
|
+
model?: string;
|
|
71
|
+
}
|
|
72
|
+
export type HybridStep = NavigateStep | ClickStep | FillStep | WaitStep | WaitForStep | ScreenshotStep | AssertTextStep | AssertVisibleStep | AiStep | AiVerifyStep;
|
|
73
|
+
export interface HybridScenario {
|
|
74
|
+
name: string;
|
|
75
|
+
steps: HybridStep[];
|
|
76
|
+
baseUrl?: string;
|
|
77
|
+
model?: string;
|
|
78
|
+
timeoutMs?: number;
|
|
79
|
+
}
|
|
80
|
+
export interface HybridStepResult {
|
|
81
|
+
stepIndex: number;
|
|
82
|
+
type: HybridStepType;
|
|
83
|
+
status: "passed" | "failed" | "skipped";
|
|
84
|
+
durationMs: number;
|
|
85
|
+
error?: string;
|
|
86
|
+
reasoning?: string;
|
|
87
|
+
}
|
|
88
|
+
export interface HybridRunResult {
|
|
89
|
+
scenarioName: string;
|
|
90
|
+
status: "passed" | "failed" | "error";
|
|
91
|
+
stepResults: HybridStepResult[];
|
|
92
|
+
durationMs: number;
|
|
93
|
+
error?: string;
|
|
94
|
+
}
|
|
95
|
+
export declare function runHybridScenario(scenario: HybridScenario, options?: {
|
|
96
|
+
baseUrl?: string;
|
|
97
|
+
apiKey?: string;
|
|
98
|
+
screenshotDir?: string;
|
|
99
|
+
}): Promise<HybridRunResult>;
|
|
100
|
+
//# sourceMappingURL=hybrid-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hybrid-runner.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-provider AI judge engine.
|
|
3
|
+
*
|
|
4
|
+
* Evaluates (input, output) pairs against structured rubrics using either
|
|
5
|
+
* deterministic checks (no LLM cost) or an LLM-as-judge (any provider).
|
|
6
|
+
*
|
|
7
|
+
* Provider resolution order:
|
|
8
|
+
* 1. config.model (explicit) → detectProvider()
|
|
9
|
+
* 2. ANTHROPIC_API_KEY env
|
|
10
|
+
* 3. OPENAI_API_KEY env
|
|
11
|
+
* 4. GOOGLE_API_KEY env
|
|
12
|
+
*/
|
|
13
|
+
export type JudgeProvider = "anthropic" | "openai" | "google" | "cerebras" | "auto";
|
|
14
|
+
export interface JudgeConfig {
|
|
15
|
+
model?: string;
|
|
16
|
+
provider?: JudgeProvider;
|
|
17
|
+
apiKey?: string;
|
|
18
|
+
temperature?: number;
|
|
19
|
+
}
|
|
20
|
+
export type JudgeRubric = {
|
|
21
|
+
type: "contains";
|
|
22
|
+
value: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: "not_contains";
|
|
25
|
+
value: string;
|
|
26
|
+
} | {
|
|
27
|
+
type: "regex";
|
|
28
|
+
pattern: string;
|
|
29
|
+
} | {
|
|
30
|
+
type: "llm";
|
|
31
|
+
prompt: string;
|
|
32
|
+
threshold?: number;
|
|
33
|
+
} | {
|
|
34
|
+
type: "factual";
|
|
35
|
+
facts: string[];
|
|
36
|
+
} | {
|
|
37
|
+
type: "no_pii";
|
|
38
|
+
patterns?: string[];
|
|
39
|
+
} | {
|
|
40
|
+
type: "coherent";
|
|
41
|
+
} | {
|
|
42
|
+
type: "faithful";
|
|
43
|
+
sourceDocs: string[];
|
|
44
|
+
} | {
|
|
45
|
+
type: "safe";
|
|
46
|
+
};
|
|
47
|
+
export interface JudgeInput {
|
|
48
|
+
input: string;
|
|
49
|
+
output: string;
|
|
50
|
+
context?: string;
|
|
51
|
+
rubric: JudgeRubric;
|
|
52
|
+
}
|
|
53
|
+
export interface JudgeResult {
|
|
54
|
+
pass: boolean;
|
|
55
|
+
score: number;
|
|
56
|
+
reason: string;
|
|
57
|
+
rubricType: string;
|
|
58
|
+
tokensUsed: number;
|
|
59
|
+
provider: string;
|
|
60
|
+
model: string;
|
|
61
|
+
durationMs: number;
|
|
62
|
+
}
|
|
63
|
+
export declare function judge(input: JudgeInput, config?: JudgeConfig): Promise<JudgeResult>;
|
|
64
|
+
export interface BatchJudgeResult {
|
|
65
|
+
results: JudgeResult[];
|
|
66
|
+
passCount: number;
|
|
67
|
+
failCount: number;
|
|
68
|
+
avgScore: number;
|
|
69
|
+
totalTokensUsed: number;
|
|
70
|
+
}
|
|
71
|
+
export declare function judgeAll(inputs: JudgeInput[], config?: JudgeConfig): Promise<BatchJudgeResult>;
|
|
72
|
+
//# sourceMappingURL=judge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/lib/judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AASH,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;AAEpF,MAAM,WAAW,WAAW;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,aAAa,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACnD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GACpC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GACvC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GACpB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAsID,wBAAsB,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAwCzF;AAID,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,wBAAsB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,EAAE,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAMpG"}
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
import type { CreateScenarioInput } from "../types/index.js";
|
|
2
2
|
import { createScenario } from "../db/scenarios.js";
|
|
3
|
+
import { createApiCheck } from "../db/api-checks.js";
|
|
4
|
+
import type { CreateApiCheckInput } from "../types/index.js";
|
|
3
5
|
export declare function parseOpenAPISpec(filePathOrUrl: string): CreateScenarioInput[];
|
|
4
6
|
export declare function importFromOpenAPI(filePathOrUrl: string, projectId?: string): {
|
|
5
7
|
imported: number;
|
|
6
8
|
scenarios: ReturnType<typeof createScenario>[];
|
|
7
9
|
};
|
|
10
|
+
export declare function parseOpenAPISpecAsChecks(filePathOrUrl: string): CreateApiCheckInput[];
|
|
11
|
+
export declare function importApiChecksFromOpenAPI(filePathOrUrl: string, projectId?: string): {
|
|
12
|
+
imported: number;
|
|
13
|
+
checks: ReturnType<typeof createApiCheck>[];
|
|
14
|
+
};
|
|
8
15
|
//# sourceMappingURL=openapi-import.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"openapi-import.d.ts","sourceRoot":"","sources":["../../src/lib/openapi-import.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,
|
|
1
|
+
{"version":3,"file":"openapi-import.d.ts","sourceRoot":"","sources":["../../src/lib/openapi-import.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAgC,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AA0C7D,wBAAgB,gBAAgB,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAwE7E;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAAE,CAAA;CAAE,CAMtE;AAED,wBAAgB,wBAAwB,CAAC,aAAa,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAuCrF;AAED,wBAAgB,0BAA0B,CACxC,aAAa,EAAE,MAAM,EACrB,SAAS,CAAC,EAAE,MAAM,GACjB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,EAAE,CAAA;CAAE,CAInE"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { Result } from "../types/index.js";
|
|
2
|
+
export interface PersonaDivergence {
|
|
3
|
+
scenarioId: string;
|
|
4
|
+
scenarioName: string;
|
|
5
|
+
personas: Array<{
|
|
6
|
+
personaId: string | null;
|
|
7
|
+
personaName: string | null;
|
|
8
|
+
status: string;
|
|
9
|
+
reasoning: string | null;
|
|
10
|
+
}>;
|
|
11
|
+
divergenceScore: number;
|
|
12
|
+
hasDivergence: boolean;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Diff results across personas for the same scenarios.
|
|
16
|
+
* Groups results by scenarioId, then compares status across persona variants.
|
|
17
|
+
* divergenceScore = (distinct statuses - 1) / (persona count - 1)
|
|
18
|
+
*/
|
|
19
|
+
export declare function diffPersonaResults(results: Result[], scenarios: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
name: string;
|
|
22
|
+
}>): PersonaDivergence[];
|
|
23
|
+
/**
|
|
24
|
+
* Format divergence results for terminal display.
|
|
25
|
+
*/
|
|
26
|
+
export declare function formatDivergenceTerminal(divergences: PersonaDivergence[]): string;
|
|
27
|
+
//# sourceMappingURL=persona-diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"persona-diff.d.ts","sourceRoot":"","sources":["../../src/lib/persona-diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,KAAK,CAAC;QACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KAC1B,CAAC,CAAC;IACH,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,OAAO,CAAC;CACxB;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,EACjB,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC7C,iBAAiB,EAAE,CA+CrB;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,iBAAiB,EAAE,GAAG,MAAM,CAgCjF"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Multi-agent pipeline tester.
|
|
3
|
+
*
|
|
4
|
+
* Runs a sequence of AI endpoint calls where each step's output feeds into
|
|
5
|
+
* the next step's input via template substitution ({{prev.field}} / {{input.key}}).
|
|
6
|
+
*
|
|
7
|
+
* Each step can assert its output before proceeding, enabling fail-fast or
|
|
8
|
+
* continue-on-fail pipelines.
|
|
9
|
+
*/
|
|
10
|
+
import type { JudgeRubric, JudgeConfig, JudgeResult } from "./judge.js";
|
|
11
|
+
export interface PipelineStep {
|
|
12
|
+
name: string;
|
|
13
|
+
endpoint: string;
|
|
14
|
+
method?: string;
|
|
15
|
+
headers?: Record<string, string>;
|
|
16
|
+
inputTemplate: string;
|
|
17
|
+
outputCapture: string;
|
|
18
|
+
assertions: JudgeRubric[];
|
|
19
|
+
onFail?: "stop" | "continue";
|
|
20
|
+
}
|
|
21
|
+
export interface PipelineConfig {
|
|
22
|
+
steps: PipelineStep[];
|
|
23
|
+
input?: Record<string, string>;
|
|
24
|
+
judgeModel?: string;
|
|
25
|
+
judgeProvider?: string;
|
|
26
|
+
baseUrl?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PipelineStepResult {
|
|
29
|
+
stepName: string;
|
|
30
|
+
passed: boolean;
|
|
31
|
+
output: string | null;
|
|
32
|
+
assertionResults: JudgeResult[];
|
|
33
|
+
error?: string;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
}
|
|
36
|
+
export interface PipelineRunResult {
|
|
37
|
+
passed: boolean;
|
|
38
|
+
stepsCompleted: number;
|
|
39
|
+
stepResults: PipelineStepResult[];
|
|
40
|
+
durationMs: number;
|
|
41
|
+
tokensUsed: number;
|
|
42
|
+
}
|
|
43
|
+
export declare function substituteTemplate(template: string, prevOutput: unknown, inputVars: Record<string, string>): string;
|
|
44
|
+
export declare function runPipeline(config: PipelineConfig, options: {
|
|
45
|
+
baseUrl: string;
|
|
46
|
+
judgeConfig?: JudgeConfig;
|
|
47
|
+
}): Promise<PipelineRunResult>;
|
|
48
|
+
//# sourceMappingURL=pipeline-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline-runner.d.ts","sourceRoot":"","sources":["../../src/lib/pipeline-runner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIxE,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,WAAW,EAAE,CAAC;IAC1B,MAAM,CAAC,EAAE,MAAM,GAAG,UAAU,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,gBAAgB,EAAE,WAAW,EAAE,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;IAChB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAClC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAkBD,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,OAAO,EACnB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAChC,MAAM,CAUR;AAqCD,wBAAsB,WAAW,CAC/B,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,WAAW,CAAA;CAAE,GACtD,OAAO,CAAC,iBAAiB,CAAC,CA0H5B"}
|
package/dist/lib/reporter.d.ts
CHANGED
|
@@ -21,6 +21,8 @@ export declare function formatScenarioList(scenarios: Array<{
|
|
|
21
21
|
name: string;
|
|
22
22
|
priority: string;
|
|
23
23
|
tags: string[];
|
|
24
|
+
flakinessScore?: number | null;
|
|
25
|
+
recentRunCount?: number;
|
|
24
26
|
}>): string;
|
|
25
27
|
export declare function formatResultDetail(result: Result, screenshots: Screenshot[]): string;
|
|
26
28
|
//# sourceMappingURL=reporter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/lib/reporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAmE3F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAU9C;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CA4B3E;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAoD9D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAI5C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CA6BjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAiBxE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,GAAG,MAAM,
|
|
1
|
+
{"version":3,"file":"reporter.d.ts","sourceRoot":"","sources":["../../src/lib/reporter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAWjE,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAmE3F;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAU9C;AAED,wBAAgB,uBAAuB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CA4B3E;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,CAoD9D;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAI5C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,MAAM,CA6BjD;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,IAAI,CAAC;IAC7D,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,gBAAgB,CAiBxE;AAED,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC;IAAE,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,EAAE,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,cAAc,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,MAAM,CA4CtM;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,MAAM,CAqCpF"}
|
package/dist/lib/runner.d.ts
CHANGED
|
@@ -9,7 +9,19 @@ export interface RunOptions {
|
|
|
9
9
|
projectId?: string;
|
|
10
10
|
apiKey?: string;
|
|
11
11
|
screenshotDir?: string;
|
|
12
|
-
engine?: "
|
|
12
|
+
engine?: import("../types/index.js").BrowserEngine;
|
|
13
|
+
personaId?: string;
|
|
14
|
+
personaIds?: string[];
|
|
15
|
+
samples?: number;
|
|
16
|
+
flakinessThreshold?: number;
|
|
17
|
+
a11y?: boolean | {
|
|
18
|
+
level?: "A" | "AA" | "AAA";
|
|
19
|
+
};
|
|
20
|
+
selfHeal?: boolean;
|
|
21
|
+
maxCostCents?: number;
|
|
22
|
+
skipBudgetCheck?: boolean;
|
|
23
|
+
cacheMaxAgeMs?: number;
|
|
24
|
+
minimal?: boolean;
|
|
13
25
|
}
|
|
14
26
|
export interface RunEvent {
|
|
15
27
|
type: "scenario:start" | "scenario:pass" | "scenario:fail" | "scenario:error" | "screenshot:captured" | "run:complete" | "step:tool_call" | "step:tool_result" | "step:thinking" | "scenario:timeout_warning";
|
package/dist/lib/runner.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WCAG Accessibility scanner using axe-core.
|
|
3
|
+
*
|
|
4
|
+
* Injects axe-core into the live browser page and runs a full WCAG audit.
|
|
5
|
+
* Works in authenticated, dynamically-loaded states — unlike static scanners.
|
|
6
|
+
*
|
|
7
|
+
* Usage:
|
|
8
|
+
* import { scanPageA11y } from "./scanners/a11y.js";
|
|
9
|
+
* const violations = await scanPageA11y(page, { wcagLevel: "AA" });
|
|
10
|
+
*/
|
|
11
|
+
import type { Page } from "playwright";
|
|
12
|
+
import type { ScanResult } from "../../types/index.js";
|
|
13
|
+
export type WcagLevel = "A" | "AA" | "AAA";
|
|
14
|
+
export type A11yImpact = "critical" | "serious" | "moderate" | "minor";
|
|
15
|
+
export interface A11yViolation {
|
|
16
|
+
id: string;
|
|
17
|
+
impact: A11yImpact;
|
|
18
|
+
description: string;
|
|
19
|
+
wcagCriteria: string[];
|
|
20
|
+
nodes: Array<{
|
|
21
|
+
selector: string;
|
|
22
|
+
html: string;
|
|
23
|
+
failureSummary: string;
|
|
24
|
+
}>;
|
|
25
|
+
}
|
|
26
|
+
export interface A11yScanOptions {
|
|
27
|
+
wcagLevel?: WcagLevel;
|
|
28
|
+
include?: string[];
|
|
29
|
+
exclude?: string[];
|
|
30
|
+
runOnly?: string[];
|
|
31
|
+
}
|
|
32
|
+
export declare function scanPageA11y(page: Page, options?: A11yScanOptions): Promise<A11yViolation[]>;
|
|
33
|
+
export declare function scanA11y(options: {
|
|
34
|
+
url: string;
|
|
35
|
+
pages?: string[];
|
|
36
|
+
wcagLevel?: WcagLevel;
|
|
37
|
+
headed?: boolean;
|
|
38
|
+
timeoutMs?: number;
|
|
39
|
+
projectId?: string;
|
|
40
|
+
}): Promise<ScanResult>;
|
|
41
|
+
//# sourceMappingURL=a11y.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"a11y.d.ts","sourceRoot":"","sources":["../../../src/lib/scanners/a11y.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAIlE,MAAM,MAAM,SAAS,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;AAC3C,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,OAAO,CAAC;AAEvE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,KAAK,EAAE,KAAK,CAAC;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,IAAI,EAAE,MAAM,CAAC;QACb,cAAc,EAAE,MAAM,CAAC;KACxB,CAAC,CAAC;CACJ;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AA0BD,wBAAsB,YAAY,CAChC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,aAAa,EAAE,CAAC,CA4D1B;AAID,wBAAsB,QAAQ,CAAC,OAAO,EAAE;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GAAG,OAAO,CAAC,UAAU,CAAC,CAsDtB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt injection security scanner.
|
|
3
|
+
*
|
|
4
|
+
* Submits adversarial payloads to AI endpoints (via API or browser form)
|
|
5
|
+
* and uses the judge engine to detect unsafe behaviors:
|
|
6
|
+
* - System prompt leakage
|
|
7
|
+
* - Compliance with injected instructions
|
|
8
|
+
* - Sensitive data exfiltration
|
|
9
|
+
* - Role override success
|
|
10
|
+
*
|
|
11
|
+
* OWASP LLM Top 10 #1 — prompt injection.
|
|
12
|
+
*/
|
|
13
|
+
import type { ScanResult } from "../../types/index.js";
|
|
14
|
+
import type { JudgeConfig } from "../judge.js";
|
|
15
|
+
export interface InjectionPayload {
|
|
16
|
+
id: string;
|
|
17
|
+
category: "extraction" | "role_override" | "jailbreak" | "data_exfil" | "indirect";
|
|
18
|
+
payload: string;
|
|
19
|
+
description: string;
|
|
20
|
+
severity: "critical" | "high" | "medium";
|
|
21
|
+
}
|
|
22
|
+
export declare const INJECTION_PAYLOADS: InjectionPayload[];
|
|
23
|
+
export interface InjectionScanOptions {
|
|
24
|
+
url: string;
|
|
25
|
+
endpoint?: string;
|
|
26
|
+
method?: string;
|
|
27
|
+
inputField?: string;
|
|
28
|
+
outputField?: string;
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
payloadCategories?: InjectionPayload["category"][];
|
|
31
|
+
judgeConfig?: JudgeConfig;
|
|
32
|
+
timeoutMs?: number;
|
|
33
|
+
browser?: boolean;
|
|
34
|
+
headed?: boolean;
|
|
35
|
+
formSelector?: string;
|
|
36
|
+
}
|
|
37
|
+
export interface InjectionFinding {
|
|
38
|
+
payloadId: string;
|
|
39
|
+
category: InjectionPayload["category"];
|
|
40
|
+
severity: InjectionPayload["severity"];
|
|
41
|
+
description: string;
|
|
42
|
+
payload: string;
|
|
43
|
+
response: string;
|
|
44
|
+
vulnerabilityDetected: boolean;
|
|
45
|
+
judgeScore: number;
|
|
46
|
+
judgeReason: string;
|
|
47
|
+
}
|
|
48
|
+
export interface InjectionScanResult extends ScanResult {
|
|
49
|
+
findings: InjectionFinding[];
|
|
50
|
+
vulnerableCount: number;
|
|
51
|
+
payloadsTested: number;
|
|
52
|
+
}
|
|
53
|
+
export declare function scanInjection(options: InjectionScanOptions): Promise<InjectionScanResult>;
|
|
54
|
+
//# sourceMappingURL=injection.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../../../src/lib/scanners/injection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAI/C,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,YAAY,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,GAAG,UAAU,CAAC;IACnF,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED,eAAO,MAAM,kBAAkB,EAAE,gBAAgB,EA6BhD,CAAC;AAIF,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC;IACnD,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACvC,QAAQ,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,OAAO,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;CACxB;AA8ED,wBAAsB,aAAa,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAmE/F"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII scanner for health-scan integration.
|
|
3
|
+
*
|
|
4
|
+
* Hits an API endpoint with a set of test prompts and scans each response
|
|
5
|
+
* for PII using the pii.ts detector. Issues are reported as ScanIssues.
|
|
6
|
+
*/
|
|
7
|
+
import type { ScanResult } from "../../types/index.js";
|
|
8
|
+
export interface PiiScanOptions {
|
|
9
|
+
url: string;
|
|
10
|
+
endpoint?: string;
|
|
11
|
+
method?: string;
|
|
12
|
+
headers?: Record<string, string>;
|
|
13
|
+
inputField?: string;
|
|
14
|
+
seedPii?: string[];
|
|
15
|
+
timeoutMs?: number;
|
|
16
|
+
testPrompts?: string[];
|
|
17
|
+
}
|
|
18
|
+
export declare function scanPiiEndpoint(options: PiiScanOptions): Promise<ScanResult>;
|
|
19
|
+
//# sourceMappingURL=pii-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-scanner.d.ts","sourceRoot":"","sources":["../../../src/lib/scanners/pii-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,sBAAsB,CAAC;AAGlE,MAAM,WAAW,cAAc;IAC7B,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAuDD,wBAAsB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAgClF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PII and data leak detector for AI responses.
|
|
3
|
+
*
|
|
4
|
+
* Scans text for sensitive information patterns (email, phone, SSN, credit card,
|
|
5
|
+
* API keys, private IP addresses) and custom seed patterns.
|
|
6
|
+
*
|
|
7
|
+
* Use it to detect when AI endpoints accidentally leak PII from context/training data.
|
|
8
|
+
*/
|
|
9
|
+
export interface PiiDetection {
|
|
10
|
+
type: "email" | "phone" | "ssn" | "credit_card" | "api_key" | "ip_private" | "custom";
|
|
11
|
+
value: string;
|
|
12
|
+
position: number;
|
|
13
|
+
severity: "critical" | "high" | "medium";
|
|
14
|
+
context: string;
|
|
15
|
+
}
|
|
16
|
+
export declare function scanForPii(text: string, seedPii?: string[]): PiiDetection[];
|
|
17
|
+
//# sourceMappingURL=pii.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii.d.ts","sourceRoot":"","sources":["../../../src/lib/scanners/pii.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,KAAK,GAAG,aAAa,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;IACtF,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,OAAO,EAAE,MAAM,CAAC;CACjB;AAoFD,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,CA+D3E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screenshotter.d.ts","sourceRoot":"","sources":["../../src/lib/screenshotter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3E;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,IAAI,GACf,MAAM,CAMR;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAID,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAuBD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC5G,IAAI,CAON;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxH,IAAI,CAON;AAkCD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,YAAY,CAAO;gBAEf,OAAO,GAAE,oBAAyB;IASxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"screenshotter.d.ts","sourceRoot":"","sources":["../../src/lib/screenshotter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAOvC,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAK5C;AAED,wBAAgB,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAI3E;AAUD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,EACpB,SAAS,CAAC,EAAE,IAAI,GACf,MAAM,CAMR;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAID,UAAU,oBAAoB;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,UAAU,cAAc;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAuBD,wBAAgB,YAAY,CAC1B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GAC5G,IAAI,CAON;AAED,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxH,IAAI,CAON;AAkCD,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiB;IACxC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAU;IACnC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,YAAY,CAAO;gBAEf,OAAO,GAAE,oBAAyB;IASxC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAmDpE,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;IAiD5E,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC;CA6CpG"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export type SessionFormat = "rrweb" | "har" | "testers";
|
|
2
|
+
export interface SessionEvent {
|
|
3
|
+
type: "navigate" | "click" | "input" | "scroll" | "network";
|
|
4
|
+
timestamp: number;
|
|
5
|
+
url?: string;
|
|
6
|
+
selector?: string;
|
|
7
|
+
value?: string;
|
|
8
|
+
networkUrl?: string;
|
|
9
|
+
networkMethod?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface ConvertedScenario {
|
|
12
|
+
name: string;
|
|
13
|
+
description: string;
|
|
14
|
+
steps: string[];
|
|
15
|
+
tags: string[];
|
|
16
|
+
targetPath?: string;
|
|
17
|
+
}
|
|
18
|
+
export declare function parseRrwebSession(events: unknown[]): SessionEvent[];
|
|
19
|
+
export declare function parseHarSession(har: unknown): SessionEvent[];
|
|
20
|
+
export declare function convertSessionToScenario(events: SessionEvent[], options?: {
|
|
21
|
+
name?: string;
|
|
22
|
+
model?: string;
|
|
23
|
+
}): Promise<ConvertedScenario>;
|
|
24
|
+
export declare function convertSessionFile(filePath: string, format: SessionFormat, options?: {
|
|
25
|
+
name?: string;
|
|
26
|
+
model?: string;
|
|
27
|
+
}): Promise<ConvertedScenario>;
|
|
28
|
+
export declare function detectSessionFormat(filePath: string): SessionFormat;
|
|
29
|
+
//# sourceMappingURL=session-converter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-converter.d.ts","sourceRoot":"","sources":["../../src/lib/session-converter.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,KAAK,GAAG,SAAS,CAAC;AAExD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CAAC;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAsBD,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,YAAY,EAAE,CAqDnE;AAkBD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,YAAY,EAAE,CAqD5D;AAsDD,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,YAAY,EAAE,EACtB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,iBAAiB,CAAC,CA0D5B;AAED,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,aAAa,EACrB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,iBAAiB,CAAC,CAoC5B;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiBnE"}
|