@riddledc/riddle-proof 0.7.138 → 0.7.140

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/README.md CHANGED
@@ -482,6 +482,14 @@ and `click_count_value_total`.
482
482
  profile carries its own hosted Riddle worker budget; an explicit CLI `--timeout`
483
483
  still overrides the profile value for one-off runs.
484
484
 
485
+ Profile final viewport screenshots are full-page by default. Set
486
+ `target.screenshot_full_page: false`, `target.screenshotFullPage: false`, or
487
+ `target.screenshot_mode: "viewport"` when the automatic final screenshots
488
+ should capture only the current viewport, for example when fixed or sticky
489
+ headers make full-page captures misleading. Compact profile summaries include
490
+ the final screenshot count and mode when a profile sets an explicit target
491
+ screenshot mode.
492
+
485
493
  Use `allowed_console_patterns` / `allowed_console_texts` on
486
494
  `no_fatal_console_errors` when a negative-path profile intentionally triggers a
487
495
  known browser console error, such as a mocked `503` that the app recovers from:
@@ -494,12 +494,18 @@ function profileScreenshotLabels(viewports) {
494
494
  }
495
495
  return labels;
496
496
  }
497
- function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport) {
497
+ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, finalScreenshotFullPage) {
498
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === void 0 ? void 0 : finalScreenshotFullPage !== false;
499
+ const finalScreenshotCount = viewports.filter((viewport) => typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
498
500
  return toJsonValue({
499
501
  viewport_count: viewports.length,
500
502
  action_count: actionCount ?? null,
503
+ final_screenshot_count: finalScreenshotCount,
504
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
505
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === void 0 ? null : normalizedFinalScreenshotFullPage ? "full_page" : "viewport",
501
506
  viewports: viewports.map((viewport) => {
502
507
  const expectedActionCount = expectedActionCountByViewport?.get(viewport.name) ?? actionCount;
508
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean" ? viewport.screenshot_full_page : normalizedFinalScreenshotFullPage;
503
509
  const results = viewport.setup_action_results || [];
504
510
  const failed = results.filter((result) => result.ok === false && result.optional !== true);
505
511
  const optionalFailed = results.filter((result) => result.ok === false && result.optional === true);
@@ -539,6 +545,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewpo
539
545
  action_counts: profileSetupActionCounts(results),
540
546
  frame_action_count: results.filter((result) => result.frame_selector).length,
541
547
  frame_urls: profileSetupFrameUrls(viewport),
548
+ final_screenshot: viewport.screenshot_label ?? null,
549
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
542
550
  setup_screenshots: profileSetupScreenshotLabels(results),
543
551
  clicked_total: clickedItems.length,
544
552
  clicked_truncated: clickedItems.length > clicked.length,
@@ -875,6 +883,42 @@ function normalizeSetupActions(value) {
875
883
  if (!Array.isArray(value)) throw new Error("target.setup_actions must be an array.");
876
884
  return value.map(normalizeSetupAction);
877
885
  }
886
+ function normalizeTargetScreenshotFullPage(input) {
887
+ const directFullPage = booleanValue(valueFromOwn(
888
+ input,
889
+ "screenshot_full_page",
890
+ "screenshotFullPage",
891
+ "final_screenshot_full_page",
892
+ "finalScreenshotFullPage",
893
+ "full_page_screenshots",
894
+ "fullPageScreenshots"
895
+ ));
896
+ const viewportOnly = booleanValue(valueFromOwn(
897
+ input,
898
+ "viewport_screenshots",
899
+ "viewportScreenshots",
900
+ "viewport_only_screenshots",
901
+ "viewportOnlyScreenshots"
902
+ ));
903
+ const modeInput = stringFromOwn(input, "screenshot_mode", "screenshotMode", "final_screenshot_mode", "finalScreenshotMode");
904
+ let modeFullPage;
905
+ if (modeInput) {
906
+ const mode = modeInput.trim().toLowerCase().replace(/[-\s]+/g, "_");
907
+ if (mode === "full_page" || mode === "fullpage" || mode === "page" || mode === "document") {
908
+ modeFullPage = true;
909
+ } else if (mode === "viewport" || mode === "view") {
910
+ modeFullPage = false;
911
+ } else {
912
+ throw new Error(`target.screenshot_mode ${modeInput} is not supported. Supported modes: full_page, viewport.`);
913
+ }
914
+ }
915
+ const values = [directFullPage, viewportOnly === void 0 ? void 0 : !viewportOnly, modeFullPage].filter((value) => value !== void 0);
916
+ if (!values.length) return void 0;
917
+ if (values.some((value) => value !== values[0])) {
918
+ throw new Error("target has conflicting screenshot full_page / viewport mode options.");
919
+ }
920
+ return values[0];
921
+ }
878
922
  function normalizeNetworkMock(input, index) {
879
923
  if (!isRecord(input)) throw new Error(`target.network_mocks[${index}] must be an object.`);
880
924
  const url = stringValue(input.url) || stringValue(input.glob) || stringValue(input.pattern);
@@ -1443,6 +1487,7 @@ function normalizeRiddleProofProfile(input, options = {}) {
1443
1487
  timeout_sec: timeoutSecValue(targetInput.timeout_sec) ?? timeoutSecValue(targetInput.timeoutSec) ?? timeoutSecValue(targetInput.riddle_timeout_sec) ?? timeoutSecValue(targetInput.riddleTimeoutSec),
1444
1488
  wait_for_selector: stringValue(targetInput.wait_for_selector) || stringValue(targetInput.waitForSelector),
1445
1489
  wait_ms: numberValue(targetInput.wait_ms) ?? numberValue(targetInput.waitMs),
1490
+ screenshot_full_page: normalizeTargetScreenshotFullPage(targetInput),
1446
1491
  setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions),
1447
1492
  network_mocks: normalizeNetworkMocks(targetInput.network_mocks ?? targetInput.networkMocks)
1448
1493
  },
@@ -2746,7 +2791,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
2746
2791
  ok: (viewport.setup_action_results || []).length >= (expectedActionCountByViewport.get(viewport.name) ?? actionCount) && (viewport.setup_action_results || []).every((result) => result.ok !== false || result.optional === true),
2747
2792
  result_count: (viewport.setup_action_results || []).length
2748
2793
  })),
2749
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport),
2794
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, profile.target.screenshot_full_page),
2750
2795
  failed
2751
2796
  },
