whisker-ux 0.1.0 → 0.2.0

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/README.md CHANGED
@@ -16,48 +16,70 @@ AI-powered usability testing CLI. Whisker uses Claude's computer use capability
16
16
  ╰────────────────────────────────────────────────────────────────────╯
17
17
  ```
18
18
 
19
- ## Features
19
+ ## How It Works
20
+
21
+ 1. **Launch**: Opens a visible Chromium browser at your URL
22
+ 2. **Navigate**: Claude sees the screen and decides what actions to take (click, type, scroll)
23
+ 3. **Think Aloud**: Claude narrates its thought process, noting confusion or issues
24
+ 4. **Capture**: Screenshots are taken after each action
25
+ 5. **Analyze**: Claude reviews the session to identify UX issues, bugs, and accessibility problems
26
+ 6. **Report**: Generates detailed findings with severity levels, reproduction steps, and suggested fixes
20
27
 
21
- - **AI-Powered Navigation**: Claude navigates your site like a real user, completing tasks and noting issues
22
- - **Think-Aloud Testing**: Get insights into user confusion and friction points
23
- - **Comprehensive Reports**: Detailed findings with severity levels, reproduction steps, and suggested fixes
24
- - **Screenshot Documentation**: Every step is captured for easy reference
25
- - **Bug Detection**: Catches console errors, network failures, and visual issues
26
- - **Developer-Friendly Output**: Includes grep patterns to find relevant code
28
+ ## Quick Start
27
29
 
28
- ## Installation
30
+ ### 1. Install Whisker
29
31
 
30
32
  ```bash
31
33
  npm install -g whisker-ux
32
34
  ```
33
35
 
34
- Or run directly with npx:
36
+ ### 2. Get Your API Key
35
37
 
36
- ```bash
37
- npx whisker-ux "Sign up for an account" --url https://your-site.com
38
- ```
38
+ Get an Anthropic API key from: <https://console.anthropic.com/settings/keys>
39
39
 
40
- ## Quick Start
40
+ ### 3. Set Up Your Key
41
41
 
42
- 1. **Set up your Anthropic API key**:
42
+ #### Option A: Interactive setup (recommended)
43
43
 
44
44
  ```bash
45
45
  whisker setup
46
46
  ```
47
47
 
48
- Or set the environment variable:
48
+ #### Option B: Create a .env file
49
+
50
+ ```bash
51
+ echo "ANTHROPIC_API_KEY=sk-ant-your-key-here" > .env
52
+ ```
53
+
54
+ #### Option C: Environment variable
49
55
 
50
56
  ```bash
51
- export ANTHROPIC_API_KEY=sk-ant-...
57
+ export ANTHROPIC_API_KEY=sk-ant-your-key-here
52
58
  ```
53
59
 
54
- 2. **Run a usability test**:
60
+ ### 4. Run a Test
55
61
 
56
62
  ```bash
57
- whisker "Add a product to the shopping cart" --url http://localhost:3000
63
+ whisker "Find the pricing page" --url https://your-site.com
58
64
  ```
59
65
 
60
- 3. **View the results** in `.whisker/report.md`
66
+ ### 5. View Results
67
+
68
+ Open `.whisker/report.md` to see the findings.
69
+
70
+ ---
71
+
72
+ ## Run Without Installing (npx)
73
+
74
+ If you prefer not to install globally:
75
+
76
+ ```bash
77
+ # Set your API key first (choose one method from Step 3 above)
78
+ export ANTHROPIC_API_KEY=sk-ant-your-key-here
79
+
80
+ # Run with npx
81
+ npx whisker-ux "Find the pricing page" --url https://your-site.com
82
+ ```
61
83
 
62
84
  ## Usage
63
85
 
@@ -78,6 +100,9 @@ whisker <task> --url <url> [options]
78
100
  | `-m, --max-steps <number>` | Maximum navigation steps | 50 |
79
101
  | `-v, --viewport <WxH>` | Viewport size | 1280x800 |
80
102
  | `-o, --output <dir>` | Output directory | .whisker |
103
+ | `-l, --login` | Pause for manual login before AI takes over | - |
104
+ | `-a, --auth <name>` | Use saved authentication state | - |
105
+ | `-w, --screenshot-window <n>` | Screenshots to keep in context (reduces tokens) | 5 |
81
106
 
82
107
  ### Examples
83
108
 
@@ -107,9 +132,47 @@ whisker "Find pricing information" \
107
132
  --max-steps 10
108
133
  ```
