browser-use 0.0.1 → 0.0.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 (200) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +761 -0
  3. package/dist/agent/cloud-events.d.ts +264 -0
  4. package/dist/agent/cloud-events.js +318 -0
  5. package/dist/agent/gif.d.ts +15 -0
  6. package/dist/agent/gif.js +215 -0
  7. package/dist/agent/index.d.ts +8 -0
  8. package/dist/agent/index.js +8 -0
  9. package/dist/agent/message-manager/service.d.ts +30 -0
  10. package/dist/agent/message-manager/service.js +208 -0
  11. package/dist/agent/message-manager/utils.d.ts +2 -0
  12. package/dist/agent/message-manager/utils.js +41 -0
  13. package/dist/agent/message-manager/views.d.ts +26 -0
  14. package/dist/agent/message-manager/views.js +73 -0
  15. package/dist/agent/prompts.d.ts +52 -0
  16. package/dist/agent/prompts.js +259 -0
  17. package/dist/agent/service.d.ts +290 -0
  18. package/dist/agent/service.js +2200 -0
  19. package/dist/agent/views.d.ts +741 -0
  20. package/dist/agent/views.js +537 -0
  21. package/dist/browser/browser.d.ts +7 -0
  22. package/dist/browser/browser.js +5 -0
  23. package/dist/browser/context.d.ts +8 -0
  24. package/dist/browser/context.js +4 -0
  25. package/dist/browser/dvd-screensaver.d.ts +101 -0
  26. package/dist/browser/dvd-screensaver.js +270 -0
  27. package/dist/browser/extensions.d.ts +63 -0
  28. package/dist/browser/extensions.js +359 -0
  29. package/dist/browser/index.d.ts +10 -0
  30. package/dist/browser/index.js +9 -0
  31. package/dist/browser/playwright-manager.d.ts +47 -0
  32. package/dist/browser/playwright-manager.js +146 -0
  33. package/dist/browser/profile.d.ts +196 -0
  34. package/dist/browser/profile.js +815 -0
  35. package/dist/browser/session.d.ts +505 -0
  36. package/dist/browser/session.js +3409 -0
  37. package/dist/browser/types.d.ts +1184 -0
  38. package/dist/browser/types.js +1 -0
  39. package/dist/browser/utils.d.ts +1 -0
  40. package/dist/browser/utils.js +19 -0
  41. package/dist/browser/views.d.ts +78 -0
  42. package/dist/browser/views.js +72 -0
  43. package/dist/cli.d.ts +2 -0
  44. package/dist/cli.js +44 -0
  45. package/dist/config.d.ts +108 -0
  46. package/dist/config.js +430 -0
  47. package/dist/controller/index.d.ts +3 -0
  48. package/dist/controller/index.js +3 -0
  49. package/dist/controller/registry/index.d.ts +2 -0
  50. package/dist/controller/registry/index.js +2 -0
  51. package/dist/controller/registry/service.d.ts +45 -0
  52. package/dist/controller/registry/service.js +184 -0
  53. package/dist/controller/registry/views.d.ts +55 -0
  54. package/dist/controller/registry/views.js +174 -0
  55. package/dist/controller/service.d.ts +49 -0
  56. package/dist/controller/service.js +1176 -0
  57. package/dist/controller/views.d.ts +241 -0
  58. package/dist/controller/views.js +88 -0
  59. package/dist/dom/clickable-element-processor/service.d.ts +11 -0
  60. package/dist/dom/clickable-element-processor/service.js +60 -0
  61. package/dist/dom/dom_tree/index.js +1400 -0
  62. package/dist/dom/history-tree-processor/service.d.ts +14 -0
  63. package/dist/dom/history-tree-processor/service.js +75 -0
  64. package/dist/dom/history-tree-processor/view.d.ts +54 -0
  65. package/dist/dom/history-tree-processor/view.js +56 -0
  66. package/dist/dom/playground/extraction.d.ts +19 -0
  67. package/dist/dom/playground/extraction.js +187 -0
  68. package/dist/dom/playground/process-dom.d.ts +1 -0
  69. package/dist/dom/playground/process-dom.js +5 -0
  70. package/dist/dom/playground/test-accessibility.d.ts +44 -0
  71. package/dist/dom/playground/test-accessibility.js +111 -0
  72. package/dist/dom/service.d.ts +19 -0
  73. package/dist/dom/service.js +227 -0
  74. package/dist/dom/utils.d.ts +1 -0
  75. package/dist/dom/utils.js +6 -0
  76. package/dist/dom/views.d.ts +61 -0
  77. package/dist/dom/views.js +247 -0
  78. package/dist/event-bus.d.ts +11 -0
  79. package/dist/event-bus.js +19 -0
  80. package/dist/exceptions.d.ts +10 -0
  81. package/dist/exceptions.js +22 -0
  82. package/dist/filesystem/file-system.d.ts +68 -0
  83. package/dist/filesystem/file-system.js +412 -0
  84. package/dist/filesystem/index.d.ts +1 -0
  85. package/dist/filesystem/index.js +1 -0
  86. package/dist/index.d.ts +31 -0
  87. package/dist/index.js +33 -0
  88. package/dist/integrations/gmail/actions.d.ts +12 -0
  89. package/dist/integrations/gmail/actions.js +113 -0
  90. package/dist/integrations/gmail/index.d.ts +2 -0
  91. package/dist/integrations/gmail/index.js +2 -0
  92. package/dist/integrations/gmail/service.d.ts +61 -0
  93. package/dist/integrations/gmail/service.js +260 -0
  94. package/dist/llm/anthropic/chat.d.ts +28 -0
  95. package/dist/llm/anthropic/chat.js +126 -0
  96. package/dist/llm/anthropic/index.d.ts +2 -0
  97. package/dist/llm/anthropic/index.js +2 -0
  98. package/dist/llm/anthropic/serializer.d.ts +68 -0
  99. package/dist/llm/anthropic/serializer.js +285 -0
  100. package/dist/llm/aws/chat-anthropic.d.ts +61 -0
  101. package/dist/llm/aws/chat-anthropic.js +176 -0
  102. package/dist/llm/aws/chat-bedrock.d.ts +15 -0
  103. package/dist/llm/aws/chat-bedrock.js +80 -0
  104. package/dist/llm/aws/index.d.ts +3 -0
  105. package/dist/llm/aws/index.js +3 -0
  106. package/dist/llm/aws/serializer.d.ts +5 -0
  107. package/dist/llm/aws/serializer.js +68 -0
  108. package/dist/llm/azure/chat.d.ts +15 -0
  109. package/dist/llm/azure/chat.js +83 -0
  110. package/dist/llm/azure/index.d.ts +1 -0
  111. package/dist/llm/azure/index.js +1 -0
  112. package/dist/llm/base.d.ts +16 -0
  113. package/dist/llm/base.js +1 -0
  114. package/dist/llm/deepseek/chat.d.ts +15 -0
  115. package/dist/llm/deepseek/chat.js +51 -0
  116. package/dist/llm/deepseek/index.d.ts +2 -0
  117. package/dist/llm/deepseek/index.js +2 -0
  118. package/dist/llm/deepseek/serializer.d.ts +6 -0
  119. package/dist/llm/deepseek/serializer.js +57 -0
  120. package/dist/llm/exceptions.d.ts +10 -0
  121. package/dist/llm/exceptions.js +18 -0
  122. package/dist/llm/google/chat.d.ts +20 -0
  123. package/dist/llm/google/chat.js +144 -0
  124. package/dist/llm/google/index.d.ts +2 -0
  125. package/dist/llm/google/index.js +2 -0
  126. package/dist/llm/google/serializer.d.ts +6 -0
  127. package/dist/llm/google/serializer.js +64 -0
  128. package/dist/llm/groq/chat.d.ts +15 -0
  129. package/dist/llm/groq/chat.js +52 -0
  130. package/dist/llm/groq/index.d.ts +3 -0
  131. package/dist/llm/groq/index.js +3 -0
  132. package/dist/llm/groq/parser.d.ts +32 -0
  133. package/dist/llm/groq/parser.js +189 -0
  134. package/dist/llm/groq/serializer.d.ts +6 -0
  135. package/dist/llm/groq/serializer.js +56 -0
  136. package/dist/llm/messages.d.ts +77 -0
  137. package/dist/llm/messages.js +157 -0
  138. package/dist/llm/ollama/chat.d.ts +15 -0
  139. package/dist/llm/ollama/chat.js +77 -0
  140. package/dist/llm/ollama/index.d.ts +2 -0
  141. package/dist/llm/ollama/index.js +2 -0
  142. package/dist/llm/ollama/serializer.d.ts +6 -0
  143. package/dist/llm/ollama/serializer.js +53 -0
  144. package/dist/llm/openai/chat.d.ts +38 -0
  145. package/dist/llm/openai/chat.js +174 -0
  146. package/dist/llm/openai/index.d.ts +3 -0
  147. package/dist/llm/openai/index.js +3 -0
  148. package/dist/llm/openai/like.d.ts +17 -0
  149. package/dist/llm/openai/like.js +19 -0
  150. package/dist/llm/openai/serializer.d.ts +6 -0
  151. package/dist/llm/openai/serializer.js +57 -0
  152. package/dist/llm/openrouter/chat.d.ts +15 -0
  153. package/dist/llm/openrouter/chat.js +74 -0
  154. package/dist/llm/openrouter/index.d.ts +2 -0
  155. package/dist/llm/openrouter/index.js +2 -0
  156. package/dist/llm/openrouter/serializer.d.ts +3 -0
  157. package/dist/llm/openrouter/serializer.js +3 -0
  158. package/dist/llm/schema.d.ts +6 -0
  159. package/dist/llm/schema.js +77 -0
  160. package/dist/llm/views.d.ts +15 -0
  161. package/dist/llm/views.js +12 -0
  162. package/dist/logging-config.d.ts +25 -0
  163. package/dist/logging-config.js +89 -0
  164. package/dist/mcp/client.d.ts +142 -0
  165. package/dist/mcp/client.js +638 -0
  166. package/dist/mcp/controller.d.ts +6 -0
  167. package/dist/mcp/controller.js +38 -0
  168. package/dist/mcp/index.d.ts +3 -0
  169. package/dist/mcp/index.js +3 -0
  170. package/dist/mcp/server.d.ts +134 -0
  171. package/dist/mcp/server.js +759 -0
  172. package/dist/observability-decorators.d.ts +158 -0
  173. package/dist/observability-decorators.js +286 -0
  174. package/dist/observability.d.ts +23 -0
  175. package/dist/observability.js +58 -0
  176. package/dist/screenshots/index.d.ts +1 -0
  177. package/dist/screenshots/index.js +1 -0
  178. package/dist/screenshots/service.d.ts +6 -0
  179. package/dist/screenshots/service.js +28 -0
  180. package/dist/sync/auth.d.ts +27 -0
  181. package/dist/sync/auth.js +205 -0
  182. package/dist/sync/index.d.ts +2 -0
  183. package/dist/sync/index.js +2 -0
  184. package/dist/sync/service.d.ts +21 -0
  185. package/dist/sync/service.js +146 -0
  186. package/dist/telemetry/index.d.ts +2 -0
  187. package/dist/telemetry/index.js +2 -0
  188. package/dist/telemetry/service.d.ts +12 -0
  189. package/dist/telemetry/service.js +85 -0
  190. package/dist/telemetry/views.d.ts +112 -0
  191. package/dist/telemetry/views.js +112 -0
  192. package/dist/tokens/index.d.ts +2 -0
  193. package/dist/tokens/index.js +2 -0
  194. package/dist/tokens/service.d.ts +35 -0
  195. package/dist/tokens/service.js +423 -0
  196. package/dist/tokens/views.d.ts +58 -0
  197. package/dist/tokens/views.js +1 -0
  198. package/dist/utils.d.ts +128 -0
  199. package/dist/utils.js +529 -0
  200. package/package.json +94 -5
