@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/README.md +13 -1
- package/dist/{chunk-FLQ4HHTT.js → chunk-MIHU2AWC.js} +260 -2
- package/dist/cli.cjs +260 -2
- package/dist/cli.js +1 -1
- package/dist/index.cjs +260 -2
- package/dist/index.js +1 -1
- package/dist/profile.cjs +260 -2
- package/dist/profile.d.cts +8 -1
- package/dist/profile.d.ts +8 -1
- package/dist/profile.js +1 -1
- package/package.json +1 -1
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" };
|
package/dist/profile.d.cts
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.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-
|
|
22
|
+
} from "./chunk-MIHU2AWC.js";
|
|
23
23
|
export {
|
|
24
24
|
RIDDLE_PROOF_PROFILE_CHECK_TYPES,
|
|
25
25
|
RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
|