playwriter 0.0.103 → 0.1.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.
Files changed (74) hide show
  1. package/dist/bippy.js +1 -1
  2. package/dist/cdp-relay.d.ts.map +1 -1
  3. package/dist/cdp-relay.js +5 -0
  4. package/dist/cdp-relay.js.map +1 -1
  5. package/dist/cli-help.test.d.ts +2 -0
  6. package/dist/cli-help.test.d.ts.map +1 -0
  7. package/dist/cli-help.test.js +31 -0
  8. package/dist/cli-help.test.js.map +1 -0
  9. package/dist/cli.js +13 -5
  10. package/dist/cli.js.map +1 -1
  11. package/dist/executor.d.ts +2 -1
  12. package/dist/executor.d.ts.map +1 -1
  13. package/dist/executor.js +32 -22
  14. package/dist/executor.js.map +1 -1
  15. package/dist/extension/background.js +516 -22
  16. package/dist/extension/manifest.json +4 -2
  17. package/dist/extension-connection.test.d.ts.map +1 -1
  18. package/dist/extension-connection.test.js +79 -0
  19. package/dist/extension-connection.test.js.map +1 -1
  20. package/dist/ghost-cursor-client.js +170 -83
  21. package/dist/{recording-ghost-cursor.d.ts → ghost-cursor-controller.d.ts} +15 -10
  22. package/dist/ghost-cursor-controller.d.ts.map +1 -0
  23. package/dist/ghost-cursor-controller.js +98 -0
  24. package/dist/ghost-cursor-controller.js.map +1 -0
  25. package/dist/ghost-cursor.d.ts.map +1 -1
  26. package/dist/ghost-cursor.js +42 -26
  27. package/dist/ghost-cursor.js.map +1 -1
  28. package/dist/on-mouse-action.test.js +25 -0
  29. package/dist/on-mouse-action.test.js.map +1 -1
  30. package/dist/popup-relocation.test.d.ts +7 -0
  31. package/dist/popup-relocation.test.d.ts.map +1 -0
  32. package/dist/popup-relocation.test.js +139 -0
  33. package/dist/popup-relocation.test.js.map +1 -0
  34. package/dist/prompt.md +13 -12
  35. package/dist/readability.js +1 -1
  36. package/dist/relay-core.test.d.ts.map +1 -1
  37. package/dist/relay-core.test.js +101 -1
  38. package/dist/relay-core.test.js.map +1 -1
  39. package/dist/relay-state.d.ts +1 -0
  40. package/dist/relay-state.d.ts.map +1 -1
  41. package/dist/relay-state.js.map +1 -1
  42. package/dist/screen-recording.d.ts +2 -2
  43. package/dist/screen-recording.d.ts.map +1 -1
  44. package/dist/screen-recording.js +0 -3
  45. package/dist/screen-recording.js.map +1 -1
  46. package/dist/selector-generator.js +1 -1
  47. package/package.json +6 -6
  48. package/src/aria-snapshots/github-interactive.txt +5 -3
  49. package/src/aria-snapshots/github-raw.txt +8 -5
  50. package/src/aria-snapshots/hackernews-interactive.txt +241 -242
  51. package/src/aria-snapshots/hackernews-raw.txt +267 -268
  52. package/src/aria-snapshots/prosemirror-interactive.txt +3 -1
  53. package/src/aria-snapshots/prosemirror-raw.txt +4 -1
  54. package/src/assets/aria-labels-hacker-news.png +0 -0
  55. package/src/assets/aria-labels-old-reddit.png +0 -0
  56. package/src/cdp-relay.ts +5 -0
  57. package/src/cli-help.test.ts +41 -0
  58. package/src/cli.ts +14 -9
  59. package/src/executor.ts +33 -22
  60. package/src/extension-connection.test.ts +88 -0
  61. package/src/ghost-cursor-client.ts +221 -96
  62. package/src/{recording-ghost-cursor.ts → ghost-cursor-controller.ts} +50 -34
  63. package/src/ghost-cursor.ts +54 -41
  64. package/src/on-mouse-action.test.ts +30 -0
  65. package/src/popup-relocation.test.ts +163 -0
  66. package/src/relay-core.test.ts +117 -0
  67. package/src/relay-state.ts +1 -1
  68. package/src/screen-recording.ts +3 -6
  69. package/src/skill.md +13 -12
  70. package/src/snapshots/shadcn-ui-accessibility-full.md +174 -181
  71. package/src/snapshots/shadcn-ui-accessibility-interactive.md +6 -14
  72. package/dist/recording-ghost-cursor.d.ts.map +0 -1
  73. package/dist/recording-ghost-cursor.js +0 -79
  74. package/dist/recording-ghost-cursor.js.map +0 -1
