@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.
Files changed (158) hide show
  1. package/dist/lib/api/browser-types.d.ts +175 -0
  2. package/dist/lib/api/browser-types.d.ts.map +1 -0
  3. package/dist/lib/api/browser-types.js +5 -0
  4. package/dist/lib/api/browser-types.js.map +1 -0
  5. package/dist/lib/api/browser.d.ts +66 -0
  6. package/dist/lib/api/browser.d.ts.map +1 -0
  7. package/dist/lib/api/browser.js +223 -0
  8. package/dist/lib/api/browser.js.map +1 -0
  9. package/dist/lib/browser/index.d.ts +10 -0
  10. package/dist/lib/browser/index.d.ts.map +1 -1
  11. package/dist/lib/browser/index.js +29 -0
  12. package/dist/lib/browser/index.js.map +1 -1
  13. package/dist/package.json +2 -1
  14. package/dist/src/cli/commands/browser/back.d.ts +6 -0
  15. package/dist/src/cli/commands/browser/back.d.ts.map +1 -0
  16. package/dist/src/cli/commands/browser/back.js +42 -0
  17. package/dist/src/cli/commands/browser/back.js.map +1 -0
  18. package/dist/src/cli/commands/browser/check.d.ts +6 -0
  19. package/dist/src/cli/commands/browser/check.d.ts.map +1 -0
  20. package/dist/src/cli/commands/browser/check.js +62 -0
  21. package/dist/src/cli/commands/browser/check.js.map +1 -0
  22. package/dist/src/cli/commands/browser/click.d.ts +6 -0
  23. package/dist/src/cli/commands/browser/click.d.ts.map +1 -0
  24. package/dist/src/cli/commands/browser/click.js +63 -0
  25. package/dist/src/cli/commands/browser/click.js.map +1 -0
  26. package/dist/src/cli/commands/browser/close.d.ts +6 -0
  27. package/dist/src/cli/commands/browser/close.d.ts.map +1 -0
  28. package/dist/src/cli/commands/browser/close.js +44 -0
  29. package/dist/src/cli/commands/browser/close.js.map +1 -0
  30. package/dist/src/cli/commands/browser/create.d.ts +6 -0
  31. package/dist/src/cli/commands/browser/create.d.ts.map +1 -0
  32. package/dist/src/cli/commands/browser/create.js +284 -0
  33. package/dist/src/cli/commands/browser/create.js.map +1 -0
  34. package/dist/src/cli/commands/browser/fill.d.ts +6 -0
  35. package/dist/src/cli/commands/browser/fill.d.ts.map +1 -0
  36. package/dist/src/cli/commands/browser/fill.js +83 -0
  37. package/dist/src/cli/commands/browser/fill.js.map +1 -0
  38. package/dist/src/cli/commands/browser/forward.d.ts +6 -0
  39. package/dist/src/cli/commands/browser/forward.d.ts.map +1 -0
  40. package/dist/src/cli/commands/browser/forward.js +42 -0
  41. package/dist/src/cli/commands/browser/forward.js.map +1 -0
  42. package/dist/src/cli/commands/browser/get-blocks.d.ts +6 -0
  43. package/dist/src/cli/commands/browser/get-blocks.d.ts.map +1 -0
  44. package/dist/src/cli/commands/browser/get-blocks.js +35 -0
  45. package/dist/src/cli/commands/browser/get-blocks.js.map +1 -0
  46. package/dist/src/cli/commands/browser/goto.d.ts +6 -0
  47. package/dist/src/cli/commands/browser/goto.d.ts.map +1 -0
  48. package/dist/src/cli/commands/browser/goto.js +53 -0
  49. package/dist/src/cli/commands/browser/goto.js.map +1 -0
  50. package/dist/src/cli/commands/browser/hover.d.ts +6 -0
  51. package/dist/src/cli/commands/browser/hover.d.ts.map +1 -0
  52. package/dist/src/cli/commands/browser/hover.js +63 -0
  53. package/dist/src/cli/commands/browser/hover.js.map +1 -0
  54. package/dist/src/cli/commands/browser/index.d.ts +9 -0
  55. package/dist/src/cli/commands/browser/index.d.ts.map +1 -0
  56. package/dist/src/cli/commands/browser/index.js +71 -0
  57. package/dist/src/cli/commands/browser/index.js.map +1 -0
  58. package/dist/src/cli/commands/browser/list.d.ts +6 -0
  59. package/dist/src/cli/commands/browser/list.d.ts.map +1 -0
  60. package/dist/src/cli/commands/browser/list.js +85 -0
  61. package/dist/src/cli/commands/browser/list.js.map +1 -0
  62. package/dist/src/cli/commands/browser/press.d.ts +6 -0
  63. package/dist/src/cli/commands/browser/press.d.ts.map +1 -0
  64. package/dist/src/cli/commands/browser/press.js +67 -0
  65. package/dist/src/cli/commands/browser/press.js.map +1 -0
  66. package/dist/src/cli/commands/browser/reload.d.ts +6 -0
  67. package/dist/src/cli/commands/browser/reload.d.ts.map +1 -0
  68. package/dist/src/cli/commands/browser/reload.js +42 -0
  69. package/dist/src/cli/commands/browser/reload.js.map +1 -0
  70. package/dist/src/cli/commands/browser/run.d.ts +6 -0
  71. package/dist/src/cli/commands/browser/run.d.ts.map +1 -0
  72. package/dist/src/cli/commands/browser/run.js +618 -0
  73. package/dist/src/cli/commands/browser/run.js.map +1 -0
  74. package/dist/src/cli/commands/browser/screenshot.d.ts +6 -0
  75. package/dist/src/cli/commands/browser/screenshot.d.ts.map +1 -0
  76. package/dist/src/cli/commands/browser/screenshot.js +72 -0
  77. package/dist/src/cli/commands/browser/screenshot.js.map +1 -0
  78. package/dist/src/cli/commands/browser/scroll-into-view.d.ts +6 -0
  79. package/dist/src/cli/commands/browser/scroll-into-view.d.ts.map +1 -0
  80. package/dist/src/cli/commands/browser/scroll-into-view.js +64 -0
  81. package/dist/src/cli/commands/browser/scroll-into-view.js.map +1 -0
  82. package/dist/src/cli/commands/browser/scroll.d.ts +6 -0
  83. package/dist/src/cli/commands/browser/scroll.d.ts.map +1 -0
  84. package/dist/src/cli/commands/browser/scroll.js +63 -0
  85. package/dist/src/cli/commands/browser/scroll.js.map +1 -0
  86. package/dist/src/cli/commands/browser/select.d.ts +6 -0
  87. package/dist/src/cli/commands/browser/select.d.ts.map +1 -0
  88. package/dist/src/cli/commands/browser/select.js +83 -0
  89. package/dist/src/cli/commands/browser/select.js.map +1 -0
  90. package/dist/src/cli/commands/browser/snapshot.d.ts +6 -0
  91. package/dist/src/cli/commands/browser/snapshot.d.ts.map +1 -0
  92. package/dist/src/cli/commands/browser/snapshot.js +72 -0
  93. package/dist/src/cli/commands/browser/snapshot.js.map +1 -0
  94. package/dist/src/cli/commands/browser/status.d.ts +6 -0
  95. package/dist/src/cli/commands/browser/status.d.ts.map +1 -0
  96. package/dist/src/cli/commands/browser/status.js +91 -0
  97. package/dist/src/cli/commands/browser/status.js.map +1 -0
  98. package/dist/src/cli/commands/browser/stream.d.ts +6 -0
  99. package/dist/src/cli/commands/browser/stream.d.ts.map +1 -0
  100. package/dist/src/cli/commands/browser/stream.js +135 -0
  101. package/dist/src/cli/commands/browser/stream.js.map +1 -0
  102. package/dist/src/cli/commands/browser/tunnel.d.ts +13 -0
  103. package/dist/src/cli/commands/browser/tunnel.d.ts.map +1 -0
  104. package/dist/src/cli/commands/browser/tunnel.js +225 -0
  105. package/dist/src/cli/commands/browser/tunnel.js.map +1 -0
  106. package/dist/src/cli/commands/browser/type.d.ts +6 -0
  107. package/dist/src/cli/commands/browser/type.d.ts.map +1 -0
  108. package/dist/src/cli/commands/browser/type.js +61 -0
  109. package/dist/src/cli/commands/browser/type.js.map +1 -0
  110. package/dist/src/cli/commands/browser/uncheck.d.ts +6 -0
  111. package/dist/src/cli/commands/browser/uncheck.d.ts.map +1 -0
  112. package/dist/src/cli/commands/browser/uncheck.js +62 -0
  113. package/dist/src/cli/commands/browser/uncheck.js.map +1 -0
  114. package/dist/src/cli/commands/browser/url.d.ts +6 -0
  115. package/dist/src/cli/commands/browser/url.d.ts.map +1 -0
  116. package/dist/src/cli/commands/browser/url.js +40 -0
  117. package/dist/src/cli/commands/browser/url.js.map +1 -0
  118. package/dist/src/cli/commands/browser/wait-for-load.d.ts +6 -0
  119. package/dist/src/cli/commands/browser/wait-for-load.d.ts.map +1 -0
  120. package/dist/src/cli/commands/browser/wait-for-load.js +50 -0
  121. package/dist/src/cli/commands/browser/wait-for-load.js.map +1 -0
  122. package/dist/src/cli/commands/browser/wait-for-selector.d.ts +6 -0
  123. package/dist/src/cli/commands/browser/wait-for-selector.d.ts.map +1 -0
  124. package/dist/src/cli/commands/browser/wait-for-selector.js +52 -0
  125. package/dist/src/cli/commands/browser/wait-for-selector.js.map +1 -0
  126. package/dist/src/cli/commands/browser/wait.d.ts +6 -0
  127. package/dist/src/cli/commands/browser/wait.d.ts.map +1 -0
  128. package/dist/src/cli/commands/browser/wait.js +60 -0
  129. package/dist/src/cli/commands/browser/wait.js.map +1 -0
  130. package/dist/src/cli/commands/info.d.ts +1 -1
  131. package/dist/src/cli/commands/info.d.ts.map +1 -1
  132. package/dist/src/cli/commands/info.js +178 -15
  133. package/dist/src/cli/commands/info.js.map +1 -1
  134. package/dist/src/cli/commands/install-deps.d.ts +6 -0
  135. package/dist/src/cli/commands/install-deps.d.ts.map +1 -0
  136. package/dist/src/cli/commands/install-deps.js +52 -0
  137. package/dist/src/cli/commands/install-deps.js.map +1 -0
  138. package/dist/src/cli/commands/test/run.d.ts.map +1 -1
  139. package/dist/src/cli/commands/test/run.js +32 -7
  140. package/dist/src/cli/commands/test/run.js.map +1 -1
  141. package/dist/src/cli/index.js +4 -0
  142. package/dist/src/cli/index.js.map +1 -1
  143. package/dist/src/cli/lib/browser-sessions.d.ts +72 -0
  144. package/dist/src/cli/lib/browser-sessions.d.ts.map +1 -0
  145. package/dist/src/cli/lib/browser-sessions.js +184 -0
  146. package/dist/src/cli/lib/browser-sessions.js.map +1 -0
  147. package/dist/src/cli/lib/browser.d.ts +5 -0
  148. package/dist/src/cli/lib/browser.d.ts.map +1 -1
  149. package/dist/src/cli/lib/browser.js +19 -0
  150. package/dist/src/cli/lib/browser.js.map +1 -1
  151. package/dist/src/cli/lib/config.d.ts.map +1 -1
  152. package/dist/src/cli/lib/config.js +3 -0
  153. package/dist/src/cli/lib/config.js.map +1 -1
  154. package/lib/api/browser-types.ts +278 -0
  155. package/lib/api/browser.test.ts +378 -0
  156. package/lib/api/browser.ts +279 -0
  157. package/lib/browser/index.ts +37 -0
  158. package/package.json +2 -1
@@ -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;AAE/C,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;AAE/B,+BAA+B;AAC/B,OAAO,CAAC,KAAK,EAAE,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;AAG/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;;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,CAwC/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"}
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":"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"}
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,CA4CrD;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"}
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;