2752
2797
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -3766,14 +3811,28 @@ function profileScreenshotLabels(viewports) {
3766
3811
  }
3767
3812
  return labels;
3768
3813
  }
3769
- function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport) {
3814
+ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, finalScreenshotFullPage) {
3815
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === undefined
3816
+ ? undefined
3817
+ : finalScreenshotFullPage !== false;
3818
+ const finalScreenshotCount = (viewports || []).filter((viewport) => viewport && typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
3770
3819
  return {
3771
3820
  viewport_count: (viewports || []).length,
3772
3821
  action_count: actionCount ?? null,
3822
+ final_screenshot_count: finalScreenshotCount,
3823
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
3824
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === undefined
3825
+ ? null
3826
+ : normalizedFinalScreenshotFullPage
3827
+ ? "full_page"
3828
+ : "viewport",
3773
3829
  viewports: (viewports || []).map((viewport) => {
3774
3830
  const expectedActionCount = expectedActionCountsByViewport && expectedActionCountsByViewport[viewport.name] !== undefined
3775
3831
  ? expectedActionCountsByViewport[viewport.name]
3776
3832
  : actionCount;
3833
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean"
3834
+ ? viewport.screenshot_full_page
3835
+ : normalizedFinalScreenshotFullPage;
3777
3836
  const results = viewport.setup_action_results || [];
3778
3837
  const failed = results.filter((result) => result && result.ok === false && result.optional !== true);
3779
3838
  const optionalFailed = results.filter((result) => result && result.ok === false && result.optional === true);
@@ -3827,6 +3886,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewp
3827
3886
  action_counts: profileSetupActionCounts(results),
3828
3887
  frame_action_count: results.filter((result) => result && result.frame_selector).length,
3829
3888
  frame_urls: profileSetupFrameUrls(viewport),
3889
+ final_screenshot: viewport.screenshot_label || null,
3890
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
3830
3891
  setup_screenshots: profileSetupScreenshotLabels(results),
3831
3892
  clicked_total: clickedItems.length,
3832
3893
  clicked_truncated: clickedItems.length > clicked.length,
@@ -4011,7 +4072,7 @@ function assessProfile(profile, evidence) {
4011
4072
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false || result.optional === true),
4012
4073
  result_count: (viewport.setup_action_results || []).length,
4013
4074
  })),
4014
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport),
4075
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, profile.target && profile.target.screenshot_full_page),
4015
4076
  failed,
4016
4077
  },
4017
4078
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
@@ -6889,8 +6950,14 @@ async function captureViewport(viewport) {
6889
6950
  }
6890
6951
  }
6891
6952
  const screenshotLabel = profileSlug + "-" + viewport.name;
6953
+ let screenshotFullPage = null;
6892
6954
  try {
6893
- if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel);
6955
+ const screenshotOptions = {};
6956
+ if (profile.target && profile.target.screenshot_full_page !== undefined) {
6957
+ screenshotFullPage = profile.target.screenshot_full_page !== false;
6958
+ screenshotOptions.fullPage = screenshotFullPage;
6959
+ }
6960
+ if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel, screenshotOptions);
6894
6961
  } catch (error) {
6895
6962
  pageErrors.push({ message: "saveScreenshot failed: " + String(error && error.message ? error.message : error).slice(0, 500) });
6896
6963
  }
@@ -6957,6 +7024,7 @@ async function captureViewport(viewport) {
6957
7024
  route_inventory: routeInventory,
6958
7025
  setup_action_results: setupActionResults,
6959
7026
  screenshot_label: screenshotLabel,
7027
+ screenshot_full_page: screenshotFullPage,
6960
7028
  navigation_error: navigationError,
6961
7029
  wait_error: waitError,
6962
7030
  };
package/dist/cli.cjs CHANGED
@@ -7431,12 +7431,18 @@ function profileScreenshotLabels(viewports) {
7431
7431
  }
7432
7432
  return labels;
7433
7433
  }