109
134
 
135
+ ## Authentication
136
+
137
+ For testing sites that require login, Whisker offers two approaches:
138
+
139
+ ### Option 1: Interactive Login (`--login`)
140
+
141
+ Best for: Quick manual testing, 2FA, OAuth, SSO
142
+
143
+ ```bash
144
+ whisker "View order history" --url https://mystore.com/account --login
145
+ ```
146
+
147
+ The browser opens, you log in manually, then press Enter to let Claude take over.
148
+
149
+ ### Option 2: Saved Auth State (`--auth`)
150
+
151
+ Best for: Repeatable tests, CI/CD pipelines
152
+
153
+ ```bash
154
+ # One-time: save your login session
155
+ whisker auth save mysite --url https://mysite.com/login
156
+ # Log in manually in the browser, then press Enter
157
+
158
+ # Future runs: reuse saved auth
159
+ whisker "View dashboard" --url https://mysite.com/dashboard --auth mysite
160
+ ```
161
+
162
+ ### Managing Auth States
163
+
164
+ ```bash
165
+ whisker auth list # List saved auth states
166
+ whisker auth delete mysite # Delete a saved auth state
167
+ ```
168
+
169
+ Auth states are stored in `~/.config/whisker/auth/` with restricted permissions.
170
+
171
+ > **Note:** Auth states contain session cookies which may expire. Re-save if you get logged out.
172
+
110
173
  ## Output
111
174
 
112
- Whisker generates three outputs in the `.whisker` directory:
175
+ Whisker generates a report with task completion status, a summary, and detailed findings organized by severity (P0-P3). Each finding includes reproduction steps, screenshot references, and suggested fixes.
113
176
 
114
177
  ```
115
178
  .whisker/
@@ -121,31 +184,6 @@ Whisker generates three outputs in the `.whisker` directory:
121
184
  └── ...
122
185
  ```
123
186
 
124
- ### Report Structure
125
-
126
- The report includes:
127
-
128
- - **Task completion status** - Whether the AI successfully completed the task
129
- - **Summary** - Overview of the testing session
130
- - **Findings** - Detailed issues organized by priority:
131
- - 🔴 P0 - Critical, blocking issues
132
- - 🟠 P1 - Major problems
133
- - 🟡 P2 - Minor issues
134
- - 💡 P3 - Suggestions
135
- - **Console errors** - JavaScript errors detected
136
- - **Network failures** - Failed API calls and requests
137
-
138
- ### Finding Details
139
-
140
- Each finding includes:
141
-
142
- - Severity and category (bug, ux-friction, accessibility, performance, visual, copy)
143
- - Description with expected vs actual behavior
144
- - Steps to reproduce
145
- - Screenshot reference
146
- - Suggested fix
147
- - Grep patterns to find relevant code
148
-
149
187
  ## Commands
150
188
 
151
189
  ### `whisker setup`
@@ -160,6 +198,18 @@ Remove your stored API key.
160
198
 
161
199
  Run a usability test. This is the default command.
162
200
 
201
+ ### `whisker auth save <name>`
202
+
203
+ Save browser authentication state for reuse. Opens a browser for manual login.
204
+
205
+ ### `whisker auth list`
206
+
207
+ List all saved authentication states.
208
+
209
+ ### `whisker auth delete <name>`
210
+
211
+ Delete a saved authentication state.
212
+
163
213
  ## Configuration
164
214
 
165
215
  ### API Key
@@ -167,7 +217,9 @@ Run a usability test. This is the default command.
167
217
  Whisker looks for your Anthropic API key in this order:
168
218
 
169
219
  1. `ANTHROPIC_API_KEY` environment variable
170
- 2. `~/.whisker/config.json` (set via `whisker setup`)
220
+ 2. `.env.local` file in current directory (for local overrides)
221
+ 3. `.env` file in current directory
222
+ 4. `~/.config/whisker/config.json` (set via `whisker setup`)
171
223
 
172
224
  ### Requirements
173
225
 
@@ -184,7 +236,11 @@ const config: WhiskerConfig = {
184
236
  url: "https://example.com",
185
237
  maxSteps: 50,
186
238
  viewport: { width: 1280, height: 800 },
187
- outputDir: ".whisker"
239
+ outputDir: ".whisker",
240
+ // Optional auth options:
241
+ // interactiveLogin: true, // Pause for manual login
242
+ // authStateName: "mysite", // Use saved auth state
243
+ // screenshotWindow: 5, // Screenshots to keep in context
188
244
  };
