@desplega.ai/qa-use 2.1.7 → 2.2.3
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/lib/api/browser-types.d.ts +175 -0
- package/dist/lib/api/browser-types.d.ts.map +1 -0
- package/dist/lib/api/browser-types.js +5 -0
- package/dist/lib/api/browser-types.js.map +1 -0
- package/dist/lib/api/browser.d.ts +66 -0
- package/dist/lib/api/browser.d.ts.map +1 -0
- package/dist/lib/api/browser.js +223 -0
- package/dist/lib/api/browser.js.map +1 -0
- package/dist/lib/browser/index.d.ts +10 -0
- package/dist/lib/browser/index.d.ts.map +1 -1
- package/dist/lib/browser/index.js +29 -0
- package/dist/lib/browser/index.js.map +1 -1
- package/dist/package.json +2 -1
- package/dist/src/cli/commands/browser/back.d.ts +6 -0
- package/dist/src/cli/commands/browser/back.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/back.js +42 -0
- package/dist/src/cli/commands/browser/back.js.map +1 -0
- package/dist/src/cli/commands/browser/check.d.ts +6 -0
- package/dist/src/cli/commands/browser/check.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/check.js +62 -0
- package/dist/src/cli/commands/browser/check.js.map +1 -0
- package/dist/src/cli/commands/browser/click.d.ts +6 -0
- package/dist/src/cli/commands/browser/click.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/click.js +63 -0
- package/dist/src/cli/commands/browser/click.js.map +1 -0
- package/dist/src/cli/commands/browser/close.d.ts +6 -0
- package/dist/src/cli/commands/browser/close.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/close.js +44 -0
- package/dist/src/cli/commands/browser/close.js.map +1 -0
- package/dist/src/cli/commands/browser/create.d.ts +6 -0
- package/dist/src/cli/commands/browser/create.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/create.js +284 -0
- package/dist/src/cli/commands/browser/create.js.map +1 -0
- package/dist/src/cli/commands/browser/fill.d.ts +6 -0
- package/dist/src/cli/commands/browser/fill.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/fill.js +83 -0
- package/dist/src/cli/commands/browser/fill.js.map +1 -0
- package/dist/src/cli/commands/browser/forward.d.ts +6 -0
- package/dist/src/cli/commands/browser/forward.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/forward.js +42 -0
- package/dist/src/cli/commands/browser/forward.js.map +1 -0
- package/dist/src/cli/commands/browser/get-blocks.d.ts +6 -0
- package/dist/src/cli/commands/browser/get-blocks.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/get-blocks.js +35 -0
- package/dist/src/cli/commands/browser/get-blocks.js.map +1 -0
- package/dist/src/cli/commands/browser/goto.d.ts +6 -0
- package/dist/src/cli/commands/browser/goto.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/goto.js +53 -0
- package/dist/src/cli/commands/browser/goto.js.map +1 -0
- package/dist/src/cli/commands/browser/hover.d.ts +6 -0
- package/dist/src/cli/commands/browser/hover.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/hover.js +63 -0
- package/dist/src/cli/commands/browser/hover.js.map +1 -0
- package/dist/src/cli/commands/browser/index.d.ts +9 -0
- package/dist/src/cli/commands/browser/index.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/index.js +71 -0
- package/dist/src/cli/commands/browser/index.js.map +1 -0
- package/dist/src/cli/commands/browser/list.d.ts +6 -0
- package/dist/src/cli/commands/browser/list.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/list.js +85 -0
- package/dist/src/cli/commands/browser/list.js.map +1 -0
- package/dist/src/cli/commands/browser/press.d.ts +6 -0
- package/dist/src/cli/commands/browser/press.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/press.js +67 -0
- package/dist/src/cli/commands/browser/press.js.map +1 -0
- package/dist/src/cli/commands/browser/reload.d.ts +6 -0
- package/dist/src/cli/commands/browser/reload.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/reload.js +42 -0
- package/dist/src/cli/commands/browser/reload.js.map +1 -0
- package/dist/src/cli/commands/browser/run.d.ts +6 -0
- package/dist/src/cli/commands/browser/run.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/run.js +618 -0
- package/dist/src/cli/commands/browser/run.js.map +1 -0
- package/dist/src/cli/commands/browser/screenshot.d.ts +6 -0
- package/dist/src/cli/commands/browser/screenshot.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/screenshot.js +72 -0
- package/dist/src/cli/commands/browser/screenshot.js.map +1 -0
- package/dist/src/cli/commands/browser/scroll-into-view.d.ts +6 -0
- package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/scroll-into-view.js +64 -0
- package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -0
- package/dist/src/cli/commands/browser/scroll.d.ts +6 -0
- package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/scroll.js +63 -0
- package/dist/src/cli/commands/browser/scroll.js.map +1 -0
- package/dist/src/cli/commands/browser/select.d.ts +6 -0
- package/dist/src/cli/commands/browser/select.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/select.js +83 -0
- package/dist/src/cli/commands/browser/select.js.map +1 -0
- package/dist/src/cli/commands/browser/snapshot.d.ts +6 -0
- package/dist/src/cli/commands/browser/snapshot.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/snapshot.js +72 -0
- package/dist/src/cli/commands/browser/snapshot.js.map +1 -0
- package/dist/src/cli/commands/browser/status.d.ts +6 -0
- package/dist/src/cli/commands/browser/status.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/status.js +91 -0
- package/dist/src/cli/commands/browser/status.js.map +1 -0
- package/dist/src/cli/commands/browser/stream.d.ts +6 -0
- package/dist/src/cli/commands/browser/stream.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/stream.js +135 -0
- package/dist/src/cli/commands/browser/stream.js.map +1 -0
- package/dist/src/cli/commands/browser/tunnel.d.ts +13 -0
- package/dist/src/cli/commands/browser/tunnel.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/tunnel.js +225 -0
- package/dist/src/cli/commands/browser/tunnel.js.map +1 -0
- package/dist/src/cli/commands/browser/type.d.ts +6 -0
- package/dist/src/cli/commands/browser/type.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/type.js +61 -0
- package/dist/src/cli/commands/browser/type.js.map +1 -0
- package/dist/src/cli/commands/browser/uncheck.d.ts +6 -0
- package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/uncheck.js +62 -0
- package/dist/src/cli/commands/browser/uncheck.js.map +1 -0
- package/dist/src/cli/commands/browser/url.d.ts +6 -0
- package/dist/src/cli/commands/browser/url.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/url.js +40 -0
- package/dist/src/cli/commands/browser/url.js.map +1 -0
- package/dist/src/cli/commands/browser/wait-for-load.d.ts +6 -0
- package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/wait-for-load.js +50 -0
- package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -0
- package/dist/src/cli/commands/browser/wait-for-selector.d.ts +6 -0
- package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/wait-for-selector.js +52 -0
- package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -0
- package/dist/src/cli/commands/browser/wait.d.ts +6 -0
- package/dist/src/cli/commands/browser/wait.d.ts.map +1 -0
- package/dist/src/cli/commands/browser/wait.js +60 -0
- package/dist/src/cli/commands/browser/wait.js.map +1 -0
- package/dist/src/cli/commands/info.d.ts +1 -1
- package/dist/src/cli/commands/info.d.ts.map +1 -1
- package/dist/src/cli/commands/info.js +178 -15
- package/dist/src/cli/commands/info.js.map +1 -1
- package/dist/src/cli/commands/install-deps.d.ts +6 -0
- package/dist/src/cli/commands/install-deps.d.ts.map +1 -0
- package/dist/src/cli/commands/install-deps.js +52 -0
- package/dist/src/cli/commands/install-deps.js.map +1 -0
- package/dist/src/cli/commands/test/run.d.ts.map +1 -1
- package/dist/src/cli/commands/test/run.js +32 -7
- package/dist/src/cli/commands/test/run.js.map +1 -1
- package/dist/src/cli/index.js +4 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/lib/browser-sessions.d.ts +72 -0
- package/dist/src/cli/lib/browser-sessions.d.ts.map +1 -0
- package/dist/src/cli/lib/browser-sessions.js +184 -0
- package/dist/src/cli/lib/browser-sessions.js.map +1 -0
- package/dist/src/cli/lib/browser.d.ts +5 -0
- package/dist/src/cli/lib/browser.d.ts.map +1 -1
- package/dist/src/cli/lib/browser.js +19 -0
- package/dist/src/cli/lib/browser.js.map +1 -1
- package/dist/src/cli/lib/config.d.ts.map +1 -1
- package/dist/src/cli/lib/config.js +3 -0
- package/dist/src/cli/lib/config.js.map +1 -1
- package/lib/api/browser-types.ts +278 -0
- package/lib/api/browser.test.ts +378 -0
- package/lib/api/browser.ts +279 -0
- package/lib/browser/index.ts +37 -0
- package/package.json +2 -1
package/dist/src/cli/index.js
CHANGED
|
@@ -8,6 +8,8 @@ import { setupCommand } from './commands/setup.js';
|
|
|
8
8
|
import { infoCommand } from './commands/info.js';
|
|
9
9
|
import { testCommand } from './commands/test/index.js';
|
|
10
10
|
import { mcpCommand } from './commands/mcp.js';
|
|
11
|
+
import { browserCommand } from './commands/browser/index.js';
|
|
12
|
+
import { installDepsCommand } from './commands/install-deps.js';
|
|
11
13
|
// Get version from package.json
|
|
12
14
|
const require = createRequire(import.meta.url);
|
|
13
15
|
const { version } = require('../../package.json');
|
|
@@ -18,6 +20,8 @@ program.addCommand(setupCommand);
|
|
|
18
20
|
program.addCommand(infoCommand);
|
|
19
21
|
program.addCommand(testCommand);
|
|
20
22
|
program.addCommand(mcpCommand);
|
|
23
|
+
program.addCommand(browserCommand);
|
|
24
|
+
program.addCommand(installDepsCommand);
|
|
21
25
|
// Parse command line arguments
|
|
22
26
|
program.parse();
|
|
23
27
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/index.ts"],"names":[],"mappings":";AAEA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAEhE,gCAAgC;AAChC,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;AAElD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,WAAW,CAAC,oCAAoC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;AAE1F,oBAAoB;AACpB,OAAO,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;AACjC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;AAChC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;AAC/B,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;AACnC,OAAO,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;AAEvC,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser session persistence utilities
|
|
3
|
+
*
|
|
4
|
+
* Stores active browser sessions in ~/.qa-use.json under "browser_sessions" key.
|
|
5
|
+
* Provides session resolution logic for commands that need a session ID.
|
|
6
|
+
*/
|
|
7
|
+
import type { BrowserApiClient } from '../../../lib/api/browser.js';
|
|
8
|
+
export interface StoredSession {
|
|
9
|
+
id: string;
|
|
10
|
+
created_at: string;
|
|
11
|
+
last_updated: string;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Load all stored sessions from config file
|
|
15
|
+
*/
|
|
16
|
+
export declare function loadStoredSessions(): Promise<StoredSession[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Store a new session or update an existing one
|
|
19
|
+
*/
|
|
20
|
+
export declare function storeSession(session: StoredSession): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* Remove a session from storage by ID
|
|
23
|
+
*/
|
|
24
|
+
export declare function removeStoredSession(id: string): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Update the last_updated timestamp for a session
|
|
27
|
+
*/
|
|
28
|
+
export declare function touchSession(id: string): Promise<void>;
|
|
29
|
+
/**
|
|
30
|
+
* Check if a session is stale (last_updated > 1 hour ago)
|
|
31
|
+
*/
|
|
32
|
+
export declare function isSessionStale(session: StoredSession): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Clean up stale sessions from storage
|
|
35
|
+
* Note: This only removes from local storage, does not close sessions on API
|
|
36
|
+
*/
|
|
37
|
+
export declare function cleanStaleSessions(): Promise<StoredSession[]>;
|
|
38
|
+
/**
|
|
39
|
+
* Get non-stale sessions
|
|
40
|
+
*/
|
|
41
|
+
export declare function getActiveSessions(): Promise<StoredSession[]>;
|
|
42
|
+
export interface SessionResolutionOptions {
|
|
43
|
+
/** Explicit session ID from -s/--session-id flag */
|
|
44
|
+
explicitId?: string;
|
|
45
|
+
/** The BrowserApiClient to use for verification */
|
|
46
|
+
client: BrowserApiClient;
|
|
47
|
+
/** Whether to verify the session exists on the API (default: true) */
|
|
48
|
+
verify?: boolean;
|
|
49
|
+
}
|
|
50
|
+
export interface ResolvedSession {
|
|
51
|
+
id: string;
|
|
52
|
+
source: 'explicit' | 'stored';
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Resolve which session ID to use based on provided flags and stored sessions.
|
|
56
|
+
*
|
|
57
|
+
* Resolution rules:
|
|
58
|
+
* 1. If explicitId is provided, use that session
|
|
59
|
+
* 2. Otherwise, check stored sessions:
|
|
60
|
+
* - Filter out stale sessions
|
|
61
|
+
* - If exactly one active session, use it
|
|
62
|
+
* - If multiple active sessions, throw error listing them
|
|
63
|
+
* - If no active sessions, throw error with create suggestion
|
|
64
|
+
*
|
|
65
|
+
* @throws Error if no session can be resolved or verification fails
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveSessionId(options: SessionResolutionOptions): Promise<ResolvedSession>;
|
|
68
|
+
/**
|
|
69
|
+
* Create a new stored session entry
|
|
70
|
+
*/
|
|
71
|
+
export declare function createStoredSession(id: string): StoredSession;
|
|
72
|
+
//# sourceMappingURL=browser-sessions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-sessions.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/browser-sessions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAMpE,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB;AA6CD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAiBxE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAMnE;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAS5D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAI9D;AAED;;;GAGG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAWnE;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC,CAGlE;AAMD,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mDAAmD;IACnD,MAAM,EAAE,gBAAgB,CAAC;IACzB,sEAAsE;IACtE,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,UAAU,GAAG,QAAQ,CAAC;CAC/B;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,wBAAwB,GAChC,OAAO,CAAC,eAAe,CAAC,CAsD1B;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,MAAM,GAAG,aAAa,CAO7D"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Browser session persistence utilities
|
|
3
|
+
*
|
|
4
|
+
* Stores active browser sessions in ~/.qa-use.json under "browser_sessions" key.
|
|
5
|
+
* Provides session resolution logic for commands that need a session ID.
|
|
6
|
+
*/
|
|
7
|
+
import { readFileSync, writeFileSync, existsSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { homedir } from 'os';
|
|
10
|
+
// ==========================================
|
|
11
|
+
// Configuration
|
|
12
|
+
// ==========================================
|
|
13
|
+
const CONFIG_PATH = join(homedir(), '.qa-use.json');
|
|
14
|
+
const STALE_THRESHOLD_MS = 60 * 60 * 1000; // 1 hour
|
|
15
|
+
// ==========================================
|
|
16
|
+
// Config File Operations
|
|
17
|
+
// ==========================================
|
|
18
|
+
/**
|
|
19
|
+
* Load the config file from ~/.qa-use.json
|
|
20
|
+
*/
|
|
21
|
+
function loadConfig() {
|
|
22
|
+
if (!existsSync(CONFIG_PATH)) {
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
const content = readFileSync(CONFIG_PATH, 'utf-8');
|
|
27
|
+
return JSON.parse(content);
|
|
28
|
+
}
|
|
29
|
+
catch {
|
|
30
|
+
return {};
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Save the config file to ~/.qa-use.json
|
|
35
|
+
*/
|
|
36
|
+
function saveConfig(config) {
|
|
37
|
+
writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
|
|
38
|
+
}
|
|
39
|
+
// ==========================================
|
|
40
|
+
// Session Storage Operations
|
|
41
|
+
// ==========================================
|
|
42
|
+
/**
|
|
43
|
+
* Load all stored sessions from config file
|
|
44
|
+
*/
|
|
45
|
+
export async function loadStoredSessions() {
|
|
46
|
+
const config = loadConfig();
|
|
47
|
+
return config.browser_sessions || [];
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Store a new session or update an existing one
|
|
51
|
+
*/
|
|
52
|
+
export async function storeSession(session) {
|
|
53
|
+
const config = loadConfig();
|
|
54
|
+
const sessions = config.browser_sessions || [];
|
|
55
|
+
// Find existing session with same ID
|
|
56
|
+
const existingIndex = sessions.findIndex((s) => s.id === session.id);
|
|
57
|
+
if (existingIndex >= 0) {
|
|
58
|
+
// Update existing session
|
|
59
|
+
sessions[existingIndex] = session;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
// Add new session
|
|
63
|
+
sessions.push(session);
|
|
64
|
+
}
|
|
65
|
+
config.browser_sessions = sessions;
|
|
66
|
+
saveConfig(config);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Remove a session from storage by ID
|
|
70
|
+
*/
|
|
71
|
+
export async function removeStoredSession(id) {
|
|
72
|
+
const config = loadConfig();
|
|
73
|
+
const sessions = config.browser_sessions || [];
|
|
74
|
+
config.browser_sessions = sessions.filter((s) => s.id !== id);
|
|
75
|
+
saveConfig(config);
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Update the last_updated timestamp for a session
|
|
79
|
+
*/
|
|
80
|
+
export async function touchSession(id) {
|
|
81
|
+
const config = loadConfig();
|
|
82
|
+
const sessions = config.browser_sessions || [];
|
|
83
|
+
const session = sessions.find((s) => s.id === id);
|
|
84
|
+
if (session) {
|
|
85
|
+
session.last_updated = new Date().toISOString();
|
|
86
|
+
saveConfig(config);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Check if a session is stale (last_updated > 1 hour ago)
|
|
91
|
+
*/
|
|
92
|
+
export function isSessionStale(session) {
|
|
93
|
+
const lastUpdated = new Date(session.last_updated).getTime();
|
|
94
|
+
const now = Date.now();
|
|
95
|
+
return now - lastUpdated > STALE_THRESHOLD_MS;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Clean up stale sessions from storage
|
|
99
|
+
* Note: This only removes from local storage, does not close sessions on API
|
|
100
|
+
*/
|
|
101
|
+
export async function cleanStaleSessions() {
|
|
102
|
+
const config = loadConfig();
|
|
103
|
+
const sessions = config.browser_sessions || [];
|
|
104
|
+
const stale = sessions.filter(isSessionStale);
|
|
105
|
+
const active = sessions.filter((s) => !isSessionStale(s));
|
|
106
|
+
config.browser_sessions = active;
|
|
107
|
+
saveConfig(config);
|
|
108
|
+
return stale;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Get non-stale sessions
|
|
112
|
+
*/
|
|
113
|
+
export async function getActiveSessions() {
|
|
114
|
+
const sessions = await loadStoredSessions();
|
|
115
|
+
return sessions.filter((s) => !isSessionStale(s));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Resolve which session ID to use based on provided flags and stored sessions.
|
|
119
|
+
*
|
|
120
|
+
* Resolution rules:
|
|
121
|
+
* 1. If explicitId is provided, use that session
|
|
122
|
+
* 2. Otherwise, check stored sessions:
|
|
123
|
+
* - Filter out stale sessions
|
|
124
|
+
* - If exactly one active session, use it
|
|
125
|
+
* - If multiple active sessions, throw error listing them
|
|
126
|
+
* - If no active sessions, throw error with create suggestion
|
|
127
|
+
*
|
|
128
|
+
* @throws Error if no session can be resolved or verification fails
|
|
129
|
+
*/
|
|
130
|
+
export async function resolveSessionId(options) {
|
|
131
|
+
const { explicitId, client, verify = true } = options;
|
|
132
|
+
let sessionId;
|
|
133
|
+
let source;
|
|
134
|
+
if (explicitId) {
|
|
135
|
+
// Use explicit session ID
|
|
136
|
+
sessionId = explicitId;
|
|
137
|
+
source = 'explicit';
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
// Get non-stale stored sessions
|
|
141
|
+
const activeSessions = await getActiveSessions();
|
|
142
|
+
if (activeSessions.length === 0) {
|
|
143
|
+
throw new Error('No active session found. Run `qa-use browser create` to create a new session.');
|
|
144
|
+
}
|
|
145
|
+
if (activeSessions.length > 1) {
|
|
146
|
+
const sessionList = activeSessions.map((s) => ` - ${s.id}`).join('\n');
|
|
147
|
+
throw new Error(`Multiple active sessions found. Please specify one with -s/--session-id:\n${sessionList}`);
|
|
148
|
+
}
|
|
149
|
+
// Exactly one active session
|
|
150
|
+
sessionId = activeSessions[0].id;
|
|
151
|
+
source = 'stored';
|
|
152
|
+
}
|
|
153
|
+
// Verify session exists on API if requested
|
|
154
|
+
if (verify) {
|
|
155
|
+
try {
|
|
156
|
+
await client.getSession(sessionId);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
// If session not found on API, remove from local storage
|
|
160
|
+
await removeStoredSession(sessionId);
|
|
161
|
+
if (source === 'stored') {
|
|
162
|
+
throw new Error(`Stored session ${sessionId} is no longer active. Run \`qa-use browser create\` to create a new session.`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
throw new Error(`Session ${sessionId} not found.`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Update last_updated timestamp since we just verified it
|
|
169
|
+
await touchSession(sessionId);
|
|
170
|
+
}
|
|
171
|
+
return { id: sessionId, source };
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Create a new stored session entry
|
|
175
|
+
*/
|
|
176
|
+
export function createStoredSession(id) {
|
|
177
|
+
const now = new Date().toISOString();
|
|
178
|
+
return {
|
|
179
|
+
id,
|
|
180
|
+
created_at: now,
|
|
181
|
+
last_updated: now,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=browser-sessions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-sessions.js","sourceRoot":"","sources":["../../../../src/cli/lib/browser-sessions.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,6 +22,11 @@ export interface BrowserTunnelOptions {
|
|
|
22
22
|
* Check if a URL points to localhost
|
|
23
23
|
*/
|
|
24
24
|
export declare function isLocalhostUrl(url: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Check if Playwright browsers are installed and exit with helpful message if not.
|
|
27
|
+
* This is a guard function to call before expensive tunnel/browser operations.
|
|
28
|
+
*/
|
|
29
|
+
export declare function ensureBrowsersInstalled(): void;
|
|
25
30
|
/**
|
|
26
31
|
* Get the port from a URL
|
|
27
32
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAI/D,MAAM,WAAW,oBAAoB;IACnC,OAAO,EAAE,cAAc,CAAC;IACxB,MAAM,EAAE,aAAa,GAAG,IAAI,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAYnD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,IAAI,CAY9C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,oBAAoB,CAAC,CA2C/B;AAED;;GAEG;AACH,wBAAsB,qBAAqB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAKxF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,MAAM,CAEvE;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,OAAO,CAAC,CAaxF"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import { TunnelManager } from '../../../lib/tunnel/index.js';
|
|
8
8
|
import { BrowserManager } from '../../../lib/browser/index.js';
|
|
9
9
|
import { URL } from 'url';
|
|
10
|
+
import { error } from './output.js';
|
|
10
11
|
/**
|
|
11
12
|
* Check if a URL points to localhost
|
|
12
13
|
*/
|
|
@@ -22,6 +23,22 @@ export function isLocalhostUrl(url) {
|
|
|
22
23
|
return false;
|
|
23
24
|
}
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Check if Playwright browsers are installed and exit with helpful message if not.
|
|
28
|
+
* This is a guard function to call before expensive tunnel/browser operations.
|
|
29
|
+
*/
|
|
30
|
+
export function ensureBrowsersInstalled() {
|
|
31
|
+
const browser = new BrowserManager();
|
|
32
|
+
const status = browser.checkBrowsersInstalled();
|
|
33
|
+
if (!status.installed) {
|
|
34
|
+
console.log(error('Playwright Chromium browser is not installed'));
|
|
35
|
+
console.log('');
|
|
36
|
+
console.log(' To install, run:');
|
|
37
|
+
console.log(' qa-use install-deps');
|
|
38
|
+
console.log('');
|
|
39
|
+
process.exit(1);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
25
42
|
/**
|
|
26
43
|
* Get the port from a URL
|
|
27
44
|
*/
|
|
@@ -46,6 +63,8 @@ export function getPortFromUrl(url) {
|
|
|
46
63
|
* @returns BrowserTunnelSession with connection details
|
|
47
64
|
*/
|
|
48
65
|
export async function startBrowserWithTunnel(testUrl, options = {}) {
|
|
66
|
+
// Check that browsers are installed before expensive operations
|
|
67
|
+
ensureBrowsersInstalled();
|
|
49
68
|
const browser = new BrowserManager();
|
|
50
69
|
let tunnel = null;
|
|
51
70
|
let publicWsUrl = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../../src/cli/lib/browser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../../src/cli/lib/browser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AA+BD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,MAAM,WAAW,SAAS;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,OAAO,CAAC;KACrB,CAAC;CACH;AA+BD;;;;;;;;;;GAUG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,SAAS,CAAC,CAgDrD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAIjE;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAErD"}
|
|
@@ -79,6 +79,9 @@ export async function loadConfig() {
|
|
|
79
79
|
if (process.env.QA_USE_API_URL) {
|
|
80
80
|
config.api_url = process.env.QA_USE_API_URL;
|
|
81
81
|
}
|
|
82
|
+
if (process.env.QA_USE_DEFAULT_APP_CONFIG_ID) {
|
|
83
|
+
config.default_app_config_id = process.env.QA_USE_DEFAULT_APP_CONFIG_ID;
|
|
84
|
+
}
|
|
82
85
|
return config;
|
|
83
86
|
}
|
|
84
87
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/cli/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type definitions for the Browser API (/browsers/v1/)
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
// ==========================================
|
|
6
|
+
// Session Types
|
|
7
|
+
// ==========================================
|
|
8
|
+
|
|
9
|
+
export type BrowserSessionStatus = 'starting' | 'active' | 'closing' | 'closed';
|
|
10
|
+
|
|
11
|
+
export type ViewportType = 'desktop' | 'mobile' | 'tablet';
|
|
12
|
+
|
|
13
|
+
export interface CreateBrowserSessionOptions {
|
|
14
|
+
headless?: boolean;
|
|
15
|
+
viewport?: ViewportType;
|
|
16
|
+
timeout?: number; // Session timeout in seconds (60-3600)
|
|
17
|
+
ws_url?: string; // WebSocket URL for remote/tunneled browser
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface BrowserSession {
|
|
21
|
+
id: string;
|
|
22
|
+
status: BrowserSessionStatus;
|
|
23
|
+
created_at: string;
|
|
24
|
+
updated_at?: string;
|
|
25
|
+
current_url?: string;
|
|
26
|
+
viewport?: ViewportType;
|
|
27
|
+
headless?: boolean;
|
|
28
|
+
timeout?: number;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// ==========================================
|
|
32
|
+
// Action Types
|
|
33
|
+
// ==========================================
|
|
34
|
+
|
|
35
|
+
export type BrowserActionType =
|
|
36
|
+
| 'goto'
|
|
37
|
+
| 'back'
|
|
38
|
+
| 'forward'
|
|
39
|
+
| 'reload'
|
|
40
|
+
| 'click'
|
|
41
|
+
| 'fill'
|
|
42
|
+
| 'type'
|
|
43
|
+
| 'press'
|
|
44
|
+
| 'hover'
|
|
45
|
+
| 'scroll'
|
|
46
|
+
| 'scroll_into_view'
|
|
47
|
+
| 'select'
|
|
48
|
+
| 'check'
|
|
49
|
+
| 'uncheck'
|
|
50
|
+
| 'wait'
|
|
51
|
+
| 'wait_for_selector'
|
|
52
|
+
| 'wait_for_load'
|
|
53
|
+
| 'snapshot'
|
|
54
|
+
| 'screenshot';
|
|
55
|
+
|
|
56
|
+
export type ScrollDirection = 'up' | 'down' | 'left' | 'right';
|
|
57
|
+
|
|
58
|
+
export interface GotoAction {
|
|
59
|
+
type: 'goto';
|
|
60
|
+
url: string;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export interface BackAction {
|
|
64
|
+
type: 'back';
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface ForwardAction {
|
|
68
|
+
type: 'forward';
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface ReloadAction {
|
|
72
|
+
type: 'reload';
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface ClickAction {
|
|
76
|
+
type: 'click';
|
|
77
|
+
ref?: string;
|
|
78
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export interface FillAction {
|
|
82
|
+
type: 'fill';
|
|
83
|
+
ref?: string;
|
|
84
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
85
|
+
value: string;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export interface TypeAction {
|
|
89
|
+
type: 'type';
|
|
90
|
+
ref: string;
|
|
91
|
+
text: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export interface PressAction {
|
|
95
|
+
type: 'press';
|
|
96
|
+
key: string;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
export interface HoverAction {
|
|
100
|
+
type: 'hover';
|
|
101
|
+
ref?: string;
|
|
102
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface ScrollAction {
|
|
106
|
+
type: 'scroll';
|
|
107
|
+
direction: ScrollDirection;
|
|
108
|
+
amount?: number; // pixels, default 500
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
export interface SelectAction {
|
|
112
|
+
type: 'select';
|
|
113
|
+
ref?: string;
|
|
114
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
115
|
+
value: string;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export interface CheckAction {
|
|
119
|
+
type: 'check';
|
|
120
|
+
ref?: string;
|
|
121
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export interface UncheckAction {
|
|
125
|
+
type: 'uncheck';
|
|
126
|
+
ref?: string;
|
|
127
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export interface ScrollIntoViewAction {
|
|
131
|
+
type: 'scroll_into_view';
|
|
132
|
+
ref?: string;
|
|
133
|
+
text?: string; // AI-based semantic element selection (alternative to ref)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export interface WaitAction {
|
|
137
|
+
type: 'wait';
|
|
138
|
+
duration_ms: number;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface WaitForSelectorAction {
|
|
142
|
+
type: 'wait_for_selector';
|
|
143
|
+
selector: string;
|
|
144
|
+
state?: 'visible' | 'hidden' | 'attached' | 'detached';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export interface WaitForLoadAction {
|
|
148
|
+
type: 'wait_for_load';
|
|
149
|
+
state?: 'load' | 'domcontentloaded' | 'networkidle';
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
export interface SnapshotAction {
|
|
153
|
+
type: 'snapshot';
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export interface ScreenshotAction {
|
|
157
|
+
type: 'screenshot';
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export type BrowserAction =
|
|
161
|
+
| GotoAction
|
|
162
|
+
| BackAction
|
|
163
|
+
| ForwardAction
|
|
164
|
+
| ReloadAction
|
|
165
|
+
| ClickAction
|
|
166
|
+
| FillAction
|
|
167
|
+
| TypeAction
|
|
168
|
+
| PressAction
|
|
169
|
+
| HoverAction
|
|
170
|
+
| ScrollAction
|
|
171
|
+
| ScrollIntoViewAction
|
|
172
|
+
| SelectAction
|
|
173
|
+
| CheckAction
|
|
174
|
+
| UncheckAction
|
|
175
|
+
| WaitAction
|
|
176
|
+
| WaitForSelectorAction
|
|
177
|
+
| WaitForLoadAction
|
|
178
|
+
| SnapshotAction
|
|
179
|
+
| ScreenshotAction;
|
|
180
|
+
|
|
181
|
+
// ==========================================
|
|
182
|
+
// API Response Types
|
|
183
|
+
// ==========================================
|
|
184
|
+
|
|
185
|
+
export interface ActionResult {
|
|
186
|
+
success: boolean;
|
|
187
|
+
error?: string;
|
|
188
|
+
data?: unknown;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
export interface SnapshotResult {
|
|
192
|
+
snapshot: string;
|
|
193
|
+
url?: string;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export interface UrlResult {
|
|
197
|
+
url: string;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export interface BlocksResult {
|
|
201
|
+
blocks: unknown[]; // ExtendedStep[] - typed in BrowserApiClient
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// ==========================================
|
|
205
|
+
// WebSocket Event Types
|
|
206
|
+
// ==========================================
|
|
207
|
+
|
|
208
|
+
export type WebSocketEventType =
|
|
209
|
+
| 'action_started'
|
|
210
|
+
| 'action_completed'
|
|
211
|
+
| 'status_changed'
|
|
212
|
+
| 'error'
|
|
213
|
+
| 'closed';
|
|
214
|
+
|
|
215
|
+
export interface WebSocketEvent {
|
|
216
|
+
type: WebSocketEventType;
|
|
217
|
+
data?: unknown;
|
|
218
|
+
timestamp?: string;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export interface ActionStartedEvent extends WebSocketEvent {
|
|
222
|
+
type: 'action_started';
|
|
223
|
+
data: {
|
|
224
|
+
action_type: BrowserActionType;
|
|
225
|
+
action_id?: string;
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
export interface ActionCompletedEvent extends WebSocketEvent {
|
|
230
|
+
type: 'action_completed';
|
|
231
|
+
data: {
|
|
232
|
+
action_id?: string;
|
|
233
|
+
success: boolean;
|
|
234
|
+
error?: string;
|
|
235
|
+
result?: unknown;
|
|
236
|
+
};
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export interface StatusChangedEvent extends WebSocketEvent {
|
|
240
|
+
type: 'status_changed';
|
|
241
|
+
data: {
|
|
242
|
+
status: BrowserSessionStatus;
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
export interface ErrorEvent extends WebSocketEvent {
|
|
247
|
+
type: 'error';
|
|
248
|
+
data: {
|
|
249
|
+
message: string;
|
|
250
|
+
code?: string;
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export interface ClosedEvent extends WebSocketEvent {
|
|
255
|
+
type: 'closed';
|
|
256
|
+
data?: {
|
|
257
|
+
reason?: string;
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// ==========================================
|
|
262
|
+
// Client Messages (WebSocket)
|
|
263
|
+
// ==========================================
|
|
264
|
+
|
|
265
|
+
export interface PingMessage {
|
|
266
|
+
type: 'ping';
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
export interface ActionMessage {
|
|
270
|
+
type: 'action';
|
|
271
|
+
data: BrowserAction;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export interface GetStatusMessage {
|
|
275
|
+
type: 'get_status';
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
export type ClientMessage = PingMessage | ActionMessage | GetStatusMessage;
|