sentdm 0.33.0 → 0.35.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 (203) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +15 -0
  3. data/README.md +11 -9
  4. data/lib/sentdm/client.rb +25 -0
  5. data/lib/sentdm/internal/calls_page.rb +115 -0
  6. data/lib/sentdm/models/api_response_of_call.rb +43 -0
  7. data/lib/sentdm/models/api_response_of_call_recordings.rb +43 -0
  8. data/lib/sentdm/models/api_response_of_calls_list.rb +42 -0
  9. data/lib/sentdm/models/call.rb +133 -0
  10. data/lib/sentdm/models/call_event.rb +72 -0
  11. data/lib/sentdm/models/call_event_payload.rb +102 -0
  12. data/lib/sentdm/models/call_hangup_params.rb +32 -0
  13. data/lib/sentdm/models/call_list_params.rb +83 -0
  14. data/lib/sentdm/models/call_list_recordings_params.rb +26 -0
  15. data/lib/sentdm/models/call_party.rb +31 -0
  16. data/lib/sentdm/models/call_record_params.rb +55 -0
  17. data/lib/sentdm/models/call_recording.rb +38 -0
  18. data/lib/sentdm/models/call_recordings.rb +24 -0
  19. data/lib/sentdm/models/call_retrieve_params.rb +26 -0
  20. data/lib/sentdm/models/call_timeline_entry.rb +26 -0
  21. data/lib/sentdm/models/calls/api_response_of_list_of_call_participant.rb +45 -0
  22. data/lib/sentdm/models/calls/call_participant.rb +60 -0
  23. data/lib/sentdm/models/calls/call_participant_target.rb +30 -0
  24. data/lib/sentdm/models/calls/participant_add_params.rb +66 -0
  25. data/lib/sentdm/models/calls/participant_list_params.rb +28 -0
  26. data/lib/sentdm/models/calls/participant_remove_all_params.rb +28 -0
  27. data/lib/sentdm/models/calls/participant_remove_params.rb +34 -0
  28. data/lib/sentdm/models/calls/participant_update_params.rb +64 -0
  29. data/lib/sentdm/models/calls_list.rb +26 -0
  30. data/lib/sentdm/models/channel_event_payload.rb +16 -6
  31. data/lib/sentdm/models/channels/api_response_of_list_of_voice_number.rb +45 -0
  32. data/lib/sentdm/models/channels/api_response_of_voice_callback_test.rb +45 -0
  33. data/lib/sentdm/models/channels/api_response_of_voice_number.rb +45 -0
  34. data/lib/sentdm/models/channels/api_response_of_voice_number_created.rb +45 -0
  35. data/lib/sentdm/models/channels/api_response_of_voice_secret.rb +45 -0
  36. data/lib/sentdm/models/channels/api_response_of_voice_token.rb +45 -0
  37. data/lib/sentdm/models/channels/voice_callback_test.rb +65 -0
  38. data/lib/sentdm/models/channels/voice_callback_test_error_info.rb +41 -0
  39. data/lib/sentdm/models/channels/voice_callback_test_request_info.rb +40 -0
  40. data/lib/sentdm/models/channels/voice_callback_test_response_info.rb +28 -0
  41. data/lib/sentdm/models/channels/voice_create_params.rb +86 -0
  42. data/lib/sentdm/models/channels/voice_create_token_params.rb +69 -0
  43. data/lib/sentdm/models/channels/voice_list_params.rb +22 -0
  44. data/lib/sentdm/models/channels/voice_number.rb +68 -0
  45. data/lib/sentdm/models/channels/voice_number_created.rb +26 -0
  46. data/lib/sentdm/models/channels/voice_retrieve_params.rb +28 -0
  47. data/lib/sentdm/models/channels/voice_rotate_secret_params.rb +34 -0
  48. data/lib/sentdm/models/channels/voice_secret.rb +25 -0
  49. data/lib/sentdm/models/channels/voice_test_params.rb +34 -0
  50. data/lib/sentdm/models/channels/voice_token.rb +44 -0
  51. data/lib/sentdm/models/channels/voice_update_params.rb +95 -0
  52. data/lib/sentdm/models/conversation_messages_list.rb +100 -13
  53. data/lib/sentdm/models/inbound_message_event_payload.rb +70 -3
  54. data/lib/sentdm/models/me_retrieve_response.rb +21 -1
  55. data/lib/sentdm/models/message_event_payload.rb +23 -1
  56. data/lib/sentdm/models/message_retrieve_activities_response.rb +23 -1
  57. data/lib/sentdm/models/message_retrieve_status_response.rb +100 -13
  58. data/lib/sentdm/models/template_create_params.rb +11 -1
  59. data/lib/sentdm/models/webhook_create_params.rb +31 -1
  60. data/lib/sentdm/models/webhook_list_events_response.rb +7 -3
  61. data/lib/sentdm/models/webhook_update_params.rb +31 -1
  62. data/lib/sentdm/models.rb +36 -0
  63. data/lib/sentdm/resources/calls/participants.rb +231 -0
  64. data/lib/sentdm/resources/calls.rb +235 -0
  65. data/lib/sentdm/resources/channels/voice.rb +381 -0
  66. data/lib/sentdm/resources/channels.rb +45 -0
  67. data/lib/sentdm/resources/me.rb +5 -0
  68. data/lib/sentdm/resources/templates.rb +3 -1
  69. data/lib/sentdm/resources/webhooks.rb +9 -3
  70. data/lib/sentdm/version.rb +1 -1
  71. data/lib/sentdm.rb +50 -0
  72. data/rbi/sentdm/client.rbi +23 -0
  73. data/rbi/sentdm/internal/calls_page.rbi +71 -0
  74. data/rbi/sentdm/models/api_response_of_call.rbi +74 -0
  75. data/rbi/sentdm/models/api_response_of_call_recordings.rbi +74 -0
  76. data/rbi/sentdm/models/api_response_of_calls_list.rbi +74 -0
  77. data/rbi/sentdm/models/call.rbi +177 -0
  78. data/rbi/sentdm/models/call_event.rbi +114 -0
  79. data/rbi/sentdm/models/call_event_payload.rbi +135 -0
  80. data/rbi/sentdm/models/call_hangup_params.rbi +59 -0
  81. data/rbi/sentdm/models/call_list_params.rbi +112 -0
  82. data/rbi/sentdm/models/call_list_recordings_params.rbi +46 -0
  83. data/rbi/sentdm/models/call_party.rbi +41 -0
  84. data/rbi/sentdm/models/call_record_params.rbi +83 -0
  85. data/rbi/sentdm/models/call_recording.rbi +59 -0
  86. data/rbi/sentdm/models/call_recordings.rbi +39 -0
  87. data/rbi/sentdm/models/call_retrieve_params.rbi +46 -0
  88. data/rbi/sentdm/models/call_timeline_entry.rbi +40 -0
  89. data/rbi/sentdm/models/calls/api_response_of_list_of_call_participant.rbi +76 -0
  90. data/rbi/sentdm/models/calls/call_participant.rbi +92 -0
  91. data/rbi/sentdm/models/calls/call_participant_target.rbi +47 -0
  92. data/rbi/sentdm/models/calls/participant_add_params.rbi +98 -0
  93. data/rbi/sentdm/models/calls/participant_list_params.rbi +51 -0
  94. data/rbi/sentdm/models/calls/participant_remove_all_params.rbi +51 -0
  95. data/rbi/sentdm/models/calls/participant_remove_params.rbi +61 -0
  96. data/rbi/sentdm/models/calls/participant_update_params.rbi +94 -0
  97. data/rbi/sentdm/models/calls_list.rbi +47 -0
  98. data/rbi/sentdm/models/channel_event_payload.rbi +20 -8
  99. data/rbi/sentdm/models/channels/api_response_of_list_of_voice_number.rbi +76 -0
  100. data/rbi/sentdm/models/channels/api_response_of_voice_callback_test.rbi +83 -0
  101. data/rbi/sentdm/models/channels/api_response_of_voice_number.rbi +81 -0
  102. data/rbi/sentdm/models/channels/api_response_of_voice_number_created.rbi +83 -0
  103. data/rbi/sentdm/models/channels/api_response_of_voice_secret.rbi +81 -0
  104. data/rbi/sentdm/models/channels/api_response_of_voice_token.rbi +81 -0
  105. data/rbi/sentdm/models/channels/voice_callback_test.rbi +126 -0
  106. data/rbi/sentdm/models/channels/voice_callback_test_error_info.rbi +65 -0
  107. data/rbi/sentdm/models/channels/voice_callback_test_request_info.rbi +66 -0
  108. data/rbi/sentdm/models/channels/voice_callback_test_response_info.rbi +48 -0
  109. data/rbi/sentdm/models/channels/voice_create_params.rbi +127 -0
  110. data/rbi/sentdm/models/channels/voice_create_token_params.rbi +104 -0
  111. data/rbi/sentdm/models/channels/voice_list_params.rbi +40 -0
  112. data/rbi/sentdm/models/channels/voice_number.rbi +105 -0
  113. data/rbi/sentdm/models/channels/voice_number_created.rbi +42 -0
  114. data/rbi/sentdm/models/channels/voice_retrieve_params.rbi +51 -0
  115. data/rbi/sentdm/models/channels/voice_rotate_secret_params.rbi +64 -0
  116. data/rbi/sentdm/models/channels/voice_secret.rbi +35 -0
  117. data/rbi/sentdm/models/channels/voice_test_params.rbi +61 -0
  118. data/rbi/sentdm/models/channels/voice_token.rbi +76 -0
  119. data/rbi/sentdm/models/channels/voice_update_params.rbi +158 -0
  120. data/rbi/sentdm/models/conversation_messages_list.rbi +122 -19
  121. data/rbi/sentdm/models/inbound_message_event_payload.rbi +110 -2
  122. data/rbi/sentdm/models/me_retrieve_response.rbi +35 -0
  123. data/rbi/sentdm/models/message_event_payload.rbi +28 -0
  124. data/rbi/sentdm/models/message_retrieve_activities_response.rbi +26 -0
  125. data/rbi/sentdm/models/message_retrieve_status_response.rbi +122 -19
  126. data/rbi/sentdm/models/template_create_params.rbi +15 -0
  127. data/rbi/sentdm/models/webhook_create_params.rbi +61 -0
  128. data/rbi/sentdm/models/webhook_list_events_response.rbi +6 -3
  129. data/rbi/sentdm/models/webhook_update_params.rbi +61 -0
  130. data/rbi/sentdm/models.rbi +36 -0
  131. data/rbi/sentdm/resources/calls/participants.rbi +199 -0
  132. data/rbi/sentdm/resources/calls.rbi +206 -0
  133. data/rbi/sentdm/resources/channels/voice.rbi +371 -0
  134. data/rbi/sentdm/resources/channels.rbi +42 -0
  135. data/rbi/sentdm/resources/me.rbi +5 -0
  136. data/rbi/sentdm/resources/templates.rbi +6 -0
  137. data/rbi/sentdm/resources/webhooks.rbi +15 -1
  138. data/sig/sentdm/client.rbs +4 -0
  139. data/sig/sentdm/internal/calls_page.rbs +41 -0
  140. data/sig/sentdm/models/api_response_of_call.rbs +39 -0
  141. data/sig/sentdm/models/api_response_of_call_recordings.rbs +39 -0
  142. data/sig/sentdm/models/api_response_of_calls_list.rbs +39 -0
  143. data/sig/sentdm/models/call.rbs +101 -0
  144. data/sig/sentdm/models/call_event.rbs +44 -0
  145. data/sig/sentdm/models/call_event_payload.rbs +68 -0
  146. data/sig/sentdm/models/call_hangup_params.rbs +38 -0
  147. data/sig/sentdm/models/call_list_params.rbs +67 -0
  148. data/sig/sentdm/models/call_list_recordings_params.rbs +30 -0
  149. data/sig/sentdm/models/call_party.rbs +17 -0
  150. data/sig/sentdm/models/call_record_params.rbs +54 -0
  151. data/sig/sentdm/models/call_recording.rbs +32 -0
  152. data/sig/sentdm/models/call_recordings.rbs +17 -0
  153. data/sig/sentdm/models/call_retrieve_params.rbs +30 -0
  154. data/sig/sentdm/models/call_timeline_entry.rbs +19 -0
  155. data/sig/sentdm/models/calls/api_response_of_list_of_call_participant.rbs +41 -0
  156. data/sig/sentdm/models/calls/call_participant.rbs +52 -0
  157. data/sig/sentdm/models/calls/call_participant_target.rbs +23 -0
  158. data/sig/sentdm/models/calls/participant_add_params.rbs +63 -0
  159. data/sig/sentdm/models/calls/participant_list_params.rbs +32 -0
  160. data/sig/sentdm/models/calls/participant_remove_all_params.rbs +34 -0
  161. data/sig/sentdm/models/calls/participant_remove_params.rbs +40 -0
  162. data/sig/sentdm/models/calls/participant_update_params.rbs +61 -0
  163. data/sig/sentdm/models/calls_list.rbs +26 -0
  164. data/sig/sentdm/models/channel_event_payload.rbs +5 -0
  165. data/sig/sentdm/models/channels/api_response_of_list_of_voice_number.rbs +41 -0
  166. data/sig/sentdm/models/channels/api_response_of_voice_callback_test.rbs +41 -0
  167. data/sig/sentdm/models/channels/api_response_of_voice_number.rbs +41 -0
  168. data/sig/sentdm/models/channels/api_response_of_voice_number_created.rbs +41 -0
  169. data/sig/sentdm/models/channels/api_response_of_voice_secret.rbs +41 -0
  170. data/sig/sentdm/models/channels/api_response_of_voice_token.rbs +41 -0
  171. data/sig/sentdm/models/channels/voice_callback_test.rbs +51 -0
  172. data/sig/sentdm/models/channels/voice_callback_test_error_info.rbs +28 -0
  173. data/sig/sentdm/models/channels/voice_callback_test_request_info.rbs +34 -0
  174. data/sig/sentdm/models/channels/voice_callback_test_response_info.rbs +20 -0
  175. data/sig/sentdm/models/channels/voice_create_params.rbs +64 -0
  176. data/sig/sentdm/models/channels/voice_create_token_params.rbs +61 -0
  177. data/sig/sentdm/models/channels/voice_list_params.rbs +27 -0
  178. data/sig/sentdm/models/channels/voice_number.rbs +57 -0
  179. data/sig/sentdm/models/channels/voice_number_created.rbs +17 -0
  180. data/sig/sentdm/models/channels/voice_retrieve_params.rbs +32 -0
  181. data/sig/sentdm/models/channels/voice_rotate_secret_params.rbs +40 -0
  182. data/sig/sentdm/models/channels/voice_secret.rbs +17 -0
  183. data/sig/sentdm/models/channels/voice_test_params.rbs +40 -0
  184. data/sig/sentdm/models/channels/voice_token.rbs +40 -0
  185. data/sig/sentdm/models/channels/voice_update_params.rbs +78 -0
  186. data/sig/sentdm/models/conversation_messages_list.rbs +56 -8
  187. data/sig/sentdm/models/inbound_message_event_payload.rbs +37 -0
  188. data/sig/sentdm/models/me_retrieve_response.rbs +7 -0
  189. data/sig/sentdm/models/message_event_payload.rbs +10 -0
  190. data/sig/sentdm/models/message_retrieve_activities_response.rbs +10 -0
  191. data/sig/sentdm/models/message_retrieve_status_response.rbs +56 -8
  192. data/sig/sentdm/models/template_create_params.rbs +7 -0
  193. data/sig/sentdm/models/webhook_create_params.rbs +29 -0
  194. data/sig/sentdm/models/webhook_list_events_response.rbs +1 -0
  195. data/sig/sentdm/models/webhook_update_params.rbs +29 -0
  196. data/sig/sentdm/models.rbs +36 -0
  197. data/sig/sentdm/resources/calls/participants.rbs +50 -0
  198. data/sig/sentdm/resources/calls.rbs +50 -0
  199. data/sig/sentdm/resources/channels/voice.rbs +68 -0
  200. data/sig/sentdm/resources/channels.rbs +9 -0
  201. data/sig/sentdm/resources/templates.rbs +1 -0
  202. data/sig/sentdm/resources/webhooks.rbs +2 -0
  203. metadata +152 -2
