@epsilon-asi/actors 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (112) hide show
  1. package/package.json +6 -1
  2. package/.ai/generators/_template.ts +0 -37
  3. package/.ai/generators/abstract.ts +0 -24
  4. package/.ai/generators/actor-task-form-filler.ts +0 -140
  5. package/.ai/generators/actor-task.ts +0 -122
  6. package/.ai/generators/auth-core.ts +0 -126
  7. package/.ai/generators/browser-runtime.ts +0 -114
  8. package/.ai/generators/cli-command.ts +0 -96
  9. package/.ai/generators/core-framework.ts +0 -80
  10. package/.ai/generators/docs.ts +0 -92
  11. package/.ai/generators/error-logging.ts +0 -102
  12. package/.ai/generators/extraction-helper.ts +0 -96
  13. package/.ai/generators/interaction-behavior.ts +0 -129
  14. package/.ai/generators/site-actor.ts +0 -125
  15. package/.ai/generators/site-login-flow.ts +0 -117
  16. package/.ai/generators/unit-test.ts +0 -109
  17. package/.ai/workflows/_template.ts +0 -20
  18. package/.ai/workflows/starter.ts +0 -20
  19. package/ai-gen.config.ts +0 -67
  20. package/src/auth/AuthStateDetector.ts +0 -18
  21. package/src/auth/CredentialsProvider.ts +0 -48
  22. package/src/auth/LoginFlow.ts +0 -332
  23. package/src/auth/LoginFlow.types.ts +0 -141
  24. package/src/auth/SessionStore.ts +0 -21
  25. package/src/auth/index.ts +0 -5
  26. package/src/browser/BrowserFactory.ts +0 -253
  27. package/src/browser/BrowserSession.ts +0 -50
  28. package/src/browser/PuppeteerLike.ts +0 -65
  29. package/src/browser/RuntimeConfig.ts +0 -152
  30. package/src/browser/index.ts +0 -5
  31. package/src/browser/profileValidation.ts +0 -73
  32. package/src/cli/run.ts +0 -112
  33. package/src/core/Actor.ts +0 -167
  34. package/src/core/ActorContext.ts +0 -34
  35. package/src/core/ActorRegistry.ts +0 -26
  36. package/src/core/ActorRunner.ts +0 -240
  37. package/src/core/defineActor.ts +0 -5
  38. package/src/core/index.ts +0 -5
  39. package/src/errors/AuthError.ts +0 -7
  40. package/src/errors/AutomationError.ts +0 -26
  41. package/src/errors/ConfigError.ts +0 -7
  42. package/src/errors/ExtractionError.ts +0 -7
  43. package/src/errors/NavigationError.ts +0 -7
  44. package/src/errors/SelectorError.ts +0 -10
  45. package/src/errors/index.ts +0 -6
  46. package/src/extraction/Extractor.ts +0 -65
  47. package/src/extraction/Pagination.ts +0 -47
  48. package/src/extraction/index.ts +0 -2
  49. package/src/index.ts +0 -9
  50. package/src/interaction/FieldClearer.ts +0 -73
  51. package/src/interaction/Forms.ts +0 -27
  52. package/src/interaction/GhostCursorAdapter.ts +0 -79
  53. package/src/interaction/HumanInteractor.ts +0 -32
  54. package/src/interaction/HumanTyping.ts +0 -157
  55. package/src/interaction/NativePuppeteerInteractor.ts +0 -68
  56. package/src/interaction/Navigation.ts +0 -37
  57. package/src/interaction/PageAdapter.ts +0 -86
  58. package/src/interaction/Waits.ts +0 -5
  59. package/src/interaction/index.ts +0 -9
  60. package/src/logging/ConsoleLogger.ts +0 -44
  61. package/src/logging/Logger.ts +0 -15
  62. package/src/logging/MemoryLogger.ts +0 -34
  63. package/src/logging/NullLogger.ts +0 -8
  64. package/src/logging/index.ts +0 -4
  65. package/src/sites/example/example.actor.ts +0 -53
  66. package/src/sites/example/example.selectors.ts +0 -17
  67. package/src/sites/example/example.types.ts +0 -18
  68. package/src/sites/example/index.ts +0 -3
  69. package/src/sites/index.ts +0 -3
  70. package/src/sites/myvistage-com/index.ts +0 -3
  71. package/src/sites/myvistage-com/login-action-list.json +0 -349
  72. package/src/sites/myvistage-com/myvistage-com.actor.ts +0 -50
  73. package/src/sites/myvistage-com/myvistage-com.selectors.ts +0 -14
  74. package/src/sites/myvistage-com/myvistage-com.types.ts +0 -18
  75. package/src/sites/myvistage-com/post-comment-action.json +0 -81
  76. package/src/sites/upwork-com/index.ts +0 -6
  77. package/src/sites/upwork-com/upwork-com.actor.ts +0 -97
  78. package/src/sites/upwork-com/upwork-com.runner.ts +0 -17
  79. package/src/sites/upwork-com/upwork-com.selectors.ts +0 -10
  80. package/src/sites/upwork-com/upwork-com.types.ts +0 -102
  81. package/src/sites/upwork-com/upwork-com.util.ts +0 -41
  82. package/src/utils/delay.ts +0 -4
  83. package/src/utils/index.ts +0 -5
  84. package/src/utils/invariant.ts +0 -7
  85. package/src/utils/redact.ts +0 -53
  86. package/src/utils/retry.ts +0 -31
  87. package/src/utils/url.ts +0 -7
  88. package/tests/fixtures/FakeCredentialsProvider.ts +0 -12
  89. package/tests/fixtures/FakeCursor.ts +0 -48
  90. package/tests/fixtures/FakePage.ts +0 -266
  91. package/tests/fixtures/makeContext.ts +0 -76
  92. package/tests/unit/auth/AuthStateDetector.test.ts +0 -80
  93. package/tests/unit/auth/LoginFlow.test.ts +0 -296
  94. package/tests/unit/browser/BrowserFactory.test.ts +0 -370
  95. package/tests/unit/core/ActorRunner.test.ts +0 -370
  96. package/tests/unit/core/defineActor.test.ts +0 -112
  97. package/tests/unit/extraction/Extractor.test.ts +0 -48
  98. package/tests/unit/extraction/Pagination.test.ts +0 -54
  99. package/tests/unit/interaction/FieldClearer.test.ts +0 -29
  100. package/tests/unit/interaction/Forms.test.ts +0 -35
  101. package/tests/unit/interaction/GhostCursorAdapter.test.ts +0 -68
  102. package/tests/unit/interaction/HumanTyping.test.ts +0 -54
  103. package/tests/unit/interaction/NativePuppeteerInteractor.test.ts +0 -22
  104. package/tests/unit/interaction/PageAdapter.test.ts +0 -25
  105. package/tests/unit/logging/redact.test.ts +0 -36
  106. package/tests/unit/sites/myvistage-com.actor.test.ts +0 -19
  107. package/tests/unit/sites/myvistage-com.login.test.ts +0 -22
  108. package/tests/unit/sites/myvistage-com.postComment.test.ts +0 -70
  109. package/tests/unit/sites/upwork-com.login.test.ts +0 -52
  110. package/tsconfig.build.json +0 -9
  111. package/tsconfig.json +0 -22
  112. package/vitest.config.ts +0 -12
