@rolepod/uiproof 0.4.1 → 0.6.0

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/dist/index.d.ts CHANGED
@@ -3,10 +3,18 @@ import { z } from 'zod';
3
3
  import { Page } from 'playwright';
4
4
 
5
5
  /**
6
- * Writes artifacts under `./.rolepod-uiproof/artifacts/{run_id}/` (D-026).
6
+ * Writes run artifacts. In **standalone** mode (default) — and in v0.4 and
7
+ * earlier — runs live under `./.rolepod-uiproof/artifacts/{prefix}_{ts}_{uuid}/`.
7
8
  *
8
- * v0.1 emits two formats: PNG screenshots and a JSON replay bundle. Future
9
- * milestones extend the format set (HAR, console log, a11y tree, video).
9
+ * In **with-parent** mode activated automatically when the env var
10
+ * `ROLEPOD_PARENT=1` is set by the parent `rolepod` plugin's SessionStart
11
+ * hook — runs live under `./.rolepod/evidence/{ts}-rolepod-uiproof-{skill}/`,
12
+ * per the Extension Protocol v1 evidence-path convention. Parent's
13
+ * `check-work` skill aggregates manifest.json files from this directory.
14
+ *
15
+ * Baselines for `visual_diff` always live in `./.rolepod-uiproof/baselines/`
16
+ * regardless of mode — they are user-curated configuration, not per-run
17
+ * evidence.
10
18
  */
11
19
  type ReplayStep = Record<string, unknown>;
