@riddledc/riddle-proof 0.7.61 → 0.7.62

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
@@ -284,6 +284,12 @@ and setup assertions then execute in that frame context and record
284
284
  Use `frame_index` / `frameIndex` when more than one matching iframe is present;
285
285
  it defaults to the first frame.
286
286
 
287
+ Profiles with setup actions also include a compact
288
+ `setup_actions_succeeded.evidence.setup_summary`. The summary groups each
289
+ viewport's final route, final URL, action counts, clicked targets, iframe URLs,
290
+ compact text samples, and failures so setup-heavy clickthrough or iframe proofs
291
+ can be reviewed without reading every raw setup-action result.
292
+
287
293
  `target.timeout_sec` is optional. Use it for known-heavy profile targets so the
288
294
  profile carries its own hosted Riddle worker budget; an explicit CLI `--timeout`
289
295
  still overrides the profile value for one-off runs.
@@ -175,6 +175,78 @@ function toJsonValue(value) {
175
175
  if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
176
176
  return String(value);
177
177
  }
178
+ function compactProfileSetupSummaryText(value, limit = 160) {
179
+ const text = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : "";
180
+ if (!text) return void 0;
181
+ if (text.length <= limit) return text;
182
+ return `${text.slice(0, Math.max(0, limit - 15)).trimEnd()}... (${text.length} chars)`;
183
+ }
184
+ function profileSetupResultAction(value) {
185
+ const action = value.action ?? value.type;
186
+ return typeof action === "string" && action ? action : "unknown";
187
+ }
188
+ function profileSetupFrameUrls(viewport) {
189
+ const urls = [];
190
+ const frames = viewport.frames || {};
191
+ for (const container of Object.values(frames)) {
192
+ if (!isRecord(container) || !Array.isArray(container.frames)) continue;
193
+ for (const frame of container.frames) {
194
+ if (!isRecord(frame)) continue;
195
+ const url = typeof frame.url === "string" ? frame.url : void 0;
196
+ if (url && !urls.includes(url)) urls.push(url);
197
+ }
198
+ }
199
+ return urls.slice(0, 10);
200
+ }
201
+ function profileSetupActionCounts(results) {
202
+ const counts = {};
203
+ for (const result of results) {
204
+ const action = profileSetupResultAction(result);
205
+ counts[action] = (counts[action] || 0) + 1;
206
+ }
207
+ return toJsonValue(counts);
208
+ }
209
+ function profileSetupSummary(viewports, actionCount) {
210
+ return toJsonValue({
211
+ viewport_count: viewports.length,
212
+ action_count: actionCount ?? null,
213
+ viewports: viewports.map((viewport) => {
214
+ const results = viewport.setup_action_results || [];
215
+ const failed = results.filter((result) => result.ok === false);
216
+ const clicked = results.filter((result) => profileSetupResultAction(result) === "click" && result.ok !== false).map((result) => ({
217
+ ordinal: result.ordinal ?? null,
218
+ selector: result.selector ?? null,
219
+ frame_selector: result.frame_selector ?? null,
220
+ text: compactProfileSetupSummaryText(result.text)
221
+ })).slice(0, 8);
222
+ const text_samples = results.filter((result) => result.ok !== false && typeof result.text === "string" && (profileSetupResultAction(result) === "assert_text_visible" || profileSetupResultAction(result) === "assert_text_absent" || profileSetupResultAction(result) === "wait_for_text")).map((result) => ({
223
+ ordinal: result.ordinal ?? null,
224
+ action: profileSetupResultAction(result),
225
+ frame_selector: result.frame_selector ?? null,
226
+ text: compactProfileSetupSummaryText(result.text)
227
+ })).filter((item) => item.text).slice(-6);
228
+ return {
229
+ name: viewport.name,
230
+ ok: (actionCount === void 0 ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
231
+ result_count: results.length,
232
+ observed_path: viewport.route?.observed ?? null,
233
+ final_url: viewport.url ?? null,
234
+ action_counts: profileSetupActionCounts(results),
235
+ frame_action_count: results.filter((result) => result.frame_selector).length,
236
+ frame_urls: profileSetupFrameUrls(viewport),
237
+ clicked,
238
+ text_samples,
239
+ failed: failed.map((result) => ({
240
+ ordinal: result.ordinal ?? null,
241
+ action: profileSetupResultAction(result),
242
+ selector: result.selector ?? null,
243
+ frame_selector: result.frame_selector ?? null,
244
+ reason: result.reason ?? result.error ?? null
245
+ }))
246
+ };
247
+ })
248
+ });
249
+ }
178
250
  function normalizeName(value, fallback) {
179
251
  const name = stringValue(value) || fallback;
180
252
  return name.replace(/\s+/g, " ").trim();
@@ -1281,6 +1353,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
1281
1353
  ok: (viewport.setup_action_results || []).length >= actionCount && (viewport.setup_action_results || []).every((result) => result.ok !== false),
1282
1354
  result_count: (viewport.setup_action_results || []).length
1283
1355
  })),