7434
- function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport) {
7434
+ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, finalScreenshotFullPage) {
7435
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === void 0 ? void 0 : finalScreenshotFullPage !== false;
7436
+ const finalScreenshotCount = viewports.filter((viewport) => typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
7435
7437
  return toJsonValue({
7436
7438
  viewport_count: viewports.length,
7437
7439
  action_count: actionCount ?? null,
7440
+ final_screenshot_count: finalScreenshotCount,
7441
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
7442
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === void 0 ? null : normalizedFinalScreenshotFullPage ? "full_page" : "viewport",
7438
7443
  viewports: viewports.map((viewport) => {
7439
7444
  const expectedActionCount = expectedActionCountByViewport?.get(viewport.name) ?? actionCount;
7445
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean" ? viewport.screenshot_full_page : normalizedFinalScreenshotFullPage;
7440
7446
  const results = viewport.setup_action_results || [];
7441
7447
  const failed = results.filter((result) => result.ok === false && result.optional !== true);
7442
7448
  const optionalFailed = results.filter((result) => result.ok === false && result.optional === true);
@@ -7476,6 +7482,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewpo
7476
7482
  action_counts: profileSetupActionCounts(results),
7477
7483
  frame_action_count: results.filter((result) => result.frame_selector).length,
7478
7484
  frame_urls: profileSetupFrameUrls(viewport),
7485
+ final_screenshot: viewport.screenshot_label ?? null,
7486
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
7479
7487
  setup_screenshots: profileSetupScreenshotLabels(results),
7480
7488
  clicked_total: clickedItems.length,
7481
7489
  clicked_truncated: clickedItems.length > clicked.length,
@@ -7812,6 +7820,42 @@ function normalizeSetupActions(value) {
7812
7820
  if (!Array.isArray(value)) throw new Error("target.setup_actions must be an array.");
7813
7821
  return value.map(normalizeSetupAction);
7814
7822
  }
7823
+ function normalizeTargetScreenshotFullPage(input) {
7824
+ const directFullPage = booleanValue(valueFromOwn(
7825
+ input,
7826
+ "screenshot_full_page",
7827
+ "screenshotFullPage",
7828
+ "final_screenshot_full_page",
7829
+ "finalScreenshotFullPage",
7830
+ "full_page_screenshots",
7831
+ "fullPageScreenshots"
7832
+ ));
7833
+ const viewportOnly = booleanValue(valueFromOwn(
7834
+ input,
7835
+ "viewport_screenshots",
7836
+ "viewportScreenshots",
7837
+ "viewport_only_screenshots",
7838
+ "viewportOnlyScreenshots"
7839
+ ));
7840
+ const modeInput = stringFromOwn(input, "screenshot_mode", "screenshotMode", "final_screenshot_mode", "finalScreenshotMode");
7841
+ let modeFullPage;
7842
+ if (modeInput) {
7843
+ const mode = modeInput.trim().toLowerCase().replace(/[-\s]+/g, "_");
7844
+ if (mode === "full_page" || mode === "fullpage" || mode === "page" || mode === "document") {
7845
+ modeFullPage = true;
7846
+ } else if (mode === "viewport" || mode === "view") {
7847
+ modeFullPage = false;
7848
+ } else {
7849
+ throw new Error(`target.screenshot_mode ${modeInput} is not supported. Supported modes: full_page, viewport.`);
7850
+ }
7851
+ }
7852
+ const values = [directFullPage, viewportOnly === void 0 ? void 0 : !viewportOnly, modeFullPage].filter((value) => value !== void 0);
7853
+ if (!values.length) return void 0;
7854
+ if (values.some((value) => value !== values[0])) {
7855
+ throw new Error("target has conflicting screenshot full_page / viewport mode options.");
7856
+ }
7857
+ return values[0];
7858
+ }
7815
7859
  function normalizeNetworkMock(input, index) {
7816
7860
  if (!isRecord(input)) throw new Error(`target.network_mocks[${index}] must be an object.`);
7817
7861
  const url = stringValue2(input.url) || stringValue2(input.glob) || stringValue2(input.pattern);
@@ -8380,6 +8424,7 @@ function normalizeRiddleProofProfile(input, options = {}) {
8380
8424
  timeout_sec: timeoutSecValue(targetInput.timeout_sec) ?? timeoutSecValue(targetInput.timeoutSec) ?? timeoutSecValue(targetInput.riddle_timeout_sec) ?? timeoutSecValue(targetInput.riddleTimeoutSec),
8381
8425
  wait_for_selector: stringValue2(targetInput.wait_for_selector) || stringValue2(targetInput.waitForSelector),
8382
8426
  wait_ms: numberValue(targetInput.wait_ms) ?? numberValue(targetInput.waitMs),
8427
+ screenshot_full_page: normalizeTargetScreenshotFullPage(targetInput),
8383
8428
  setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions),
8384
8429
  network_mocks: normalizeNetworkMocks(targetInput.network_mocks ?? targetInput.networkMocks)
8385
8430
  },
@@ -9683,7 +9728,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
9683
9728
  ok: (viewport.setup_action_results || []).length >= (expectedActionCountByViewport.get(viewport.name) ?? actionCount) && (viewport.setup_action_results || []).every((result) => result.ok !== false || result.optional === true),
9684
9729
  result_count: (viewport.setup_action_results || []).length
9685
9730
  })),
9686
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport),
9731
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, profile.target.screenshot_full_page),
9687
9732
  failed
9688
9733
  },
9689
9734
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -10687,14 +10732,28 @@ function profileScreenshotLabels(viewports) {
10687
10732
  }
10688
10733
  return labels;
10689
10734
  }
10690
- function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport) {
10735
+ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, finalScreenshotFullPage) {
10736
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === undefined
10737
+ ? undefined
10738
+ : finalScreenshotFullPage !== false;
10739
+ const finalScreenshotCount = (viewports || []).filter((viewport) => viewport && typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
10691
10740
  return {
10692
10741
  viewport_count: (viewports || []).length,
10693
10742
  action_count: actionCount ?? null,
10743
+ final_screenshot_count: finalScreenshotCount,
10744
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
10745
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === undefined
10746
+ ? null
10747
+ : normalizedFinalScreenshotFullPage
10748
+ ? "full_page"
10749
+ : "viewport",
10694
10750
  viewports: (viewports || []).map((viewport) => {
10695
10751
  const expectedActionCount = expectedActionCountsByViewport && expectedActionCountsByViewport[viewport.name] !== undefined
10696
10752
  ? expectedActionCountsByViewport[viewport.name]
10697
10753
  : actionCount;
10754
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean"
10755
+ ? viewport.screenshot_full_page
10756
+ : normalizedFinalScreenshotFullPage;
10698
10757
  const results = viewport.setup_action_results || [];
10699
10758
  const failed = results.filter((result) => result && result.ok === false && result.optional !== true);
10700
10759
  const optionalFailed = results.filter((result) => result && result.ok === false && result.optional === true);
@@ -10748,6 +10807,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewp
10748
10807
  action_counts: profileSetupActionCounts(results),
10749
10808
  frame_action_count: results.filter((result) => result && result.frame_selector).length,
10750
10809
  frame_urls: profileSetupFrameUrls(viewport),
10810
+ final_screenshot: viewport.screenshot_label || null,
10811
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
10751
10812
  setup_screenshots: profileSetupScreenshotLabels(results),
10752
10813
  clicked_total: clickedItems.length,
10753
10814
  clicked_truncated: clickedItems.length > clicked.length,
@@ -10932,7 +10993,7 @@ function assessProfile(profile, evidence) {
10932
10993
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false || result.optional === true),
10933
10994
  result_count: (viewport.setup_action_results || []).length,
10934
10995
  })),
10935
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport),
10996
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, profile.target && profile.target.screenshot_full_page),
10936
10997
  failed,
