@diegosouzacdv/jev-browser-mcp 0.3.1 → 0.4.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.
@@ -16,8 +16,23 @@ const CONFIG_KEYS = {
16
16
  "max_flow_steps",
17
17
  "max_text_entry_chars",
18
18
  ],
19
- nodeBrowser: [
20
- "max_action_timeout_seconds",
19
+ nodeBrowser: [
20
+ "max_action_timeout_seconds",
21
+ "ready_timeout_seconds_default",
22
+ "max_ready_timeout_seconds",
23
+ "ready_network_idle_default",
24
+ "ready_stable_ms_default",
25
+ "max_ready_stable_ms",
26
+ "post_step_ready_timeout_seconds_default",
27
+ "max_step_timeout_seconds",
28
+ "key_delay_ms_default",
29
+ "reuse_page_default",
30
+ "stop_on_expected_default",
31
+ "snapshot_include_hidden_default",
32
+ "visibility_poll_interval_ms_default",
33
+ "capture_network_error_bodies_default",
34
+ "max_network_error_body_bytes",
35
+ "max_network_error_message_chars",
21
36
  "max_upload_files",
22
37
  "max_upload_path_chars",
23
38
  "max_upload_file_bytes",
@@ -206,7 +221,7 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
206
221
  const uploadRoot = configuredUploadRoot
207
222
  ? configuredDirectory(configuredUploadRoot, `environment ${uploadRootEnv}`)
208
223
  : null;
209
- const snapshotScope = browserOptions.snapshot_scope_default;
224
+ const snapshotScope = browserOptions.snapshot_scope_default;
210
225
  if (!new Set(["body", "main", "dialog"]).has(snapshotScope)) {
211
226
  throw new JevBrowserError("config/ui-testing.json jev_browser_mcp.browser.snapshot_scope_default must be body, main, or dialog");
212
227
  }
@@ -215,11 +230,28 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
215
230
  "jev_browser_mcp.browser.tracker_host_suffixes",
216
231
  (host) => /^[a-z0-9.-]+$/i.test(host) && !host.startsWith(".") && !host.endsWith("."),
217
232
  );
218
- const blockedResourceTypes = stringList(
233
+ const blockedResourceTypes = stringList(
219
234
  browserOptions.blocked_resource_types,
220
235
  "jev_browser_mcp.browser.blocked_resource_types",
221
236
  (type) => new Set(["font", "media", "image"]).has(type),
222
- );
237
+ );
238
+ const maxReadyTimeoutSeconds = positiveNumber(browserOptions.max_ready_timeout_seconds, "jev_browser_mcp.browser.max_ready_timeout_seconds");
239
+ const readyTimeoutSecondsDefault = positiveNumber(browserOptions.ready_timeout_seconds_default, "jev_browser_mcp.browser.ready_timeout_seconds_default");
240
+ const maxReadyStableMs = positiveNumber(browserOptions.max_ready_stable_ms, "jev_browser_mcp.browser.max_ready_stable_ms", true);
241
+ const readyStableMsDefault = positiveNumber(browserOptions.ready_stable_ms_default, "jev_browser_mcp.browser.ready_stable_ms_default", true);
242
+ if (readyTimeoutSecondsDefault > maxReadyTimeoutSeconds) {
243
+ throw new JevBrowserError("config/ui-testing.json ready timeout default exceeds its configured maximum");
244
+ }
245
+ if (readyStableMsDefault > maxReadyStableMs) {
246
+ throw new JevBrowserError("config/ui-testing.json stable snapshot default exceeds its configured maximum");
247
+ }
248
+ const postStepReadyTimeoutSeconds = positiveNumber(
249
+ browserOptions.post_step_ready_timeout_seconds_default,
250
+ "jev_browser_mcp.browser.post_step_ready_timeout_seconds_default",
251
+ );
252
+ if (postStepReadyTimeoutSeconds > maxReadyTimeoutSeconds) {
253
+ throw new JevBrowserError("config/ui-testing.json post-step readiness timeout exceeds its configured maximum");
254
+ }
223
255
 
224
256
  return Object.freeze({
225
257
  env,
@@ -229,7 +261,15 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
229
261
  profileDir: profileDirectory(profileTemplate, channel, env.JEV_BROWSER_PROFILE),
230
262
  maxFlowSteps: positiveNumber(document.browser.max_flow_steps, "browser.max_flow_steps", true),
231
263
  maxTextEntryChars: positiveNumber(document.browser.max_text_entry_chars, "browser.max_text_entry_chars", true),
232
- actionTimeoutMs: positiveNumber(browserOptions.max_action_timeout_seconds, "jev_browser_mcp.browser.max_action_timeout_seconds") * 1000,
264
+ actionTimeoutMs: positiveNumber(browserOptions.max_action_timeout_seconds, "jev_browser_mcp.browser.max_action_timeout_seconds") * 1000,
265
+ maxReadyTimeoutSeconds,
266
+ maxReadyStableMs,
267
+ postStepReadyTimeoutMs: postStepReadyTimeoutSeconds * 1000,
268
+ maxStepTimeoutSeconds: positiveNumber(browserOptions.max_step_timeout_seconds, "jev_browser_mcp.browser.max_step_timeout_seconds"),
269
+ keyDelayMs: positiveNumber(browserOptions.key_delay_ms_default, "jev_browser_mcp.browser.key_delay_ms_default", true),
270
+ visibilityPollMs: positiveNumber(browserOptions.visibility_poll_interval_ms_default, "jev_browser_mcp.browser.visibility_poll_interval_ms_default", true),
271
+ maxNetworkErrorBodyBytes: positiveNumber(browserOptions.max_network_error_body_bytes, "jev_browser_mcp.browser.max_network_error_body_bytes", true),
272
+ maxNetworkErrorMessageChars: positiveNumber(browserOptions.max_network_error_message_chars, "jev_browser_mcp.browser.max_network_error_message_chars", true),
233
273
  maxUploadFiles: positiveNumber(browserOptions.max_upload_files, "jev_browser_mcp.browser.max_upload_files", true),
234
274
  maxUploadPathChars: positiveNumber(browserOptions.max_upload_path_chars, "jev_browser_mcp.browser.max_upload_path_chars", true),
235
275
  maxUploadFileBytes: positiveNumber(browserOptions.max_upload_file_bytes, "jev_browser_mcp.browser.max_upload_file_bytes", true),
@@ -246,8 +286,15 @@ export function loadSettings({ env = process.env, configPath = CONFIG_PATH } = {
246
286
  screenshotOnFailure: booleanValue(browserOptions.screenshot_on_failure_default, "jev_browser_mcp.browser.screenshot_on_failure_default"),
247
287
  traceOnFailure: booleanValue(browserOptions.trace_on_failure_default, "jev_browser_mcp.browser.trace_on_failure_default"),
248
288
  captureConsoleErrors: booleanValue(browserOptions.capture_console_errors_default, "jev_browser_mcp.browser.capture_console_errors_default"),
249
- captureNetworkErrors: booleanValue(browserOptions.capture_network_errors_default, "jev_browser_mcp.browser.capture_network_errors_default"),
250
- blockTrackers: booleanValue(browserOptions.block_trackers_default, "jev_browser_mcp.browser.block_trackers_default"),
289
+ captureNetworkErrors: booleanValue(browserOptions.capture_network_errors_default, "jev_browser_mcp.browser.capture_network_errors_default"),
290
+ captureNetworkErrorBodies: booleanValue(browserOptions.capture_network_error_bodies_default, "jev_browser_mcp.browser.capture_network_error_bodies_default"),
291
+ blockTrackers: booleanValue(browserOptions.block_trackers_default, "jev_browser_mcp.browser.block_trackers_default"),
292
+ readyNetworkIdle: booleanValue(browserOptions.ready_network_idle_default, "jev_browser_mcp.browser.ready_network_idle_default"),
293
+ reusePage: booleanValue(browserOptions.reuse_page_default, "jev_browser_mcp.browser.reuse_page_default"),
294
+ stopOnExpected: booleanValue(browserOptions.stop_on_expected_default, "jev_browser_mcp.browser.stop_on_expected_default"),
295
+ snapshotIncludeHidden: booleanValue(browserOptions.snapshot_include_hidden_default, "jev_browser_mcp.browser.snapshot_include_hidden_default"),
296
+ readyTimeoutSeconds: readyTimeoutSecondsDefault,
297
+ readyStableMs: readyStableMsDefault,
251
298
  snapshotScope,
252
299
  }),
253
300
  trackerHostSuffixes: Object.freeze(trackerHostSuffixes),