noresponse 9.4.3 → 9.5.0

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.
Files changed (41) hide show
  1. checksums.yaml +4 -4
  2. data/lib/no_response/accounts.rb +2 -2
  3. data/lib/no_response/assessments.rb +1 -1
  4. data/lib/no_response/models/shared/accountdirectorypage.rb +1 -1
  5. data/lib/no_response/models/shared/accountdirectorypageitem.rb +28 -2
  6. data/lib/no_response/models/shared/accountdirectorypageitem.rbi +12 -0
  7. data/lib/no_response/models/shared/accountdirectorysearchrequest.rb +29 -3
  8. data/lib/no_response/models/shared/accountdirectorysearchrequest.rbi +12 -0
  9. data/lib/no_response/models/shared/assessmentsearchitem.rb +30 -2
  10. data/lib/no_response/models/shared/assessmentsearchitem.rbi +12 -0
  11. data/lib/no_response/models/shared/assessmentsearchrequest.rb +22 -2
  12. data/lib/no_response/models/shared/assessmentsearchrequest.rbi +12 -0
  13. data/lib/no_response/models/shared/identifierexpression.rb +47 -0
  14. data/lib/no_response/models/shared/identifierexpression.rbi +20 -0
  15. data/lib/no_response/models/shared/identifierexpressionleaf.rb +33 -0
  16. data/lib/no_response/models/shared/identifierexpressionleaf.rbi +14 -0
  17. data/lib/no_response/models/shared/identifierexpressionnode.rb +56 -0
  18. data/lib/no_response/models/shared/identifierexpressionnode.rbi +26 -0
  19. data/lib/no_response/models/shared/identifierexpressionnodelevelone.rb +56 -0
  20. data/lib/no_response/models/shared/identifierexpressionnodelevelone.rbi +26 -0
  21. data/lib/no_response/models/shared/identifierexpressionnodeleveltwo.rb +56 -0
  22. data/lib/no_response/models/shared/identifierexpressionnodeleveltwo.rbi +26 -0
  23. data/lib/no_response/models/shared/identifiermatch.rb +105 -0
  24. data/lib/no_response/models/shared/identifiermatch.rbi +44 -0
  25. data/lib/no_response/models/shared/identifiersearch.rb +80 -0
  26. data/lib/no_response/models/shared/identifiersearch.rbi +32 -0
  27. data/lib/no_response/models/shared/identifiersearchkind.rb +20 -0
  28. data/lib/no_response/models/shared/identifiersearchkind.rbi +9 -0
  29. data/lib/no_response/models/shared/identifiertermmatch.rb +114 -0
  30. data/lib/no_response/models/shared/identifiertermmatch.rbi +50 -0
  31. data/lib/no_response/models/shared/match.rb +20 -0
  32. data/lib/no_response/models/shared/match.rbi +9 -0
  33. data/lib/no_response/models/shared/namespace.rb +18 -0
  34. data/lib/no_response/models/shared/namespace.rbi +9 -0
  35. data/lib/no_response/models/shared/provenance.rb +18 -0
  36. data/lib/no_response/models/shared/provenance.rbi +9 -0
  37. data/lib/no_response/models/shared/scope_enum.rb +16 -0
  38. data/lib/no_response/models/shared/scope_enum.rbi +9 -0
  39. data/lib/no_response/models/shared.rb +13 -0
  40. data/lib/no_response/sdkconfiguration.rb +2 -2
  41. metadata +28 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe33f5bf446bdd36a4ee4412902954c6e8f69bb203b473e98423876999d1a235
4
- data.tar.gz: 34d006f020e0536900aa81902d4cf94618030dea8ddfe9842ce917a3c7eb99fa
3
+ metadata.gz: dee6db86ec0159a05801626c6a8a7817f091faaf8ac218d266fca90cabf120cb
4
+ data.tar.gz: '08b0d9a30de21089e9a8db966468cea17ff338d94bcad984e812030a37c57596'
5
5
  SHA512:
6
- metadata.gz: d5f04b4449dee4dbae66ea755129e42001e798522193a8afd6979e36f449ce0427ac2a88ff97a2dbfaa3454906cf93e29c55ce62da51d6ca99441ca1a1c550d0
7
- data.tar.gz: fa5837edbfd7e739acfe985e0fb7a58d2f8feb4be3b94e14aae7d66fe2bf67eee927e6ed978b1d80f658494e9d6386d34afa4e96d3644016fb70bbfd82d8d931
6
+ metadata.gz: 65cf361ea2a5de4661255601bb382ab2d2f5e140cd3fbd8db249573ac5afd68c46f4cfe43342720c92466102a6661c02e34a0922e0b9284c410330506297aaf5
7
+ data.tar.gz: 37595ccb0e4e33c794a04589f82baaaab47984cd74ab0e7ce50e3bbd696ece2c0d1ccc890a954fd8b5aa331ebe97bb819ac8bfa294ae1cf6c8238811b85e584b
@@ -4277,8 +4277,8 @@ module NoResponse
4277
4277
  .returns(Models::Operations::SearchAccountsResponse)
4278
4278
  }
4279
4279
  def search(request:, retries: nil, timeout_ms: nil, http_headers: nil)
4280
- # search - Search distinct accounts by email or account ID
4281
- # Search distinct accounts observed in retained assessments in this environment. Match an exact account_id or canonical email; an email matches any retained assessment belonging to the account. Set needs_action to select accounts with an open or in-progress retained review, or a current review/block decision without an effective retained outcome. This filter applies before pagination and counting, adds waiting_for reasons to each row and requires management scope as well as history or investigate access. The response contains one row per account with its newest retained assessment, current decision when available, per-account assessment count, and total distinct-account count. Send next_cursor with unchanged filters to continue. Totals are exact below 10000 and capped at 10000. Results are live across pages. Requires history access and identifier access for email. Read-only and safe to retry.
4280
+ # search - Search distinct accounts by submitted identifier or account ID
4281
+ # Search distinct accounts observed in retained assessments in this environment. identifier matches an exact, canonical or explicitly selected mailbox form of a submitted email, phone or customer-namespace username. It matches historical retained inputs and returns matched_identifier with the original value and matching assessment. Each row has its newest retained assessment, current account decision when available, retained assessment count, and total distinct-account count. identifier and legacy email are mutually exclusive; account_id and needs_action combine with either using AND. Set needs_action to select accounts with a retained open or in-progress review, or a current review/block account decision without an effective retained account outcome. This filter applies before counting and pagination and adds waiting_for reasons. Current decisions include account list overrides and shared-key scoring and preserve admission holds. Typed identifier search uses stable opaque account order; ordinary and legacy email searches retain newest-seen order. Results are live across pages; each page's items and total share a database snapshot, while current account risk is read separately. Cursors are expiring and bound to scope, operation and filters. Totals are exact below 10000 and capped at 10000. Requires history or investigate authority and identifier-read permission for identifier, identifier_expression or email filtering. needs_action additionally requires management scope. Source-discovered associations are not searched and equality is not verified ownership. identifier_expression combines submitted terms with bounded AND/OR, at most 8 raw terms and 3 group levels. Each node selects exactly one of term, and, or. Groups have 2 to 8 operands. Duplicate normalized terms are idempotent and still count toward the limit. identifier_expression, identifier and email are mutually exclusive. Expression results use matched_identifiers with original submitted witnesses and zero-based depth-first term_index. All satisfied unique terms are returned in first-occurrence order. Cursors bind scope, ordered structure, original values, matching modes and all other filters; changing only page limit is allowed. Required expression scope assessment evaluates the whole expression in one retained submission; scope account allows different retained submissions of the same account to satisfy different terms. Both use stable opaque account ordering and distinct-account counting before pagination.
4282
4282
  url, params = @sdk_configuration.get_server_details
4283
4283
  base_url = Utils.template_url(url, params)
4284
4284
  url = "#{base_url}/v1/accounts/search"
@@ -1841,7 +1841,7 @@ module NoResponse
1841
1841
  }
1842
1842
  def search(request:, retries: nil, timeout_ms: nil, http_headers: nil)
1843
1843
  # search - Search assessments across this environment