@@ -1,34 +1,39 @@
1
1
  /**
2
- * Encapsulates ghost cursor lifecycle for recording sessions.
3
- * Keeps onMouseAction chaining/restoration isolated from executor logic.
2
+ * Always-on ghost cursor controller (Node side).
3
+ *
4
+ * Wires page.onMouseAction → applyGhostCursorMouseAction for every page.
5
+ * Chains with any pre-existing onMouseAction callback. Cursor-apply is
6
+ * fire-and-forget via a per-page queue so it does not block action completion.
4
7
  */
5
8
  import type { BrowserContext, Page } from '@xmorse/playwright-core';
6
9
  import { type GhostCursorClientOptions } from './ghost-cursor.js';
7
- interface RecordingGhostCursorLogger {
10
+ interface GhostCursorLogger {
8
11
  error: (...args: unknown[]) => void;
9
12
  }
10
13
  interface RecordingTargetOptions {
11
14
  page?: Page;
12
15
  sessionId?: string;
13
16
  }
14
- export declare class RecordingGhostCursorController {
17
+ export declare class GhostCursorController {
15
18
  private readonly previousMouseActionByPage;
16
19
  private readonly cursorApplyQueueByPage;
20
+ private readonly attachedPages;
17
21
  private readonly logger;
18
22
  constructor(options: {
19
- logger: RecordingGhostCursorLogger;
23
+ logger: GhostCursorLogger;
20
24
  });
21
25
  resolveRecordingTargetPage(options: {
22
26
  context: BrowserContext;
23
27
  defaultPage: Page;
24
28
  target?: RecordingTargetOptions;
25
29
  }): Page;
26
- enableForRecording(options: {
30
+ /** Wire onMouseAction. Idempotent. */
31
+ attachToPage(options: {
27
32
  page: Page;
28
- }): Promise<void>;
29
- disableForRecording(options: {
33
+ }): void;
34
+ detachFromPage(options: {
30
35
  page: Page;
31
- }): Promise<void>;
36
+ }): void;
32
37
  show(options: {
33
38
  page: Page;
34
39
  cursorOptions?: GhostCursorClientOptions;
@@ -38,4 +43,4 @@ export declare class RecordingGhostCursorController {
38
43
  }): Promise<void>;
39
44
  }
40
45
  export {};
41
- //# sourceMappingURL=recording-ghost-cursor.d.ts.map
46
+ //# sourceMappingURL=ghost-cursor-controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost-cursor-controller.d.ts","sourceRoot":"","sources":["../src/ghost-cursor-controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AACnE,OAAO,EAIL,KAAK,wBAAwB,EAC9B,MAAM,mBAAmB,CAAA;AAE1B,UAAU,iBAAiB;IACzB,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAA;CACpC;AAED,UAAU,sBAAsB;IAC9B,IAAI,CAAC,EAAE,IAAI,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,yBAAyB,CAA6C;IACvF,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAqC;IAC5E,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAsB;IACpD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;gBAE9B,OAAO,EAAE;QAAE,MAAM,EAAE,iBAAiB,CAAA;KAAE;IAIlD,0BAA0B,CAAC,OAAO,EAAE;QAClC,OAAO,EAAE,cAAc,CAAA;QACvB,WAAW,EAAE,IAAI,CAAA;QACjB,MAAM,CAAC,EAAE,sBAAsB,CAAA;KAChC,GAAG,IAAI;IAoBR,sCAAsC;IACtC,YAAY,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI;IAwC3C,cAAc,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,IAAI;IAWvC,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,aAAa,CAAC,EAAE,wBAAwB,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAStF,IAAI,CAAC,OAAO,EAAE;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAQnD"}
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Always-on ghost cursor controller (Node side).
3
+ *
4
+ * Wires page.onMouseAction → applyGhostCursorMouseAction for every page.
5
+ * Chains with any pre-existing onMouseAction callback. Cursor-apply is
6
+ * fire-and-forget via a per-page queue so it does not block action completion.
7
+ */
8
+ import { applyGhostCursorMouseAction, disableGhostCursor, enableGhostCursor, } from './ghost-cursor.js';
9
+ export class GhostCursorController {
10
+ previousMouseActionByPage = new WeakMap();
11
+ cursorApplyQueueByPage = new WeakMap();
12
+ attachedPages = new WeakSet();
13
+ logger;
14
+ constructor(options) {
15
+ this.logger = options.logger;
16
+ }
17
+ resolveRecordingTargetPage(options) {
18
+ const { context, defaultPage, target } = options;
19
+ if (target?.page) {
20
+ return target.page;
21
+ }
22
+ if (target?.sessionId) {
23
+ const pageForSession = context.pages().find((candidatePage) => {
24
+ return candidatePage.sessionId() === target.sessionId;
25
+ });
26
+ if (pageForSession) {
27
+ return pageForSession;
28
+ }
29
+ }
30
+ return defaultPage;
31
+ }
32
+ /** Wire onMouseAction. Idempotent. */
33
+ attachToPage(options) {
34
+ const { page } = options;
35
+ if (this.attachedPages.has(page)) {
36
+ return;
37
+ }
38
+ this.attachedPages.add(page);
39
+ if (!this.previousMouseActionByPage.has(page)) {
40
+ this.previousMouseActionByPage.set(page, page.onMouseAction);
41
+ }
42
+ const previousMouseAction = this.previousMouseActionByPage.get(page);
43
+ page.onMouseAction = async (event) => {
44
+ // Ghost cursor must never crash the main Playwright action (click, move, etc).
45
+ // Wrap the entire cursor logic in try/catch so errors stay cosmetic.
46
+ try {
47
+ const pendingCursorApply = this.cursorApplyQueueByPage.get(page) || Promise.resolve();
48
+ const nextCursorApply = pendingCursorApply
49
+ .then(async () => {
50
+ await applyGhostCursorMouseAction({ page, event });
51
+ })
52
+ .catch((error) => {
53
+ if (page.isClosed()) {
54
+ return;
55
+ }
56
+ this.logger.error('[playwriter] Failed to apply ghost cursor action', error);
57
+ });
58
+ this.cursorApplyQueueByPage.set(page, nextCursorApply);
59
+ }
60
+ catch (error) {
61
+ this.logger.error('[playwriter] Ghost cursor onMouseAction error (non-fatal)', error);
62
+ }
63
+ if (!previousMouseAction) {
64
+ return;
65
+ }
66
+ await previousMouseAction(event);
67
+ };
68
+ }
69
+ detachFromPage(options) {
70
+ const { page } = options;
71
+ if (!this.attachedPages.has(page)) {
72
+ return;
73
+ }
74
+ this.attachedPages.delete(page);
75
+ page.onMouseAction = this.previousMouseActionByPage.get(page) ?? null;
76
+ this.previousMouseActionByPage.delete(page);
77
+ this.cursorApplyQueueByPage.delete(page);
78
+ }
79
+ async show(options) {
80
+ try {
81
+ const { page, cursorOptions } = options;
82
+ await enableGhostCursor({ page, cursorOptions });
83
+ }
84
+ catch {
85
+ // Non-fatal — page may be closing or navigating.
86
+ }
87
+ }
88
+ async hide(options) {
89
+ try {
90
+ const { page } = options;
91
+ await disableGhostCursor({ page });
92
+ }
93
+ catch {
94
+ // Non-fatal — page may be closing or navigating.
95
+ }
96
+ }
97
+ }
98
+ //# sourceMappingURL=ghost-cursor-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ghost-cursor-controller.js","sourceRoot":"","sources":["../src/ghost-cursor-controller.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EACL,2BAA2B,EAC3B,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,mBAAmB,CAAA;AAW1B,MAAM,OAAO,qBAAqB;IACf,yBAAyB,GAAG,IAAI,OAAO,EAA+B,CAAA;IACtE,sBAAsB,GAAG,IAAI,OAAO,EAAuB,CAAA;IAC3D,aAAa,GAAG,IAAI,OAAO,EAAQ,CAAA;IACnC,MAAM,CAAmB;IAE1C,YAAY,OAAsC;QAChD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;IAC9B,CAAC;IAED,0BAA0B,CAAC,OAI1B;QACC,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAA;QAEhD,IAAI,MAAM,EAAE,IAAI,EAAE,CAAC;YACjB,OAAO,MAAM,CAAC,IAAI,CAAA;QACpB,CAAC;QAED,IAAI,MAAM,EAAE,SAAS,EAAE,CAAC;YACtB,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,EAAE;gBAC5D,OAAO,aAAa,CAAC,SAAS,EAAE,KAAK,MAAM,CAAC,SAAS,CAAA;YACvD,CAAC,CAAC,CAAA;YAEF,IAAI,cAAc,EAAE,CAAC;gBACnB,OAAO,cAAc,CAAA;YACvB,CAAC;QACH,CAAC;QAED,OAAO,WAAW,CAAA;IACpB,CAAC;IAED,sCAAsC;IACtC,YAAY,CAAC,OAAuB;QAClC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QAExB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAE5B,IAAI,CAAC,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9C,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;QAC9D,CAAC;QACD,MAAM,mBAAmB,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAEpE,IAAI,CAAC,aAAa,GAAG,KAAK,EAAE,KAAK,EAAE,EAAE;YACnC,+EAA+E;YAC/E,qEAAqE;YACrE,IAAI,CAAC;gBACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAA;gBACrF,MAAM,eAAe,GAAG,kBAAkB;qBACvC,IAAI,CAAC,KAAK,IAAI,EAAE;oBACf,MAAM,2BAA2B,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;gBACpD,CAAC,CAAC;qBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;oBACf,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;wBACpB,OAAM;oBACR,CAAC;oBACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,kDAAkD,EAAE,KAAK,CAAC,CAAA;gBAC9E,CAAC,CAAC,CAAA;gBACJ,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,IAAI,EAAE,eAAe,CAAC,CAAA;YACxD,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2DAA2D,EAAE,KAAK,CAAC,CAAA;YACvF,CAAC;YAED,IAAI,CAAC,mBAAmB,EAAE,CAAC;gBACzB,OAAM;YACR,CAAC;YACD,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC,CAAA;IACH,CAAC;IAED,cAAc,CAAC,OAAuB;QACpC,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;QACxB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,OAAM;QACR,CAAC;QACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC/B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAA;QACrE,IAAI,CAAC,yBAAyB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAC3C,IAAI,CAAC,sBAAsB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAiE;QAC1E,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,OAAO,CAAA;YACvC,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAA;QAClD,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,OAAuB;QAChC,IAAI,CAAC;YACH,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAA;YACxB,MAAM,kBAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;QACpC,CAAC;QAAC,MAAM,CAAC;YACP,iDAAiD;QACnD,CAAC;IACH,CAAC;CACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ghost-cursor.d.ts","sourceRoot":"","sources":["../src/ghost-cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAErE,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,cAAc,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAmCD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,IAAI,EAAE,IAAI,CAAA;IACV,aAAa,CAAC,EAAE,wBAAwB,CAAA;CACzC,GAAG,OAAO,CAAC,IAAI,CAAC,CAWhB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAM/E;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,gBAAgB,CAAA;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4BhB"}
1
+ {"version":3,"file":"ghost-cursor.d.ts","sourceRoot":"","sources":["../src/ghost-cursor.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAErE,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,cAAc,CAAA;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAmCD,wBAAsB,iBAAiB,CAAC,OAAO,EAAE;IAC/C,IAAI,EAAE,IAAI,CAAA;IACV,aAAa,CAAC,EAAE,wBAAwB,CAAA;CACzC,GAAG,OAAO,CAAC,IAAI,CAAC,CAehB;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,IAAI,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAU/E;AAED,wBAAsB,2BAA2B,CAAC,OAAO,EAAE;IACzD,IAAI,EAAE,IAAI,CAAA;IACV,KAAK,EAAE,gBAAgB,CAAA;CACxB,GAAG,OAAO,CAAC,IAAI,CAAC,CAiChB"}
@@ -27,37 +27,53 @@ async function ensureGhostCursorInjected(options) {
27
27
  await page.evaluate(code);
28
28
  }
29
29
  export async function enableGhostCursor(options) {
30
- const { page, cursorOptions } = options;
31
- await ensureGhostCursorInjected({ page });
32
- await page.evaluate(({ optionsFromNode }) => {
33
- const api = globalThis.__playwriterGhostCursor;
34
- api?.enable(optionsFromNode);
35
- }, { optionsFromNode: cursorOptions });
30
+ try {
31
+ const { page, cursorOptions } = options;
32
+ await ensureGhostCursorInjected({ page });
33
+ await page.evaluate(({ optionsFromNode }) => {
34
+ const api = globalThis.__playwriterGhostCursor;
35
+ api?.enable(optionsFromNode);
36
+ }, { optionsFromNode: cursorOptions });
37
+ }
38
+ catch {
39
+ // Non-fatal — page may be closed or navigating.
40
+ }
36
41
  }
37
42
  export async function disableGhostCursor(options) {
38
- const { page } = options;
39
- await page.evaluate(() => {
40
- const api = globalThis.__playwriterGhostCursor;
41
- api?.disable();
42
- });
43
+ try {
44
+ const { page } = options;
45
+ await page.evaluate(() => {
46
+ const api = globalThis.__playwriterGhostCursor;
47
+ api?.disable();
48
+ });
49
+ }
50
+ catch {
51
+ // Non-fatal — page may be closed or navigating.
52
+ }
43
53
  }
44
54
  export async function applyGhostCursorMouseAction(options) {
45
- const { page, event } = options;
46
- const applied = await page.evaluate(({ serializedEvent }) => {
47
- const api = globalThis.__playwriterGhostCursor;
48
- if (!api) {
49
- return false;
55
+ // Never throw the cursor is cosmetic and must not break the caller's action.
56
+ try {
57
+ const { page, event } = options;
58
+ const applied = await page.evaluate(({ serializedEvent }) => {
59
+ const api = globalThis.__playwriterGhostCursor;
60
+ if (!api) {
61
+ return false;
62
+ }
63
+ api.applyMouseAction(serializedEvent);
64
+ return true;
65
+ }, { serializedEvent: event });
66
+ if (applied) {
67
+ return;
50
68
  }
51
- api.applyMouseAction(serializedEvent);
52
- return true;
53
- }, { serializedEvent: event });
54
- if (applied) {
55
- return;
69
+ await ensureGhostCursorInjected({ page });
70
+ await page.evaluate(({ serializedEvent }) => {
71
+ const api = globalThis.__playwriterGhostCursor;
72
+ api?.applyMouseAction(serializedEvent);
73
+ }, { serializedEvent: event });
74
+ }
75
+ catch {
76
+ // Swallow — page may be closed, navigating, or debugger detached.
56
77
  }
57
- await ensureGhostCursorInjected({ page });
58
- await page.evaluate(({ serializedEvent }) => {
59
- const api = globalThis.__playwriterGhostCursor;
60
- api?.applyMouseAction(serializedEvent);
61
- }, { serializedEvent: event });
62
78
  }
63
79
  //# sourceMappingURL=ghost-cursor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ghost-cursor.js","sourceRoot":"","sources":["../src/ghost-cursor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ghost-cursor.js","sourceRoot":"","sources":["../src/ghost-cursor.ts"],"names":[],"mappings":"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"}
@@ -151,5 +151,30 @@ describe('onMouseAction callback', () => {
151
151
  expect(events).toHaveLength(0);
152
152
  await safeCloseCDPBrowser(directBrowser);
153
153
  }, 30000);
154
+ // Always-on ghost cursor: the Chrome extension injects the ghost-cursor-client.js
155
+ // bundle into MAIN world the moment it attaches a tab (see attachTab in
156
+ // extension/src/background.ts). This test verifies the cursor element exists on
157
+ // a freshly-attached tab WITHOUT any explicit enableGhostCursor call.
158
+ it('should inject ghost cursor into attached tabs without explicit enable', async () => {
159
+ const browserContext = testCtx.browserContext;
160
+ const serviceWorker = await getExtensionServiceWorker(browserContext);
161
+ const page = await browserContext.newPage();
162
+ await page.goto('data:text/html,<html><body><h1>always-on-cursor</h1></body></html>');
163
+ await page.bringToFront();
164
+ await serviceWorker.evaluate(async () => {
165
+ await globalThis.toggleExtensionForActiveTab();
166
+ });
167
+ await new Promise((r) => {
168
+ setTimeout(r, 300);
169
+ });
170
+ const cursorPresent = await page.evaluate(() => {
171
+ return {
172
+ apiPresent: Boolean(globalThis.__playwriterGhostCursor),
173
+ elementPresent: Boolean(document.getElementById('__playwriter_ghost_cursor__')),
174
+ };
175
+ });
176
+ expect(cursorPresent.apiPresent).toBe(true);
177
+ expect(cursorPresent.elementPresent).toBe(true);
178
+ }, 30000);
154
179
  });
155
180
  //# sourceMappingURL=on-mouse-action.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"on-mouse-action.test.js","sourceRoot":"","sources":["../src/on-mouse-action.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"on-mouse-action.test.js","sourceRoot":"","sources":["../src/on-mouse-action.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Tests for auto-relocation of popup windows to tabs.
3
+ * - Connected source tab → popup gets relocated + auto-attached.
4
+ * - No source tab connected → popup is left alone.
5
+ */
6
+ import './test-declarations.js';
7
+ //# sourceMappingURL=popup-relocation.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-relocation.test.d.ts","sourceRoot":"","sources":["../src/popup-relocation.test.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAaH,OAAO,wBAAwB,CAAA"}
@@ -0,0 +1,139 @@
1
+ /**
2
+ * Tests for auto-relocation of popup windows to tabs.
3
+ * - Connected source tab → popup gets relocated + auto-attached.
4
+ * - No source tab connected → popup is left alone.
5
+ */
6
+ import { createMCPClient } from './mcp-client.js';
7
+ import { describe, it, expect, beforeAll, afterAll } from 'vitest';
8
+ import { setupTestContext, cleanupTestContext, getExtensionServiceWorker, createSimpleServer, js, } from './test-utils.js';
9
+ import './test-declarations.js';
10
+ const TEST_PORT = 19995;
11
+ describe('Popup window relocation', () => {
12
+ let client;
13
+ let cleanup = null;
14
+ let testCtx = null;
15
+ let htmlServer = null;
16
+ beforeAll(async () => {
17
+ testCtx = await setupTestContext({
18
+ port: TEST_PORT,
19
+ tempDirPrefix: 'pw-popup-test-',
20
+ toggleExtension: true,
21
+ });
22
+ const result = await createMCPClient({ port: TEST_PORT });
23
+ client = result.client;
24
+ cleanup = result.cleanup;
25
+ htmlServer = await createSimpleServer({
26
+ routes: {
27
+ '/opener': `<!doctype html>
28
+ <html>
29
+ <body>
30
+ <button id="open-popup" onclick="window.open('/target', '', 'width=400,height=300,popup=1')">Open popup</button>
31
+ </body>
32
+ </html>`,
33
+ '/target': `<!doctype html>
34
+ <html>
35
+ <body>
36
+ <h1 id="target-heading">Popup target page</h1>
37
+ </body>
38
+ </html>`,
39
+ },
40
+ });
41
+ }, 600000);
42
+ afterAll(async () => {
43
+ if (htmlServer) {
44
+ await htmlServer.close();
45
+ }
46
+ await cleanupTestContext(testCtx, cleanup);
47
+ cleanup = null;
48
+ testCtx = null;
49
+ });
50
+ it('relocates popup window into main browser context as a tab', async () => {
51
+ if (!htmlServer)
52
+ throw new Error('html server not initialized');
53
+ const browserContext = testCtx.browserContext;
54
+ const serviceWorker = await getExtensionServiceWorker(browserContext);
55
+ await client.callTool({
56
+ name: 'execute',
57
+ arguments: {
58
+ code: js `
59
+ state.popupTestPage = context.pages().find((p) => p.url() === 'about:blank') ?? (await context.newPage());
60
+ await state.popupTestPage.goto('${htmlServer.baseUrl}/opener', { waitUntil: 'domcontentloaded' });
61
+ return { url: state.popupTestPage.url(), pagesBefore: context.pages().length };
62
+ `,
63
+ },
64
+ });
65
+ const clickResult = await client.callTool({
66
+ name: 'execute',
67
+ arguments: {
68
+ code: js `
69
+ await state.popupTestPage.click('#open-popup');
70
+ await state.popupTestPage.waitForTimeout(1500);
71
+ return { pagesAfter: context.pages().length, allUrls: context.pages().map((p) => p.url()) };
72
+ `,
73
+ },
74
+ });
75
+ const clickOutput = clickResult.content[0].text;
76
+ expect(clickOutput).toContain('/target');
77
+ expect(clickResult.isError).not.toBe(true);
78
+ expect(clickOutput).toContain('[WARNING] New page opened from current page');
79
+ expect(clickOutput).not.toContain('Popup window detected');
80
+ expect(clickOutput).not.toContain('cannot be controlled by playwriter');
81
+ const windowTypes = await serviceWorker.evaluate(async () => {
82
+ const windows = await chrome.windows.getAll({ populate: false });
83
+ return windows.map((w) => w.type);
84
+ });
85
+ expect(windowTypes).not.toContain('popup');
86
+ expect(windowTypes).toContain('normal');
87
+ await client.callTool({
88
+ name: 'execute',
89
+ arguments: {
90
+ code: js `
91
+ const targetPage = context.pages().find((p) => p.url().endsWith('/target'));
92
+ if (targetPage) { await targetPage.close(); }
93
+ await state.popupTestPage.close();
94
+ delete state.popupTestPage;
95
+ `,
96
+ },
97
+ });
98
+ }, 60000);
99
+ it('leaves popup windows alone when no Playwriter tab is connected', async () => {
100
+ if (!htmlServer)
101
+ throw new Error('html server not initialized');
102
+ const browserContext = testCtx.browserContext;
103
+ const serviceWorker = await getExtensionServiceWorker(browserContext);
104
+ await serviceWorker.evaluate(async () => {
105
+ await globalThis.disconnectEverything();
106
+ });
107
+ await new Promise((r) => {
108
+ setTimeout(r, 200);
109
+ });
110
+ // Drive the browser directly via browserContext (not MCP/extension) so
111
+ // the opener tab stays unconnected.
112
+ const unconnectedPage = await browserContext.newPage();
113
+ await unconnectedPage.goto(`${htmlServer.baseUrl}/opener`, { waitUntil: 'domcontentloaded' });
114
+ await unconnectedPage.bringToFront();
115
+ await unconnectedPage.click('#open-popup');
116
+ // If relocation DID happen, the popup window would be gone by now.
117
+ await new Promise((r) => {
118
+ setTimeout(r, 1500);
119
+ });
120
+ const windowTypes = await serviceWorker.evaluate(async () => {
121
+ const windows = await chrome.windows.getAll({ populate: false });
122
+ return windows.map((w) => w.type);
123
+ });
124
+ expect(windowTypes).toContain('popup');
125
+ const windowIdsToClose = await serviceWorker.evaluate(async () => {
126
+ const windows = await chrome.windows.getAll({ populate: false });
127
+ return windows.filter((w) => w.type === 'popup').map((w) => w.id);
128
+ });
129
+ for (const windowId of windowIdsToClose) {
130
+ if (windowId !== undefined) {
131
+ await serviceWorker.evaluate(async (id) => {
132
+ await chrome.windows.remove(id);
133
+ }, windowId);
134
+ }
135
+ }
136
+ await unconnectedPage.close();
137
+ }, 60000);
138
+ });
139
+ //# sourceMappingURL=popup-relocation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"popup-relocation.test.js","sourceRoot":"","sources":["../src/popup-relocation.test.ts"],"names":[],"mappings":"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"}
package/dist/prompt.md CHANGED
@@ -55,7 +55,7 @@ You can collaborate with the user - they can help with captchas, difficult eleme
55
55
  - **Clean up listeners**: call `state.page.removeAllListeners()` at end of message to prevent leaks
56
56
  - **CDP sessions**: use `getCDPSession({ page: state.page })` not `state.page.context().newCDPSession()` - NEVER use `newCDPSession()` method, it doesn't work through playwriter relay
57
57
  - **Wait for load**: use `state.page.waitForLoadState('domcontentloaded')` not `state.page.waitForEvent('load')` - waitForEvent times out if already loaded
58
- - **Minimize timeouts**: prefer proper waits (`waitForSelector`, `waitForPageLoad`) over `state.page.waitForTimeout()`. Short timeouts (1-2s) are acceptable for non-deterministic events like popups, animations, or tab opens where no specific selector is available
58
+ - **Minimize timeouts**: prefer proper waits (`waitForSelector`, `waitForPageLoad`) over `state.page.waitForTimeout()`. Short timeouts (1-2s) are acceptable for non-deterministic events like animations, tab opens, or async UI updates where no specific selector is available
59
59
  - **Snapshot before screenshot**: always use `snapshot()` first to understand page state (text-based, fast, cheap). Only use `screenshot` when you specifically need visual/spatial information. Never take a screenshot just to check if a page loaded or to read text content — snapshot gives you that instantly without burning image tokens
60
60
  - **Snapshot replaces page.evaluate() for inspection**: do NOT write `page.evaluate()` calls to manually query class names, bounding boxes, child counts, or visibility flags. `snapshot()` already shows every interactive element with its text, role, and a ready-to-use locator. If you catch yourself writing `document.querySelector` or `getBoundingClientRect` inside evaluate — stop and use `snapshot()` instead. Reserve `page.evaluate()` for actions that modify page state (e.g., `localStorage.clear()`, scroll manipulation) or extract non-DOM data (e.g., `window.__CONFIG__`)
61
61
 
@@ -196,18 +196,15 @@ await snapshot({ page: state.page, search: /cookie|consent|accept/i }).then(cons
196
196
  ```
197
197
 
198
198
  **10. Login buttons that open popups**
199
- Playwriter cannot control popup windows. Use cmd+click to open in a new tab instead:
199
+ Popup windows (`window.open` with features, OAuth buttons) are auto-relocated to tabs in the main window by the Playwriter extension. The new tab appears in `context.pages()` and is fully controllable. You will receive a `[WARNING] New page opened from current page (index N, initial url: ...)` message pointing to the new tab — the `initial url` may be `about:blank` for blank-then-scripted popups, so check `context.pages()[N].url()` for the final URL:
200
200
 
201
201
  ```js
202
- await state.page.locator('button:has-text("Login with Google")').click({ modifiers: ['Meta'] })
203
- await state.page.waitForTimeout(2000)
202
+ await state.page.locator('button:has-text("Login with Google")').click()
203
+ await state.page.waitForTimeout(1000)
204
204
 
205
- // Verify new tab opened - last page should be the login page
205
+ // New tab is the last page in the context
206
206
  const pages = context.pages()
207
207
  const loginPage = pages[pages.length - 1]
208
- if (loginPage.url() === state.page.url()) {
209
- throw new Error('Cmd+click did not open new tab - login may have opened as popup')
210
- }
211
208
 
212
209
  // Complete login flow in loginPage, cookies are shared with original page
213
210
  await loginPage.locator('[data-email]').first().click()
@@ -389,6 +386,10 @@ state.targetPage = pages[0]
389
386
  context.pages().map((p) => p.url())
390
387
  ```
391
388
 
389
+ **Popup windows become tabs automatically:**
390
+
391
+ The extension intercepts Chrome popup windows (`window.open(url, '', 'width=...')`, OAuth login flows) and relocates them into the main window as regular tabs. You don't need cmd+click or `{ modifiers: ['Meta'] }` to avoid popups. When a page opens another, you receive a `[WARNING] New page opened from current page (index N, initial url: ...)` and can access it via `context.pages()[N]`.
392
+
392
393
  ## navigation
393
394
 
394
395
  **Use `domcontentloaded`** for `page.goto()`:
@@ -680,11 +681,11 @@ state.recordingResult = await recording.stop({ page: state.page })
680
681
  // Other: recording.isRecording({ page }), recording.cancel({ page })
681
682
  ```
682
683
 
683
- **ghostCursor.show / ghostCursor.hide** - show/hide cursor overlay for screenshots and demos:
684
+ **ghostCursor.show / ghostCursor.hide** - the ghost cursor overlay is always on: the extension injects it on every Playwriter-attached tab and it stays visible at the last spot Playwright clicked or moved. These methods only matter if you want to change the cursor style or temporarily hide it:
684
685
 
685
686
  ```js
686
- await ghostCursor.show({ page: state.page, style: 'minimal' }) // 'minimal', 'dot', 'screenstudio'
687
- await ghostCursor.hide({ page: state.page })
687
+ await ghostCursor.show({ page: state.page, style: 'screenstudio' }) // 'minimal' (default), 'dot', 'screenstudio'
688
+ await ghostCursor.hide({ page: state.page }) // hide until next show() or hard navigation
688
689
  ```
689
690
 
690
691
  **createDemoVideo** - speeds up idle sections (time between execute() calls) while keeping interactions at normal speed. Requires `ffmpeg`/`ffprobe`. Timestamps are tracked automatically during recording and returned by `recording.stop()`. **Timeout**: can take 60–120+ seconds, always pass `--timeout 120000` or higher.
@@ -811,7 +812,7 @@ await state.page.locator('text=Login').dblclick()
811
812
  await state.page
812
813
  .locator('a')
813
814
  .first()
814
- .click({ modifiers: ['Meta'] }) // cmd+click opens new tab
815
+ .click({ modifiers: ['Meta'] }) // cmd+click opens link in new background tab
815
816
 
816
817
  // By coordinates (when locators aren't available, e.g. canvas, maps, custom widgets)
817
818
  await state.page.mouse.click(450, 320) // left click
@@ -1668,7 +1668,7 @@
1668
1668
  };
1669
1669
  });
1670
1670
 
1671
- // dist/_readability-entry-50607-1775383054512.js
1671
+ // dist/_readability-entry-39342-1776333719875.js
1672
1672
  var import_readability = __toESM(require_readability(), 1);
1673
1673
  globalThis.__readability = { Readability: import_readability.Readability, isProbablyReaderable: import_readability.isProbablyReaderable };
1674
1674
  })();
@@ -1 +1 @@
1
- {"version":3,"file":"relay-core.test.d.ts","sourceRoot":"","sources":["../src/relay-core.test.ts"],"names":[],"mappings":"AAgBA,OAAO,wBAAwB,CAAA"}
1
+ {"version":3,"file":"relay-core.test.d.ts","sourceRoot":"","sources":["../src/relay-core.test.ts"],"names":[],"mappings":"AAiBA,OAAO,wBAAwB,CAAA"}