@@ -0,0 +1,61 @@
1
+ # typed: strong
2
+
3
+ module Sentdm
4
+ module Models
5
+ module Channels
6
+ class VoiceTestParams < Sentdm::Models::MutationRequest
7
+ extend Sentdm::Internal::Type::RequestParameters::Converter
8
+ include Sentdm::Internal::Type::RequestParameters
9
+
10
+ OrHash =
11
+ T.type_alias do
12
+ T.any(Sentdm::Channels::VoiceTestParams, Sentdm::Internal::AnyHash)
13
+ end
14
+
15
+ sig { returns(String) }
16
+ attr_accessor :number
17
+
18
+ sig { returns(T.nilable(String)) }
19
+ attr_reader :idempotency_key
20
+
21
+ sig { params(idempotency_key: String).void }
22
+ attr_writer :idempotency_key
23
+
24
+ sig { returns(T.nilable(String)) }
25
+ attr_reader :x_profile_id
26
+
27
+ sig { params(x_profile_id: String).void }
28
+ attr_writer :x_profile_id
29
+
30
+ sig do
31
+ params(
32
+ number: String,
33
+ idempotency_key: String,
34
+ x_profile_id: String,
35
+ request_options: Sentdm::RequestOptions::OrHash
36
+ ).returns(T.attached_class)
37
+ end
38
+ def self.new(
39
+ number:,
40
+ idempotency_key: nil,
41
+ x_profile_id: nil,
42
+ request_options: {}
43
+ )
44
+ end
45
+
46
+ sig do
47
+ override.returns(
48
+ {
49
+ number: String,
50
+ idempotency_key: String,
51
+ x_profile_id: String,
52
+ request_options: Sentdm::RequestOptions
53
+ }
54
+ )
55
+ end
56
+ def to_hash
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,76 @@
1
+ # typed: strong
2
+
3
+ module Sentdm
4
+ module Models
5
+ module Channels
6
+ class VoiceToken < Sentdm::Internal::Type::BaseModel
7
+ OrHash =
8
+ T.type_alias do
9
+ T.any(Sentdm::Channels::VoiceToken, Sentdm::Internal::AnyHash)
10
+ end
11
+
12
+ # The signed token. Hand it to the client SDK unchanged.
13
+ sig { returns(T.nilable(String)) }
14
+ attr_reader :token
15
+
16
+ sig { params(token: String).void }
17
+ attr_writer :token
18
+
19
+ # When the token expires (UTC)
20
+ sig { returns(T.nilable(Time)) }
21
+ attr_reader :expires_at
22
+
23
+ sig { params(expires_at: Time).void }
24
+ attr_writer :expires_at
25
+
26
+ # The identity the token was minted for
27
+ sig { returns(T.nilable(String)) }
28
+ attr_reader :identity
29
+
30
+ sig { params(identity: String).void }
31
+ attr_writer :identity
32
+
33
+ # The phone number this identity is now bound to, in E.164 format
34
+ sig { returns(T.nilable(String)) }
35
+ attr_reader :number
36
+
37
+ sig { params(number: String).void }
38
+ attr_writer :number
39
+
40
+ # A short-lived token your app passes to the voice client SDK to register
41
+ sig do
42
+ params(
43
+ token: String,
44
+ expires_at: Time,
45
+ identity: String,
46
+ number: String
47
+ ).returns(T.attached_class)
48
+ end
49
+ def self.new(
50
+ # The signed token. Hand it to the client SDK unchanged.
51
+ token: nil,
52
+ # When the token expires (UTC)
53
+ expires_at: nil,
54
+ # The identity the token was minted for
55
+ identity: nil,
56
+ # The phone number this identity is now bound to, in E.164 format
57
+ number: nil
58
+ )
59
+ end
60
+
61
+ sig do
62
+ override.returns(
63
+ {
64
+ token: String,
65
+ expires_at: Time,
66
+ identity: String,
67
+ number: String
68
+ }
69
+ )
70
+ end
71
+ def to_hash
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,158 @@
1
+ # typed: strong
2
+
3
+ module Sentdm
4
+ module Models
5
+ module Channels
6
+ class VoiceUpdateParams < Sentdm::Internal::Type::BaseModel
7
+ extend Sentdm::Internal::Type::RequestParameters::Converter
8
+ include Sentdm::Internal::Type::RequestParameters
9
+
10
+ OrHash =
11
+ T.type_alias do
12
+ T.any(
13
+ Sentdm::Channels::VoiceUpdateParams,
14
+ Sentdm::Internal::AnyHash
15
+ )
16
+ end
17
+
18
+ sig { returns(String) }
19
+ attr_accessor :number
20
+
21
+ # A new callback URL for the number, active or not: an absolute HTTP or HTTPS URL
22
+ # on a public host, where Sent asks what to do with each call. The signing secret
23
+ # is kept.
24
+ sig { returns(T.nilable(String)) }
25
+ attr_accessor :callback_url
26
+
27
+ # true makes this the line app-originated calls are placed from when a voice token
28
+ # names no number. false is refused: an account with active voice numbers always
29
+ # has exactly one default, so the default moves by giving it to another number.
30
+ sig { returns(T.nilable(T::Boolean)) }
31
+ attr_accessor :default_for_app_calls
32
+
33
+ # Sandbox flag - when true, the operation is simulated without side effects Useful
34
+ # for testing integrations without actual execution
35
+ sig { returns(T.nilable(T::Boolean)) }
36
+ attr_reader :sandbox
37
+
38
+ sig { params(sandbox: T::Boolean).void }
39
+ attr_writer :sandbox
40
+
41
+ # ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
42
+ # ignoring case. Turning the default line off is refused while other active voice
43
+ # numbers remain.
44
+ sig do
45
+ returns(
46
+ T.nilable(Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol)
47
+ )
48
+ end
49
+ attr_accessor :status
50
+
51
+ sig { returns(T.nilable(String)) }
52
+ attr_reader :idempotency_key
53
+
54
+ sig { params(idempotency_key: String).void }
55
+ attr_writer :idempotency_key
56
+
57
+ sig { returns(T.nilable(String)) }
58
+ attr_reader :x_profile_id
59
+
60
+ sig { params(x_profile_id: String).void }
61
+ attr_writer :x_profile_id
62
+
63
+ sig do
64
+ params(
65
+ number: String,
66
+ callback_url: T.nilable(String),
67
+ default_for_app_calls: T.nilable(T::Boolean),
68
+ sandbox: T::Boolean,
69
+ status:
70
+ T.nilable(Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol),
71
+ idempotency_key: String,
72
+ x_profile_id: String,
73
+ request_options: Sentdm::RequestOptions::OrHash
74
+ ).returns(T.attached_class)
75
+ end
76
+ def self.new(
77
+ number:,
78
+ # A new callback URL for the number, active or not: an absolute HTTP or HTTPS URL
79
+ # on a public host, where Sent asks what to do with each call. The signing secret
80
+ # is kept.
81
+ callback_url: nil,
82
+ # true makes this the line app-originated calls are placed from when a voice token
83
+ # names no number. false is refused: an account with active voice numbers always
84
+ # has exactly one default, so the default moves by giving it to another number.
85
+ default_for_app_calls: nil,
86
+ # Sandbox flag - when true, the operation is simulated without side effects Useful
87
+ # for testing integrations without actual execution
88
+ sandbox: nil,
89
+ # ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
90
+ # ignoring case. Turning the default line off is refused while other active voice
91
+ # numbers remain.
92
+ status: nil,
93
+ idempotency_key: nil,
94
+ x_profile_id: nil,
95
+ request_options: {}
96
+ )
97
+ end
98
+
99
+ sig do
100
+ override.returns(
101
+ {
102
+ number: String,
103
+ callback_url: T.nilable(String),
104
+ default_for_app_calls: T.nilable(T::Boolean),
105
+ sandbox: T::Boolean,
106
+ status:
107
+ T.nilable(
108
+ Sentdm::Channels::VoiceUpdateParams::Status::OrSymbol
109
+ ),
110
+ idempotency_key: String,
111
+ x_profile_id: String,
112
+ request_options: Sentdm::RequestOptions
113
+ }
114
+ )
115
+ end
116
+ def to_hash
117
+ end
118
+
119
+ # ACTIVE turns calls on for the number again, INACTIVE turns them off. Matched
120
+ # ignoring case. Turning the default line off is refused while other active voice
121
+ # numbers remain.
122
+ module Status
123
+ extend Sentdm::Internal::Type::Enum
124
+
125
+ TaggedSymbol =
126
+ T.type_alias do
127
+ T.all(Symbol, Sentdm::Channels::VoiceUpdateParams::Status)
128
+ end
129
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
130
+
131
+ # Turns calls on for the number again. The callback URL and the signing secret it had are kept; send `callback_url` in the same call to replace the URL.
132
+ ACTIVE =
133
+ T.let(
134
+ :ACTIVE,
135
+ Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
136
+ )
137
+
138
+ # Turns calls off for the number. Refused while the number is the default line for app calls and other active voice numbers remain; move the default first. The callback URL and the secret stay on the number.
139
+ INACTIVE =
140
+ T.let(
141
+ :INACTIVE,
142
+ Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
143
+ )
144
+
145
+ sig do
146
+ override.returns(
147
+ T::Array[
148
+ Sentdm::Channels::VoiceUpdateParams::Status::TaggedSymbol
149
+ ]
150
+ )
151
+ end
152
+ def self.values
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end
158
+ end
@@ -152,6 +152,20 @@ module Sentdm
152
152
  sig { returns(T.nilable(Float)) }
