playwright-mimic 0.1.0 → 0.1.2

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 (118) hide show
  1. package/README.md +695 -446
  2. package/dist/agentic/agent.d.ts +106 -0
  3. package/dist/agentic/agent.d.ts.map +1 -0
  4. package/dist/agentic/agent.js +528 -0
  5. package/dist/agentic/agent.js.map +1 -0
  6. package/dist/agentic/index.d.ts +13 -0
  7. package/dist/agentic/index.d.ts.map +1 -0
  8. package/dist/agentic/index.js +12 -0
  9. package/dist/agentic/index.js.map +1 -0
  10. package/dist/agentic/planner.d.ts +41 -0
  11. package/dist/agentic/planner.d.ts.map +1 -0
  12. package/dist/agentic/planner.js +136 -0
  13. package/dist/agentic/planner.js.map +1 -0
  14. package/dist/agentic/react.d.ts +35 -0
  15. package/dist/agentic/react.d.ts.map +1 -0
  16. package/dist/agentic/react.js +170 -0
  17. package/dist/agentic/react.js.map +1 -0
  18. package/dist/agentic/recovery.d.ts +55 -0
  19. package/dist/agentic/recovery.d.ts.map +1 -0
  20. package/dist/agentic/recovery.js +200 -0
  21. package/dist/agentic/recovery.js.map +1 -0
  22. package/dist/agentic/reflection.d.ts +40 -0
  23. package/dist/agentic/reflection.d.ts.map +1 -0
  24. package/dist/agentic/reflection.js +142 -0
  25. package/dist/agentic/reflection.js.map +1 -0
  26. package/dist/agentic/types.d.ts +177 -0
  27. package/dist/agentic/types.d.ts.map +1 -0
  28. package/dist/agentic/types.js +8 -0
  29. package/dist/agentic/types.js.map +1 -0
  30. package/dist/agentic/wait.d.ts +50 -0
  31. package/dist/agentic/wait.d.ts.map +1 -0
  32. package/dist/agentic/wait.js +140 -0
  33. package/dist/agentic/wait.js.map +1 -0
  34. package/dist/agentic-mimic.d.ts +56 -0
  35. package/dist/agentic-mimic.d.ts.map +1 -0
  36. package/dist/agentic-mimic.js +98 -0
  37. package/dist/agentic-mimic.js.map +1 -0
  38. package/dist/index.d.ts +8 -8
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +9 -9
  41. package/dist/index.js.map +1 -1
  42. package/dist/mimic/actionType.d.ts +7 -0
  43. package/dist/mimic/actionType.d.ts.map +1 -0
  44. package/dist/mimic/actionType.js +44 -0
  45. package/dist/mimic/actionType.js.map +1 -0
  46. package/dist/mimic/annotations.d.ts +21 -0
  47. package/dist/mimic/annotations.d.ts.map +1 -0
  48. package/dist/mimic/annotations.js +36 -0
  49. package/dist/mimic/annotations.js.map +1 -0
  50. package/dist/mimic/cli.d.ts +15 -0
  51. package/dist/mimic/cli.d.ts.map +1 -0
  52. package/dist/mimic/cli.js +17 -0
  53. package/dist/mimic/cli.js.map +1 -0
  54. package/dist/mimic/click.d.ts +39 -0
  55. package/dist/mimic/click.d.ts.map +1 -0
  56. package/dist/mimic/click.js +348 -0
  57. package/dist/mimic/click.js.map +1 -0
  58. package/dist/mimic/forms.d.ts +52 -0
  59. package/dist/mimic/forms.d.ts.map +1 -0
  60. package/dist/mimic/forms.js +511 -0
  61. package/dist/mimic/forms.js.map +1 -0
  62. package/dist/mimic/markers.d.ts +133 -0
  63. package/dist/mimic/markers.d.ts.map +1 -0
  64. package/dist/mimic/markers.js +589 -0
  65. package/dist/mimic/markers.js.map +1 -0
  66. package/dist/mimic/navigation.d.ts +19 -0
  67. package/dist/mimic/navigation.d.ts.map +1 -0
  68. package/dist/mimic/navigation.js +136 -0
  69. package/dist/mimic/navigation.js.map +1 -0
  70. package/dist/mimic/playwrightCodeGenerator.d.ts +55 -0
  71. package/dist/mimic/playwrightCodeGenerator.d.ts.map +1 -0
  72. package/dist/mimic/playwrightCodeGenerator.js +270 -0
  73. package/dist/mimic/playwrightCodeGenerator.js.map +1 -0
  74. package/dist/mimic/replay.d.ts +21 -0
  75. package/dist/mimic/replay.d.ts.map +1 -0
  76. package/dist/mimic/replay.js +142 -0
  77. package/dist/mimic/replay.js.map +1 -0
  78. package/dist/mimic/schema/action.d.ts +315 -0
  79. package/dist/mimic/schema/action.d.ts.map +1 -0
  80. package/dist/mimic/schema/action.js +186 -0
  81. package/dist/mimic/schema/action.js.map +1 -0
  82. package/dist/mimic/selector.d.ts +143 -0
  83. package/dist/mimic/selector.d.ts.map +1 -0
  84. package/dist/mimic/selector.js +1515 -0
  85. package/dist/mimic/selector.js.map +1 -0
  86. package/dist/mimic/selectorDescriptor.d.ts +25 -0
  87. package/dist/mimic/selectorDescriptor.d.ts.map +1 -0
  88. package/dist/mimic/selectorDescriptor.js +32 -0
  89. package/dist/mimic/selectorDescriptor.js.map +1 -0
  90. package/dist/mimic/selectorSerialization.d.ts +18 -0
  91. package/dist/mimic/selectorSerialization.d.ts.map +1 -0
  92. package/dist/mimic/selectorSerialization.js +32 -0
  93. package/dist/mimic/selectorSerialization.js.map +1 -0
  94. package/dist/mimic/selectorTypes.d.ts +122 -0
  95. package/dist/mimic/selectorTypes.d.ts.map +1 -0
  96. package/dist/mimic/selectorTypes.js +2 -0
  97. package/dist/mimic/selectorTypes.js.map +1 -0
  98. package/dist/mimic/selectorUtils.d.ts +52 -0
  99. package/dist/mimic/selectorUtils.d.ts.map +1 -0
  100. package/dist/mimic/selectorUtils.js +251 -0
  101. package/dist/mimic/selectorUtils.js.map +1 -0
  102. package/dist/mimic/storage.d.ts +110 -0
  103. package/dist/mimic/storage.d.ts.map +1 -0
  104. package/dist/mimic/storage.js +409 -0
  105. package/dist/mimic/storage.js.map +1 -0
  106. package/dist/mimic/types.d.ts +85 -0
  107. package/dist/mimic/types.d.ts.map +1 -0
  108. package/dist/mimic/types.js +7 -0
  109. package/dist/mimic/types.js.map +1 -0
  110. package/dist/mimic.d.ts +29 -4
  111. package/dist/mimic.d.ts.map +1 -1
  112. package/dist/mimic.js +530 -32
  113. package/dist/mimic.js.map +1 -1
  114. package/dist/mimicry.d.ts +4 -4
  115. package/dist/mimicry.d.ts.map +1 -1
  116. package/dist/mimicry.js +22 -13
  117. package/dist/mimicry.js.map +1 -1
  118. package/package.json +30 -6