12
20
  type ReplayBundle = {
@@ -17,16 +25,45 @@ type ReplayBundle = {
17
25
  steps: ReplayStep[];
18
26
  expect: ReplayStep[];
19
27
  };
28
+ type ArtifactMode = "standalone" | "with-parent";
29
+ type StartRunOptions = {
30
+ /**
31
+ * Skill name as it appears in marketplace (`verify-ui`, `audit-a11y`,
32
+ * `visual-diff`, `scaffold-e2e`, `check-errors`). REQUIRED when emitting
33
+ * a manifest.json (Extension Protocol v1) so parent's `check-work` can
34
+ * route artifacts to the right phase.
35
+ *
36
+ * In `with-parent` mode the run dirname is derived from this field; if
37
+ * omitted the `prefix` argument is used as a fallback (legacy).
38
+ */
39
+ skill?: string;
40
+ };
41
+ type StartRunResult = {
42
+ runId: string;
43
+ runDir: string;
44
+ skill: string;
45
+ mode: ArtifactMode;
46
+ };
20
47
  declare class ArtifactStore {
21
48
  readonly rootDir: string;
49
+ readonly mode: ArtifactMode;
50
+ private readonly baselineRoot;
22
51
  constructor(opts?: {
23
52
  rootDir?: string;
53
+ mode?: ArtifactMode;
24
54
  });
25
- /** Allocate a fresh run id and ensure its directory exists. */
26
- startRun(prefix?: string): Promise<{
27
- runId: string;
28
- runDir: string;
29
- }>;
55
+ /**
56
+ * Allocate a fresh run dir and ensure it exists.
57
+ *
58
+ * - standalone: `./.rolepod-uiproof/artifacts/{prefix}_{ts}_{uuid}/`
59
+ * - with-parent: `./.rolepod/evidence/{ts}-rolepod-uiproof-{skill}/`
60
+ *
61
+ * `prefix` is preserved for back-compat with v0.5 callers; new callers
62
+ * should also pass `opts.skill` so the with-parent path can be derived
63
+ * unambiguously and the manifest can be emitted with the canonical
64
+ * skill name.
65
+ */
66
+ startRun(prefix?: string, opts?: StartRunOptions): Promise<StartRunResult>;
30
67
  writeScreenshot(runDir: string, buf: Buffer, name: string): Promise<string>;
31
68
  writeReplayBundle(runDir: string, bundle: ReplayBundle, name?: string): Promise<string>;
32
69
  writeReport(runDir: string, name: string, body: string): Promise<string>;
@@ -238,6 +275,269 @@ declare const browserNavigateSchema: z.ZodObject<{
238
275
  session_id: z.ZodString;
239
276
  url: z.ZodString;
240
277
  }, z.core.$strip>;
278
+ declare const browserHoverShape: {
279
+ readonly session_id: z.ZodString;
280
+ readonly ref: z.ZodString;
281
+ };
282
+ declare const browserHoverSchema: z.ZodObject<{
283
+ session_id: z.ZodString;
284
+ ref: z.ZodString;
285
+ }, z.core.$strip>;
286
+ declare const browserDragShape: {
287
+ readonly session_id: z.ZodString;
288
+ readonly from_ref: z.ZodString;
289
+ readonly to_ref: z.ZodString;
290
+ };
291
+ declare const browserDragSchema: z.ZodObject<{
292
+ session_id: z.ZodString;
293
+ from_ref: z.ZodString;
294
+ to_ref: z.ZodString;
295
+ }, z.core.$strip>;
296
+ declare const browserFillFormShape: {
297
+ readonly session_id: z.ZodString;
298
+ readonly fields: z.ZodArray<z.ZodObject<{
299
+ ref: z.ZodString;
300
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>;
301
+ kind: z.ZodOptional<z.ZodEnum<{
302
+ input: "input";
303
+ select: "select";
304
+ checkbox: "checkbox";
305
+ radio: "radio";
306
+ }>>;
307
+ }, z.core.$strip>>;
308
+ };
309
+ declare const browserFillFormSchema: z.ZodObject<{
310
+ session_id: z.ZodString;
311
+ fields: z.ZodArray<z.ZodObject<{
312
+ ref: z.ZodString;
313
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>;
314
+ kind: z.ZodOptional<z.ZodEnum<{
315
+ input: "input";
316
+ select: "select";
317
+ checkbox: "checkbox";
318
+ radio: "radio";
319
+ }>>;
320
+ }, z.core.$strip>>;
321
+ }, z.core.$strip>;
322
+ declare const browserUploadFileShape: {
323
+ readonly session_id: z.ZodString;
324
+ readonly ref: z.ZodString;
325
+ readonly file_path: z.ZodString;
326
+ };
327
+ declare const browserUploadFileSchema: z.ZodObject<{
328
+ session_id: z.ZodString;
329
+ ref: z.ZodString;
330
+ file_path: z.ZodString;
331
+ }, z.core.$strip>;
332
+ declare const browserHandleDialogShape: {
333
+ readonly session_id: z.ZodString;
334
+ readonly action: z.ZodEnum<{
335
+ accept: "accept";
336
+ dismiss: "dismiss";
337
+ accept_with_text: "accept_with_text";
338
+ }>;
339
+ /** Only used when action='accept_with_text'. */
340
+ readonly text: z.ZodOptional<z.ZodString>;
341
+ /**
342
+ * Arming behavior: registers a one-shot handler for the NEXT dialog
343
+ * raised on the page. Call this BEFORE the action that triggers the
344
+ * dialog (e.g. before clicking the button that calls `confirm()`).
345
+ * Default 30s if no dialog appears, handler is auto-removed.
346
+ */
347
+ readonly timeout_ms: z.ZodOptional<z.ZodNumber>;
348
+ };
349
+ declare const browserHandleDialogSchema: z.ZodObject<{
350
+ session_id: z.ZodString;
351
+ action: z.ZodEnum<{
352
+ accept: "accept";
353
+ dismiss: "dismiss";
354
+ accept_with_text: "accept_with_text";
355
+ }>;
356
+ text: z.ZodOptional<z.ZodString>;
357
+ timeout_ms: z.ZodOptional<z.ZodNumber>;
358
+ }, z.core.$strip>;
359
+ declare const browserConsoleShape: {
360
+ readonly session_id: z.ZodString;
361
+ /** Filter to only these levels. Default: errors+warnings. */
362
+ readonly levels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
363
+ info: "info";
364
+ error: "error";
365
+ debug: "debug";
366
+ warning: "warning";
367
+ log: "log";
368
+ trace: "trace";
369
+ }>>>;
370
+ /** Substring match on message text. */
371
+ readonly contains: z.ZodOptional<z.ZodString>;
372
+ /** Drop all buffered messages after returning. */
373
+ readonly clear: z.ZodDefault<z.ZodBoolean>;
374
+ /** Cap on returned messages (artifact still holds full ring buffer). */
375
+ readonly limit: z.ZodDefault<z.ZodNumber>;
376
+ };
377
+ declare const browserConsoleSchema: z.ZodObject<{
378
+ session_id: z.ZodString;
379
+ levels: z.ZodOptional<z.ZodArray<z.ZodEnum<{
380
+ info: "info";
381
+ error: "error";
382
+ debug: "debug";
383
+ warning: "warning";
384
+ log: "log";
385
+ trace: "trace";
386
+ }>>>;
387
+ contains: z.ZodOptional<z.ZodString>;
388
+ clear: z.ZodDefault<z.ZodBoolean>;
389
+ limit: z.ZodDefault<z.ZodNumber>;
390
+ }, z.core.$strip>;
391
+ declare const browserNetworkShape: {
392
+ readonly session_id: z.ZodString;
393
+ /** Substring or regex (per `pattern_kind`) match on URL. */
394
+ readonly url_pattern: z.ZodOptional<z.ZodString>;
395
+ readonly pattern_kind: z.ZodDefault<z.ZodEnum<{
396
+ substring: "substring";
397
+ regex: "regex";
398
+ }>>;
399
+ readonly method: z.ZodOptional<z.ZodString>;
400
+ /** Inclusive range — e.g. `{min: 400, max: 599}` for any error response. */
401
+ readonly status_range: z.ZodOptional<z.ZodObject<{
402
+ min: z.ZodNumber;
403
+ max: z.ZodNumber;
404
+ }, z.core.$strip>>;
405
+ readonly only_failed: z.ZodDefault<z.ZodBoolean>;
406
+ /** Write the full HAR file for this session to artifacts/{runId}/network.har. */
407
+ readonly export_har: z.ZodDefault<z.ZodBoolean>;
408
+ /** Drop buffered entries after returning. */
409
+ readonly clear: z.ZodDefault<z.ZodBoolean>;
410
+ readonly limit: z.ZodDefault<z.ZodNumber>;
411
+ };
412
+ declare const browserNetworkSchema: z.ZodObject<{
413
+ session_id: z.ZodString;
414
+ url_pattern: z.ZodOptional<z.ZodString>;
415
+ pattern_kind: z.ZodDefault<z.ZodEnum<{
416
+ substring: "substring";
417
+ regex: "regex";
418
+ }>>;
419
+ method: z.ZodOptional<z.ZodString>;
420
+ status_range: z.ZodOptional<z.ZodObject<{
421
+ min: z.ZodNumber;
422
+ max: z.ZodNumber;
423
+ }, z.core.$strip>>;
424
+ only_failed: z.ZodDefault<z.ZodBoolean>;
425
+ export_har: z.ZodDefault<z.ZodBoolean>;
426
+ clear: z.ZodDefault<z.ZodBoolean>;
427
+ limit: z.ZodDefault<z.ZodNumber>;
428
+ }, z.core.$strip>;
429
+ /**
430
+ * Runtime environment mutation. Merges resize+emulate. Fields here are
431
+ * the ones Playwright supports changing AFTER context creation. Things
432
+ * that must be set at context-creation time (user_agent, locale,
433
+ * timezone) live on `browser_open` and cannot be changed mid-session.
434
+ *
435
+ * `network_throttle` and `cpu_throttle` are chromium-only (CDP-backed).
436
+ */
437
+ declare const browserSetEnvShape: {
438
+ readonly session_id: z.ZodString;
439
+ readonly viewport: z.ZodOptional<z.ZodObject<{
440
+ width: z.ZodNumber;
441
+ height: z.ZodNumber;
442
+ }, z.core.$strip>>;
443
+ readonly offline: z.ZodOptional<z.ZodBoolean>;
444
+ readonly geolocation: z.ZodOptional<z.ZodObject<{
445
+ latitude: z.ZodNumber;
446
+ longitude: z.ZodNumber;
447
+ accuracy: z.ZodOptional<z.ZodNumber>;
448
+ }, z.core.$strip>>;
449
+ readonly color_scheme: z.ZodOptional<z.ZodEnum<{
450
+ light: "light";
451
+ dark: "dark";
452
+ "no-preference": "no-preference";
453
+ }>>;
454
+ readonly reduced_motion: z.ZodOptional<z.ZodEnum<{
455
+ reduce: "reduce";
456
+ "no-preference": "no-preference";
457
+ }>>;
458
+ readonly extra_headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
459
+ readonly network_throttle: z.ZodOptional<z.ZodEnum<{
460
+ offline: "offline";
461
+ "slow-3g": "slow-3g";
462
+ "fast-3g": "fast-3g";
463
+ "slow-4g": "slow-4g";
464
+ "fast-4g": "fast-4g";
465
+ "no-throttling": "no-throttling";
466
+ }>>;
467
+ /** CPU slowdown multiplier (1 = no throttle, 4 = 4x slower). Chromium only. */
468
+ readonly cpu_throttle: z.ZodOptional<z.ZodNumber>;
469
+ };
470
+ declare const browserSetEnvSchema: z.ZodObject<{
471
+ session_id: z.ZodString;
472
+ viewport: z.ZodOptional<z.ZodObject<{
473
+ width: z.ZodNumber;
474
+ height: z.ZodNumber;
475
+ }, z.core.$strip>>;
476
+ offline: z.ZodOptional<z.ZodBoolean>;
477
+ geolocation: z.ZodOptional<z.ZodObject<{
478
+ latitude: z.ZodNumber;
479
+ longitude: z.ZodNumber;
480
+ accuracy: z.ZodOptional<z.ZodNumber>;
481
+ }, z.core.$strip>>;
482
+ color_scheme: z.ZodOptional<z.ZodEnum<{
483
+ light: "light";
484
+ dark: "dark";
485
+ "no-preference": "no-preference";
486
+ }>>;
487
+ reduced_motion: z.ZodOptional<z.ZodEnum<{
488
+ reduce: "reduce";
489
+ "no-preference": "no-preference";
490
+ }>>;
491
+ extra_headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
492
+ network_throttle: z.ZodOptional<z.ZodEnum<{
493
+ offline: "offline";
494
+ "slow-3g": "slow-3g";
495
+ "fast-3g": "fast-3g";
496
+ "slow-4g": "slow-4g";
497
+ "fast-4g": "fast-4g";
498
+ "no-throttling": "no-throttling";
499
+ }>>;
500
+ cpu_throttle: z.ZodOptional<z.ZodNumber>;
501
+ }, z.core.$strip>;
502
+ /**
503
+ * Execute JavaScript in the page context. GATED: server must be started
504
+ * with env `ROLEPOD_ALLOW_EVAL=1`, otherwise the tool returns an
505
+ * `eval_disabled` error. Equivalent to arbitrary code execution — only
506
+ * enable for trusted automation scenarios.
507
+ *
508
+ * `script` is the body of an async function whose return value is sent
509
+ * back as `result`. Use `args` to pass JSON-serialisable values.
510
+ */
511
+ declare const browserEvaluateShape: {
512
+ readonly session_id: z.ZodString;
513
+ readonly script: z.ZodString;
514
+ readonly args: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
515
+ };
516
+ declare const browserEvaluateSchema: z.ZodObject<{
517
+ session_id: z.ZodString;
518
+ script: z.ZodString;
519
+ args: z.ZodOptional<z.ZodArray<z.ZodUnknown>>;
520
+ }, z.core.$strip>;
521
+ /**
522
+ * Multi-page support. A session owns one browser context, which may
523
+ * have multiple pages (e.g. when an OAuth popup or `target="_blank"`
524
+ * link opens). The active page index is sticky — all subsequent
525
+ * tool calls operate on it until `switch_page` changes it.
526
+ */
527
+ declare const browserPagesShape: {
528
+ readonly session_id: z.ZodString;
529
+ };
530
+ declare const browserPagesSchema: z.ZodObject<{
531
+ session_id: z.ZodString;
532
+ }, z.core.$strip>;
533
+ declare const browserSwitchPageShape: {
534
+ readonly session_id: z.ZodString;
535
+ readonly index: z.ZodNumber;
536
+ };
537
+ declare const browserSwitchPageSchema: z.ZodObject<{
538
+ session_id: z.ZodString;
539
+ index: z.ZodNumber;
540
+ }, z.core.$strip>;
241
541
  declare const verifyUiFlowShape: {
242
542
  readonly mode: z.ZodDefault<z.ZodEnum<{
243
543
  assert: "assert";
@@ -297,6 +597,74 @@ declare const verifyUiFlowShape: {
297
597
  }, z.core.$strip>, z.ZodObject<{
298
598
  kind: z.ZodLiteral<"navigate">;
299
599
  url: z.ZodString;
600
+ }, z.core.$strip>, z.ZodObject<{
601
+ kind: z.ZodLiteral<"hover">;
602
+ query: z.ZodString;
603
+ }, z.core.$strip>, z.ZodObject<{
604
+ kind: z.ZodLiteral<"drag">;
605
+ from_query: z.ZodString;
606
+ to_query: z.ZodString;
607
+ }, z.core.$strip>, z.ZodObject<{
608
+ kind: z.ZodLiteral<"fill_form">;
609
+ fields: z.ZodArray<z.ZodObject<{
610
+ query: z.ZodString;
611
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>;
612
+ kind: z.ZodOptional<z.ZodEnum<{
613
+ input: "input";
614
+ select: "select";
615
+ checkbox: "checkbox";
616
+ radio: "radio";
617
+ }>>;
618
+ }, z.core.$strip>>;
619
+ }, z.core.$strip>, z.ZodObject<{
620
+ kind: z.ZodLiteral<"upload">;
621
+ query: z.ZodString;
622
+ file_path: z.ZodString;
623
+ }, z.core.$strip>, z.ZodObject<{
624
+ kind: z.ZodLiteral<"dialog">;
625
+ action: z.ZodEnum<{
626
+ accept: "accept";
627
+ dismiss: "dismiss";
628
+ accept_with_text: "accept_with_text";
629
+ }>;
630
+ text: z.ZodOptional<z.ZodString>;
631
+ }, z.core.$strip>, z.ZodObject<{
632
+ kind: z.ZodLiteral<"set_env">;
633
+ viewport: z.ZodOptional<z.ZodObject<{
634
+ width: z.ZodNumber;
635
+ height: z.ZodNumber;
636
+ }, z.core.$strip>>;
637
+ offline: z.ZodOptional<z.ZodBoolean>;
638
+ geolocation: z.ZodOptional<z.ZodObject<{
639
+ latitude: z.ZodNumber;
640
+ longitude: z.ZodNumber;
641
+ accuracy: z.ZodOptional<z.ZodNumber>;
642
+ }, z.core.$strip>>;
643
+ color_scheme: z.ZodOptional<z.ZodEnum<{
644
+ light: "light";
645
+ dark: "dark";
646
+ "no-preference": "no-preference";
647
+ }>>;
648
+ reduced_motion: z.ZodOptional<z.ZodEnum<{
649
+ reduce: "reduce";
650
+ "no-preference": "no-preference";
651
+ }>>;
652
+ extra_headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
653
+ network_throttle: z.ZodOptional<z.ZodEnum<{
654
+ offline: "offline";
655
+ "slow-3g": "slow-3g";
656
+ "fast-3g": "fast-3g";
657
+ "slow-4g": "slow-4g";
658
+ "fast-4g": "fast-4g";
659
+ "no-throttling": "no-throttling";
660
+ }>>;
661
+ cpu_throttle: z.ZodOptional<z.ZodNumber>;
662
+ }, z.core.$strip>, z.ZodObject<{
663
+ kind: z.ZodLiteral<"switch_page">;
664
+ index: z.ZodNumber;
665
+ }, z.core.$strip>, z.ZodObject<{
666
+ kind: z.ZodLiteral<"evaluate">;
667
+ script: z.ZodString;
300
668
  }, z.core.$strip>], "kind">>>;
301
669
  readonly expect: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
302
670
  kind: z.ZodLiteral<"text_visible">;
@@ -315,8 +683,25 @@ declare const verifyUiFlowShape: {
315
683
  visible: "visible";
316
684
  enabled: "enabled";
317
685
  }>;
686
+ }, z.core.$strip>, z.ZodObject<{
687
+ kind: z.ZodLiteral<"no_console_errors">;
688
+ exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
689
+ }, z.core.$strip>, z.ZodObject<{
690
+ kind: z.ZodLiteral<"no_failed_requests">;
691
+ exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
692
+ allow_4xx: z.ZodOptional<z.ZodBoolean>;
693
+ }, z.core.$strip>, z.ZodObject<{
694
+ kind: z.ZodLiteral<"request_made">;
695
+ url_pattern: z.ZodString;
696
+ method: z.ZodOptional<z.ZodString>;
697
+ min_count: z.ZodOptional<z.ZodNumber>;
698
+ }, z.core.$strip>, z.ZodObject<{
699
+ kind: z.ZodLiteral<"response_status">;
700
+ url_pattern: z.ZodString;
701
+ status: z.ZodNumber;
318
702
  }, z.core.$strip>], "kind">>>;
