@riddledc/riddle-proof 0.7.45 → 0.7.46

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
@@ -224,11 +224,12 @@ success pair across multiple viewports. Repeated sequences also record
224
224
  `sequence_cycle: true` after the first cycle.
225
225
 
226
226
  Set `capture_request_body: true` to include compact request-body evidence on
227
- mock hits. Add `request_body_contains` or `request_body_patterns` when the
228
- request body is part of the contract, such as proving that a save request
229
- references the build ID returned by a prior mocked build response. Body
230
- assertions use the full request body for matching and store only length plus a
231
- compact sample in the proof evidence.
227
+ mock hits. Add `request_body_contains` / `request_body_patterns` or
228
+ `request_body_not_contains` / `request_body_not_patterns` when the request body
229
+ is part of the contract, such as proving that a save request references the
230
+ current build ID returned by a prior mocked build response and not a stale one.
231
+ Body assertions use the full request body for matching and store only length
232
+ plus a compact sample in the proof evidence.
232
233
 
233
234
  `target.setup_actions` is optional. Use it when the meaningful proof surface
234
235
  appears only after a picker, tab, login stub, storage seed, form fill,
@@ -262,6 +262,15 @@ function normalizeNetworkMock(input, index) {
262
262
  `target.network_mocks[${index}].request_body_patterns`
263
263
  );
264
264
  validateRegexPatterns(requestBodyPatterns, `target.network_mocks[${index}].request_body_patterns`);
265
+ const requestBodyNotContains = normalizeStringList(
266
+ input.request_body_not_contains ?? input.requestBodyNotContains ?? input.request_body_absent ?? input.requestBodyAbsent ?? input.body_not_contains ?? input.bodyNotContains ?? input.body_absent ?? input.bodyAbsent,
267
+ `target.network_mocks[${index}].request_body_not_contains`
268
+ );
269
+ const requestBodyNotPatterns = normalizeStringList(
270
+ input.request_body_not_patterns ?? input.requestBodyNotPatterns ?? input.request_body_forbidden_patterns ?? input.requestBodyForbiddenPatterns ?? input.body_not_patterns ?? input.bodyNotPatterns ?? input.body_forbidden_patterns ?? input.bodyForbiddenPatterns,
271
+ `target.network_mocks[${index}].request_body_not_patterns`
272
+ );
273
+ validateRegexPatterns(requestBodyNotPatterns, `target.network_mocks[${index}].request_body_not_patterns`);
265
274
  const requiredHitCount = numberValue(
266
275
  input.required_hit_count ?? input.requiredHitCount ?? input.required_hits ?? input.requiredHits ?? input.min_hits ?? input.minHits
267
276
  );
@@ -277,9 +286,11 @@ function normalizeNetworkMock(input, index) {
277
286
  repeat_responses: input.repeat_responses === true || input.repeatResponses === true || input.cycle_responses === true || input.cycleResponses === true,
278
287
  required_hit_count: requiredHitCount,
279
288
  required: input.required === false ? false : true,
280
- capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length),
289
+ capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length) || Boolean(requestBodyNotContains?.length) || Boolean(requestBodyNotPatterns?.length),
281
290
  request_body_contains: requestBodyContains,
282
- request_body_patterns: requestBodyPatterns
291
+ request_body_patterns: requestBodyPatterns,
292
+ request_body_not_contains: requestBodyNotContains,
293
+ request_body_not_patterns: requestBodyNotPatterns
283
294
  };
284
295
  }
285
296
  function normalizeNetworkMockResponsePayload(input, label, defaults = {}) {
@@ -1897,6 +1908,8 @@ function networkMockShouldCaptureRequestBody(mock) {
1897
1908
  mock.capture_request_body === true
1898
1909
  || networkMockStringList(mock.request_body_contains).length > 0
1899
1910
  || networkMockStringList(mock.request_body_patterns).length > 0
1911
+ || networkMockStringList(mock.request_body_not_contains).length > 0
1912
+ || networkMockStringList(mock.request_body_not_patterns).length > 0
1900
1913
  );
1901
1914
  }
1902
1915
  function networkMockRequestBodyFailures(body, mock) {
@@ -1928,6 +1941,31 @@ function networkMockRequestBodyFailures(body, mock) {
1928
1941
  });
1929
1942
  }
1930
1943
  }
