noresponse 2.0.17

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 (231) hide show
  1. checksums.yaml +7 -0
  2. data/lib/crystalline/enum.rbi +17 -0
  3. data/lib/crystalline/metadata_fields.rb +263 -0
  4. data/lib/crystalline/module.rb +186 -0
  5. data/lib/crystalline/types.rb +168 -0
  6. data/lib/crystalline/utils.rb +67 -0
  7. data/lib/crystalline.rb +11 -0
  8. data/lib/no_response/assessments.rb +1252 -0
  9. data/lib/no_response/auth.rb +263 -0
  10. data/lib/no_response/issued_credential.rb +21 -0
  11. data/lib/no_response/keys.rb +318 -0
  12. data/lib/no_response/late_results.rb +301 -0
  13. data/lib/no_response/models/callbacks.rb +10 -0
  14. data/lib/no_response/models/errors/apistatuserror.rb +41 -0
  15. data/lib/no_response/models/errors/apistatuserror.rbi +30 -0
  16. data/lib/no_response/models/errors/authenticationerror.rb +108 -0
  17. data/lib/no_response/models/errors/authenticationerror.rbi +56 -0
  18. data/lib/no_response/models/errors/badrequesterror.rb +108 -0
  19. data/lib/no_response/models/errors/badrequesterror.rbi +56 -0
  20. data/lib/no_response/models/errors/conflicterror.rb +108 -0
  21. data/lib/no_response/models/errors/conflicterror.rbi +56 -0
  22. data/lib/no_response/models/errors/notfounderror.rb +108 -0
  23. data/lib/no_response/models/errors/notfounderror.rbi +56 -0
  24. data/lib/no_response/models/errors/permissiondeniederror.rb +108 -0
  25. data/lib/no_response/models/errors/permissiondeniederror.rbi +56 -0
  26. data/lib/no_response/models/errors/ratelimiterror.rb +108 -0
  27. data/lib/no_response/models/errors/ratelimiterror.rbi +56 -0
  28. data/lib/no_response/models/errors.rb +16 -0
  29. data/lib/no_response/models/operations/createassessment_request.rb +36 -0
  30. data/lib/no_response/models/operations/createassessment_request.rbi +20 -0
  31. data/lib/no_response/models/operations/createassessment_response.rb +32 -0
  32. data/lib/no_response/models/operations/createassessment_response.rbi +20 -0
  33. data/lib/no_response/models/operations/getassessment_request.rb +41 -0
  34. data/lib/no_response/models/operations/getassessment_request.rbi +20 -0
  35. data/lib/no_response/models/operations/getassessment_response.rb +32 -0
  36. data/lib/no_response/models/operations/getassessment_response.rbi +20 -0
  37. data/lib/no_response/models/operations/queryaccountassessments_response.rb +44 -0
  38. data/lib/no_response/models/operations/queryaccountassessments_response.rbi +20 -0
  39. data/lib/no_response/models/operations/recordassessmentoutcome_request.rb +52 -0
  40. data/lib/no_response/models/operations/recordassessmentoutcome_request.rbi +26 -0
  41. data/lib/no_response/models/operations/recordassessmentoutcome_response.rb +32 -0
  42. data/lib/no_response/models/operations/recordassessmentoutcome_response.rbi +20 -0
  43. data/lib/no_response/models/operations/rotateapikey_response.rb +32 -0
  44. data/lib/no_response/models/operations/rotateapikey_response.rbi +20 -0
  45. data/lib/no_response/models/operations.rb +17 -0
  46. data/lib/no_response/models/shared/alternate_name.rb +23 -0
  47. data/lib/no_response/models/shared/alternate_name.rbi +9 -0
  48. data/lib/no_response/models/shared/alternate_name_union.rb +23 -0
  49. data/lib/no_response/models/shared/alternate_name_union.rbi +9 -0
  50. data/lib/no_response/models/shared/assessment.rb +235 -0
  51. data/lib/no_response/models/shared/assessment.rbi +116 -0
  52. data/lib/no_response/models/shared/assessmentlist.rb +78 -0
  53. data/lib/no_response/models/shared/assessmentlist.rbi +38 -0
  54. data/lib/no_response/models/shared/assessmentoutcome.rb +61 -0
  55. data/lib/no_response/models/shared/assessmentoutcome.rbi +32 -0
  56. data/lib/no_response/models/shared/assessmentoutcomerequest.rb +71 -0
  57. data/lib/no_response/models/shared/assessmentoutcomerequest.rbi +32 -0
  58. data/lib/no_response/models/shared/assessmentquery.rb +70 -0
  59. data/lib/no_response/models/shared/assessmentquery.rbi +32 -0
  60. data/lib/no_response/models/shared/assessmentrequest.rb +125 -0
  61. data/lib/no_response/models/shared/assessmentrequest.rbi +62 -0
  62. data/lib/no_response/models/shared/assessmentrequestclientcontext.rb +125 -0
  63. data/lib/no_response/models/shared/assessmentrequestclientcontext.rbi +62 -0
  64. data/lib/no_response/models/shared/assessmentrequestidentifiers.rb +74 -0
  65. data/lib/no_response/models/shared/assessmentrequestidentifiers.rbi +38 -0
  66. data/lib/no_response/models/shared/assessmentrequestissuedcredential.rb +33 -0
  67. data/lib/no_response/models/shared/assessmentrequestissuedcredential.rbi +14 -0
  68. data/lib/no_response/models/shared/assessmentrequestpolicycontext.rb +46 -0
  69. data/lib/no_response/models/shared/assessmentrequestpolicycontext.rbi +20 -0
  70. data/lib/no_response/models/shared/assessmenttiming.rb +41 -0
  71. data/lib/no_response/models/shared/assessmenttiming.rbi +20 -0
  72. data/lib/no_response/models/shared/assurancelevel.rb +18 -0
  73. data/lib/no_response/models/shared/assurancelevel.rbi +9 -0
  74. data/lib/no_response/models/shared/authcontext.rb +285 -0
  75. data/lib/no_response/models/shared/authcontext.rbi +152 -0
  76. data/lib/no_response/models/shared/authcontextmfa.rb +55 -0
  77. data/lib/no_response/models/shared/authcontextmfa.rbi +26 -0
  78. data/lib/no_response/models/shared/authenticationerrorcode.rb +18 -0
  79. data/lib/no_response/models/shared/authenticationerrorcode.rbi +9 -0
  80. data/lib/no_response/models/shared/badrequesterrorcode.rb +20 -0
  81. data/lib/no_response/models/shared/badrequesterrorcode.rbi +9 -0
  82. data/lib/no_response/models/shared/band.rb +21 -0
  83. data/lib/no_response/models/shared/band.rbi +9 -0
  84. data/lib/no_response/models/shared/breach.rb +108 -0
  85. data/lib/no_response/models/shared/breach.rbi +56 -0
  86. data/lib/no_response/models/shared/breachexposed.rb +28 -0
  87. data/lib/no_response/models/shared/breachexposed.rbi +9 -0
  88. data/lib/no_response/models/shared/breachkind.rb +24 -0
  89. data/lib/no_response/models/shared/breachkind.rbi +9 -0
  90. data/lib/no_response/models/shared/breachselector.rb +20 -0
  91. data/lib/no_response/models/shared/breachselector.rbi +9 -0
  92. data/lib/no_response/models/shared/breachsummary.rb +109 -0
  93. data/lib/no_response/models/shared/breachsummary.rbi +56 -0
  94. data/lib/no_response/models/shared/confidence.rb +21 -0
  95. data/lib/no_response/models/shared/confidence.rbi +9 -0
  96. data/lib/no_response/models/shared/conflicterrorcode.rb +19 -0
  97. data/lib/no_response/models/shared/conflicterrorcode.rbi +9 -0
  98. data/lib/no_response/models/shared/consistency.rb +85 -0
  99. data/lib/no_response/models/shared/consistency.rbi +32 -0
  100. data/lib/no_response/models/shared/consistencyvalue.rb +21 -0
  101. data/lib/no_response/models/shared/consistencyvalue.rbi +9 -0
  102. data/lib/no_response/models/shared/country.rb +20 -0
  103. data/lib/no_response/models/shared/country.rbi +9 -0
  104. data/lib/no_response/models/shared/email.rb +23 -0
  105. data/lib/no_response/models/shared/email.rbi +9 -0
  106. data/lib/no_response/models/shared/email_union.rb +23 -0
  107. data/lib/no_response/models/shared/email_union.rbi +9 -0
  108. data/lib/no_response/models/shared/failurereason.rb +24 -0
  109. data/lib/no_response/models/shared/failurereason.rbi +9 -0
  110. data/lib/no_response/models/shared/flow.rb +18 -0
  111. data/lib/no_response/models/shared/flow.rbi +9 -0
  112. data/lib/no_response/models/shared/freshness.rb +20 -0
  113. data/lib/no_response/models/shared/freshness.rbi +9 -0
  114. data/lib/no_response/models/shared/hookpoint.rb +19 -0
  115. data/lib/no_response/models/shared/hookpoint.rbi +9 -0
  116. data/lib/no_response/models/shared/identifierkind.rb +21 -0
  117. data/lib/no_response/models/shared/identifierkind.rbi +9 -0
  118. data/lib/no_response/models/shared/incompletereason.rb +23 -0
  119. data/lib/no_response/models/shared/incompletereason.rbi +9 -0
  120. data/lib/no_response/models/shared/incompletesource.rb +53 -0
  121. data/lib/no_response/models/shared/incompletesource.rbi +20 -0
  122. data/lib/no_response/models/shared/ipsummary.rb +61 -0
  123. data/lib/no_response/models/shared/ipsummary.rbi +26 -0
  124. data/lib/no_response/models/shared/ipsummarytype.rb +24 -0
  125. data/lib/no_response/models/shared/ipsummarytype.rbi +9 -0
  126. data/lib/no_response/models/shared/keyrotation.rb +79 -0
  127. data/lib/no_response/models/shared/keyrotation.rbi +44 -0
  128. data/lib/no_response/models/shared/keyrotationrequest.rb +33 -0
  129. data/lib/no_response/models/shared/keyrotationrequest.rbi +14 -0
  130. data/lib/no_response/models/shared/lane.rb +21 -0
  131. data/lib/no_response/models/shared/lane.rbi +9 -0
  132. data/lib/no_response/models/shared/linetype.rb +22 -0
  133. data/lib/no_response/models/shared/linetype.rbi +9 -0
  134. data/lib/no_response/models/shared/location.rb +23 -0
  135. data/lib/no_response/models/shared/location.rbi +9 -0
  136. data/lib/no_response/models/shared/location_union.rb +23 -0
  137. data/lib/no_response/models/shared/location_union.rbi +9 -0
  138. data/lib/no_response/models/shared/name_candidate.rb +23 -0
  139. data/lib/no_response/models/shared/name_candidate.rbi +9 -0
  140. data/lib/no_response/models/shared/name_candidate_union.rb +23 -0
  141. data/lib/no_response/models/shared/name_candidate_union.rbi +9 -0
  142. data/lib/no_response/models/shared/notfounderrorcode.rb +18 -0
  143. data/lib/no_response/models/shared/notfounderrorcode.rbi +9 -0
  144. data/lib/no_response/models/shared/outcome.rb +23 -0
  145. data/lib/no_response/models/shared/outcome.rbi +9 -0
  146. data/lib/no_response/models/shared/permissiondeniederrorcode.rb +18 -0
  147. data/lib/no_response/models/shared/permissiondeniederrorcode.rbi +9 -0
  148. data/lib/no_response/models/shared/phoneenrichment.rb +32 -0
  149. data/lib/no_response/models/shared/phoneenrichment.rbi +14 -0
  150. data/lib/no_response/models/shared/phoneenrichmentfields.rb +451 -0
  151. data/lib/no_response/models/shared/phoneenrichmentfields.rbi +212 -0
  152. data/lib/no_response/models/shared/platform.rb +18 -0
  153. data/lib/no_response/models/shared/platform.rbi +9 -0
  154. data/lib/no_response/models/shared/probleminvalidparam.rb +48 -0
  155. data/lib/no_response/models/shared/probleminvalidparam.rbi +26 -0
  156. data/lib/no_response/models/shared/ratelimiterrorcode.rb +18 -0
  157. data/lib/no_response/models/shared/ratelimiterrorcode.rbi +9 -0
  158. data/lib/no_response/models/shared/reasoncode.rb +52 -0
  159. data/lib/no_response/models/shared/reasoncode.rbi +9 -0
  160. data/lib/no_response/models/shared/reasonidentifier.rb +23 -0
  161. data/lib/no_response/models/shared/reasonidentifier.rbi +9 -0
  162. data/lib/no_response/models/shared/recommendation.rb +20 -0
  163. data/lib/no_response/models/shared/recommendation.rbi +9 -0
  164. data/lib/no_response/models/shared/responsemode.rb +16 -0
  165. data/lib/no_response/models/shared/responsemode.rbi +9 -0
  166. data/lib/no_response/models/shared/risk.rb +171 -0
  167. data/lib/no_response/models/shared/risk.rbi +80 -0
  168. data/lib/no_response/models/shared/riskconfidence.rb +20 -0
  169. data/lib/no_response/models/shared/riskconfidence.rbi +9 -0
  170. data/lib/no_response/models/shared/riskcoverage.rb +49 -0
  171. data/lib/no_response/models/shared/riskcoverage.rbi +26 -0
  172. data/lib/no_response/models/shared/riskdetails.rb +55 -0
  173. data/lib/no_response/models/shared/riskdetails.rbi +26 -0
  174. data/lib/no_response/models/shared/riskdetailsbreachname.rb +40 -0
  175. data/lib/no_response/models/shared/riskdetailsbreachname.rbi +20 -0
  176. data/lib/no_response/models/shared/riskdetailsphonename.rb +40 -0
  177. data/lib/no_response/models/shared/riskdetailsphonename.rbi +20 -0
  178. data/lib/no_response/models/shared/riskreason.rb +67 -0
  179. data/lib/no_response/models/shared/riskreason.rbi +26 -0
  180. data/lib/no_response/models/shared/risksummary.rb +73 -0
  181. data/lib/no_response/models/shared/risksummary.rbi +38 -0
  182. data/lib/no_response/models/shared/risksummaryemail.rb +55 -0
  183. data/lib/no_response/models/shared/risksummaryemail.rbi +26 -0
  184. data/lib/no_response/models/shared/risksummaryphone.rb +69 -0
  185. data/lib/no_response/models/shared/risksummaryphone.rbi +32 -0
  186. data/lib/no_response/models/shared/risksummaryusername.rb +41 -0
  187. data/lib/no_response/models/shared/risksummaryusername.rbi +20 -0
  188. data/lib/no_response/models/shared/scope.rb +21 -0
  189. data/lib/no_response/models/shared/scope.rbi +9 -0
  190. data/lib/no_response/models/shared/security.rb +32 -0
  191. data/lib/no_response/models/shared/security.rbi +14 -0
  192. data/lib/no_response/models/shared/signal.rb +149 -0
  193. data/lib/no_response/models/shared/signal.rbi +68 -0
  194. data/lib/no_response/models/shared/signaloutcome.rb +22 -0
  195. data/lib/no_response/models/shared/signaloutcome.rbi +9 -0
  196. data/lib/no_response/models/shared/social_profile.rb +23 -0
  197. data/lib/no_response/models/shared/social_profile.rbi +9 -0
  198. data/lib/no_response/models/shared/social_profile_union.rb +23 -0
  199. data/lib/no_response/models/shared/social_profile_union.rbi +9 -0
  200. data/lib/no_response/models/shared/status.rb +20 -0
  201. data/lib/no_response/models/shared/status.rbi +9 -0
  202. data/lib/no_response/models/shared/timezone.rb +23 -0
  203. data/lib/no_response/models/shared/timezone.rbi +9 -0
  204. data/lib/no_response/models/shared/timezone_union.rb +23 -0
  205. data/lib/no_response/models/shared/timezone_union.rbi +9 -0
  206. data/lib/no_response/models/shared/transport.rb +17 -0
  207. data/lib/no_response/models/shared/transport.rbi +9 -0
  208. data/lib/no_response/models/shared/website.rb +23 -0
  209. data/lib/no_response/models/shared/website.rbi +9 -0
  210. data/lib/no_response/models/shared/website_union.rb +23 -0
  211. data/lib/no_response/models/shared/website_union.rbi +9 -0
  212. data/lib/no_response/models/shared.rb +92 -0
  213. data/lib/no_response/noresponseclient.rb +110 -0
  214. data/lib/no_response/sdk_hooks/hooks.rb +97 -0
  215. data/lib/no_response/sdk_hooks/idempotency_key_hook.rb +25 -0
  216. data/lib/no_response/sdk_hooks/registration.rb +43 -0
  217. data/lib/no_response/sdk_hooks/types.rb +178 -0
  218. data/lib/no_response/sdkconfiguration.rb +107 -0
  219. data/lib/no_response/sdkconfiguration.rbi +83 -0
  220. data/lib/no_response/utils/forms.rb +230 -0
  221. data/lib/no_response/utils/headers.rb +80 -0
  222. data/lib/no_response/utils/query_params.rb +165 -0
  223. data/lib/no_response/utils/request_bodies.rb +77 -0
  224. data/lib/no_response/utils/retries.rb +137 -0
  225. data/lib/no_response/utils/security.rb +156 -0
  226. data/lib/no_response/utils/url.rb +122 -0
  227. data/lib/no_response/utils/utils.rb +243 -0
  228. data/lib/no_response/wait.rb +66 -0
  229. data/lib/no_response/webhooks.rb +177 -0
  230. data/lib/noresponse.rb +25 -0
  231. metadata +501 -0