1356
+ setup_summary: profileSetupSummary(viewports, actionCount),
1284
1357
  failed
1285
1358
  },
1286
1359
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -1694,6 +1767,90 @@ function requiredNetworkMockHitCount(mock) {
1694
1767
  if (Array.isArray(mock.responses) && mock.responses.length) return mock.responses.length;
1695
1768
  return 1;
1696
1769
  }
1770
+ function compactProfileSetupSummaryText(value, limit) {
1771
+ limit = limit || 160;
1772
+ const text = typeof value === "string" ? value.replace(/\\s+/g, " ").trim() : "";
1773
+ if (!text) return undefined;
1774
+ if (text.length <= limit) return text;
1775
+ return text.slice(0, Math.max(0, limit - 15)).trimEnd() + "... (" + text.length + " chars)";
1776
+ }
1777
+ function profileSetupResultAction(result) {
1778
+ const action = result && (result.action || result.type);
1779
+ return typeof action === "string" && action ? action : "unknown";
1780
+ }
1781
+ function profileSetupFrameUrls(viewport) {
1782
+ const urls = [];
1783
+ const frames = viewport && viewport.frames || {};
1784
+ for (const container of Object.values(frames)) {
1785
+ if (!container || typeof container !== "object" || Array.isArray(container) || !Array.isArray(container.frames)) continue;
1786
+ for (const frame of container.frames) {
1787
+ if (!frame || typeof frame !== "object" || Array.isArray(frame)) continue;
1788
+ const url = typeof frame.url === "string" ? frame.url : null;
1789
+ if (url && !urls.includes(url)) urls.push(url);
1790
+ }
1791
+ }
1792
+ return urls.slice(0, 10);
1793
+ }
1794
+ function profileSetupActionCounts(results) {
1795
+ const counts = {};
1796
+ for (const result of results || []) {
1797
+ const action = profileSetupResultAction(result);
1798
+ counts[action] = (counts[action] || 0) + 1;
1799
+ }
1800
+ return counts;
1801
+ }
1802
+ function profileSetupSummary(viewports, actionCount) {
1803
+ return {
1804
+ viewport_count: (viewports || []).length,
1805
+ action_count: actionCount ?? null,
1806
+ viewports: (viewports || []).map((viewport) => {
1807
+ const results = viewport.setup_action_results || [];
1808
+ const failed = results.filter((result) => result && result.ok === false);
1809
+ const clicked = results
1810
+ .filter((result) => result && profileSetupResultAction(result) === "click" && result.ok !== false)
1811
+ .map((result) => ({
1812
+ ordinal: result.ordinal ?? null,
1813
+ selector: result.selector ?? null,
1814
+ frame_selector: result.frame_selector ?? null,
1815
+ text: compactProfileSetupSummaryText(result.text),
1816
+ }))
1817
+ .slice(0, 8);
1818
+ const textSamples = results
1819
+ .filter((result) => result && result.ok !== false && typeof result.text === "string" && (
1820
+ profileSetupResultAction(result) === "assert_text_visible"
1821
+ || profileSetupResultAction(result) === "assert_text_absent"
1822
+ || profileSetupResultAction(result) === "wait_for_text"
1823
+ ))
1824
+ .map((result) => ({
1825
+ ordinal: result.ordinal ?? null,
1826
+ action: profileSetupResultAction(result),
1827
+ frame_selector: result.frame_selector ?? null,
1828
+ text: compactProfileSetupSummaryText(result.text),
1829
+ }))
1830
+ .filter((item) => item.text)
1831
+ .slice(-6);
1832
+ return {
1833
+ name: viewport.name,
1834
+ ok: (actionCount === undefined ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
1835
+ result_count: results.length,
1836
+ observed_path: viewport.route && viewport.route.observed || null,
1837
+ final_url: viewport.url || null,
1838
+ action_counts: profileSetupActionCounts(results),
1839
+ frame_action_count: results.filter((result) => result && result.frame_selector).length,
1840
+ frame_urls: profileSetupFrameUrls(viewport),
1841
+ clicked,
1842
+ text_samples: textSamples,
1843
+ failed: failed.map((result) => ({
1844
+ ordinal: result.ordinal ?? null,
1845
+ action: profileSetupResultAction(result),
1846
+ selector: result.selector ?? null,
1847
+ frame_selector: result.frame_selector ?? null,
1848
+ reason: result.reason || result.error || null,
1849
+ })),
1850
+ };
1851
+ }),
1852
+ };
1853
+ }
1697
1854
  function assessProfile(profile, evidence) {
1698
1855
  const checks = [];
1699
1856
  const viewports = evidence.viewports || [];
@@ -1798,6 +1955,7 @@ function assessProfile(profile, evidence) {
1798
1955
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false),
1799
1956
  result_count: (viewport.setup_action_results || []).length,
1800
1957
  })),