@@ -0,0 +1,259 @@
1
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ };
7
+ import fs from 'node:fs';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { SystemMessage, UserMessage, ContentPartTextParam, ContentPartImageParam, ImageURL, } from '../llm/messages.js';
10
+ import { observe_debug } from '../observability.js';
11
+ import { is_new_tab_page } from '../utils.js';
12
+ const readPromptTemplate = (filename) => {
13
+ const filePath = fileURLToPath(new URL(filename, import.meta.url));
14
+ return fs.readFileSync(filePath, 'utf-8');
15
+ };
16
+ export class SystemPrompt {
17
+ actionDescription;
18
+ maxActionsPerStep;
19
+ overrideSystemMessage;
20
+ extendSystemMessage;
21
+ useThinking;
22
+ flashMode;
23
+ promptTemplate = '';
24
+ systemMessage;
25
+ constructor(actionDescription, maxActionsPerStep = 10, overrideSystemMessage = null, extendSystemMessage = null, useThinking = true, flashMode = false) {
26
+ this.actionDescription = actionDescription;
27
+ this.maxActionsPerStep = maxActionsPerStep;
28
+ this.overrideSystemMessage = overrideSystemMessage;
29
+ this.extendSystemMessage = extendSystemMessage;
30
+ this.useThinking = useThinking;
31
+ this.flashMode = flashMode;
32
+ if (overrideSystemMessage) {
33
+ this.promptTemplate = overrideSystemMessage;
34
+ }
35
+ else {
36
+ this.loadPromptTemplate();
37
+ }
38
+ let prompt = this.promptTemplate.replace('{max_actions}', String(this.maxActionsPerStep));
39
+ if (this.extendSystemMessage) {
40
+ prompt += `\n${this.extendSystemMessage}`;
41
+ }
42
+ this.systemMessage = new SystemMessage(prompt);
43
+ this.systemMessage.cache = true;
44
+ }
45
+ loadPromptTemplate() {
46
+ const templateName = this.flashMode
47
+ ? './system_prompt_flash.md'
48
+ : this.useThinking
49
+ ? './system_prompt.md'
50
+ : './system_prompt_no_thinking.md';
51
+ try {
52
+ this.promptTemplate = readPromptTemplate(templateName);
53
+ }
54
+ catch (error) {
55
+ throw new Error(`Failed to load system prompt template: ${error.message}`);
56
+ }
57
+ }
58
+ get_system_message() {
59
+ return this.systemMessage;
60
+ }
61
+ }
62
+ export class AgentMessagePrompt {
63
+ browserState;
64
+ fileSystem;
65
+ agentHistoryDescription;
66
+ readStateDescription;
67
+ task;
68
+ includeAttributes;
69
+ stepInfo;
70
+ pageFilteredActions;
71
+ maxClickableElementsLength;
72
+ sensitiveData;
73
+ availableFilePaths;
74
+ screenshots;
75
+ visionDetailLevel;
76
+ constructor(init) {
77
+ this.browserState = init.browser_state_summary;
78
+ this.fileSystem = init.file_system;
79
+ this.agentHistoryDescription = init.agent_history_description ?? null;
80
+ this.readStateDescription = init.read_state_description ?? null;
81
+ this.task = init.task ?? null;
82
+ this.includeAttributes = init.include_attributes ?? null;
83
+ this.stepInfo = init.step_info ?? null;
84
+ this.pageFilteredActions = init.page_filtered_actions ?? null;
85
+ this.maxClickableElementsLength =
86
+ init.max_clickable_elements_length ?? 40000;
87
+ this.sensitiveData = init.sensitive_data ?? null;
88
+ this.availableFilePaths = init.available_file_paths ?? null;
89
+ this.screenshots = init.screenshots ?? [];
90
+ this.visionDetailLevel = init.vision_detail_level ?? 'auto';
91
+ }
92
+ browserStateDescription() {
93
+ let elementsText = this.browserState.element_tree.clickable_elements_to_string(this.includeAttributes ?? undefined);
94
+ let truncatedText = '';
95
+ if (elementsText.length > this.maxClickableElementsLength) {
96
+ elementsText = elementsText.slice(0, this.maxClickableElementsLength);
97
+ truncatedText = ` (truncated to ${this.maxClickableElementsLength} characters)`;
98
+ }
99
+ const hasContentAbove = (this.browserState.pixels_above ?? 0) > 0;
100
+ const hasContentBelow = (this.browserState.pixels_below ?? 0) > 0;
101
+ const pi = this.browserState.page_info;
102
+ let pageInfoText = '';
103
+ if (pi) {
104
+ const pagesAbove = pi.viewport_height > 0 ? pi.pixels_above / pi.viewport_height : 0;
105
+ const pagesBelow = pi.viewport_height > 0 ? pi.pixels_below / pi.viewport_height : 0;
106
+ const totalPages = pi.viewport_height > 0 ? pi.page_height / pi.viewport_height : 0;
107
+ const currentPosition = pi.scroll_y / Math.max(pi.page_height - pi.viewport_height, 1);
108
+ pageInfoText = `Page info: ${pi.viewport_width}x${pi.viewport_height}px viewport, ${pi.page_width}x${pi.page_height}px total page size, ${pagesAbove.toFixed(1)} pages above, ${pagesBelow.toFixed(1)} pages below, ${totalPages.toFixed(1)} total pages, at ${(currentPosition * 100).toFixed(0)}% of page`;
109
+ }
110
+ if (elementsText) {
111
+ if (hasContentAbove) {
112
+ if (pi) {
113
+ const pagesAbove = pi.viewport_height > 0 ? pi.pixels_above / pi.viewport_height : 0;
114
+ elementsText = `... ${this.browserState.pixels_above} pixels above (${pagesAbove.toFixed(1)} pages) - scroll to see more or extract structured data if you are looking for specific information ...\n${elementsText}`;
115
+ }
116
+ else {
117
+ elementsText = `... ${this.browserState.pixels_above} pixels above - scroll to see more or extract structured data if you are looking for specific information ...\n${elementsText}`;
118
+ }
119
+ }
120
+ else {
121
+ elementsText = `[Start of page]\n${elementsText}`;
122
+ }
123
+ if (hasContentBelow) {
124
+ if (pi) {
125
+ const pagesBelow = pi.viewport_height > 0 ? pi.pixels_below / pi.viewport_height : 0;
126
+ elementsText = `${elementsText}\n... ${this.browserState.pixels_below} pixels below (${pagesBelow.toFixed(1)} pages) - scroll to see more or extract structured data if you are looking for specific information ...`;
127
+ }
128
+ else {
129
+ elementsText = `${elementsText}\n... ${this.browserState.pixels_below} pixels below - scroll to see more or extract structured data if you are looking for specific information ...`;
130
+ }
131
+ }
132
+ else {
133
+ elementsText = `${elementsText}\n[End of page]`;
134
+ }
135
+ }
136
+ else {
137
+ elementsText = 'empty page';
138
+ }
139
+ let tabsText = '';
140
+ const currentTabCandidates = [];
141
+ for (const tab of this.browserState.tabs) {
142
+ if (tab.url === this.browserState.url &&
143
+ tab.title === this.browserState.title) {
144
+ currentTabCandidates.push(tab.page_id);
145
+ }
146
+ }
147
+ const currentTabId = currentTabCandidates.length === 1 ? currentTabCandidates[0] : null;
148
+ for (const tab of this.browserState.tabs) {
149
+ tabsText += `Tab ${tab.page_id}: ${tab.url} - ${tab.title.slice(0, 30)}\n`;
150
+ }
151
+ const currentTabText = currentTabId !== null ? `Current tab: ${currentTabId}` : '';
152
+ const pdfMessage = this.browserState.is_pdf_viewer
153
+ ? 'PDF viewer cannot be rendered. Do not use extract_structured_data here; use read_file on downloaded PDF via available_file_paths.\n\n'
154
+ : '';
155
+ return `${currentTabText}
156
+ Available tabs:
157
+ ${tabsText}
158
+ ${pageInfoText}
159
+ ${pdfMessage}Interactive elements from top layer of the current page inside the viewport${truncatedText}:
160
+ ${elementsText}
161
+ `;
162
+ }
163
+ agentStateDescription() {
164
+ const todoContents = this.fileSystem.get_todo_contents();
165
+ const todoText = todoContents ||
166
+ '[Current todo.md is empty, fill it with your plan when applicable]';
167
+ const timestamp = new Date().toISOString().slice(0, 16).replace('T', ' ');
168
+ const stepInfo = this.stepInfo != null
169
+ ? `Step ${this.stepInfo.step_number + 1} of ${this.stepInfo.max_steps}\n`
170
+ : '';
171
+ const stepInfoDescription = `${stepInfo}Current date and time: ${timestamp}`;
172
+ let agentState = `<user_request>
173
+ ${this.task ?? ''}
174
+ </user_request>
175
+ <file_system>
176
+ ${this.fileSystem.describe()}
177
+ </file_system>
178
+ <todo_contents>
179
+ ${todoText}
180
+ </todo_contents>
181
+ `;
182
+ if (this.sensitiveData) {
183
+ agentState += `<sensitive_data>
184
+ ${this.sensitiveData}
185
+ </sensitive_data>
186
+ `;
187
+ }
188
+ agentState += `<step_info>
189
+ ${stepInfoDescription}
190
+ </step_info>
191
+ `;
192
+ if (this.availableFilePaths?.length) {
193
+ agentState += `<available_file_paths>
194
+ ${this.availableFilePaths.join('\n')}
195
+ </available_file_paths>
196
+ `;
197
+ }
198
+ return agentState;
199
+ }
200
+ // @ts-ignore - Decorator type mismatch with TypeScript strict mode
201
+ get_user_message(use_vision = true) {
202
+ if (is_new_tab_page(this.browserState.url) &&
203
+ this.stepInfo &&
204
+ this.stepInfo.step_number === 0 &&
205
+ this.browserState.tabs.length === 1) {
206
+ use_vision = false;
207
+ }
208
+ let stateDescription = `<agent_history>
209
+ ${(this.agentHistoryDescription ?? '').trim()}
210
+ </agent_history>
211
+ `;
212
+ stateDescription += `<agent_state>
213
+ ${this.agentStateDescription().trim()}
214
+ </agent_state>
215
+ `;
216
+ stateDescription += `<browser_state>
217
+ ${this.browserStateDescription().trim()}
218
+ </browser_state>
219
+ `;
220
+ const readState = (this.readStateDescription ?? '').trim();
221
+ if (readState) {
222
+ stateDescription += `<read_state>
223
+ ${readState}
224
+ </read_state>
225
+ `;
226
+ }
227
+ if (this.pageFilteredActions) {
228
+ stateDescription += `<page_specific_actions>
229
+ ${this.pageFilteredActions}
230
+ </page_specific_actions>
231
+ `;
232
+ }
233
+ if (use_vision && this.screenshots.length > 0) {
234
+ const parts = [
235
+ new ContentPartTextParam(stateDescription),
236
+ ];
237
+ this.screenshots.forEach((shot, index) => {
238
+ const label = index === this.screenshots.length - 1
239
+ ? 'Current screenshot:'
240
+ : 'Previous screenshot:';
241
+ parts.push(new ContentPartTextParam(label));
242
+ parts.push(new ContentPartImageParam(new ImageURL(`data:image/png;base64,${shot}`, this.visionDetailLevel, 'image/png')));
243
+ });
244
+ const message = new UserMessage(parts);
245
+ message.cache = true;
246
+ return message;
247
+ }
248
+ const message = new UserMessage(stateDescription);
249
+ message.cache = true;
250
+ return message;
251
+ }
252
+ }
253
+ __decorate([
254
+ observe_debug({
255
+ name: 'agent_message_prompt:get_user_message',
256
+ ignore_input: true,
257
+ ignore_output: true,
258
+ })
259
+ ], AgentMessagePrompt.prototype, "get_user_message", null);
@@ -0,0 +1,290 @@
1
+ import { createLogger } from '../logging-config.js';
2
+ import { EventBus } from '../event-bus.js';
3
+ import type { Controller } from '../controller/service.js';
4
+ import type { FileSystem } from '../filesystem/file-system.js';
5
+ import { SystemPrompt } from './prompts.js';
6
+ import { MessageManager } from './message-manager/service.js';
7
+ import { BrowserStateSummary } from '../browser/views.js';
8
+ import { BrowserSession } from '../browser/session.js';
9
+ import { BrowserProfile } from '../browser/profile.js';
10
+ import type { Browser, BrowserContext, Page } from '../browser/types.js';
11
+ import type { BaseChatModel } from '../llm/base.js';
12
+ import { ActionResult, AgentHistoryList, AgentOutput, AgentSettings, AgentState, AgentStepInfo, ActionModel } from './views.js';
13
+ import type { StructuredOutputParser } from './views.js';
14
+ import { ScreenshotService } from '../screenshots/service.js';
15
+ import { ProductTelemetry } from '../telemetry/service.js';
16
+ export declare const log_response: (response: AgentOutput, registry?: Controller<any>, logInstance?: import("../logging-config.js").Logger) => void;
17
+ type ControllerContext = unknown;
18
+ type AgentHookFunc<Context, AgentStructuredOutput> = (agent: Agent<Context, AgentStructuredOutput>) => Promise<void> | void;
19
+ interface RerunHistoryOptions {
20
+ max_retries?: number;
21
+ skip_failures?: boolean;
22
+ delay_between_actions?: number;
23
+ signal?: AbortSignal | null;
24
+ }
25
+ interface AgentConstructorParams<Context, AgentStructuredOutput> {
26
+ task: string;
27
+ llm: BaseChatModel;
28
+ page?: Page | null;
29
+ browser?: Browser | BrowserSession | null;
30
+ browser_context?: BrowserContext | null;
31
+ browser_profile?: BrowserProfile | null;
32
+ browser_session?: BrowserSession | null;
33
+ controller?: Controller<Context> | null;
34
+ sensitive_data?: Record<string, string | Record<string, string>> | null;
35
+ initial_actions?: Array<Record<string, Record<string, unknown>>> | null;
36
+ register_new_step_callback?: ((summary: BrowserStateSummary, output: AgentOutput, step: number) => void | Promise<void>) | null;
37
+ register_done_callback?: ((history: AgentHistoryList<AgentStructuredOutput>) => void | Promise<void>) | null;
38
+ register_external_agent_status_raise_error_callback?: (() => Promise<boolean>) | null;
39
+ output_model_schema?: StructuredOutputParser<AgentStructuredOutput> | null;
40
+ use_vision?: boolean;
41
+ use_vision_for_planner?: boolean;
42
+ save_conversation_path?: string | null;
43
+ save_conversation_path_encoding?: BufferEncoding | null;
44
+ max_failures?: number;
45
+ retry_delay?: number;
46
+ override_system_message?: string | null;
47
+ extend_system_message?: string | null;
48
+ validate_output?: boolean;
49
+ generate_gif?: boolean | string;
50
+ available_file_paths?: string[] | null;
51
+ include_attributes?: string[];
52
+ max_actions_per_step?: number;
53
+ use_thinking?: boolean;
54
+ flash_mode?: boolean;
55
+ max_history_items?: number | null;
56
+ page_extraction_llm?: BaseChatModel | null;
57
+ planner_llm?: BaseChatModel | null;
58
+ planner_interval?: number;
59
+ is_planner_reasoning?: boolean;
60
+ extend_planner_system_message?: string | null;
61
+ injected_agent_state?: AgentState | null;
62
+ context?: Context | null;
63
+ source?: string | null;
64
+ file_system_path?: string | null;
65
+ task_id?: string | null;
66
+ cloud_sync?: any;
67
+ calculate_cost?: boolean;
68
+ display_files_in_done_text?: boolean;
69
+ include_tool_call_examples?: boolean;
70
+ vision_detail_level?: AgentSettings['vision_detail_level'];
71
+ session_attachment_mode?: AgentSettings['session_attachment_mode'];
72
+ llm_timeout?: number;
73
+ step_timeout?: number;
74
+ }
75
+ export declare class Agent<Context = ControllerContext, AgentStructuredOutput = unknown> {
76
+ private static _sharedSessionStepLocks;
77
+ static DEFAULT_AGENT_DATA_DIR: string;
78
+ browser_session: BrowserSession | null;
79
+ llm: BaseChatModel;
80
+ unfiltered_actions: string;
81
+ initial_actions: Array<Record<string, Record<string, unknown>>> | null;
82
+ register_new_step_callback: AgentConstructorParams<Context, AgentStructuredOutput>['register_new_step_callback'];
83
+ register_done_callback: AgentConstructorParams<Context, AgentStructuredOutput>['register_done_callback'];
84
+ register_external_agent_status_raise_error_callback: AgentConstructorParams<Context, AgentStructuredOutput>['register_external_agent_status_raise_error_callback'];
85
+ context: Context | null;
86
+ telemetry: ProductTelemetry;
87
+ eventbus: EventBus;
88
+ enable_cloud_sync: boolean;
89
+ cloud_sync: any;
90
+ file_system: FileSystem | null;
91
+ screenshot_service: ScreenshotService | null;
92
+ agent_directory: string;
93
+ private _current_screenshot_path;
94
+ has_downloads_path: boolean;
95
+ private _last_known_downloads;
96
+ version: string;
97
+ source: string;
98
+ step_start_time: number;
99
+ _external_pause_event: {
100
+ resolve: (() => void) | null;
101
+ promise: Promise<void>;
102
+ };
103
+ output_model_schema: StructuredOutputParser<AgentStructuredOutput> | null;
104
+ id: string;
105
+ task_id: string;
106
+ session_id: string;
107
+ task: string;
108
+ controller: Controller<Context>;
109
+ settings: AgentSettings;
110
+ token_cost_service: any;
111
+ state: AgentState;
112
+ history: AgentHistoryList<AgentStructuredOutput>;
113
+ _message_manager: MessageManager;
114
+ available_file_paths: string[];
115
+ sensitive_data: Record<string, string | Record<string, string>> | null;
116
+ _logger: ReturnType<typeof createLogger> | null;
117
+ _file_system_path: string | null;
118
+ agent_current_page: Page | null;
119
+ _session_start_time: number;
120
+ _task_start_time: number;
121
+ _force_exit_telemetry_logged: boolean;
122
+ private _closePromise;
123
+ private _hasBrowserSessionClaim;
124
+ private _sharedPinnedTabId;
125
+ private _enforceDoneOnlyForCurrentStep;
126
+ system_prompt_class: SystemPrompt;
127
+ ActionModel: typeof ActionModel;
128
+ AgentOutput: typeof AgentOutput;
129
+ DoneActionModel: typeof ActionModel;
130
+ DoneAgentOutput: typeof AgentOutput;
131
+ constructor(params: AgentConstructorParams<Context, AgentStructuredOutput>);
132
+ private _createSessionIdWithAgentSuffix;
133
+ private _copyBrowserProfile;
134
+ private _getBrowserContextFromPage;
135
+ private _claim_or_isolate_browser_session;
136
+ private _release_browser_session_claim;
137
+ private _has_any_browser_session_attachments;
138
+ private _is_shared_session_mode;
139
+ private _capture_shared_pinned_tab;
140
+ private _restore_shared_pinned_tab_if_needed;
141
+ private _run_with_shared_session_step_lock;
142
+ private _cleanup_shared_session_step_lock_if_unused;
143
+ private _init_browser_session;
144
+ private _sleep_blocking;
145
+ /**
146
+ * Convert dictionary-based actions to ActionModel instances
147
+ */
148
+ private _convertInitialActions;
149
+ /**
150
+ * Handle model-specific vision capabilities
151
+ * Some models like DeepSeek and Grok don't support vision yet
152
+ */
153
+ private _handleModelSpecificVision;
154
+ /**
155
+ * Verify that the LLM API keys are setup and the LLM API is responding properly.
156
+ * Also handles model capability detection.
157
+ */
158
+ private _verifyAndSetupLlm;
159
+ /**
160
+ * Validates security settings when sensitive_data is provided
161
+ * Checks if allowed_domains is properly configured to prevent credential leakage
162
+ */
163
+ private _validateSecuritySettings;
164
+ private _initFileSystem;
165
+ private _setScreenshotService;
166
+ get logger(): import("../logging-config.js").Logger;
167
+ get message_manager(): MessageManager;
168
+ /**
169
+ * Get the browser instance from the browser session
170
+ */
171
+ get browser(): Browser;
172
+ /**
173
+ * Get the browser context from the browser session
174
+ */
175
+ get browserContext(): BrowserContext;
176
+ /**
177
+ * Get the browser profile from the browser session
178
+ */
179
+ get browserProfile(): BrowserProfile;
180
+ /**
181
+ * Add a new task to the agent, keeping the same task_id as tasks are continuous
182
+ */
183
+ addNewTask(newTask: string): void;
184
+ /**
185
+ * Take a step and return whether the task is done and valid
186
+ * @returns Tuple of [is_done, is_valid]
187
+ */
188
+ takeStep(stepInfo?: AgentStepInfo): Promise<[boolean, boolean]>;
189
+ /**
190
+ * Remove think tags from text
191
+ */
192
+ private _removeThinkTags;
193
+ /**
194
+ * Log a comprehensive summary of the next action(s)
195
+ */
196
+ private _logNextActionSummary;
197
+ private _set_browser_use_version_and_source;
198
+ /**
199
+ * Setup dynamic action models from controller's registry
200
+ * Initially only include actions with no filters
201
+ */
202
+ private _setup_action_models;
203
+ /**
204
+ * Update action models with page-specific actions
205
+ * Called during each step to filter actions based on current page context
206
+ */
207
+ private _updateActionModelsForPage;
208
+ run(max_steps?: number, on_step_start?: AgentHookFunc<Context, AgentStructuredOutput> | null, on_step_end?: AgentHookFunc<Context, AgentStructuredOutput> | null): Promise<AgentHistoryList<AgentStructuredOutput>>;
209
+ private _executeWithTimeout;
210
+ _step(step_info?: AgentStepInfo | null, signal?: AbortSignal | null): Promise<void>;
211
+ private _prepare_context;
212
+ private _storeScreenshotForStep;
213
+ private _get_next_action;
214
+ private _execute_actions;
215
+ private _post_process;
216
+ multi_act(actions: Array<Record<string, Record<string, unknown>>>, options?: {
217
+ check_for_new_elements?: boolean;
218
+ signal?: AbortSignal | null;
219
+ }): Promise<ActionResult[]>;
220
+ rerun_history(history: AgentHistoryList, options?: RerunHistoryOptions): Promise<ActionResult[]>;
221
+ private _execute_history_step;
222
+ private _update_action_indices;
223
+ load_and_rerun(history_file?: string | null, options?: RerunHistoryOptions): Promise<ActionResult[]>;
224
+ save_history(file_path?: string | null): void;
225
+ private _coerceHistoryElement;
226
+ private _createAbortError;
227
+ private _throwIfAborted;
228
+ private _relayAbortSignal;
229
+ private _sleep;
230
+ wait_until_resumed(): Promise<void>;
231
+ log_completion(): Promise<void>;
232
+ pause(): void;
233
+ resume(): void;
234
+ stop(): void;
235
+ close(): Promise<void>;
236
+ /**
237
+ * Get the trace and trace_details objects for the agent
238
+ * Contains comprehensive metadata about the agent run for debugging and analysis
239
+ */
240
+ get_trace_object(): {
241
+ trace: Record<string, any>;
242
+ trace_details: Record<string, any>;
243
+ };
244
+ private _log_agent_run;
245
+ private _raise_if_stopped_or_paused;
246
+ private _handle_post_llm_processing;
247
+ /**
248
+ * Handle all types of errors that can occur during a step
249
+ * Implements comprehensive error categorization with:
250
+ * - Validation error hints
251
+ * - Rate limit auto-retry
252
+ * - Parse error guidance
253
+ * - Token limit warnings
254
+ * - Network error detection
255
+ * - Browser error handling
256
+ * - LLM-specific errors
257
+ */
258
+ private _handle_step_error;
259
+ /**
260
+ * Check if an error is a network error
261
+ */
262
+ private _isNetworkError;
263
+ /**
264
+ * Check if an error is a browser/Playwright error
265
+ */
266
+ private _isBrowserError;
267
+ /**
268
+ * Check if an error is a timeout error
269
+ */
270
+ private _isTimeoutError;
271
+ /**
272
+ * Check if an error is a rate limit error from various LLM providers
273
+ */
274
+ private _isRateLimitError;
275
+ private _finalize;
276
+ private _handle_final_step;
277
+ private _parseCompletionPayload;
278
+ private _isModelActionMissing;
279
+ private _get_model_output_with_retry;
280
+ private _validateAndNormalizeActions;
281
+ private _update_action_models_for_page;
282
+ private _check_and_update_downloads;
283
+ private _update_available_file_paths;
284
+ private _log_step_context;
285
+ private _log_step_completion_summary;
286
+ private _log_agent_event;
287
+ private _make_history_item;
288
+ save_file_system_state(): void;
289
+ }
290
+ export {};