@playwright-repl/mcp 0.23.0 → 0.24.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
@@ -31,7 +31,7 @@ It consists of two parts working together: **Dramaturg** (a Chrome extension tha
31
31
  | Full Playwright API | ✅ | ✅ | ✅ |
32
32
  | JS/DOM eval | ✅ | ❌ | ✅ |
33
33
 
34
- > Playwright MCP and Playwriter control Chrome from outside via CDP relay. `@playwright-repl/mcp` runs Playwright natively inside Chrome via `playwright-crx` — enabling `expect()`, recording, and a full DevTools panel alongside AI.
34
+ > Playwright MCP and Playwriter control Chrome from outside via CDP. `@playwright-repl/mcp` runs Playwright natively inside Chrome via `playwright-crx` — enabling `expect()`, recording, and a full DevTools panel alongside AI.
35
35
 
36
36
  ## Architecture
37
37
 
@@ -178,8 +178,13 @@ screenshot # capture page (returned as image to AI)
178
178
  check "Remember me" # check a checkbox
179
179
  select "Country" "United States" # select dropdown option
180
180
  localstorage-list # list localStorage
181
+ video-start # start video recording
182
+ video-stop # stop recording and save video
183
+ video-chapter "Login flow" # add chapter marker
181
184
  ```
182
185
 
186
+ Video recordings are saved to `Downloads/pw-videos/` (bridge mode) or `~/pw-videos/` (standalone mode).
187
+
183
188
  ### Playwright API / JavaScript
184
189
 
185
190
  Both modes accept raw Playwright expressions and JavaScript:
package/dist/bridge.d.ts CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Bridge runner — connects to Chrome via the Dramaturg extension over WebSocket.
3
3
  */
4
- import type { RunnerModule, SnapshotCache } from './types.js';
4
+ import type { RunnerModule } from './types.js';
5
5
  export declare const descriptions: {
6
6
  readonly runCommandInput: "A keyword command ('snapshot', 'goto https://example.com', 'click Submit', 'fill \"Email\" user@example.com') or a Playwright expression ('await page.url()')";
7
- readonly runCommand: "Run a command in the connected Chrome browser. Supports two input modes:\n\n1. KEYWORD (.pw) — playwright-repl commands:\n snapshot, goto <url>, click <text>, fill <label> <value>, press <key>,\n verify-text <text>, verify-no-text <text>, screenshot,\n check <label>, select <label> <value>, localstorage-list, localstorage-clear\n\n2. PLAYWRIGHT — Playwright API (page.* / crxApp.*):\n await page.url(), await page.title(),\n await page.locator('button').count(),\n await page.evaluate(() => document.title)\n\nUpdate commands (click, fill, goto, press, hover, select, check, uncheck, etc.) automatically include a snapshot of the page after the action. You do NOT need to call snapshot separately after these commands.\n\nUse snapshot only for initial exploration or after read-only commands. Use screenshot to visually verify the current state.\n\nIMPORTANT: Before writing .pw commands, run 'help' to get the full list of available commands. Only use commands that appear in the help output. Do not invent commands.";
7
+ readonly runCommand: "Run a command in the connected Chrome browser. Supports two input modes:\n\n1. KEYWORD (.pw) — playwright-repl commands:\n snapshot, goto <url>, click <text>, fill <label> <value>, press <key>,\n verify-text <text>, verify-no-text <text>, screenshot,\n check <label>, select <label> <value>, localstorage-list, localstorage-clear,\n video-start, video-stop, video-chapter <title>,\n tracing-start, tracing-stop\n\n2. PLAYWRIGHT — Playwright API (page.* / crxApp.*):\n await page.url(), await page.title(),\n await page.locator('button').count(),\n await page.evaluate(() => document.title)\n\nUpdate commands (click, fill, goto, press, hover, select, check, uncheck, etc.) automatically include a snapshot of the page after the action. You do NOT need to call snapshot separately after these commands.\n\nUse snapshot only for initial exploration or after read-only commands. Use screenshot to visually verify the current state.\n\nIMPORTANT: Before writing .pw commands, run 'help' to get the full list of available commands. Only use commands that appear in the help output. Do not invent commands.";
8
8
  readonly runScript: "Run a multi-line script, returning combined pass/fail results.\nUseful for replaying a known script without per-step round trips.\nPrefer run_command for AI-driven exploration where you need to observe and adapt after each step.\n\nlanguage='pw': each line is a .pw keyword command, run sequentially. Lines starting with # are skipped. Stops on first error.\nlanguage='javascript': the entire script is run as a single JavaScript/Playwright block.\n\nIMPORTANT: Only use commands listed by 'help'. Run run_command('help') first if unsure which commands are available.";
9
9
  readonly scriptOnly: false;
10
10
  };
11
- export declare function createBridgeRunner(argv: string[], snapshotCache: SnapshotCache): Promise<RunnerModule>;
11
+ export declare function createBridgeRunner(argv: string[]): Promise<RunnerModule>;
12
12
  //# sourceMappingURL=bridge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAG9D,eAAO,MAAM,YAAY;;;;;CAgCf,CAAC;AAEX,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,EAAE,aAAa,GAC7B,OAAO,CAAC,YAAY,CAAC,CAkDvB"}
1
+ {"version":3,"file":"bridge.d.ts","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAG/C,eAAO,MAAM,YAAY;;;;;CAkCf,CAAC;AAEX,wBAAsB,kBAAkB,CACpC,IAAI,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,YAAY,CAAC,CAiCvB"}
package/dist/bridge.js CHANGED
@@ -11,7 +11,9 @@ export const descriptions = {
11
11
  1. KEYWORD (.pw) — playwright-repl commands:
12
12
  snapshot, goto <url>, click <text>, fill <label> <value>, press <key>,
13
13
  verify-text <text>, verify-no-text <text>, screenshot,
14
- check <label>, select <label> <value>, localstorage-list, localstorage-clear
14
+ check <label>, select <label> <value>, localstorage-list, localstorage-clear,
15
+ video-start, video-stop, video-chapter <title>,
16
+ tracing-start, tracing-stop
15
17
 
16
18
  2. PLAYWRIGHT — Playwright API (page.* / crxApp.*):
17
19
  await page.url(), await page.title(),
@@ -33,7 +35,7 @@ language='javascript': the entire script is run as a single JavaScript/Playwrigh
33
35
  IMPORTANT: Only use commands listed by 'help'. Run run_command('help') first if unsure which commands are available.`,
34
36
  scriptOnly: false,
35
37
  };