319
703
  readonly capture: z.ZodOptional<z.ZodArray<z.ZodEnum<{
704
+ trace: "trace";
320
705
  screenshot: "screenshot";
321
706
  har: "har";
322
707
  console: "console";
@@ -390,6 +775,74 @@ declare const verifyUiFlowSchema: z.ZodObject<{
390
775
  }, z.core.$strip>, z.ZodObject<{
391
776
  kind: z.ZodLiteral<"navigate">;
392
777
  url: z.ZodString;
778
+ }, z.core.$strip>, z.ZodObject<{
779
+ kind: z.ZodLiteral<"hover">;
780
+ query: z.ZodString;
781
+ }, z.core.$strip>, z.ZodObject<{
782
+ kind: z.ZodLiteral<"drag">;
783
+ from_query: z.ZodString;
784
+ to_query: z.ZodString;
785
+ }, z.core.$strip>, z.ZodObject<{
786
+ kind: z.ZodLiteral<"fill_form">;
787
+ fields: z.ZodArray<z.ZodObject<{
788
+ query: z.ZodString;
789
+ value: z.ZodUnion<readonly [z.ZodString, z.ZodBoolean]>;
790
+ kind: z.ZodOptional<z.ZodEnum<{
791
+ input: "input";
792
+ select: "select";
793
+ checkbox: "checkbox";
794
+ radio: "radio";
795
+ }>>;
796
+ }, z.core.$strip>>;
797
+ }, z.core.$strip>, z.ZodObject<{
798
+ kind: z.ZodLiteral<"upload">;
799
+ query: z.ZodString;
800
+ file_path: z.ZodString;
801
+ }, z.core.$strip>, z.ZodObject<{
802
+ kind: z.ZodLiteral<"dialog">;
803
+ action: z.ZodEnum<{
804
+ accept: "accept";
805
+ dismiss: "dismiss";
806
+ accept_with_text: "accept_with_text";
807
+ }>;
808
+ text: z.ZodOptional<z.ZodString>;
809
+ }, z.core.$strip>, z.ZodObject<{
810
+ kind: z.ZodLiteral<"set_env">;
811
+ viewport: z.ZodOptional<z.ZodObject<{
812
+ width: z.ZodNumber;
813
+ height: z.ZodNumber;
814
+ }, z.core.$strip>>;
815
+ offline: z.ZodOptional<z.ZodBoolean>;
816
+ geolocation: z.ZodOptional<z.ZodObject<{
817
+ latitude: z.ZodNumber;
818
+ longitude: z.ZodNumber;
819
+ accuracy: z.ZodOptional<z.ZodNumber>;
820
+ }, z.core.$strip>>;
821
+ color_scheme: z.ZodOptional<z.ZodEnum<{
822
+ light: "light";
823
+ dark: "dark";
824
+ "no-preference": "no-preference";
825
+ }>>;
826
+ reduced_motion: z.ZodOptional<z.ZodEnum<{
827
+ reduce: "reduce";
828
+ "no-preference": "no-preference";
829
+ }>>;
830
+ extra_headers: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
831
+ network_throttle: z.ZodOptional<z.ZodEnum<{
832
+ offline: "offline";
833
+ "slow-3g": "slow-3g";
834
+ "fast-3g": "fast-3g";
835
+ "slow-4g": "slow-4g";
836
+ "fast-4g": "fast-4g";
837
+ "no-throttling": "no-throttling";
838
+ }>>;
839
+ cpu_throttle: z.ZodOptional<z.ZodNumber>;
840
+ }, z.core.$strip>, z.ZodObject<{
841
+ kind: z.ZodLiteral<"switch_page">;
842
+ index: z.ZodNumber;
843
+ }, z.core.$strip>, z.ZodObject<{
844
+ kind: z.ZodLiteral<"evaluate">;
845
+ script: z.ZodString;
393
846
  }, z.core.$strip>], "kind">>>;