1844
- # Search retained assessments created in [from,to), over at most 366 days. Filters use each assessment decision, rather than the current account decision. Results can change between pages. Keep the assessment version to retrieve the exact decision later. Each item's detail.identifiers holds the identifiers its assessment was sent, exactly as received, and first_decision holds the decision of its first answer. email finds every assessment of the accounts that sent a mailbox, matched as lists match it. changed keeps the assessments a later revision changed. total counts every match, exactly up to 10000. This read does not require an idempotency key.
1844
+ # Search retained assessments created in [from,to), at most 366 days. identifier directly matches that assessment's submitted email, phone or customer-namespace username using exact, canonical or explicitly selected email mailbox matching. matched_identifier explains the original value and match basis. Legacy email keeps its account-wide mailbox semantics and cannot be combined with identifier. Other filters combine using AND and describe assessment decisions, separate from current account decisions. Each item carries the original submitted identifiers and its first_decision when available. Newest-created order has an assessment-ID tie break. Results are live across pages; each page's total and items use one database snapshot. Totals are exact below 10000 and capped at 10000. Requires history or investigate authority and identifier-read permission for identifier, identifier_expression or email filters; detailed mode also requires detailed permission. No Idempotency-Key. identifier_expression combines submitted terms with bounded AND/OR, at most 8 raw terms and 3 group levels. Each node selects exactly one of term, and, or. Groups have 2 to 8 operands. Duplicate normalized terms are idempotent and still count toward the limit. identifier_expression, identifier and email are mutually exclusive. Expression results use matched_identifiers with original submitted witnesses and zero-based depth-first term_index. All satisfied unique terms are returned in first-occurrence order. Cursors bind scope, ordered structure, original values, matching modes and all other filters; changing only page limit is allowed. Expression scope must be assessment: each returned assessment itself satisfies the complete expression. Scope account is rejected with 400 invalid_request; use account search for historical combinations.
1845
1845
  url, params = @sdk_configuration.get_server_details
1846
1846
  base_url = Utils.template_url(url, params)
1847
1847
  url = "#{base_url}/v1/assessments/search"
@@ -4,7 +4,7 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Accounts observed in retained assessments, newest seen first, with each account once per page and across pages. Counts and keyset pagination are computed over distinct accounts in one database snapshot per page. Live data can change between pages.
7
+ # Distinct observed accounts with retained assessments. Typed identifier searches use stable opaque account order, independent of newly submitted assessments; ordinary and legacy email searches use newest-seen order. One repeatable-read database snapshot supplies each page's rows and totals. Pages do not share a snapshot: new matching accounts may appear on a later page or before the cursor and be missed until a fresh search; retention, erasure and changed membership can remove results. Current account decisions are read separately and may advance during a page. Cursors bind the workspace/environment, operation and filters, expire, and cannot cross scopes. Erasure and retention always take precedence over pagination.
8
8
  class AccountDirectoryPage
9
9
  extend T::Sig
10
10
  include Crystalline::MetadataFields
@@ -39,6 +39,18 @@ module NoResponse
39
39
  Crystalline::Nilable.new(Models::Shared::Account),
40
40
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("current")}}
41
41
  )
42
+ # Why this result matched a typed identifier search. value is the original value submitted in assessment_id. Provenance records a customer submission, not a source discovery or verified ownership. Equality is deterministic and has no inferred confidence score. An account result names its newest retained matching assessment, which can differ from latest.
43
+ field(
44
+ :matched_identifier,
45
+ Crystalline::Nilable.new(Models::Shared::IdentifierMatch),
46
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("matched_identifier")}}
47
+ )
48
+ # Present only for identifier_expression. All satisfied unique terms, ordered by term_index, with original submitted values and retained assessment witnesses. A duplicate normalized term appears once at its first raw leaf index. The legacy single identifier filter instead returns matched_identifier.
49
+ field(
50
+ :matched_identifiers,
51
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::IdentifierTermMatch)),
52
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("matched_identifiers")}}
53
+ )
42
54
 
43
55
  sig {
44
56
  params(
@@ -46,16 +58,28 @@ module NoResponse
46
58
  latest: Models::Shared::AssessmentRevision,
47
59
  assessments: ::Integer,
48
60
  waiting_for: T.nilable(T::Array[Models::Shared::WaitingFor]),
49
- current: T.nilable(Models::Shared::Account)
61
+ current: T.nilable(Models::Shared::Account),
62
+ matched_identifier: T.nilable(Models::Shared::IdentifierMatch),
63
+ matched_identifiers: T.nilable(T::Array[Models::Shared::IdentifierTermMatch])
50
64
  )
51
65
  .void
52
66
  }
53
- def initialize(account_id:, latest:, assessments:, waiting_for: nil, current: nil)
67
+ def initialize(
68
+ account_id:,
69
+ latest:,
70
+ assessments:,
71
+ waiting_for: nil,
72
+ current: nil,
73
+ matched_identifier: nil,
74
+ matched_identifiers: nil
75
+ )
54
76
  @account_id = account_id
55
77
  @latest = latest
56
78
  @assessments = assessments
