@hasna/testers 0.0.35 → 0.0.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/index.js +35695 -35422
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1178 -24
- package/dist/lib/ai-client.d.ts +8 -2
- package/dist/lib/ai-client.d.ts.map +1 -1
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/crawl-and-generate.d.ts +1 -1
- package/dist/lib/crawl-and-generate.d.ts.map +1 -1
- package/dist/lib/generator.d.ts.map +1 -1
- package/dist/lib/healer.d.ts.map +1 -1
- package/dist/lib/hybrid-runner.d.ts.map +1 -1
- package/dist/lib/judge.d.ts +3 -3
- package/dist/lib/judge.d.ts.map +1 -1
- package/dist/lib/quick-qa.d.ts +61 -0
- package/dist/lib/quick-qa.d.ts.map +1 -0
- package/dist/lib/runner.d.ts +1 -0
- package/dist/lib/runner.d.ts.map +1 -1
- package/dist/lib/session-converter.d.ts.map +1 -1
- package/dist/mcp/index.js +73 -33
- package/dist/server/index.js +47 -25
- package/package.json +2 -1
- package/skills/skill-debug-prod/SKILL.md +97 -0
- package/skills/skill-quick-qa/SKILL.md +81 -0
- package/skills/skill-testers-qa/SKILL.md +89 -0
- package/skills/skill-testers-workflow/SKILL.md +126 -0
package/dist/lib/ai-client.d.ts
CHANGED
|
@@ -96,9 +96,13 @@ export declare function runAgentLoop(options: AgentLoopOptions): Promise<AgentLo
|
|
|
96
96
|
* Detects the AI provider from a model name.
|
|
97
97
|
* - "gpt-*" or "o1-*" / "o3-*" → openai
|
|
98
98
|
* - "gemini-*" → google
|
|
99
|
+
* - "glm-*" / "zai/*" / "zai-*" → Z.AI
|
|
100
|
+
* - "llama-*" / "qwen-*" / names containing "cerebras" → Cerebras
|
|
99
101
|
* - everything else → anthropic (default)
|
|
100
102
|
*/
|
|
101
|
-
export
|
|
103
|
+
export type AIProvider = "anthropic" | "openai" | "google" | "cerebras" | "zai";
|
|
104
|
+
export declare function detectProvider(model: string): AIProvider;
|
|
105
|
+
export declare function resolveProviderApiKeyForModel(model: string, explicitApiKey?: string, configuredAnthropicApiKey?: string): string | undefined;
|
|
102
106
|
/**
|
|
103
107
|
* Creates an Anthropic client instance. Uses the provided API key,
|
|
104
108
|
* or falls back to the ANTHROPIC_API_KEY environment variable.
|
|
@@ -128,11 +132,13 @@ export declare function callOpenAICompatible(options: {
|
|
|
128
132
|
* Creates the right client/config for a given model. Returns either an Anthropic
|
|
129
133
|
* client or a config object for the OpenAI-compatible path.
|
|
130
134
|
*/
|
|
135
|
+
export type OpenAICompatProvider = Exclude<AIProvider, "anthropic">;
|
|
131
136
|
export type OpenAICompatConfig = {
|
|
132
|
-
provider:
|
|
137
|
+
provider: OpenAICompatProvider;
|
|
133
138
|
baseUrl: string;
|
|
134
139
|
apiKey: string;
|
|
135
140
|
};
|
|
141
|
+
export declare function createOpenAICompatibleConfig(provider: OpenAICompatProvider, apiKey?: string): OpenAICompatConfig;
|
|
136
142
|
export declare function createClientForModel(model: string, apiKey?: string): Anthropic | OpenAICompatConfig;
|
|
137
143
|
export {};
|
|
138
144
|
//# sourceMappingURL=ai-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/lib/ai-client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"ai-client.d.ts","sourceRoot":"","sources":["../../src/lib/ai-client.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAOpE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAiBhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAe,MAAM,mBAAmB,CAAC;AAOpE;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,aAAa,CAiBhD;AAED;;;GAGG;AACH,wBAAgB,UAAU,IAAI,aAAa,CAuD1C;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKrD"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Given any URL:
|
|
5
5
|
* 1. Crawls the app with a headless browser to discover pages
|
|
6
6
|
* 2. Visits each page, captures a screenshot + simplified HTML
|
|
7
|
-
* 3. Sends
|
|
7
|
+
* 3. Sends the page context to the configured model to write test scenarios
|
|
8
8
|
* 4. Creates the scenarios in the DB under the given project
|
|
9
9
|
*
|
|
10
10
|
* Works for any web app — no manual setup required.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crawl-and-generate.d.ts","sourceRoot":"","sources":["../../src/lib/crawl-and-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;
|
|
1
|
+
{"version":3,"file":"crawl-and-generate.d.ts","sourceRoot":"","sources":["../../src/lib/crawl-and-generate.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAgBH,MAAM,WAAW,uBAAuB;IACtC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACjE;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AA2KD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,uBAAuB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CA0GxG"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAI/E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../../src/lib/generator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAOH,OAAO,KAAK,EAAE,mBAAmB,EAAoB,MAAM,mBAAmB,CAAC;AAI/E,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,iBAAkB,SAAQ,mBAAmB;IAC5D,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;CACf;AAyKD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAoD3F"}
|
package/dist/lib/healer.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,CAyG5E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hybrid-runner.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-runner.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"hybrid-runner.d.ts","sourceRoot":"","sources":["../../src/lib/hybrid-runner.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/judge.d.ts
CHANGED
|
@@ -7,10 +7,10 @@
|
|
|
7
7
|
* Provider resolution order:
|
|
8
8
|
* 1. config.model (explicit) → detectProvider()
|
|
9
9
|
* 2. ANTHROPIC_API_KEY env
|
|
10
|
-
* 3. OPENAI_API_KEY env
|
|
11
|
-
* 4. GOOGLE_API_KEY env
|
|
10
|
+
* 3. OPENAI_API_KEY / GOOGLE_API_KEY / CEREBRAS_API_KEY / ZAI_API_KEY env
|
|
12
11
|
*/
|
|
13
|
-
|
|
12
|
+
import { type AIProvider } from "./ai-client.js";
|
|
13
|
+
export type JudgeProvider = AIProvider | "auto";
|
|
14
14
|
export interface JudgeConfig {
|
|
15
15
|
model?: string;
|
|
16
16
|
provider?: JudgeProvider;
|
package/dist/lib/judge.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/lib/judge.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"judge.d.ts","sourceRoot":"","sources":["../../src/lib/judge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAIL,KAAK,UAAU,EAEhB,MAAM,gBAAgB,CAAC;AAOxB,MAAM,MAAM,aAAa,GAAG,UAAU,GAAG,MAAM,CAAC;AAEhD,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;AAkID,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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { type HealthScanOptions, type HealthScanSummary } from "./health-scan.js";
|
|
2
|
+
import { type SmokeResult } from "./smoke.js";
|
|
3
|
+
export type QuickQaScanner = NonNullable<HealthScanOptions["scanners"]>[number];
|
|
4
|
+
export type QuickQaSkipTarget = QuickQaScanner | "smoke";
|
|
5
|
+
export type QuickQaStatus = "passed" | "warn" | "failed";
|
|
6
|
+
export declare const DEFAULT_QUICK_QA_SCANNERS: QuickQaScanner[];
|
|
7
|
+
export interface QuickQaSelection {
|
|
8
|
+
scanners: QuickQaScanner[];
|
|
9
|
+
includeSmoke: boolean;
|
|
10
|
+
skipped: QuickQaSkipTarget[];
|
|
11
|
+
}
|
|
12
|
+
export interface QuickQaOptions {
|
|
13
|
+
url: string;
|
|
14
|
+
pages?: string[];
|
|
15
|
+
projectId?: string;
|
|
16
|
+
headed?: boolean;
|
|
17
|
+
timeoutMs?: number;
|
|
18
|
+
maxPages?: number;
|
|
19
|
+
scanners?: QuickQaScanner[];
|
|
20
|
+
includeSmoke?: boolean;
|
|
21
|
+
model?: string;
|
|
22
|
+
wcagLevel?: "A" | "AA" | "AAA";
|
|
23
|
+
}
|
|
24
|
+
export interface QuickQaCheckSummary {
|
|
25
|
+
name: "health" | "smoke";
|
|
26
|
+
status: QuickQaStatus | "skipped";
|
|
27
|
+
issues: number;
|
|
28
|
+
actionableIssues: number;
|
|
29
|
+
detail: string;
|
|
30
|
+
}
|
|
31
|
+
export interface QuickQaResult {
|
|
32
|
+
url: string;
|
|
33
|
+
status: QuickQaStatus;
|
|
34
|
+
durationMs: number;
|
|
35
|
+
health: HealthScanSummary;
|
|
36
|
+
smoke: SmokeResult | null;
|
|
37
|
+
checks: QuickQaCheckSummary[];
|
|
38
|
+
issueCounts: {
|
|
39
|
+
total: number;
|
|
40
|
+
actionable: number;
|
|
41
|
+
health: number;
|
|
42
|
+
smoke: number;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export declare function normalizeQuickQaWcagLevel(value: unknown): "A" | "AA" | "AAA";
|
|
46
|
+
export declare function resolveQuickQaSelection(options?: {
|
|
47
|
+
skip?: string[];
|
|
48
|
+
includeA11y?: boolean;
|
|
49
|
+
includeSmoke?: boolean;
|
|
50
|
+
scanners?: QuickQaScanner[];
|
|
51
|
+
}): QuickQaSelection;
|
|
52
|
+
export declare function runQuickQa(options: QuickQaOptions): Promise<QuickQaResult>;
|
|
53
|
+
export declare function buildQuickQaResult(input: {
|
|
54
|
+
url: string;
|
|
55
|
+
health: HealthScanSummary;
|
|
56
|
+
smoke: SmokeResult | null;
|
|
57
|
+
durationMs: number;
|
|
58
|
+
}): QuickQaResult;
|
|
59
|
+
export declare function getQuickQaExitCode(result: QuickQaResult): number;
|
|
60
|
+
export declare function formatQuickQaReport(result: QuickQaResult): string;
|
|
61
|
+
//# sourceMappingURL=quick-qa.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quick-qa.d.ts","sourceRoot":"","sources":["../../src/lib/quick-qa.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAY,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAChF,MAAM,MAAM,iBAAiB,GAAG,cAAc,GAAG,OAAO,CAAC;AACzD,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEzD,eAAO,MAAM,yBAAyB,EAAE,cAAc,EAKrD,CAAC;AAgBF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,iBAAiB,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,cAAc;IAC7B,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,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;IAC5B,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC;IACzB,MAAM,EAAE,aAAa,GAAG,SAAS,CAAC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,EAAE,MAAM,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,aAAa;IAC5B,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,WAAW,EAAE;QACX,KAAK,EAAE,MAAM,CAAC;QACd,UAAU,EAAE,MAAM,CAAC;QACnB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;KACf,CAAC;CACH;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,GAAG,GAAG,IAAI,GAAG,KAAK,CAK5E;AAED,wBAAgB,uBAAuB,CAAC,OAAO,GAAE;IAC/C,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,QAAQ,CAAC,EAAE,cAAc,EAAE,CAAC;CACxB,GAAG,gBAAgB,CAwBxB;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA6BhF;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE;IACxC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,iBAAiB,CAAC;IAC1B,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,CAAC;CACpB,GAAG,aAAa,CA2DhB;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAEhE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA8CjE"}
|
package/dist/lib/runner.d.ts
CHANGED
|
@@ -46,6 +46,7 @@ export interface RunEvent {
|
|
|
46
46
|
}
|
|
47
47
|
export type RunEventHandler = (event: RunEvent) => void;
|
|
48
48
|
export declare function onRunEvent(handler: RunEventHandler): void;
|
|
49
|
+
export declare function resolveAgentApiKeyForModel(model: string, explicitApiKey?: string, configuredAnthropicApiKey?: string): string | undefined;
|
|
49
50
|
type AgentScenarioStatus = Extract<ResultStatus, "passed" | "failed" | "error">;
|
|
50
51
|
export interface StructuredAssertionOutcome {
|
|
51
52
|
status: AgentScenarioStatus;
|
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,YAAY,EAAE,MAAM,mBAAmB,CAAC;AA6B7E,OAAO,KAAK,EAAW,IAAI,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,WAAW,UAAU;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,aAAa,CAAC;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,OAAO,GAAG;QAAE,KAAK,CAAC,EAAE,GAAG,GAAG,IAAI,GAAG,KAAK,CAAA;KAAE,CAAC;IAChD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,QAAQ;IACvB,IAAI,EACA,gBAAgB,GAChB,eAAe,GACf,eAAe,GACf,gBAAgB,GAChB,qBAAqB,GACrB,cAAc,GACd,gBAAgB,GAChB,kBAAkB,GAClB,eAAe,GACf,0BAA0B,CAAC;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,eAAe,GAAG,CAAC,KAAK,EAAE,QAAQ,KAAK,IAAI,CAAC;AAIxD,wBAAgB,UAAU,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEzD;AAMD,KAAK,mBAAmB,GAAG,OAAO,CAAC,YAAY,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC,CAAC;AAEhF,MAAM,WAAW,0BAA0B;IACzC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,EAAE,KAAK,CAAC;QACtB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,OAAO,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC,CAAC;CACJ;AAiBD,wBAAsB,iCAAiC,CAAC,KAAK,EAAE;IAC7D,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,EAAE,QAAQ,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,0BAA0B,CAAC,CAyCtC;AA2BD,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,QAAQ,EAClB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/lib/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +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,
|
|
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,CAkE5B;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"}
|
package/dist/mcp/index.js
CHANGED
|
@@ -52,7 +52,7 @@ var package_default;
|
|
|
52
52
|
var init_package = __esm(() => {
|
|
53
53
|
package_default = {
|
|
54
54
|
name: "@hasna/testers",
|
|
55
|
-
version: "0.0.
|
|
55
|
+
version: "0.0.37",
|
|
56
56
|
description: "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
|
|
57
57
|
type: "module",
|
|
58
58
|
main: "dist/index.js",
|
|
@@ -71,6 +71,7 @@ var init_package = __esm(() => {
|
|
|
71
71
|
files: [
|
|
72
72
|
"dist/",
|
|
73
73
|
"dashboard/dist/",
|
|
74
|
+
"skills/",
|
|
74
75
|
"LICENSE",
|
|
75
76
|
"README.md"
|
|
76
77
|
],
|
|
@@ -16600,6 +16601,10 @@ function loadConfig() {
|
|
|
16600
16601
|
if (envApiKey) {
|
|
16601
16602
|
config.anthropicApiKey = envApiKey;
|
|
16602
16603
|
}
|
|
16604
|
+
const envSelfHeal = process.env["TESTERS_SELF_HEAL"];
|
|
16605
|
+
if (envSelfHeal !== undefined) {
|
|
16606
|
+
config.selfHeal = ["1", "true", "yes", "on"].includes(envSelfHeal.toLowerCase());
|
|
16607
|
+
}
|
|
16603
16608
|
return config;
|
|
16604
16609
|
}
|
|
16605
16610
|
function resolveModel(nameOrId) {
|
|
@@ -16642,12 +16647,11 @@ Original selector that failed: "${request.failedSelector}"
|
|
|
16642
16647
|
Please identify the correct selector from the screenshot.`;
|
|
16643
16648
|
let rawResponse = "";
|
|
16644
16649
|
try {
|
|
16645
|
-
if (provider
|
|
16646
|
-
const
|
|
16647
|
-
const apiKey = provider === "openai" ? process.env["OPENAI_API_KEY"] ?? "" : process.env["GOOGLE_API_KEY"] ?? "";
|
|
16650
|
+
if (provider !== "anthropic") {
|
|
16651
|
+
const compat = createOpenAICompatibleConfig(provider);
|
|
16648
16652
|
const resp = await callOpenAICompatible({
|
|
16649
|
-
baseUrl,
|
|
16650
|
-
apiKey,
|
|
16653
|
+
baseUrl: compat.baseUrl,
|
|
16654
|
+
apiKey: compat.apiKey,
|
|
16651
16655
|
model,
|
|
16652
16656
|
system: HEAL_SYSTEM,
|
|
16653
16657
|
messages: [{ role: "user", content: userMessage }],
|
|
@@ -16741,9 +16745,11 @@ var init_healer = __esm(() => {
|
|
|
16741
16745
|
var exports_ai_client = {};
|
|
16742
16746
|
__export(exports_ai_client, {
|
|
16743
16747
|
runAgentLoop: () => runAgentLoop,
|
|
16748
|
+
resolveProviderApiKeyForModel: () => resolveProviderApiKeyForModel,
|
|
16744
16749
|
resolveModel: () => resolveModel2,
|
|
16745
16750
|
executeTool: () => executeTool,
|
|
16746
16751
|
detectProvider: () => detectProvider,
|
|
16752
|
+
createOpenAICompatibleConfig: () => createOpenAICompatibleConfig,
|
|
16747
16753
|
createClientForModel: () => createClientForModel,
|
|
16748
16754
|
createClient: () => createClient,
|
|
16749
16755
|
callOpenAICompatible: () => callOpenAICompatible,
|
|
@@ -17566,10 +17572,17 @@ function detectProvider(model) {
|
|
|
17566
17572
|
return "openai";
|
|
17567
17573
|
if (model.startsWith("gemini-"))
|
|
17568
17574
|
return "google";
|
|
17575
|
+
if (model.startsWith("glm-") || model.startsWith("zai/") || model.startsWith("zai-"))
|
|
17576
|
+
return "zai";
|
|
17569
17577
|
if (model.startsWith("llama-") || model.startsWith("qwen-") || model.includes("cerebras"))
|
|
17570
17578
|
return "cerebras";
|
|
17571
17579
|
return "anthropic";
|
|
17572
17580
|
}
|
|
17581
|
+
function resolveProviderApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey) {
|
|
17582
|
+
if (explicitApiKey)
|
|
17583
|
+
return explicitApiKey;
|
|
17584
|
+
return detectProvider(model) === "anthropic" ? configuredAnthropicApiKey : undefined;
|
|
17585
|
+
}
|
|
17573
17586
|
function createClient(apiKey) {
|
|
17574
17587
|
const key = apiKey ?? process.env["ANTHROPIC_API_KEY"];
|
|
17575
17588
|
if (!key) {
|
|
@@ -17647,26 +17660,34 @@ async function callOpenAICompatible(options) {
|
|
|
17647
17660
|
const usage = { input_tokens: data.usage?.prompt_tokens ?? 0, output_tokens: data.usage?.completion_tokens ?? 0 };
|
|
17648
17661
|
return { content, stop_reason: stopReason, usage };
|
|
17649
17662
|
}
|
|
17650
|
-
function
|
|
17651
|
-
const provider = detectProvider(model);
|
|
17663
|
+
function createOpenAICompatibleConfig(provider, apiKey) {
|
|
17652
17664
|
if (provider === "openai") {
|
|
17653
|
-
const
|
|
17654
|
-
if (!
|
|
17665
|
+
const key2 = apiKey ?? process.env["OPENAI_API_KEY"];
|
|
17666
|
+
if (!key2)
|
|
17655
17667
|
throw new AIClientError("No OpenAI API key. Set OPENAI_API_KEY or pass it explicitly.");
|
|
17656
|
-
return { provider: "openai", baseUrl: "https://api.openai.com/v1", apiKey:
|
|
17668
|
+
return { provider: "openai", baseUrl: "https://api.openai.com/v1", apiKey: key2 };
|
|
17657
17669
|
}
|
|
17658
17670
|
if (provider === "google") {
|
|
17659
|
-
const
|
|
17660
|
-
if (!
|
|
17671
|
+
const key2 = apiKey ?? process.env["GOOGLE_API_KEY"];
|
|
17672
|
+
if (!key2)
|
|
17661
17673
|
throw new AIClientError("No Google API key. Set GOOGLE_API_KEY or pass it explicitly.");
|
|
17662
|
-
return { provider: "google", baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai", apiKey:
|
|
17674
|
+
return { provider: "google", baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai", apiKey: key2 };
|
|
17663
17675
|
}
|
|
17664
17676
|
if (provider === "cerebras") {
|
|
17665
|
-
const
|
|
17666
|
-
if (!
|
|
17677
|
+
const key2 = apiKey ?? process.env["CEREBRAS_API_KEY"];
|
|
17678
|
+
if (!key2)
|
|
17667
17679
|
throw new AIClientError("No Cerebras API key. Set CEREBRAS_API_KEY or pass it explicitly.");
|
|
17668
|
-
return { provider: "cerebras", baseUrl: "https://api.cerebras.ai/v1", apiKey:
|
|
17680
|
+
return { provider: "cerebras", baseUrl: "https://api.cerebras.ai/v1", apiKey: key2 };
|
|
17669
17681
|
}
|
|
17682
|
+
const key = apiKey ?? process.env["ZAI_API_KEY"];
|
|
17683
|
+
if (!key)
|
|
17684
|
+
throw new AIClientError("No Z.AI API key. Set ZAI_API_KEY or pass it explicitly.");
|
|
17685
|
+
return { provider: "zai", baseUrl: "https://api.z.ai/api/paas/v4", apiKey: key };
|
|
17686
|
+
}
|
|
17687
|
+
function createClientForModel(model, apiKey) {
|
|
17688
|
+
const provider = detectProvider(model);
|
|
17689
|
+
if (provider !== "anthropic")
|
|
17690
|
+
return createOpenAICompatibleConfig(provider, apiKey);
|
|
17670
17691
|
return createClient(apiKey);
|
|
17671
17692
|
}
|
|
17672
17693
|
var activeHARs, activeCoverage, BROWSER_TOOLS;
|
|
@@ -18243,22 +18264,22 @@ function resolveJudgeModel(config) {
|
|
|
18243
18264
|
apiKey = process.env["GOOGLE_API_KEY"];
|
|
18244
18265
|
else if (provider === "cerebras")
|
|
18245
18266
|
apiKey = process.env["CEREBRAS_API_KEY"];
|
|
18267
|
+
else if (provider === "zai")
|
|
18268
|
+
apiKey = process.env["ZAI_API_KEY"];
|
|
18246
18269
|
}
|
|
18247
18270
|
if (!apiKey) {
|
|
18248
|
-
|
|
18249
|
-
if (!apiKey)
|
|
18250
|
-
throw new AIClientError("No API key found for judge. Set ANTHROPIC_API_KEY, CEREBRAS_API_KEY, OPENAI_API_KEY, or GOOGLE_API_KEY.");
|
|
18271
|
+
throw new AIClientError(`No API key found for ${provider} judge provider.`);
|
|
18251
18272
|
}
|
|
18252
18273
|
return { model, provider, apiKey };
|
|
18253
18274
|
}
|
|
18254
18275
|
async function callJudge(prompt, config) {
|
|
18255
18276
|
const { model, provider, apiKey } = resolveJudgeModel(config);
|
|
18256
18277
|
const threshold = 0.7;
|
|
18257
|
-
if (provider
|
|
18258
|
-
const
|
|
18278
|
+
if (provider !== "anthropic") {
|
|
18279
|
+
const compat = createOpenAICompatibleConfig(provider, apiKey);
|
|
18259
18280
|
const resp2 = await callOpenAICompatible({
|
|
18260
|
-
baseUrl,
|
|
18261
|
-
apiKey,
|
|
18281
|
+
baseUrl: compat.baseUrl,
|
|
18282
|
+
apiKey: compat.apiKey,
|
|
18262
18283
|
model,
|
|
18263
18284
|
system: LLM_SYSTEM,
|
|
18264
18285
|
messages: [{ role: "user", content: prompt }],
|
|
@@ -21159,6 +21180,7 @@ __export(exports_runner, {
|
|
|
21159
21180
|
runByFilter: () => runByFilter,
|
|
21160
21181
|
runBatch: () => runBatch,
|
|
21161
21182
|
resolveScenariosForRun: () => resolveScenariosForRun,
|
|
21183
|
+
resolveAgentApiKeyForModel: () => resolveAgentApiKeyForModel,
|
|
21162
21184
|
onRunEvent: () => onRunEvent,
|
|
21163
21185
|
applyStructuredAssertionsToResult: () => applyStructuredAssertionsToResult
|
|
21164
21186
|
});
|
|
@@ -21172,6 +21194,9 @@ function emit(event) {
|
|
|
21172
21194
|
if (eventHandler)
|
|
21173
21195
|
eventHandler(event);
|
|
21174
21196
|
}
|
|
21197
|
+
function resolveAgentApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey) {
|
|
21198
|
+
return resolveProviderApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey);
|
|
21199
|
+
}
|
|
21175
21200
|
function assertionDescription(result) {
|
|
21176
21201
|
return result.assertion.description || `${result.assertion.type}${result.assertion.selector ? ` ${result.assertion.selector}` : ""}`;
|
|
21177
21202
|
}
|
|
@@ -21280,7 +21305,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
21280
21305
|
});
|
|
21281
21306
|
}
|
|
21282
21307
|
}
|
|
21283
|
-
const client = createClientForModel(model, effectiveOptions.apiKey
|
|
21308
|
+
const client = createClientForModel(model, resolveAgentApiKeyForModel(model, effectiveOptions.apiKey, config.anthropicApiKey));
|
|
21284
21309
|
const screenshotter = new Screenshotter({
|
|
21285
21310
|
baseDir: effectiveOptions.screenshotDir ?? config.screenshots.dir
|
|
21286
21311
|
});
|
|
@@ -85705,12 +85730,28 @@ Rules:
|
|
|
85705
85730
|
];
|
|
85706
85731
|
const messages = [{ role: "user", content: contentParts }];
|
|
85707
85732
|
try {
|
|
85708
|
-
|
|
85709
|
-
|
|
85710
|
-
|
|
85711
|
-
|
|
85712
|
-
|
|
85713
|
-
|
|
85733
|
+
let text2;
|
|
85734
|
+
const provider = detectProvider(model);
|
|
85735
|
+
if (provider !== "anthropic") {
|
|
85736
|
+
const compat2 = client;
|
|
85737
|
+
const response = await callOpenAICompatible({
|
|
85738
|
+
baseUrl: compat2.baseUrl,
|
|
85739
|
+
apiKey: compat2.apiKey,
|
|
85740
|
+
model,
|
|
85741
|
+
system: "You are a QA engineer.",
|
|
85742
|
+
messages: [{ role: "user", content: prompt }],
|
|
85743
|
+
tools: [],
|
|
85744
|
+
maxTokens: 2048
|
|
85745
|
+
});
|
|
85746
|
+
text2 = response.content.filter((b2) => b2.type === "text").map((b2) => b2.text).join("");
|
|
85747
|
+
} else {
|
|
85748
|
+
const response = await anthropicClient.messages.create({
|
|
85749
|
+
model,
|
|
85750
|
+
max_tokens: 2048,
|
|
85751
|
+
messages
|
|
85752
|
+
});
|
|
85753
|
+
text2 = response.content.filter((b2) => b2.type === "text").map((b2) => b2.text).join("");
|
|
85754
|
+
}
|
|
85714
85755
|
const match = text2.match(/\[[\s\S]*\]/);
|
|
85715
85756
|
if (!match)
|
|
85716
85757
|
return [];
|
|
@@ -85738,7 +85779,7 @@ async function crawlAndGenerate(options) {
|
|
|
85738
85779
|
} = options;
|
|
85739
85780
|
const config2 = loadConfig();
|
|
85740
85781
|
const model = resolveModel2(options.model ?? config2.defaultModel ?? "thorough");
|
|
85741
|
-
const client =
|
|
85782
|
+
const client = createClientForModel(model, resolveProviderApiKeyForModel(model, options.apiKey, config2.anthropicApiKey));
|
|
85742
85783
|
const rootOrigin = new URL(url2).origin;
|
|
85743
85784
|
const visited = new Set;
|
|
85744
85785
|
const queue = [url2];
|
|
@@ -85818,7 +85859,6 @@ var init_crawl_and_generate = __esm(() => {
|
|
|
85818
85859
|
init_scenarios();
|
|
85819
85860
|
init_ai_client();
|
|
85820
85861
|
init_config2();
|
|
85821
|
-
init_ai_client();
|
|
85822
85862
|
DEFAULT_SKIP_PATTERNS = [
|
|
85823
85863
|
"/logout",
|
|
85824
85864
|
"/sign-out",
|
package/dist/server/index.js
CHANGED
|
@@ -15319,6 +15319,10 @@ function loadConfig() {
|
|
|
15319
15319
|
if (envApiKey) {
|
|
15320
15320
|
config.anthropicApiKey = envApiKey;
|
|
15321
15321
|
}
|
|
15322
|
+
const envSelfHeal = process.env["TESTERS_SELF_HEAL"];
|
|
15323
|
+
if (envSelfHeal !== undefined) {
|
|
15324
|
+
config.selfHeal = ["1", "true", "yes", "on"].includes(envSelfHeal.toLowerCase());
|
|
15325
|
+
}
|
|
15322
15326
|
return config;
|
|
15323
15327
|
}
|
|
15324
15328
|
var CONFIG_DIR3, CONFIG_PATH2;
|
|
@@ -15355,12 +15359,11 @@ Original selector that failed: "${request.failedSelector}"
|
|
|
15355
15359
|
Please identify the correct selector from the screenshot.`;
|
|
15356
15360
|
let rawResponse = "";
|
|
15357
15361
|
try {
|
|
15358
|
-
if (provider
|
|
15359
|
-
const
|
|
15360
|
-
const apiKey = provider === "openai" ? process.env["OPENAI_API_KEY"] ?? "" : process.env["GOOGLE_API_KEY"] ?? "";
|
|
15362
|
+
if (provider !== "anthropic") {
|
|
15363
|
+
const compat = createOpenAICompatibleConfig(provider);
|
|
15361
15364
|
const resp = await callOpenAICompatible({
|
|
15362
|
-
baseUrl,
|
|
15363
|
-
apiKey,
|
|
15365
|
+
baseUrl: compat.baseUrl,
|
|
15366
|
+
apiKey: compat.apiKey,
|
|
15364
15367
|
model,
|
|
15365
15368
|
system: HEAL_SYSTEM,
|
|
15366
15369
|
messages: [{ role: "user", content: userMessage }],
|
|
@@ -16267,10 +16270,17 @@ function detectProvider(model) {
|
|
|
16267
16270
|
return "openai";
|
|
16268
16271
|
if (model.startsWith("gemini-"))
|
|
16269
16272
|
return "google";
|
|
16273
|
+
if (model.startsWith("glm-") || model.startsWith("zai/") || model.startsWith("zai-"))
|
|
16274
|
+
return "zai";
|
|
16270
16275
|
if (model.startsWith("llama-") || model.startsWith("qwen-") || model.includes("cerebras"))
|
|
16271
16276
|
return "cerebras";
|
|
16272
16277
|
return "anthropic";
|
|
16273
16278
|
}
|
|
16279
|
+
function resolveProviderApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey) {
|
|
16280
|
+
if (explicitApiKey)
|
|
16281
|
+
return explicitApiKey;
|
|
16282
|
+
return detectProvider(model) === "anthropic" ? configuredAnthropicApiKey : undefined;
|
|
16283
|
+
}
|
|
16274
16284
|
function createClient(apiKey) {
|
|
16275
16285
|
const key = apiKey ?? process.env["ANTHROPIC_API_KEY"];
|
|
16276
16286
|
if (!key) {
|
|
@@ -16348,26 +16358,34 @@ async function callOpenAICompatible(options) {
|
|
|
16348
16358
|
const usage = { input_tokens: data.usage?.prompt_tokens ?? 0, output_tokens: data.usage?.completion_tokens ?? 0 };
|
|
16349
16359
|
return { content, stop_reason: stopReason, usage };
|
|
16350
16360
|
}
|
|
16351
|
-
function
|
|
16352
|
-
const provider = detectProvider(model);
|
|
16361
|
+
function createOpenAICompatibleConfig(provider, apiKey) {
|
|
16353
16362
|
if (provider === "openai") {
|
|
16354
|
-
const
|
|
16355
|
-
if (!
|
|
16363
|
+
const key2 = apiKey ?? process.env["OPENAI_API_KEY"];
|
|
16364
|
+
if (!key2)
|
|
16356
16365
|
throw new AIClientError("No OpenAI API key. Set OPENAI_API_KEY or pass it explicitly.");
|
|
16357
|
-
return { provider: "openai", baseUrl: "https://api.openai.com/v1", apiKey:
|
|
16366
|
+
return { provider: "openai", baseUrl: "https://api.openai.com/v1", apiKey: key2 };
|
|
16358
16367
|
}
|
|
16359
16368
|
if (provider === "google") {
|
|
16360
|
-
const
|
|
16361
|
-
if (!
|
|
16369
|
+
const key2 = apiKey ?? process.env["GOOGLE_API_KEY"];
|
|
16370
|
+
if (!key2)
|
|
16362
16371
|
throw new AIClientError("No Google API key. Set GOOGLE_API_KEY or pass it explicitly.");
|
|
16363
|
-
return { provider: "google", baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai", apiKey:
|
|
16372
|
+
return { provider: "google", baseUrl: "https://generativelanguage.googleapis.com/v1beta/openai", apiKey: key2 };
|
|
16364
16373
|
}
|
|
16365
16374
|
if (provider === "cerebras") {
|
|
16366
|
-
const
|
|
16367
|
-
if (!
|
|
16375
|
+
const key2 = apiKey ?? process.env["CEREBRAS_API_KEY"];
|
|
16376
|
+
if (!key2)
|
|
16368
16377
|
throw new AIClientError("No Cerebras API key. Set CEREBRAS_API_KEY or pass it explicitly.");
|
|
16369
|
-
return { provider: "cerebras", baseUrl: "https://api.cerebras.ai/v1", apiKey:
|
|
16378
|
+
return { provider: "cerebras", baseUrl: "https://api.cerebras.ai/v1", apiKey: key2 };
|
|
16370
16379
|
}
|
|
16380
|
+
const key = apiKey ?? process.env["ZAI_API_KEY"];
|
|
16381
|
+
if (!key)
|
|
16382
|
+
throw new AIClientError("No Z.AI API key. Set ZAI_API_KEY or pass it explicitly.");
|
|
16383
|
+
return { provider: "zai", baseUrl: "https://api.z.ai/api/paas/v4", apiKey: key };
|
|
16384
|
+
}
|
|
16385
|
+
function createClientForModel(model, apiKey) {
|
|
16386
|
+
const provider = detectProvider(model);
|
|
16387
|
+
if (provider !== "anthropic")
|
|
16388
|
+
return createOpenAICompatibleConfig(provider, apiKey);
|
|
16371
16389
|
return createClient(apiKey);
|
|
16372
16390
|
}
|
|
16373
16391
|
var activeHARs, activeCoverage, BROWSER_TOOLS;
|
|
@@ -46892,7 +46910,7 @@ import { join as join14 } from "path";
|
|
|
46892
46910
|
// package.json
|
|
46893
46911
|
var package_default = {
|
|
46894
46912
|
name: "@hasna/testers",
|
|
46895
|
-
version: "0.0.
|
|
46913
|
+
version: "0.0.37",
|
|
46896
46914
|
description: "AI-powered QA testing CLI \u2014 spawns cheap AI agents to test web apps with headless browsers",
|
|
46897
46915
|
type: "module",
|
|
46898
46916
|
main: "dist/index.js",
|
|
@@ -46911,6 +46929,7 @@ var package_default = {
|
|
|
46911
46929
|
files: [
|
|
46912
46930
|
"dist/",
|
|
46913
46931
|
"dashboard/dist/",
|
|
46932
|
+
"skills/",
|
|
46914
46933
|
"LICENSE",
|
|
46915
46934
|
"README.md"
|
|
46916
46935
|
],
|
|
@@ -47471,11 +47490,11 @@ function resolveJudgeModel(config) {
|
|
|
47471
47490
|
apiKey = process.env["GOOGLE_API_KEY"];
|
|
47472
47491
|
else if (provider === "cerebras")
|
|
47473
47492
|
apiKey = process.env["CEREBRAS_API_KEY"];
|
|
47493
|
+
else if (provider === "zai")
|
|
47494
|
+
apiKey = process.env["ZAI_API_KEY"];
|
|
47474
47495
|
}
|
|
47475
47496
|
if (!apiKey) {
|
|
47476
|
-
|
|
47477
|
-
if (!apiKey)
|
|
47478
|
-
throw new AIClientError("No API key found for judge. Set ANTHROPIC_API_KEY, CEREBRAS_API_KEY, OPENAI_API_KEY, or GOOGLE_API_KEY.");
|
|
47497
|
+
throw new AIClientError(`No API key found for ${provider} judge provider.`);
|
|
47479
47498
|
}
|
|
47480
47499
|
return { model, provider, apiKey };
|
|
47481
47500
|
}
|
|
@@ -47490,11 +47509,11 @@ reason: 1-2 sentences max`;
|
|
|
47490
47509
|
async function callJudge(prompt, config) {
|
|
47491
47510
|
const { model, provider, apiKey } = resolveJudgeModel(config);
|
|
47492
47511
|
const threshold = 0.7;
|
|
47493
|
-
if (provider
|
|
47494
|
-
const
|
|
47512
|
+
if (provider !== "anthropic") {
|
|
47513
|
+
const compat = createOpenAICompatibleConfig(provider, apiKey);
|
|
47495
47514
|
const resp2 = await callOpenAICompatible({
|
|
47496
|
-
baseUrl,
|
|
47497
|
-
apiKey,
|
|
47515
|
+
baseUrl: compat.baseUrl,
|
|
47516
|
+
apiKey: compat.apiKey,
|
|
47498
47517
|
model,
|
|
47499
47518
|
system: LLM_SYSTEM,
|
|
47500
47519
|
messages: [{ role: "user", content: prompt }],
|
|
@@ -49382,6 +49401,9 @@ function emit(event) {
|
|
|
49382
49401
|
if (eventHandler)
|
|
49383
49402
|
eventHandler(event);
|
|
49384
49403
|
}
|
|
49404
|
+
function resolveAgentApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey) {
|
|
49405
|
+
return resolveProviderApiKeyForModel(model, explicitApiKey, configuredAnthropicApiKey);
|
|
49406
|
+
}
|
|
49385
49407
|
function assertionDescription(result) {
|
|
49386
49408
|
return result.assertion.description || `${result.assertion.type}${result.assertion.selector ? ` ${result.assertion.selector}` : ""}`;
|
|
49387
49409
|
}
|
|
@@ -49490,7 +49512,7 @@ async function runSingleScenario(scenario, runId, options) {
|
|
|
49490
49512
|
});
|
|
49491
49513
|
}
|
|
49492
49514
|
}
|
|
49493
|
-
const client = createClientForModel(model, effectiveOptions.apiKey
|
|
49515
|
+
const client = createClientForModel(model, resolveAgentApiKeyForModel(model, effectiveOptions.apiKey, config.anthropicApiKey));
|
|
49494
49516
|
const screenshotter = new Screenshotter({
|
|
49495
49517
|
baseDir: effectiveOptions.screenshotDir ?? config.screenshots.dir
|
|
49496
49518
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hasna/testers",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.37",
|
|
4
4
|
"description": "AI-powered QA testing CLI — spawns cheap AI agents to test web apps with headless browsers",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"files": [
|
|
20
20
|
"dist/",
|
|
21
21
|
"dashboard/dist/",
|
|
22
|
+
"skills/",
|
|
22
23
|
"LICENSE",
|
|
23
24
|
"README.md"
|
|
24
25
|
],
|