153
153
  attr_accessor :price
154
154
 
155
+ # A human-readable sentence for reason_code, for example "Insufficient balance".
156
+ # Omitted whenever reason_code is.
157
+ sig { returns(T.nilable(String)) }
158
+ attr_accessor :reason
159
+
160
+ # Why the message is at its current status, as a stable platform code such as
161
+ # DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
162
+ # FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
163
+ # Switch on this rather than on reason: the code is stable, the wording may be
164
+ # improved. It is the platform's classification of the outcome, never a carrier or
165
+ # vendor code.
166
+ sig { returns(T.nilable(String)) }
167
+ attr_accessor :reason_code
168
+
155
169
  sig { returns(T.nilable(String)) }
156
170
  attr_reader :region_code
157
171
 
@@ -201,6 +215,8 @@ module Sentdm
201
215
  phone: String,
202
216
  phone_international: String,
203
217
  price: T.nilable(Float),
218
+ reason: T.nilable(String),
219
+ reason_code: T.nilable(String),
204
220
  region_code: String,
205
221
  status: String,
206
222
  template_category: T.nilable(String),
@@ -230,6 +246,16 @@ module Sentdm
230
246
  phone: nil,
231
247
  phone_international: nil,
232
248
  price: nil,
249
+ # A human-readable sentence for reason_code, for example "Insufficient balance".
250
+ # Omitted whenever reason_code is.
251
+ reason: nil,
252
+ # Why the message is at its current status, as a stable platform code such as
253
+ # DELIVERY_007, BUSINESS_003 or DELIVERY_003. Present when the current status is
254
+ # FAILED, FILTERED or BLOCKED and the lifecycle was loaded; omitted otherwise.
255
+ # Switch on this rather than on reason: the code is stable, the wording may be
256
+ # improved. It is the platform's classification of the outcome, never a carrier or
257
+ # vendor code.
258
+ reason_code: nil,
233
259
  region_code: nil,