57
79
  @waiting_for = waiting_for
58
80
  @current = current
81
+ @matched_identifier = matched_identifier
82
+ @matched_identifiers = matched_identifiers
59
83
  end
60
84
 
61
85
  sig { params(other: T.untyped).returns(T::Boolean) }
@@ -66,6 +90,8 @@ module NoResponse
66
90
  return false unless @assessments == other.assessments
67
91
  return false unless @waiting_for == other.waiting_for
68
92
  return false unless @current == other.current
93
+ return false unless @matched_identifier == other.matched_identifier
94
+ return false unless @matched_identifiers == other.matched_identifiers
69
95
  true
70
96
  end
71
97
  end
@@ -35,4 +35,16 @@ class NoResponse::Models::Shared::AccountDirectoryPageItem
35
35
 
36
36
  def current=(str_)
37
37
  end
38
+
39
+ def matched_identifier
40
+ end
41
+
42
+ def matched_identifier=(str_)
43
+ end
44
+
45
+ def matched_identifiers
46
+ end
47
+
48
+ def matched_identifiers=(str_)
49
+ end
38
50
  end
@@ -4,7 +4,7 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Bounded distinct-account search for a single authenticated workspace/environment. Email matches any retained admitted assessment of an account, using assessment search's canonical mailbox rules. No assessment history download is required.
7
+ # Bounded distinct-account search for one authenticated workspace/environment. identifier matches any retained admitted assessment of an account, including historical submitted values. email preserves the legacy canonical-mailbox filter. identifier and email cannot be combined. All other filters combine using AND. Typed identifier search uses stable opaque account order; ordinary and legacy email searches retain newest-seen ordering. Pages are live, not a cross-page snapshot. Requires history or investigate authority and identifier-read permission for identifier, identifier_expression or email filtering. identifier_expression explicitly chooses scope assessment (one whole matching submission) or account (terms may match different retained submissions of one account). At most 8 raw terms and 3 group levels. Mutually exclusive with identifier and email. Expression search uses the same stable opaque account order as typed identifier search.
8
8
  class AccountDirectorySearchRequest
9
9
  extend T::Sig
10
10
  include Crystalline::MetadataFields
@@ -21,12 +21,24 @@ module NoResponse
21
21
  Crystalline::Nilable.new(::String),
22
22
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("email")}}
23
23
  )
24
- # Opaque, expiring cursor bound to this environment, operation and every filter. Keep the filters unchanged.
24
+ # Opaque, expiring cursor bound to workspace, environment, operation and all filters, including expression scope, ordered structure and original term values. Keep grouping, operand order, matching modes and values unchanged; an omitted match is equivalent to exact. The page limit may change.
25
25
  field(
26
26
  :cursor,
27
27
  Crystalline::Nilable.new(::String),
28
28
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("cursor")}}
29
29
  )
30
+ # One customer-submitted identifier. Defaults to exact comparison of the original submitted value. canonical uses the supported identifier normalisation without an ownership claim: email preserves local-part case, NFC-normalises it and lowercases the domain without removing dots or tags; phone uses international E.164 without extensions or an inferred region; username uses NFC and Unicode case folding within the customer namespace. mailbox is email-only and explicitly selects existing list rules: case-insensitive, remove +tag, and ignore local-part dots at gmail.com and googlemail.com; googlemail.com maps to gmail.com. Username requires namespace customer. Email and phone forbid namespace. Source-discovered identifiers and platform handles are not searched. Unsupported kinds, namespaces, modes and invalid values return 400. Search equality does not establish verified ownership or merge accounts.
31
+ field(
32
+ :identifier,
33
+ Crystalline::Nilable.new(Models::Shared::IdentifierSearch),
34
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifier")}}
35
+ )
36
+ # A bounded AND/OR expression over submitted identifiers. Required scope assessment means the entire expression must match one retained assessment. Scope account permits each term to match a different retained assessment of the same account and is accepted only by account search. Exactly one of term, and or or is allowed at every node. Groups contain 2 to 8 operands, with at most 3 nested group levels and 8 raw term occurrences over the entire expression. A root term is allowed. Duplicate terms with the same kind, match rule, namespace and normalized comparison are idempotent, but count toward the raw limit. Match rules default to exact and preserve the existing identifier contract. Only retained submitted identifiers can satisfy a term. Unknown fields, unsupported scopes and malformed or oversized expressions return 400 invalid_request.
37
+ field(
38
+ :identifier_expression,
39
+ Crystalline::Nilable.new(Models::Shared::IdentifierExpression),
40
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifier_expression")}}
41
+ )
30
42
  # Select accounts with a retained open or in-progress review, or a current review/block account decision with no retained effective account outcome. The server applies this filter before counting and pagination. Requires reviews.read as well as history.read for console members; API keys additionally require management.
