@@ -3,7 +3,9 @@ import { zodToJsonSchema } from 'zod-to-json-schema';
33
44import { Tool } from '../../core/types.js' ;
55import { errorToString } from '../../utils/errorToString.js' ;
6+ import { sleep } from '../../utils/sleep.js' ;
67
8+ import { filterPageContent } from './filterPageContent.js' ;
79import { browserSessions , type BrowserAction , SelectorType } from './types.js' ;
810
911// Schema for browser action
@@ -71,8 +73,29 @@ export const browseMessageTool: Tool<Parameters, ReturnType> = {
7173 parameters : zodToJsonSchema ( parameterSchema ) ,
7274 returns : zodToJsonSchema ( returnSchema ) ,
7375
74- execute : async ( { instanceId, action } , { logger } ) : Promise < ReturnType > => {
76+ execute : async (
77+ { instanceId, action } ,
78+ { logger, pageFilter } ,
79+ ) : Promise < ReturnType > => {
80+ // Validate action format
81+ if ( ! action || typeof action !== 'object' ) {
82+ logger . error ( 'Invalid action format: action must be an object' ) ;
83+ return {
84+ status : 'error' ,
85+ error : 'Invalid action format: action must be an object' ,
86+ } ;
87+ }
88+
89+ if ( ! action . actionType ) {
90+ logger . error ( 'Invalid action format: actionType is required' ) ;
91+ return {
92+ status : 'error' ,
93+ error : 'Invalid action format: actionType is required' ,
94+ } ;
95+ }
96+
7597 logger . verbose ( `Executing browser action: ${ action . actionType } ` ) ;
98+ logger . verbose ( `Webpage processing mode: ${ pageFilter } ` ) ;
7699
77100 try {
78101 const session = browserSessions . get ( instanceId ) ;
@@ -87,10 +110,44 @@ export const browseMessageTool: Tool<Parameters, ReturnType> = {
87110 if ( ! action . url ) {
88111 throw new Error ( 'URL required for goto action' ) ;
89112 }
90- await page . goto ( action . url , { waitUntil : 'networkidle' } ) ;
91- const content = await page . content ( ) ;
92- logger . verbose ( 'Navigation completed successfully' ) ;
93- return { status : 'success' , content } ;
113+
114+ try {
115+ // Try with 'domcontentloaded' first which is more reliable than 'networkidle'
116+ logger . verbose (
117+ `Navigating to ${ action . url } with 'domcontentloaded' waitUntil` ,
118+ ) ;
119+ await page . goto ( action . url , { waitUntil : 'domcontentloaded' } ) ;
120+ await sleep ( 3000 ) ;
121+ const content = await filterPageContent ( page , pageFilter ) ;
122+ logger . verbose ( `Content: ${ content } ` ) ;
123+ logger . verbose (
124+ 'Navigation completed with domcontentloaded strategy' ,
125+ ) ;
126+ logger . verbose ( `Content length: ${ content . length } characters` ) ;
127+ return { status : 'success' , content } ;
128+ } catch ( navError ) {
129+ // If that fails, try with no waitUntil option
130+ logger . warn (
131+ `Failed with domcontentloaded strategy: ${ errorToString ( navError ) } ` ,
132+ ) ;
133+ logger . verbose (
134+ `Retrying navigation to ${ action . url } with no waitUntil option` ,
135+ ) ;
136+
137+ try {
138+ await page . goto ( action . url ) ;
139+ await sleep ( 3000 ) ;
140+ const content = await filterPageContent ( page , pageFilter ) ;
141+ logger . verbose ( `Content: ${ content } ` ) ;
142+ logger . verbose ( 'Navigation completed with basic strategy' ) ;
143+ return { status : 'success' , content } ;
144+ } catch ( innerError ) {
145+ logger . error (
146+ `Failed with basic navigation strategy: ${ errorToString ( innerError ) } ` ,
147+ ) ;
148+ throw innerError ; // Re-throw to be caught by outer catch block
149+ }
150+ }
94151 }
95152
96153 case 'click' : {
@@ -102,7 +159,8 @@ export const browseMessageTool: Tool<Parameters, ReturnType> = {
102159 action . selectorType ,
103160 ) ;
104161 await page . click ( clickSelector ) ;
105- const content = await page . content ( ) ;
162+ await sleep ( 1000 ) ; // Wait for any content changes after click
163+ const content = await filterPageContent ( page , pageFilter ) ;
106164 logger . verbose (
107165 `Click action completed on selector: ${ clickSelector } ` ,
108166 ) ;
@@ -136,8 +194,9 @@ export const browseMessageTool: Tool<Parameters, ReturnType> = {
136194 }
137195
138196 case 'content' : {
139- const content = await page . content ( ) ;
197+ const content = await filterPageContent ( page , pageFilter ) ;
140198 logger . verbose ( 'Page content retrieved successfully' ) ;
199+ logger . verbose ( `Content length: ${ content . length } characters` ) ;
141200 return { status : 'success' , content } ;
142201 }
143202
@@ -164,9 +223,12 @@ export const browseMessageTool: Tool<Parameters, ReturnType> = {
164223 }
165224 } ,
166225
167- logParameters : ( { action, description } , { logger } ) => {
226+ logParameters : (
227+ { action, description } ,
228+ { logger, pageFilter = 'simple' } ,
229+ ) => {
168230 logger . info (
169- `Performing browser action: ${ action . actionType } , ${ description } ` ,
231+ `Performing browser action: ${ action . actionType } with ${ pageFilter } processing , ${ description } ` ,
170232 ) ;
171233 } ,
172234
0 commit comments