10937
10998
  },
10938
10999
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
@@ -13810,8 +13871,14 @@ async function captureViewport(viewport) {
13810
13871
  }
13811
13872
  }
13812
13873
  const screenshotLabel = profileSlug + "-" + viewport.name;
13874
+ let screenshotFullPage = null;
13813
13875
  try {
13814
- if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel);
13876
+ const screenshotOptions = {};
13877
+ if (profile.target && profile.target.screenshot_full_page !== undefined) {
13878
+ screenshotFullPage = profile.target.screenshot_full_page !== false;
13879
+ screenshotOptions.fullPage = screenshotFullPage;
13880
+ }
13881
+ if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel, screenshotOptions);
13815
13882
  } catch (error) {
13816
13883
  pageErrors.push({ message: "saveScreenshot failed: " + String(error && error.message ? error.message : error).slice(0, 500) });
13817
13884
  }
@@ -13878,6 +13945,7 @@ async function captureViewport(viewport) {
13878
13945
  route_inventory: routeInventory,
13879
13946
  setup_action_results: setupActionResults,
13880
13947
  screenshot_label: screenshotLabel,
13948
+ screenshot_full_page: screenshotFullPage,
13881
13949
  navigation_error: navigationError,
13882
13950
  wait_error: waitError,
13883
13951
  };
@@ -14634,6 +14702,8 @@ function profileSetupSummaryMarkdown(result) {
14634
14702
  if (!viewports.length) return [];
14635
14703
  const declaredActions = cliFiniteNumber(setupSummary.action_count);
14636
14704
  const totalResults = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.result_count) || 0), 0);