36
- export async function createBridgeRunner(argv, snapshotCache) {
38
+ export async function createBridgeRunner(argv) {
37
39
  const portIdx = argv.indexOf('--port');
38
40
  const port = portIdx !== -1
39
41
  ? parseInt(argv[portIdx + 1])
@@ -48,9 +50,6 @@ export async function createBridgeRunner(argv, snapshotCache) {
48
50
  descriptions,
49
51
  runner: {
50
52
  async runCommand(command) {
51
- if (!srv.connected) {
52
- return { text: 'Browser not connected. Open Chrome with the playwright-repl extension — it connects automatically.', isError: true };
53
- }
54
53
  // Determine command name for snapshot logic
55
54
  const parsed = parseInput(command);
56
55
  const cmdName = parsed?._[0];
@@ -59,22 +58,9 @@ export async function createBridgeRunner(argv, snapshotCache) {
59
58
  const result = await srv.run(command, isUpdate ? { includeSnapshot: true } : undefined);
60
59
  if (result.isError)
61
60
  return result;
62
- // Cache snapshot (from explicit snapshot command or appended by handler)
63
- if (result.text) {
64
- const snapMatch = result.text.match(/### Snapshot\n([\s\S]+)$/);
65
- if (snapMatch) {
66
- snapshotCache.value = { url: '', snapshotString: snapMatch[1].trim() };
67
- }
68
- else if (cmdName === 'snapshot') {
69
- snapshotCache.value = { url: '', snapshotString: result.text.trim() };
70
- }
71
- }
72
61
  return result;
73
62
  },
74
63
  async runScript(script, language) {
75
- if (!srv.connected) {
76
- return { text: 'Browser not connected. Open Chrome with the playwright-repl extension — it connects automatically.', isError: true };
77
- }
78
64
  return srv.runScript(script, language);
79
65
  },
80
66
  },
@@ -1 +1 @@
1
- {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bridge.js","sourceRoot":"","sources":["../src/bridge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAGlF,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,CAAC,MAAM,YAAY,GAAG;IACxB,eAAe,EAAE;iFAC4D;IAE7E,UAAU,EAAE;;;;;;;;;;;;;;;;;;yKAkByJ;IAErK,SAAS,EAAE;;;;;;;qHAOsG;IAEjH,UAAU,EAAE,KAAK;CACX,CAAC;AAEX,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,IAAc;IAEd,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC,CAAC;QACvB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAE3E,MAAM,GAAG,GAAG,IAAI,YAAY,EAAE,CAAC;IAC/B,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACtB,OAAO,CAAC,KAAK,CAAC,sDAAsD,IAAI,EAAE,CAAC,CAAC;IAC5E,QAAQ,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;IACvD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,GAAG,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzG,OAAO;QACH,YAAY;QACZ,MAAM,EAAE;YACJ,KAAK,CAAC,UAAU,CAAC,OAAe;gBAC5B,4CAA4C;gBAC5C,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEvE,8DAA8D;gBAC9D,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACxF,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC;gBAElC,OAAO,MAAM,CAAC;YAClB,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAA6B;gBACzD,OAAO,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC3C,CAAC;SACJ;KACJ,CAAC;AACN,CAAC"}
@@ -2,6 +2,6 @@
2
2
  * Evaluate runner — connects to Chrome via serviceWorker.evaluate().
3
3
  * No WebSocket bridge needed.
4
4
  */
5
- import type { RunnerModule, SnapshotCache } from './types.js';
6
- export declare function createEvaluateRunner(argv: string[], snapshotCache: SnapshotCache): Promise<RunnerModule>;
5
+ import type { RunnerModule } from './types.js';
6
+ export declare function createEvaluateRunner(argv: string[]): Promise<RunnerModule>;
7
7
  //# sourceMappingURL=evaluate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,EAAE,aAAa,GAC7B,OAAO,CAAC,YAAY,CAAC,CAuCvB"}
1
+ {"version":3,"file":"evaluate.d.ts","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,wBAAsB,oBAAoB,CACtC,IAAI,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,YAAY,CAAC,CAkCvB"}
package/dist/evaluate.js CHANGED
@@ -2,10 +2,10 @@
2
2
  * Evaluate runner — connects to Chrome via serviceWorker.evaluate().
3
3
  * No WebSocket bridge needed.
4
4
  */
5
- import { EvaluateConnection, findExtensionPath, UPDATE_COMMANDS, parseInput } from '@playwright-repl/core';
5
+ import { EvaluateConnection, findExtensionPath, UPDATE_COMMANDS, parseInput, handleLocalCommand } from '@playwright-repl/core';
6
6
  import { logEvent } from './logger.js';
7
7
  import { descriptions } from './bridge.js';
8
- export async function createEvaluateRunner(argv, snapshotCache) {
8
+ export async function createEvaluateRunner(argv) {
9
9
  const headed = argv.includes('--headed');
10
10
  const extPath = findExtensionPath(import.meta.url);
11
11
  if (!extPath)
@@ -20,21 +20,16 @@ export async function createEvaluateRunner(argv, snapshotCache) {
20
20
  descriptions,
21
21
  runner: {
22
22
  async runCommand(command) {
23
+ // Local commands (video, etc.) — run in Node.js
24
+ const localResult = await handleLocalCommand(command, conn.context);
25
+ if (localResult)
26
+ return localResult;
23
27
  const parsed = parseInput(command);
24
28
  const cmdName = parsed?._[0];
25
29
  const isUpdate = cmdName !== undefined && UPDATE_COMMANDS.has(cmdName);
26
30
  const result = await conn.run(command, isUpdate ? { includeSnapshot: true } : undefined);
27
31
  if (result.isError)
28
32
  return result;
29
- if (result.text) {
30
- const snapMatch = result.text.match(/### Snapshot\n([\s\S]+)$/);
31
- if (snapMatch) {
32
- snapshotCache.value = { url: '', snapshotString: snapMatch[1].trim() };
33
- }
34
- else if (cmdName === 'snapshot') {
35
- snapshotCache.value = { url: '', snapshotString: result.text.trim() };
36
- }
37
- }
38
33
  return result;
39
34
  },
40
35
  async runScript(script, language) {
@@ -1 +1 @@
1
- {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAG3G,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAc,EACd,aAA4B;IAE5B,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAEzF,MAAM,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;IACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAQ,CAAC;IAChF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACnF,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAElC,OAAO;QACH,YAAY;QACZ,MAAM,EAAE;YACJ,KAAK,CAAC,UAAU,CAAC,OAAe;gBAC5B,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACzF,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC;gBAElC,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBACd,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC;oBAChE,IAAI,SAAS,EAAE,CAAC;wBACZ,aAAa,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC3E,CAAC;yBAAM,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;wBAChC,aAAa,CAAC,KAAK,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC1E,CAAC;gBACL,CAAC;gBAED,OAAO,MAAM,CAAC;YAClB,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAA6B;gBACzD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC;AACN,CAAC"}
1
+ {"version":3,"file":"evaluate.js","sourceRoot":"","sources":["../src/evaluate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAG/H,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACtC,IAAc;IAEd,MAAM,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnD,IAAI,CAAC,OAAO;QAAE,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;IAEzF,MAAM,IAAI,GAAG,IAAI,kBAAkB,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,kBAAkB,CAAC;IACpC,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAQ,CAAC;IAChF,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,KAAK,CAAC,kCAAkC,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;IACnF,QAAQ,CAAC,uBAAuB,CAAC,CAAC;IAElC,OAAO;QACH,YAAY;QACZ,MAAM,EAAE;YACJ,KAAK,CAAC,UAAU,CAAC,OAAe;gBAC5B,gDAAgD;gBAChD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;gBACpE,IAAI,WAAW;oBAAE,OAAO,WAAW,CAAC;gBAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBACnC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7B,MAAM,QAAQ,GAAG,OAAO,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAEvE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;gBACzF,IAAI,MAAM,CAAC,OAAO;oBAAE,OAAO,MAAM,CAAC;gBAElC,OAAO,MAAM,CAAC;YAClB,CAAC;YACD,KAAK,CAAC,SAAS,CAAC,MAAc,EAAE,QAA6B;gBACzD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YAC5C,CAAC;SACJ;KACJ,CAAC;AACN,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * HTTP transport for the MCP server.
3
+ *
4
+ * Allows the MCP server to run as a standalone HTTP process that multiple
5
+ * AI clients (Claude Desktop, Claude Code, Copilot) can connect to.
6
+ *
7
+ * Usage: npx playwright-repl-mcp --http [--http-port 9877]
8
+ */
9
+ import type { Runner, RunnerDescriptions } from './types.js';
10
+ export declare function startHttpTransport(runner: Runner, descriptions: RunnerDescriptions, port: number): Promise<void>;
11
+ //# sourceMappingURL=http-transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.d.ts","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAWH,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAU7D,wBAAsB,kBAAkB,CACpC,MAAM,EAAE,MAAM,EACd,YAAY,EAAE,kBAAkB,EAChC,IAAI,EAAE,MAAM,GACb,OAAO,CAAC,IAAI,CAAC,CAsHf"}
@@ -0,0 +1,150 @@
1
+ /**
2
+ * HTTP transport for the MCP server.
3
+ *
4
+ * Allows the MCP server to run as a standalone HTTP process that multiple
5
+ * AI clients (Claude Desktop, Claude Code, Copilot) can connect to.
6
+ *
7
+ * Usage: npx playwright-repl-mcp --http [--http-port 9877]
8
+ */
9
+ import { createServer } from 'node:http';
10
+ import { randomUUID } from 'node:crypto';
11
+ import { writeFileSync, unlinkSync } from 'node:fs';
12
+ import { join } from 'node:path';
13
+ import { homedir } from 'node:os';
14
+ import { StreamableHTTPServerTransport } from '@modelcontextprotocol/sdk/server/streamableHttp.js';
15
+ import { isInitializeRequest } from '@modelcontextprotocol/sdk/types.js';
16
+ import { createMcpServer } from './server-factory.js';
17
+ import { logEvent } from './logger.js';
18
+ const PID_FILE = join(homedir(), '.playwright-repl', 'mcp.pid');
19
+ // ─── Session Management ─────────────────────────────────────────────────────
20
+ const sessions = new Map();
21
+ // ─── HTTP Server ─────────────────────────────────────────────────────────────
22
+ export async function startHttpTransport(runner, descriptions, port) {
23
+ const httpServer = createServer(async (req, res) => {
24
+ try {
25
+ const sessionId = req.headers['mcp-session-id'];
26
+ if (req.url !== '/mcp') {
27
+ res.writeHead(404);
28
+ res.end('Not found');
29
+ return;
30
+ }
31
+ if (req.method === 'POST') {
32
+ // Parse request body
33
+ const body = await new Promise((resolve) => {
34
+ let data = '';
35
+ req.on('data', (chunk) => { data += chunk; });
36
+ req.on('end', () => resolve(data));
37
+ });
38
+ let jsonBody;
39
+ try {
40
+ jsonBody = JSON.parse(body);
41
+ }
42
+ catch {
43
+ res.writeHead(400, { 'Content-Type': 'application/json' });
44
+ res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32700, message: 'Parse error' }, id: null }));
45
+ return;
46
+ }
47
+ let transport = sessionId ? sessions.get(sessionId) : undefined;
48
+ if (!transport) {
49
+ // Only create a new session for initialize requests
50
+ if (!isInitializeRequest(jsonBody)) {
51
+ res.writeHead(400, { 'Content-Type': 'application/json' });
52
+ res.end(JSON.stringify({
53
+ jsonrpc: '2.0',
54
+ error: { code: -32000, message: 'Bad Request: No valid session ID provided' },
55
+ id: null,
56
+ }));
57
+ return;
58
+ }
59
+ transport = new StreamableHTTPServerTransport({
60
+ sessionIdGenerator: () => randomUUID(),
61
+ onsessioninitialized: (sid) => {
62
+ sessions.set(sid, transport);
63
+ logEvent(`HTTP session created: ${sid}`);
64
+ },
65
+ });
66
+ const server = createMcpServer(runner, descriptions);
67
+ await server.connect(transport);
68
+ transport.onclose = () => {
69
+ const sid = transport.sessionId;
70
+ if (sid)
71
+ sessions.delete(sid);
72
+ logEvent(`HTTP session closed: ${sid}`);
73
+ };
74
+ }
75
+ await transport.handleRequest(req, res, jsonBody);
76
+ return;
77
+ }
78
+ if (req.method === 'GET') {
79
+ // SSE stream for server-initiated notifications
80
+ const transport = sessionId ? sessions.get(sessionId) : undefined;
81
+ if (!transport) {
82
+ res.writeHead(400);
83
+ res.end('No session');
84
+ return;
85
+ }
86
+ await transport.handleRequest(req, res);
87
+ return;
88
+ }
89
+ if (req.method === 'DELETE') {
90
+ const transport = sessionId ? sessions.get(sessionId) : undefined;
91
+ if (transport) {
92
+ await transport.close();
93
+ sessions.delete(sessionId);
94
+ logEvent(`HTTP session deleted: ${sessionId}`);
95
+ }
96
+ res.writeHead(200);
97
+ res.end();
98
+ return;
99
+ }
100
+ res.writeHead(405);
101
+ res.end('Method not allowed');
102
+ }
103
+ catch (err) {
104
+ logEvent(`HTTP handler error: ${err?.message ?? err}`);
105
+ console.error('[http] request handler error:', err);
106
+ if (!res.headersSent) {
107
+ res.writeHead(500, { 'Content-Type': 'application/json' });
108
+ res.end(JSON.stringify({ jsonrpc: '2.0', error: { code: -32603, message: 'Internal server error' }, id: null }));
109
+ }
110
+ }
111
+ });
112
+ await new Promise((resolve) => {
113
+ httpServer.listen(port, '127.0.0.1', () => resolve());
114
+ });
115
+ // Write PID file for easy process management
116
+ writePidFile();
117
+ console.error(`playwright-repl MCP HTTP server on http://127.0.0.1:${port}/mcp`);
118
+ logEvent(`HTTP server listening on http://127.0.0.1:${port}/mcp`);
119
+ // Clean up on exit
120
+ const cleanup = () => {
121
+ removePidFile();
122
+ for (const transport of sessions.values()) {
123
+ transport.close().catch(() => { });
124
+ }
125
+ sessions.clear();
126
+ httpServer.close();
127
+ };
128
+ process.on('SIGINT', () => { logEvent('Received SIGINT, shutting down'); cleanup(); process.exit(0); });
129
+ process.on('SIGTERM', () => { logEvent('Received SIGTERM, shutting down'); cleanup(); process.exit(0); });
130
+ process.on('uncaughtException', (err) => { logEvent(`Uncaught exception: ${err.message}`); console.error(err); });
131
+ process.on('unhandledRejection', (reason) => { logEvent(`Unhandled rejection: ${reason}`); console.error(reason); });
132
+ }
133
+ // ─── PID File ────────────────────────────────────────────────────────────────
134
+ function writePidFile() {
135
+ try {
136
+ writeFileSync(PID_FILE, String(process.pid));
137
+ }
138
+ catch {
139
+ // Non-critical — just for convenience
140
+ }
141
+ }
142
+ function removePidFile() {
143
+ try {
144
+ unlinkSync(PID_FILE);
145
+ }
146
+ catch {
147
+ // Already gone
148
+ }
149
+ }
150
+ //# sourceMappingURL=http-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../src/http-transport.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oDAAoD,CAAC;AACnG,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,kBAAkB,EAAE,SAAS,CAAC,CAAC;AAEhE,+EAA+E;AAE/E,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAyC,CAAC;AAElE,gFAAgF;AAEhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACpC,MAAc,EACd,YAAgC,EAChC,IAAY;IAEZ,MAAM,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;QACjD,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAuB,CAAC;YAEtE,IAAI,GAAG,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;gBACrB,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBACrB,OAAO;YACX,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;gBACxB,qBAAqB;gBACrB,MAAM,IAAI,GAAG,MAAM,IAAI,OAAO,CAAS,CAAC,OAAO,EAAE,EAAE;oBAC/C,IAAI,IAAI,GAAG,EAAE,CAAC;oBACd,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE,GAAG,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;oBACtD,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBACvC,CAAC,CAAC,CAAC;gBACH,IAAI,QAAiB,CAAC;gBACtB,IAAI,CAAC;oBACD,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC;gBAAC,MAAM,CAAC;oBACL,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;oBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;oBACvG,OAAO;gBACX,CAAC;gBAED,IAAI,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACb,oDAAoD;oBACpD,IAAI,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,CAAC;wBACjC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;wBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;4BACnB,OAAO,EAAE,KAAK;4BACd,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,2CAA2C,EAAE;4BAC7E,EAAE,EAAE,IAAI;yBACX,CAAC,CAAC,CAAC;wBACJ,OAAO;oBACX,CAAC;oBACD,SAAS,GAAG,IAAI,6BAA6B,CAAC;wBAC1C,kBAAkB,EAAE,GAAG,EAAE,CAAC,UAAU,EAAE;wBACtC,oBAAoB,EAAE,CAAC,GAAG,EAAE,EAAE;4BAC1B,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,SAAU,CAAC,CAAC;4BAC9B,QAAQ,CAAC,yBAAyB,GAAG,EAAE,CAAC,CAAC;wBAC7C,CAAC;qBACJ,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;oBACrD,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;oBAEhC,SAAS,CAAC,OAAO,GAAG,GAAG,EAAE;wBACrB,MAAM,GAAG,GAAG,SAAU,CAAC,SAAS,CAAC;wBACjC,IAAI,GAAG;4BAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;wBAC9B,QAAQ,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;oBAC5C,CAAC,CAAC;gBACN,CAAC;gBACD,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;gBAClD,OAAO;YACX,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;gBACvB,gDAAgD;gBAChD,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACb,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;oBACnB,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;oBACtB,OAAO;gBACX,CAAC;gBACD,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACxC,OAAO;YACX,CAAC;YAED,IAAI,GAAG,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBAC1B,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAClE,IAAI,SAAS,EAAE,CAAC;oBACZ,MAAM,SAAS,CAAC,KAAK,EAAE,CAAC;oBACxB,QAAQ,CAAC,MAAM,CAAC,SAAU,CAAC,CAAC;oBAC5B,QAAQ,CAAC,yBAAyB,SAAS,EAAE,CAAC,CAAC;gBACnD,CAAC;gBACD,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;gBACnB,GAAG,CAAC,GAAG,EAAE,CAAC;gBACV,OAAO;YACX,CAAC;YAED,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;YACnB,GAAG,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;QAChC,CAAC;QAAC,OAAO,GAAQ,EAAE,CAAC;YAClB,QAAQ,CAAC,uBAAuB,GAAG,EAAE,OAAO,IAAI,GAAG,EAAE,CAAC,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,+BAA+B,EAAE,GAAG,CAAC,CAAC;YACpD,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACnB,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;gBAC3D,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;YACrH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;QAChC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,6CAA6C;IAC7C,YAAY,EAAE,CAAC;IAEf,OAAO,CAAC,KAAK,CAAC,uDAAuD,IAAI,MAAM,CAAC,CAAC;IACjF,QAAQ,CAAC,6CAA6C,IAAI,MAAM,CAAC,CAAC;IAElE,mBAAmB;IACnB,MAAM,OAAO,GAAG,GAAG,EAAE;QACjB,aAAa,EAAE,CAAC;QAChB,KAAK,MAAM,SAAS,IAAI,QAAQ,CAAC,MAAM,EAAE,EAAE,CAAC;YACxC,SAAS,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,QAAQ,CAAC,KAAK,EAAE,CAAC;QACjB,UAAU,CAAC,KAAK,EAAE,CAAC;IACvB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,gCAAgC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxG,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,QAAQ,CAAC,iCAAiC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1G,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,GAAG,EAAE,EAAE,GAAG,QAAQ,CAAC,uBAAuB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,MAAM,EAAE,EAAE,GAAG,QAAQ,CAAC,wBAAwB,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACzH,CAAC;AAED,gFAAgF;AAEhF,SAAS,YAAY;IACjB,IAAI,CAAC;QACD,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACL,sCAAsC;IAC1C,CAAC;AACL,CAAC;AAED,SAAS,aAAa;IAClB,IAAI,CAAC;QACD,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACL,eAAe;IACnB,CAAC;AACL,CAAC"}
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
3
3
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
4
4
  import { z } from 'zod';
5
- import { COMMANDS, CATEGORIES, refToLocator } from '@playwright-repl/core';
5
+ import { COMMANDS, CATEGORIES } from '@playwright-repl/core';
6
6
  import pkg from '../package.json' with { type: 'json' };
7
7
  import { createBridgeRunner } from './bridge.js';
8
8
  import { createEvaluateRunner } from './evaluate.js';
@@ -11,20 +11,19 @@ import { logStartup, logEvent, logToolCall, logToolResult, logError, LOG_FILE }
11
11
  const argv = process.argv.slice(2);
12
12
  const standalone = argv.includes('--standalone');
13
13
  const headed = argv.includes('--headed');
14
- const snapshotCache = { value: null };
15
14
  // ─── Create runner ───────────────────────────────────────────────────────────
16
15
  let runnerModule;
17
16
  if (standalone) {
18
17
  // Try evaluate mode (extension + JS support), fall back to Engine (keyword only)
19
18
  try {
20
- runnerModule = await createEvaluateRunner(argv, snapshotCache);
19
+ runnerModule = await createEvaluateRunner(argv);
21
20
  }
22
21
  catch {
23
- runnerModule = createStandaloneRunner(headed, snapshotCache);
22
+ runnerModule = createStandaloneRunner(headed);
24
23
  }
25
24
  }
26
25
  else {
27
- runnerModule = await createBridgeRunner(argv, snapshotCache);
26
+ runnerModule = await createBridgeRunner(argv);
28
27
  }
29
28
  const { runner, descriptions } = runnerModule;
30
29
  logStartup(standalone ? 'standalone' : 'bridge', `log → ${LOG_FILE}`);
@@ -46,17 +45,6 @@ server.registerTool('run_command', {
46
45
  logToolResult('run_command', false, 'help', Date.now() - start);
47
46
  return { content: [{ type: 'text', text: `Available commands:\n${lines}\n\nType "help <command>" for details.` }] };
48
47
  }
49
- if (trimmed.startsWith('locator ')) {
50
- const ref = command.trim().slice(8).trim();
51
- if (!snapshotCache.value) {
52
- return { content: [{ type: 'text', text: 'No snapshot cached. Run "snapshot" first.' }], isError: true };
53
- }
54
- const locator = refToLocator(snapshotCache.value.snapshotString, ref);
55
- if (!locator) {
56
- return { content: [{ type: 'text', text: `Ref "${ref}" not found in last snapshot. Run "snapshot" to refresh.` }], isError: true };
57
- }
58
- return { content: [{ type: 'text', text: `js: ${locator.js}\npw: ${locator.pw}` }] };
59
- }
60
48
  if (trimmed.startsWith('help ')) {
61
49
  const cmd = trimmed.slice(5).trim();
62
50
  const info = COMMANDS[cmd];
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Creates an McpServer instance with run_command and run_script tools registered.
3
+ * Extracted into its own module to avoid circular imports between index.ts and http-transport.ts.
4
+ */
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import type { Runner, RunnerDescriptions } from './types.js';
7
+ export declare function createMcpServer(r: Runner, desc: RunnerDescriptions): McpServer;
8
+ //# sourceMappingURL=server-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-factory.d.ts","sourceRoot":"","sources":["../src/server-factory.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAKpE,OAAO,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAE7D,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,GAAG,SAAS,CA2F9E"}
@@ -0,0 +1,95 @@
1
+ /**
2
+ * Creates an McpServer instance with run_command and run_script tools registered.
3
+ * Extracted into its own module to avoid circular imports between index.ts and http-transport.ts.
4
+ */
5
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
6
+ import { z } from 'zod';
7
+ import { COMMANDS, CATEGORIES } from '@playwright-repl/core';
8
+ import pkg from '../package.json' with { type: 'json' };
9
+ import { logEvent, logToolCall, logToolResult, logError } from './logger.js';
10
+ export function createMcpServer(r, desc) {
11
+ const server = new McpServer({ name: 'playwright-repl', version: pkg.version });
12
+ server.registerTool('run_command', {
13
+ description: desc.runCommand,
14
+ inputSchema: {
15
+ command: z.string().describe(desc.runCommandInput),
16
+ },
17
+ }, async ({ command }) => {
18
+ const start = Date.now();
19
+ logToolCall('run_command', { command });
20
+ const trimmed = command.trim().toLowerCase();
21
+ if (trimmed === 'help') {
22
+ const lines = Object.entries(CATEGORIES)
23
+ .map(([cat, cmds]) => ` ${cat}: ${cmds.join(', ')}`)
24
+ .join('\n');
25
+ logToolResult('run_command', false, 'help', Date.now() - start);
26
+ return { content: [{ type: 'text', text: `Available commands:\n${lines}\n\nType "help <command>" for details.` }] };
27
+ }
28
+ if (trimmed.startsWith('help ')) {
29
+ const cmd = trimmed.slice(5).trim();
30
+ const info = COMMANDS[cmd];
31
+ if (!info) {
32
+ return { content: [{ type: 'text', text: `Unknown command: "${cmd}". Type "help" for available commands.` }], isError: true };
33
+ }
34
+ const parts = [`${cmd} — ${info.desc}`];
35
+ if (info.usage)
36
+ parts.push(`Usage: ${info.usage}`);
37
+ if (info.examples?.length) {
38
+ parts.push('Examples:');
39
+ for (const ex of info.examples)
40
+ parts.push(` ${ex}`);
41
+ }
42
+ return { content: [{ type: 'text', text: parts.join('\n') }] };
43
+ }
44
+ try {
45
+ const result = await r.runCommand(command);
46
+ logToolResult('run_command', !!result.isError, result.text, Date.now() - start);
47
+ if (result.image) {
48
+ const [header, data] = result.image.split(',');
49
+ const mimeType = (header.match(/data:(.*);base64/) ?? [])[1] ?? 'image/png';
50
+ return { content: [{ type: 'image', data, mimeType }] };
51
+ }
52
+ return {
53
+ content: [{ type: 'text', text: result.text || 'Done' }],
54
+ isError: result.isError,
55
+ };
56
+ }
57
+ catch (err) {
58
+ logError('run_command', err);
59
+ throw err;
60
+ }
61
+ });
62
+ server.registerTool('run_script', {
63
+ description: desc.runScript,
64
+ inputSchema: desc.scriptOnly
65
+ ? { script: z.string().describe('The .pw keyword script to execute (one command per line)') }
66
+ : {
67
+ script: z.string().describe('The script to execute'),
68
+ language: z.enum(['pw', 'javascript']).describe("'pw' for keyword commands (one per line), 'javascript' for a JS/Playwright block"),
69
+ },
70
+ }, async (params) => {
71
+ const start = Date.now();
72
+ const script = params.script;
73
+ const language = params.language || 'pw';
74
+ logToolCall('run_script', { language, script });
75
+ try {
76
+ const result = await r.runScript(script, language);
77
+ logToolResult('run_script', !!result.isError, result.text, Date.now() - start);
78
+ return {
79
+ content: [{ type: 'text', text: result.text || 'Done' }],
80
+ isError: result.isError,
81
+ };
82
+ }
83
+ catch (err) {
84
+ logError('run_script', err);
85
+ throw err;
86
+ }
87
+ });
88
+ server.server.oninitialized = () => {
89
+ const client = server.server.getClientVersion();
90
+ if (client)
91
+ logEvent(`Client: ${client.name} ${client.version}`);
92
+ };
93
+ return server;
94
+ }
95
+ //# sourceMappingURL=server-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-factory.js","sourceRoot":"","sources":["../src/server-factory.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,12 @@
1
1
  /**
2
2
  * Standalone runner — launches a browser via Engine (in-process Playwright).
3
3
  */
4
- import type { RunnerModule, SnapshotCache } from './types.js';
4
+ import type { RunnerModule } from './types.js';
5
5
  export declare const descriptions: {
6
6
  readonly runCommandInput: "A keyword command ('snapshot', 'goto https://example.com', 'click Submit', 'fill \"Email\" user@example.com')";
7
7
  readonly runCommand: "Run a command in the browser. Supports KEYWORD (.pw) — playwright-repl commands:\n snapshot, goto <url>, click <text>, fill <label> <value>, press <key>,\n verify-text <text>, verify-no-text <text>, screenshot,\n check <label>, select <label> <value>, localstorage-list, localstorage-clear\n\nUpdate commands (click, fill, goto, press, hover, select, check, uncheck, etc.) automatically include a snapshot of the page after the action. You do NOT need to call snapshot separately after these commands.\n\nUse snapshot only for initial exploration or after read-only commands. Use screenshot to visually verify the current state.\n\nIMPORTANT: Before writing .pw commands, run 'help' to get the full list of available commands. Only use commands that appear in the help output. Do not invent commands.";
8
8
  readonly runScript: "Run a multi-line .pw keyword script, returning combined pass/fail results.\nEach line is a .pw keyword command, run sequentially. Lines starting with # are skipped. Stops on first error.\nUseful for replaying a known script without per-step round trips.\n\nIMPORTANT: Only use commands listed by 'help'. Run run_command('help') first if unsure which commands are available.";
9
9
  readonly scriptOnly: true;
10
10
  };
11
- export declare function createStandaloneRunner(headed: boolean, snapshotCache: SnapshotCache): RunnerModule;
11
+ export declare function createStandaloneRunner(headed: boolean): RunnerModule;
12
12
  //# sourceMappingURL=standalone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAI9D,eAAO,MAAM,YAAY;;;;;CAsBf,CAAC;AAEX,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,OAAO,EACf,aAAa,EAAE,aAAa,GAC7B,YAAY,CA8Dd"}
1
+ {"version":3,"file":"standalone.d.ts","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAI/C,eAAO,MAAM,YAAY;;;;;CAsBf,CAAC;AAEX,wBAAgB,sBAAsB,CAClC,MAAM,EAAE,OAAO,GAChB,YAAY,CAoDd"}
@@ -24,7 +24,7 @@ Useful for replaying a known script without per-step round trips.
24
24
  IMPORTANT: Only use commands listed by 'help'. Run run_command('help') first if unsure which commands are available.`,
25
25
  scriptOnly: true,
26
26
  };
27
- export function createStandaloneRunner(headed, snapshotCache) {
27
+ export function createStandaloneRunner(headed) {
28
28
  let engine = null;
29
29
  let starting = null;
30
30
  function ensureEngine() {
@@ -48,15 +48,6 @@ export function createStandaloneRunner(headed, snapshotCache) {
48
48
  const cmdName = args._[0];
49
49
  const resolved = resolveArgs(args);
50
50
  const result = await e.run(resolved);
51
- // Cache snapshot for locator command — strip YAML code fences
52
- if (result.text && !result.isError) {
53
- const snapshotMatch = result.text.match(/### Snapshot\n([\s\S]*?)(?=\n### |$)/);
54
- if (snapshotMatch) {
55
- const raw = snapshotMatch[1].trim();
56
- const yamlBody = raw.replace(/^```(?:yaml)?\n?/, '').replace(/\n?```$/, '');
57
- snapshotCache.value = { url: '', snapshotString: yamlBody };
58
- }
59
- }
60
51
  // Filter verbose Playwright response sections — keep snapshots for MCP
61
52
  if (result.text)
62
53
  result.text = filterResponse(result.text, cmdName, INCLUDE_SNAPSHOT);
@@ -1 +1 @@
1
- {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"standalone.js","sourceRoot":"","sources":["../src/standalone.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -14,10 +14,4 @@ export interface RunnerModule {
14
14
  runner: Runner;
15
15
  descriptions: RunnerDescriptions;
16
16
  }
17
- export interface SnapshotCache {
18
- value: {
19
- url: string;
20
- snapshotString: string;
21
- } | null;
22
- }
23
17
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,MAAM;IACnB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,kBAAkB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,WAAW,aAAa;IAC1B,KAAK,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACzD"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE1D,MAAM,WAAW,MAAM;IACnB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACnD,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAI,GAAG,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACnF;AAED,MAAM,WAAW,kBAAkB;IAC/B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,yEAAyE;IACzE,UAAU,EAAE,OAAO,CAAC;CACvB;AAED,MAAM,WAAW,YAAY;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,kBAAkB,CAAC;CACpC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@playwright-repl/mcp",
3
3
  "description": "MCP server — AI agents control your real Chrome browser",
4
- "version": "0.23.0",
4
+ "version": "0.24.0",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "playwright-repl-mcp": "./dist/index.js"
@@ -17,8 +17,9 @@
17
17
  "@modelcontextprotocol/sdk": "^1.10.0",
18
18
  "@playwright/test": "^1.59.1",
19
19
  "zod": "^3.24.0",
20
- "playwright-repl": "0.23.0",
21
- "@playwright-repl/core": "0.23.0"
20
+ "@playwright-repl/core": "0.24.0",
21
+ "@playwright-repl/browser-extension": "0.24.0",
22
+ "playwright-repl": "0.24.0"
22
23
  },
23
24
  "scripts": {
24
25
  "build": "tsc --build tsconfig.build.json"