testchimp-runner-core 0.0.11 → 0.0.13
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/credit-usage-service.d.ts +40 -0
- package/dist/credit-usage-service.d.ts.map +1 -0
- package/dist/credit-usage-service.js +99 -0
- package/dist/credit-usage-service.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +14 -2
- package/dist/index.js.map +1 -1
- package/dist/scenario-service.d.ts +1 -0
- package/dist/scenario-service.d.ts.map +1 -1
- package/dist/scenario-service.js +8 -0
- package/dist/scenario-service.js.map +1 -1
- package/package.json +2 -4
- package/src/credit-usage-service.ts +115 -0
- package/src/index.ts +16 -2
- package/src/scenario-service.ts +10 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { AuthConfig } from './auth-config';
|
|
2
|
+
export declare enum CreditUsageReason {
|
|
3
|
+
UNKNOWN_CREDIT_USAGE_REASON = 0,
|
|
4
|
+
EXPLORER_STEP = 1,
|
|
5
|
+
TEST_REPAIR = 2,
|
|
6
|
+
SCRIPT_GENERATE = 3
|
|
7
|
+
}
|
|
8
|
+
export interface InsertCreditUsageRequest {
|
|
9
|
+
credits?: number;
|
|
10
|
+
usage_reason?: CreditUsageReason;
|
|
11
|
+
job_id?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface InsertCreditUsageResponse {
|
|
14
|
+
}
|
|
15
|
+
export declare class CreditUsageService {
|
|
16
|
+
private backendUrl;
|
|
17
|
+
private authConfig;
|
|
18
|
+
constructor(authConfig?: AuthConfig, backendUrl?: string);
|
|
19
|
+
/**
|
|
20
|
+
* Update authentication configuration
|
|
21
|
+
*/
|
|
22
|
+
setAuthConfig(authConfig: AuthConfig): void;
|
|
23
|
+
/**
|
|
24
|
+
* Get current authentication configuration
|
|
25
|
+
*/
|
|
26
|
+
getAuthConfig(): AuthConfig | null;
|
|
27
|
+
/**
|
|
28
|
+
* Report credit usage to the backend
|
|
29
|
+
*/
|
|
30
|
+
reportCreditUsage(credits: number | undefined, usageReason: CreditUsageReason, jobId?: string): Promise<InsertCreditUsageResponse>;
|
|
31
|
+
/**
|
|
32
|
+
* Report script generation credit usage
|
|
33
|
+
*/
|
|
34
|
+
reportScriptGenerationCredit(jobId?: string): Promise<void>;
|
|
35
|
+
/**
|
|
36
|
+
* Report AI repair credit usage
|
|
37
|
+
*/
|
|
38
|
+
reportAIRepairCredit(jobId?: string): Promise<void>;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=credit-usage-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-usage-service.d.ts","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAkB,MAAM,eAAe,CAAC;AAE3D,oBAAY,iBAAiB;IAC3B,2BAA2B,IAAI;IAC/B,aAAa,IAAI;IACjB,WAAW,IAAI;IACf,eAAe,IAAI;CACpB;AAED,MAAM,WAAW,wBAAwB;IACvC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,iBAAiB,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,yBAAyB;CAEzC;AAED,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAoB;gBAE1B,UAAU,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM;IAcxD;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAI3C;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAIlC;;OAEG;IACG,iBAAiB,CACrB,OAAO,EAAE,MAAM,YAAI,EACnB,WAAW,EAAE,iBAAiB,EAC9B,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,yBAAyB,CAAC;IA8BrC;;OAEG;IACG,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUjE;;OAEG;IACG,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAS1D"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.CreditUsageService = exports.CreditUsageReason = void 0;
|
|
7
|
+
const axios_1 = __importDefault(require("axios"));
|
|
8
|
+
const auth_config_1 = require("./auth-config");
|
|
9
|
+
var CreditUsageReason;
|
|
10
|
+
(function (CreditUsageReason) {
|
|
11
|
+
CreditUsageReason[CreditUsageReason["UNKNOWN_CREDIT_USAGE_REASON"] = 0] = "UNKNOWN_CREDIT_USAGE_REASON";
|
|
12
|
+
CreditUsageReason[CreditUsageReason["EXPLORER_STEP"] = 1] = "EXPLORER_STEP";
|
|
13
|
+
CreditUsageReason[CreditUsageReason["TEST_REPAIR"] = 2] = "TEST_REPAIR";
|
|
14
|
+
CreditUsageReason[CreditUsageReason["SCRIPT_GENERATE"] = 3] = "SCRIPT_GENERATE";
|
|
15
|
+
})(CreditUsageReason || (exports.CreditUsageReason = CreditUsageReason = {}));
|
|
16
|
+
class CreditUsageService {
|
|
17
|
+
constructor(authConfig, backendUrl) {
|
|
18
|
+
// Use provided backend URL or fall back to environment configuration
|
|
19
|
+
if (backendUrl) {
|
|
20
|
+
this.backendUrl = backendUrl;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Fall back to environment configuration for backward compatibility
|
|
24
|
+
const { loadEnvConfig } = require('./env-config');
|
|
25
|
+
const envConfig = loadEnvConfig();
|
|
26
|
+
this.backendUrl = envConfig.TESTCHIMP_BACKEND_URL;
|
|
27
|
+
}
|
|
28
|
+
this.authConfig = authConfig || null;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Update authentication configuration
|
|
32
|
+
*/
|
|
33
|
+
setAuthConfig(authConfig) {
|
|
34
|
+
this.authConfig = authConfig;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Get current authentication configuration
|
|
38
|
+
*/
|
|
39
|
+
getAuthConfig() {
|
|
40
|
+
return this.authConfig;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Report credit usage to the backend
|
|
44
|
+
*/
|
|
45
|
+
async reportCreditUsage(credits = 1, usageReason, jobId) {
|
|
46
|
+
if (!this.authConfig) {
|
|
47
|
+
throw new Error('Authentication not configured. Please set authentication credentials.');
|
|
48
|
+
}
|
|
49
|
+
try {
|
|
50
|
+
const authHeaders = (0, auth_config_1.getAuthHeaders)(this.authConfig);
|
|
51
|
+
const url = `${this.backendUrl}/localagent/insert_credit_usage`;
|
|
52
|
+
const request = {
|
|
53
|
+
credits,
|
|
54
|
+
usage_reason: usageReason,
|
|
55
|
+
job_id: jobId
|
|
56
|
+
};
|
|
57
|
+
const response = await axios_1.default.post(url, request, {
|
|
58
|
+
headers: {
|
|
59
|
+
...authHeaders,
|
|
60
|
+
'Content-Type': 'application/json'
|
|
61
|
+
},
|
|
62
|
+
timeout: 10000 // 10 second timeout for credit usage calls
|
|
63
|
+
});
|
|
64
|
+
return response.data;
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
console.error('Credit usage report failed:', error);
|
|
68
|
+
throw new Error(`Credit usage report failed: ${error.message}`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Report script generation credit usage
|
|
73
|
+
*/
|
|
74
|
+
async reportScriptGenerationCredit(jobId) {
|
|
75
|
+
try {
|
|
76
|
+
await this.reportCreditUsage(1, CreditUsageReason.SCRIPT_GENERATE, jobId);
|
|
77
|
+
console.log(`Credit usage reported for script generation${jobId ? ` (job: ${jobId})` : ''}`);
|
|
78
|
+
}
|
|
79
|
+
catch (error) {
|
|
80
|
+
console.error('Failed to report script generation credit usage:', error);
|
|
81
|
+
// Don't throw - credit reporting should not break the main flow
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Report AI repair credit usage
|
|
86
|
+
*/
|
|
87
|
+
async reportAIRepairCredit(jobId) {
|
|
88
|
+
try {
|
|
89
|
+
await this.reportCreditUsage(1, CreditUsageReason.TEST_REPAIR, jobId);
|
|
90
|
+
console.log(`Credit usage reported for AI repair${jobId ? ` (job: ${jobId})` : ''}`);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error('Failed to report AI repair credit usage:', error);
|
|
94
|
+
// Don't throw - credit reporting should not break the main flow
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
exports.CreditUsageService = CreditUsageService;
|
|
99
|
+
//# sourceMappingURL=credit-usage-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"credit-usage-service.js","sourceRoot":"","sources":["../src/credit-usage-service.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ import { ScenarioWorker } from './scenario-worker-class';
|
|
|
8
8
|
import { PlaywrightMCPService } from './playwright-mcp-service';
|
|
9
9
|
import { LLMFacade } from './llm-facade';
|
|
10
10
|
import { AuthConfig } from './auth-config';
|
|
11
|
-
|
|
11
|
+
import { CreditUsageService } from './credit-usage-service';
|
|
12
|
+
export { ExecutionService, ScenarioService, ScenarioWorker, PlaywrightMCPService, LLMFacade, CreditUsageService };
|
|
12
13
|
import { FileHandler, LocalFileHandler, CIFileHandler, NoOpFileHandler } from './file-handler';
|
|
13
14
|
export { FileHandler, LocalFileHandler, CIFileHandler, NoOpFileHandler };
|
|
14
15
|
export * from './types';
|
|
@@ -20,6 +21,7 @@ export declare class TestChimpService {
|
|
|
20
21
|
scenarioService: ScenarioService;
|
|
21
22
|
private playwrightService;
|
|
22
23
|
private llmFacade;
|
|
24
|
+
private creditUsageService;
|
|
23
25
|
private fileHandler;
|
|
24
26
|
private authConfig;
|
|
25
27
|
private backendUrl;
|
|
@@ -41,6 +43,8 @@ export declare class TestChimpService {
|
|
|
41
43
|
generateScript(scenario: string, testName?: string, config?: string, model?: string, scenarioFileName?: string): Promise<string>;
|
|
42
44
|
executeScript(request: any): Promise<any>;
|
|
43
45
|
executeScriptWithAIRepair(request: any): Promise<any>;
|
|
46
|
+
reportScriptGenerationCredit(jobId?: string): Promise<void>;
|
|
47
|
+
reportAIRepairCredit(jobId?: string): Promise<void>;
|
|
44
48
|
findTestChimpTests(directory: string, recursive?: boolean): string[];
|
|
45
49
|
}
|
|
46
50
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAE5D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC;AAGlH,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,CAAC;AAGzE,cAAc,SAAS,CAAC;AAGxB,cAAc,eAAe,CAAC;AAG9B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,cAAc,gBAAgB,CAAC;AAG/B,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,gBAAgB,CAAmB;IACpC,eAAe,EAAE,eAAe,CAAC;IACxC,OAAO,CAAC,iBAAiB,CAAuB;IAChD,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,kBAAkB,CAAqB;IAC/C,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,UAAU,CAAS;gBAEf,WAAW,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;IAWxG;;OAEG;IACG,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAc1D;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAOvC;;OAEG;IACH,aAAa,IAAI,UAAU,GAAG,IAAI;IAI5B,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAM3B,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAKzB,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAKhI,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IA4CzC,yBAAyB,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAMrD,4BAA4B,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,oBAAoB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAKzD,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,GAAE,OAAc,GAAG,MAAM,EAAE;CAuD3E"}
|
package/dist/index.js
CHANGED
|
@@ -18,7 +18,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
18
18
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
19
|
};
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.TestChimpService = exports.loadEnvConfig = exports.NoOpFileHandler = exports.CIFileHandler = exports.LocalFileHandler = exports.LLMFacade = exports.PlaywrightMCPService = exports.ScenarioWorker = exports.ScenarioService = exports.ExecutionService = void 0;
|
|
21
|
+
exports.TestChimpService = exports.loadEnvConfig = exports.NoOpFileHandler = exports.CIFileHandler = exports.LocalFileHandler = exports.CreditUsageService = exports.LLMFacade = exports.PlaywrightMCPService = exports.ScenarioWorker = exports.ScenarioService = exports.ExecutionService = void 0;
|
|
22
22
|
// Core services
|
|
23
23
|
const execution_service_1 = require("./execution-service");
|
|
24
24
|
Object.defineProperty(exports, "ExecutionService", { enumerable: true, get: function () { return execution_service_1.ExecutionService; } });
|
|
@@ -30,6 +30,8 @@ const playwright_mcp_service_1 = require("./playwright-mcp-service");
|
|
|
30
30
|
Object.defineProperty(exports, "PlaywrightMCPService", { enumerable: true, get: function () { return playwright_mcp_service_1.PlaywrightMCPService; } });
|
|
31
31
|
const llm_facade_1 = require("./llm-facade");
|
|
32
32
|
Object.defineProperty(exports, "LLMFacade", { enumerable: true, get: function () { return llm_facade_1.LLMFacade; } });
|
|
33
|
+
const credit_usage_service_1 = require("./credit-usage-service");
|
|
34
|
+
Object.defineProperty(exports, "CreditUsageService", { enumerable: true, get: function () { return credit_usage_service_1.CreditUsageService; } });
|
|
33
35
|
// File handlers
|
|
34
36
|
const file_handler_1 = require("./file-handler");
|
|
35
37
|
Object.defineProperty(exports, "LocalFileHandler", { enumerable: true, get: function () { return file_handler_1.LocalFileHandler; } });
|
|
@@ -52,6 +54,7 @@ class TestChimpService {
|
|
|
52
54
|
this.backendUrl = backendUrl || 'https://featureservice.testchimp.io'; // Default to production
|
|
53
55
|
this.playwrightService = new playwright_mcp_service_1.PlaywrightMCPService();
|
|
54
56
|
this.llmFacade = new llm_facade_1.LLMFacade(this.authConfig || undefined, this.backendUrl);
|
|
57
|
+
this.creditUsageService = new credit_usage_service_1.CreditUsageService(this.authConfig || undefined, this.backendUrl);
|
|
55
58
|
this.executionService = new execution_service_1.ExecutionService(this.authConfig || undefined, this.backendUrl, maxWorkers || 10);
|
|
56
59
|
this.scenarioService = new scenario_service_1.ScenarioService(maxWorkers || 2, this.fileHandler, this.authConfig || undefined, this.backendUrl);
|
|
57
60
|
}
|
|
@@ -61,6 +64,7 @@ class TestChimpService {
|
|
|
61
64
|
async setAuthConfig(authConfig) {
|
|
62
65
|
this.authConfig = authConfig;
|
|
63
66
|
this.llmFacade.setAuthConfig(authConfig);
|
|
67
|
+
this.creditUsageService.setAuthConfig(authConfig);
|
|
64
68
|
// Recreate services with new auth config to ensure all workers get the updated config
|
|
65
69
|
this.executionService = new execution_service_1.ExecutionService(this.authConfig, this.backendUrl, 10);
|
|
66
70
|
this.scenarioService = new scenario_service_1.ScenarioService(2, this.fileHandler, this.authConfig, this.backendUrl);
|
|
@@ -73,8 +77,9 @@ class TestChimpService {
|
|
|
73
77
|
*/
|
|
74
78
|
setBackendUrl(backendUrl) {
|
|
75
79
|
this.backendUrl = backendUrl;
|
|
76
|
-
// Recreate
|
|
80
|
+
// Recreate services with new backend URL
|
|
77
81
|
this.llmFacade = new llm_facade_1.LLMFacade(this.authConfig || undefined, this.backendUrl);
|
|
82
|
+
this.creditUsageService = new credit_usage_service_1.CreditUsageService(this.authConfig || undefined, this.backendUrl);
|
|
78
83
|
}
|
|
79
84
|
/**
|
|
80
85
|
* Get current authentication configuration
|
|
@@ -141,6 +146,13 @@ class TestChimpService {
|
|
|
141
146
|
const repairRequest = { ...request, mode: 'RUN_WITH_AI_REPAIR' };
|
|
142
147
|
return this.executeScript(repairRequest);
|
|
143
148
|
}
|
|
149
|
+
// Credit usage reporting methods
|
|
150
|
+
async reportScriptGenerationCredit(jobId) {
|
|
151
|
+
return this.creditUsageService.reportScriptGenerationCredit(jobId);
|
|
152
|
+
}
|
|
153
|
+
async reportAIRepairCredit(jobId) {
|
|
154
|
+
return this.creditUsageService.reportAIRepairCredit(jobId);
|
|
155
|
+
}
|
|
144
156
|
// Find TestChimp managed tests
|
|
145
157
|
findTestChimpTests(directory, recursive = true) {
|
|
146
158
|
const fs = require('fs');
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,gBAAgB;AAChB,2DAAuD;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ export declare class ScenarioService extends EventEmitter {
|
|
|
13
13
|
private fileHandler;
|
|
14
14
|
private authConfig;
|
|
15
15
|
private backendUrl?;
|
|
16
|
+
private creditUsageService;
|
|
16
17
|
constructor(maxWorkers?: number, fileHandler?: FileHandler, authConfig?: AuthConfig, backendUrl?: string);
|
|
17
18
|
private initializeWorkers;
|
|
18
19
|
private createWorker;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-service.d.ts","sourceRoot":"","sources":["../src/scenario-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAiD,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAmB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"scenario-service.d.ts","sourceRoot":"","sources":["../src/scenario-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EAAiD,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAE1F,OAAO,EAAE,WAAW,EAAmB,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C;;GAEG;AACH,qBAAa,eAAgB,SAAQ,YAAY;IAC/C,OAAO,CAAC,OAAO,CAAwB;IACvC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,WAAW,CAAkC;IACrD,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,UAAU,CAAoB;IACtC,OAAO,CAAC,UAAU,CAAC,CAAS;IAC5B,OAAO,CAAC,kBAAkB,CAAqB;gBAEnC,UAAU,GAAE,MAAU,EAAE,WAAW,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,EAAE,UAAU,EAAE,UAAU,CAAC,EAAE,MAAM;YAS7F,iBAAiB;YAMjB,YAAY;IAOpB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAMjC,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,GAAG,MAAM;YAmBpH,cAAc;IA0C5B,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,cAAc;IAShB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAWhC"}
|
package/dist/scenario-service.js
CHANGED
|
@@ -8,6 +8,7 @@ const events_1 = require("events");
|
|
|
8
8
|
const dotenv_1 = __importDefault(require("dotenv"));
|
|
9
9
|
const scenario_worker_class_1 = require("./scenario-worker-class");
|
|
10
10
|
const file_handler_1 = require("./file-handler");
|
|
11
|
+
const credit_usage_service_1 = require("./credit-usage-service");
|
|
11
12
|
// Load environment variables
|
|
12
13
|
dotenv_1.default.config();
|
|
13
14
|
/**
|
|
@@ -23,6 +24,7 @@ class ScenarioService extends events_1.EventEmitter {
|
|
|
23
24
|
this.fileHandler = fileHandler || new file_handler_1.NoOpFileHandler();
|
|
24
25
|
this.authConfig = authConfig || null;
|
|
25
26
|
this.backendUrl = backendUrl;
|
|
27
|
+
this.creditUsageService = new credit_usage_service_1.CreditUsageService(authConfig, backendUrl);
|
|
26
28
|
}
|
|
27
29
|
async initializeWorkers() {
|
|
28
30
|
for (let i = 0; i < this.maxWorkers; i++) {
|
|
@@ -93,6 +95,12 @@ class ScenarioService extends events_1.EventEmitter {
|
|
|
93
95
|
}
|
|
94
96
|
}
|
|
95
97
|
handleJobResult(jobId, result) {
|
|
98
|
+
// Report credit usage for successful script generation
|
|
99
|
+
if (result.success) {
|
|
100
|
+
this.creditUsageService.reportScriptGenerationCredit(jobId).catch(error => {
|
|
101
|
+
console.warn(`Failed to report credit usage for script generation (job: ${jobId}):`, error);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
96
104
|
// Emit result event
|
|
97
105
|
this.emit('jobComplete', jobId, result);
|
|
98
106
|
// Mark worker as available and process next job
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scenario-service.js","sourceRoot":"","sources":["../src/scenario-service.ts"],"names":[],"mappings":";;;;;;AAAA,mCAAsC;AACtC,oDAA4B;AAE5B,mEAAyD;AACzD,iDAA8D;
|
|
1
|
+
{"version":3,"file":"scenario-service.js","sourceRoot":"","sources":["../src/scenario-service.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "testchimp-runner-core",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.13",
|
|
4
4
|
"description": "Core TestChimp functionality for test generation and AI repair",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -14,9 +14,7 @@
|
|
|
14
14
|
"dotenv": "^16.3.1",
|
|
15
15
|
"esbuild": "^0.21.5",
|
|
16
16
|
"fs-extra": "^11.1.1",
|
|
17
|
-
"ws": "^8.14.2"
|
|
18
|
-
},
|
|
19
|
-
"peerDependencies": {
|
|
17
|
+
"ws": "^8.14.2",
|
|
20
18
|
"@playwright/test": "^1.40.0",
|
|
21
19
|
"playwright": "^1.40.0"
|
|
22
20
|
},
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { AuthConfig, getAuthHeaders } from './auth-config';
|
|
3
|
+
|
|
4
|
+
export enum CreditUsageReason {
|
|
5
|
+
UNKNOWN_CREDIT_USAGE_REASON = 0,
|
|
6
|
+
EXPLORER_STEP = 1,
|
|
7
|
+
TEST_REPAIR = 2,
|
|
8
|
+
SCRIPT_GENERATE = 3
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface InsertCreditUsageRequest {
|
|
12
|
+
credits?: number;
|
|
13
|
+
usage_reason?: CreditUsageReason;
|
|
14
|
+
job_id?: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export interface InsertCreditUsageResponse {
|
|
18
|
+
// Empty response as per the protobuf definition
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export class CreditUsageService {
|
|
22
|
+
private backendUrl: string;
|
|
23
|
+
private authConfig: AuthConfig | null;
|
|
24
|
+
|
|
25
|
+
constructor(authConfig?: AuthConfig, backendUrl?: string) {
|
|
26
|
+
// Use provided backend URL or fall back to environment configuration
|
|
27
|
+
if (backendUrl) {
|
|
28
|
+
this.backendUrl = backendUrl;
|
|
29
|
+
} else {
|
|
30
|
+
// Fall back to environment configuration for backward compatibility
|
|
31
|
+
const { loadEnvConfig } = require('./env-config');
|
|
32
|
+
const envConfig = loadEnvConfig();
|
|
33
|
+
this.backendUrl = envConfig.TESTCHIMP_BACKEND_URL;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
this.authConfig = authConfig || null;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Update authentication configuration
|
|
41
|
+
*/
|
|
42
|
+
setAuthConfig(authConfig: AuthConfig): void {
|
|
43
|
+
this.authConfig = authConfig;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Get current authentication configuration
|
|
48
|
+
*/
|
|
49
|
+
getAuthConfig(): AuthConfig | null {
|
|
50
|
+
return this.authConfig;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Report credit usage to the backend
|
|
55
|
+
*/
|
|
56
|
+
async reportCreditUsage(
|
|
57
|
+
credits: number = 1,
|
|
58
|
+
usageReason: CreditUsageReason,
|
|
59
|
+
jobId?: string
|
|
60
|
+
): Promise<InsertCreditUsageResponse> {
|
|
61
|
+
if (!this.authConfig) {
|
|
62
|
+
throw new Error('Authentication not configured. Please set authentication credentials.');
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
const authHeaders = getAuthHeaders(this.authConfig);
|
|
67
|
+
const url = `${this.backendUrl}/localagent/insert_credit_usage`;
|
|
68
|
+
|
|
69
|
+
const request: InsertCreditUsageRequest = {
|
|
70
|
+
credits,
|
|
71
|
+
usage_reason: usageReason,
|
|
72
|
+
job_id: jobId
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
const response = await axios.post(url, request, {
|
|
76
|
+
headers: {
|
|
77
|
+
...authHeaders,
|
|
78
|
+
'Content-Type': 'application/json'
|
|
79
|
+
},
|
|
80
|
+
timeout: 10000 // 10 second timeout for credit usage calls
|
|
81
|
+
});
|
|
82
|
+
|
|
83
|
+
return response.data;
|
|
84
|
+
} catch (error: any) {
|
|
85
|
+
console.error('Credit usage report failed:', error);
|
|
86
|
+
throw new Error(`Credit usage report failed: ${error.message}`);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Report script generation credit usage
|
|
92
|
+
*/
|
|
93
|
+
async reportScriptGenerationCredit(jobId?: string): Promise<void> {
|
|
94
|
+
try {
|
|
95
|
+
await this.reportCreditUsage(1, CreditUsageReason.SCRIPT_GENERATE, jobId);
|
|
96
|
+
console.log(`Credit usage reported for script generation${jobId ? ` (job: ${jobId})` : ''}`);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
console.error('Failed to report script generation credit usage:', error);
|
|
99
|
+
// Don't throw - credit reporting should not break the main flow
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Report AI repair credit usage
|
|
105
|
+
*/
|
|
106
|
+
async reportAIRepairCredit(jobId?: string): Promise<void> {
|
|
107
|
+
try {
|
|
108
|
+
await this.reportCreditUsage(1, CreditUsageReason.TEST_REPAIR, jobId);
|
|
109
|
+
console.log(`Credit usage reported for AI repair${jobId ? ` (job: ${jobId})` : ''}`);
|
|
110
|
+
} catch (error) {
|
|
111
|
+
console.error('Failed to report AI repair credit usage:', error);
|
|
112
|
+
// Don't throw - credit reporting should not break the main flow
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -10,8 +10,9 @@ import { ScenarioWorker } from './scenario-worker-class';
|
|
|
10
10
|
import { PlaywrightMCPService } from './playwright-mcp-service';
|
|
11
11
|
import { LLMFacade } from './llm-facade';
|
|
12
12
|
import { AuthConfig } from './auth-config';
|
|
13
|
+
import { CreditUsageService } from './credit-usage-service';
|
|
13
14
|
|
|
14
|
-
export { ExecutionService, ScenarioService, ScenarioWorker, PlaywrightMCPService, LLMFacade };
|
|
15
|
+
export { ExecutionService, ScenarioService, ScenarioWorker, PlaywrightMCPService, LLMFacade, CreditUsageService };
|
|
15
16
|
|
|
16
17
|
// File handlers
|
|
17
18
|
import { FileHandler, LocalFileHandler, CIFileHandler, NoOpFileHandler } from './file-handler';
|
|
@@ -35,6 +36,7 @@ export class TestChimpService {
|
|
|
35
36
|
public scenarioService: ScenarioService; // Make public for event listening
|
|
36
37
|
private playwrightService: PlaywrightMCPService;
|
|
37
38
|
private llmFacade: LLMFacade;
|
|
39
|
+
private creditUsageService: CreditUsageService;
|
|
38
40
|
private fileHandler: FileHandler;
|
|
39
41
|
private authConfig: AuthConfig | null;
|
|
40
42
|
private backendUrl: string;
|
|
@@ -45,6 +47,7 @@ export class TestChimpService {
|
|
|
45
47
|
this.backendUrl = backendUrl || 'https://featureservice.testchimp.io'; // Default to production
|
|
46
48
|
this.playwrightService = new PlaywrightMCPService();
|
|
47
49
|
this.llmFacade = new LLMFacade(this.authConfig || undefined, this.backendUrl);
|
|
50
|
+
this.creditUsageService = new CreditUsageService(this.authConfig || undefined, this.backendUrl);
|
|
48
51
|
this.executionService = new ExecutionService(this.authConfig || undefined, this.backendUrl, maxWorkers || 10);
|
|
49
52
|
this.scenarioService = new ScenarioService(maxWorkers || 2, this.fileHandler, this.authConfig || undefined, this.backendUrl);
|
|
50
53
|
}
|
|
@@ -55,6 +58,7 @@ export class TestChimpService {
|
|
|
55
58
|
async setAuthConfig(authConfig: AuthConfig): Promise<void> {
|
|
56
59
|
this.authConfig = authConfig;
|
|
57
60
|
this.llmFacade.setAuthConfig(authConfig);
|
|
61
|
+
this.creditUsageService.setAuthConfig(authConfig);
|
|
58
62
|
|
|
59
63
|
// Recreate services with new auth config to ensure all workers get the updated config
|
|
60
64
|
this.executionService = new ExecutionService(this.authConfig, this.backendUrl, 10);
|
|
@@ -70,8 +74,9 @@ export class TestChimpService {
|
|
|
70
74
|
*/
|
|
71
75
|
setBackendUrl(backendUrl: string): void {
|
|
72
76
|
this.backendUrl = backendUrl;
|
|
73
|
-
// Recreate
|
|
77
|
+
// Recreate services with new backend URL
|
|
74
78
|
this.llmFacade = new LLMFacade(this.authConfig || undefined, this.backendUrl);
|
|
79
|
+
this.creditUsageService = new CreditUsageService(this.authConfig || undefined, this.backendUrl);
|
|
75
80
|
}
|
|
76
81
|
|
|
77
82
|
/**
|
|
@@ -146,6 +151,15 @@ export class TestChimpService {
|
|
|
146
151
|
return this.executeScript(repairRequest);
|
|
147
152
|
}
|
|
148
153
|
|
|
154
|
+
// Credit usage reporting methods
|
|
155
|
+
async reportScriptGenerationCredit(jobId?: string): Promise<void> {
|
|
156
|
+
return this.creditUsageService.reportScriptGenerationCredit(jobId);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async reportAIRepairCredit(jobId?: string): Promise<void> {
|
|
160
|
+
return this.creditUsageService.reportAIRepairCredit(jobId);
|
|
161
|
+
}
|
|
162
|
+
|
|
149
163
|
// Find TestChimp managed tests
|
|
150
164
|
findTestChimpTests(directory: string, recursive: boolean = true): string[] {
|
|
151
165
|
const fs = require('fs');
|
package/src/scenario-service.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { ScenarioJob, ScenarioRunJob, ScenarioResponse, PlaywrightConfig } from
|
|
|
4
4
|
import { ScenarioWorker } from './scenario-worker-class';
|
|
5
5
|
import { FileHandler, NoOpFileHandler } from './file-handler';
|
|
6
6
|
import { AuthConfig } from './auth-config';
|
|
7
|
+
import { CreditUsageService } from './credit-usage-service';
|
|
7
8
|
|
|
8
9
|
// Load environment variables
|
|
9
10
|
dotenv.config();
|
|
@@ -19,6 +20,7 @@ export class ScenarioService extends EventEmitter {
|
|
|
19
20
|
private fileHandler: FileHandler;
|
|
20
21
|
private authConfig: AuthConfig | null;
|
|
21
22
|
private backendUrl?: string;
|
|
23
|
+
private creditUsageService: CreditUsageService;
|
|
22
24
|
|
|
23
25
|
constructor(maxWorkers: number = 2, fileHandler?: FileHandler, authConfig?: AuthConfig, backendUrl?: string) {
|
|
24
26
|
super();
|
|
@@ -26,6 +28,7 @@ export class ScenarioService extends EventEmitter {
|
|
|
26
28
|
this.fileHandler = fileHandler || new NoOpFileHandler();
|
|
27
29
|
this.authConfig = authConfig || null;
|
|
28
30
|
this.backendUrl = backendUrl;
|
|
31
|
+
this.creditUsageService = new CreditUsageService(authConfig, backendUrl);
|
|
29
32
|
}
|
|
30
33
|
|
|
31
34
|
private async initializeWorkers(): Promise<void> {
|
|
@@ -109,6 +112,13 @@ export class ScenarioService extends EventEmitter {
|
|
|
109
112
|
}
|
|
110
113
|
|
|
111
114
|
private handleJobResult(jobId: string, result: ScenarioResponse): void {
|
|
115
|
+
// Report credit usage for successful script generation
|
|
116
|
+
if (result.success) {
|
|
117
|
+
this.creditUsageService.reportScriptGenerationCredit(jobId).catch(error => {
|
|
118
|
+
console.warn(`Failed to report credit usage for script generation (job: ${jobId}):`, error);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
112
122
|
// Emit result event
|
|
113
123
|
this.emit('jobComplete', jobId, result);
|
|
114
124
|
|