14705
+ const finalScreenshotCount = cliFiniteNumber(setupSummary.final_screenshot_count) ?? viewports.reduce((sum, viewport) => sum + (cliString(viewport.final_screenshot) || cliString(viewport.screenshot_label) ? 1 : 0), 0);
14706
+ const finalScreenshotMode = cliString(setupSummary.final_screenshot_mode);
14637
14707
  const setupScreenshots = viewports.reduce((sum, viewport) => {
14638
14708
  const labels = Array.isArray(viewport.setup_screenshots) ? viewport.setup_screenshots : [];
14639
14709
  return sum + labels.filter((label) => typeof label === "string" && label.trim()).length;
@@ -14649,6 +14719,7 @@ function profileSetupSummaryMarkdown(result) {
14649
14719
  const failedTotal = viewports.reduce((sum, viewport) => sum + (Array.isArray(viewport.failed) ? viewport.failed.length : 0), 0);
14650
14720
  const lines = [
14651
14721
  `- setup actions: ${declaredActions === void 0 ? "unknown" : declaredActions} declared, ${totalResults} recorded result(s) across ${viewports.length} viewport(s)`,
14722
+ ...finalScreenshotMode ? [`- final screenshots: ${finalScreenshotCount}, mode ${finalScreenshotMode}`] : [],
14652
14723
  `- setup screenshots: ${setupScreenshots}`,
14653
14724
  `- clicked targets: ${clickedTotal}${failedTotal ? `; failed setup actions: ${failedTotal}` : ""}`
14654
14725
  ];
package/dist/cli.js CHANGED
@@ -12,7 +12,7 @@ import {
12
12
  profileStatusExitCode,
13
13
  resolveRiddleProofProfileTargetUrl,
14
14
  resolveRiddleProofProfileTimeoutSec
15
- } from "./chunk-N75EAJNG.js";
15
+ } from "./chunk-6VXZ6V5M.js";
16
16
  import {
17
17
  createRiddleApiClient,
18
18
  parseRiddleViewport
@@ -589,6 +589,8 @@ function profileSetupSummaryMarkdown(result) {
589
589
  if (!viewports.length) return [];
590
590
  const declaredActions = cliFiniteNumber(setupSummary.action_count);
591
591
  const totalResults = viewports.reduce((sum, viewport) => sum + (cliFiniteNumber(viewport.result_count) || 0), 0);
592
+ const finalScreenshotCount = cliFiniteNumber(setupSummary.final_screenshot_count) ?? viewports.reduce((sum, viewport) => sum + (cliString(viewport.final_screenshot) || cliString(viewport.screenshot_label) ? 1 : 0), 0);
593
+ const finalScreenshotMode = cliString(setupSummary.final_screenshot_mode);
592
594
  const setupScreenshots = viewports.reduce((sum, viewport) => {
593
595
  const labels = Array.isArray(viewport.setup_screenshots) ? viewport.setup_screenshots : [];
594
596
  return sum + labels.filter((label) => typeof label === "string" && label.trim()).length;
@@ -604,6 +606,7 @@ function profileSetupSummaryMarkdown(result) {
604
606
  const failedTotal = viewports.reduce((sum, viewport) => sum + (Array.isArray(viewport.failed) ? viewport.failed.length : 0), 0);
605
607
  const lines = [
606
608
  `- setup actions: ${declaredActions === void 0 ? "unknown" : declaredActions} declared, ${totalResults} recorded result(s) across ${viewports.length} viewport(s)`,
609
+ ...finalScreenshotMode ? [`- final screenshots: ${finalScreenshotCount}, mode ${finalScreenshotMode}`] : [],
607
610
  `- setup screenshots: ${setupScreenshots}`,
608
611
  `- clicked targets: ${clickedTotal}${failedTotal ? `; failed setup actions: ${failedTotal}` : ""}`
609
612
  ];
package/dist/index.cjs CHANGED
@@ -9227,12 +9227,18 @@ function profileScreenshotLabels(viewports) {
9227
9227
  }
9228
9228
  return labels;
9229
9229
  }
9230
- function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport) {
9230
+ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, finalScreenshotFullPage) {
9231
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === void 0 ? void 0 : finalScreenshotFullPage !== false;
9232
+ const finalScreenshotCount = viewports.filter((viewport) => typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
9231
9233
  return toJsonValue({
9232
9234
  viewport_count: viewports.length,
9233
9235
  action_count: actionCount ?? null,
9236
+ final_screenshot_count: finalScreenshotCount,
9237
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
9238
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === void 0 ? null : normalizedFinalScreenshotFullPage ? "full_page" : "viewport",
9234
9239
  viewports: viewports.map((viewport) => {
9235
9240
  const expectedActionCount = expectedActionCountByViewport?.get(viewport.name) ?? actionCount;
9241
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean" ? viewport.screenshot_full_page : normalizedFinalScreenshotFullPage;
9236
9242
  const results = viewport.setup_action_results || [];
9237
9243
  const failed = results.filter((result) => result.ok === false && result.optional !== true);
9238
9244
  const optionalFailed = results.filter((result) => result.ok === false && result.optional === true);
@@ -9272,6 +9278,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewpo
9272
9278
  action_counts: profileSetupActionCounts(results),
9273
9279
  frame_action_count: results.filter((result) => result.frame_selector).length,
9274
9280
  frame_urls: profileSetupFrameUrls(viewport),
9281
+ final_screenshot: viewport.screenshot_label ?? null,
9282
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
9275
9283
  setup_screenshots: profileSetupScreenshotLabels(results),
9276
9284
  clicked_total: clickedItems.length,
9277
9285
  clicked_truncated: clickedItems.length > clicked.length,
@@ -9608,6 +9616,42 @@ function normalizeSetupActions(value) {
9608
9616
  if (!Array.isArray(value)) throw new Error("target.setup_actions must be an array.");
9609
9617
  return value.map(normalizeSetupAction);
9610
9618
  }
9619
+ function normalizeTargetScreenshotFullPage(input) {
9620
+ const directFullPage = booleanValue(valueFromOwn(
9621
+ input,
9622
+ "screenshot_full_page",
9623
+ "screenshotFullPage",
9624
+ "final_screenshot_full_page",
9625
+ "finalScreenshotFullPage",
9626
+ "full_page_screenshots",
9627
+ "fullPageScreenshots"
9628
+ ));
9629
+ const viewportOnly = booleanValue(valueFromOwn(
9630
+ input,
9631
+ "viewport_screenshots",
9632
+ "viewportScreenshots",
9633
+ "viewport_only_screenshots",
9634
+ "viewportOnlyScreenshots"
9635
+ ));
9636
+ const modeInput = stringFromOwn(input, "screenshot_mode", "screenshotMode", "final_screenshot_mode", "finalScreenshotMode");
9637
+ let modeFullPage;
9638
+ if (modeInput) {
9639
+ const mode = modeInput.trim().toLowerCase().replace(/[-\s]+/g, "_");
9640
+ if (mode === "full_page" || mode === "fullpage" || mode === "page" || mode === "document") {
9641
+ modeFullPage = true;
9642
+ } else if (mode === "viewport" || mode === "view") {
9643
+ modeFullPage = false;
9644
+ } else {
9645
+ throw new Error(`target.screenshot_mode ${modeInput} is not supported. Supported modes: full_page, viewport.`);
9646
+ }
9647
+ }
9648
+ const values = [directFullPage, viewportOnly === void 0 ? void 0 : !viewportOnly, modeFullPage].filter((value) => value !== void 0);
9649
+ if (!values.length) return void 0;
9650
+ if (values.some((value) => value !== values[0])) {
9651
+ throw new Error("target has conflicting screenshot full_page / viewport mode options.");
9652
+ }
9653
+ return values[0];
9654
+ }
9611
9655
  function normalizeNetworkMock(input, index) {
9612
9656
  if (!isRecord2(input)) throw new Error(`target.network_mocks[${index}] must be an object.`);
9613
9657
  const url = stringValue5(input.url) || stringValue5(input.glob) || stringValue5(input.pattern);
@@ -10176,6 +10220,7 @@ function normalizeRiddleProofProfile(input, options = {}) {
10176
10220
  timeout_sec: timeoutSecValue(targetInput.timeout_sec) ?? timeoutSecValue(targetInput.timeoutSec) ?? timeoutSecValue(targetInput.riddle_timeout_sec) ?? timeoutSecValue(targetInput.riddleTimeoutSec),
10177
10221
  wait_for_selector: stringValue5(targetInput.wait_for_selector) || stringValue5(targetInput.waitForSelector),
10178
10222
  wait_ms: numberValue3(targetInput.wait_ms) ?? numberValue3(targetInput.waitMs),
10223
+ screenshot_full_page: normalizeTargetScreenshotFullPage(targetInput),
10179
10224
  setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions),
10180
10225
  network_mocks: normalizeNetworkMocks(targetInput.network_mocks ?? targetInput.networkMocks)
10181
10226
  },
@@ -11479,7 +11524,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
11479
11524
  ok: (viewport.setup_action_results || []).length >= (expectedActionCountByViewport.get(viewport.name) ?? actionCount) && (viewport.setup_action_results || []).every((result) => result.ok !== false || result.optional === true),
11480
11525
  result_count: (viewport.setup_action_results || []).length
11481
11526
  })),
11482
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport),
11527
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, profile.target.screenshot_full_page),
11483
11528
  failed
11484
11529
  },
11485
11530
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -12499,14 +12544,28 @@ function profileScreenshotLabels(viewports) {
12499
12544
  }
12500
12545
  return labels;
12501
12546
  }
12502
- function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport) {
12547
+ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, finalScreenshotFullPage) {
12548
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === undefined
12549
+ ? undefined
12550
+ : finalScreenshotFullPage !== false;
12551
+ const finalScreenshotCount = (viewports || []).filter((viewport) => viewport && typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
12503
12552
  return {
12504
12553
  viewport_count: (viewports || []).length,
12505
12554
  action_count: actionCount ?? null,
12555
+ final_screenshot_count: finalScreenshotCount,
12556
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
12557
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === undefined
12558
+ ? null
12559
+ : normalizedFinalScreenshotFullPage
12560
+ ? "full_page"
12561
+ : "viewport",
12506
12562
  viewports: (viewports || []).map((viewport) => {
12507
12563
  const expectedActionCount = expectedActionCountsByViewport && expectedActionCountsByViewport[viewport.name] !== undefined
12508
12564
  ? expectedActionCountsByViewport[viewport.name]
12509
12565
  : actionCount;
12566
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean"
12567
+ ? viewport.screenshot_full_page
12568
+ : normalizedFinalScreenshotFullPage;
12510
12569
  const results = viewport.setup_action_results || [];
12511
12570
  const failed = results.filter((result) => result && result.ok === false && result.optional !== true);
12512
12571
  const optionalFailed = results.filter((result) => result && result.ok === false && result.optional === true);
@@ -12560,6 +12619,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewp
12560
12619
  action_counts: profileSetupActionCounts(results),
12561
12620
  frame_action_count: results.filter((result) => result && result.frame_selector).length,
12562
12621
  frame_urls: profileSetupFrameUrls(viewport),
12622
+ final_screenshot: viewport.screenshot_label || null,
12623
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
12563
12624
  setup_screenshots: profileSetupScreenshotLabels(results),
12564
12625
  clicked_total: clickedItems.length,
12565
12626
  clicked_truncated: clickedItems.length > clicked.length,
@@ -12744,7 +12805,7 @@ function assessProfile(profile, evidence) {
12744
12805
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false || result.optional === true),
12745
12806
  result_count: (viewport.setup_action_results || []).length,
12746
12807
  })),
12747
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport),
12808
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, profile.target && profile.target.screenshot_full_page),
12748
12809
  failed,
12749
12810
  },
12750
12811
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
@@ -15622,8 +15683,14 @@ async function captureViewport(viewport) {
15622
15683
  }
15623
15684
  }
15624
15685
  const screenshotLabel = profileSlug + "-" + viewport.name;
15686
+ let screenshotFullPage = null;
15625
15687
  try {
15626
- if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel);
15688
+ const screenshotOptions = {};
15689
+ if (profile.target && profile.target.screenshot_full_page !== undefined) {
15690
+ screenshotFullPage = profile.target.screenshot_full_page !== false;
15691
+ screenshotOptions.fullPage = screenshotFullPage;
15692
+ }
15693
+ if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel, screenshotOptions);
15627
15694
  } catch (error) {
15628
15695
  pageErrors.push({ message: "saveScreenshot failed: " + String(error && error.message ? error.message : error).slice(0, 500) });
15629
15696
  }