31
43
  field(
32
44
  :needs_action,
@@ -45,15 +57,27 @@ module NoResponse
45
57
  account_id: T.nilable(::String),
46
58
  email: T.nilable(::String),
47
59
  cursor: T.nilable(::String),
60
+ identifier: T.nilable(Models::Shared::IdentifierSearch),
61
+ identifier_expression: T.nilable(Models::Shared::IdentifierExpression),
48
62
  needs_action: T.nilable(T::Boolean),
49
63
  limit: T.nilable(::Integer)
50
64
  )
51
65
  .void
52
66
  }
53
- def initialize(account_id: nil, email: nil, cursor: nil, needs_action: false, limit: 25)
67
+ def initialize(
68
+ account_id: nil,
69
+ email: nil,
70
+ cursor: nil,
71
+ identifier: nil,
72
+ identifier_expression: nil,
73
+ needs_action: false,
74
+ limit: 25
75
+ )
54
76
  @account_id = account_id
55
77
  @email = email
56
78
  @cursor = cursor
79
+ @identifier = identifier
80
+ @identifier_expression = identifier_expression
57
81
  @needs_action = needs_action
58
82
  @limit = limit
59
83
  end
@@ -64,6 +88,8 @@ module NoResponse
64
88
  return false unless @account_id == other.account_id
65
89
  return false unless @email == other.email
66
90
  return false unless @cursor == other.cursor
91
+ return false unless @identifier == other.identifier
92
+ return false unless @identifier_expression == other.identifier_expression
67
93
  return false unless @needs_action == other.needs_action
68
94
  return false unless @limit == other.limit
69
95
  true
@@ -24,6 +24,18 @@ class NoResponse::Models::Shared::AccountDirectorySearchRequest
24
24
  def cursor=(str_)
25
25
  end
26
26
 
27
+ def identifier
28
+ end
29
+
30
+ def identifier=(str_)
31
+ end
32
+
33
+ def identifier_expression
34
+ end
35
+
36
+ def identifier_expression=(str_)
37
+ end
38
+
27
39
  def needs_action
28
40
  end
29
41
 
@@ -70,6 +70,18 @@ module NoResponse
70
70
  }
71
71
  }
72
72
  )
73
+ # Why this result matched a typed identifier search. value is the original value submitted in assessment_id. Provenance records a customer submission, not a source discovery or verified ownership. Equality is deterministic and has no inferred confidence score. An account result names its newest retained matching assessment, which can differ from latest.
74
+ field(
75
+ :matched_identifier,
76
+ Crystalline::Nilable.new(Models::Shared::IdentifierMatch),
77
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("matched_identifier")}}
78
+ )
79
+ # Present only for identifier_expression. All satisfied unique terms, ordered by term_index, with original submitted values and retained assessment witnesses. A duplicate normalized term appears once at its first raw leaf index. The legacy single identifier filter instead returns matched_identifier.
80
+ field(
81
+ :matched_identifiers,
82
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::IdentifierTermMatch)),
83
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("matched_identifiers")}}
84
+ )
73
85
 
74
86
  sig {
75
87
  params(
@@ -79,11 +91,23 @@ module NoResponse
79
91
  depth: Models::Shared::Depth,
80
92
  detail: Models::Shared::AssessmentDetail,
81
93
  schema_version: ::String,
82
- first_decision: T.nilable(Models::Shared::Decision)
94
+ first_decision: T.nilable(Models::Shared::Decision),
95
+ matched_identifier: T.nilable(Models::Shared::IdentifierMatch),
96
+ matched_identifiers: T.nilable(T::Array[Models::Shared::IdentifierTermMatch])
83
97
  )
84
98
  .void
85
99
  }
86
- def initialize(id:, status:, flow:, depth:, detail:, schema_version: "1", first_decision: nil)
100
+ def initialize(
101
+ id:,
102
+ status:,
103
+ flow:,
104
+ depth:,
105
+ detail:,
106
+ schema_version: "1",
107
+ first_decision: nil,
108
+ matched_identifier: nil,
109
+ matched_identifiers: nil
110
+ )
87
111
  @id = id