1944
+ for (const forbidden of networkMockStringList(mock.request_body_not_contains)) {
1945
+ if (rawBody.includes(forbidden) || compactBody.includes(forbidden)) {
1946
+ failures.push({
1947
+ type: "request_body_forbidden_text",
1948
+ text: String(forbidden).slice(0, 200),
1949
+ });
1950
+ }
1951
+ }
1952
+ for (const pattern of networkMockStringList(mock.request_body_not_patterns)) {
1953
+ try {
1954
+ const regex = new RegExp(pattern);
1955
+ if (regex.test(rawBody) || regex.test(compactBody)) {
1956
+ failures.push({
1957
+ type: "request_body_forbidden_pattern_matched",
1958
+ pattern: String(pattern).slice(0, 200),
1959
+ });
1960
+ }
1961
+ } catch (error) {
1962
+ failures.push({
1963
+ type: "request_body_invalid_pattern",
1964
+ pattern: String(pattern).slice(0, 200),
1965
+ error: String(error && error.message ? error.message : error).slice(0, 500),
1966
+ });
1967
+ }
1968
+ }
1931
1969
  return failures;
1932
1970
  }
1933
1971
  async function setupLocatorVisible(locator, index) {
package/dist/cli.cjs CHANGED
@@ -7135,6 +7135,15 @@ function normalizeNetworkMock(input, index) {
7135
7135
  `target.network_mocks[${index}].request_body_patterns`
7136
7136
  );
7137
7137
  validateRegexPatterns(requestBodyPatterns, `target.network_mocks[${index}].request_body_patterns`);
7138
+ const requestBodyNotContains = normalizeStringList(
7139
+ input.request_body_not_contains ?? input.requestBodyNotContains ?? input.request_body_absent ?? input.requestBodyAbsent ?? input.body_not_contains ?? input.bodyNotContains ?? input.body_absent ?? input.bodyAbsent,
7140
+ `target.network_mocks[${index}].request_body_not_contains`
7141
+ );
7142
+ const requestBodyNotPatterns = normalizeStringList(
7143
+ input.request_body_not_patterns ?? input.requestBodyNotPatterns ?? input.request_body_forbidden_patterns ?? input.requestBodyForbiddenPatterns ?? input.body_not_patterns ?? input.bodyNotPatterns ?? input.body_forbidden_patterns ?? input.bodyForbiddenPatterns,
7144
+ `target.network_mocks[${index}].request_body_not_patterns`
7145
+ );
7146
+ validateRegexPatterns(requestBodyNotPatterns, `target.network_mocks[${index}].request_body_not_patterns`);
7138
7147
  const requiredHitCount = numberValue(
7139
7148
  input.required_hit_count ?? input.requiredHitCount ?? input.required_hits ?? input.requiredHits ?? input.min_hits ?? input.minHits
7140
7149
  );
@@ -7150,9 +7159,11 @@ function normalizeNetworkMock(input, index) {
7150
7159
  repeat_responses: input.repeat_responses === true || input.repeatResponses === true || input.cycle_responses === true || input.cycleResponses === true,
7151
7160
  required_hit_count: requiredHitCount,
7152
7161
  required: input.required === false ? false : true,
7153
- capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length),
7162
+ capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length) || Boolean(requestBodyNotContains?.length) || Boolean(requestBodyNotPatterns?.length),
7154
7163
  request_body_contains: requestBodyContains,
7155
- request_body_patterns: requestBodyPatterns
7164
+ request_body_patterns: requestBodyPatterns,
7165
+ request_body_not_contains: requestBodyNotContains,
7166
+ request_body_not_patterns: requestBodyNotPatterns
7156
7167
  };
7157
7168
  }
7158
7169
  function normalizeNetworkMockResponsePayload(input, label, defaults = {}) {
@@ -8754,6 +8765,8 @@ function networkMockShouldCaptureRequestBody(mock) {
8754
8765
  mock.capture_request_body === true
8755
8766
  || networkMockStringList(mock.request_body_contains).length > 0
8756
8767
  || networkMockStringList(mock.request_body_patterns).length > 0
8768
+ || networkMockStringList(mock.request_body_not_contains).length > 0
8769
+ || networkMockStringList(mock.request_body_not_patterns).length > 0
8757
8770
  );
8758
8771
  }
8759
8772
  function networkMockRequestBodyFailures(body, mock) {
@@ -8785,6 +8798,31 @@ function networkMockRequestBodyFailures(body, mock) {
8785
8798
  });