234
260
  status: nil,
235
261
  template_category: nil,
@@ -259,6 +285,8 @@ module Sentdm
259
285
  phone: String,
260
286
  phone_international: String,
261
287
  price: T.nilable(Float),
288
+ reason: T.nilable(String),
289
+ reason_code: T.nilable(String),
262
290
  region_code: String,
263
291
  status: String,
264
292
  template_category: T.nilable(String),
@@ -288,15 +316,39 @@ module Sentdm
288
316
  sig { returns(T.nilable(String)) }
289
317
  attr_accessor :description
290
318
 
319
+ # A human-readable sentence for reason_code. Omitted whenever reason_code is.
320
+ sig { returns(T.nilable(String)) }
321
+ attr_accessor :reason
322
+
323
+ # Why the message reached this status, as a stable platform code such as
324
+ # DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
325
+ # status that needs no explanation. Same wire name and vocabulary as on the
326
+ # activities list and the webhook.
327
+ sig { returns(T.nilable(String)) }
328
+ attr_accessor :reason_code
329
+
291
330
  # Represents a status change event in a message's lifecycle (v3)
292
331
  sig do
293
332
  params(
294
333
  status: String,
295
334
  timestamp: Time,
296
- description: T.nilable(String)
335
+ description: T.nilable(String),
336
+ reason: T.nilable(String),
337
+ reason_code: T.nilable(String)
297
338
  ).returns(T.attached_class)