394
847
  expect: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
395
848
  kind: z.ZodLiteral<"text_visible">;
@@ -408,8 +861,25 @@ declare const verifyUiFlowSchema: z.ZodObject<{
408
861
  visible: "visible";
409
862
  enabled: "enabled";
410
863
  }>;
864
+ }, z.core.$strip>, z.ZodObject<{
865
+ kind: z.ZodLiteral<"no_console_errors">;
866
+ exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
867
+ }, z.core.$strip>, z.ZodObject<{
868
+ kind: z.ZodLiteral<"no_failed_requests">;
869
+ exclude_patterns: z.ZodOptional<z.ZodArray<z.ZodString>>;
870
+ allow_4xx: z.ZodOptional<z.ZodBoolean>;
871
+ }, z.core.$strip>, z.ZodObject<{
872
+ kind: z.ZodLiteral<"request_made">;
873
+ url_pattern: z.ZodString;
874
+ method: z.ZodOptional<z.ZodString>;
875
+ min_count: z.ZodOptional<z.ZodNumber>;
876
+ }, z.core.$strip>, z.ZodObject<{
877
+ kind: z.ZodLiteral<"response_status">;
878
+ url_pattern: z.ZodString;
879
+ status: z.ZodNumber;
411
880
  }, z.core.$strip>], "kind">>>;