1958
+ setup_summary: profileSetupSummary(viewports, actionCount),
1801
1959
  failed,
1802
1960
  },
1803
1961
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
package/dist/cli.cjs CHANGED
@@ -7048,6 +7048,78 @@ function toJsonValue(value) {
7048
7048
  if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
7049
7049
  return String(value);
7050
7050
  }
7051
+ function compactProfileSetupSummaryText(value, limit = 160) {
7052
+ const text = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : "";
7053
+ if (!text) return void 0;
7054
+ if (text.length <= limit) return text;
7055
+ return `${text.slice(0, Math.max(0, limit - 15)).trimEnd()}... (${text.length} chars)`;
7056
+ }
7057
+ function profileSetupResultAction(value) {
7058
+ const action = value.action ?? value.type;
7059
+ return typeof action === "string" && action ? action : "unknown";
7060
+ }
7061
+ function profileSetupFrameUrls(viewport) {
7062
+ const urls = [];
7063
+ const frames = viewport.frames || {};
7064
+ for (const container of Object.values(frames)) {
7065
+ if (!isRecord(container) || !Array.isArray(container.frames)) continue;
7066
+ for (const frame of container.frames) {
7067
+ if (!isRecord(frame)) continue;
7068
+ const url = typeof frame.url === "string" ? frame.url : void 0;
7069
+ if (url && !urls.includes(url)) urls.push(url);
7070
+ }
7071
+ }
7072
+ return urls.slice(0, 10);
7073
+ }
7074
+ function profileSetupActionCounts(results) {
7075
+ const counts = {};
7076
+ for (const result of results) {
7077
+ const action = profileSetupResultAction(result);
7078
+ counts[action] = (counts[action] || 0) + 1;
7079
+ }
7080
+ return toJsonValue(counts);
7081
+ }
7082
+ function profileSetupSummary(viewports, actionCount) {
7083
+ return toJsonValue({
7084
+ viewport_count: viewports.length,
7085
+ action_count: actionCount ?? null,
7086
+ viewports: viewports.map((viewport) => {
7087
+ const results = viewport.setup_action_results || [];
7088
+ const failed = results.filter((result) => result.ok === false);
7089
+ const clicked = results.filter((result) => profileSetupResultAction(result) === "click" && result.ok !== false).map((result) => ({
7090
+ ordinal: result.ordinal ?? null,
7091
+ selector: result.selector ?? null,
7092
+ frame_selector: result.frame_selector ?? null,
7093
+ text: compactProfileSetupSummaryText(result.text)
7094
+ })).slice(0, 8);
7095
+ const text_samples = results.filter((result) => result.ok !== false && typeof result.text === "string" && (profileSetupResultAction(result) === "assert_text_visible" || profileSetupResultAction(result) === "assert_text_absent" || profileSetupResultAction(result) === "wait_for_text")).map((result) => ({
7096
+ ordinal: result.ordinal ?? null,
7097
+ action: profileSetupResultAction(result),
7098
+ frame_selector: result.frame_selector ?? null,
7099
+ text: compactProfileSetupSummaryText(result.text)
7100
+ })).filter((item) => item.text).slice(-6);
7101
+ return {
7102
+ name: viewport.name,
7103
+ ok: (actionCount === void 0 ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
7104
+ result_count: results.length,
7105
+ observed_path: viewport.route?.observed ?? null,
7106
+ final_url: viewport.url ?? null,
7107
+ action_counts: profileSetupActionCounts(results),
7108
+ frame_action_count: results.filter((result) => result.frame_selector).length,
7109
+ frame_urls: profileSetupFrameUrls(viewport),
7110
+ clicked,
7111
+ text_samples,
7112
+ failed: failed.map((result) => ({
7113
+ ordinal: result.ordinal ?? null,
7114
+ action: profileSetupResultAction(result),
7115
+ selector: result.selector ?? null,
7116
+ frame_selector: result.frame_selector ?? null,
7117
+ reason: result.reason ?? result.error ?? null
7118
+ }))
7119
+ };
7120
+ })
7121
+ });
7122
+ }
7051
7123
  function normalizeName(value, fallback) {
7052
7124
  const name = stringValue2(value) || fallback;
7053
7125
  return name.replace(/\s+/g, " ").trim();
@@ -8154,6 +8226,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
8154
8226
  ok: (viewport.setup_action_results || []).length >= actionCount && (viewport.setup_action_results || []).every((result) => result.ok !== false),
8155
8227
  result_count: (viewport.setup_action_results || []).length
8156
8228
  })),
8229
+ setup_summary: profileSetupSummary(viewports, actionCount),
8157
8230
  failed
8158
8231
  },
8159
8232
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -8551,6 +8624,90 @@ function requiredNetworkMockHitCount(mock) {
8551
8624
  if (Array.isArray(mock.responses) && mock.responses.length) return mock.responses.length;
8552
8625
  return 1;
8553
8626
  }