298
339
  end
299
- def self.new(status:, timestamp:, description: nil)
340
+ def self.new(
341
+ status:,
342
+ timestamp:,
343
+ description: nil,
344
+ # A human-readable sentence for reason_code. Omitted whenever reason_code is.
345
+ reason: nil,
346
+ # Why the message reached this status, as a stable platform code such as
347
+ # DELIVERY_007. Present on FAILED, FILTERED and BLOCKED events; omitted on every
348
+ # status that needs no explanation. Same wire name and vocabulary as on the
349
+ # activities list and the webhook.
350
+ reason_code: nil
351
+ )
300
352
  end
301
353
 
302
354
  sig do
@@ -304,7 +356,9 @@ module Sentdm
304
356
  {
305
357
  status: String,
306
358
  timestamp: Time,
307
- description: T.nilable(String)
359
+ description: T.nilable(String),
360
+ reason: T.nilable(String),
361
+ reason_code: T.nilable(String)
308
362
  }
309
363
  )
310
364
  end
@@ -571,38 +625,87 @@ module Sentdm
571
625
  )
572
626
  end
573
627
 
574
- # One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
575
- # fetched object's Content-Type, not this.
628
+ # One of MmsMediaTypes when the content type is known. Advisory — a reader should
629
+ # trust the fetched object's own Content-Type.
576
630
  sig { returns(T.nilable(String)) }