189
245
 
190
246
  const { report, sessionLog } = await runSession(config);
@@ -216,15 +272,6 @@ If you hit API rate limits, reduce `--max-steps` or wait before retrying.
216
272
 
217
273
  The browser window should appear during testing. If it doesn't, ensure you're not running in a headless environment.
218
274
 
219
- ## How It Works
220
-
221
- 1. **Launch**: Opens a visible Chromium browser at your URL
222
- 2. **Navigate**: Claude sees the screen and decides what actions to take (click, type, scroll)
223
- 3. **Think Aloud**: Claude narrates its thought process, noting confusion or issues
224
- 4. **Capture**: Screenshots are taken after each action
225
- 5. **Analyze**: Claude reviews the session observations and screenshots to identify issues that may not be obvious during navigation
226
- 6. **Report**: Results are saved as markdown and JSON
227
-
228
275
  ## License
229
276
 
230
277
  MIT
package/dist/agent.js CHANGED
@@ -1,10 +1,76 @@
1
1
  import Anthropic from "@anthropic-ai/sdk";
2
2
  import { BrowserManager } from "./browser.js";
3
3
  import { getNavigationSystemPrompt, getReportSystemPrompt, } from "./prompts.js";
4
- import { printTestStart, startSpinner, stopSpinner, startWaitingSpinner, clearSpinner, printStepComplete } from "./ui.js";
4
+ import { printTestStart, startSpinner, stopSpinner, startWaitingSpinner, clearSpinner, printStepComplete, printLoginPrompt, printLoginComplete, waitForEnterKey } from "./ui.js";
5
5
  const MODEL = "claude-sonnet-4-5-20250929";
6
6
  const MAX_SCREENSHOTS_FOR_ANALYSIS = 10; // Limit screenshots sent to analysis phase
7
+ const DEFAULT_SCREENSHOT_WINDOW = 5; // Keep last N screenshots in navigation context
7
8
  const BETA_FLAG = "computer-use-2025-01-24";