8627
+ function compactProfileSetupSummaryText(value, limit) {
8628
+ limit = limit || 160;
8629
+ const text = typeof value === "string" ? value.replace(/\\s+/g, " ").trim() : "";
8630
+ if (!text) return undefined;
8631
+ if (text.length <= limit) return text;
8632
+ return text.slice(0, Math.max(0, limit - 15)).trimEnd() + "... (" + text.length + " chars)";
8633
+ }
8634
+ function profileSetupResultAction(result) {
8635
+ const action = result && (result.action || result.type);
8636
+ return typeof action === "string" && action ? action : "unknown";
8637
+ }
8638
+ function profileSetupFrameUrls(viewport) {
8639
+ const urls = [];
8640
+ const frames = viewport && viewport.frames || {};
8641
+ for (const container of Object.values(frames)) {
8642
+ if (!container || typeof container !== "object" || Array.isArray(container) || !Array.isArray(container.frames)) continue;
8643
+ for (const frame of container.frames) {
8644
+ if (!frame || typeof frame !== "object" || Array.isArray(frame)) continue;
8645
+ const url = typeof frame.url === "string" ? frame.url : null;
8646
+ if (url && !urls.includes(url)) urls.push(url);
8647
+ }
8648
+ }
8649
+ return urls.slice(0, 10);
8650
+ }
8651
+ function profileSetupActionCounts(results) {
8652
+ const counts = {};
8653
+ for (const result of results || []) {
8654
+ const action = profileSetupResultAction(result);
8655
+ counts[action] = (counts[action] || 0) + 1;
8656
+ }
8657
+ return counts;
8658
+ }
8659
+ function profileSetupSummary(viewports, actionCount) {
8660
+ return {
8661
+ viewport_count: (viewports || []).length,
8662
+ action_count: actionCount ?? null,
8663
+ viewports: (viewports || []).map((viewport) => {
8664
+ const results = viewport.setup_action_results || [];
8665
+ const failed = results.filter((result) => result && result.ok === false);
8666
+ const clicked = results
8667
+ .filter((result) => result && profileSetupResultAction(result) === "click" && result.ok !== false)
8668
+ .map((result) => ({
8669
+ ordinal: result.ordinal ?? null,
8670
+ selector: result.selector ?? null,
8671
+ frame_selector: result.frame_selector ?? null,
8672
+ text: compactProfileSetupSummaryText(result.text),
8673
+ }))
8674
+ .slice(0, 8);
8675
+ const textSamples = results
8676
+ .filter((result) => result && result.ok !== false && typeof result.text === "string" && (
8677
+ profileSetupResultAction(result) === "assert_text_visible"
8678
+ || profileSetupResultAction(result) === "assert_text_absent"
8679
+ || profileSetupResultAction(result) === "wait_for_text"
8680
+ ))
8681
+ .map((result) => ({
8682
+ ordinal: result.ordinal ?? null,
8683
+ action: profileSetupResultAction(result),
8684
+ frame_selector: result.frame_selector ?? null,
8685
+ text: compactProfileSetupSummaryText(result.text),
8686
+ }))
8687
+ .filter((item) => item.text)
8688
+ .slice(-6);
8689
+ return {
8690
+ name: viewport.name,
8691
+ ok: (actionCount === undefined ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
8692
+ result_count: results.length,
8693
+ observed_path: viewport.route && viewport.route.observed || null,
8694
+ final_url: viewport.url || null,
8695
+ action_counts: profileSetupActionCounts(results),
8696
+ frame_action_count: results.filter((result) => result && result.frame_selector).length,
8697
+ frame_urls: profileSetupFrameUrls(viewport),
8698
+ clicked,
8699
+ text_samples: textSamples,
8700
+ failed: failed.map((result) => ({
8701
+ ordinal: result.ordinal ?? null,
8702
+ action: profileSetupResultAction(result),
8703
+ selector: result.selector ?? null,
8704
+ frame_selector: result.frame_selector ?? null,
8705
+ reason: result.reason || result.error || null,
8706
+ })),
8707
+ };
8708
+ }),
8709
+ };
8710
+ }
8554
8711
  function assessProfile(profile, evidence) {
8555
8712
  const checks = [];
8556
8713
  const viewports = evidence.viewports || [];
@@ -8655,6 +8812,7 @@ function assessProfile(profile, evidence) {
8655
8812
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false),
8656
8813
  result_count: (viewport.setup_action_results || []).length,
8657
8814
  })),
8815
+ setup_summary: profileSetupSummary(viewports, actionCount),
8658
8816
  failed,
8659
8817
  },
8660
8818
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
package/dist/cli.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  profileStatusExitCode,
11
11
  resolveRiddleProofProfileTargetUrl,
12
12
  resolveRiddleProofProfileTimeoutSec