88
112
  @status = status
89
113
  @flow = flow
@@ -95,6 +119,8 @@ module NoResponse
95
119
 
96
120
  @schema_version = "1"
97
121
  @first_decision = first_decision
122
+ @matched_identifier = matched_identifier
123
+ @matched_identifiers = matched_identifiers
98
124
  end
99
125
 
100
126
  sig { params(other: T.untyped).returns(T::Boolean) }
@@ -107,6 +133,8 @@ module NoResponse
107
133
  return false unless @detail == other.detail
108
134
  return false unless @schema_version == other.schema_version
109
135
  return false unless @first_decision == other.first_decision
136
+ return false unless @matched_identifier == other.matched_identifier
137
+ return false unless @matched_identifiers == other.matched_identifiers
110
138
  true
111
139
  end
112
140
  end
@@ -47,4 +47,16 @@ class NoResponse::Models::Shared::AssessmentSearchItem
47
47
 
48
48
  def first_decision=(str_)
49
49
  end
50
+
51
+ def matched_identifier
52
+ end
53
+
54
+ def matched_identifier=(str_)
55
+ end
56
+
57
+ def matched_identifiers
58
+ end
59
+
60
+ def matched_identifiers=(str_)
61
+ end
50
62
  end
@@ -4,7 +4,7 @@
4
4
  module NoResponse
5
5
  module Models
6
6
  module Shared
7
- # Search retained assessments created in [from,to), over at most 366 days. Filters use each assessment decision, rather than the current account decision. Results can change between pages. Keep the assessment version to retrieve the exact decision later. This read does not require an idempotency key.
7
+ # Search retained assessments created in [from,to), at most 366 days. identifier matches the submitted value of each returned assessment directly. The legacy email filter keeps its account-wide mailbox semantics and cannot be combined with identifier. Other filters combine using AND and describe assessment decisions, separate from current account decisions. Results use newest-created order with an assessment-ID tie break and are live, not a snapshot across pages. Requires history or investigate authority; identifier, identifier_expression and email filtering also require identifier-read permission. Detailed response mode additionally requires detailed permission. No Idempotency-Key. identifier_expression requires scope assessment and matches the complete expression within each returned submission; account scope returns 400 invalid_request. At most 8 raw terms and 3 group levels. Mutually exclusive with identifier and email.
8
8
  class AssessmentSearchRequest
9
9
  extend T::Sig
10
10
  include Crystalline::MetadataFields
@@ -57,7 +57,7 @@ module NoResponse
57
57
  }
58
58
  }
59
59
  )
60
- # Opaque, expiring cursor bound to this environment, operation and every filter. Keep the filters unchanged.
60
+ # Opaque, expiring cursor bound to workspace, environment, operation and all filters, including expression scope, ordered structure and original term values. Keep grouping, operand order, matching modes and values unchanged; an omitted match is equivalent to exact. The page limit may change.
61
61
  field(
62
62
  :cursor,
63
63
  Crystalline::Nilable.new(::String),
@@ -181,6 +181,18 @@ module NoResponse
181
181
  Crystalline::Nilable.new(Crystalline::Boolean.new),
182
182
  {'format_json': {'letter_case': ::NoResponse::Utils.field_name("changed")}}
183
183
  )
184
+ # One customer-submitted identifier. Defaults to exact comparison of the original submitted value. canonical uses the supported identifier normalisation without an ownership claim: email preserves local-part case, NFC-normalises it and lowercases the domain without removing dots or tags; phone uses international E.164 without extensions or an inferred region; username uses NFC and Unicode case folding within the customer namespace. mailbox is email-only and explicitly selects existing list rules: case-insensitive, remove +tag, and ignore local-part dots at gmail.com and googlemail.com; googlemail.com maps to gmail.com. Username requires namespace customer. Email and phone forbid namespace. Source-discovered identifiers and platform handles are not searched. Unsupported kinds, namespaces, modes and invalid values return 400. Search equality does not establish verified ownership or merge accounts.
185
+ field(
186
+ :identifier,
187
+ Crystalline::Nilable.new(Models::Shared::IdentifierSearch),
188
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifier")}}
189
+ )
190
+ # A bounded AND/OR expression over submitted identifiers. Required scope assessment means the entire expression must match one retained assessment. Scope account permits each term to match a different retained assessment of the same account and is accepted only by account search. Exactly one of term, and or or is allowed at every node. Groups contain 2 to 8 operands, with at most 3 nested group levels and 8 raw term occurrences over the entire expression. A root term is allowed. Duplicate terms with the same kind, match rule, namespace and normalized comparison are idempotent, but count toward the raw limit. Match rules default to exact and preserve the existing identifier contract. Only retained submitted identifiers can satisfy a term. Unknown fields, unsupported scopes and malformed or oversized expressions return 400 invalid_request.
191
+ field(
192
+ :identifier_expression,
193
+ Crystalline::Nilable.new(Models::Shared::IdentifierExpression),
194
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("identifier_expression")}}
195
+ )
184
196
 