@@ -0,0 +1,106 @@
1
+ /**
2
+ * Agentic Browser Automation Agent
3
+ *
4
+ * Main agent class that orchestrates planning, reasoning, acting, and reflection.
5
+ * Implements a goal-oriented, autonomous browser automation system.
6
+ */
7
+ import type { AgentState, AgentConfig, PlanningResult } from './types.js';
8
+ /**
9
+ * Agentic Browser Automation Agent
10
+ *
11
+ * An autonomous agent that can plan, reason, act, and reflect to achieve
12
+ * browser automation goals.
13
+ */
14
+ export declare class Agent {
15
+ private config;
16
+ private state;
17
+ private plan?;
18
+ private currentStepIndex;
19
+ private actionRetryCount;
20
+ /**
21
+ * Create a new agent instance
22
+ *
23
+ * @param config - Agent configuration
24
+ */
25
+ constructor(config: AgentConfig);
26
+ /**
27
+ * Initialize the agent with the current page state
28
+ *
29
+ * @returns Promise that resolves when initialization is complete
30
+ */
31
+ initialize(): Promise<void>;
32
+ /**
33
+ * Execute a goal-oriented task
34
+ *
35
+ * The agent will plan, reason, act, and reflect to achieve the goal.
36
+ *
37
+ * @param goal - High-level goal to achieve
38
+ * @returns Promise that resolves when the goal is achieved or execution completes
39
+ */
40
+ executeGoal(goal: string): Promise<{
41
+ success: boolean;
42
+ actionsTaken: number;
43
+ goalAchieved: boolean;
44
+ finalState: AgentState;
45
+ }>;
46
+ /**
47
+ * Update the agent's state from the current page
48
+ *
49
+ * @returns Promise that resolves when state is updated
50
+ */
51
+ private updateState;
52
+ /**
53
+ * Execute a decided action
54
+ *
55
+ * @param action - The action to execute
56
+ * @param _reasoning - The reasoning result that led to this action
57
+ * @returns Promise resolving to whether the action was successful
58
+ */
59
+ private executeAction;
60
+ /**
61
+ * Execute a navigation action
62
+ */
63
+ private executeNavigation;
64
+ /**
65
+ * Execute a click action
66
+ */
67
+ private executeClick;
68
+ /**
69
+ * Execute a form action
70
+ */
71
+ private executeForm;
72
+ /**
73
+ * Execute an assertion action
74
+ */
75
+ private executeAssertion;
76
+ /**
77
+ * Execute a wait action with smart loading detection
78
+ */
79
+ private executeWait;
80
+ /**
81
+ * Automatically wait after actions that might trigger loading
82
+ * This is called after click, form, and navigation actions
83
+ */
84
+ private autoWaitAfterAction;
85
+ /**
86
+ * Execute a retry action
87
+ */
88
+ private executeRetry;
89
+ /**
90
+ * Check if the goal has been achieved
91
+ */
92
+ private checkGoalAchievement;
93
+ /**
94
+ * Record an error
95
+ */
96
+ private recordError;
97
+ /**
98
+ * Get the current agent state
99
+ */
100
+ getState(): AgentState;
101
+ /**
102
+ * Get the current plan
103
+ */
104
+ getPlan(): PlanningResult | undefined;
105
+ }
106
+ //# sourceMappingURL=agent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.d.ts","sourceRoot":"","sources":["../../src/agentic/agent.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EAEX,cAAc,EAGf,MAAM,YAAY,CAAC;AAgBpB;;;;;GAKG;AACH,qBAAa,KAAK;IAChB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,IAAI,CAAC,CAAiB;IAC9B,OAAO,CAAC,gBAAgB,CAAa;IACrC,OAAO,CAAC,gBAAgB,CAAkC;IAE1D;;;;OAIG;gBACS,MAAM,EAAE,WAAW;IA8B/B;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;;;;;;OAOG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QACvC,OAAO,EAAE,OAAO,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,OAAO,CAAC;QACtB,UAAU,EAAE,UAAU,CAAC;KACxB,CAAC;IA+KF;;;;OAIG;YACW,WAAW;IAiBzB;;;;;;OAMG;YACW,aAAa;IAuF3B;;OAEG;YACW,iBAAiB;IA+B/B;;OAEG;YACW,YAAY;IA+C1B;;OAEG;YACW,WAAW;IAyCzB;;OAEG;YACW,gBAAgB;IAqB9B;;OAEG;YACW,WAAW;IA8CzB;;;OAGG;YACW,mBAAmB;IAgBjC;;OAEG;YACW,YAAY;IAc1B;;OAEG;YACW,oBAAoB;IAOlC;;OAEG;IACH,OAAO,CAAC,WAAW;IAUnB;;OAEG;IACH,QAAQ,IAAI,UAAU;IAItB;;OAEG;IACH,OAAO,IAAI,cAAc,GAAG,SAAS;CAGtC"}
@@ -0,0 +1,528 @@
1
+ /**
2
+ * Agentic Browser Automation Agent
3
+ *
4
+ * Main agent class that orchestrates planning, reasoning, acting, and reflection.
5
+ * Implements a goal-oriented, autonomous browser automation system.
6
+ */
7
+ import { createPlan } from './planner.js';
8
+ import { reasonAndDecide, validateAction } from './react.js';
9
+ import { reflectOnAction, reflectOnProgress } from './reflection.js';
10
+ import { determineRecoveryStrategy, classifyError, getRetryDelay, shouldRetryBasedOnError } from './recovery.js';
11
+ import { captureTargets, buildSelectorForTarget } from '../mimic/selector.js';
12
+ import { getNavigationAction, executeNavigationAction } from '../mimic/navigation.js';
13
+ import { getClickAction, executeClickAction } from '../mimic/click.js';
14
+ import { getFormAction, executeFormAction } from '../mimic/forms.js';
15
+ import { smartWait, isPageLoading, detectLoadingIndicators } from './wait.js';
16
+ /**
17
+ * Agentic Browser Automation Agent
18
+ *
19
+ * An autonomous agent that can plan, reason, act, and reflect to achieve
20
+ * browser automation goals.
21
+ */
22
+ export class Agent {
23
+ config;
24
+ state;
25
+ plan;
26
+ currentStepIndex = 0;
27
+ actionRetryCount = new Map();
28
+ /**
29
+ * Create a new agent instance
30
+ *
31
+ * @param config - Agent configuration
32
+ */
33
+ constructor(config) {
34
+ this.config = {
35
+ maxActions: config.maxActions ?? 50,
36
+ maxRetries: config.maxRetries ?? 3,
37
+ enableReflection: config.enableReflection ?? true,
38
+ enablePlanning: config.enablePlanning ?? true,
39
+ actionTimeout: config.actionTimeout ?? 30000,
40
+ ...config,
41
+ };
42
+ // Initialize state
43
+ this.state = {
44
+ currentUrl: '',
45
+ pageTitle: '',
46
+ availableElements: [],
47
+ actionHistory: [],
48
+ currentGoal: '',
49
+ overallObjective: '',
50
+ goalAchieved: false,
51
+ errors: [],
52
+ metadata: {
53
+ stepCount: 0,
54
+ startTime: Date.now(),
55
+ lastActionTime: Date.now(),
56
+ },
57
+ isLoading: false,
58
+ loadingIndicatorCount: 0,
59
+ };
60
+ }
61
+ /**
62
+ * Initialize the agent with the current page state
63
+ *
64
+ * @returns Promise that resolves when initialization is complete
65
+ */
66
+ async initialize() {
67
+ // Capture initial page state
68
+ this.state.currentUrl = this.config.page.url();
69
+ this.state.pageTitle = await this.config.page.title();
70
+ this.state.availableElements = await captureTargets(this.config.page, { interactableOnly: true });
71
+ }
72
+ /**
73
+ * Execute a goal-oriented task
74
+ *
75
+ * The agent will plan, reason, act, and reflect to achieve the goal.
76
+ *
77
+ * @param goal - High-level goal to achieve
78
+ * @returns Promise that resolves when the goal is achieved or execution completes
79
+ */
80
+ async executeGoal(goal) {
81
+ this.state.overallObjective = goal;
82
+ this.state.currentGoal = goal;
83
+ this.state.metadata.startTime = Date.now();
84
+ // Initialize if not already done
85
+ if (!this.state.currentUrl) {
86
+ await this.initialize();
87
+ }
88
+ // Planning phase
89
+ if (this.config.enablePlanning) {
90
+ console.log('🤔 Planning execution strategy...');
91
+ this.plan = await createPlan(this.config.brain, goal, {
92
+ url: this.state.currentUrl,
93
+ pageTitle: this.state.pageTitle,
94
+ availableElements: this.state.availableElements.length,
95
+ });
96
+ console.log(`📋 Plan created: ${this.plan.steps.length} steps, complexity: ${this.plan.complexity}`);
97
+ if (this.plan.challenges.length > 0) {
98
+ console.log(`⚠️ Potential challenges: ${this.plan.challenges.join(', ')}`);
99
+ }
100
+ }
101
+ // Main execution loop
102
+ let consecutiveFailures = 0;
103
+ const maxConsecutiveFailures = 3;
104
+ while (!this.state.goalAchieved &&
105
+ this.state.metadata.stepCount < this.config.maxActions) {
106
+ // Update state before reasoning
107
+ await this.updateState();
108
+ // Check if we should abort
109
+ if (consecutiveFailures >= maxConsecutiveFailures) {
110
+ console.log('❌ Too many consecutive failures, aborting...');
111
+ break;
112
+ }
113
+ // Get current step from plan (if planning enabled)
114
+ const currentStep = this.plan?.steps[this.currentStepIndex];
115
+ // Reasoning phase (ReAct pattern)
116
+ console.log('🧠 Reasoning about next action...');
117
+ const reasoning = await reasonAndDecide(this.config.brain, this.state, currentStep);
118
+ console.log(`💭 Observation: ${reasoning.observation}`);
119
+ console.log(`🤔 Thought: ${reasoning.thought}`);
120
+ console.log(`✅ Decided: ${reasoning.action.description}`);
121
+ // Validate action
122
+ const validation = validateAction(reasoning.action, this.state);
123
+ if (!validation.feasible) {
124
+ console.log(`⚠️ Action not feasible: ${validation.reason}`);
125
+ this.recordError('validation', validation.reason, 'action validation');
126
+ consecutiveFailures++;
127
+ continue;
128
+ }
129
+ // Execute action
130
+ const actionSuccess = await this.executeAction(reasoning.action, reasoning);
131
+ // Reflection and recovery phase
132
+ if (this.config.enableReflection && this.state.actionHistory.length > 0) {
133
+ const lastAction = this.state.actionHistory[this.state.actionHistory.length - 1];
134
+ if (lastAction) {
135
+ console.log('🔍 Reflecting on action...');
136
+ const reflection = await reflectOnAction(this.config.brain, lastAction, this.state, goal);
137
+ lastAction.reflection = reflection;
138
+ console.log(`📊 Progress: ${reflection.progressMade ? 'Made progress' : 'No progress'}`);
139
+ console.log(`🎯 Confidence: ${(reflection.confidence * 100).toFixed(0)}%`);
140
+ // Error recovery if action failed
141
+ if (!actionSuccess && lastAction.error) {
142
+ const error = this.state.errors[this.state.errors.length - 1];
143
+ if (error) {
144
+ const retryCount = this.actionRetryCount.get(lastAction.id) || 0;
145
+ // Check if we should retry based on error classification
146
+ if (shouldRetryBasedOnError(error, retryCount, this.config.maxRetries)) {
147
+ console.log('🔄 Determining recovery strategy...');
148
+ const recovery = await determineRecoveryStrategy(this.config.brain, error, lastAction, this.state);
149
+ if (recovery.shouldRetry && !recovery.abort) {
150
+ console.log(`🔄 Retrying with strategy: ${recovery.reasoning}`);
151
+ this.actionRetryCount.set(lastAction.id, retryCount + 1);
152
+ // Wait with exponential backoff
153
+ const delay = getRetryDelay(retryCount + 1);
154
+ await this.config.page.waitForTimeout(delay);
155
+ // Retry the action (simplified - could be enhanced)
156
+ consecutiveFailures--; // Don't count retry as a new failure
157
+ continue; // Loop back to retry
158
+ }
159
+ else if (recovery.skipAndContinue) {
160
+ console.log(`⏭️ Skipping action: ${recovery.reasoning}`);
161
+ consecutiveFailures = 0; // Reset on skip
162
+ }
163
+ else if (recovery.abort) {
164
+ console.log(`🛑 Aborting: ${recovery.reasoning}`);
165
+ break;
166
+ }
167
+ }
168
+ }
169
+ }
170
+ if (reflection.alternatives.length > 0) {
171
+ console.log(`💡 Alternatives: ${reflection.alternatives.join(', ')}`);
172
+ }
173
+ }
174
+ }
175
+ // Update consecutive failures counter
176
+ if (actionSuccess) {
177
+ consecutiveFailures = 0;
178
+ if (this.plan) {
179
+ this.currentStepIndex++;
180
+ }
181
+ }
182
+ else {
183
+ consecutiveFailures++;
184
+ }
185
+ // Periodic progress reflection
186
+ if (this.state.actionHistory.length % 5 === 0 && this.config.enableReflection) {
187
+ const progressReflection = await reflectOnProgress(this.config.brain, this.state, goal);
188
+ console.log(`📈 Overall Progress: ${progressReflection.progressPercentage}%`);
189
+ if (progressReflection.shouldPivot && progressReflection.pivotStrategy) {
190
+ console.log(`🔄 Pivoting strategy: ${progressReflection.pivotStrategy}`);
191
+ // Strategy pivot could be implemented here
192
+ }
193
+ }
194
+ // Small delay between actions, but check for loading first
195
+ // If page is loading, wait for loaders instead of fixed delay
196
+ if (this.state.isLoading) {
197
+ await this.autoWaitAfterAction('inter-action');
198
+ }
199
+ else {
200
+ await new Promise(resolve => setTimeout(resolve, 300));
201
+ }
202
+ }
203
+ return {
204
+ success: this.state.goalAchieved,
205
+ actionsTaken: this.state.actionHistory.length,
206
+ goalAchieved: this.state.goalAchieved,
207
+ finalState: this.state,
208
+ };
209
+ }
210
+ /**
211
+ * Update the agent's state from the current page
212
+ *
213
+ * @returns Promise that resolves when state is updated
214
+ */
215
+ async updateState() {
216
+ try {
217
+ this.state.currentUrl = this.config.page.url();
218
+ this.state.pageTitle = await this.config.page.title();
219
+ this.state.availableElements = await captureTargets(this.config.page, { interactableOnly: true });
220
+ // Check for loading indicators
221
+ const loaders = await detectLoadingIndicators(this.config.page);
222
+ this.state.isLoading = loaders.length > 0;
223
+ this.state.loadingIndicatorCount = loaders.length;
224
+ this.state.metadata.lastActionTime = Date.now();
225
+ }
226
+ catch (error) {
227
+ this.recordError('state_update', String(error), 'state synchronization');
228
+ }
229
+ }
230
+ /**
231
+ * Execute a decided action
232
+ *
233
+ * @param action - The action to execute
234
+ * @param _reasoning - The reasoning result that led to this action
235
+ * @returns Promise resolving to whether the action was successful
236
+ */
237
+ async executeAction(action, _reasoning) {
238
+ const actionId = `action-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
239
+ const actionRecord = {
240
+ id: actionId,
241
+ plannedAt: Date.now(),
242
+ actionType: action.type,
243
+ description: action.description,
244
+ parameters: action.parameters,
245
+ success: false,
246
+ };
247
+ try {
248
+ console.log(`⚡ Executing: ${action.description}`);
249
+ actionRecord.executedAt = Date.now();
250
+ this.state.metadata.stepCount++;
251
+ // Execute based on action type
252
+ let success = false;
253
+ let result = '';
254
+ switch (action.type) {
255
+ case 'navigation':
256
+ success = await this.executeNavigation(action, actionRecord);
257
+ break;
258
+ case 'click':
259
+ success = await this.executeClick(action, actionRecord);
260
+ break;
261
+ case 'form':
262
+ success = await this.executeForm(action, actionRecord);
263
+ break;
264
+ case 'assertion':
265
+ success = await this.executeAssertion(action, actionRecord);
266
+ break;
267
+ case 'wait':
268
+ success = await this.executeWait(action, actionRecord);
269
+ break;
270
+ case 'retry':
271
+ success = await this.executeRetry(action, actionRecord);
272
+ break;
273
+ case 'abort':
274
+ console.log('🛑 Aborting execution as requested');
275
+ actionRecord.success = true; // Abort is a valid action
276
+ actionRecord.result = 'Execution aborted';
277
+ this.state.actionHistory.push(actionRecord);
278
+ return true;
279
+ default:
280
+ throw new Error(`Unknown action type: ${action.type}`);
281
+ }
282
+ actionRecord.success = success;
283
+ actionRecord.result = result;
284
+ // Check if goal is achieved
285
+ if (success && action.expectedOutcome) {
286
+ // Simple heuristic: if action succeeded and we're checking for goal completion
287
+ // This could be enhanced with more sophisticated goal checking
288
+ await this.checkGoalAchievement();
289
+ }
290
+ }
291
+ catch (error) {
292
+ actionRecord.success = false;
293
+ actionRecord.error = error instanceof Error ? error.message : String(error);
294
+ const errorClassification = classifyError({
295
+ timestamp: Date.now(),
296
+ type: 'execution',
297
+ message: actionRecord.error,
298
+ context: action.description,
299
+ recovered: false,
300
+ });
301
+ this.recordError('execution', actionRecord.error, action.description);
302
+ // If it's a transient error, wait before retrying
303
+ if (errorClassification.category === 'transient' && errorClassification.suggestedWait) {
304
+ await this.config.page.waitForTimeout(errorClassification.suggestedWait);
305
+ }
306
+ }
307
+ finally {
308
+ this.state.actionHistory.push(actionRecord);
309
+ }
310
+ return actionRecord.success;
311
+ }
312
+ /**
313
+ * Execute a navigation action
314
+ */
315
+ async executeNavigation(action, record) {
316
+ try {
317
+ const url = action.parameters.url;
318
+ if (!url) {
319
+ throw new Error('Navigation action requires a URL parameter');
320
+ }
321
+ // Use existing navigation logic
322
+ const navigationAction = await getNavigationAction(this.config.page, this.config.brain, `navigate to ${url}`);
323
+ await executeNavigationAction(this.config.page, navigationAction);
324
+ // Wait for navigation to complete and check for loaders
325
+ await this.config.page.waitForLoadState('networkidle');
326
+ await this.autoWaitAfterAction('navigation');
327
+ await this.updateState();
328
+ record.result = `Navigated to ${url}`;
329
+ return true;
330
+ }
331
+ catch (error) {
332
+ record.error = error instanceof Error ? error.message : String(error);
333
+ return false;
334
+ }
335
+ }
336
+ /**
337
+ * Execute a click action
338
+ */
339
+ async executeClick(action, record) {
340
+ try {
341
+ // Capture targets
342
+ const targetElements = await captureTargets(this.config.page, { interactableOnly: true });
343
+ // Use AI to find the right element
344
+ const stepDescription = action.description || 'click on element';
345
+ const clickActionResult = await getClickAction(this.config.page, this.config.brain, stepDescription, targetElements);
346
+ // Build selector for the best candidate
347
+ const bestCandidate = clickActionResult.candidates[0];
348
+ if (!bestCandidate) {
349
+ throw new Error('No clickable element found');
350
+ }
351
+ const clickable = await buildSelectorForTarget(this.config.page, targetElements[bestCandidate.index]);
352
+ if (!clickable) {
353
+ throw new Error('Could not build selector for target element');
354
+ }
355
+ // Agentic context doesn't have testInfo, pass undefined
356
+ await executeClickAction(clickable, clickActionResult, bestCandidate, undefined, action.description);
357
+ // Auto-wait for loading after click
358
+ await this.autoWaitAfterAction('click');
359
+ await this.updateState();
360
+ record.result = `Clicked on element: ${bestCandidate.text || bestCandidate.ariaLabel || 'element'}`;
361
+ return true;
362
+ }
363
+ catch (error) {
364
+ record.error = error instanceof Error ? error.message : String(error);
365
+ return false;
366
+ }
367
+ }
368
+ /**
369
+ * Execute a form action
370
+ */
371
+ async executeForm(action, record) {
372
+ try {
373
+ const formElements = await captureTargets(this.config.page, { interactableOnly: true });
374
+ // Use AI to determine form action
375
+ const stepDescription = action.description || 'update form';
376
+ const formActionResult = await getFormAction(this.config.page, this.config.brain, stepDescription, formElements);
377
+ // Find the target element (simplified - could be enhanced)
378
+ const targetElement = await buildSelectorForTarget(this.config.page, formElements[0] // Simplified - should use AI to find the right field
379
+ );
380
+ if (!targetElement) {
381
+ throw new Error('No form element found');
382
+ }
383
+ // Agentic context doesn't have testInfo, pass undefined
384
+ await executeFormAction(this.config.page, formActionResult, targetElement, undefined, action.description);
385
+ // Auto-wait for loading after form action
386
+ await this.autoWaitAfterAction('form');
387
+ await this.updateState();
388
+ record.result = `Form action executed: ${formActionResult.type}`;
389
+ return true;
390
+ }
391
+ catch (error) {
392
+ record.error = error instanceof Error ? error.message : String(error);
393
+ return false;
394
+ }
395
+ }
396
+ /**
397
+ * Execute an assertion action
398
+ */
399
+ async executeAssertion(action, record) {
400
+ try {
401
+ // Simple assertion - could be enhanced
402
+ const expected = action.parameters.expected;
403
+ const actual = await this.config.page.textContent('body') || '';
404
+ const success = actual.includes(expected);
405
+ record.result = success
406
+ ? `Assertion passed: found "${expected}"`
407
+ : `Assertion failed: expected "${expected}" but not found`;
408
+ return success;
409
+ }
410
+ catch (error) {
411
+ record.error = error instanceof Error ? error.message : String(error);
412
+ return false;
413
+ }
414
+ }
415
+ /**
416
+ * Execute a wait action with smart loading detection
417
+ */
418
+ async executeWait(action, record) {
419
+ try {
420
+ const waitType = action.parameters.waitType || 'smart';
421
+ const duration = action.parameters.duration || 2000;
422
+ const loaderTimeout = action.parameters.loaderTimeout || 10000;
423
+ if (waitType === 'smart' || waitType === 'loader') {
424
+ // Smart wait: detect and wait for loading indicators
425
+ const waitResult = await smartWait(this.config.page, {
426
+ loaderTimeout,
427
+ fallbackTimeout: duration,
428
+ waitForNetworkIdle: action.parameters.waitForNetworkIdle || false,
429
+ });
430
+ if (waitResult.waitedForLoaders) {
431
+ record.result = `Waited for ${waitResult.loaderCount} loading indicator(s) to disappear (${waitResult.duration}ms)`;
432
+ }
433
+ else {
434
+ record.result = `No loaders detected, waited ${waitResult.duration}ms`;
435
+ }
436
+ }
437
+ else if (waitType === 'fixed') {
438
+ // Fixed timeout wait
439
+ await this.config.page.waitForTimeout(duration);
440
+ record.result = `Waited for ${duration}ms (fixed timeout)`;
441
+ }
442
+ else if (waitType === 'network') {
443
+ // Wait for network idle
444
+ await this.config.page.waitForLoadState('networkidle', { timeout: loaderTimeout });
445
+ record.result = `Waited for network to be idle`;
446
+ }
447
+ else {
448
+ // Default to smart wait
449
+ const waitResult = await smartWait(this.config.page, {
450
+ loaderTimeout,
451
+ fallbackTimeout: duration,
452
+ });
453
+ record.result = `Smart wait completed (${waitResult.duration}ms)`;
454
+ }
455
+ return true;
456
+ }
457
+ catch (error) {
458
+ record.error = error instanceof Error ? error.message : String(error);
459
+ return false;
460
+ }
461
+ }
462
+ /**
463
+ * Automatically wait after actions that might trigger loading
464
+ * This is called after click, form, and navigation actions
465
+ */
466
+ async autoWaitAfterAction(actionType) {
467
+ // Check if page is loading
468
+ const isLoading = await isPageLoading(this.config.page);
469
+ if (isLoading) {
470
+ console.log(`⏳ Auto-detected loading state after ${actionType}, waiting for loaders...`);
471
+ await smartWait(this.config.page, {
472
+ loaderTimeout: 5000, // Shorter timeout for auto-waits
473
+ fallbackTimeout: 500,
474
+ });
475
+ }
476
+ else {
477
+ // Small delay for DOM updates even if no visible loader
478
+ await this.config.page.waitForTimeout(300);
479
+ }
480
+ }
481
+ /**
482
+ * Execute a retry action
483
+ */
484
+ async executeRetry(_action, _record) {
485
+ // Retry logic - could retry the last failed action
486
+ const lastAction = this.state.actionHistory[this.state.actionHistory.length - 1];
487
+ if (lastAction && !lastAction.success) {
488
+ console.log(`🔄 Retrying: ${lastAction.description}`);
489
+ // Simplified retry - could be more sophisticated
490
+ return false; // Indicate retry needs to be handled differently
491
+ }
492
+ return false;
493
+ }
494
+ /**
495
+ * Check if the goal has been achieved
496
+ */
497
+ async checkGoalAchievement() {
498
+ // Simple heuristic - could be enhanced with AI-based goal checking
499
+ // For now, we'll use a simple approach where the agent decides through reasoning
500
+ // This could be enhanced to actually verify the goal state
501
+ this.state.goalAchieved = false; // Will be set by reasoning/reflection
502
+ }
503
+ /**
504
+ * Record an error
505
+ */
506
+ recordError(type, message, context) {
507
+ this.state.errors.push({
508
+ timestamp: Date.now(),
509
+ type,
510
+ message,
511
+ context,
512
+ recovered: false,
513
+ });
514
+ }
515
+ /**
516
+ * Get the current agent state
517
+ */
518
+ getState() {
519
+ return { ...this.state };
520
+ }
521
+ /**
522
+ * Get the current plan
523
+ */
524
+ getPlan() {
525
+ return this.plan;
526
+ }
527
+ }
528
+ //# sourceMappingURL=agent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent.js","sourceRoot":"","sources":["../../src/agentic/agent.ts"],"names":[],"mappings":"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"}