9
+ /**
10
+ * Prunes old screenshots from messages to reduce token usage.
11
+ * Keeps only the last `maxScreenshots` screenshots, replacing older ones with text placeholders.
12
+ * This dramatically reduces context size for long sessions while preserving recent visual context.
13
+ *
14
+ * Tracks individual (messageIndex, blockIndex) pairs to handle messages with multiple screenshots correctly.
15
+ */
16
+ function pruneOldScreenshots(messages, maxScreenshots) {
17
+ // Find all screenshot locations as (messageIndex, blockIndex) pairs, newest first
18
+ const screenshotLocations = [];
19
+ for (let i = messages.length - 1; i >= 0; i--) {
20
+ const msg = messages[i];
21
+ if (msg.role === "user" && Array.isArray(msg.content)) {
22
+ // Iterate blocks in reverse to maintain newest-first order within each message
23
+ for (let j = msg.content.length - 1; j >= 0; j--) {
24
+ const block = msg.content[j];
25
+ if (typeof block === "object" &&
26
+ block !== null &&
27
+ "type" in block &&
28
+ block.type === "tool_result" &&
29
+ "content" in block &&
30
+ Array.isArray(block.content)) {
31
+ const hasImage = block.content.some((c) => typeof c === "object" && c !== null && "type" in c && c.type === "image");
32
+ if (hasImage) {
33
+ screenshotLocations.push({ msgIdx: i, blockIdx: j });
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ // If within limit, return as-is
40
+ if (screenshotLocations.length <= maxScreenshots) {
41
+ return messages;
42
+ }
43
+ // Build set of block locations to prune (older screenshots beyond the window)
44
+ const locationsToPrune = new Set(screenshotLocations.slice(maxScreenshots).map(loc => `${loc.msgIdx}:${loc.blockIdx}`));
45
+ // Create pruned copy, only replacing specific blocks
46
+ return messages.map((msg, msgIdx) => {
47
+ if (msg.role === "user" && Array.isArray(msg.content)) {
48
+ // Check if any blocks in this message need pruning
49
+ const hasBlocksToPrune = msg.content.some((_, blockIdx) => locationsToPrune.has(`${msgIdx}:${blockIdx}`));
50
+ if (!hasBlocksToPrune)
51
+ return msg;
52
+ const newContent = msg.content.map((block, blockIdx) => {
53
+ if (!locationsToPrune.has(`${msgIdx}:${blockIdx}`))
54
+ return block;
55
+ if (typeof block === "object" &&
56
+ block !== null &&
57
+ "type" in block &&
58
+ block.type === "tool_result" &&
59
+ "content" in block &&
60
+ Array.isArray(block.content)) {
61
+ // Replace image content with text placeholder
62
+ return {
63
+ ...block,
64
+ content: "[Screenshot removed from context to save tokens]",
65
+ };
66
+ }
67
+ return block;
68
+ });
69
+ return { ...msg, content: newContent };
70
+ }
71
+ return msg;
72
+ });
73
+ }
8
74
  export async function runSession(config) {
9
75
  const client = new Anthropic();
10
76
  const browser = new BrowserManager(config);
@@ -12,7 +78,16 @@ export async function runSession(config) {
12
78
  try {
13
79
  startSpinner("Launching browser...");
14
80
  await browser.launch();
81
+ stopSpinner("Browser launched");
82
+ startSpinner("Navigating to URL...");
83
+ await browser.navigateToUrl();
15
84
  stopSpinner(`Browser ready at ${config.url}`);
85
+ // Interactive login: pause for user to log in manually
86
+ if (config.interactiveLogin) {
87
+ printLoginPrompt();
88
+ await waitForEnterKey();
89
+ printLoginComplete();
90
+ }
16
91
  const sessionLog = await navigationPhase(client, browser, config);
17
92
  printStepComplete(`Navigation complete (${sessionLog.steps.length} steps)`);
18
93
  startSpinner("Generating report...");
@@ -34,8 +109,16 @@ async function navigationPhase(client, browser, config) {
34
109
  display_width_px: config.viewport.width,
35
110
  display_height_px: config.viewport.height,
36
111
  display_number: 1,
112
+ cache_control: { type: "ephemeral" },
37
113
  };
38
- const systemPrompt = getNavigationSystemPrompt(config);
114
+ // Use array format with cache_control for prompt caching
115
+ const systemPrompt = [
116
+ {
117
+ type: "text",
118
+ text: getNavigationSystemPrompt(config),
119
+ cache_control: { type: "ephemeral" },
120
+ },
121
+ ];
39
122
  const messages = [
40
123
  {
41
124
  role: "user",
@@ -43,9 +126,12 @@ async function navigationPhase(client, browser, config) {
43
126
  },
44
127
  ];
45
128
  let stepCount = 0;
129
+ const screenshotWindow = config.screenshotWindow ?? DEFAULT_SCREENSHOT_WINDOW;
46
130
  while (stepCount < config.maxSteps) {
47
131
  // Show waiting spinner while waiting for API response
48
132
  startWaitingSpinner();
133
+ // Prune old screenshots to reduce token usage
134
+ const prunedMessages = pruneOldScreenshots(messages, screenshotWindow);
49
135
  let response;
50
136
  try {
51
137
  response = await client.beta.messages.create({
@@ -53,7 +139,7 @@ async function navigationPhase(client, browser, config) {
53
139
  max_tokens: 4096,
54
140
  system: systemPrompt,
55
141
  tools: [computerTool],
56
- messages,
142
+ messages: prunedMessages,
57
143
  betas: [BETA_FLAG],
58
144
  });
59
145
  }
@@ -72,15 +158,15 @@ async function navigationPhase(client, browser, config) {
72
158
  // Process content blocks
73
159
  const toolResults = [];
74
160
  let hasToolUse = false;
75
- let currentThinking = "";
76
- // First pass: collect thinking text
161
+ // First pass: collect thinking text as observations
77
162
  for (const block of response.content) {
78
163
  if (block.type === "text") {
79
164
  observations.push(block.text);
80
- currentThinking += block.text + " ";
81
165
  }
82
166
  }
83
- // Second pass: process tool uses with the collected thinking
167
+ // Actions that don't change visual state - skip screenshot to save tokens
168
+ const SKIP_SCREENSHOT_ACTIONS = new Set(["mouse_move"]);
169
+ // Second pass: process tool uses
84
170
  for (const block of response.content) {
85
171
  if (block.type === "tool_use") {
86
172
  hasToolUse = true;
@@ -106,10 +192,19 @@ async function navigationPhase(client, browser, config) {
106
192
  continue;
107
193
  }
108
194
  }
109
- // Take screenshot after action
110
- const screenshotBase64 = await browser.takeScreenshot();
111
195
  // Print completed step
112
196
  stopSpinner(`Step ${stepCount}: ${actionDesc}`);
197
+ // Skip screenshot for non-visual actions to save tokens
198
+ if (SKIP_SCREENSHOT_ACTIONS.has(action.action)) {
199
+ toolResults.push({
200
+ type: "tool_result",
201
+ tool_use_id: block.id,
202
+ content: "Action completed. The page looks the same as before.",
203
+ });
204
+ continue;
205
+ }
206
+ // Take screenshot after action
207
+ const screenshotBase64 = await browser.takeScreenshot();
113
208
  steps.push({
114
209
  stepNumber: stepCount,
115
210
  action,
@@ -124,7 +219,7 @@ async function navigationPhase(client, browser, config) {
124
219
  type: "image",
125
220
  source: {
126
221
  type: "base64",
127
- media_type: "image/png",
222
+ media_type: "image/jpeg",
128
223
  data: screenshotBase64,
129
224
  },
130
225
  },
@@ -216,7 +311,7 @@ async function reportPhase(client, sessionLog) {
216
311
  type: "image",
217
312
  source: {
218
313
  type: "base64",
219
- media_type: "image/png",
314
+ media_type: "image/jpeg",
220
315
  data: step.screenshotBase64,
221
316
  },
222
317
  });
package/dist/agent.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../src/agent.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ interface AuthCaptureOptions {
2
+ url: string;
3
+ name: string;
4
+ viewport?: {
5
+ width: number;
6
+ height: number;
7
+ };
8
+ }
9
+ export declare function runAuthCapture(options: AuthCaptureOptions): Promise<void>;
10
+ export {};
package/dist/auth.js ADDED
@@ -0,0 +1,53 @@
1
+ import { chromium } from "playwright";
2
+ import { getAuthStatePath, ensureAuthDir, authStateExists } from "./config.js";
3
+ import { printLoginPrompt, printLoginComplete, waitForEnterKey } from "./ui.js";
4
+ import * as fs from "node:fs";
5
+ export async function runAuthCapture(options) {
6
+ const { url, name, viewport = { width: 1280, height: 800 } } = options;
7
+ // Check if auth state already exists
8
+ if (authStateExists(name)) {
9
+ throw new Error(`Auth state "${name}" already exists. Use "whisker auth delete ${name}" to remove it first.`);
10
+ }
11
+ // Ensure auth directory exists early (fail fast if permissions issue)
12
+ ensureAuthDir();
13
+ console.log("");
14
+ console.log(`Saving auth state as: ${name}`);
15
+ console.log(`Opening: ${url}`);
16
+ console.log("");
17
+ const browser = await chromium.launch({
18
+ headless: false,
19
+ args: [`--window-size=${viewport.width},${viewport.height + 100}`],
20
+ });
21
+ let context = null;
22
+ try {
23
+ context = await browser.newContext({
24
+ viewport: { width: viewport.width, height: viewport.height },
25
+ });
26
+ const page = await context.newPage();
27
+ await page.goto(url, { waitUntil: "domcontentloaded" });
28
+ // Wait for user to log in
29
+ printLoginPrompt();
30
+ await waitForEnterKey();
31
+ printLoginComplete();
32
+ // Save storage state
33
+ const authPath = getAuthStatePath(name);
34
+ await context.storageState({ path: authPath });
35
+ // Set file permissions (read/write only for owner)
36
+ try {
37
+ fs.chmodSync(authPath, 0o600);
38
+ }
39
+ catch {
40
+ // Ignore on platforms that don't support POSIX permissions
41
+ }
42
+ console.log(`Auth state saved to: ${authPath}`);
43
+ console.log("");
44
+ console.log(`Use it with: whisker run "task" --url <url> --auth ${name}`);
45
+ }
46
+ finally {
47
+ if (context) {
48
+ await context.close();
49
+ }
50
+ await browser.close();
51
+ }
52
+ }
53
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAkB,MAAM,YAAY,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAQ9B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAA2B;IAC9D,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;IAEvE,qCAAqC;IACrC,IAAI,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CACb,eAAe,IAAI,8CAA8C,IAAI,uBAAuB,CAC7F,CAAC;IACJ,CAAC;IAED,sEAAsE;IACtE,aAAa,EAAE,CAAC;IAEhB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,EAAE,CAAC,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAEhB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,MAAM,CAAC;QACpC,QAAQ,EAAE,KAAK;QACf,IAAI,EAAE,CAAC,iBAAiB,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;KACnE,CAAC,CAAC;IAEH,IAAI,OAAO,GAA0B,IAAI,CAAC;IAE1C,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC;YACjC,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE;SAC7D,CAAC,CAAC;QAEH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,kBAAkB,EAAE,CAAC,CAAC;QAExD,0BAA0B;QAC1B,gBAAgB,EAAE,CAAC;QACnB,MAAM,eAAe,EAAE,CAAC;QACxB,kBAAkB,EAAE,CAAC;QAErB,qBAAqB;QACrB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACxC,MAAM,OAAO,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QAE/C,mDAAmD;QACnD,IAAI,CAAC;YACH,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,2DAA2D;QAC7D,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,wBAAwB,QAAQ,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;IAC5E,CAAC;YAAS,CAAC;QACT,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QACxB,CAAC;QACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;AACH,CAAC"}
package/dist/browser.d.ts CHANGED
@@ -8,6 +8,8 @@ export declare class BrowserManager {
8
8
  private networkFailures;
9
9
  constructor(config: WhiskerConfig);
10
10
  launch(): Promise<void>;
11
+ navigateToUrl(): Promise<void>;
12
+ saveStorageState(path: string): Promise<void>;
11
13
  takeScreenshot(): Promise<string>;
12
14
  executeAction(action: ComputerAction): Promise<void>;
13
15
  close(): Promise<void>;
package/dist/browser.js CHANGED
@@ -1,4 +1,5 @@
1
1
  import { chromium } from "playwright";
2
+ import { getAuthStatePath } from "./config.js";
2
3
  function mapKeyNames(key) {
3
4
  const keyMap = {
4
5
  return: "Enter",
@@ -56,11 +57,16 @@ export class BrowserManager {
56
57
  `--window-size=${this.config.viewport.width},${this.config.viewport.height + 100}`,
57
58
  ],
58
59
  });
60
+ // Load saved auth state if specified
61
+ const storageState = this.config.authStateName
62
+ ? getAuthStatePath(this.config.authStateName)
63
+ : undefined;
59
64
  this.context = await this.browser.newContext({
60
65
  viewport: {
61
66
  width: this.config.viewport.width,
62
67
  height: this.config.viewport.height,
63
68
  },
69
+ storageState,
64
70
  });
65
71
  this.page = await this.context.newPage();
66
72
  // Capture console errors
@@ -106,14 +112,44 @@ export class BrowserManager {
106
112
  newPage.on("pageerror", (err) => {
107
113
  this.consoleErrors.push(`[${new Date().toISOString()}] Uncaught: ${err.message}`);
108
114
  });
115
+ newPage.on("response", (response) => {
116
+ if (response.status() >= 400) {
117
+ this.networkFailures.push({
118
+ url: response.url(),
119
+ method: response.request().method(),
120
+ status: response.status(),
121
+ statusText: response.statusText(),
122
+ timestamp: Date.now(),
123
+ });
124
+ }
125
+ });
126
+ newPage.on("requestfailed", (request) => {
127
+ this.networkFailures.push({
128
+ url: request.url(),
129
+ method: request.method(),
130
+ status: 0,
131
+ statusText: request.failure()?.errorText ?? "Request failed",
132
+ timestamp: Date.now(),
133
+ });
134
+ });
109
135
  });
136
+ }
137
+ async navigateToUrl() {
138
+ if (!this.page)
139
+ throw new Error("Browser not launched");
110
140
  await this.page.goto(this.config.url, { waitUntil: "domcontentloaded" });
111
141
  }
142
+ async saveStorageState(path) {
143
+ if (!this.context)
144
+ throw new Error("Browser not launched");
145
+ await this.context.storageState({ path });
146
+ }
112
147
  async takeScreenshot() {
113
148
  if (!this.page)
114
149
  throw new Error("Browser not launched");
115
150
  const buffer = await this.page.screenshot({
116
- type: "png",
151
+ type: "jpeg",
152
+ quality: 85,
117
153
  fullPage: false,
118
154
  });
119
155
  return buffer.toString("base64");