@@ -15690,6 +15757,7 @@ async function captureViewport(viewport) {
15690
15757
  route_inventory: routeInventory,
15691
15758
  setup_action_results: setupActionResults,
15692
15759
  screenshot_label: screenshotLabel,
15760
+ screenshot_full_page: screenshotFullPage,
15693
15761
  navigation_error: navigationError,
15694
15762
  wait_error: waitError,
15695
15763
  };
package/dist/index.js CHANGED
@@ -62,7 +62,7 @@ import {
62
62
  resolveRiddleProofProfileTimeoutSec,
63
63
  slugifyRiddleProofProfileName,
64
64
  summarizeRiddleProofProfileResult
65
- } from "./chunk-N75EAJNG.js";
65
+ } from "./chunk-6VXZ6V5M.js";
66
66
  import {
67
67
  DEFAULT_RIDDLE_API_BASE_URL,
68
68
  DEFAULT_RIDDLE_API_KEY_FILE,
package/dist/profile.cjs CHANGED
@@ -541,12 +541,18 @@ function profileScreenshotLabels(viewports) {
541
541
  }
542
542
  return labels;
543
543
  }
544
- function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport) {
544
+ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, finalScreenshotFullPage) {
545
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === void 0 ? void 0 : finalScreenshotFullPage !== false;
546
+ const finalScreenshotCount = viewports.filter((viewport) => typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
545
547
  return toJsonValue({
546
548
  viewport_count: viewports.length,
547
549
  action_count: actionCount ?? null,
550
+ final_screenshot_count: finalScreenshotCount,
551
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
552
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === void 0 ? null : normalizedFinalScreenshotFullPage ? "full_page" : "viewport",
548
553
  viewports: viewports.map((viewport) => {
549
554
  const expectedActionCount = expectedActionCountByViewport?.get(viewport.name) ?? actionCount;
555
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean" ? viewport.screenshot_full_page : normalizedFinalScreenshotFullPage;
550
556
  const results = viewport.setup_action_results || [];
551
557
  const failed = results.filter((result) => result.ok === false && result.optional !== true);
552
558
  const optionalFailed = results.filter((result) => result.ok === false && result.optional === true);
@@ -586,6 +592,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountByViewpo
586
592
  action_counts: profileSetupActionCounts(results),
587
593
  frame_action_count: results.filter((result) => result.frame_selector).length,
588
594
  frame_urls: profileSetupFrameUrls(viewport),
595
+ final_screenshot: viewport.screenshot_label ?? null,
596
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
589
597
  setup_screenshots: profileSetupScreenshotLabels(results),
590
598
  clicked_total: clickedItems.length,
591
599
  clicked_truncated: clickedItems.length > clicked.length,
@@ -922,6 +930,42 @@ function normalizeSetupActions(value) {
922
930
  if (!Array.isArray(value)) throw new Error("target.setup_actions must be an array.");
923
931
  return value.map(normalizeSetupAction);
924
932
  }
933
+ function normalizeTargetScreenshotFullPage(input) {
934
+ const directFullPage = booleanValue(valueFromOwn(
935
+ input,
936
+ "screenshot_full_page",
937
+ "screenshotFullPage",
938
+ "final_screenshot_full_page",
939
+ "finalScreenshotFullPage",
940
+ "full_page_screenshots",
941
+ "fullPageScreenshots"
942
+ ));
943
+ const viewportOnly = booleanValue(valueFromOwn(
944
+ input,
945
+ "viewport_screenshots",
946
+ "viewportScreenshots",
947
+ "viewport_only_screenshots",
948
+ "viewportOnlyScreenshots"
949
+ ));
950
+ const modeInput = stringFromOwn(input, "screenshot_mode", "screenshotMode", "final_screenshot_mode", "finalScreenshotMode");
951
+ let modeFullPage;
952
+ if (modeInput) {
953
+ const mode = modeInput.trim().toLowerCase().replace(/[-\s]+/g, "_");
954
+ if (mode === "full_page" || mode === "fullpage" || mode === "page" || mode === "document") {
955
+ modeFullPage = true;
956
+ } else if (mode === "viewport" || mode === "view") {
957
+ modeFullPage = false;
958
+ } else {
959
+ throw new Error(`target.screenshot_mode ${modeInput} is not supported. Supported modes: full_page, viewport.`);
960
+ }
961
+ }
962
+ const values = [directFullPage, viewportOnly === void 0 ? void 0 : !viewportOnly, modeFullPage].filter((value) => value !== void 0);
963
+ if (!values.length) return void 0;
964
+ if (values.some((value) => value !== values[0])) {
965
+ throw new Error("target has conflicting screenshot full_page / viewport mode options.");
966
+ }
967
+ return values[0];
968
+ }
925
969
  function normalizeNetworkMock(input, index) {
926
970
  if (!isRecord(input)) throw new Error(`target.network_mocks[${index}] must be an object.`);
927
971
  const url = stringValue(input.url) || stringValue(input.glob) || stringValue(input.pattern);
@@ -1490,6 +1534,7 @@ function normalizeRiddleProofProfile(input, options = {}) {
1490
1534
  timeout_sec: timeoutSecValue(targetInput.timeout_sec) ?? timeoutSecValue(targetInput.timeoutSec) ?? timeoutSecValue(targetInput.riddle_timeout_sec) ?? timeoutSecValue(targetInput.riddleTimeoutSec),
1491
1535
  wait_for_selector: stringValue(targetInput.wait_for_selector) || stringValue(targetInput.waitForSelector),
1492
1536
  wait_ms: numberValue(targetInput.wait_ms) ?? numberValue(targetInput.waitMs),
1537
+ screenshot_full_page: normalizeTargetScreenshotFullPage(targetInput),
1493
1538
  setup_actions: normalizeSetupActions(targetInput.setup_actions ?? targetInput.setupActions),
1494
1539
  network_mocks: normalizeNetworkMocks(targetInput.network_mocks ?? targetInput.networkMocks)
1495
1540
  },
@@ -2793,7 +2838,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
2793
2838
  ok: (viewport.setup_action_results || []).length >= (expectedActionCountByViewport.get(viewport.name) ?? actionCount) && (viewport.setup_action_results || []).every((result) => result.ok !== false || result.optional === true),
2794
2839
  result_count: (viewport.setup_action_results || []).length
2795
2840
  })),
2796
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport),
2841
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountByViewport, profile.target.screenshot_full_page),
2797
2842
  failed
2798
2843
  },
2799
2844
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -3813,14 +3858,28 @@ function profileScreenshotLabels(viewports) {
3813
3858
  }
3814
3859
  return labels;
3815
3860
  }