13
- } from "./chunk-T66DWLBE.js";
13
+ } from "./chunk-MIHU2AWC.js";
14
14
  import {
15
15
  createRiddleApiClient,
16
16
  parseRiddleViewport
package/dist/index.cjs CHANGED
@@ -8889,6 +8889,78 @@ function toJsonValue(value) {
8889
8889
  if (isRecord2(value)) return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
8890
8890
  return String(value);
8891
8891
  }
8892
+ function compactProfileSetupSummaryText(value, limit = 160) {
8893
+ const text = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : "";
8894
+ if (!text) return void 0;
8895
+ if (text.length <= limit) return text;
8896
+ return `${text.slice(0, Math.max(0, limit - 15)).trimEnd()}... (${text.length} chars)`;
8897
+ }
8898
+ function profileSetupResultAction(value) {
8899
+ const action = value.action ?? value.type;
8900
+ return typeof action === "string" && action ? action : "unknown";
8901
+ }
8902
+ function profileSetupFrameUrls(viewport) {
8903
+ const urls = [];
8904
+ const frames = viewport.frames || {};
8905
+ for (const container of Object.values(frames)) {
8906
+ if (!isRecord2(container) || !Array.isArray(container.frames)) continue;
8907
+ for (const frame of container.frames) {
8908
+ if (!isRecord2(frame)) continue;
8909
+ const url = typeof frame.url === "string" ? frame.url : void 0;
8910
+ if (url && !urls.includes(url)) urls.push(url);
8911
+ }
8912
+ }
8913
+ return urls.slice(0, 10);
8914
+ }
8915
+ function profileSetupActionCounts(results) {
8916
+ const counts = {};
8917
+ for (const result of results) {
8918
+ const action = profileSetupResultAction(result);
8919
+ counts[action] = (counts[action] || 0) + 1;
8920
+ }
8921
+ return toJsonValue(counts);
8922
+ }
8923
+ function profileSetupSummary(viewports, actionCount) {
8924
+ return toJsonValue({
8925
+ viewport_count: viewports.length,
8926
+ action_count: actionCount ?? null,
8927
+ viewports: viewports.map((viewport) => {
8928
+ const results = viewport.setup_action_results || [];
8929
+ const failed = results.filter((result) => result.ok === false);
8930
+ const clicked = results.filter((result) => profileSetupResultAction(result) === "click" && result.ok !== false).map((result) => ({
8931
+ ordinal: result.ordinal ?? null,
8932
+ selector: result.selector ?? null,
8933
+ frame_selector: result.frame_selector ?? null,
8934
+ text: compactProfileSetupSummaryText(result.text)
8935
+ })).slice(0, 8);
8936
+ const text_samples = results.filter((result) => result.ok !== false && typeof result.text === "string" && (profileSetupResultAction(result) === "assert_text_visible" || profileSetupResultAction(result) === "assert_text_absent" || profileSetupResultAction(result) === "wait_for_text")).map((result) => ({
8937
+ ordinal: result.ordinal ?? null,
8938
+ action: profileSetupResultAction(result),
8939
+ frame_selector: result.frame_selector ?? null,
8940
+ text: compactProfileSetupSummaryText(result.text)
8941
+ })).filter((item) => item.text).slice(-6);
8942
+ return {
8943
+ name: viewport.name,
8944
+ ok: (actionCount === void 0 ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
8945
+ result_count: results.length,
8946
+ observed_path: viewport.route?.observed ?? null,
8947
+ final_url: viewport.url ?? null,
8948
+ action_counts: profileSetupActionCounts(results),
8949
+ frame_action_count: results.filter((result) => result.frame_selector).length,
8950
+ frame_urls: profileSetupFrameUrls(viewport),
8951
+ clicked,
8952
+ text_samples,
8953
+ failed: failed.map((result) => ({
8954
+ ordinal: result.ordinal ?? null,
8955
+ action: profileSetupResultAction(result),
8956
+ selector: result.selector ?? null,
8957
+ frame_selector: result.frame_selector ?? null,
8958
+ reason: result.reason ?? result.error ?? null
8959
+ }))
8960
+ };
8961
+ })
8962
+ });
8963
+ }
8892
8964
  function normalizeName(value, fallback) {
8893
8965
  const name = stringValue5(value) || fallback;
8894
8966
  return name.replace(/\s+/g, " ").trim();
@@ -9995,6 +10067,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
9995
10067
  ok: (viewport.setup_action_results || []).length >= actionCount && (viewport.setup_action_results || []).every((result) => result.ok !== false),
9996
10068
  result_count: (viewport.setup_action_results || []).length
9997
10069
  })),
10070
+ setup_summary: profileSetupSummary(viewports, actionCount),
9998
10071
  failed
9999
10072
  },
10000
10073
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -10408,6 +10481,90 @@ function requiredNetworkMockHitCount(mock) {
10408
10481
  if (Array.isArray(mock.responses) && mock.responses.length) return mock.responses.length;
10409
10482
  return 1;
10410
10483
  }