8786
8799
  }
8787
8800
  }
8801
+ for (const forbidden of networkMockStringList(mock.request_body_not_contains)) {
8802
+ if (rawBody.includes(forbidden) || compactBody.includes(forbidden)) {
8803
+ failures.push({
8804
+ type: "request_body_forbidden_text",
8805
+ text: String(forbidden).slice(0, 200),
8806
+ });
8807
+ }
8808
+ }
8809
+ for (const pattern of networkMockStringList(mock.request_body_not_patterns)) {
8810
+ try {
8811
+ const regex = new RegExp(pattern);
8812
+ if (regex.test(rawBody) || regex.test(compactBody)) {
8813
+ failures.push({
8814
+ type: "request_body_forbidden_pattern_matched",
8815
+ pattern: String(pattern).slice(0, 200),
8816
+ });
8817
+ }
8818
+ } catch (error) {
8819
+ failures.push({
8820
+ type: "request_body_invalid_pattern",
8821
+ pattern: String(pattern).slice(0, 200),
8822
+ error: String(error && error.message ? error.message : error).slice(0, 500),
8823
+ });
8824
+ }
8825
+ }
8788
8826
  return failures;
8789
8827
  }
8790
8828
  async function setupLocatorVisible(locator, index) {
package/dist/cli.js CHANGED
@@ -10,7 +10,7 @@ import {
10
10
  profileStatusExitCode,
11
11
  resolveRiddleProofProfileTargetUrl,
12
12
  resolveRiddleProofProfileTimeoutSec
13
- } from "./chunk-IJGMTTVP.js";
13
+ } from "./chunk-WSZ5AVKX.js";
14
14
  import {
15
15
  createRiddleApiClient,
16
16
  parseRiddleViewport
package/dist/index.cjs CHANGED
@@ -8976,6 +8976,15 @@ function normalizeNetworkMock(input, index) {
8976
8976
  `target.network_mocks[${index}].request_body_patterns`
8977
8977
  );
8978
8978
  validateRegexPatterns(requestBodyPatterns, `target.network_mocks[${index}].request_body_patterns`);
8979
+ const requestBodyNotContains = normalizeStringList(
8980
+ input.request_body_not_contains ?? input.requestBodyNotContains ?? input.request_body_absent ?? input.requestBodyAbsent ?? input.body_not_contains ?? input.bodyNotContains ?? input.body_absent ?? input.bodyAbsent,
8981
+ `target.network_mocks[${index}].request_body_not_contains`
8982
+ );
8983
+ const requestBodyNotPatterns = normalizeStringList(
8984
+ input.request_body_not_patterns ?? input.requestBodyNotPatterns ?? input.request_body_forbidden_patterns ?? input.requestBodyForbiddenPatterns ?? input.body_not_patterns ?? input.bodyNotPatterns ?? input.body_forbidden_patterns ?? input.bodyForbiddenPatterns,
8985
+ `target.network_mocks[${index}].request_body_not_patterns`
8986
+ );
8987
+ validateRegexPatterns(requestBodyNotPatterns, `target.network_mocks[${index}].request_body_not_patterns`);
8979
8988
  const requiredHitCount = numberValue3(
8980
8989
  input.required_hit_count ?? input.requiredHitCount ?? input.required_hits ?? input.requiredHits ?? input.min_hits ?? input.minHits
8981
8990
  );
@@ -8991,9 +9000,11 @@ function normalizeNetworkMock(input, index) {
8991
9000
  repeat_responses: input.repeat_responses === true || input.repeatResponses === true || input.cycle_responses === true || input.cycleResponses === true,
8992
9001
  required_hit_count: requiredHitCount,
8993
9002
  required: input.required === false ? false : true,
8994
- capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length),
9003
+ capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length) || Boolean(requestBodyNotContains?.length) || Boolean(requestBodyNotPatterns?.length),
8995
9004
  request_body_contains: requestBodyContains,
8996
- request_body_patterns: requestBodyPatterns
9005
+ request_body_patterns: requestBodyPatterns,
9006
+ request_body_not_contains: requestBodyNotContains,
9007
+ request_body_not_patterns: requestBodyNotPatterns
8997
9008
  };
8998
9009
  }