@@ -0,0 +1,235 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # One assessment of one account, as POST /v1/assessments, GET /v1/assessments/{assessment_id} and the assessment.updated webhook return it. status says whether it is final (complete), usable with a source still running (partial) or not yet usable (pending). risk and recommendation are present for complete and partial; assessment_url is present for pending. Keep the highest assessment_version.
8
+ class Assessment
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Opaque, server-assigned assessment id: 'asm_' and a 26-character Crockford base32 ULID. Unique within the tenant; another tenant's assessment id answers 404.
13
+ field(
14
+ :assessment_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_id"), required: true}}
17
+ )
18
+ # Your own opaque identifier for the account being checked, scoped to your tenant. Use an id you mint, with no direct identifier (email, phone, name or national id) in it. '|' is accepted so an Auth0 user id such as 'auth0|64abc' passes unchanged; '@', '+', '$' and whitespace are refused, as is a JWT; a hex digest such as a SHA-256 is allowed. It travels only in request bodies. An assessment requested by a provider hook at pre_registration, which has no account yet, carries the server-issued account_id pre: followed by its assessment_id.
19
+ field(
20
+ :account_id,
21
+ ::String,
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("account_id"), required: true}}
23
+ )
24
+ # complete: final; nothing is still running. A lane that failed or missed its 10 s deadline stays listed in incomplete_sources, and confidence is lower. partial: a recommendation exists and at least one lane is still running or did not settle (see incomplete_sources). pending: nothing usable before the deadline; no recommendation yet, poll or wait for the webhook.
25
+ field(
26
+ :status,
27
+ Models::Shared::Status,
28
+ {
29
+ 'format_json': {
30
+ 'letter_case': ::NoResponse::Utils.field_name("status"),
31
+ required: true,
32
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Status, false)
33
+ }
34
+ }
35
+ )
36
+ # Ordinal confidence in the recommendation under the current policy: low, medium, high or unavailable.
37
+ field(
38
+ :confidence,
39
+ Models::Shared::Confidence,
40
+ {
41
+ 'format_json': {
42
+ 'letter_case': ::NoResponse::Utils.field_name("confidence"),
43
+ required: true,
44
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Confidence, false)
45
+ }
46
+ }
47
+ )
48
+ # The lanes that did not settle, each listed once with a reason; lanes, not sources. In a detailed view a lane is listed exactly when one of its signals did not settle; a standard view carries no signals to match.
49
+ field(
50
+ :incomplete_sources,
51
+ Crystalline::Array.new(Models::Shared::IncompleteSource),
52
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("incomplete_sources"), required: true}}
53
+ )
54
+ # Version of the hand-authored heuristic weights that produced the recommendation, for example 'risk-2026-10.7'. A tenant threshold override adds a +t<N> suffix, e.g. 'risk-2026-10.7+t3'.
55
+ field(
56
+ :policy_version,
57
+ ::String,
58
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("policy_version"), required: true}}
59
+ )
60
+ # Monotonic revision of this assessment. 1 on the synchronous answer; each material change while the assessment is served (an async continuation settling a source, a change of recommendation, confidence or status) increments it. Expiry does not increment it: an expired assessment is gone, not revised, and the expiry webhook carries the last served version.
61
+ field(
62
+ :assessment_version,
63
+ ::Integer,
64
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_version"), required: true}}
65
+ )
66
+ # When the assessment was created. Fixed for the life of the assessment: every revision carries the same created_at.
67
+ field(
68
+ :created_at,
69
+ ::String,
70
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("created_at"), required: true}}
71
+ )
72
+
73
+ field(
74
+ :updated_at,
75
+ ::String,
76
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("updated_at"), required: true}}
77
+ )
78
+ # After this instant the assessment is no longer served: GET /v1/assessments/{assessment_id} answers 404 and it leaves the account history. It is created_at plus your retention period at creation (default and maximum 365 days) and is fixed per record: a later revision keeps it, and a new assessment for the same account starts its own clock. If you later shorten retention, the effective expiry becomes created_at plus the shorter of the two periods.
79
+ field(
80
+ :expires_at,
81
+ ::String,
82
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("expires_at"), required: true}}
83
+ )
84
+
85
+ field(
86
+ :timing,
87
+ Models::Shared::AssessmentTiming,
88
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("timing"), required: true}}
89
+ )
90
+ # Version of the body shape.
91
+ field(
92
+ :schema_version,
93
+ ::String,
94
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("schema_version"), required: true}}
95
+ )
96
+ # An optional provider correlation id, echoed back. It is not an idempotency key. Refuses an exact-shape JWT or a bare 40, 64 or 128 character hex digest; a UUID is accepted.
97
+ field(
98
+ :request_id,
99
+ Crystalline::Nilable.new(::String),
100
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("request_id")}}
101
+ )
102
+ # The recommended action: allow, step_up or review. Your application applies it.
103
+ field(
104
+ :recommendation,
105
+ Crystalline::Nilable.new(Models::Shared::Recommendation),
106
+ {
107
+ 'format_json': {
108
+ 'letter_case': ::NoResponse::Utils.field_name("recommendation"),
109
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Recommendation, true)
110
+ }
111
+ }
112
+ )
113
+ # The one risk decision for this event. score is 0 (safe) to 100 (risky): the sum of the weights of the reasons that fired, clamped to 0 to 100, from hand-set versioned weights. Every answer with a recommendation carries it, and the top-level recommendation equals risk.recommendation. It names no source or provider.
114
+ field(
115
+ :risk,
116
+ Crystalline::Nilable.new(Models::Shared::Risk),
117
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("risk")}}
118
+ )
119
+ # Detailed view only (response_mode=detailed, which needs the detailed scope): a standard answer omits signals[], and a detailed one always carries it, possibly empty. The body does not name its mode, so that rule is the serving gate's; the schema states the half it can: an answer with risk.details is a detailed view and carries signals[]. At most one signal per (type, source_id, identifier).
120
+ field(
121
+ :signals,
122
+ Crystalline::Nilable.new(Crystalline::Array.new(Models::Shared::Signal)),
123
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("signals")}}
124
+ )
125
+ # Labels the v0 policy as hand-authored and not statistically validated.
126
+ field(
127
+ :policy_basis,
128
+ ::String,
129
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("policy_basis"), required: true}}
130
+ )
131
+ # Server-relative path of the authoritative assessment, GET /v1/assessments/{assessment_id}.
132
+ field(
133
+ :assessment_url,
134
+ Crystalline::Nilable.new(::String),
135
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_url")}}
136
+ )
137
+
138
+ sig {
139
+ params(
140
+ assessment_id: ::String,
141
+ account_id: ::String,
142
+ status: Models::Shared::Status,
143
+ confidence: Models::Shared::Confidence,
144
+ incomplete_sources: T::Array[Models::Shared::IncompleteSource],
145
+ policy_version: ::String,
146
+ assessment_version: ::Integer,
147
+ created_at: ::String,
148
+ updated_at: ::String,
149
+ expires_at: ::String,
150
+ timing: Models::Shared::AssessmentTiming,
151
+ schema_version: ::String,
152
+ request_id: T.nilable(::String),
153
+ recommendation: T.nilable(Models::Shared::Recommendation),
154
+ risk: T.nilable(Models::Shared::Risk),
155
+ signals: T.nilable(T::Array[Models::Shared::Signal]),
156
+ policy_basis: ::String,
157
+ assessment_url: T.nilable(::String)
158
+ )
159
+ .void
160
+ }
161
+ def initialize(
162
+ assessment_id:,
163
+ account_id:,
164
+ status:,
165
+ confidence:,
166
+ incomplete_sources:,
167
+ policy_version:,
168
+ assessment_version:,
169
+ created_at:,
170
+ updated_at:,
171
+ expires_at:,
172
+ timing:,
173
+ schema_version: "1",
174
+ request_id: nil,
175
+ recommendation: nil,
176
+ risk: nil,
177
+ signals: nil,
178
+ policy_basis: "heuristic_unvalidated",
179
+ assessment_url: nil
180
+ )
181
+ @assessment_id = assessment_id
182
+ @account_id = account_id
183
+ @status = status
184
+ @confidence = confidence
185
+ @incomplete_sources = incomplete_sources
186
+ @policy_version = policy_version
187
+ @assessment_version = assessment_version
188
+ @created_at = created_at
189
+ @updated_at = updated_at
190
+ @expires_at = expires_at
191
+ @timing = timing
192
+ unless schema_version == "1"
193
+ raise ArgumentError, "Invalid value for schema_version"
194
+ end
195
+
196
+ @schema_version = "1"
197
+ @request_id = request_id
198
+ @recommendation = recommendation
199
+ @risk = risk
200
+ @signals = signals
201
+ unless policy_basis == "heuristic_unvalidated"
202
+ raise ArgumentError, "Invalid value for policy_basis"
203
+ end
204
+
205
+ @policy_basis = "heuristic_unvalidated"
206
+ @assessment_url = assessment_url
207
+ end
208
+
209
+ sig { params(other: T.untyped).returns(T::Boolean) }
210
+ def ==(other)
211
+ return false unless other.is_a?(self.class)
212
+ return false unless @assessment_id == other.assessment_id
213
+ return false unless @account_id == other.account_id
214
+ return false unless @status == other.status
215
+ return false unless @confidence == other.confidence
216
+ return false unless @incomplete_sources == other.incomplete_sources
217
+ return false unless @policy_version == other.policy_version
218
+ return false unless @assessment_version == other.assessment_version
219
+ return false unless @created_at == other.created_at
220
+ return false unless @updated_at == other.updated_at
221
+ return false unless @expires_at == other.expires_at
222
+ return false unless @timing == other.timing
223
+ return false unless @schema_version == other.schema_version
224
+ return false unless @request_id == other.request_id
225
+ return false unless @recommendation == other.recommendation
226
+ return false unless @risk == other.risk
227
+ return false unless @signals == other.signals
228
+ return false unless @policy_basis == other.policy_basis
229
+ return false unless @assessment_url == other.assessment_url
230
+ true
231
+ end
232
+ end
233
+ end
234
+ end
235
+ end
@@ -0,0 +1,116 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::Assessment
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::Assessment
9
+ def assessment_id
10
+ end
11
+
12
+ def assessment_id=(str_)
13
+ end
14
+
15
+ def account_id
16
+ end
17
+
18
+ def account_id=(str_)
19
+ end
20
+
21
+ def status
22
+ end
23
+
24
+ def status=(str_)
25
+ end
26
+
27
+ def confidence
28
+ end
29
+
30
+ def confidence=(str_)
31
+ end
32
+
33
+ def incomplete_sources
34
+ end
35
+
36
+ def incomplete_sources=(str_)
37
+ end
38
+
39
+ def policy_version
40
+ end
41
+
42
+ def policy_version=(str_)
43
+ end
44
+
45
+ def assessment_version
46
+ end
47
+
48
+ def assessment_version=(str_)
49
+ end
50
+
51
+ def created_at
52
+ end
53
+
54
+ def created_at=(str_)
55
+ end
56
+
57
+ def updated_at
58
+ end
59
+
60
+ def updated_at=(str_)
61
+ end
62
+
63
+ def expires_at
64
+ end
65
+
66
+ def expires_at=(str_)
67
+ end
68
+
69
+ def timing
70
+ end
71
+
72
+ def timing=(str_)
73
+ end
74
+
75
+ def schema_version
76
+ end
77
+
78
+ def schema_version=(str_)
79
+ end
80
+
81
+ def request_id
82
+ end
83
+
84
+ def request_id=(str_)
85
+ end
86
+
87
+ def recommendation
88
+ end
89
+
90
+ def recommendation=(str_)
91
+ end
92
+
93
+ def risk
94
+ end
95
+
96
+ def risk=(str_)
97
+ end
98
+
99
+ def signals
100
+ end
101
+
102
+ def signals=(str_)
103
+ end
104
+
105
+ def policy_basis
106
+ end
107
+
108
+ def policy_basis=(str_)
109
+ end
110
+
111
+ def assessment_url
112
+ end
113
+
114
+ def assessment_url=(str_)
115
+ end
116
+ end
@@ -0,0 +1,78 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # Body of the 200 answer to POST /v1/assessments/query: one page of the calling tenant's unexpired assessments for one account, newest first, each at its latest assessment_version. Every item's account_id equals the page's. An assessment past its expires_at is not listed. next_cursor is present only when another page exists.
8
+ class AssessmentList
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Your own opaque identifier for the account being checked, scoped to your tenant. Use an id you mint, with no direct identifier (email, phone, name or national id) in it. '|' is accepted so an Auth0 user id such as 'auth0|64abc' passes unchanged; '@', '+', '$' and whitespace are refused, as is a JWT; a hex digest such as a SHA-256 is allowed. It travels only in request bodies. An assessment requested by a provider hook at pre_registration, which has no account yet, carries the server-issued account_id pre: followed by its assessment_id.
13
+ field(
14
+ :account_id,
15
+ ::String,
16
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("account_id"), required: true}}
17
+ )
18
+
19
+ field(
20
+ :items,
21
+ Crystalline::Array.new(Models::Shared::Assessment),
22
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("items"), required: true}}
23
+ )
24
+ # Version of the body shape.
25
+ field(
26
+ :schema_version,
27
+ ::String,
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("schema_version"), required: true}}
29
+ )
30
+ # Opaque cursor for the next page, bound to your tenant and the account_id it was issued for. Pass it back unchanged in the next query; a tampered, foreign or expired cursor answers 400 invalid_cursor.
31
+ field(
32
+ :next_cursor,
33
+ Crystalline::Nilable.new(::String),
34
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("next_cursor")}}
35
+ )
36
+ # Your current retention period, so a consumer knows how far back history reaches. Every item expires no later than its created_at plus this many days.
37
+ field(
38
+ :retention_days,
39
+ Crystalline::Nilable.new(::Integer),
40
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("retention_days")}}
41
+ )
42
+
43
+ sig {
44
+ params(
45
+ account_id: ::String,
46
+ items: T::Array[Models::Shared::Assessment],
47
+ schema_version: ::String,
48
+ next_cursor: T.nilable(::String),
49
+ retention_days: T.nilable(::Integer)
50
+ )
51
+ .void
52
+ }
53
+ def initialize(account_id:, items:, schema_version: "1", next_cursor: nil, retention_days: 365)
54
+ @account_id = account_id
55
+ @items = items
56
+ unless schema_version == "1"
57
+ raise ArgumentError, "Invalid value for schema_version"
58
+ end
59
+
60
+ @schema_version = "1"
61
+ @next_cursor = next_cursor
62
+ @retention_days = retention_days
63
+ end
64
+
65
+ sig { params(other: T.untyped).returns(T::Boolean) }
66
+ def ==(other)
67
+ return false unless other.is_a?(self.class)
68
+ return false unless @account_id == other.account_id
69
+ return false unless @items == other.items
70
+ return false unless @schema_version == other.schema_version
71
+ return false unless @next_cursor == other.next_cursor
72
+ return false unless @retention_days == other.retention_days
73
+ true
74
+ end
75
+ end
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,38 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentList
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentList
9
+ def account_id
10
+ end
11
+
12
+ def account_id=(str_)
13
+ end
14
+
15
+ def items
16
+ end
17
+
18
+ def items=(str_)
19
+ end
20
+
21
+ def schema_version
22
+ end
23
+
24
+ def schema_version=(str_)
25
+ end
26
+
27
+ def next_cursor
28
+ end
29
+
30
+ def next_cursor=(str_)
31
+ end
32
+
33
+ def retention_days
34
+ end
35
+
36
+ def retention_days=(str_)
37
+ end
38
+ end
@@ -0,0 +1,61 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # The 202 answer of POST /v1/assessments/{assessment_id}/outcomes. A replay with the same Idempotency-Key and body answers the same record.
8
+ class AssessmentOutcome
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # Opaque, server-assigned id of one recorded outcome: 'out_' and a 26-character Crockford base32 ULID. Unique within the tenant.
13
+ field :id, ::String, {'format_json': {'letter_case': ::NoResponse::Utils.field_name("id"), required: true}}
14
+ # Opaque, server-assigned assessment id: 'asm_' and a 26-character Crockford base32 ULID. Unique within the tenant; another tenant's assessment id answers 404.
15
+ field(
16
+ :assessment_id,
17
+ ::String,
18
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("assessment_id"), required: true}}
19
+ )
20
+ # What the provider later learned about the assessed account. confirmed_abuse, account_takeover and chargeback report abuse; false_positive and legitimate withdraw an earlier abuse report of this tenant for the assessment; unknown is recorded only. Outcomes are append-only and the latest one recorded for an assessment wins.
21
+ field(
22
+ :outcome,
23
+ Models::Shared::Outcome,
24
+ {
25
+ 'format_json': {
26
+ 'letter_case': ::NoResponse::Utils.field_name("outcome"),
27
+ required: true,
28
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Outcome, false)
29
+ }
30
+ }
31
+ )
32
+ # When NoResponse first recorded the outcome.
33
+ field(
34
+ :received_at,
35
+ ::String,
36
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("received_at"), required: true}}
37
+ )
38
+
39
+ sig {
40
+ params(id: ::String, assessment_id: ::String, outcome: Models::Shared::Outcome, received_at: ::String).void
41
+ }
42
+ def initialize(id:, assessment_id:, outcome:, received_at:)
43
+ @id = id
44
+ @assessment_id = assessment_id
45
+ @outcome = outcome
46
+ @received_at = received_at
47
+ end
48
+
49
+ sig { params(other: T.untyped).returns(T::Boolean) }
50
+ def ==(other)
51
+ return false unless other.is_a?(self.class)
52
+ return false unless @id == other.id
53
+ return false unless @assessment_id == other.assessment_id
54
+ return false unless @outcome == other.outcome
55
+ return false unless @received_at == other.received_at
56
+ true
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,32 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentOutcome
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentOutcome
9
+ def id
10
+ end
11
+
12
+ def id=(str_)
13
+ end
14
+
15
+ def assessment_id
16
+ end
17
+
18
+ def assessment_id=(str_)
19
+ end
20
+
21
+ def outcome
22
+ end
23
+
24
+ def outcome=(str_)
25
+ end
26
+
27
+ def received_at
28
+ end
29
+
30
+ def received_at=(str_)
31
+ end
32
+ end
@@ -0,0 +1,71 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module NoResponse
5
+ module Models
6
+ module Shared
7
+ # POST /v1/assessments/{assessment_id}/outcomes body: what the provider later learned about the account it assessed. The assessment is named by the path and the tenant by the API key, so neither is a body member. Idempotency-Key is required and binds the body as it does on POST /v1/assessments.
8
+ class AssessmentOutcomeRequest
9
+ extend T::Sig
10
+ include Crystalline::MetadataFields
11
+
12
+ # What the provider later learned about the assessed account. confirmed_abuse, account_takeover and chargeback report abuse; false_positive and legitimate withdraw an earlier abuse report of this tenant for the assessment; unknown is recorded only. Outcomes are append-only and the latest one recorded for an assessment wins.
13
+ field(
14
+ :outcome,
15
+ Models::Shared::Outcome,
16
+ {
17
+ 'format_json': {
18
+ 'letter_case': ::NoResponse::Utils.field_name("outcome"),
19
+ required: true,
20
+ 'decoder': ::NoResponse::Utils.open_enum_from_string(Models::Shared::Outcome, false)
21
+ }
22
+ }
23
+ )
24
+ # When the provider observed the outcome. Defaults to when NoResponse received it.
25
+ field(
26
+ :observed_at,
27
+ Crystalline::Nilable.new(::String),
28
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("observed_at")}}
29
+ )
30
+ # Your own opaque reference for the outcome, such as a case or ticket id. Stored as given and not interpreted; keep direct identifiers out of it.
31
+ field(
32
+ :external_ref,
33
+ Crystalline::Nilable.new(::String),
34
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("external_ref")}}
35
+ )
36
+ # Free text for your own records, at most 500 characters. Stored only; it is left out of scoring and answers. Keep personal data out of it. Control characters other than tab and line breaks are refused.
37
+ field(
38
+ :notes,
39
+ Crystalline::Nilable.new(::String),
40
+ {'format_json': {'letter_case': ::NoResponse::Utils.field_name("notes")}}
41
+ )
42
+
43
+ sig {
44
+ params(
45
+ outcome: Models::Shared::Outcome,
46
+ observed_at: T.nilable(::String),
47
+ external_ref: T.nilable(::String),
48
+ notes: T.nilable(::String)
49
+ )
50
+ .void
51
+ }
52
+ def initialize(outcome:, observed_at: nil, external_ref: nil, notes: nil)
53
+ @outcome = outcome
54
+ @observed_at = observed_at
55
+ @external_ref = external_ref
56
+ @notes = notes
57
+ end
58
+
59
+ sig { params(other: T.untyped).returns(T::Boolean) }
60
+ def ==(other)
61
+ return false unless other.is_a?(self.class)
62
+ return false unless @outcome == other.outcome
63
+ return false unless @observed_at == other.observed_at
64
+ return false unless @external_ref == other.external_ref
65
+ return false unless @notes == other.notes
66
+ true
67
+ end
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,32 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ class NoResponse::Models::Shared::AssessmentOutcomeRequest
5
+ extend ::Crystalline::MetadataFields::ClassMethods
6
+ end
7
+
8
+ class NoResponse::Models::Shared::AssessmentOutcomeRequest
9
+ def outcome
10
+ end
11
+
12
+ def outcome=(str_)
13
+ end
14
+
15
+ def observed_at
16
+ end
17
+
18
+ def observed_at=(str_)
19
+ end
20
+
21
+ def external_ref
22
+ end
23
+
24
+ def external_ref=(str_)
25
+ end
26
+
27
+ def notes
28
+ end
29
+
30
+ def notes=(str_)
31
+ end
32
+ end