10484
+ function compactProfileSetupSummaryText(value, limit) {
10485
+ limit = limit || 160;
10486
+ const text = typeof value === "string" ? value.replace(/\\s+/g, " ").trim() : "";
10487
+ if (!text) return undefined;
10488
+ if (text.length <= limit) return text;
10489
+ return text.slice(0, Math.max(0, limit - 15)).trimEnd() + "... (" + text.length + " chars)";
10490
+ }
10491
+ function profileSetupResultAction(result) {
10492
+ const action = result && (result.action || result.type);
10493
+ return typeof action === "string" && action ? action : "unknown";
10494
+ }
10495
+ function profileSetupFrameUrls(viewport) {
10496
+ const urls = [];
10497
+ const frames = viewport && viewport.frames || {};
10498
+ for (const container of Object.values(frames)) {
10499
+ if (!container || typeof container !== "object" || Array.isArray(container) || !Array.isArray(container.frames)) continue;
10500
+ for (const frame of container.frames) {
10501
+ if (!frame || typeof frame !== "object" || Array.isArray(frame)) continue;
10502
+ const url = typeof frame.url === "string" ? frame.url : null;
10503
+ if (url && !urls.includes(url)) urls.push(url);
10504
+ }
10505
+ }
10506
+ return urls.slice(0, 10);
10507
+ }
10508
+ function profileSetupActionCounts(results) {
10509
+ const counts = {};
10510
+ for (const result of results || []) {
10511
+ const action = profileSetupResultAction(result);
10512
+ counts[action] = (counts[action] || 0) + 1;
10513
+ }
10514
+ return counts;
10515
+ }
10516
+ function profileSetupSummary(viewports, actionCount) {
10517
+ return {
10518
+ viewport_count: (viewports || []).length,
10519
+ action_count: actionCount ?? null,
10520
+ viewports: (viewports || []).map((viewport) => {
10521
+ const results = viewport.setup_action_results || [];
10522
+ const failed = results.filter((result) => result && result.ok === false);
10523
+ const clicked = results
10524
+ .filter((result) => result && profileSetupResultAction(result) === "click" && result.ok !== false)
10525
+ .map((result) => ({
10526
+ ordinal: result.ordinal ?? null,
10527
+ selector: result.selector ?? null,
10528
+ frame_selector: result.frame_selector ?? null,
10529
+ text: compactProfileSetupSummaryText(result.text),
10530
+ }))
10531
+ .slice(0, 8);
10532
+ const textSamples = results
10533
+ .filter((result) => result && result.ok !== false && typeof result.text === "string" && (
10534
+ profileSetupResultAction(result) === "assert_text_visible"
10535
+ || profileSetupResultAction(result) === "assert_text_absent"
10536
+ || profileSetupResultAction(result) === "wait_for_text"
10537
+ ))
10538
+ .map((result) => ({
10539
+ ordinal: result.ordinal ?? null,
10540
+ action: profileSetupResultAction(result),
10541
+ frame_selector: result.frame_selector ?? null,
10542
+ text: compactProfileSetupSummaryText(result.text),
10543
+ }))
10544
+ .filter((item) => item.text)
10545
+ .slice(-6);
10546
+ return {
10547
+ name: viewport.name,
10548
+ ok: (actionCount === undefined ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
10549
+ result_count: results.length,
10550
+ observed_path: viewport.route && viewport.route.observed || null,
10551
+ final_url: viewport.url || null,
10552
+ action_counts: profileSetupActionCounts(results),
10553
+ frame_action_count: results.filter((result) => result && result.frame_selector).length,
10554
+ frame_urls: profileSetupFrameUrls(viewport),
10555
+ clicked,
10556
+ text_samples: textSamples,
10557
+ failed: failed.map((result) => ({
10558
+ ordinal: result.ordinal ?? null,
10559
+ action: profileSetupResultAction(result),
10560
+ selector: result.selector ?? null,
10561
+ frame_selector: result.frame_selector ?? null,
10562
+ reason: result.reason || result.error || null,
10563
+ })),
10564
+ };
10565
+ }),
10566
+ };
10567
+ }
10411
10568
  function assessProfile(profile, evidence) {
10412
10569
  const checks = [];
10413
10570
  const viewports = evidence.viewports || [];
@@ -10512,6 +10669,7 @@ function assessProfile(profile, evidence) {
10512
10669
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false),
10513
10670
  result_count: (viewport.setup_action_results || []).length,
10514
10671
  })),
10672
+ setup_summary: profileSetupSummary(viewports, actionCount),
10515
10673
  failed,
10516
10674
  },