8999
9010
  function normalizeNetworkMockResponsePayload(input, label, defaults = {}) {
@@ -10611,6 +10622,8 @@ function networkMockShouldCaptureRequestBody(mock) {
10611
10622
  mock.capture_request_body === true
10612
10623
  || networkMockStringList(mock.request_body_contains).length > 0
10613
10624
  || networkMockStringList(mock.request_body_patterns).length > 0
10625
+ || networkMockStringList(mock.request_body_not_contains).length > 0
10626
+ || networkMockStringList(mock.request_body_not_patterns).length > 0
10614
10627
  );
10615
10628
  }
10616
10629
  function networkMockRequestBodyFailures(body, mock) {
@@ -10642,6 +10655,31 @@ function networkMockRequestBodyFailures(body, mock) {
10642
10655
  });
10643
10656
  }
10644
10657
  }
10658
+ for (const forbidden of networkMockStringList(mock.request_body_not_contains)) {
10659
+ if (rawBody.includes(forbidden) || compactBody.includes(forbidden)) {
10660
+ failures.push({
10661
+ type: "request_body_forbidden_text",
10662
+ text: String(forbidden).slice(0, 200),
10663
+ });
10664
+ }
10665
+ }
10666
+ for (const pattern of networkMockStringList(mock.request_body_not_patterns)) {
10667
+ try {
10668
+ const regex = new RegExp(pattern);
10669
+ if (regex.test(rawBody) || regex.test(compactBody)) {
10670
+ failures.push({
10671
+ type: "request_body_forbidden_pattern_matched",
10672
+ pattern: String(pattern).slice(0, 200),
10673
+ });
10674
+ }
10675
+ } catch (error) {
10676
+ failures.push({
10677
+ type: "request_body_invalid_pattern",
10678
+ pattern: String(pattern).slice(0, 200),
10679
+ error: String(error && error.message ? error.message : error).slice(0, 500),
10680
+ });
10681
+ }
10682
+ }
10645
10683
  return failures;
10646
10684
  }
10647
10685
  async function setupLocatorVisible(locator, index) {
package/dist/index.js CHANGED
@@ -58,7 +58,7 @@ import {
58
58
  resolveRiddleProofProfileTimeoutSec,
59
59
  slugifyRiddleProofProfileName,
60
60
  summarizeRiddleProofProfileResult
61
- } from "./chunk-IJGMTTVP.js";
61
+ } from "./chunk-WSZ5AVKX.js";
62
62
  import {
63
63
  DEFAULT_RIDDLE_API_BASE_URL,
64
64
  DEFAULT_RIDDLE_API_KEY_FILE,
package/dist/profile.cjs CHANGED
@@ -305,6 +305,15 @@ function normalizeNetworkMock(input, index) {
305
305
  `target.network_mocks[${index}].request_body_patterns`
306
306
  );
307
307
  validateRegexPatterns(requestBodyPatterns, `target.network_mocks[${index}].request_body_patterns`);
308
+ const requestBodyNotContains = normalizeStringList(
309
+ input.request_body_not_contains ?? input.requestBodyNotContains ?? input.request_body_absent ?? input.requestBodyAbsent ?? input.body_not_contains ?? input.bodyNotContains ?? input.body_absent ?? input.bodyAbsent,
310
+ `target.network_mocks[${index}].request_body_not_contains`
311
+ );
312
+ const requestBodyNotPatterns = normalizeStringList(
313
+ input.request_body_not_patterns ?? input.requestBodyNotPatterns ?? input.request_body_forbidden_patterns ?? input.requestBodyForbiddenPatterns ?? input.body_not_patterns ?? input.bodyNotPatterns ?? input.body_forbidden_patterns ?? input.bodyForbiddenPatterns,
314
+ `target.network_mocks[${index}].request_body_not_patterns`
315
+ );
316
+ validateRegexPatterns(requestBodyNotPatterns, `target.network_mocks[${index}].request_body_not_patterns`);
308
317
  const requiredHitCount = numberValue(
309
318
  input.required_hit_count ?? input.requiredHitCount ?? input.required_hits ?? input.requiredHits ?? input.min_hits ?? input.minHits
310
319
  );
@@ -320,9 +329,11 @@ function normalizeNetworkMock(input, index) {
320
329
  repeat_responses: input.repeat_responses === true || input.repeatResponses === true || input.cycle_responses === true || input.cycleResponses === true,
321
330
  required_hit_count: requiredHitCount,
322
331
  required: input.required === false ? false : true,
323
- capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length),
332
+ capture_request_body: input.capture_request_body === true || input.captureRequestBody === true || Boolean(requestBodyContains?.length) || Boolean(requestBodyPatterns?.length) || Boolean(requestBodyNotContains?.length) || Boolean(requestBodyNotPatterns?.length),
324
333
  request_body_contains: requestBodyContains,
325
- request_body_patterns: requestBodyPatterns
334
+ request_body_patterns: requestBodyPatterns,
335
+ request_body_not_contains: requestBodyNotContains,
336
+ request_body_not_patterns: requestBodyNotPatterns
326
337
  };
