@riddledc/riddle-proof 0.7.29 → 0.7.31
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 +15 -7
- package/dist/{chunk-NUGGW7NX.js → chunk-2NWVXT4Q.js} +34 -10
- package/dist/cli.cjs +34 -10
- package/dist/cli.js +1 -1
- package/dist/index.cjs +34 -10
- package/dist/index.js +1 -1
- package/dist/profile.cjs +34 -10
- package/dist/profile.d.cts +2 -1
- package/dist/profile.d.ts +2 -1
- package/dist/profile.js +1 -1
- package/dist/proof-run-core.d.cts +1 -1
- package/dist/proof-run-core.d.ts +1 -1
- package/dist/proof-run-engine.d.cts +3 -3
- package/dist/proof-run-engine.d.ts +3 -3
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -122,6 +122,11 @@ or as a stronger proof base before a change loop.
|
|
|
122
122
|
}
|
|
123
123
|
],
|
|
124
124
|
"setup_actions": [
|
|
125
|
+
{
|
|
126
|
+
"type": "clear_storage",
|
|
127
|
+
"storage": "both",
|
|
128
|
+
"reload": true
|
|
129
|
+
},
|
|
125
130
|
{
|
|
126
131
|
"type": "local_storage",
|
|
127
132
|
"key": "demo-auth",
|
|
@@ -178,13 +183,16 @@ best-effort mocks.
|
|
|
178
183
|
`target.setup_actions` is optional. Use it when the meaningful proof surface
|
|
179
184
|
appears only after a picker, tab, login stub, storage seed, form fill,
|
|
180
185
|
transport control, or other bounded interaction. Supported setup actions are
|
|
181
|
-
`click`, `fill`, `set_input_value`, `local_storage`, `
|
|
182
|
-
`wait_for_selector`, and `wait_for_text`; a failed
|
|
183
|
-
a failed `setup_actions_succeeded` check so the
|
|
184
|
-
reaching the intended state. Text-matched `click`
|
|
185
|
-
matching elements, which keeps responsive layouts from
|
|
186
|
-
or mobile-only links. `local_storage`
|
|
187
|
-
|
|
186
|
+
`click`, `fill`, `set_input_value`, `local_storage`, `session_storage`,
|
|
187
|
+
`clear_storage`, `wait`, `wait_for_selector`, and `wait_for_text`; a failed
|
|
188
|
+
setup action is recorded as a failed `setup_actions_succeeded` check so the
|
|
189
|
+
profile cannot pass without reaching the intended state. Text-matched `click`
|
|
190
|
+
actions prefer visible matching elements, which keeps responsive layouts from
|
|
191
|
+
selecting hidden desktop or mobile-only links. `local_storage` and
|
|
192
|
+
`session_storage` accept a `key` plus string `value` or JSON `json` /
|
|
193
|
+
`value_json`, and can reload the page with `reload: true`. `clear_storage`
|
|
194
|
+
clears `local`, `session`, or `both` browser storage scopes, defaults to
|
|
195
|
+
`both`, and can also reload with `reload: true`.
|
|
188
196
|
|
|
189
197
|
`target.timeout_sec` is optional. Use it for known-heavy profile targets so the
|
|
190
198
|
profile carries its own hosted Riddle worker budget; an explicit CLI `--timeout`
|
|
@@ -25,6 +25,8 @@ var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
|
|
|
25
25
|
"fill",
|
|
26
26
|
"set_input_value",
|
|
27
27
|
"local_storage",
|
|
28
|
+
"session_storage",
|
|
29
|
+
"clear_storage",
|
|
28
30
|
"wait",
|
|
29
31
|
"wait_for_selector",
|
|
30
32
|
"wait_for_text"
|
|
@@ -176,12 +178,21 @@ function isSupportedCheckType(value) {
|
|
|
176
178
|
return RIDDLE_PROOF_PROFILE_CHECK_TYPES.includes(value);
|
|
177
179
|
}
|
|
178
180
|
function normalizeSetupActionType(value, index) {
|
|
179
|
-
const
|
|
181
|
+
const normalizedInput = String(value || "").trim().replace(/-/g, "_");
|
|
182
|
+
const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput;
|
|
180
183
|
if (RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.includes(normalized)) {
|
|
181
184
|
return normalized;
|
|
182
185
|
}
|
|
183
186
|
throw new Error(`target.setup_actions[${index}].type ${value || "(missing)"} is not supported. Supported actions: ${RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.join(", ")}`);
|
|
184
187
|
}
|
|
188
|
+
function normalizeSetupActionStorage(value, index) {
|
|
189
|
+
if (value === void 0 || value === null || value === "") return void 0;
|
|
190
|
+
const normalized = String(value).trim().replace(/-/g, "_");
|
|
191
|
+
if (normalized === "local" || normalized === "local_storage") return "local";
|
|
192
|
+
if (normalized === "session" || normalized === "session_storage") return "session";
|
|
193
|
+
if (normalized === "both" || normalized === "all") return "both";
|
|
194
|
+
throw new Error(`target.setup_actions[${index}].storage ${String(value)} is not supported. Supported storage values: local, session, both.`);
|
|
195
|
+
}
|
|
185
196
|
function normalizeSetupAction(input, index) {
|
|
186
197
|
if (!isRecord(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
|
|
187
198
|
const type = normalizeSetupActionType(stringValue(input.type), index);
|
|
@@ -198,11 +209,11 @@ function normalizeSetupAction(input, index) {
|
|
|
198
209
|
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
199
210
|
}
|
|
200
211
|
const key = stringValue(input.key);
|
|
201
|
-
if (type === "local_storage" && !key) {
|
|
202
|
-
throw new Error(`target.setup_actions[${index}]
|
|
212
|
+
if ((type === "local_storage" || type === "session_storage") && !key) {
|
|
213
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires key.`);
|
|
203
214
|
}
|
|
204
|
-
if (type === "local_storage" && value === void 0 && !hasJsonValue) {
|
|
205
|
-
throw new Error(`target.setup_actions[${index}]
|
|
215
|
+
if ((type === "local_storage" || type === "session_storage") && value === void 0 && !hasJsonValue) {
|
|
216
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
206
217
|
}
|
|
207
218
|
return {
|
|
208
219
|
type,
|
|
@@ -218,6 +229,7 @@ function normalizeSetupAction(input, index) {
|
|
|
218
229
|
timeout_ms: numberValue(input.timeout_ms) ?? numberValue(input.timeoutMs),
|
|
219
230
|
after_ms: numberValue(input.after_ms) ?? numberValue(input.afterMs),
|
|
220
231
|
reload: input.reload === true,
|
|
232
|
+
storage: normalizeSetupActionStorage(input.storage, index),
|
|
221
233
|
continue_on_failure: input.continue_on_failure === true || input.continueOnFailure === true
|
|
222
234
|
};
|
|
223
235
|
}
|
|
@@ -1214,16 +1226,28 @@ async function executeSetupAction(action, ordinal) {
|
|
|
1214
1226
|
await page.waitForSelector(action.selector, { state: "visible", timeout });
|
|
1215
1227
|
return { ...base, ok: true, timeout_ms: timeout };
|
|
1216
1228
|
}
|
|
1217
|
-
if (type === "local_storage") {
|
|
1229
|
+
if (type === "local_storage" || type === "session_storage") {
|
|
1218
1230
|
const value = setupActionValue(action);
|
|
1219
|
-
await page.evaluate(({ key, value }) => {
|
|
1220
|
-
window.localStorage
|
|
1221
|
-
|
|
1231
|
+
await page.evaluate(({ type, key, value }) => {
|
|
1232
|
+
const storage = type === "session_storage" ? window.sessionStorage : window.localStorage;
|
|
1233
|
+
storage.setItem(key, value);
|
|
1234
|
+
}, { type, key: action.key, value });
|
|
1222
1235
|
if (action.reload === true) {
|
|
1223
1236
|
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
1224
1237
|
}
|
|
1225
1238
|
return { ...base, ok: true, key: action.key, value_length: value.length, reload: action.reload === true };
|
|
1226
1239
|
}
|
|
1240
|
+
if (type === "clear_storage") {
|
|
1241
|
+
const storage = action.storage || "both";
|
|
1242
|
+
await page.evaluate(({ storage }) => {
|
|
1243
|
+
if (storage === "local" || storage === "both") window.localStorage.clear();
|
|
1244
|
+
if (storage === "session" || storage === "both") window.sessionStorage.clear();
|
|
1245
|
+
}, { storage });
|
|
1246
|
+
if (action.reload === true) {
|
|
1247
|
+
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
1248
|
+
}
|
|
1249
|
+
return { ...base, ok: true, storage, reload: action.reload === true };
|
|
1250
|
+
}
|
|
1227
1251
|
if (type === "click") {
|
|
1228
1252
|
const locator = page.locator(action.selector);
|
|
1229
1253
|
const count = await locator.count();
|
|
@@ -1253,7 +1277,7 @@ async function executeSetupAction(action, ordinal) {
|
|
|
1253
1277
|
if (targetIndex < 0) return { ...base, reason: "text_not_found", count };
|
|
1254
1278
|
}
|
|
1255
1279
|
if (targetIndex < 0 || targetIndex >= count) return { ...base, reason: "index_out_of_range", count, target_index: targetIndex };
|
|
1256
|
-
await locator.nth(targetIndex).click({ timeout });
|
|
1280
|
+
await locator.nth(targetIndex).click({ timeout, noWaitAfter: true });
|
|
1257
1281
|
return { ...base, ok: true, count, target_index: targetIndex, text: matchedText };
|
|
1258
1282
|
}
|
|
1259
1283
|
if (type === "fill" || type === "set_input_value") {
|
package/dist/cli.cjs
CHANGED
|
@@ -6898,6 +6898,8 @@ var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
|
|
|
6898
6898
|
"fill",
|
|
6899
6899
|
"set_input_value",
|
|
6900
6900
|
"local_storage",
|
|
6901
|
+
"session_storage",
|
|
6902
|
+
"clear_storage",
|
|
6901
6903
|
"wait",
|
|
6902
6904
|
"wait_for_selector",
|
|
6903
6905
|
"wait_for_text"
|
|
@@ -7049,12 +7051,21 @@ function isSupportedCheckType(value) {
|
|
|
7049
7051
|
return RIDDLE_PROOF_PROFILE_CHECK_TYPES.includes(value);
|
|
7050
7052
|
}
|
|
7051
7053
|
function normalizeSetupActionType(value, index) {
|
|
7052
|
-
const
|
|
7054
|
+
const normalizedInput = String(value || "").trim().replace(/-/g, "_");
|
|
7055
|
+
const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput;
|
|
7053
7056
|
if (RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.includes(normalized)) {
|
|
7054
7057
|
return normalized;
|
|
7055
7058
|
}
|
|
7056
7059
|
throw new Error(`target.setup_actions[${index}].type ${value || "(missing)"} is not supported. Supported actions: ${RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.join(", ")}`);
|
|
7057
7060
|
}
|
|
7061
|
+
function normalizeSetupActionStorage(value, index) {
|
|
7062
|
+
if (value === void 0 || value === null || value === "") return void 0;
|
|
7063
|
+
const normalized = String(value).trim().replace(/-/g, "_");
|
|
7064
|
+
if (normalized === "local" || normalized === "local_storage") return "local";
|
|
7065
|
+
if (normalized === "session" || normalized === "session_storage") return "session";
|
|
7066
|
+
if (normalized === "both" || normalized === "all") return "both";
|
|
7067
|
+
throw new Error(`target.setup_actions[${index}].storage ${String(value)} is not supported. Supported storage values: local, session, both.`);
|
|
7068
|
+
}
|
|
7058
7069
|
function normalizeSetupAction(input, index) {
|
|
7059
7070
|
if (!isRecord(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
|
|
7060
7071
|
const type = normalizeSetupActionType(stringValue2(input.type), index);
|
|
@@ -7071,11 +7082,11 @@ function normalizeSetupAction(input, index) {
|
|
|
7071
7082
|
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
7072
7083
|
}
|
|
7073
7084
|
const key = stringValue2(input.key);
|
|
7074
|
-
if (type === "local_storage" && !key) {
|
|
7075
|
-
throw new Error(`target.setup_actions[${index}]
|
|
7085
|
+
if ((type === "local_storage" || type === "session_storage") && !key) {
|
|
7086
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires key.`);
|
|
7076
7087
|
}
|
|
7077
|
-
if (type === "local_storage" && value === void 0 && !hasJsonValue) {
|
|
7078
|
-
throw new Error(`target.setup_actions[${index}]
|
|
7088
|
+
if ((type === "local_storage" || type === "session_storage") && value === void 0 && !hasJsonValue) {
|
|
7089
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
7079
7090
|
}
|
|
7080
7091
|
return {
|
|
7081
7092
|
type,
|
|
@@ -7091,6 +7102,7 @@ function normalizeSetupAction(input, index) {
|
|
|
7091
7102
|
timeout_ms: numberValue(input.timeout_ms) ?? numberValue(input.timeoutMs),
|
|
7092
7103
|
after_ms: numberValue(input.after_ms) ?? numberValue(input.afterMs),
|
|
7093
7104
|
reload: input.reload === true,
|
|
7105
|
+
storage: normalizeSetupActionStorage(input.storage, index),
|
|
7094
7106
|
continue_on_failure: input.continue_on_failure === true || input.continueOnFailure === true
|
|
7095
7107
|
};
|
|
7096
7108
|
}
|
|
@@ -8071,16 +8083,28 @@ async function executeSetupAction(action, ordinal) {
|
|
|
8071
8083
|
await page.waitForSelector(action.selector, { state: "visible", timeout });
|
|
8072
8084
|
return { ...base, ok: true, timeout_ms: timeout };
|
|
8073
8085
|
}
|
|
8074
|
-
if (type === "local_storage") {
|
|
8086
|
+
if (type === "local_storage" || type === "session_storage") {
|
|
8075
8087
|
const value = setupActionValue(action);
|
|
8076
|
-
await page.evaluate(({ key, value }) => {
|
|
8077
|
-
window.localStorage
|
|
8078
|
-
|
|
8088
|
+
await page.evaluate(({ type, key, value }) => {
|
|
8089
|
+
const storage = type === "session_storage" ? window.sessionStorage : window.localStorage;
|
|
8090
|
+
storage.setItem(key, value);
|
|
8091
|
+
}, { type, key: action.key, value });
|
|
8079
8092
|
if (action.reload === true) {
|
|
8080
8093
|
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
8081
8094
|
}
|
|
8082
8095
|
return { ...base, ok: true, key: action.key, value_length: value.length, reload: action.reload === true };
|
|
8083
8096
|
}
|
|
8097
|
+
if (type === "clear_storage") {
|
|
8098
|
+
const storage = action.storage || "both";
|
|
8099
|
+
await page.evaluate(({ storage }) => {
|
|
8100
|
+
if (storage === "local" || storage === "both") window.localStorage.clear();
|
|
8101
|
+
if (storage === "session" || storage === "both") window.sessionStorage.clear();
|
|
8102
|
+
}, { storage });
|
|
8103
|
+
if (action.reload === true) {
|
|
8104
|
+
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
8105
|
+
}
|
|
8106
|
+
return { ...base, ok: true, storage, reload: action.reload === true };
|
|
8107
|
+
}
|
|
8084
8108
|
if (type === "click") {
|
|
8085
8109
|
const locator = page.locator(action.selector);
|
|
8086
8110
|
const count = await locator.count();
|
|
@@ -8110,7 +8134,7 @@ async function executeSetupAction(action, ordinal) {
|
|
|
8110
8134
|
if (targetIndex < 0) return { ...base, reason: "text_not_found", count };
|
|
8111
8135
|
}
|
|
8112
8136
|
if (targetIndex < 0 || targetIndex >= count) return { ...base, reason: "index_out_of_range", count, target_index: targetIndex };
|
|
8113
|
-
await locator.nth(targetIndex).click({ timeout });
|
|
8137
|
+
await locator.nth(targetIndex).click({ timeout, noWaitAfter: true });
|
|
8114
8138
|
return { ...base, ok: true, count, target_index: targetIndex, text: matchedText };
|
|
8115
8139
|
}
|
|
8116
8140
|
if (type === "fill" || type === "set_input_value") {
|
package/dist/cli.js
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -8739,6 +8739,8 @@ var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
|
|
|
8739
8739
|
"fill",
|
|
8740
8740
|
"set_input_value",
|
|
8741
8741
|
"local_storage",
|
|
8742
|
+
"session_storage",
|
|
8743
|
+
"clear_storage",
|
|
8742
8744
|
"wait",
|
|
8743
8745
|
"wait_for_selector",
|
|
8744
8746
|
"wait_for_text"
|
|
@@ -8890,12 +8892,21 @@ function isSupportedCheckType(value) {
|
|
|
8890
8892
|
return RIDDLE_PROOF_PROFILE_CHECK_TYPES.includes(value);
|
|
8891
8893
|
}
|
|
8892
8894
|
function normalizeSetupActionType(value, index) {
|
|
8893
|
-
const
|
|
8895
|
+
const normalizedInput = String(value || "").trim().replace(/-/g, "_");
|
|
8896
|
+
const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput;
|
|
8894
8897
|
if (RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.includes(normalized)) {
|
|
8895
8898
|
return normalized;
|
|
8896
8899
|
}
|
|
8897
8900
|
throw new Error(`target.setup_actions[${index}].type ${value || "(missing)"} is not supported. Supported actions: ${RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.join(", ")}`);
|
|
8898
8901
|
}
|
|
8902
|
+
function normalizeSetupActionStorage(value, index) {
|
|
8903
|
+
if (value === void 0 || value === null || value === "") return void 0;
|
|
8904
|
+
const normalized = String(value).trim().replace(/-/g, "_");
|
|
8905
|
+
if (normalized === "local" || normalized === "local_storage") return "local";
|
|
8906
|
+
if (normalized === "session" || normalized === "session_storage") return "session";
|
|
8907
|
+
if (normalized === "both" || normalized === "all") return "both";
|
|
8908
|
+
throw new Error(`target.setup_actions[${index}].storage ${String(value)} is not supported. Supported storage values: local, session, both.`);
|
|
8909
|
+
}
|
|
8899
8910
|
function normalizeSetupAction(input, index) {
|
|
8900
8911
|
if (!isRecord2(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
|
|
8901
8912
|
const type = normalizeSetupActionType(stringValue5(input.type), index);
|
|
@@ -8912,11 +8923,11 @@ function normalizeSetupAction(input, index) {
|
|
|
8912
8923
|
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
8913
8924
|
}
|
|
8914
8925
|
const key = stringValue5(input.key);
|
|
8915
|
-
if (type === "local_storage" && !key) {
|
|
8916
|
-
throw new Error(`target.setup_actions[${index}]
|
|
8926
|
+
if ((type === "local_storage" || type === "session_storage") && !key) {
|
|
8927
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires key.`);
|
|
8917
8928
|
}
|
|
8918
|
-
if (type === "local_storage" && value === void 0 && !hasJsonValue) {
|
|
8919
|
-
throw new Error(`target.setup_actions[${index}]
|
|
8929
|
+
if ((type === "local_storage" || type === "session_storage") && value === void 0 && !hasJsonValue) {
|
|
8930
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
8920
8931
|
}
|
|
8921
8932
|
return {
|
|
8922
8933
|
type,
|
|
@@ -8932,6 +8943,7 @@ function normalizeSetupAction(input, index) {
|
|
|
8932
8943
|
timeout_ms: numberValue3(input.timeout_ms) ?? numberValue3(input.timeoutMs),
|
|
8933
8944
|
after_ms: numberValue3(input.after_ms) ?? numberValue3(input.afterMs),
|
|
8934
8945
|
reload: input.reload === true,
|
|
8946
|
+
storage: normalizeSetupActionStorage(input.storage, index),
|
|
8935
8947
|
continue_on_failure: input.continue_on_failure === true || input.continueOnFailure === true
|
|
8936
8948
|
};
|
|
8937
8949
|
}
|
|
@@ -9928,16 +9940,28 @@ async function executeSetupAction(action, ordinal) {
|
|
|
9928
9940
|
await page.waitForSelector(action.selector, { state: "visible", timeout });
|
|
9929
9941
|
return { ...base, ok: true, timeout_ms: timeout };
|
|
9930
9942
|
}
|
|
9931
|
-
if (type === "local_storage") {
|
|
9943
|
+
if (type === "local_storage" || type === "session_storage") {
|
|
9932
9944
|
const value = setupActionValue(action);
|
|
9933
|
-
await page.evaluate(({ key, value }) => {
|
|
9934
|
-
window.localStorage
|
|
9935
|
-
|
|
9945
|
+
await page.evaluate(({ type, key, value }) => {
|
|
9946
|
+
const storage = type === "session_storage" ? window.sessionStorage : window.localStorage;
|
|
9947
|
+
storage.setItem(key, value);
|
|
9948
|
+
}, { type, key: action.key, value });
|
|
9936
9949
|
if (action.reload === true) {
|
|
9937
9950
|
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
9938
9951
|
}
|
|
9939
9952
|
return { ...base, ok: true, key: action.key, value_length: value.length, reload: action.reload === true };
|
|
9940
9953
|
}
|
|
9954
|
+
if (type === "clear_storage") {
|
|
9955
|
+
const storage = action.storage || "both";
|
|
9956
|
+
await page.evaluate(({ storage }) => {
|
|
9957
|
+
if (storage === "local" || storage === "both") window.localStorage.clear();
|
|
9958
|
+
if (storage === "session" || storage === "both") window.sessionStorage.clear();
|
|
9959
|
+
}, { storage });
|
|
9960
|
+
if (action.reload === true) {
|
|
9961
|
+
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
9962
|
+
}
|
|
9963
|
+
return { ...base, ok: true, storage, reload: action.reload === true };
|
|
9964
|
+
}
|
|
9941
9965
|
if (type === "click") {
|
|
9942
9966
|
const locator = page.locator(action.selector);
|
|
9943
9967
|
const count = await locator.count();
|
|
@@ -9967,7 +9991,7 @@ async function executeSetupAction(action, ordinal) {
|
|
|
9967
9991
|
if (targetIndex < 0) return { ...base, reason: "text_not_found", count };
|
|
9968
9992
|
}
|
|
9969
9993
|
if (targetIndex < 0 || targetIndex >= count) return { ...base, reason: "index_out_of_range", count, target_index: targetIndex };
|
|
9970
|
-
await locator.nth(targetIndex).click({ timeout });
|
|
9994
|
+
await locator.nth(targetIndex).click({ timeout, noWaitAfter: true });
|
|
9971
9995
|
return { ...base, ok: true, count, target_index: targetIndex, text: matchedText };
|
|
9972
9996
|
}
|
|
9973
9997
|
if (type === "fill" || type === "set_input_value") {
|
package/dist/index.js
CHANGED
|
@@ -58,7 +58,7 @@ import {
|
|
|
58
58
|
resolveRiddleProofProfileTimeoutSec,
|
|
59
59
|
slugifyRiddleProofProfileName,
|
|
60
60
|
summarizeRiddleProofProfileResult
|
|
61
|
-
} from "./chunk-
|
|
61
|
+
} from "./chunk-2NWVXT4Q.js";
|
|
62
62
|
import {
|
|
63
63
|
DEFAULT_RIDDLE_API_BASE_URL,
|
|
64
64
|
DEFAULT_RIDDLE_API_KEY_FILE,
|
package/dist/profile.cjs
CHANGED
|
@@ -68,6 +68,8 @@ var RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES = [
|
|
|
68
68
|
"fill",
|
|
69
69
|
"set_input_value",
|
|
70
70
|
"local_storage",
|
|
71
|
+
"session_storage",
|
|
72
|
+
"clear_storage",
|
|
71
73
|
"wait",
|
|
72
74
|
"wait_for_selector",
|
|
73
75
|
"wait_for_text"
|
|
@@ -219,12 +221,21 @@ function isSupportedCheckType(value) {
|
|
|
219
221
|
return RIDDLE_PROOF_PROFILE_CHECK_TYPES.includes(value);
|
|
220
222
|
}
|
|
221
223
|
function normalizeSetupActionType(value, index) {
|
|
222
|
-
const
|
|
224
|
+
const normalizedInput = String(value || "").trim().replace(/-/g, "_");
|
|
225
|
+
const normalized = normalizedInput === "clear_browser_storage" ? "clear_storage" : normalizedInput;
|
|
223
226
|
if (RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.includes(normalized)) {
|
|
224
227
|
return normalized;
|
|
225
228
|
}
|
|
226
229
|
throw new Error(`target.setup_actions[${index}].type ${value || "(missing)"} is not supported. Supported actions: ${RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES.join(", ")}`);
|
|
227
230
|
}
|
|
231
|
+
function normalizeSetupActionStorage(value, index) {
|
|
232
|
+
if (value === void 0 || value === null || value === "") return void 0;
|
|
233
|
+
const normalized = String(value).trim().replace(/-/g, "_");
|
|
234
|
+
if (normalized === "local" || normalized === "local_storage") return "local";
|
|
235
|
+
if (normalized === "session" || normalized === "session_storage") return "session";
|
|
236
|
+
if (normalized === "both" || normalized === "all") return "both";
|
|
237
|
+
throw new Error(`target.setup_actions[${index}].storage ${String(value)} is not supported. Supported storage values: local, session, both.`);
|
|
238
|
+
}
|
|
228
239
|
function normalizeSetupAction(input, index) {
|
|
229
240
|
if (!isRecord(input)) throw new Error(`target.setup_actions[${index}] must be an object.`);
|
|
230
241
|
const type = normalizeSetupActionType(stringValue(input.type), index);
|
|
@@ -241,11 +252,11 @@ function normalizeSetupAction(input, index) {
|
|
|
241
252
|
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
242
253
|
}
|
|
243
254
|
const key = stringValue(input.key);
|
|
244
|
-
if (type === "local_storage" && !key) {
|
|
245
|
-
throw new Error(`target.setup_actions[${index}]
|
|
255
|
+
if ((type === "local_storage" || type === "session_storage") && !key) {
|
|
256
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires key.`);
|
|
246
257
|
}
|
|
247
|
-
if (type === "local_storage" && value === void 0 && !hasJsonValue) {
|
|
248
|
-
throw new Error(`target.setup_actions[${index}]
|
|
258
|
+
if ((type === "local_storage" || type === "session_storage") && value === void 0 && !hasJsonValue) {
|
|
259
|
+
throw new Error(`target.setup_actions[${index}] ${type} requires value.`);
|
|
249
260
|
}
|
|
250
261
|
return {
|
|
251
262
|
type,
|
|
@@ -261,6 +272,7 @@ function normalizeSetupAction(input, index) {
|
|
|
261
272
|
timeout_ms: numberValue(input.timeout_ms) ?? numberValue(input.timeoutMs),
|
|
262
273
|
after_ms: numberValue(input.after_ms) ?? numberValue(input.afterMs),
|
|
263
274
|
reload: input.reload === true,
|
|
275
|
+
storage: normalizeSetupActionStorage(input.storage, index),
|
|
264
276
|
continue_on_failure: input.continue_on_failure === true || input.continueOnFailure === true
|
|
265
277
|
};
|
|
266
278
|
}
|
|
@@ -1257,16 +1269,28 @@ async function executeSetupAction(action, ordinal) {
|
|
|
1257
1269
|
await page.waitForSelector(action.selector, { state: "visible", timeout });
|
|
1258
1270
|
return { ...base, ok: true, timeout_ms: timeout };
|
|
1259
1271
|
}
|
|
1260
|
-
if (type === "local_storage") {
|
|
1272
|
+
if (type === "local_storage" || type === "session_storage") {
|
|
1261
1273
|
const value = setupActionValue(action);
|
|
1262
|
-
await page.evaluate(({ key, value }) => {
|
|
1263
|
-
window.localStorage
|
|
1264
|
-
|
|
1274
|
+
await page.evaluate(({ type, key, value }) => {
|
|
1275
|
+
const storage = type === "session_storage" ? window.sessionStorage : window.localStorage;
|
|
1276
|
+
storage.setItem(key, value);
|
|
1277
|
+
}, { type, key: action.key, value });
|
|
1265
1278
|
if (action.reload === true) {
|
|
1266
1279
|
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
1267
1280
|
}
|
|
1268
1281
|
return { ...base, ok: true, key: action.key, value_length: value.length, reload: action.reload === true };
|
|
1269
1282
|
}
|
|
1283
|
+
if (type === "clear_storage") {
|
|
1284
|
+
const storage = action.storage || "both";
|
|
1285
|
+
await page.evaluate(({ storage }) => {
|
|
1286
|
+
if (storage === "local" || storage === "both") window.localStorage.clear();
|
|
1287
|
+
if (storage === "session" || storage === "both") window.sessionStorage.clear();
|
|
1288
|
+
}, { storage });
|
|
1289
|
+
if (action.reload === true) {
|
|
1290
|
+
await page.reload({ waitUntil: "domcontentloaded", timeout: 45000 });
|
|
1291
|
+
}
|
|
1292
|
+
return { ...base, ok: true, storage, reload: action.reload === true };
|
|
1293
|
+
}
|
|
1270
1294
|
if (type === "click") {
|
|
1271
1295
|
const locator = page.locator(action.selector);
|
|
1272
1296
|
const count = await locator.count();
|
|
@@ -1296,7 +1320,7 @@ async function executeSetupAction(action, ordinal) {
|
|
|
1296
1320
|
if (targetIndex < 0) return { ...base, reason: "text_not_found", count };
|
|
1297
1321
|
}
|
|
1298
1322
|
if (targetIndex < 0 || targetIndex >= count) return { ...base, reason: "index_out_of_range", count, target_index: targetIndex };
|
|
1299
|
-
await locator.nth(targetIndex).click({ timeout });
|
|
1323
|
+
await locator.nth(targetIndex).click({ timeout, noWaitAfter: true });
|
|
1300
1324
|
return { ...base, ok: true, count, target_index: targetIndex, text: matchedText };
|
|
1301
1325
|
}
|
|
1302
1326
|
if (type === "fill" || type === "set_input_value") {
|
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", "selector_visible", "selector_count_at_least", "text_visible", "text_absent", "no_horizontal_overflow", "no_mobile_horizontal_overflow", "no_fatal_console_errors"];
|
|
8
|
-
declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "fill", "set_input_value", "local_storage", "wait", "wait_for_selector", "wait_for_text"];
|
|
8
|
+
declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "fill", "set_input_value", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text"];
|
|
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];
|
|
@@ -31,6 +31,7 @@ interface RiddleProofProfileSetupAction {
|
|
|
31
31
|
timeout_ms?: number;
|
|
32
32
|
after_ms?: number;
|
|
33
33
|
reload?: boolean;
|
|
34
|
+
storage?: "local" | "session" | "both";
|
|
34
35
|
continue_on_failure?: boolean;
|
|
35
36
|
}
|
|
36
37
|
interface RiddleProofProfileNetworkMock {
|
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", "selector_visible", "selector_count_at_least", "text_visible", "text_absent", "no_horizontal_overflow", "no_mobile_horizontal_overflow", "no_fatal_console_errors"];
|
|
8
|
-
declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "fill", "set_input_value", "local_storage", "wait", "wait_for_selector", "wait_for_text"];
|
|
8
|
+
declare const RIDDLE_PROOF_PROFILE_SETUP_ACTION_TYPES: readonly ["click", "fill", "set_input_value", "local_storage", "session_storage", "clear_storage", "wait", "wait_for_selector", "wait_for_text"];
|
|
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];
|
|
@@ -31,6 +31,7 @@ interface RiddleProofProfileSetupAction {
|
|
|
31
31
|
timeout_ms?: number;
|
|
32
32
|
after_ms?: number;
|
|
33
33
|
reload?: boolean;
|
|
34
|
+
storage?: "local" | "session" | "both";
|
|
34
35
|
continue_on_failure?: boolean;
|
|
35
36
|
}
|
|
36
37
|
interface RiddleProofProfileNetworkMock {
|
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-2NWVXT4Q.js";
|
|
23
23
|
export {
|
|
24
24
|
RIDDLE_PROOF_PROFILE_CHECK_TYPES,
|
|
25
25
|
RIDDLE_PROOF_PROFILE_EVIDENCE_VERSION,
|
|
@@ -120,7 +120,7 @@ declare function buildSetupArgs(params: WorkflowParams, config: ReturnType<typeo
|
|
|
120
120
|
target_image_hash: string;
|
|
121
121
|
viewport_matrix_json: string;
|
|
122
122
|
deterministic_setup_json: string;
|
|
123
|
-
reference: "
|
|
123
|
+
reference: "before" | "prod" | "both";
|
|
124
124
|
base_branch: string;
|
|
125
125
|
before_ref: string;
|
|
126
126
|
allow_static_preview_fallback: string;
|
package/dist/proof-run-core.d.ts
CHANGED
|
@@ -120,7 +120,7 @@ declare function buildSetupArgs(params: WorkflowParams, config: ReturnType<typeo
|
|
|
120
120
|
target_image_hash: string;
|
|
121
121
|
viewport_matrix_json: string;
|
|
122
122
|
deterministic_setup_json: string;
|
|
123
|
-
reference: "
|
|
123
|
+
reference: "before" | "prod" | "both";
|
|
124
124
|
base_branch: string;
|
|
125
125
|
before_ref: string;
|
|
126
126
|
allow_static_preview_fallback: string;
|
|
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
292
292
|
blocking?: boolean;
|
|
293
293
|
details?: Record<string, unknown>;
|
|
294
294
|
ok: boolean;
|
|
295
|
-
action: "
|
|
295
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
296
296
|
state_path: string;
|
|
297
297
|
stage: any;
|
|
298
298
|
summary: string;
|
|
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
382
382
|
continueWithStage?: WorkflowStage | null;
|
|
383
383
|
blocking?: boolean;
|
|
384
384
|
details?: Record<string, unknown>;
|
|
385
|
-
action: "
|
|
385
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
386
386
|
state_path: string;
|
|
387
387
|
stage: any;
|
|
388
388
|
checkpoint: string;
|
|
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
659
659
|
error?: undefined;
|
|
660
660
|
} | {
|
|
661
661
|
ok: boolean;
|
|
662
|
-
action: "
|
|
662
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
663
663
|
state_path: string;
|
|
664
664
|
stage: any;
|
|
665
665
|
summary: string;
|
|
@@ -292,7 +292,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
292
292
|
blocking?: boolean;
|
|
293
293
|
details?: Record<string, unknown>;
|
|
294
294
|
ok: boolean;
|
|
295
|
-
action: "
|
|
295
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
296
296
|
state_path: string;
|
|
297
297
|
stage: any;
|
|
298
298
|
summary: string;
|
|
@@ -382,7 +382,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
382
382
|
continueWithStage?: WorkflowStage | null;
|
|
383
383
|
blocking?: boolean;
|
|
384
384
|
details?: Record<string, unknown>;
|
|
385
|
-
action: "
|
|
385
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
386
386
|
state_path: string;
|
|
387
387
|
stage: any;
|
|
388
388
|
checkpoint: string;
|
|
@@ -659,7 +659,7 @@ declare function executeWorkflow(params: WorkflowParams, pluginConfig: any, reso
|
|
|
659
659
|
error?: undefined;
|
|
660
660
|
} | {
|
|
661
661
|
ok: boolean;
|
|
662
|
-
action: "
|
|
662
|
+
action: "author" | "recon" | "ship" | "implement" | "verify" | "setup" | "run";
|
|
663
663
|
state_path: string;
|
|
664
664
|
stage: any;
|
|
665
665
|
summary: string;
|