3816
- function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport) {
3861
+ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, finalScreenshotFullPage) {
3862
+ const normalizedFinalScreenshotFullPage = finalScreenshotFullPage === undefined
3863
+ ? undefined
3864
+ : finalScreenshotFullPage !== false;
3865
+ const finalScreenshotCount = (viewports || []).filter((viewport) => viewport && typeof viewport.screenshot_label === "string" && viewport.screenshot_label.trim()).length;
3817
3866
  return {
3818
3867
  viewport_count: (viewports || []).length,
3819
3868
  action_count: actionCount ?? null,
3869
+ final_screenshot_count: finalScreenshotCount,
3870
+ final_screenshot_full_page: normalizedFinalScreenshotFullPage ?? null,
3871
+ final_screenshot_mode: normalizedFinalScreenshotFullPage === undefined
3872
+ ? null
3873
+ : normalizedFinalScreenshotFullPage
3874
+ ? "full_page"
3875
+ : "viewport",
3820
3876
  viewports: (viewports || []).map((viewport) => {
3821
3877
  const expectedActionCount = expectedActionCountsByViewport && expectedActionCountsByViewport[viewport.name] !== undefined
3822
3878
  ? expectedActionCountsByViewport[viewport.name]
3823
3879
  : actionCount;
3880
+ const viewportFinalScreenshotFullPage = typeof viewport.screenshot_full_page === "boolean"
3881
+ ? viewport.screenshot_full_page
3882
+ : normalizedFinalScreenshotFullPage;
3824
3883
  const results = viewport.setup_action_results || [];
3825
3884
  const failed = results.filter((result) => result && result.ok === false && result.optional !== true);
3826
3885
  const optionalFailed = results.filter((result) => result && result.ok === false && result.optional === true);
@@ -3874,6 +3933,8 @@ function profileSetupSummary(viewports, actionCount, expectedActionCountsByViewp
3874
3933
  action_counts: profileSetupActionCounts(results),
3875
3934
  frame_action_count: results.filter((result) => result && result.frame_selector).length,
3876
3935
  frame_urls: profileSetupFrameUrls(viewport),
3936
+ final_screenshot: viewport.screenshot_label || null,
3937
+ final_screenshot_full_page: viewportFinalScreenshotFullPage ?? null,
3877
3938
  setup_screenshots: profileSetupScreenshotLabels(results),
3878
3939
  clicked_total: clickedItems.length,
3879
3940
  clicked_truncated: clickedItems.length > clicked.length,
@@ -4058,7 +4119,7 @@ function assessProfile(profile, evidence) {
4058
4119
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false || result.optional === true),
4059
4120
  result_count: (viewport.setup_action_results || []).length,
4060
4121
  })),
4061
- setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport),
4122
+ setup_summary: profileSetupSummary(viewports, actionCount, expectedActionCountsByViewport, profile.target && profile.target.screenshot_full_page),
4062
4123
  failed,
4063
4124
  },