327
338
  }
328
339
  function normalizeNetworkMockResponsePayload(input, label, defaults = {}) {
@@ -1940,6 +1951,8 @@ function networkMockShouldCaptureRequestBody(mock) {
1940
1951
  mock.capture_request_body === true
1941
1952
  || networkMockStringList(mock.request_body_contains).length > 0
1942
1953
  || networkMockStringList(mock.request_body_patterns).length > 0
1954
+ || networkMockStringList(mock.request_body_not_contains).length > 0
1955
+ || networkMockStringList(mock.request_body_not_patterns).length > 0
1943
1956
  );
1944
1957
  }
1945
1958
  function networkMockRequestBodyFailures(body, mock) {
@@ -1971,6 +1984,31 @@ function networkMockRequestBodyFailures(body, mock) {
1971
1984
  });
1972
1985
  }
1973
1986
  }
1987
+ for (const forbidden of networkMockStringList(mock.request_body_not_contains)) {
1988
+ if (rawBody.includes(forbidden) || compactBody.includes(forbidden)) {
1989
+ failures.push({
1990
+ type: "request_body_forbidden_text",
1991
+ text: String(forbidden).slice(0, 200),
1992
+ });
1993
+ }
1994
+ }
1995
+ for (const pattern of networkMockStringList(mock.request_body_not_patterns)) {
1996
+ try {
1997
+ const regex = new RegExp(pattern);
1998
+ if (regex.test(rawBody) || regex.test(compactBody)) {
1999
+ failures.push({
2000
+ type: "request_body_forbidden_pattern_matched",
2001
+ pattern: String(pattern).slice(0, 200),
2002
+ });
2003
+ }
2004
+ } catch (error) {
2005
+ failures.push({
2006
+ type: "request_body_invalid_pattern",
2007
+ pattern: String(pattern).slice(0, 200),
2008
+ error: String(error && error.message ? error.message : error).slice(0, 500),
2009
+ });
2010
+ }
2011
+ }
1974
2012
  return failures;
1975
2013
  }
1976
2014
  async function setupLocatorVisible(locator, index) {
@@ -53,6 +53,8 @@ interface RiddleProofProfileNetworkMock extends RiddleProofProfileNetworkMockRes
53
53
  capture_request_body?: boolean;
54
54
  request_body_contains?: string[];
55
55
  request_body_patterns?: string[];
56
+ request_body_not_contains?: string[];
57
+ request_body_not_patterns?: string[];
56
58
  }
57
59
  interface RiddleProofProfileRouteInventoryRoute {
58
60
  name?: string;
package/dist/profile.d.ts CHANGED
@@ -53,6 +53,8 @@ interface RiddleProofProfileNetworkMock extends RiddleProofProfileNetworkMockRes
53
53
  capture_request_body?: boolean;
54
54
  request_body_contains?: string[];
55
55
  request_body_patterns?: string[];
56
+ request_body_not_contains?: string[];
57
+ request_body_not_patterns?: string[];
56
58
  }
57
59
  interface RiddleProofProfileRouteInventoryRoute {
58
60
  name?: string;
package/dist/profile.js CHANGED
@@ -19,7 +19,7 @@ import {
19
19
  resolveRiddleProofProfileTimeoutSec,
20
20
  slugifyRiddleProofProfileName,
21
21
  summarizeRiddleProofProfileResult
22
- } from "./chunk-IJGMTTVP.js";
22
+ } from "./chunk-WSZ5AVKX.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.45",
3
+ "version": "0.7.46",
4
4
  "description": "Reusable Riddle Proof contracts and helpers for evidence-backed agent changes.",
5
5
  "license": "MIT",
6
6
  "author": "RiddleDC",