577
631
  attr_accessor :media_type
578
632
 
633
+ # Content type as the provider declared it. Null when it declared none.
579
634
  sig { returns(T.nilable(String)) }
580
- attr_reader :url
635
+ attr_accessor :mime_type
581
636
 
582
- sig { params(url: String).void }
583
- attr_writer :url
637
+ # Size as the provider declared it. Never measured here — nothing downloads the
638
+ # file.
639
+ sig { returns(T.nilable(Integer)) }
640
+ attr_accessor :size_bytes
584
641
 
585
- # One attachment on a message: a customer-supplied public URL handed to the
586
- # carrier as-is.
642
+ # Inbound only: the SHA-256 the provider declared alongside the attachment, when
643
+ # it declared one. Relayed to the customer so they can verify what they fetch
644
+ # matches what the carrier said it sent. It is the only integrity signal available
645
+ # on an attachment nobody here has read.
646
+ sig { returns(T.nilable(String)) }
647
+ attr_accessor :source_hash_sha256
648
+
649
+ # Where the file lives. Outbound: the URL the customer gave us and the carrier
650
+ # fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
651
+ sig { returns(T.nilable(String)) }
652
+ attr_accessor :url
653
+
654
+ # One attachment on a message, in either direction — and in both, a URL somebody
655
+ # else hosts.
587
656
  #