@@ -1,86 +0,0 @@
1
- import type { WaitForOptions, WaitForSelectorOptions } from 'puppeteer-core';
2
- import { SelectorError } from '../errors/SelectorError.js';
3
- import type { PageLike } from '../browser/PuppeteerLike.js';
4
-
5
- export interface PageAdapter {
6
- goto(url: string, options?: WaitForOptions): Promise<void>;
7
- waitFor(selector: string, options?: WaitForSelectorOptions): Promise<void>;
8
- waitForNavigation(options?: WaitForOptions): Promise<void>;
9
- exists(selector: string, options?: WaitForSelectorOptions): Promise<boolean>;
10
- text(selector: string): Promise<string>;
11
- textAll(selector: string): Promise<string[]>;
12
- attr(selector: string, name: string): Promise<string | null>;
13
- html(): Promise<string>;
14
- url(): string;
15
- title(): Promise<string>;
16
- raw(): PageLike;
17
- }
18
-
19
- export class PuppeteerPageAdapter implements PageAdapter {
20
- constructor(private readonly page: PageLike) {}
21
-
22
- async goto(url: string, options: WaitForOptions = { waitUntil: 'domcontentloaded' }): Promise<void> {
23
- await this.page.goto(url, options);
24
- }
25
-
26
- async waitFor(selector: string, options?: WaitForSelectorOptions): Promise<void> {
27
- await this.page.waitForSelector(selector, options);
28
- }
29
-
30
- async waitForNavigation(options?: WaitForOptions): Promise<void> {
31
- await this.page.waitForNavigation(options);
32
- }
33
-
34
- async exists(selector: string, options: WaitForSelectorOptions = { timeout: 1_000 }): Promise<boolean> {
35
- try {
36
- await this.page.waitForSelector(selector, options);
37
- return true;
38
- } catch {
39
- return false;
40
- }
41
- }
42
-
43
- async text(selector: string): Promise<string> {
44
- try {
45
- const value = await this.page.$eval(selector, element => element.textContent ?? '');
46
- return normalizeWhitespace(value);
47
- } catch (error) {
48
- throw new SelectorError(`Could not read text from selector: ${selector}`, selector, { cause: error });
49
- }
50
- }
51
-
52
- async textAll(selector: string): Promise<string[]> {
53
- const values = await this.page.$$eval(selector, elements =>
54
- elements.map(element => element.textContent ?? '')
55
- );
56
- return values.map(normalizeWhitespace).filter(value => value.length > 0);
57
- }
58
-
59
- async attr(selector: string, name: string): Promise<string | null> {
60
- try {
61
- return await this.page.$eval(selector, (element, attrName) => element.getAttribute(String(attrName)), name);
62
- } catch (error) {
63
- throw new SelectorError(`Could not read attribute ${name} from selector: ${selector}`, selector, { cause: error });
64
- }
65
- }
66
-
67
- async html(): Promise<string> {
68
- return this.page.content();
69
- }
70
-
71
- url(): string {
72
- return this.page.url();
73
- }
74
-
75
- title(): Promise<string> {
76
- return this.page.title();
77
- }
78
-
79
- raw(): PageLike {
80
- return this.page;
81
- }
82
- }
83
-
84
- export function normalizeWhitespace(value: string): string {
85
- return value.replace(/\s+/g, ' ').trim();
86
- }
@@ -1,5 +0,0 @@
1
- import type { PageAdapter } from './PageAdapter.js';
2
-
3
- export async function waitUntilVisible(page: PageAdapter, selector: string, timeoutMs = 15_000): Promise<void> {
4
- await page.waitFor(selector, { timeout: timeoutMs, visible: true });
5
- }
@@ -1,9 +0,0 @@
1
- export * from './HumanTyping.js';
2
- export * from './FieldClearer.js';
3
- export * from './Forms.js';
4
- export * from './GhostCursorAdapter.js';
5
- export * from './HumanInteractor.js';
6
- export * from './NativePuppeteerInteractor.js';
7
- export * from './Navigation.js';
8
- export * from './PageAdapter.js';
9
- export * from './Waits.js';
@@ -1,44 +0,0 @@
1
- import { redact } from '../utils/redact.js';
2
- import type { Logger, LogLevel } from './Logger.js';
3
-
4
- export class ConsoleLogger implements Logger {
5
- constructor(private readonly minimumLevel: LogLevel = 'info') {}
6
-
7
- debug(message: string, meta?: Record<string, unknown>): void {
8
- this.write('debug', message, meta);
9
- }
10
-
11
- info(message: string, meta?: Record<string, unknown>): void {
12
- this.write('info', message, meta);
13
- }
14
-
15
- warn(message: string, meta?: Record<string, unknown>): void {
16
- this.write('warn', message, meta);
17
- }
18
-
19
- error(message: string, meta?: Record<string, unknown>): void {
20
- this.write('error', message, meta);
21
- }
22
-
23
- private write(level: LogLevel, message: string, meta?: Record<string, unknown>): void {
24
- if (!this.shouldWrite(level)) return;
25
-
26
- const safeMeta = meta === undefined ? undefined : redact(meta);
27
- const payload = safeMeta === undefined ? '' : ` ${JSON.stringify(safeMeta)}`;
28
- const line = `[${new Date().toISOString()}] ${level.toUpperCase()} ${message}${payload}`;
29
-
30
- if (level === 'error') console.error(line);
31
- else if (level === 'warn') console.warn(line);
32
- else console.log(line);
33
- }
34
-
35
- private shouldWrite(level: LogLevel): boolean {
36
- const weights: Record<LogLevel, number> = {
37
- debug: 0,
38
- info: 1,
39
- warn: 2,
40
- error: 3
41
- };
42
- return weights[level] >= weights[this.minimumLevel];
43
- }
44
- }
@@ -1,15 +0,0 @@
1
- export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
2
-
3
- export interface LogRecord {
4
- level: LogLevel;
5
- message: string;
6
- meta?: Record<string, unknown>;
7
- timestamp: string;
8
- }
9
-
10
- export interface Logger {
11
- debug(message: string, meta?: Record<string, unknown>): void;
12
- info(message: string, meta?: Record<string, unknown>): void;
13
- warn(message: string, meta?: Record<string, unknown>): void;
14
- error(message: string, meta?: Record<string, unknown>): void;
15
- }
@@ -1,34 +0,0 @@
1
- import { redact } from '../utils/redact.js';
2
- import type { Logger, LogLevel, LogRecord } from './Logger.js';
3
-
4
- export class MemoryLogger implements Logger {
5
- readonly records: LogRecord[] = [];
6
-
7
- debug(message: string, meta?: Record<string, unknown>): void {
8
- this.write('debug', message, meta);
9
- }
10
-
11
- info(message: string, meta?: Record<string, unknown>): void {
12
- this.write('info', message, meta);
13
- }
14
-
15
- warn(message: string, meta?: Record<string, unknown>): void {
16
- this.write('warn', message, meta);
17
- }
18
-
19
- error(message: string, meta?: Record<string, unknown>): void {
20
- this.write('error', message, meta);
21
- }
22
-
23
- private write(level: LogLevel, message: string, meta?: Record<string, unknown>): void {
24
- const record: LogRecord = {
25
- level,
26
- message,
27
- timestamp: new Date().toISOString()
28
- };
29
- if (meta !== undefined) {
30
- record.meta = redact(meta);
31
- }
32
- this.records.push(record);
33
- }
34
- }
@@ -1,8 +0,0 @@
1
- import type { Logger } from './Logger.js';
2
-
3
- export class NullLogger implements Logger {
4
- debug(): void {}
5
- info(): void {}
6
- warn(): void {}
7
- error(): void {}
8
- }
@@ -1,4 +0,0 @@
1
- export * from './ConsoleLogger.js';
2
- export * from './Logger.js';
3
- export * from './MemoryLogger.js';
4
- export * from './NullLogger.js';
@@ -1,53 +0,0 @@
1
- import { defineLoginFlow } from '../../auth/LoginFlow.types.js';
2
- import { defineActor } from '../../core/defineActor.js';
3
- import { defineFormFillerTask } from '../../core/Actor.js';
4
- import { exampleSelectors } from './example.selectors.js';
5
- import type {
6
- DashboardRow,
7
- ScrapeDashboardInput,
8
- SubmitContactFormInput,
9
- SubmitContactFormOutput
10
- } from './example.types.js';
11
-
12
- export const exampleActor = defineActor({
13
- id: 'example',
14
- baseUrl: 'https://example.com',
15
- auth: defineLoginFlow({
16
- loginUrl: '/login',
17
- selectors: exampleSelectors.login,
18
- credentials: { id: 'example' },
19
- behavior: {
20
- authCheckUrl: '/',
21
- submitCausesNavigation: true,
22
- loggedInTimeoutMs: 3_000,
23
- clearFieldBeforeTyping: true,
24
- typing: {
25
- targetWordsPerMinute: 65,
26
- intervalJitterMs: 18
27
- }
28
- }
29
- }),
30
- tasks: {
31
- scrapeDashboard: async (context, input: ScrapeDashboardInput = {}): Promise<DashboardRow[]> => {
32
- await context.nav.goto('/dashboard');
33
- const rows = await context.extract.textList(exampleSelectors.dashboardRows);
34
- return rows.slice(0, input.limit ?? rows.length).map(text => ({ text }));
35
- },
36
- submitContactForm: defineFormFillerTask<SubmitContactFormInput, SubmitContactFormOutput>({
37
- url: '/contact',
38
- fields: [
39
- { selector: exampleSelectors.contactForm.name, inputKey: 'name' },
40
- { selector: exampleSelectors.contactForm.email, inputKey: 'email' },
41
- { selector: exampleSelectors.contactForm.company, inputKey: 'company', required: false },
42
- { selector: exampleSelectors.contactForm.message, inputKey: 'message' }
43
- ],
44
- submit: {
45
- selector: exampleSelectors.contactForm.submit,
46
- waitForNavigation: true
47
- },
48
- onComplete: (_context, input) => ({
49
- submittedEmail: input.email
50
- })
51
- })
52
- }
53
- });
@@ -1,17 +0,0 @@
1
- export const exampleSelectors = {
2
- login: {
3
- username: '#email',
4
- password: '#password',
5
- submit: 'button[type="submit"]',
6
- loggedInSignal: '[data-testid="account-menu"]',
7
- errorMessage: '[data-testid="login-error"]'
8
- },
9
- dashboardRows: '[data-testid="dashboard-row"]',
10
- contactForm: {
11
- name: '#name',
12
- email: '#email',
13
- company: '#company',
14
- message: '#message',
15
- submit: 'button[type="submit"]'
16
- }
17
- } as const;
@@ -1,18 +0,0 @@
1
- export interface ScrapeDashboardInput {
2
- limit?: number;
3
- }
4
-
5
- export interface DashboardRow {
6
- text: string;
7
- }
8
-
9
- export interface SubmitContactFormInput extends Record<string, string| undefined> {
10
- name: string;
11
- email: string;
12
- company?: string;
13
- message: string;
14
- }
15
-
16
- export interface SubmitContactFormOutput {
17
- submittedEmail: string;
18
- }
@@ -1,3 +0,0 @@
1
- export * from './example.actor.js';
2
- export * from './example.selectors.js';
3
- export * from './example.types.js';
@@ -1,3 +0,0 @@
1
- export * from './example/index.js';
2
- export * from './myvistage-com/index.js';
3
- export * from './upwork-com/index.js';
@@ -1,3 +0,0 @@
1
- export * from './myvistage-com.actor.js';
2
- export * from './myvistage-com.selectors.js';
3
- export * from './myvistage-com.types.js';
@@ -1,349 +0,0 @@
1
- [
2
- {
3
- "actionType": "click",
4
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
5
- "id": "evt_1779455531515_6wy31i7k",
6
- "input": null,
7
- "metadata": {
8
- "ariaLabel": null,
9
- "button": 0,
10
- "buttons": 0,
11
- "clientX": 803,
12
- "clientY": 812,
13
- "id": null,
14
- "inputType": "text",
15
- "label": null,
16
- "name": "username",
17
- "pageX": 803,
18
- "pageY": 812,
19
- "role": null,
20
- "sensitive": false,
21
- "tagName": "input"
22
- },
23
- "selector": "[name=\"username\"]",
24
- "sessionId": "session_1779455530258_v14hspgc",
25
- "tagName": "input",
26
- "text": null,
27
- "timestamp": "2026-05-22T13:12:11.514Z",
28
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
29
- },
30
- {
31
- "actionType": "input",
32
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
33
- "id": "evt_1779455534236_cgkqak02",
34
- "input": null,
35
- "metadata": {
36
- "ariaLabel": null,
37
- "id": null,
38
- "inputType": "text",
39
- "label": null,
40
- "name": "username",
41
- "role": null,
42
- "sensitive": false,
43
- "tagName": "input",
44
- "valueLength": null
45
- },
46
- "selector": "[name=\"username\"]",
47
- "sessionId": "session_1779455530258_v14hspgc",
48
- "tagName": "input",
49
- "text": null,
50
- "timestamp": "2026-05-22T13:12:13.882Z",
51
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
52
- },
53
- {
54
- "actionType": "click",
55
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
56
- "id": "evt_1779455535599_75xa0rlb",
57
- "input": null,
58
- "metadata": {
59
- "ariaLabel": null,
60
- "button": 0,
61
- "buttons": 0,
62
- "clientX": 744,
63
- "clientY": 879,
64
- "id": null,
65
- "inputType": "password",
66
- "label": null,
67
- "name": "password",
68
- "pageX": 744,
69
- "pageY": 879,
70
- "role": null,
71
- "sensitive": true,
72
- "tagName": "input"
73
- },
74
- "selector": "[name=\"password\"]",
75
- "sessionId": "session_1779455530258_v14hspgc",
76
- "tagName": "input",
77
- "text": null,
78
- "timestamp": "2026-05-22T13:12:15.598Z",
79
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
80
- },
81
- {
82
- "actionType": "input",
83
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
84
- "id": "evt_1779455538099_w9ie18ax",
85
- "input": "[REDACTED_PASSWORD]",
86
- "metadata": {
87
- "ariaLabel": null,
88
- "id": null,
89
- "inputType": "password",
90
- "label": null,
91
- "name": "password",
92
- "role": null,
93
- "sensitive": true,
94
- "tagName": "input",
95
- "valueLength": 19
96
- },
97
- "selector": "[name=\"password\"]",
98
- "sessionId": "session_1779455530258_v14hspgc",
99
- "tagName": "input",
100
- "text": null,
101
- "timestamp": "2026-05-22T13:12:17.746Z",
102
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
103
- },
104
- {
105
- "actionType": "click",
106
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
107
- "id": "evt_1779455541057_1he6q8pn",
108
- "input": null,
109
- "metadata": {
110
- "ariaLabel": null,
111
- "button": 0,
112
- "buttons": 0,
113
- "clientX": 573,
114
- "clientY": 987,
115
- "id": "remember",
116
- "inputType": "checkbox",
117
- "label": "Remember Me",
118
- "name": "remember",
119
- "pageX": 573,
120
- "pageY": 987,
121
- "role": null,
122
- "sensitive": false,
123
- "tagName": "input"
124
- },
125
- "selector": "#remember",
126
- "sessionId": "session_1779455530258_v14hspgc",
127
- "tagName": "input",
128
- "text": null,
129
- "timestamp": "2026-05-22T13:12:21.055Z",
130
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
131
- },
132
- {
133
- "actionType": "change",
134
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
135
- "id": "evt_1779455541066_39y4uucs",
136
- "input": {
137
- "checked": true,
138
- "value": "on"
139
- },
140
- "metadata": {
141
- "ariaLabel": null,
142
- "id": "remember",
143
- "inputType": "checkbox",
144
- "label": "Remember Me",
145
- "name": "remember",
146
- "role": null,
147
- "sensitive": false,
148
- "tagName": "input"
149
- },
150
- "selector": "#remember",
151
- "sessionId": "session_1779455530258_v14hspgc",
152
- "tagName": "input",
153
- "text": null,
154
- "timestamp": "2026-05-22T13:12:21.065Z",
155
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
156
- },
157
- {
158
- "actionType": "click",
159
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
160
- "id": "evt_1779455547807_eubpz6ir",
161
- "input": null,
162
- "metadata": {
163
- "ariaLabel": null,
164
- "button": 0,
165
- "buttons": 0,
166
- "clientX": 914,
167
- "clientY": 424,
168
- "id": "mv3login",
169
- "inputType": null,
170
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
171
- "name": null,
172
- "pageX": 914,
173
- "pageY": 424,
174
- "role": null,
175
- "sensitive": false,
176
- "tagName": "section"
177
- },
178
- "selector": "#mv3login",
179
- "sessionId": "session_1779455530258_v14hspgc",
180
- "tagName": "section",
181
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
182
- "timestamp": "2026-05-22T13:12:27.806Z",
183
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
184
- },
185
- {
186
- "actionType": "click",
187
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
188
- "id": "evt_1779455551655_qfq2ca4a",
189
- "input": null,
190
- "metadata": {
191
- "ariaLabel": null,
192
- "button": 0,
193
- "buttons": 0,
194
- "clientX": 22,
195
- "clientY": 20,
196
- "id": "mv3login",
197
- "inputType": null,
198
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
199
- "name": null,
200
- "pageX": 22,
201
- "pageY": 20,
202
- "role": null,
203
- "sensitive": false,
204
- "tagName": "section"
205
- },
206
- "selector": "#mv3login",
207
- "sessionId": "session_1779455530258_v14hspgc",
208
- "tagName": "section",
209
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
210
- "timestamp": "2026-05-22T13:12:31.654Z",
211
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
212
- },
213
- {
214
- "actionType": "click",
215
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
216
- "id": "evt_1779455552923_9h3cf6w9",
217
- "input": null,
218
- "metadata": {
219
- "ariaLabel": null,
220
- "button": 0,
221
- "buttons": 0,
222
- "clientX": 1349,
223
- "clientY": 1523,
224
- "id": "mv3login",
225
- "inputType": null,
226
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
227
- "name": null,
228
- "pageX": 1349,
229
- "pageY": 1523,
230
- "role": null,
231
- "sensitive": false,
232
- "tagName": "section"
233
- },
234
- "selector": "#mv3login",
235
- "sessionId": "session_1779455530258_v14hspgc",
236
- "tagName": "section",
237
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
238
- "timestamp": "2026-05-22T13:12:32.922Z",
239
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
240
- },
241
- {
242
- "actionType": "click",
243
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
244
- "id": "evt_1779455553503_7rnjxvsu",
245
- "input": null,
246
- "metadata": {
247
- "ariaLabel": null,
248
- "button": 0,
249
- "buttons": 0,
250
- "clientX": 1357,
251
- "clientY": 431,
252
- "id": "mv3login",
253
- "inputType": null,
254
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
255
- "name": null,
256
- "pageX": 1357,
257
- "pageY": 431,
258
- "role": null,
259
- "sensitive": false,
260
- "tagName": "section"
261
- },
262
- "selector": "#mv3login",
263
- "sessionId": "session_1779455530258_v14hspgc",
264
- "tagName": "section",
265
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
266
- "timestamp": "2026-05-22T13:12:33.501Z",
267
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
268
- },
269
- {
270
- "actionType": "click",
271
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
272
- "id": "evt_1779455554199_six37yxq",
273
- "input": null,
274
- "metadata": {
275
- "ariaLabel": null,
276
- "button": 0,
277
- "buttons": 0,
278
- "clientX": 128,
279
- "clientY": 1767,
280
- "id": "mv3login",
281
- "inputType": null,
282
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
283
- "name": null,
284
- "pageX": 128,
285
- "pageY": 1767,
286
- "role": null,
287
- "sensitive": false,
288
- "tagName": "section"
289
- },
290
- "selector": "#mv3login",
291
- "sessionId": "session_1779455530258_v14hspgc",
292
- "tagName": "section",
293
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
294
- "timestamp": "2026-05-22T13:12:34.197Z",
295
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
296
- },
297
- {
298
- "actionType": "click",
299
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
300
- "id": "evt_1779455555501_qqkigiv2",
301
- "input": null,
302
- "metadata": {
303
- "ariaLabel": null,
304
- "button": 0,
305
- "buttons": 0,
306
- "clientX": 788,
307
- "clientY": 938,
308
- "id": null,
309
- "inputType": "submit",
310
- "label": "Sign In",
311
- "name": null,
312
- "pageX": 788,
313
- "pageY": 938,
314
- "role": null,
315
- "sensitive": false,
316
- "tagName": "button"
317
- },
318
- "selector": "div:nth-of-type(4) > button:nth-of-type(1)",
319
- "sessionId": "session_1779455530258_v14hspgc",
320
- "tagName": "button",
321
- "text": "Sign In",
322
- "timestamp": "2026-05-22T13:12:35.499Z",
323
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
324
- },
325
- {
326
- "actionType": "submit",
327
- "frameUrl": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1",
328
- "id": "evt_1779455555507_cqah7sb6",
329
- "input": null,
330
- "metadata": {
331
- "action": null,
332
- "ariaLabel": null,
333
- "id": "form-login",
334
- "inputType": null,
335
- "label": "Username or email address Password Sign In Remember Me Forgot Username or Passwo…",
336
- "method": "post",
337
- "name": "login",
338
- "role": null,
339
- "sensitive": false,
340
- "tagName": "form"
341
- },
342
- "selector": "#form-login",
343
- "sessionId": "session_1779455530258_v14hspgc",
344
- "tagName": "form",
345
- "text": "Username or email address Password Sign In Remember Me Forgot Username or Password? OR Sign in with Apple Sign in with G…",
346
- "timestamp": "2026-05-22T13:12:35.506Z",
347
- "url": "https://myvistage.com/?redirect_to=https%3A%2F%2Fmyvistage.com%2F%3Floggedout%3Dtrue%26wp_lang%3Den_US&reauth=1"
348
- }
349
- ]