@desplega.ai/qa-use 2.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/LICENSE +21 -0
- package/README.md +1003 -0
- package/bin/qa-use.js +7 -0
- package/dist/lib/api/index.d.ts +296 -0
- package/dist/lib/api/index.d.ts.map +1 -0
- package/dist/lib/api/index.js +564 -0
- package/dist/lib/api/index.js.map +1 -0
- package/dist/lib/api/sse.d.ts +33 -0
- package/dist/lib/api/sse.d.ts.map +1 -0
- package/dist/lib/api/sse.js +97 -0
- package/dist/lib/api/sse.js.map +1 -0
- package/dist/lib/browser/index.d.ts +28 -0
- package/dist/lib/browser/index.d.ts.map +1 -0
- package/dist/lib/browser/index.js +145 -0
- package/dist/lib/browser/index.js.map +1 -0
- package/dist/lib/env/index.d.ts +41 -0
- package/dist/lib/env/index.d.ts.map +1 -0
- package/dist/lib/env/index.js +125 -0
- package/dist/lib/env/index.js.map +1 -0
- package/dist/lib/tunnel/index.d.ts +38 -0
- package/dist/lib/tunnel/index.d.ts.map +1 -0
- package/dist/lib/tunnel/index.js +154 -0
- package/dist/lib/tunnel/index.js.map +1 -0
- package/dist/package.json +100 -0
- package/dist/src/cli/commands/info.d.ts +6 -0
- package/dist/src/cli/commands/info.d.ts.map +1 -0
- package/dist/src/cli/commands/info.js +32 -0
- package/dist/src/cli/commands/info.js.map +1 -0
- package/dist/src/cli/commands/mcp.d.ts +6 -0
- package/dist/src/cli/commands/mcp.d.ts.map +1 -0
- package/dist/src/cli/commands/mcp.js +45 -0
- package/dist/src/cli/commands/mcp.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts +6 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +59 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/test/index.d.ts +6 -0
- package/dist/src/cli/commands/test/index.d.ts.map +1 -0
- package/dist/src/cli/commands/test/index.js +15 -0
- package/dist/src/cli/commands/test/index.js.map +1 -0
- package/dist/src/cli/commands/test/init.d.ts +6 -0
- package/dist/src/cli/commands/test/init.d.ts.map +1 -0
- package/dist/src/cli/commands/test/init.js +64 -0
- package/dist/src/cli/commands/test/init.js.map +1 -0
- package/dist/src/cli/commands/test/list.d.ts +6 -0
- package/dist/src/cli/commands/test/list.d.ts.map +1 -0
- package/dist/src/cli/commands/test/list.js +70 -0
- package/dist/src/cli/commands/test/list.js.map +1 -0
- package/dist/src/cli/commands/test/run.d.ts +6 -0
- package/dist/src/cli/commands/test/run.d.ts.map +1 -0
- package/dist/src/cli/commands/test/run.js +95 -0
- package/dist/src/cli/commands/test/run.js.map +1 -0
- package/dist/src/cli/commands/test/validate.d.ts +6 -0
- package/dist/src/cli/commands/test/validate.d.ts.map +1 -0
- package/dist/src/cli/commands/test/validate.js +70 -0
- package/dist/src/cli/commands/test/validate.js.map +1 -0
- package/dist/src/cli/index.d.ts +6 -0
- package/dist/src/cli/index.d.ts.map +1 -0
- package/dist/src/cli/index.js +21 -0
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cli/lib/config.d.ts +36 -0
- package/dist/src/cli/lib/config.d.ts.map +1 -0
- package/dist/src/cli/lib/config.js +89 -0
- package/dist/src/cli/lib/config.js.map +1 -0
- package/dist/src/cli/lib/loader.d.ts +49 -0
- package/dist/src/cli/lib/loader.d.ts.map +1 -0
- package/dist/src/cli/lib/loader.js +122 -0
- package/dist/src/cli/lib/loader.js.map +1 -0
- package/dist/src/cli/lib/output.d.ts +53 -0
- package/dist/src/cli/lib/output.d.ts.map +1 -0
- package/dist/src/cli/lib/output.js +133 -0
- package/dist/src/cli/lib/output.js.map +1 -0
- package/dist/src/cli/lib/runner.d.ts +23 -0
- package/dist/src/cli/lib/runner.d.ts.map +1 -0
- package/dist/src/cli/lib/runner.js +40 -0
- package/dist/src/cli/lib/runner.js.map +1 -0
- package/dist/src/http-server.d.ts +14 -0
- package/dist/src/http-server.d.ts.map +1 -0
- package/dist/src/http-server.js +145 -0
- package/dist/src/http-server.js.map +1 -0
- package/dist/src/index.d.ts +9 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +21 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/server.d.ts +58 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +2376 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/tunnel-mode.d.ts +13 -0
- package/dist/src/tunnel-mode.d.ts.map +1 -0
- package/dist/src/tunnel-mode.js +159 -0
- package/dist/src/tunnel-mode.js.map +1 -0
- package/dist/src/types/test-definition.d.ts +320 -0
- package/dist/src/types/test-definition.d.ts.map +1 -0
- package/dist/src/types/test-definition.js +11 -0
- package/dist/src/types/test-definition.js.map +1 -0
- package/dist/src/types.d.ts +209 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +34 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/utils/package.d.ts +12 -0
- package/dist/src/utils/package.d.ts.map +1 -0
- package/dist/src/utils/package.js +36 -0
- package/dist/src/utils/package.js.map +1 -0
- package/dist/src/utils/summary.d.ts +45 -0
- package/dist/src/utils/summary.d.ts.map +1 -0
- package/dist/src/utils/summary.js +198 -0
- package/dist/src/utils/summary.js.map +1 -0
- package/lib/api/index.ts +977 -0
- package/lib/api/sse.ts +112 -0
- package/lib/browser/index.ts +181 -0
- package/lib/env/index.ts +156 -0
- package/lib/tunnel/index.test.ts +344 -0
- package/lib/tunnel/index.ts +197 -0
- package/lib/tunnel/integration.test.ts +98 -0
- package/package.json +100 -0
- package/server.json +16 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Test execution runner with SSE progress output
|
|
3
|
+
*/
|
|
4
|
+
import { ApiClient, } from '../../../lib/api/index.js';
|
|
5
|
+
import { printSSEProgress } from './output.js';
|
|
6
|
+
/**
|
|
7
|
+
* Run a test with real-time progress output
|
|
8
|
+
*
|
|
9
|
+
* @param client - ApiClient instance
|
|
10
|
+
* @param options - Test run options
|
|
11
|
+
* @param onEvent - Optional additional event callback
|
|
12
|
+
* @returns Test result
|
|
13
|
+
*/
|
|
14
|
+
export async function runTest(client, options, onEvent) {
|
|
15
|
+
return await client.runCliTest(options, (event) => {
|
|
16
|
+
// Print progress to console
|
|
17
|
+
printSSEProgress(event);
|
|
18
|
+
// Call additional callback if provided
|
|
19
|
+
if (onEvent) {
|
|
20
|
+
onEvent(event);
|
|
21
|
+
}
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Run multiple tests sequentially
|
|
26
|
+
*
|
|
27
|
+
* @param client - ApiClient instance
|
|
28
|
+
* @param tests - Array of test run options
|
|
29
|
+
* @returns Array of test results
|
|
30
|
+
*/
|
|
31
|
+
export async function runTests(client, tests) {
|
|
32
|
+
const results = [];
|
|
33
|
+
for (let i = 0; i < tests.length; i++) {
|
|
34
|
+
console.log(`\nRunning test ${i + 1}/${tests.length}...\n`);
|
|
35
|
+
const result = await runTest(client, tests[i]);
|
|
36
|
+
results.push(result);
|
|
37
|
+
}
|
|
38
|
+
return results;
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../../../src/cli/lib/runner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,SAAS,GAGV,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,MAAiB,EACjB,OAA0B,EAC1B,OAAmC;IAEnC,OAAO,MAAM,MAAM,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE;QAChD,4BAA4B;QAC5B,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAExB,uCAAuC;QACvC,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,KAAK,CAAC,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,MAAiB,EACjB,KAA0B;IAE1B,MAAM,OAAO,GAAuB,EAAE,CAAC;IAEvC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAC/C,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { QAUseMcpServer } from './server.js';
|
|
2
|
+
export declare class HttpMcpServer {
|
|
3
|
+
private app;
|
|
4
|
+
private server;
|
|
5
|
+
private mcpServer;
|
|
6
|
+
private port;
|
|
7
|
+
private transports;
|
|
8
|
+
constructor(mcpServer: QAUseMcpServer, port?: number);
|
|
9
|
+
private setupMiddleware;
|
|
10
|
+
private authenticateRequest;
|
|
11
|
+
private setupRoutes;
|
|
12
|
+
start(): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=http-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.d.ts","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAOlD,qBAAa,aAAa;IACxB,OAAO,CAAC,GAAG,CAAsB;IACjC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,UAAU,CAA6C;gBAEnD,SAAS,EAAE,cAAc,EAAE,IAAI,GAAE,MAAa;IAU1D,OAAO,CAAC,eAAe;YAiBT,mBAAmB;IAuBjC,OAAO,CAAC,WAAW;IAgFb,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqB7B"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
3
|
+
import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
|
|
4
|
+
import { randomUUID } from 'node:crypto';
|
|
5
|
+
import { ApiClient } from '../lib/api/index.js';
|
|
6
|
+
import { getName, getVersion } from './utils/package.js';
|
|
7
|
+
export class HttpMcpServer {
|
|
8
|
+
app;
|
|
9
|
+
server;
|
|
10
|
+
mcpServer;
|
|
11
|
+
port;
|
|
12
|
+
transports;
|
|
13
|
+
constructor(mcpServer, port = 3000) {
|
|
14
|
+
this.app = express();
|
|
15
|
+
this.server = mcpServer.getServer();
|
|
16
|
+
this.mcpServer = mcpServer;
|
|
17
|
+
this.port = port;
|
|
18
|
+
this.transports = new Map();
|
|
19
|
+
this.setupMiddleware();
|
|
20
|
+
this.setupRoutes();
|
|
21
|
+
}
|
|
22
|
+
setupMiddleware() {
|
|
23
|
+
// Parse JSON bodies
|
|
24
|
+
this.app.use(express.json());
|
|
25
|
+
// CORS middleware
|
|
26
|
+
this.app.use((req, res, next) => {
|
|
27
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
28
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, DELETE, OPTIONS');
|
|
29
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
|
|
30
|
+
if (req.method === 'OPTIONS') {
|
|
31
|
+
res.sendStatus(200);
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
next();
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async authenticateRequest(req) {
|
|
39
|
+
const authHeader = req.headers.authorization;
|
|
40
|
+
if (!authHeader || !authHeader.startsWith('Bearer ')) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
const apiKey = authHeader.substring(7);
|
|
44
|
+
if (!apiKey) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
// Validate API key
|
|
48
|
+
const apiClient = new ApiClient();
|
|
49
|
+
const authResult = await apiClient.validateApiKey(apiKey);
|
|
50
|
+
if (!authResult.success) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
// Store API key in request for later use
|
|
54
|
+
req.apiKey = apiKey;
|
|
55
|
+
return true;
|
|
56
|
+
}
|
|
57
|
+
setupRoutes() {
|
|
58
|
+
// Health check endpoint
|
|
59
|
+
this.app.get('/health', (req, res) => {
|
|
60
|
+
res.json({
|
|
61
|
+
status: 'ok',
|
|
62
|
+
name: getName(),
|
|
63
|
+
version: getVersion(),
|
|
64
|
+
mode: 'http-sse',
|
|
65
|
+
transport: 'StreamableHTTP',
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
// MCP endpoint - handles both GET (SSE) and POST (messages)
|
|
69
|
+
this.app.all('/mcp', async (req, res) => {
|
|
70
|
+
const authReq = req;
|
|
71
|
+
authReq.body = req.body;
|
|
72
|
+
// Authenticate request
|
|
73
|
+
const isAuthenticated = await this.authenticateRequest(authReq);
|
|
74
|
+
if (!isAuthenticated) {
|
|
75
|
+
return res.status(401).json({
|
|
76
|
+
error: 'Unauthorized',
|
|
77
|
+
message: 'Missing or invalid Authorization header. Expected: Bearer <api-key>',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
// Set API key on MCP server so tools can use it
|
|
81
|
+
if (authReq.apiKey) {
|
|
82
|
+
this.mcpServer.setApiKey(authReq.apiKey);
|
|
83
|
+
}
|
|
84
|
+
// Create or get transport for this request
|
|
85
|
+
const sessionId = req.headers['mcp-session-id'];
|
|
86
|
+
let transport;
|
|
87
|
+
if (sessionId && this.transports.has(sessionId)) {
|
|
88
|
+
transport = this.transports.get(sessionId);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
// Create new transport
|
|
92
|
+
transport = new StreamableHTTPServerTransport({
|
|
93
|
+
sessionIdGenerator: () => randomUUID(),
|
|
94
|
+
onsessioninitialized: (id) => {
|
|
95
|
+
this.transports.set(id, transport);
|
|
96
|
+
},
|
|
97
|
+
onsessionclosed: (id) => {
|
|
98
|
+
this.transports.delete(id);
|
|
99
|
+
},
|
|
100
|
+
});
|
|
101
|
+
// Connect transport to MCP server
|
|
102
|
+
await this.server.connect(transport);
|
|
103
|
+
}
|
|
104
|
+
// Handle the request with the transport
|
|
105
|
+
try {
|
|
106
|
+
await transport.handleRequest(authReq, res, req.body);
|
|
107
|
+
}
|
|
108
|
+
catch (error) {
|
|
109
|
+
if (!res.headersSent) {
|
|
110
|
+
res.status(500).json({
|
|
111
|
+
error: 'Internal Server Error',
|
|
112
|
+
message: error instanceof Error ? error.message : 'Unknown error',
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
// 404 handler
|
|
118
|
+
this.app.use((req, res) => {
|
|
119
|
+
res.status(404).json({
|
|
120
|
+
error: 'Not Found',
|
|
121
|
+
message: `Route ${req.method} ${req.path} not found. Use /mcp for MCP protocol or /health for health check.`,
|
|
122
|
+
});
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
async start() {
|
|
126
|
+
return new Promise((resolve) => {
|
|
127
|
+
this.app.listen(this.port, () => {
|
|
128
|
+
console.log(`${getName()} MCP Server running on port ${this.port}`);
|
|
129
|
+
console.log(`Version: ${getVersion()}`);
|
|
130
|
+
console.log(`Transport: StreamableHTTP (SSE + JSON-RPC)`);
|
|
131
|
+
console.log(`\nEndpoints:`);
|
|
132
|
+
console.log(` GET /health - Health check (no auth required)`);
|
|
133
|
+
console.log(` GET /mcp - Establish SSE connection (auth required)`);
|
|
134
|
+
console.log(` POST /mcp - Send JSON-RPC message (auth required)`);
|
|
135
|
+
console.log(` DELETE /mcp - Close session (auth required)`);
|
|
136
|
+
console.log(`\nAuthentication: Bearer token required (API key)`);
|
|
137
|
+
console.log(`\nExample:`);
|
|
138
|
+
console.log(` # Establish connection`);
|
|
139
|
+
console.log(` curl -N -H "Authorization: Bearer YOUR_KEY" http://localhost:${this.port}/mcp`);
|
|
140
|
+
resolve();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=http-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-server.js","sourceRoot":"","sources":["../../src/http-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* QA-Use MCP Server - Stdio Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This file starts the MCP server in stdio mode (the default for MCP).
|
|
6
|
+
* For other modes (HTTP, tunnel), use the unified CLI: `qa-use mcp --http` or `qa-use mcp tunnel`
|
|
7
|
+
*/
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* QA-Use MCP Server - Stdio Entry Point
|
|
4
|
+
*
|
|
5
|
+
* This file starts the MCP server in stdio mode (the default for MCP).
|
|
6
|
+
* For other modes (HTTP, tunnel), use the unified CLI: `qa-use mcp --http` or `qa-use mcp tunnel`
|
|
7
|
+
*/
|
|
8
|
+
import { version } from 'node:process';
|
|
9
|
+
import { logConfigSources } from '../lib/env/index.js';
|
|
10
|
+
import { QAUseMcpServer } from './server.js';
|
|
11
|
+
const [major] = version.substring(1).split('.').map(Number);
|
|
12
|
+
if (major < 18) {
|
|
13
|
+
console.error(`ERROR: \`qa-use\` requires Node.js 18.0.0 or newer. Current version: ${process.version}`);
|
|
14
|
+
process.exit(1);
|
|
15
|
+
}
|
|
16
|
+
// Log configuration sources (helps users understand where credentials come from)
|
|
17
|
+
logConfigSources();
|
|
18
|
+
// Start stdio server (default MCP mode)
|
|
19
|
+
const server = new QAUseMcpServer();
|
|
20
|
+
await server.start();
|
|
21
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C,MAAM,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAE5D,IAAI,KAAK,GAAG,EAAE,EAAE,CAAC;IACf,OAAO,CAAC,KAAK,CACX,wEAAwE,OAAO,CAAC,OAAO,EAAE,CAC1F,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,iFAAiF;AACjF,gBAAgB,EAAE,CAAC;AAEnB,wCAAwC;AACxC,MAAM,MAAM,GAAG,IAAI,cAAc,EAAE,CAAC;AACpC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Server } from '@modelcontextprotocol/sdk/server/index.js';
|
|
2
|
+
declare class QAUseMcpServer {
|
|
3
|
+
private server;
|
|
4
|
+
private globalApiClient;
|
|
5
|
+
private browserSessions;
|
|
6
|
+
private readonly DEFAULT_TTL_MS;
|
|
7
|
+
private globalBrowser;
|
|
8
|
+
private globalTunnel;
|
|
9
|
+
private globalSessionIndex;
|
|
10
|
+
private cleanupInterval;
|
|
11
|
+
constructor();
|
|
12
|
+
private createSessionSummary;
|
|
13
|
+
private createTestSummary;
|
|
14
|
+
private formatSessionProgress;
|
|
15
|
+
private formatSessionCompletion;
|
|
16
|
+
private startCleanupTask;
|
|
17
|
+
private cleanupExpiredSessions;
|
|
18
|
+
private getBrowserSession;
|
|
19
|
+
/**
|
|
20
|
+
* Cleanup global browser and tunnel resources
|
|
21
|
+
*/
|
|
22
|
+
private cleanupGlobalResources;
|
|
23
|
+
/**
|
|
24
|
+
* Get or create the global browser session (singleton pattern)
|
|
25
|
+
* All sessions share this single browser instance
|
|
26
|
+
*/
|
|
27
|
+
private getOrCreateGlobalBrowser;
|
|
28
|
+
private addBrowserSession;
|
|
29
|
+
private resetAllBrowserSessions;
|
|
30
|
+
private setupTools;
|
|
31
|
+
private handleEnsureInstalled;
|
|
32
|
+
private handleRegisterUser;
|
|
33
|
+
private ensureInitialized;
|
|
34
|
+
private handleSearchSessions;
|
|
35
|
+
private handleStartAutomatedSession;
|
|
36
|
+
private handleStartDevSession;
|
|
37
|
+
private handleMonitorSession;
|
|
38
|
+
private handleWaitForNonRunningState;
|
|
39
|
+
private handleInteractWithSession;
|
|
40
|
+
private handleSearchAutomatedTests;
|
|
41
|
+
private handleRunAutomatedTests;
|
|
42
|
+
private handleSearchAutomatedTestRuns;
|
|
43
|
+
private handleUpdateConfiguration;
|
|
44
|
+
private handleGetConfiguration;
|
|
45
|
+
private handleResetBrowserSessions;
|
|
46
|
+
private setupResources;
|
|
47
|
+
private setupPrompts;
|
|
48
|
+
private generateAAATestPrompt;
|
|
49
|
+
private getGettingStartedGuide;
|
|
50
|
+
private getWorkflowsGuide;
|
|
51
|
+
private getToolsGuide;
|
|
52
|
+
getServer(): Server;
|
|
53
|
+
setApiKey(apiKey: string): void;
|
|
54
|
+
start(): Promise<void>;
|
|
55
|
+
private cleanup;
|
|
56
|
+
}
|
|
57
|
+
export { QAUseMcpServer };
|
|
58
|
+
//# sourceMappingURL=server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAC;AAmOnE,cAAM,cAAc;IAClB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,eAAe,CAAY;IAEnC,OAAO,CAAC,eAAe,CAAwB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAkB;IAGjD,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,kBAAkB,CAAa;IAEvC,OAAO,CAAC,eAAe,CAA+B;;IAyBtD,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,qBAAqB;IAuH7B,OAAO,CAAC,uBAAuB;IA6D/B,OAAO,CAAC,gBAAgB;YAMV,sBAAsB;IA6BpC,OAAO,CAAC,iBAAiB;IAIzB;;OAEG;YACW,sBAAsB;IAmBpC;;;OAGG;YACW,wBAAwB;IAwJtC,OAAO,CAAC,iBAAiB;YAqBX,uBAAuB;IAwBrC,OAAO,CAAC,UAAU;YAuXJ,qBAAqB;YAmFrB,kBAAkB;YAuClB,iBAAiB;YA6CjB,oBAAoB;YAoEpB,2BAA2B;YAiF3B,qBAAqB;YA6ErB,oBAAoB;YA6GpB,4BAA4B;YA2I5B,yBAAyB;YAgGzB,0BAA0B;YA8F1B,uBAAuB;YA6GvB,6BAA6B;YAyE7B,yBAAyB;YAmFzB,sBAAsB;YAiDtB,0BAA0B;IA0BxC,OAAO,CAAC,cAAc;IAuEtB,OAAO,CAAC,YAAY;IA8DpB,OAAO,CAAC,qBAAqB;IA0C7B,OAAO,CAAC,sBAAsB;IAqF9B,OAAO,CAAC,iBAAiB;IAiGzB,OAAO,CAAC,aAAa;IAyHrB,SAAS,IAAI,MAAM;IAInB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI;IAIzB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,OAAO;CAUtB;AAGD,OAAO,EAAE,cAAc,EAAE,CAAC"}
|