testchimp-runner-core 0.0.1
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/auth-config.d.ts +33 -0
- package/dist/auth-config.d.ts.map +1 -0
- package/dist/auth-config.js +69 -0
- package/dist/auth-config.js.map +1 -0
- package/dist/env-loader.d.ts +20 -0
- package/dist/env-loader.d.ts.map +1 -0
- package/dist/env-loader.js +83 -0
- package/dist/env-loader.js.map +1 -0
- package/dist/execution-service.d.ts +61 -0
- package/dist/execution-service.d.ts.map +1 -0
- package/dist/execution-service.js +822 -0
- package/dist/execution-service.js.map +1 -0
- package/dist/file-handler.d.ts +59 -0
- package/dist/file-handler.d.ts.map +1 -0
- package/dist/file-handler.js +75 -0
- package/dist/file-handler.js.map +1 -0
- package/dist/index.d.ts +46 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +196 -0
- package/dist/index.js.map +1 -0
- package/dist/llm-facade.d.ts +101 -0
- package/dist/llm-facade.d.ts.map +1 -0
- package/dist/llm-facade.js +289 -0
- package/dist/llm-facade.js.map +1 -0
- package/dist/playwright-mcp-service.d.ts +42 -0
- package/dist/playwright-mcp-service.d.ts.map +1 -0
- package/dist/playwright-mcp-service.js +167 -0
- package/dist/playwright-mcp-service.js.map +1 -0
- package/dist/prompts.d.ts +34 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +237 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scenario-service.d.ts +25 -0
- package/dist/scenario-service.d.ts.map +1 -0
- package/dist/scenario-service.js +119 -0
- package/dist/scenario-service.js.map +1 -0
- package/dist/scenario-worker-class.d.ts +30 -0
- package/dist/scenario-worker-class.d.ts.map +1 -0
- package/dist/scenario-worker-class.js +263 -0
- package/dist/scenario-worker-class.js.map +1 -0
- package/dist/script-utils.d.ts +44 -0
- package/dist/script-utils.d.ts.map +1 -0
- package/dist/script-utils.js +100 -0
- package/dist/script-utils.js.map +1 -0
- package/dist/types.d.ts +171 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +28 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/browser-utils.d.ts +13 -0
- package/dist/utils/browser-utils.d.ts.map +1 -0
- package/dist/utils/browser-utils.js +269 -0
- package/dist/utils/browser-utils.js.map +1 -0
- package/dist/utils/page-info-utils.d.ts +16 -0
- package/dist/utils/page-info-utils.d.ts.map +1 -0
- package/dist/utils/page-info-utils.js +77 -0
- package/dist/utils/page-info-utils.js.map +1 -0
- package/env.prod +1 -0
- package/env.staging +1 -0
- package/package.json +38 -0
- package/src/auth-config.ts +84 -0
- package/src/env-loader.ts +91 -0
- package/src/execution-service.ts +999 -0
- package/src/file-handler.ts +104 -0
- package/src/index.ts +205 -0
- package/src/llm-facade.ts +413 -0
- package/src/playwright-mcp-service.ts +203 -0
- package/src/prompts.ts +247 -0
- package/src/scenario-service.ts +138 -0
- package/src/scenario-worker-class.ts +330 -0
- package/src/script-utils.ts +109 -0
- package/src/types.ts +202 -0
- package/src/utils/browser-utils.ts +272 -0
- package/src/utils/page-info-utils.ts +93 -0
- package/tsconfig.json +19 -0
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ScenarioWorker = void 0;
|
|
4
|
+
const page_info_utils_1 = require("./utils/page-info-utils");
|
|
5
|
+
const browser_utils_1 = require("./utils/browser-utils");
|
|
6
|
+
const llm_facade_1 = require("./llm-facade");
|
|
7
|
+
const script_utils_1 = require("./script-utils");
|
|
8
|
+
const MAX_RETRIES_PER_STEP = 2;
|
|
9
|
+
class ScenarioWorker {
|
|
10
|
+
constructor(fileHandler, authConfig, outputChannel) {
|
|
11
|
+
this.initialized = false;
|
|
12
|
+
this.sessionId = null;
|
|
13
|
+
this.llmFacade = new llm_facade_1.LLMFacade(authConfig);
|
|
14
|
+
this.fileHandler = fileHandler;
|
|
15
|
+
this.outputChannel = outputChannel;
|
|
16
|
+
}
|
|
17
|
+
log(message) {
|
|
18
|
+
console.log(message);
|
|
19
|
+
if (this.outputChannel) {
|
|
20
|
+
this.outputChannel.appendLine(`[ScenarioWorker] ${message}`);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
logError(message) {
|
|
24
|
+
console.error(message);
|
|
25
|
+
if (this.outputChannel) {
|
|
26
|
+
this.outputChannel.appendLine(`[ScenarioWorker] ERROR: ${message}`);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
async initialize() {
|
|
30
|
+
try {
|
|
31
|
+
this.log('Initializing Scenario worker...');
|
|
32
|
+
this.sessionId = `scenario_worker_${Date.now()}`;
|
|
33
|
+
this.initialized = true;
|
|
34
|
+
this.log(`Scenario worker initialized with session: ${this.sessionId}`);
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
this.logError(`Scenario worker initialization error: ${error}`);
|
|
38
|
+
throw error;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async processScenarioJob(job) {
|
|
42
|
+
if (!this.initialized) {
|
|
43
|
+
throw new Error('Scenario worker not initialized');
|
|
44
|
+
}
|
|
45
|
+
const startTime = Date.now();
|
|
46
|
+
const steps = [];
|
|
47
|
+
let generatedScript = '';
|
|
48
|
+
let scriptPath;
|
|
49
|
+
let browser;
|
|
50
|
+
let context;
|
|
51
|
+
let page;
|
|
52
|
+
let overallSuccess = true;
|
|
53
|
+
try {
|
|
54
|
+
// 1. Break down scenario into steps using LLM
|
|
55
|
+
const scenarioSteps = await this.llmFacade.breakdownScenario(job.scenario, job.model);
|
|
56
|
+
steps.push(...scenarioSteps);
|
|
57
|
+
// 2. Start a new browser session using centralized utility
|
|
58
|
+
// Default to headed mode (headless: false) for better debugging
|
|
59
|
+
const browserInstance = await (0, browser_utils_1.initializeBrowser)(job.playwrightConfig, false);
|
|
60
|
+
browser = browserInstance.browser;
|
|
61
|
+
context = browserInstance.context;
|
|
62
|
+
page = browserInstance.page;
|
|
63
|
+
// Set reasonable timeout for all operations
|
|
64
|
+
page.setDefaultTimeout(5000); // 5 seconds
|
|
65
|
+
let previousSteps = [];
|
|
66
|
+
let lastError;
|
|
67
|
+
// 3. Execute each step
|
|
68
|
+
for (let i = 0; i < steps.length; i++) {
|
|
69
|
+
const step = steps[i];
|
|
70
|
+
step.stepNumber = i + 1;
|
|
71
|
+
step.retryCount = 0;
|
|
72
|
+
let stepSuccess = false;
|
|
73
|
+
let stepOutput = '';
|
|
74
|
+
let stepError;
|
|
75
|
+
for (let attempt = 0; attempt <= MAX_RETRIES_PER_STEP; attempt++) {
|
|
76
|
+
let currentAttemptCommand;
|
|
77
|
+
let currentAttemptSuccess = false;
|
|
78
|
+
let currentAttemptError;
|
|
79
|
+
const attemptTimestamp = Date.now();
|
|
80
|
+
try {
|
|
81
|
+
this.log(`Attempt ${attempt + 1} for step: ${step.description}`);
|
|
82
|
+
// Get current page state using Playwright's accessibility tree
|
|
83
|
+
const domSnapshot = {
|
|
84
|
+
url: page.url(),
|
|
85
|
+
title: await page.title(),
|
|
86
|
+
accessibilityTree: await page.accessibility.snapshot()
|
|
87
|
+
};
|
|
88
|
+
// Generate Playwright command using LLM
|
|
89
|
+
const pageInfo = await (0, page_info_utils_1.getEnhancedPageInfo)(domSnapshot);
|
|
90
|
+
const command = await this.llmFacade.generatePlaywrightCommand(step.description, pageInfo, previousSteps, lastError, step, job.model);
|
|
91
|
+
if (!command) {
|
|
92
|
+
throw new Error('LLM failed to generate a Playwright command.');
|
|
93
|
+
}
|
|
94
|
+
step.playwrightCommand = command;
|
|
95
|
+
currentAttemptCommand = command;
|
|
96
|
+
this.log(` Command: ${command}`);
|
|
97
|
+
// Execute the command
|
|
98
|
+
await this.executePlaywrightCommand(page, browser, context, command);
|
|
99
|
+
stepSuccess = true;
|
|
100
|
+
currentAttemptSuccess = true;
|
|
101
|
+
stepOutput = `Executed: ${command}`;
|
|
102
|
+
stepError = undefined;
|
|
103
|
+
this.log(` ✅ SUCCESS: ${command}`);
|
|
104
|
+
break; // Step successful, move to next scenario step
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
stepError = error instanceof Error ? error.message : String(error);
|
|
108
|
+
currentAttemptError = stepError;
|
|
109
|
+
console.error(` ❌ FAILED (attempt ${attempt + 1}): ${stepError}`);
|
|
110
|
+
console.error(` Command attempted: ${currentAttemptCommand || 'N/A'}`);
|
|
111
|
+
step.retryCount++;
|
|
112
|
+
// Only update lastError if this is the final attempt
|
|
113
|
+
if (attempt === MAX_RETRIES_PER_STEP) {
|
|
114
|
+
lastError = stepError;
|
|
115
|
+
}
|
|
116
|
+
// If this is the last attempt, mark as failed and move on
|
|
117
|
+
if (attempt === MAX_RETRIES_PER_STEP) {
|
|
118
|
+
stepSuccess = false;
|
|
119
|
+
stepOutput = `Failed after ${MAX_RETRIES_PER_STEP + 1} attempts.`;
|
|
120
|
+
overallSuccess = false;
|
|
121
|
+
console.error(` 🚫 STEP FAILED after ${MAX_RETRIES_PER_STEP + 1} attempts`);
|
|
122
|
+
break; // Exit retry loop
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
finally {
|
|
126
|
+
if (!step.attempts) {
|
|
127
|
+
step.attempts = [];
|
|
128
|
+
}
|
|
129
|
+
step.attempts.push({
|
|
130
|
+
attemptNumber: attempt + 1,
|
|
131
|
+
command: currentAttemptCommand,
|
|
132
|
+
success: currentAttemptSuccess,
|
|
133
|
+
error: currentAttemptError,
|
|
134
|
+
timestamp: attemptTimestamp
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
step.success = stepSuccess;
|
|
139
|
+
step.error = stepError;
|
|
140
|
+
previousSteps.push(step);
|
|
141
|
+
}
|
|
142
|
+
// Generate test name if not provided
|
|
143
|
+
const testName = job.testName || await this.llmFacade.generateTestName(job.scenario, job.model);
|
|
144
|
+
// Generate preferred filename
|
|
145
|
+
let preferredFileName;
|
|
146
|
+
if (testName && testName !== 'test') {
|
|
147
|
+
// Use the generated test name
|
|
148
|
+
const sanitizedName = testName
|
|
149
|
+
.replace(/[^a-zA-Z0-9\s-_]/g, '') // Remove special characters except spaces, hyphens, underscores
|
|
150
|
+
.replace(/\s+/g, '_') // Replace spaces with underscores
|
|
151
|
+
.replace(/_+/g, '_') // Replace multiple underscores with single underscore
|
|
152
|
+
.replace(/^_|_$/g, '') // Remove leading/trailing underscores
|
|
153
|
+
.toLowerCase();
|
|
154
|
+
preferredFileName = `${sanitizedName}.spec.js`;
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
// Use scenario file name if no meaningful test name was generated
|
|
158
|
+
const scenarioFileName = job.scenarioFileName || 'scenario';
|
|
159
|
+
const baseName = scenarioFileName.replace(/\.[^/.]+$/, ''); // Remove extension
|
|
160
|
+
const sanitizedName = baseName
|
|
161
|
+
.replace(/[^a-zA-Z0-9\s-_]/g, '') // Remove special characters except spaces, hyphens, underscores
|
|
162
|
+
.replace(/\s+/g, '_') // Replace spaces with underscores
|
|
163
|
+
.replace(/_+/g, '_') // Replace multiple underscores with single underscore
|
|
164
|
+
.replace(/^_|_$/g, '') // Remove leading/trailing underscores
|
|
165
|
+
.toLowerCase();
|
|
166
|
+
preferredFileName = `${sanitizedName}.spec.js`;
|
|
167
|
+
}
|
|
168
|
+
// Generate clean script with TestChimp comment and code
|
|
169
|
+
generatedScript = (0, script_utils_1.generateTestScript)(testName, steps);
|
|
170
|
+
// Generate detailed execution log
|
|
171
|
+
const logLines = [];
|
|
172
|
+
logLines.push(`# Scenario Execution Log`);
|
|
173
|
+
logLines.push(`Job ID: ${job.id}`);
|
|
174
|
+
logLines.push(`Scenario: ${job.scenario}`);
|
|
175
|
+
logLines.push(`Start Time: ${new Date(startTime).toISOString()}`);
|
|
176
|
+
logLines.push(`End Time: ${new Date().toISOString()}`);
|
|
177
|
+
logLines.push(`Total Execution Time: ${Date.now() - startTime}ms`);
|
|
178
|
+
logLines.push(`Overall Success: ${overallSuccess ? 'YES' : 'NO'}`);
|
|
179
|
+
logLines.push(``);
|
|
180
|
+
for (const step of steps) {
|
|
181
|
+
logLines.push(`## Step ${step.stepNumber}: ${step.description}`);
|
|
182
|
+
logLines.push(`Status: ${step.success ? 'SUCCESS' : 'FAILED'}`);
|
|
183
|
+
logLines.push(`Retry Count: ${step.retryCount || 0}`);
|
|
184
|
+
if (step.playwrightCommand) {
|
|
185
|
+
logLines.push(`Final Command: ${step.playwrightCommand}`);
|
|
186
|
+
}
|
|
187
|
+
if (step.error) {
|
|
188
|
+
logLines.push(`Final Error: ${step.error}`);
|
|
189
|
+
}
|
|
190
|
+
if (step.attempts && step.attempts.length > 0) {
|
|
191
|
+
logLines.push(`### Attempts:`);
|
|
192
|
+
for (const attempt of step.attempts) {
|
|
193
|
+
logLines.push(`- Attempt ${attempt.attemptNumber}:`);
|
|
194
|
+
logLines.push(` Command: ${attempt.command || 'N/A'}`);
|
|
195
|
+
logLines.push(` Success: ${attempt.success ? 'YES' : 'NO'}`);
|
|
196
|
+
if (attempt.error) {
|
|
197
|
+
logLines.push(` Error: ${attempt.error}`);
|
|
198
|
+
}
|
|
199
|
+
logLines.push(` Timestamp: ${new Date(attempt.timestamp).toISOString()}`);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
logLines.push(``);
|
|
203
|
+
}
|
|
204
|
+
const executionLog = logLines.join('\n');
|
|
205
|
+
return {
|
|
206
|
+
success: overallSuccess,
|
|
207
|
+
steps,
|
|
208
|
+
generatedScript,
|
|
209
|
+
executionLog,
|
|
210
|
+
executionTime: Date.now() - startTime,
|
|
211
|
+
testName,
|
|
212
|
+
preferredFileName
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
catch (error) {
|
|
216
|
+
overallSuccess = false;
|
|
217
|
+
console.error('Overall scenario processing error:', error);
|
|
218
|
+
return {
|
|
219
|
+
success: false,
|
|
220
|
+
steps,
|
|
221
|
+
generatedScript,
|
|
222
|
+
executionLog: `# Scenario Execution Log\nJob ID: ${job.id}\nScenario: ${job.scenario}\nError: ${error instanceof Error ? error.message : 'Unknown error during scenario processing'}`,
|
|
223
|
+
executionTime: Date.now() - startTime,
|
|
224
|
+
testName: job.testName || 'test',
|
|
225
|
+
preferredFileName: 'test.spec.js',
|
|
226
|
+
error: error instanceof Error ? error.message : 'Unknown error during scenario processing'
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
finally {
|
|
230
|
+
if (browser) {
|
|
231
|
+
await browser.close();
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
async executePlaywrightCommand(page, browser, context, command) {
|
|
236
|
+
// Set reasonable timeouts
|
|
237
|
+
page.setDefaultTimeout(5000); // 5 seconds
|
|
238
|
+
try {
|
|
239
|
+
// Execute command directly without validation
|
|
240
|
+
const commandFunction = new Function('page', 'browser', 'context', 'expect', `
|
|
241
|
+
return (async () => {
|
|
242
|
+
try {
|
|
243
|
+
${command}
|
|
244
|
+
} catch (error) {
|
|
245
|
+
console.error('Command execution error:', error);
|
|
246
|
+
throw error;
|
|
247
|
+
}
|
|
248
|
+
})();
|
|
249
|
+
`);
|
|
250
|
+
await commandFunction(page, browser, context, require('@playwright/test').expect);
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
// Reset to default timeout
|
|
254
|
+
page.setDefaultTimeout(10000); // Reset to default 10 seconds
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
async cleanup() {
|
|
258
|
+
this.initialized = false;
|
|
259
|
+
this.sessionId = null;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
exports.ScenarioWorker = ScenarioWorker;
|
|
263
|
+
//# sourceMappingURL=scenario-worker-class.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scenario-worker-class.js","sourceRoot":"","sources":["../src/scenario-worker-class.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script Generation Utilities
|
|
3
|
+
*
|
|
4
|
+
* This module provides utilities for generating and formatting test scripts
|
|
5
|
+
* with TestChimp-specific markers and comments.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* TestChimp managed test comment that should be added to all generated scripts
|
|
9
|
+
*/
|
|
10
|
+
export declare const TESTCHIMP_MANAGED_COMMENT = "/*\n\nThis is a TestChimp Managed Test.\n\n*/";
|
|
11
|
+
/**
|
|
12
|
+
* Generates TestChimp managed test comment with optional repair advice
|
|
13
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
14
|
+
* @returns The complete comment block
|
|
15
|
+
*/
|
|
16
|
+
export declare function generateTestChimpComment(repairAdvice?: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* Adds the TestChimp managed test comment to the beginning of a script
|
|
19
|
+
* @param script The original script content
|
|
20
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
21
|
+
* @returns The script with TestChimp comment prepended
|
|
22
|
+
*/
|
|
23
|
+
export declare function addTestChimpComment(script: string, repairAdvice?: string): string;
|
|
24
|
+
/**
|
|
25
|
+
* Generates a complete test script with TestChimp comment, imports, and test structure
|
|
26
|
+
* @param testName The name of the test
|
|
27
|
+
* @param steps Array of test steps with descriptions and commands
|
|
28
|
+
* @param includeTestChimpComment Whether to include the TestChimp managed test comment
|
|
29
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
30
|
+
* @returns The complete test script
|
|
31
|
+
*/
|
|
32
|
+
export declare function generateTestScript(testName: string, steps: Array<{
|
|
33
|
+
stepNumber: number;
|
|
34
|
+
description: string;
|
|
35
|
+
playwrightCommand?: string;
|
|
36
|
+
success?: boolean;
|
|
37
|
+
}>, includeTestChimpComment?: boolean, repairAdvice?: string): string;
|
|
38
|
+
/**
|
|
39
|
+
* Checks if a script is a TestChimp managed test
|
|
40
|
+
* @param script The script content to check
|
|
41
|
+
* @returns True if the script contains the TestChimp managed test comment
|
|
42
|
+
*/
|
|
43
|
+
export declare function isTestChimpManagedTest(script: string): boolean;
|
|
44
|
+
//# sourceMappingURL=script-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-utils.d.ts","sourceRoot":"","sources":["../src/script-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,eAAO,MAAM,yBAAyB,kDAInC,CAAC;AAEJ;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAYtE;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,CAejF;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,KAAK,CAAC;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,EACxG,uBAAuB,GAAE,OAAc,EACvC,YAAY,CAAC,EAAE,MAAM,GACpB,MAAM,CA4BR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Script Generation Utilities
|
|
4
|
+
*
|
|
5
|
+
* This module provides utilities for generating and formatting test scripts
|
|
6
|
+
* with TestChimp-specific markers and comments.
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.TESTCHIMP_MANAGED_COMMENT = void 0;
|
|
10
|
+
exports.generateTestChimpComment = generateTestChimpComment;
|
|
11
|
+
exports.addTestChimpComment = addTestChimpComment;
|
|
12
|
+
exports.generateTestScript = generateTestScript;
|
|
13
|
+
exports.isTestChimpManagedTest = isTestChimpManagedTest;
|
|
14
|
+
/**
|
|
15
|
+
* TestChimp managed test comment that should be added to all generated scripts
|
|
16
|
+
*/
|
|
17
|
+
exports.TESTCHIMP_MANAGED_COMMENT = `/*
|
|
18
|
+
|
|
19
|
+
This is a TestChimp Managed Test.
|
|
20
|
+
|
|
21
|
+
*/`;
|
|
22
|
+
/**
|
|
23
|
+
* Generates TestChimp managed test comment with optional repair advice
|
|
24
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
25
|
+
* @returns The complete comment block
|
|
26
|
+
*/
|
|
27
|
+
function generateTestChimpComment(repairAdvice) {
|
|
28
|
+
if (repairAdvice) {
|
|
29
|
+
return `/*
|
|
30
|
+
|
|
31
|
+
This is a TestChimp Managed Test.
|
|
32
|
+
|
|
33
|
+
Repair Advice:
|
|
34
|
+
${repairAdvice}
|
|
35
|
+
|
|
36
|
+
*/`;
|
|
37
|
+
}
|
|
38
|
+
return exports.TESTCHIMP_MANAGED_COMMENT;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Adds the TestChimp managed test comment to the beginning of a script
|
|
42
|
+
* @param script The original script content
|
|
43
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
44
|
+
* @returns The script with TestChimp comment prepended
|
|
45
|
+
*/
|
|
46
|
+
function addTestChimpComment(script, repairAdvice) {
|
|
47
|
+
// If the script already has the TestChimp comment, update it with repair advice if provided
|
|
48
|
+
if (script.includes('This is a TestChimp Managed Test')) {
|
|
49
|
+
if (repairAdvice) {
|
|
50
|
+
// Replace existing comment with new one that includes repair advice
|
|
51
|
+
const commentRegex = /\/\*[\s\S]*?This is a TestChimp Managed Test\.[\s\S]*?\*\//;
|
|
52
|
+
const newComment = generateTestChimpComment(repairAdvice);
|
|
53
|
+
return script.replace(commentRegex, newComment);
|
|
54
|
+
}
|
|
55
|
+
return script;
|
|
56
|
+
}
|
|
57
|
+
// Add the comment at the beginning of the script
|
|
58
|
+
const comment = generateTestChimpComment(repairAdvice);
|
|
59
|
+
return `${comment}\n\n${script}`;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generates a complete test script with TestChimp comment, imports, and test structure
|
|
63
|
+
* @param testName The name of the test
|
|
64
|
+
* @param steps Array of test steps with descriptions and commands
|
|
65
|
+
* @param includeTestChimpComment Whether to include the TestChimp managed test comment
|
|
66
|
+
* @param repairAdvice Optional repair advice to include in the comment
|
|
67
|
+
* @returns The complete test script
|
|
68
|
+
*/
|
|
69
|
+
function generateTestScript(testName, steps, includeTestChimpComment = true, repairAdvice) {
|
|
70
|
+
const scriptLines = [];
|
|
71
|
+
// Add TestChimp comment if requested
|
|
72
|
+
if (includeTestChimpComment) {
|
|
73
|
+
const comment = generateTestChimpComment(repairAdvice);
|
|
74
|
+
scriptLines.push(comment);
|
|
75
|
+
scriptLines.push('');
|
|
76
|
+
}
|
|
77
|
+
// Add imports
|
|
78
|
+
scriptLines.push(`import { test, expect } from '@playwright/test';`);
|
|
79
|
+
// Add test structure
|
|
80
|
+
scriptLines.push(`test('${testName.replace(/'/g, "\\'")}', async ({ page, browser, context }) => {`);
|
|
81
|
+
// Add steps
|
|
82
|
+
for (const step of steps) {
|
|
83
|
+
const status = step.success === false ? ' [FAILED]' : '';
|
|
84
|
+
scriptLines.push(` // Step ${step.stepNumber}: ${step.description}${status}`);
|
|
85
|
+
if (step.playwrightCommand && step.success !== false) {
|
|
86
|
+
scriptLines.push(` ${step.playwrightCommand}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
scriptLines.push(`});`);
|
|
90
|
+
return scriptLines.join('\n');
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Checks if a script is a TestChimp managed test
|
|
94
|
+
* @param script The script content to check
|
|
95
|
+
* @returns True if the script contains the TestChimp managed test comment
|
|
96
|
+
*/
|
|
97
|
+
function isTestChimpManagedTest(script) {
|
|
98
|
+
return script.includes('This is a TestChimp Managed Test');
|
|
99
|
+
}
|
|
100
|
+
//# sourceMappingURL=script-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-utils.js","sourceRoot":"","sources":["../src/script-utils.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAgBH,4DAYC;AAQD,kDAeC;AAUD,gDAiCC;AAOD,wDAEC;AArGD;;GAEG;AACU,QAAA,yBAAyB,GAAG;;;;GAItC,CAAC;AAEJ;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,YAAqB;IAC5D,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;;;;;EAKT,YAAY;;GAEX,CAAC;IACF,CAAC;IACD,OAAO,iCAAyB,CAAC;AACnC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,mBAAmB,CAAC,MAAc,EAAE,YAAqB;IACvE,4FAA4F;IAC5F,IAAI,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,EAAE,CAAC;QACxD,IAAI,YAAY,EAAE,CAAC;YACjB,oEAAoE;YACpE,MAAM,YAAY,GAAG,4DAA4D,CAAC;YAClF,MAAM,UAAU,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,OAAO,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAClD,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,iDAAiD;IACjD,MAAM,OAAO,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;IACvD,OAAO,GAAG,OAAO,OAAO,MAAM,EAAE,CAAC;AACnC,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,kBAAkB,CAChC,QAAgB,EAChB,KAAwG,EACxG,0BAAmC,IAAI,EACvC,YAAqB;IAErB,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,qCAAqC;IACrC,IAAI,uBAAuB,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,wBAAwB,CAAC,YAAY,CAAC,CAAC;QACvD,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1B,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,CAAC;IAED,cAAc;IACd,WAAW,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAErE,qBAAqB;IACrB,WAAW,CAAC,IAAI,CAAC,SAAS,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAErG,YAAY;IACZ,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,WAAW,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC,CAAC;QAC/E,IAAI,IAAI,CAAC,iBAAiB,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;YACrD,WAAW,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC;IAED,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAExB,OAAO,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,SAAgB,sBAAsB,CAAC,MAAc;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,kCAAkC,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Playwright MCP configuration - JavaScript config file content (playwright.config.js)
|
|
3
|
+
*/
|
|
4
|
+
export type PlaywrightConfig = string;
|
|
5
|
+
/**
|
|
6
|
+
* Request structure for the Playwright script executor
|
|
7
|
+
*/
|
|
8
|
+
export interface PlaywrightExecutionRequest {
|
|
9
|
+
/** Main Playwright script content */
|
|
10
|
+
script: string;
|
|
11
|
+
/** Optional pre-script to run before the main script */
|
|
12
|
+
prescript?: string;
|
|
13
|
+
/** Optional post-script to run after the main script */
|
|
14
|
+
postscript?: string;
|
|
15
|
+
/** Playwright configuration file content */
|
|
16
|
+
playwrightConfig: string;
|
|
17
|
+
/** Optional GPT model to use for AI operations */
|
|
18
|
+
model?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Response structure for the Playwright script executor
|
|
22
|
+
*/
|
|
23
|
+
export interface PlaywrightExecutionResponse {
|
|
24
|
+
/** Whether the execution was successful */
|
|
25
|
+
success: boolean;
|
|
26
|
+
/** Execution results from each script phase */
|
|
27
|
+
results: {
|
|
28
|
+
prescript?: ScriptResult;
|
|
29
|
+
script: ScriptResult;
|
|
30
|
+
postscript?: ScriptResult;
|
|
31
|
+
};
|
|
32
|
+
/** Overall execution time in milliseconds */
|
|
33
|
+
executionTime: number;
|
|
34
|
+
/** Any errors that occurred during execution */
|
|
35
|
+
error?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Individual script execution result
|
|
39
|
+
*/
|
|
40
|
+
export interface ScriptResult {
|
|
41
|
+
/** Whether this specific script executed successfully */
|
|
42
|
+
success: boolean;
|
|
43
|
+
/** Output from the script execution */
|
|
44
|
+
output: string;
|
|
45
|
+
/** Any errors from this script */
|
|
46
|
+
error?: string;
|
|
47
|
+
/** Execution time for this script in milliseconds */
|
|
48
|
+
executionTime: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Scenario execution request
|
|
52
|
+
*/
|
|
53
|
+
export interface ScenarioRequest {
|
|
54
|
+
scenario: string;
|
|
55
|
+
testName?: string;
|
|
56
|
+
playwrightConfig?: PlaywrightConfig;
|
|
57
|
+
model?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Scenario execution job for worker queue
|
|
61
|
+
*/
|
|
62
|
+
export interface ScenarioRunJob {
|
|
63
|
+
id: string;
|
|
64
|
+
scenario: string;
|
|
65
|
+
testName?: string;
|
|
66
|
+
playwrightConfig?: PlaywrightConfig;
|
|
67
|
+
model?: string;
|
|
68
|
+
scenarioFileName?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Scenario execution response
|
|
72
|
+
*/
|
|
73
|
+
export interface ScenarioResponse {
|
|
74
|
+
success: boolean;
|
|
75
|
+
steps: ScenarioStep[];
|
|
76
|
+
generatedScript: string;
|
|
77
|
+
executionLog: string;
|
|
78
|
+
executionTime: number;
|
|
79
|
+
testName?: string;
|
|
80
|
+
preferredFileName?: string;
|
|
81
|
+
error?: string;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Individual scenario step
|
|
85
|
+
*/
|
|
86
|
+
export interface ScenarioStep {
|
|
87
|
+
stepNumber: number;
|
|
88
|
+
description: string;
|
|
89
|
+
playwrightCommand?: string;
|
|
90
|
+
success?: boolean;
|
|
91
|
+
error?: string;
|
|
92
|
+
retryCount?: number;
|
|
93
|
+
attempts?: Array<{
|
|
94
|
+
attemptNumber: number;
|
|
95
|
+
command?: string;
|
|
96
|
+
success: boolean;
|
|
97
|
+
error?: string;
|
|
98
|
+
timestamp: number;
|
|
99
|
+
}>;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Legacy scenario job interface (for backward compatibility)
|
|
103
|
+
*/
|
|
104
|
+
export interface ScenarioJob {
|
|
105
|
+
id: string;
|
|
106
|
+
scenario: string;
|
|
107
|
+
config?: PlaywrightConfig;
|
|
108
|
+
resolve: (result: ScenarioResponse) => void;
|
|
109
|
+
reject: (error: Error) => void;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Execution mode for script execution
|
|
113
|
+
*/
|
|
114
|
+
export declare enum ExecutionMode {
|
|
115
|
+
RUN_EXACTLY = "RUN_EXACTLY",
|
|
116
|
+
RUN_WITH_AI_REPAIR = "RUN_WITH_AI_REPAIR"
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Script execution request with AI repair capabilities
|
|
120
|
+
*/
|
|
121
|
+
export interface ScriptExecutionRequest {
|
|
122
|
+
script?: string;
|
|
123
|
+
scriptFilePath?: string;
|
|
124
|
+
mode: ExecutionMode;
|
|
125
|
+
repair_flexibility?: number;
|
|
126
|
+
playwrightConfig?: PlaywrightConfig;
|
|
127
|
+
playwrightConfigFilePath?: string;
|
|
128
|
+
model?: string;
|
|
129
|
+
headless?: boolean;
|
|
130
|
+
deflake_run_count?: number;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Script execution response with repair information
|
|
134
|
+
*/
|
|
135
|
+
export interface ScriptExecutionResponse {
|
|
136
|
+
run_status: 'success' | 'failed';
|
|
137
|
+
repair_status?: 'success' | 'failed' | 'partial';
|
|
138
|
+
repair_confidence?: number;
|
|
139
|
+
repair_advice?: string;
|
|
140
|
+
updated_script?: string;
|
|
141
|
+
executionTime: number;
|
|
142
|
+
num_deflake_runs?: number;
|
|
143
|
+
error?: string;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Individual script step for AI repair
|
|
147
|
+
*/
|
|
148
|
+
export interface ScriptStep {
|
|
149
|
+
description: string;
|
|
150
|
+
code: string;
|
|
151
|
+
success?: boolean;
|
|
152
|
+
error?: string;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Step operation types for AI repair
|
|
156
|
+
*/
|
|
157
|
+
export declare enum StepOperation {
|
|
158
|
+
MODIFY = "MODIFY",
|
|
159
|
+
INSERT = "INSERT",
|
|
160
|
+
REMOVE = "REMOVE"
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Step repair action
|
|
164
|
+
*/
|
|
165
|
+
export interface StepRepairAction {
|
|
166
|
+
operation: StepOperation;
|
|
167
|
+
stepIndex?: number;
|
|
168
|
+
newStep?: ScriptStep;
|
|
169
|
+
insertAfterIndex?: number;
|
|
170
|
+
}
|
|
171
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC;AAMtC;;GAEG;AACH,MAAM,WAAW,0BAA0B;IACzC,qCAAqC;IACrC,MAAM,EAAE,MAAM,CAAC;IACf,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,4CAA4C;IAC5C,gBAAgB,EAAE,MAAM,CAAC;IACzB,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,2BAA2B;IAC1C,2CAA2C;IAC3C,OAAO,EAAE,OAAO,CAAC;IACjB,+CAA+C;IAC/C,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,YAAY,CAAC;QACzB,MAAM,EAAE,YAAY,CAAC;QACrB,UAAU,CAAC,EAAE,YAAY,CAAC;KAC3B,CAAC;IACF,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,yDAAyD;IACzD,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,MAAM,EAAE,MAAM,CAAC;IACf,kCAAkC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,aAAa,EAAE,MAAM,CAAC;CACvB;AAMD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,EAAE,YAAY,EAAE,CAAC;IACtB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,KAAK,CAAC;QACf,aAAa,EAAE,MAAM,CAAC;QACtB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,EAAE,OAAO,CAAC;QACjB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B,OAAO,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAChC;AAMD;;GAEG;AACH,oBAAY,aAAa;IACvB,WAAW,gBAAgB;IAC3B,kBAAkB,uBAAuB;CAC1C;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,SAAS,GAAG,QAAQ,CAAC;IACjC,aAAa,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,SAAS,CAAC;IACjD,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,MAAM,WAAW;IACjB,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,aAAa,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================================
|
|
3
|
+
// CORE TYPES
|
|
4
|
+
// ============================================================================
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.StepOperation = exports.ExecutionMode = void 0;
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// AI REPAIR TYPES
|
|
9
|
+
// ============================================================================
|
|
10
|
+
/**
|
|
11
|
+
* Execution mode for script execution
|
|
12
|
+
*/
|
|
13
|
+
var ExecutionMode;
|
|
14
|
+
(function (ExecutionMode) {
|
|
15
|
+
ExecutionMode["RUN_EXACTLY"] = "RUN_EXACTLY";
|
|
16
|
+
ExecutionMode["RUN_WITH_AI_REPAIR"] = "RUN_WITH_AI_REPAIR";
|
|
17
|
+
})(ExecutionMode || (exports.ExecutionMode = ExecutionMode = {}));
|
|
18
|
+
/**
|
|
19
|
+
* Step operation types for AI repair
|
|
20
|
+
*/
|
|
21
|
+
var StepOperation;
|
|
22
|
+
(function (StepOperation) {
|
|
23
|
+
StepOperation["MODIFY"] = "MODIFY";
|
|
24
|
+
StepOperation["INSERT"] = "INSERT";
|
|
25
|
+
StepOperation["REMOVE"] = "REMOVE";
|
|
26
|
+
})(StepOperation || (exports.StepOperation = StepOperation = {}));
|
|
27
|
+
// Repair suggestion and confidence interfaces are now in llm-facade.ts
|
|
28
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;;;AAiI/E,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,IAAY,aAGX;AAHD,WAAY,aAAa;IACvB,4CAA2B,CAAA;IAC3B,0DAAyC,CAAA;AAC3C,CAAC,EAHW,aAAa,6BAAb,aAAa,QAGxB;AAyCD;;GAEG;AACH,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,kCAAiB,CAAA;IACjB,kCAAiB,CAAA;IACjB,kCAAiB,CAAA;AACnB,CAAC,EAJW,aAAa,6BAAb,aAAa,QAIxB;AAYD,uEAAuE"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Browser, BrowserContext, Page } from 'playwright';
|
|
2
|
+
/**
|
|
3
|
+
* Initialize browser with Playwright configuration
|
|
4
|
+
* @param playwrightConfig - JavaScript config file content (playwright.config.js)
|
|
5
|
+
* @param headless - Override headless mode (optional)
|
|
6
|
+
* @returns Browser, context, and page instances
|
|
7
|
+
*/
|
|
8
|
+
export declare function initializeBrowser(playwrightConfigContent?: string, headless?: boolean, playwrightConfigFilePath?: string): Promise<{
|
|
9
|
+
browser: Browser;
|
|
10
|
+
context: BrowserContext;
|
|
11
|
+
page: Page;
|
|
12
|
+
}>;
|
|
13
|
+
//# sourceMappingURL=browser-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-utils.d.ts","sourceRoot":"","sources":["../../src/utils/browser-utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,YAAY,CAAC;AAMtF;;;;;GAKG;AACH,wBAAsB,iBAAiB,CACrC,uBAAuB,CAAC,EAAE,MAAM,EAChC,QAAQ,CAAC,EAAE,OAAO,EAClB,wBAAwB,CAAC,EAAE,MAAM,GAChC,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAE,CAAC,CA+PpE"}
|