185
197
  field(
186
198
  :limit,
@@ -211,6 +223,8 @@ module NoResponse
211
223
  score_max: T.nilable(::Integer),
212
224
  list_match: T.nilable(Models::Shared::ListMatch),
213
225
  changed: T.nilable(T::Boolean),
226
+ identifier: T.nilable(Models::Shared::IdentifierSearch),
227
+ identifier_expression: T.nilable(Models::Shared::IdentifierExpression),
214
228
  limit: T.nilable(::Integer)
215
229
  )
216
230
  .void
@@ -237,6 +251,8 @@ module NoResponse
237
251
  score_max: nil,
238
252
  list_match: nil,
239
253
  changed: nil,
254
+ identifier: nil,
255
+ identifier_expression: nil,
240
256
  limit: 20
241
257
  )
242
258
  @from = from
@@ -260,6 +276,8 @@ module NoResponse
260
276
  @score_max = score_max
261
277
  @list_match = list_match
262
278
  @changed = changed
279
+ @identifier = identifier
280
+ @identifier_expression = identifier_expression
263
281
  @limit = limit
264
282
  end
265
283
 
@@ -287,6 +305,8 @@ module NoResponse
287
305
  return false unless @score_max == other.score_max
288
306
  return false unless @list_match == other.list_match
289
307
  return false unless @changed == other.changed
308
+ return false unless @identifier == other.identifier
309
+ return false unless @identifier_expression == other.identifier_expression
290
310
  return false unless @limit == other.limit
291
311
  true
292
312
  end
@@ -132,6 +132,18 @@ class NoResponse::Models::Shared::AssessmentSearchRequest
132
132
  def changed=(str_)
133
133
  end
134
134
 
135
+ def identifier
136
+ end
137
+
138
+ def identifier=(str_)
139
+ end
140
+
141
+ def identifier_expression
142
+ end
143
+
144
+ def identifier_expression=(str_)
145
+ end
146
+
135
147
  def limit
136
148
  end
137
149
 