10517
10675
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
package/dist/index.js CHANGED
@@ -58,7 +58,7 @@ import {
58
58
  resolveRiddleProofProfileTimeoutSec,
59
59
  slugifyRiddleProofProfileName,
60
60
  summarizeRiddleProofProfileResult
61
- } from "./chunk-T66DWLBE.js";
61
+ } from "./chunk-MIHU2AWC.js";
62
62
  import {
63
63
  DEFAULT_RIDDLE_API_BASE_URL,
64
64
  DEFAULT_RIDDLE_API_KEY_FILE,
package/dist/profile.cjs CHANGED
@@ -218,6 +218,78 @@ function toJsonValue(value) {
218
218
  if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
219
219
  return String(value);
220
220
  }
221
+ function compactProfileSetupSummaryText(value, limit = 160) {
222
+ const text = typeof value === "string" ? value.replace(/\s+/g, " ").trim() : "";
223
+ if (!text) return void 0;
224
+ if (text.length <= limit) return text;
225
+ return `${text.slice(0, Math.max(0, limit - 15)).trimEnd()}... (${text.length} chars)`;
226
+ }
227
+ function profileSetupResultAction(value) {
228
+ const action = value.action ?? value.type;
229
+ return typeof action === "string" && action ? action : "unknown";
230
+ }
231
+ function profileSetupFrameUrls(viewport) {
232
+ const urls = [];
233
+ const frames = viewport.frames || {};
234
+ for (const container of Object.values(frames)) {
235
+ if (!isRecord(container) || !Array.isArray(container.frames)) continue;
236
+ for (const frame of container.frames) {
237
+ if (!isRecord(frame)) continue;
238
+ const url = typeof frame.url === "string" ? frame.url : void 0;
239
+ if (url && !urls.includes(url)) urls.push(url);
240
+ }
241
+ }
242
+ return urls.slice(0, 10);
243
+ }
244
+ function profileSetupActionCounts(results) {
245
+ const counts = {};
246
+ for (const result of results) {
247
+ const action = profileSetupResultAction(result);
248
+ counts[action] = (counts[action] || 0) + 1;
249
+ }
250
+ return toJsonValue(counts);
251
+ }
252
+ function profileSetupSummary(viewports, actionCount) {
253
+ return toJsonValue({
254
+ viewport_count: viewports.length,
255
+ action_count: actionCount ?? null,
256
+ viewports: viewports.map((viewport) => {
257
+ const results = viewport.setup_action_results || [];
258
+ const failed = results.filter((result) => result.ok === false);
259
+ const clicked = results.filter((result) => profileSetupResultAction(result) === "click" && result.ok !== false).map((result) => ({
260
+ ordinal: result.ordinal ?? null,
261
+ selector: result.selector ?? null,
262
+ frame_selector: result.frame_selector ?? null,
263
+ text: compactProfileSetupSummaryText(result.text)
264
+ })).slice(0, 8);
265
+ const text_samples = results.filter((result) => result.ok !== false && typeof result.text === "string" && (profileSetupResultAction(result) === "assert_text_visible" || profileSetupResultAction(result) === "assert_text_absent" || profileSetupResultAction(result) === "wait_for_text")).map((result) => ({
266
+ ordinal: result.ordinal ?? null,
267
+ action: profileSetupResultAction(result),
268
+ frame_selector: result.frame_selector ?? null,
269
+ text: compactProfileSetupSummaryText(result.text)
270
+ })).filter((item) => item.text).slice(-6);
271
+ return {
272
+ name: viewport.name,
273
+ ok: (actionCount === void 0 ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
274
+ result_count: results.length,
275
+ observed_path: viewport.route?.observed ?? null,
276
+ final_url: viewport.url ?? null,
277
+ action_counts: profileSetupActionCounts(results),
278
+ frame_action_count: results.filter((result) => result.frame_selector).length,
279
+ frame_urls: profileSetupFrameUrls(viewport),
280
+ clicked,
281
+ text_samples,
282
+ failed: failed.map((result) => ({
283
+ ordinal: result.ordinal ?? null,
284
+ action: profileSetupResultAction(result),
285
+ selector: result.selector ?? null,
286
+ frame_selector: result.frame_selector ?? null,
287
+ reason: result.reason ?? result.error ?? null
288
+ }))
289
+ };
290
+ })
291
+ });
292
+ }
221
293
  function normalizeName(value, fallback) {
222
294
  const name = stringValue(value) || fallback;
223
295
  return name.replace(/\s+/g, " ").trim();
@@ -1324,6 +1396,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
1324
1396
  ok: (viewport.setup_action_results || []).length >= actionCount && (viewport.setup_action_results || []).every((result) => result.ok !== false),
1325
1397
  result_count: (viewport.setup_action_results || []).length
1326
1398
  })),
1399
+ setup_summary: profileSetupSummary(viewports, actionCount),
1327
1400
  failed
1328
1401
  },
1329
1402
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -1737,6 +1810,90 @@ function requiredNetworkMockHitCount(mock) {
1737
1810
  if (Array.isArray(mock.responses) && mock.responses.length) return mock.responses.length;
1738
1811
  return 1;
1739
1812
  }
