@riddledc/riddle-proof 0.7.60 → 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/dist/profile.cjs CHANGED
@@ -77,6 +77,7 @@ var RIDDLE_PROOF_PROFILE_CHECK_TYPES = [
77
77
  ];
78
78
  var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
79
79
  "click",
80
+ "drag",
80
81
  "press",
81
82
  "fill",
82
83
  "set_input_value",
@@ -217,6 +218,78 @@ function toJsonValue(value) {
217
218
  if (isRecord(value)) return Object.fromEntries(Object.entries(value).map(([key, child]) => [key, toJsonValue(child)]));
218
219
  return String(value);
219
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
+ }
220
293
  function normalizeName(value, fallback) {
221
294
  const name = stringValue(value) || fallback;
222
295
  return name.replace(/\s+/g, " ").trim();
@@ -247,7 +320,7 @@ function isSupportedCheckType(value) {
247
320
  }
248
321
  function normalizeSetupActionType(value, index) {
249
322
  const normalizedInput = String(value || "").trim().replace(/-/g, "_");
250
- const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput === "keyboard_press" || normalizedInput === "key_press" ? "press" : normalizedInput;
323
+ const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput === "pointer_drag" || normalizedInput === "mouse_drag" || normalizedInput === "drag_to" ? "drag" : normalizedInput === "keyboard_press" || normalizedInput === "key_press" ? "press" : normalizedInput;
251
324
  if (RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.includes(normalized)) {
252
325
  return normalized;
253
326
  }
@@ -277,6 +350,13 @@ function normalizeSetupActionRepeat(input, index) {
277
350
  }
278
351
  return repeat;
279
352
  }
353
+ function normalizeSetupActionCoordinateMode(value, index) {
354
+ if (value === void 0 || value === null || value === "") return void 0;
355
+ const normalized = String(value).trim().replace(/-/g, "_").toLowerCase();
356
+ if (normalized === "pixels" || normalized === "pixel" || normalized === "px") return "pixels";
357
+ if (normalized === "ratio" || normalized === "relative" || normalized === "fraction") return "ratio";
358
+ throw new Error(`target.setup_actions[${index}].coordinate_mode ${String(value)} is not supported. Supported coordinate modes: pixels, ratio.`);
359
+ }
280
360
  function normalizeSetupAction(input, index) {
281
361
  if (!isRecord(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
282
362
  const type = normalizeSetupActionType(stringValue(input.type), index);
@@ -286,9 +366,25 @@ function normalizeSetupAction(input, index) {
286
366
  if (frameIndex !== void 0 && (!Number.isInteger(frameIndex) || frameIndex < 0)) {
287
367
  throw new Error(`target.setup_actions[${index}].frame_index must be a non-negative integer.`);
288
368
  }
289
- if ((type === "click" || type === "fill" || type === "set_input_value" || type === "wait_for_selector" || type === "wait_for_text" || type === "assert_text_visible" || type === "assert_text_absent" || type === "assert_selector_count") && !selector) {
369
+ if ((type === "click" || type === "drag" || type === "fill" || type === "set_input_value" || type === "wait_for_selector" || type === "wait_for_text" || type === "assert_text_visible" || type === "assert_text_absent" || type === "assert_selector_count") && !selector) {
290
370
  throw new Error(`target.setup_actions[${index}] ${type} requires selector.`);
291
371
  }
372
+ const fromX = numberValue(valueFromOwn(input, "from_x", "fromX", "start_x", "startX", "x1"));
373
+ const fromY = numberValue(valueFromOwn(input, "from_y", "fromY", "start_y", "startY", "y1"));
374
+ const toX = numberValue(valueFromOwn(input, "to_x", "toX", "end_x", "endX", "x2"));
375
+ const toY = numberValue(valueFromOwn(input, "to_y", "toY", "end_y", "endY", "y2"));
376
+ const coordinateMode = normalizeSetupActionCoordinateMode(valueFromOwn(input, "coordinate_mode", "coordinateMode", "coords", "units"), index);
377
+ if (type === "drag") {
378
+ if (fromX === void 0 || fromY === void 0 || toX === void 0 || toY === void 0) {
379
+ throw new Error(`target.setup_actions[${index}] drag requires from_x, from_y, to_x, and to_y.`);
380
+ }
381
+ if (coordinateMode === "ratio" && [fromX, fromY, toX, toY].some((value2) => value2 < 0 || value2 > 1)) {
382
+ throw new Error(`target.setup_actions[${index}] drag ratio coordinates must be between 0 and 1.`);
383
+ }
384
+ if ((coordinateMode === void 0 || coordinateMode === "pixels") && [fromX, fromY, toX, toY].some((value2) => value2 < 0)) {
385
+ throw new Error(`target.setup_actions[${index}] drag pixel coordinates must be non-negative.`);
386
+ }
387
+ }
292
388
  if (type === "wait_for_text" && !stringValue(input.text) && !stringValue(input.pattern)) {
293
389
  throw new Error(`target.setup_actions[${index}] wait_for_text requires text or pattern.`);
294
390
  }
@@ -335,12 +431,23 @@ function normalizeSetupAction(input, index) {
335
431
  }
336
432
  }
337
433
  const hasExpectedReturn = hasOwn(input, "expect_return") || hasOwn(input, "expectReturn") || hasOwn(input, "expected_return") || hasOwn(input, "expectedReturn");
434
+ const steps = numberValue(input.steps);
435
+ if (type === "drag" && steps !== void 0 && (!Number.isInteger(steps) || steps < 1 || steps > 100)) {
436
+ throw new Error(`target.setup_actions[${index}].steps must be an integer from 1 to 100.`);
437
+ }
338
438
  return {
339
439
  type,
340
440
  selector,
341
441
  frame_selector: frameSelector,
342
442
  frame_index: frameIndex,
343
443
  force: type === "click" && (input.force === true || input.force_click === true || input.forceClick === true),
444
+ coordinate_mode: coordinateMode,
445
+ from_x: fromX,
446
+ from_y: fromY,
447
+ to_x: toX,
448
+ to_y: toY,
449
+ duration_ms: numberValue(input.duration_ms) ?? numberValue(input.durationMs),
450
+ steps,
344
451
  key,
345
452
  value,
346
453
  value_json: hasJsonValue ? toJsonValue(input.value_json ?? input.valueJson ?? input.json) : void 0,
@@ -1289,6 +1396,7 @@ function assessSetupActionsFromEvidence(profile, evidence) {
1289
1396
  ok: (viewport.setup_action_results || []).length >= actionCount && (viewport.setup_action_results || []).every((result) => result.ok !== false),
1290
1397
  result_count: (viewport.setup_action_results || []).length
1291
1398
  })),
1399
+ setup_summary: profileSetupSummary(viewports, actionCount),
1292
1400
  failed
1293
1401
  },
1294
1402
  message: failed.length ? `Setup actions failed in ${failed.length} viewport action(s).` : void 0
@@ -1702,6 +1810,90 @@ function requiredNetworkMockHitCount(mock) {
1702
1810
  if (Array.isArray(mock.responses) && mock.responses.length) return mock.responses.length;
1703
1811
  return 1;
1704
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
+ }
1705
1897
  function assessProfile(profile, evidence) {
1706
1898
  const checks = [];
1707
1899
  const viewports = evidence.viewports || [];
@@ -1806,6 +1998,7 @@ function assessProfile(profile, evidence) {
1806
1998
  && (viewport.setup_action_results || []).every((result) => !result || result.ok !== false),
1807
1999
  result_count: (viewport.setup_action_results || []).length,
1808
2000
  })),
2001
+ setup_summary: profileSetupSummary(viewports, actionCount),
1809
2002
  failed,
1810
2003
  },
1811
2004
  message: failed.length ? "Setup actions failed in " + failed.length + " viewport action(s)." : undefined,
@@ -2548,6 +2741,71 @@ async function executeSetupAction(action, ordinal) {
2548
2741
  await scope.context.waitForSelector(action.selector, { state: "visible", timeout });
2549
2742
  return { ...base, ...setupScopeEvidence(scope), ok: true, timeout_ms: timeout };
2550
2743
  }
2744
+ if (type === "drag") {
2745
+ const scope = await setupActionScope(action, timeout);
2746
+ if (!scope.ok) return setupScopeFailure(base, scope);
2747
+ const locator = scope.context.locator(action.selector);
2748
+ const count = await locator.count();
2749
+ if (!count) return { ...base, ...setupScopeEvidence(scope), reason: "selector_not_found", count };
2750
+ const targetIndex = Number.isInteger(action.index) ? action.index : 0;
2751
+ if (targetIndex < 0 || targetIndex >= count) return { ...base, ...setupScopeEvidence(scope), reason: "index_out_of_range", count, target_index: targetIndex };
2752
+ const target = locator.nth(targetIndex);
2753
+ await target.waitFor({ state: "visible", timeout });
2754
+ const box = await target.boundingBox();
2755
+ if (!box) return { ...base, ...setupScopeEvidence(scope), reason: "bounding_box_unavailable", count, target_index: targetIndex };
2756
+ const mode = String(action.coordinate_mode || action.coordinateMode || "pixels").trim();
2757
+ const coordinate = (value, size) => mode === "ratio" ? value * size : value;
2758
+ const fromX = setupFiniteNumber(action.from_x ?? action.fromX ?? action.start_x ?? action.startX ?? action.x1);
2759
+ const fromY = setupFiniteNumber(action.from_y ?? action.fromY ?? action.start_y ?? action.startY ?? action.y1);
2760
+ const toX = setupFiniteNumber(action.to_x ?? action.toX ?? action.end_x ?? action.endX ?? action.x2);
2761
+ const toY = setupFiniteNumber(action.to_y ?? action.toY ?? action.end_y ?? action.endY ?? action.y2);
2762
+ if (fromX === undefined || fromY === undefined || toX === undefined || toY === undefined) return { ...base, ...setupScopeEvidence(scope), reason: "missing_drag_coordinates", count, target_index: targetIndex };
2763
+ if (mode === "ratio" && [fromX, fromY, toX, toY].some((value) => value < 0 || value > 1)) return { ...base, ...setupScopeEvidence(scope), reason: "invalid_ratio_coordinates", count, target_index: targetIndex };
2764
+ if (mode !== "ratio" && [fromX, fromY, toX, toY].some((value) => value < 0)) return { ...base, ...setupScopeEvidence(scope), reason: "invalid_pixel_coordinates", count, target_index: targetIndex };
2765
+ const start = {
2766
+ x: box.x + coordinate(fromX, box.width),
2767
+ y: box.y + coordinate(fromY, box.height),
2768
+ };
2769
+ const end = {
2770
+ x: box.x + coordinate(toX, box.width),
2771
+ y: box.y + coordinate(toY, box.height),
2772
+ };
2773
+ const requestedSteps = setupNumber(action.steps, 8);
2774
+ const steps = Math.min(100, Math.max(1, Math.floor(requestedSteps || 8)));
2775
+ const durationMs = setupNumber(action.duration_ms ?? action.durationMs, 0);
2776
+ await page.mouse.move(start.x, start.y);
2777
+ await page.mouse.down();
2778
+ try {
2779
+ if (durationMs && steps > 1) {
2780
+ for (let step = 1; step <= steps; step += 1) {
2781
+ const progress = step / steps;
2782
+ await page.mouse.move(
2783
+ start.x + (end.x - start.x) * progress,
2784
+ start.y + (end.y - start.y) * progress,
2785
+ );
2786
+ await page.waitForTimeout(durationMs / steps);
2787
+ }
2788
+ } else {
2789
+ await page.mouse.move(end.x, end.y, { steps });
2790
+ }
2791
+ } finally {
2792
+ await page.mouse.up().catch(() => {});
2793
+ }
2794
+ return {
2795
+ ...base,
2796
+ ...setupScopeEvidence(scope),
2797
+ ok: true,
2798
+ count,
2799
+ target_index: targetIndex,
2800
+ coordinate_mode: mode,
2801
+ from_x: fromX,
2802
+ from_y: fromY,
2803
+ to_x: toX,
2804
+ to_y: toY,
2805
+ steps,
2806
+ duration_ms: durationMs || undefined,
2807
+ };
2808
+ }
2551
2809
  if (type === "press") {
2552
2810
  const key = String(action.key || "").trim();
2553
2811
  if (!key) return { ...base, reason: "missing_key" };
@@ -5,7 +5,7 @@ declare const RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION: "riddle-proof.profile-evide
5
5
  declare const RIDDLE_PROOF_PROFILE_RESULT_VERSION: "riddle-proof.profile-result.v1";
6
6
  declare const RIDDLE_PROOF_PROFILE_STATUSES: readonly ["passed", "product_regression", "proof_insufficient", "environment_blocked", "configuration_error", "needs_human_review"];
7
7
  declare const RIDDLE_PROOF_PROFILE_CHECK_TYPES: readonly ["route_loaded", "url_search_param_equals", "url_search_param_absent", "selector_visible", "selector_absent", "selector_count_at_least", "selector_count_equals", "selector_count_equal", "selector_count_eq", "selector_text_order", "frame_text_visible", "frame_url_equals", "frame_url_matches", "frame_no_horizontal_overflow", "text_visible", "text_absent", "route_inventory", "no_horizontal_overflow", "no_mobile_horizontal_overflow", "no_fatal_console_errors"];
8
- declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "press", "fill", "set_input_value", "assert_text_visible", "assert_text_absent", "assert_selector_count", "assert_window_value", "assert_window_number", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text", "window_call"];
8
+ declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "drag", "press", "fill", "set_input_value", "assert_text_visible", "assert_text_absent", "assert_selector_count", "assert_window_value", "assert_window_number", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text", "window_call"];
9
9
  type RiddleProofProfileStatus = typeof RIDDLE_PROOF_PROFILE_STATUSES[number];
10
10
  type RiddleProofProfileCheckType = typeof RIDDLE_PROOF_PROFILE_CHECK_TYPES[number];
11
11
  type RiddleProofProfileSetupActionType = typeof RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES[number];
@@ -23,6 +23,13 @@ interface RiddleProofProfileSetupAction {
23
23
  frame_selector?: string;
24
24
  frame_index?: number;
25
25
  force?: boolean;
26
+ coordinate_mode?: "pixels" | "ratio";
27
+ from_x?: number;
28
+ from_y?: number;
29
+ to_x?: number;
30
+ to_y?: number;
31
+ duration_ms?: number;
32
+ steps?: number;
26
33
  key?: string;
27
34
  value?: string;
28
35
  value_json?: JsonValue;
package/dist/profile.d.ts CHANGED
@@ -5,7 +5,7 @@ declare const RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION: "riddle-proof.profile-evide
5
5
  declare const RIDDLE_PROOF_PROFILE_RESULT_VERSION: "riddle-proof.profile-result.v1";
6
6
  declare const RIDDLE_PROOF_PROFILE_STATUSES: readonly ["passed", "product_regression", "proof_insufficient", "environment_blocked", "configuration_error", "needs_human_review"];
7
7
  declare const RIDDLE_PROOF_PROFILE_CHECK_TYPES: readonly ["route_loaded", "url_search_param_equals", "url_search_param_absent", "selector_visible", "selector_absent", "selector_count_at_least", "selector_count_equals", "selector_count_equal", "selector_count_eq", "selector_text_order", "frame_text_visible", "frame_url_equals", "frame_url_matches", "frame_no_horizontal_overflow", "text_visible", "text_absent", "route_inventory", "no_horizontal_overflow", "no_mobile_horizontal_overflow", "no_fatal_console_errors"];
8
- declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "press", "fill", "set_input_value", "assert_text_visible", "assert_text_absent", "assert_selector_count", "assert_window_value", "assert_window_number", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text", "window_call"];
8
+ declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "drag", "press", "fill", "set_input_value", "assert_text_visible", "assert_text_absent", "assert_selector_count", "assert_window_value", "assert_window_number", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text", "window_call"];
9
9
  type RiddleProofProfileStatus = typeof RIDDLE_PROOF_PROFILE_STATUSES[number];
10
10
  type RiddleProofProfileCheckType = typeof RIDDLE_PROOF_PROFILE_CHECK_TYPES[number];
11
11
  type RiddleProofProfileSetupActionType = typeof RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES[number];
@@ -23,6 +23,13 @@ interface RiddleProofProfileSetupAction {
23
23
  frame_selector?: string;
24
24
  frame_index?: number;
25
25
  force?: boolean;
26
+ coordinate_mode?: "pixels" | "ratio";
27
+ from_x?: number;
28
+ from_y?: number;
29
+ to_x?: number;
30
+ to_y?: number;
31
+ duration_ms?: number;
32
+ steps?: number;
26
33
  key?: string;
27
34
  value?: string;
28
35
  value_json?: JsonValue;
package/dist/profile.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  resolveRiddleProofProfileTimeoutSec,
20
20
  slugifyRiddleProofProfileName,
21
21
  summarizeRiddleProofProfileResult
22
- } from "./chunk-FLQ4HHTT.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.60",
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",