412
881
  capture: z.ZodOptional<z.ZodArray<z.ZodEnum<{
882
+ trace: "trace";
413
883
  screenshot: "screenshot";
414
884
  har: "har";
415
885
  console: "console";
@@ -664,6 +1134,17 @@ declare const ToolNames: {
664
1134
  readonly browserWaitFor: "rolepod_browser_wait_for";
665
1135
  readonly browserScreenshot: "rolepod_browser_screenshot";
666
1136
  readonly browserNavigate: "rolepod_browser_navigate";
1137
+ readonly browserHover: "rolepod_browser_hover";
1138
+ readonly browserDrag: "rolepod_browser_drag";
1139
+ readonly browserFillForm: "rolepod_browser_fill_form";
1140
+ readonly browserUploadFile: "rolepod_browser_upload_file";
1141
+ readonly browserHandleDialog: "rolepod_browser_handle_dialog";
1142
+ readonly browserConsole: "rolepod_browser_console";
1143
+ readonly browserNetwork: "rolepod_browser_network";
1144
+ readonly browserSetEnv: "rolepod_browser_set_env";
1145
+ readonly browserEvaluate: "rolepod_browser_evaluate";
1146
+ readonly browserPages: "rolepod_browser_pages";
1147
+ readonly browserSwitchPage: "rolepod_browser_switch_page";
667
1148
  readonly verifyUiFlow: "rolepod_verify_ui_flow";
668
1149
  readonly auditA11y: "rolepod_audit_a11y";
669
1150
  readonly visualDiff: "rolepod_visual_diff";
@@ -710,6 +1191,30 @@ type OpenOptions = {
710
1191
  app_package?: string;
711
1192
  app_activity?: string;
712
1193
  emulator?: string;
1194
+ /**
1195
+ * v0.5 capture lifecycle. Pass when the session needs HAR/video/trace
1196
+ * recording. These MUST be requested at open time because Playwright
1197
+ * wires recordHar/recordVideo at context creation.
1198
+ */
1199
+ capture?: {
1200
+ har?: {
1201
+ path: string;
1202
+ };
1203
+ video?: {
1204
+ dir: string;
1205
+ sizeWidth?: number;
1206
+ sizeHeight?: number;
1207
+ };
1208
+ trace?: {
1209
+ artifactDir: string;
1210
+ };
1211
+ };
1212
+ };
1213
+ type FillFieldKind = "input" | "select" | "checkbox" | "radio";
1214
+ type FillField = {
1215
+ ref: string;
1216
+ value: string | boolean;
1217
+ kind?: FillFieldKind;
713
1218
  };
714
1219
  /** Opaque session handle returned by `Engine.open`. */
715
1220
  interface Session {
@@ -742,6 +1247,21 @@ interface Engine {
742
1247
  screenshot(session: Session, fullPage?: boolean): Promise<Buffer>;
743
1248
  /** Web-only. Throws `unsupported_platform` on mobile sessions. */
744
1249
  navigate(session: Session, url: string): Promise<void>;
1250
+ /** Move pointer / hover over the element identified by `ref`. */
1251
+ hover(session: Session, ref: string): Promise<void>;
1252
+ /** Drag element `from` onto element `to`. */
1253
+ drag(session: Session, fromRef: string, toRef: string): Promise<void>;
1254
+ /**
1255
+ * Batch-fill multiple form fields in a single call. Token-efficient
1256
+ * alternative to a sequence of `type` calls; also handles checkboxes,
1257
+ * radios, and `<select>` options.
1258
+ */
1259
+ fillForm(session: Session, fields: FillField[]): Promise<void>;
1260
+ /**
1261
+ * Attach a local file to the file input identified by `ref`.
1262
+ * Path MUST be absolute on the host filesystem.
1263
+ */
1264
+ uploadFile(session: Session, ref: string, filePath: string): Promise<void>;
745
1265
  }
746
1266
 
747
1267
  /**
@@ -775,7 +1295,7 @@ declare class SessionRegistry {
775
1295
  }
776
1296
 
777
1297
  declare const SERVER_NAME = "rolepod-uiproof";
778
- declare const SERVER_VERSION = "0.4.1";
1298
+ declare const SERVER_VERSION = "0.6.0";
779
1299
  type ServerHandle = {
780
1300
  mcp: McpServer;
781
1301
  registry: SessionRegistry;
@@ -792,6 +1312,23 @@ declare function buildServer(opts?: {
792
1312
  idleTimeoutMs?: number;
793
1313
  }): ServerHandle;
794
1314
 
1315
+ type ConsoleEntry = {
1316
+ level: "error" | "warning" | "info" | "log" | "debug" | "trace";
1317
+ text: string;
1318
+ ts: string;
1319
+ /** Best-effort file:line if Playwright provides it. */
1320
+ location?: string;
1321
+ };
1322
+ type NetworkEntry = {
1323
+ id: number;
1324
+ url: string;
1325
+ method: string;
1326
+ status?: number;
1327
+ failure?: string;
1328
+ resource_type: string;
1329
+ ts: string;
1330
+ duration_ms?: number;
1331
+ };
795
1332
  /**
796
1333
  * PlaywrightEngine — v0.1 web-only implementation backed by Playwright's
797
1334
  * Chromium / Firefox / WebKit drivers and the built-in
@@ -826,6 +1363,86 @@ declare class PlaywrightEngine implements Engine {
826
1363
  getPageForSession(sessionId: string): Page;
827
1364
  /** Increment generation; the next ref-using call will see them as stale. */
828
1365
  bumpGeneration(sessionId: string): void;
1366
+ hover(session: Session, ref: string): Promise<void>;
1367
+ drag(session: Session, fromRef: string, toRef: string): Promise<void>;
1368
+ fillForm(session: Session, fields: FillField[]): Promise<void>;
1369
+ uploadFile(session: Session, ref: string, filePath: string): Promise<void>;
1370
+ /**
1371
+ * Pre-arm a one-shot dialog handler for the next dialog raised on the
1372
+ * active page. Returns when either the dialog fires (and is handled)
1373
+ * or the timeout elapses. The caller is expected to trigger the
1374
+ * dialog (via click etc.) AFTER arming.
1375
+ */
1376
+ handleDialog(sessionId: string, opts: {
1377
+ action: "accept" | "dismiss" | "accept_with_text";
1378
+ text?: string;
1379
+ timeoutMs?: number;
1380
+ }): Promise<{
1381
+ handled: boolean;
1382
+ }>;
1383
+ getConsole(sessionId: string, opts?: {
1384
+ levels?: ConsoleEntry["level"][];
1385
+ contains?: string;
1386
+ clear?: boolean;
1387
+ limit?: number;
1388
+ }): ConsoleEntry[];
1389
+ getNetwork(sessionId: string, opts?: {
1390
+ urlPattern?: string;
1391
+ patternKind?: "substring" | "regex";
1392
+ method?: string;
1393
+ statusRange?: {
1394
+ min: number;
1395
+ max: number;
1396
+ };
1397
+ onlyFailed?: boolean;
1398
+ clear?: boolean;
1399
+ limit?: number;
1400
+ }): NetworkEntry[];
1401
+ /**
1402
+ * Read the consoleBuffer/networkBuffer directly without filtering —
1403
+ * used by verify_ui_flow expect evaluators.
1404
+ */
1405
+ peekBuffers(sessionId: string): {
1406
+ console: ConsoleEntry[];
1407
+ network: NetworkEntry[];
1408
+ };
1409
+ /**
1410
+ * Runtime mutation of context-level emulation. CPU + network throttle
1411
+ * use CDP and only work on chromium; everything else is cross-browser.
1412
+ */
1413
+ setEnv(sessionId: string, opts: {
1414
+ viewport?: {
1415
+ width: number;
1416
+ height: number;
1417
+ };
1418
+ offline?: boolean;
1419
+ geolocation?: {
1420
+ latitude: number;
1421
+ longitude: number;
1422
+ accuracy?: number;
1423
+ };
1424
+ colorScheme?: "light" | "dark" | "no-preference";
1425
+ reducedMotion?: "reduce" | "no-preference";
1426
+ extraHeaders?: Record<string, string>;
1427
+ networkThrottle?: "offline" | "slow-3g" | "fast-3g" | "slow-4g" | "fast-4g" | "no-throttling";
1428
+ cpuThrottle?: number;
1429
+ }): Promise<void>;
1430
+ /**
1431
+ * Execute a JavaScript function in the page context. ALWAYS gated by
1432
+ * the tool layer (`ROLEPOD_ALLOW_EVAL=1`); this method does not enforce
1433
+ * the env check.
1434
+ */
1435
+ evaluate(sessionId: string, script: string, args?: unknown[]): Promise<unknown>;
1436
+ listPages(sessionId: string): {
1437
+ index: number;
1438
+ url: string;
1439
+ title_promise: Promise<string>;
1440
+ active: boolean;
1441
+ }[];
1442
+ switchPage(sessionId: string, index: number): Promise<void>;
1443
+ private activePage;
1444
+ private attachPageListeners;
1445
+ private handlePageDialog;
829
1446
  private requireSession;
830
1447
  private resolveLocator;
831
1448
  private invalidateRefs;
@@ -862,6 +1479,14 @@ declare class AppiumEngine implements Engine {
862
1479
  waitFor(session: Session, cond: WaitCondition, timeoutMs?: number): Promise<void>;
863
1480
  screenshot(session: Session, _fullPage?: boolean): Promise<Buffer>;
864
1481
  navigate(_session: Session, _url: string): Promise<void>;
1482
+ hover(_session: Session, _ref: string): Promise<void>;
1483
+ drag(_session: Session, _fromRef: string, _toRef: string): Promise<void>;
1484
+ fillForm(session: Session, fields: {
1485
+ ref: string;
1486
+ value: string | boolean;
1487
+ kind?: string;
1488
+ }[]): Promise<void>;
1489
+ uploadFile(_session: Session, _ref: string, _filePath: string): Promise<void>;
865
1490
  private loadWdio;
866
1491
  private buildCapabilities;
867
1492
  private screenIdentifier;
@@ -915,4 +1540,4 @@ declare class UnsupportedPlatformError extends RolepodMcpError {
915
1540
  constructor(platform: string);
916
1541
  }
917
1542
 
918
- export { type A11yNode, type A11ySnapshot, AppiumEngine, ArtifactStore, type Engine, type OpenOptions, type Platform, PlaywrightEngine, RolepodMcpError, SERVER_NAME, SERVER_VERSION, type ServerHandle, type Session, SessionRegistry, StaleRefError, type ToolName, ToolNames, UnknownRefError, UnknownSessionError, UnsupportedPlatformError, type WaitCondition, auditA11ySchema, auditA11yShape, browserClickSchema, browserClickShape, browserCloseSchema, browserCloseShape, browserKeySchema, browserKeyShape, browserNavigateSchema, browserNavigateShape, browserOpenSchema, browserOpenShape, browserScreenshotSchema, browserScreenshotShape, browserScrollSchema, browserScrollShape, browserSnapshotSchema, browserSnapshotShape, browserTypeSchema, browserTypeShape, browserWaitForSchema, browserWaitForShape, buildServer, createEngine, createMobileEngine, createWebEngine, extractUiStateSchema, extractUiStateShape, scaffoldE2eSchema, scaffoldE2eShape, verifyUiFlowSchema, verifyUiFlowShape, visualDiffSchema, visualDiffShape };
1543
+ export { type A11yNode, type A11ySnapshot, AppiumEngine, ArtifactStore, type Engine, type OpenOptions, type Platform, PlaywrightEngine, RolepodMcpError, SERVER_NAME, SERVER_VERSION, type ServerHandle, type Session, SessionRegistry, StaleRefError, type ToolName, ToolNames, UnknownRefError, UnknownSessionError, UnsupportedPlatformError, type WaitCondition, auditA11ySchema, auditA11yShape, browserClickSchema, browserClickShape, browserCloseSchema, browserCloseShape, browserConsoleSchema, browserConsoleShape, browserDragSchema, browserDragShape, browserEvaluateSchema, browserEvaluateShape, browserFillFormSchema, browserFillFormShape, browserHandleDialogSchema, browserHandleDialogShape, browserHoverSchema, browserHoverShape, browserKeySchema, browserKeyShape, browserNavigateSchema, browserNavigateShape, browserNetworkSchema, browserNetworkShape, browserOpenSchema, browserOpenShape, browserPagesSchema, browserPagesShape, browserScreenshotSchema, browserScreenshotShape, browserScrollSchema, browserScrollShape, browserSetEnvSchema, browserSetEnvShape, browserSnapshotSchema, browserSnapshotShape, browserSwitchPageSchema, browserSwitchPageShape, browserTypeSchema, browserTypeShape, browserUploadFileSchema, browserUploadFileShape, browserWaitForSchema, browserWaitForShape, buildServer, createEngine, createMobileEngine, createWebEngine, extractUiStateSchema, extractUiStateShape, scaffoldE2eSchema, scaffoldE2eShape, verifyUiFlowSchema, verifyUiFlowShape, visualDiffSchema, visualDiffShape };