1813
+ function compactProfileSetupSummaryText(value, limit) {
1814
+ limit = limit || 160;
1815
+ const text = typeof value === "string" ? value.replace(/\\s+/g, " ").trim() : "";
1816
+ if (!text) return undefined;
1817
+ if (text.length <= limit) return text;
1818
+ return text.slice(0, Math.max(0, limit - 15)).trimEnd() + "... (" + text.length + " chars)";
1819
+ }
1820
+ function profileSetupResultAction(result) {
1821
+ const action = result && (result.action || result.type);
1822
+ return typeof action === "string" && action ? action : "unknown";
1823
+ }
1824
+ function profileSetupFrameUrls(viewport) {
1825
+ const urls = [];
1826
+ const frames = viewport && viewport.frames || {};
1827
+ for (const container of Object.values(frames)) {
1828
+ if (!container || typeof container !== "object" || Array.isArray(container) || !Array.isArray(container.frames)) continue;
1829
+ for (const frame of container.frames) {
1830
+ if (!frame || typeof frame !== "object" || Array.isArray(frame)) continue;
1831
+ const url = typeof frame.url === "string" ? frame.url : null;
1832
+ if (url && !urls.includes(url)) urls.push(url);
1833
+ }
1834
+ }
1835
+ return urls.slice(0, 10);
1836
+ }
1837
+ function profileSetupActionCounts(results) {
1838
+ const counts = {};
1839
+ for (const result of results || []) {
1840
+ const action = profileSetupResultAction(result);
1841
+ counts[action] = (counts[action] || 0) + 1;
1842
+ }
1843
+ return counts;
1844
+ }
1845
+ function profileSetupSummary(viewports, actionCount) {
1846
+ return {
1847
+ viewport_count: (viewports || []).length,
1848
+ action_count: actionCount ?? null,
1849
+ viewports: (viewports || []).map((viewport) => {
1850
+ const results = viewport.setup_action_results || [];
1851
+ const failed = results.filter((result) => result && result.ok === false);
1852
+ const clicked = results
1853
+ .filter((result) => result && profileSetupResultAction(result) === "click" && result.ok !== false)
1854
+ .map((result) => ({
1855
+ ordinal: result.ordinal ?? null,
1856
+ selector: result.selector ?? null,
1857
+ frame_selector: result.frame_selector ?? null,
1858
+ text: compactProfileSetupSummaryText(result.text),
1859
+ }))
1860
+ .slice(0, 8);
1861
+ const textSamples = results
1862
+ .filter((result) => result && result.ok !== false && typeof result.text === "string" && (
1863
+ profileSetupResultAction(result) === "assert_text_visible"
1864
+ || profileSetupResultAction(result) === "assert_text_absent"
1865
+ || profileSetupResultAction(result) === "wait_for_text"
1866
+ ))
1867
+ .map((result) => ({
1868
+ ordinal: result.ordinal ?? null,
1869
+ action: profileSetupResultAction(result),
1870
+ frame_selector: result.frame_selector ?? null,
1871
+ text: compactProfileSetupSummaryText(result.text),
1872
+ }))
1873
+ .filter((item) => item.text)
1874
+ .slice(-6);
1875
+ return {
1876
+ name: viewport.name,
1877
+ ok: (actionCount === undefined ? results.length > 0 : results.length >= actionCount) && failed.length === 0,
1878
+ result_count: results.length,
1879
+ observed_path: viewport.route && viewport.route.observed || null,
1880
+ final_url: viewport.url || null,
1881
+ action_counts: profileSetupActionCounts(results),
1882
+ frame_action_count: results.filter((result) => result && result.frame_selector).length,
1883
+ frame_urls: profileSetupFrameUrls(viewport),
1884
+ clicked,
1885
+ text_samples: textSamples,
1886
+ failed: failed.map((result) => ({
1887
+ ordinal: result.ordinal ?? null,
1888
+ action: profileSetupResultAction(result),
1889
+ selector: result.selector ?? null,
1890
+ frame_selector: result.frame_selector ?? null,
1891
+ reason: result.reason || result.error || null,
1892
+ })),
1893
+ };
1894
+ }),
1895
+ };
1896
+ }
1740
1897
  function assessProfile(profile, evidence) {
1741
1898
  const checks = [];
1742
1899
  const viewports = evidence.viewports || [];
@@ -1841,6 +1998,7 @@ function assessProfile(profile, evidence) {
1841
1998
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false),
1842
1999
  result_count: (viewport.setup_action_results || []).length,
1843
2000
  })),
2001
+ setup_summary: profileSetupSummary(viewports, actionCount),
1844
2002
  failed,
1845
2003
  },
1846
2004
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
package/dist/profile.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  resolveRiddleProofProfileTimeoutSec,
20
20
  slugifyRiddleProofProfileName,
21
21
  summarizeRiddleProofProfileResult
22
- } from "./chunk-T66DWLBE.js";
22
+ } from "./chunk-MIHU2AWC.js";
23
23
  export {
24
24
  RIDDLE_PROOF_PROFILE_CHECK_TYPES,
25
25
  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.61",
3
+ "version": "0.7.62",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",