588
- # A URL and nothing else. sent.dm never takes custody of MMS media — the customer hosts it and we
589
- # pass the link through at send time — so there is no storage key, size or expiry to record. If we ever
590
- # do host attachments, that belongs with the change that introduces the hosting, not here.
657
+ # Outbound: the customer supplied a public URL and we handed it to the carrier.
658
+ # Inbound: the carrier hosts the file and we record where. sent.dm never holds the
659
+ # bytes, so there is no key, no expiry bookkeeping and nothing minted per read —
660
+ # what is stored is what is served.
661
+ #
662
+ # An inbound link expires on the carrier's own schedule and is unauthenticated.
663
+ # That is the customer's to manage, and it is documented where they will see it
664
+ # rather than only here — a recipient who needs an attachment to outlive that
665
+ # window copies it on receipt.
666
+ #
667
+ # Storing a presigned URL is the specific mistake this shape still avoids:
668
+ # M260826130000 and M260826140000 exist because RCS assets were stored as signed
669
+ # URLs and went stale. Nothing here is signed.
591
670
  sig do
592
- params(media_type: T.nilable(String), url: String).returns(
593
- T.attached_class
594
- )
671
+ params(
672
+ media_type: T.nilable(String),
673
+ mime_type: T.nilable(String),
674
+ size_bytes: T.nilable(Integer),
675
+ source_hash_sha256: T.nilable(String),
676
+ url: T.nilable(String)
677
+ ).returns(T.attached_class)
595
678
  end
596
679
  def self.new(
597
- # One of Constants.MmsMediaTypes when known. Advisory — the carrier reads the
598
- # fetched object's Content-Type, not this.
680
+ # One of MmsMediaTypes when the content type is known. Advisory — a reader should
681
+ # trust the fetched object's own Content-Type.
599
682
  media_type: nil,
683
+ # Content type as the provider declared it. Null when it declared none.
684
+ mime_type: nil,
685
+ # Size as the provider declared it. Never measured here — nothing downloads the
686
+ # file.
687
+ size_bytes: nil,
688
+ # Inbound only: the SHA-256 the provider declared alongside the attachment, when
689
+ # it declared one. Relayed to the customer so they can verify what they fetch
690
+ # matches what the carrier said it sent. It is the only integrity signal available
691
+ # on an attachment nobody here has read.
692
+ source_hash_sha256: nil,
693
+ # Where the file lives. Outbound: the URL the customer gave us and the carrier
694
+ # fetched. Inbound: the URL the carrier hosts it at, relayed unchanged.
600
695
  url: nil
601
696
  )
602
697
  end
603
698
 
604
699
  sig do
605
- override.returns({ media_type: T.nilable(String), url: String })
700
+ override.returns(
701
+ {
702
+ media_type: T.nilable(String),
703
+ mime_type: T.nilable(String),
704
+ size_bytes: T.nilable(Integer),
705
+ source_hash_sha256: T.nilable(String),
706
+ url: T.nilable(String)
707
+ }
708
+ )
606
709
  end
607
710
  def to_hash
608
711
  end
@@ -23,13 +23,28 @@ module Sentdm
23
23
  sig { params(account_id: String).void }
24
24
  attr_writer :account_id
25
25
 
26
- # The channel the message arrived on, for example sms or whatsapp.
26
+ # The channel the message arrived on, for example sms or mms.
27
27
  sig { returns(T.nilable(String)) }
28
28
  attr_reader :channel
29
29
 
30
30
  sig { params(channel: String).void }
31
31
  attr_writer :channel
32
32
 
33
+ # Attachments the contact sent, present only on channels that carry them (mms
34
+ # today) and omitted entirely otherwise.
35
+ #
36
+ # Each url points at the carrier's own copy of the file — sent.dm records where
37
+ # the attachment is, not the attachment itself. The link is unauthenticated and
38
+ # expires on the carrier's schedule, which differs between them: assume days, not
39
+ # months. Download what you need on receipt; re-reading the message through GET
40
+ # /v3/messages/{id} returns the same stored link, not a fresh one, so once it
41
+ # lapses the entry remains with whatever the carrier declared about the file but
42
+ # the file is no longer reachable.
43
+ sig do
44
+ returns(T.nilable(T::Array[Sentdm::InboundMessageEventPayload::Media]))
45
+ end
46
+ attr_accessor :media
47
+
33
48
  # The inbound message.