@@ -0,0 +1,47 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # A bounded AND/OR expression over submitted identifiers. Required scope assessment means the entire expression must match one retained assessment. Scope account permits each term to match a different retained assessment of the same account and is accepted only by account search. Exactly one of term, and or or is allowed at every node. Groups contain 2 to 8 operands, with at most 3 nested group levels and 8 raw term occurrences over the entire expression. A root term is allowed. Duplicate terms with the same kind, match rule, namespace and normalized comparison are idempotent, but count toward the raw limit. Match rules default to exact and preserve the existing identifier contract. Only retained submitted identifiers can satisfy a term. Unknown fields, unsupported scopes and malformed or oversized expressions return 400 invalid_request.
8
+ class IdentifierExpression
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # assessment requires one submission to satisfy the complete expression. account permits witnesses across retained submissions of one account and is supported only by POST /v1/accounts/search. No default: select scope explicitly.
13
+ field(
14
+ :scope,
15
+ Models::Shared::ScopeEnum,
16
+ {
17
+ 'format_json': {
18
+ 'letter_case': ::NoResponse::Utils.field_name("scope"),
19
+ required: true,
20
+ 'decoder': ::NoResponse::Utils.enum_from_string(Models::Shared::ScopeEnum, false)
21
+ }
22
+ }
23
+ )
24
+
25
+ field(
26
+ :expression,
27
+ Models::Shared::IdentifierExpressionNode,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("expression"), required: true}}
29
+ )
30
+
31
+ sig { params(scope: Models::Shared::ScopeEnum, expression: Models::Shared::IdentifierExpressionNode).void }
32
+ def initialize(scope:, expression:)
33
+ @scope = scope
34
+ @expression = expression
35
+ end
36
+
37
+ sig { params(other: T.untyped).returns(T::Boolean) }
38
+ def ==(other)
39
+ return false unless other.is_a?(self.class)
40
+ return false unless @scope == other.scope
41
+ return false unless @expression == other.expression
42
+ true
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,20 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::IdentifierExpression
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::IdentifierExpression
9
+ def scope
10
+ end
11
+
12
+ def scope=(str_)
13
+ end
14
+
15
+ def expression
16
+ end
17
+
18
+ def expression=(str_)
19
+ end
20
+ end
@@ -0,0 +1,33 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+
8
+ class IdentifierExpressionLeaf
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # One customer-submitted identifier. Defaults to exact comparison of the original submitted value. canonical uses the supported identifier normalisation without an ownership claim: email preserves local-part case, NFC-normalises it and lowercases the domain without removing dots or tags; phone uses international E.164 without extensions or an inferred region; username uses NFC and Unicode case folding within the customer namespace. mailbox is email-only and explicitly selects existing list rules: case-insensitive, remove +tag, and ignore local-part dots at gmail.com and googlemail.com; googlemail.com maps to gmail.com. Username requires namespace customer. Email and phone forbid namespace. Source-discovered identifiers and platform handles are not searched. Unsupported kinds, namespaces, modes and invalid values return 400. Search equality does not establish verified ownership or merge accounts.
13
+ field(
14
+ :term,
15
+ Models::Shared::IdentifierSearch,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("term"), required: true}}
17
+ )
18
+
19
+ sig { params(term: Models::Shared::IdentifierSearch).void }
20
+ def initialize(term:)
21
+ @term = term
22
+ end
23
+
24
+ sig { params(other: T.untyped).returns(T::Boolean) }
25
+ def ==(other)
26
+ return false unless other.is_a?(self.class)
27
+ return false unless @term == other.term
28
+ true
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,14 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::IdentifierExpressionLeaf
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::IdentifierExpressionLeaf
9
+ def term
10
+ end
11
+
12
+ def term=(str_)
13
+ end
14
+ end
@@ -0,0 +1,56 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+
8
+ class IdentifierExpressionNode
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # One customer-submitted identifier. Defaults to exact comparison of the original submitted value. canonical uses the supported identifier normalisation without an ownership claim: email preserves local-part case, NFC-normalises it and lowercases the domain without removing dots or tags; phone uses international E.164 without extensions or an inferred region; username uses NFC and Unicode case folding within the customer namespace. mailbox is email-only and explicitly selects existing list rules: case-insensitive, remove +tag, and ignore local-part dots at gmail.com and googlemail.com; googlemail.com maps to gmail.com. Username requires namespace customer. Email and phone forbid namespace. Source-discovered identifiers and platform handles are not searched. Unsupported kinds, namespaces, modes and invalid values return 400. Search equality does not establish verified ownership or merge accounts.
13
+ field(
14
+ :term,
15
+ Crystalline::Nilable.new(Models::Shared::IdentifierSearch),
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("term")}}
17
+ )
18
+
19
+ field(
20
+ :and_,
21
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::IdentifierExpressionNodeLevelTwo)),
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("and")}}
23
+ )
24
+
25
+ field(
26
+ :or_,
27
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::IdentifierExpressionNodeLevelTwo)),
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("or")}}
29
+ )
30
+
31
+ sig {
32
+ params(
33
+ term: T.nilable(Models::Shared::IdentifierSearch),
34
+ and_: T.nilable(T::Array[Models::Shared::IdentifierExpressionNodeLevelTwo]),
35
+ or_: T.nilable(T::Array[Models::Shared::IdentifierExpressionNodeLevelTwo])
36
+ )
37
+ .void
38
+ }
39
+ def initialize(term: nil, and_: nil, or_: nil)
40
+ @term = term
41
+ @and_ = and_
42
+ @or_ = or_
43
+ end
44
+
45
+ sig { params(other: T.untyped).returns(T::Boolean) }
46
+ def ==(other)
47
+ return false unless other.is_a?(self.class)
48
+ return false unless @term == other.term
49
+ return false unless @and_ == other.and_
50
+ return false unless @or_ == other.or_
51
+ true
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,26 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::IdentifierExpressionNode
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::IdentifierExpressionNode
9
+ def term
10
+ end
11
+
12
+ def term=(str_)
13
+ end
14
+
15
+ def and_
16
+ end
17
+
18
+ def and_=(str_)
19
+ end
20
+
21
+ def or_
22
+ end
23
+
24
+ def or_=(str_)
25
+ end
26
+ end