@mastra/agent-browser 0.3.0-alpha.0 → 0.3.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @mastra/agent-browser
2
2
 
3
+ ## 0.3.0-alpha.1
4
+
5
+ ### Minor Changes
6
+
7
+ - Add `waitUntil` support to `browser_click`, `browser_press`, and `browser_select`. When provided, the tool waits for the page to reach the given load state (`load`, `domcontentloaded`, or `networkidle`) after the action completes, preventing the next `browser_snapshot` from capturing stale DOM when the interaction triggers navigation. The parameter is optional and behaviour is unchanged when omitted. ([#17426](https://github.com/mastra-ai/mastra/pull/17426))
8
+
9
+ Usage example:
10
+
11
+ ```ts
12
+ await browser_click({ ref: '@e1', waitUntil: 'domcontentloaded', timeout: 5000 });
13
+ ```
14
+
15
+ Fixes #17397.
16
+
17
+ ### Patch Changes
18
+
19
+ - Updated dependencies [[`19a8658`](https://github.com/mastra-ai/mastra/commit/19a86589c788ef48bb6c1b0612cc82a201857379), [`a659a77`](https://github.com/mastra-ai/mastra/commit/a659a779bdebe3a52a518c56d2260592d0240fe0), [`3332be9`](https://github.com/mastra-ai/mastra/commit/3332be9701ecd77aba840959d9a1d1ce7aef02d3)]:
20
+ - @mastra/core@1.38.0-alpha.6
21
+
3
22
  ## 0.3.0-alpha.0
4
23
 
5
24
  ### Minor Changes
package/dist/index.cjs CHANGED
@@ -141,7 +141,9 @@ var clickInputSchema = zod.z.object({
141
141
  ref: zod.z.string().describe("Element ref from snapshot (e.g., @e5)"),
142
142
  button: zod.z.enum(["left", "right", "middle"]).optional().describe("Mouse button (default: left)"),
143
143
  clickCount: zod.z.number().optional().describe("Number of clicks (default: 1, use 2 for double-click)"),
144
- modifiers: zod.z.array(zod.z.enum(["Alt", "Control", "Meta", "Shift"])).optional().describe("Modifier keys to hold")
144
+ modifiers: zod.z.array(zod.z.enum(["Alt", "Control", "Meta", "Shift"])).optional().describe("Modifier keys to hold"),
145
+ waitUntil: zod.z.enum(["load", "domcontentloaded", "networkidle"]).optional().describe("If the click triggers a navigation, wait for this page load state before returning"),
146
+ timeout: zod.z.number().nonnegative().optional().describe("Timeout in milliseconds for the click and optional waitUntil")
145
147
  });
146
148
  var typeInputSchema = zod.z.object({
147
149
  ref: zod.z.string().describe("Element ref from snapshot"),
@@ -151,13 +153,17 @@ var typeInputSchema = zod.z.object({
151
153
  });
152
154
  var pressInputSchema = zod.z.object({
153
155
  key: zod.z.string().describe("Key to press (e.g., Enter, Tab, Escape, Control+a)"),
154
- modifiers: zod.z.array(zod.z.enum(["Alt", "Control", "Meta", "Shift"])).optional().describe("Modifier keys to hold")
156
+ modifiers: zod.z.array(zod.z.enum(["Alt", "Control", "Meta", "Shift"])).optional().describe("Modifier keys to hold"),
157
+ waitUntil: zod.z.enum(["load", "domcontentloaded", "networkidle"]).optional().describe("If the key press triggers a navigation, wait for this page load state before returning"),
158
+ timeout: zod.z.number().nonnegative().optional().describe("Timeout in milliseconds for the optional waitUntil")
155
159
  });
156
160
  var selectInputSchema = zod.z.object({
157
161
  ref: zod.z.string().describe("Select element ref from snapshot"),
158
162
  value: zod.z.string().optional().describe("Option value to select"),
159
163
  label: zod.z.string().optional().describe("Option label to select"),
160
- index: zod.z.number().int().min(0).optional().describe("Option index to select (0-based)")
164
+ index: zod.z.number().int().min(0).optional().describe("Option index to select (0-based)"),
165
+ waitUntil: zod.z.enum(["load", "domcontentloaded", "networkidle"]).optional().describe("If the selection triggers a navigation, wait for this page load state before returning"),
166
+ timeout: zod.z.number().nonnegative().optional().describe("Timeout in milliseconds for the selection and optional waitUntil")
161
167
  }).superRefine((data, ctx) => {
162
168
  if (data.value === void 0 && data.label === void 0 && data.index === void 0) {
163
169
  ctx.addIssue({
@@ -293,7 +299,7 @@ function createBackTool(browser) {
293
299
  function createClickTool(browser) {
294
300
  return tools.createTool({
295
301
  id: BROWSER_TOOLS.CLICK,
296
- description: "Click an element using its ref from a snapshot. Use clickCount: 2 for double-click.",
302
+ description: "Click an element using its ref from a snapshot. Use clickCount: 2 for double-click. Pass waitUntil when the click triggers navigation so the page settles before the next snapshot.",
297
303
  inputSchema: clickInputSchema,
298
304
  execute: async (input, { agent }) => {
299
305
  const threadId = agent?.threadId;
@@ -390,7 +396,7 @@ function createHoverTool(browser) {
390
396
  function createPressTool(browser) {
391
397
  return tools.createTool({
392
398
  id: BROWSER_TOOLS.PRESS,
393
- description: "Press a keyboard key (e.g., Enter, Tab, Escape, Control+a).",
399
+ description: "Press a keyboard key (e.g., Enter, Tab, Escape, Control+a). Pass waitUntil when the keypress triggers navigation (e.g., Enter to submit a form) so the page settles before the next snapshot.",
394
400
  inputSchema: pressInputSchema,
395
401
  execute: async (input, { agent }) => {
396
402
  const threadId = agent?.threadId;
@@ -448,7 +454,7 @@ function createScrollTool(browser) {
448
454
  function createSelectTool(browser) {
449
455
  return tools.createTool({
450
456
  id: BROWSER_TOOLS.SELECT,
451
- description: "Select an option from a dropdown by value, label, or index.",
457
+ description: "Select an option from a dropdown by value, label, or index. Pass waitUntil when the selection triggers navigation so the page settles before the next snapshot.",
452
458
  inputSchema: selectInputSchema,
453
459
  execute: async (input, { agent }) => {
454
460
  const threadId = agent?.threadId;
@@ -1091,12 +1097,15 @@ var AgentBrowser = class extends browser.MastraBrowser {
1091
1097
  "Take a new snapshot to see the current page state and get fresh refs."
1092
1098
  );
1093
1099
  }
1100
+ const timeout = input.timeout ?? this.defaultTimeout;
1101
+ const navigation = input.waitUntil ? page.waitForNavigation({ waitUntil: input.waitUntil, timeout }) : void 0;
1094
1102
  await locator.click({
1095
1103
  button: input.button ?? "left",
1096
1104
  clickCount: input.clickCount ?? 1,
1097
1105
  modifiers: input.modifiers,
1098
- timeout: this.defaultTimeout
1106
+ timeout
1099
1107
  });
1108
+ await navigation;
1100
1109
  return {
1101
1110
  success: true,
1102
1111
  url: page.url(),
@@ -1165,7 +1174,10 @@ var AgentBrowser = class extends browser.MastraBrowser {
1165
1174
  async press(input, threadId) {
1166
1175
  try {
1167
1176
  const page = await this.getPage(threadId);
1177
+ const timeout = input.timeout ?? this.defaultTimeout;
1178
+ const navigation = input.waitUntil ? page.waitForNavigation({ waitUntil: input.waitUntil, timeout }) : void 0;
1168
1179
  await page.keyboard.press(input.key);
1180
+ await navigation;
1169
1181
  return {
1170
1182
  success: true,
1171
1183
  url: page.url(),
@@ -1193,9 +1205,10 @@ var AgentBrowser = class extends browser.MastraBrowser {
1193
1205
  if (input.value) selectValue.value = input.value;
1194
1206
  if (input.label) selectValue.label = input.label;
1195
1207
  if (input.index !== void 0) selectValue.index = input.index;
1196
- const selected = await locator.selectOption(selectValue, {
1197
- timeout: this.defaultTimeout
1198
- });
1208
+ const timeout = input.timeout ?? this.defaultTimeout;
1209
+ const navigation = input.waitUntil ? page.waitForNavigation({ waitUntil: input.waitUntil, timeout }) : void 0;
1210
+ const selected = await locator.selectOption(selectValue, { timeout });
1211
+ await navigation;
1199
1212
  return {
1200
1213
  success: true,
1201
1214
  selected,