4064
4125
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
@@ -6936,8 +6997,14 @@ async function captureViewport(viewport) {
6936
6997
  }
6937
6998
  }
6938
6999
  const screenshotLabel = profileSlug + "-" + viewport.name;
7000
+ let screenshotFullPage = null;
6939
7001
  try {
6940
- if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel);
7002
+ const screenshotOptions = {};
7003
+ if (profile.target && profile.target.screenshot_full_page !== undefined) {
7004
+ screenshotFullPage = profile.target.screenshot_full_page !== false;
7005
+ screenshotOptions.fullPage = screenshotFullPage;
7006
+ }
7007
+ if (typeof saveScreenshot === "function") await saveScreenshot(screenshotLabel, screenshotOptions);
6941
7008
  } catch (error) {
6942
7009
  pageErrors.push({ message: "saveScreenshot failed: " + String(error && error.message ? error.message : error).slice(0, 500) });
6943
7010
  }
@@ -7004,6 +7071,7 @@ async function captureViewport(viewport) {
7004
7071
  route_inventory: routeInventory,
7005
7072
  setup_action_results: setupActionResults,
7006
7073
  screenshot_label: screenshotLabel,
7074
+ screenshot_full_page: screenshotFullPage,
7007
7075
  navigation_error: navigationError,
7008
7076
  wait_error: waitError,
7009
7077
  };
@@ -203,6 +203,7 @@ interface RiddleProofProfileTarget {
203
203
  timeout_sec?: number;
204
204
  wait_for_selector?: string;
205
205
  wait_ms?: number;
206
+ screenshot_full_page?: boolean;
206
207
  setup_actions?: RiddleProofProfileSetupAction[];
207
208
  network_mocks?: RiddleProofProfileNetworkMock[];
208
209
  }
@@ -322,6 +323,7 @@ interface RiddleProofProfileViewportEvidence {
322
323
  route_inventory?: Record<string, JsonValue>;
323
324
  setup_action_results?: Array<Record<string, JsonValue>>;
324
325
  screenshot_label?: string;
326
+ screenshot_full_page?: boolean | null;
325
327
  navigation_error?: string;
326
328
  wait_error?: string;
327
329
  }
package/dist/profile.d.ts CHANGED
@@ -203,6 +203,7 @@ interface RiddleProofProfileTarget {
203
203
  timeout_sec?: number;
204
204
  wait_for_selector?: string;
205
205
  wait_ms?: number;
206
+ screenshot_full_page?: boolean;
206
207
  setup_actions?: RiddleProofProfileSetupAction[];
207
208
  network_mocks?: RiddleProofProfileNetworkMock[];
208
209
  }
@@ -322,6 +323,7 @@ interface RiddleProofProfileViewportEvidence {
322
323
  route_inventory?: Record<string, JsonValue>;
323
324
  setup_action_results?: Array<Record<string, JsonValue>>;
324
325
  screenshot_label?: string;
326
+ screenshot_full_page?: boolean | null;
325
327
  navigation_error?: string;
326
328
  wait_error?: string;
327
329
  }
package/dist/profile.js CHANGED
@@ -23,7 +23,7 @@ import {
23
23
  resolveRiddleProofProfileTimeoutSec,
24
24
  slugifyRiddleProofProfileName,
25
25
  summarizeRiddleProofProfileResult
26
- } from "./chunk-N75EAJNG.js";
26
+ } from "./chunk-6VXZ6V5M.js";
27
27
  export {
28
28
  RIDDLE_PROOF_PROFILE_CHECK_TYPES,
29
29
  RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@riddledc/riddle-proof",
3
- "version": "0.7.138",
3
+ "version": "0.7.140",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",