34
49
  sig { returns(T.nilable(String)) }
35
50
  attr_reader :message_id
@@ -66,6 +81,10 @@ module Sentdm
66
81
  received_at: String,
67
82
  account_id: String,
68
83
  channel: String,
84
+ media:
85
+ T.nilable(
86
+ T::Array[Sentdm::InboundMessageEventPayload::Media::OrHash]
87
+ ),
69
88
  message_id: String,
70
89
  outbound_number: String,
71
90
  text: T.nilable(String),
@@ -79,8 +98,19 @@ module Sentdm
79
98
  received_at:,
80
99
  # The account the message belongs to.
81
100
  account_id: nil,
82
- # The channel the message arrived on, for example sms or whatsapp.
101
+ # The channel the message arrived on, for example sms or mms.
83
102
  channel: nil,
103
+ # Attachments the contact sent, present only on channels that carry them (mms
104
+ # today) and omitted entirely otherwise.
105
+ #
106
+ # Each url points at the carrier's own copy of the file — sent.dm records where
107
+ # the attachment is, not the attachment itself. The link is unauthenticated and
108
+ # expires on the carrier's schedule, which differs between them: assume days, not
109
+ # months. Download what you need on receipt; re-reading the message through GET
110
+ # /v3/messages/{id} returns the same stored link, not a fresh one, so once it
111
+ # lapses the entry remains with whatever the carrier declared about the file but
112
+ # the file is no longer reachable.
113
+ media: nil,
84
114
  # The inbound message.
85
115
  message_id: nil,
86
116
  # Your number in E.164 format, meaning the number the message was addressed to.
@@ -102,6 +132,8 @@ module Sentdm
102
132
  received_at: String,
103
133
  account_id: String,
104
134
  channel: String,
135
+ media:
136
+ T.nilable(T::Array[Sentdm::InboundMessageEventPayload::Media]),
105
137
  message_id: String,
106
138
  outbound_number: String,
107
139
  text: T.nilable(String),
@@ -111,6 +143,82 @@ module Sentdm
111
143
  end
112
144
  def to_hash
113
145
  end
146
+
147
+ class Media < Sentdm::Internal::Type::BaseModel
148
+ OrHash =
149
+ T.type_alias do
150
+ T.any(
151
+ Sentdm::InboundMessageEventPayload::Media,
152
+ Sentdm::Internal::AnyHash
153
+ )
154
+ end
155
+
156
+ # SHA-256 of the file as the carrier declared it, when it declares one. Verify
157
+ # what you download against this — sent.dm never reads the bytes, so it is the
158
+ # only integrity signal available.
159
+ sig { returns(T.nilable(String)) }
160
+ attr_accessor :hash_sha256
161
+
162
+ # Content type as the carrier reported it, for example image/jpeg.
163
+ sig { returns(T.nilable(String)) }
164
+ attr_accessor :mime_type
165
+
166
+ # Size in bytes as the carrier declared it. Absent when it declared none.
167
+ sig { returns(T.nilable(Integer)) }
168
+ attr_accessor :size_bytes
169
+
170
+ # Where the carrier hosts the attachment.
171
+ #
172
+ # This link expires and is not authenticated. sent.dm relays it rather than
173
+ # copying the file, so how long it stays fetchable is the carrier's decision and
174
+ # differs between them — assume days, not months. Anyone holding the URL can fetch
175
+ # it until it lapses. Copy the file on receipt if you need it to outlive that
176
+ # window; do not store this URL as a permanent reference.
177
+ sig { returns(T.nilable(String)) }
178
+ attr_accessor :url
179
+
180
+ # One attachment on an inbound message.
181
+ sig do
182
+ params(
183
+ hash_sha256: T.nilable(String),
184
+ mime_type: T.nilable(String),
185
+ size_bytes: T.nilable(Integer),
186
+ url: T.nilable(String)
187
+ ).returns(T.attached_class)
188
+ end
189
+ def self.new(
190
+ # SHA-256 of the file as the carrier declared it, when it declares one. Verify
191
+ # what you download against this — sent.dm never reads the bytes, so it is the
192
+ # only integrity signal available.
193
+ hash_sha256: nil,
194
+ # Content type as the carrier reported it, for example image/jpeg.
195
+ mime_type: nil,
196
+ # Size in bytes as the carrier declared it. Absent when it declared none.
197
+ size_bytes: nil,
198
+ # Where the carrier hosts the attachment.
199
+ #
200
+ # This link expires and is not authenticated. sent.dm relays it rather than
201
+ # copying the file, so how long it stays fetchable is the carrier's decision and
202
+ # differs between them — assume days, not months. Anyone holding the URL can fetch
203
+ # it until it lapses. Copy the file on receipt if you need it to outlive that
204
+ # window; do not store this URL as a permanent reference.
205
+ url: nil
206
+ )
207
+ end
208
+
209
+ sig do
210
+ override.returns(
211
+ {
212
+ hash_sha256: T.nilable(String),
213
+ mime_type: T.nilable(String),
214
+ size_bytes: T.nilable(Integer),
215
+ url: T.nilable(String)
216
+ }
217
+ )
218
+ end
219
+ def to_hash
220
+ end
221
+ end
114
222
  end
115
223
  end
116
224
  end