zavudev 0.18.0 → 0.20.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 (118) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +37 -0
  3. data/README.md +1 -1
  4. data/lib/zavudev/models/channel.rb +1 -5
  5. data/lib/zavudev/models/function_create_params.rb +36 -4
  6. data/lib/zavudev/models/function_create_response.rb +4 -2
  7. data/lib/zavudev/models/function_deploy_params.rb +31 -3
  8. data/lib/zavudev/models/function_deploy_response.rb +20 -3
  9. data/lib/zavudev/models/function_get_deployment_response.rb +20 -3
  10. data/lib/zavudev/models/function_retrieve_response.rb +4 -2
  11. data/lib/zavudev/models/function_update_params.rb +41 -3
  12. data/lib/zavudev/models/function_update_response.rb +4 -2
  13. data/lib/zavudev/models/invitation.rb +101 -9
  14. data/lib/zavudev/models/invitation_create_params.rb +34 -13
  15. data/lib/zavudev/models/invitation_list_params.rb +14 -0
  16. data/lib/zavudev/models/message.rb +28 -6
  17. data/lib/zavudev/models/message_send_params.rb +2 -5
  18. data/lib/zavudev/models/message_type.rb +16 -0
  19. data/lib/zavudev/models/phone_number_pricing.rb +7 -2
  20. data/lib/zavudev/models/phone_number_search_available_params.rb +13 -1
  21. data/lib/zavudev/models/sender.rb +12 -1
  22. data/lib/zavudev/models/sender_create_params.rb +72 -4
  23. data/lib/zavudev/models/sender_update_params.rb +65 -1
  24. data/lib/zavudev/models/sender_webhook.rb +47 -1
  25. data/lib/zavudev/models/senders/agent/agent_tool.rb +19 -1
  26. data/lib/zavudev/models/senders/agent/tool_create_params.rb +7 -2
  27. data/lib/zavudev/models/senders/agent/tool_test_response.rb +90 -5
  28. data/lib/zavudev/models/senders/agent.rb +198 -1
  29. data/lib/zavudev/models/senders/agent_create_params.rb +188 -1
  30. data/lib/zavudev/models/senders/agent_execution.rb +26 -1
  31. data/lib/zavudev/models/senders/agent_update_params.rb +188 -1
  32. data/lib/zavudev/models/template.rb +1 -0
  33. data/lib/zavudev/models/template_create_params.rb +19 -9
  34. data/lib/zavudev/models/webhook_event.rb +51 -19
  35. data/lib/zavudev/resources/broadcasts.rb +20 -4
  36. data/lib/zavudev/resources/functions.rb +35 -10
  37. data/lib/zavudev/resources/invitations.rb +18 -12
  38. data/lib/zavudev/resources/messages.rb +24 -4
  39. data/lib/zavudev/resources/number_10dlc/brands.rb +5 -1
  40. data/lib/zavudev/resources/number_10dlc/campaigns.rb +6 -1
  41. data/lib/zavudev/resources/phone_numbers.rb +12 -3
  42. data/lib/zavudev/resources/senders/agent/executions.rb +5 -0
  43. data/lib/zavudev/resources/senders/agent/tools.rb +14 -2
  44. data/lib/zavudev/resources/senders/agent.rb +18 -2
  45. data/lib/zavudev/resources/senders.rb +15 -3
  46. data/lib/zavudev/version.rb +1 -1
  47. data/rbi/zavudev/models/channel.rbi +1 -5
  48. data/rbi/zavudev/models/function_create_params.rbi +50 -2
  49. data/rbi/zavudev/models/function_create_response.rbi +6 -2
  50. data/rbi/zavudev/models/function_deploy_params.rbi +42 -2
  51. data/rbi/zavudev/models/function_deploy_response.rbi +20 -0
  52. data/rbi/zavudev/models/function_get_deployment_response.rbi +20 -0
  53. data/rbi/zavudev/models/function_retrieve_response.rbi +6 -2
  54. data/rbi/zavudev/models/function_update_params.rbi +57 -2
  55. data/rbi/zavudev/models/function_update_response.rbi +6 -2
  56. data/rbi/zavudev/models/invitation.rbi +162 -13
  57. data/rbi/zavudev/models/invitation_create_params.rbi +51 -18
  58. data/rbi/zavudev/models/invitation_list_params.rbi +17 -0
  59. data/rbi/zavudev/models/message.rbi +47 -8
  60. data/rbi/zavudev/models/message_send_params.rbi +4 -10
  61. data/rbi/zavudev/models/message_type.rbi +18 -0
  62. data/rbi/zavudev/models/phone_number_pricing.rbi +6 -2
  63. data/rbi/zavudev/models/phone_number_search_available_params.rbi +13 -0
  64. data/rbi/zavudev/models/sender.rbi +17 -0
  65. data/rbi/zavudev/models/sender_create_params.rbi +136 -4
  66. data/rbi/zavudev/models/sender_update_params.rbi +124 -0
  67. data/rbi/zavudev/models/sender_webhook.rbi +69 -0
  68. data/rbi/zavudev/models/senders/agent/agent_tool.rbi +26 -3
  69. data/rbi/zavudev/models/senders/agent/tool_create_params.rbi +6 -2
  70. data/rbi/zavudev/models/senders/agent/tool_test_response.rbi +130 -5
  71. data/rbi/zavudev/models/senders/agent.rbi +320 -3
  72. data/rbi/zavudev/models/senders/agent_create_params.rbi +304 -0
  73. data/rbi/zavudev/models/senders/agent_execution.rbi +31 -3
  74. data/rbi/zavudev/models/senders/agent_update_params.rbi +304 -0
  75. data/rbi/zavudev/models/template.rbi +5 -0
  76. data/rbi/zavudev/models/template_create_params.rbi +27 -6
  77. data/rbi/zavudev/models/webhook_event.rbi +55 -20
  78. data/rbi/zavudev/resources/broadcasts.rbi +20 -4
  79. data/rbi/zavudev/resources/functions.rbi +62 -6
  80. data/rbi/zavudev/resources/invitations.rbi +36 -16
  81. data/rbi/zavudev/resources/messages.rbi +27 -10
  82. data/rbi/zavudev/resources/number_10dlc/brands.rbi +5 -1
  83. data/rbi/zavudev/resources/number_10dlc/campaigns.rbi +6 -1
  84. data/rbi/zavudev/resources/phone_numbers.rbi +10 -2
  85. data/rbi/zavudev/resources/senders/agent/executions.rbi +5 -0
  86. data/rbi/zavudev/resources/senders/agent/tools.rbi +13 -2
  87. data/rbi/zavudev/resources/senders/agent.rbi +16 -0
  88. data/rbi/zavudev/resources/senders.rbi +56 -2
  89. data/sig/zavudev/models/channel.rbs +0 -2
  90. data/sig/zavudev/models/function_create_params.rbs +14 -0
  91. data/sig/zavudev/models/function_deploy_params.rbs +14 -0
  92. data/sig/zavudev/models/function_deploy_response.rbs +5 -0
  93. data/sig/zavudev/models/function_get_deployment_response.rbs +5 -0
  94. data/sig/zavudev/models/function_update_params.rbs +21 -0
  95. data/sig/zavudev/models/invitation.rbs +58 -3
  96. data/sig/zavudev/models/invitation_create_params.rbs +2 -2
  97. data/sig/zavudev/models/invitation_list_params.rbs +3 -1
  98. data/sig/zavudev/models/message.rbs +7 -0
  99. data/sig/zavudev/models/message_type.rbs +4 -0
  100. data/sig/zavudev/models/phone_number_search_available_params.rbs +7 -0
  101. data/sig/zavudev/models/sender.rbs +7 -0
  102. data/sig/zavudev/models/sender_create_params.rbs +35 -0
  103. data/sig/zavudev/models/sender_update_params.rbs +35 -0
  104. data/sig/zavudev/models/sender_webhook.rbs +17 -0
  105. data/sig/zavudev/models/senders/agent/agent_tool.rbs +10 -3
  106. data/sig/zavudev/models/senders/agent/tool_test_response.rbs +68 -4
  107. data/sig/zavudev/models/senders/agent.rbs +161 -3
  108. data/sig/zavudev/models/senders/agent_create_params.rbs +152 -1
  109. data/sig/zavudev/models/senders/agent_execution.rbs +13 -3
  110. data/sig/zavudev/models/senders/agent_update_params.rbs +152 -1
  111. data/sig/zavudev/models/template.rbs +2 -1
  112. data/sig/zavudev/models/template_create_params.rbs +9 -6
  113. data/sig/zavudev/models/webhook_event.rbs +10 -2
  114. data/sig/zavudev/resources/functions.rbs +7 -0
  115. data/sig/zavudev/resources/phone_numbers.rbs +1 -0
  116. data/sig/zavudev/resources/senders/agent.rbs +2 -0
  117. data/sig/zavudev/resources/senders.rbs +6 -0
  118. metadata +2 -2
@@ -16,6 +16,16 @@ module Zavudev
16
16
  sig { returns(String) }
17
17
  attr_accessor :phone_number
18
18
 
19
+ # Channels this sender can actually send on right now, computed from its
20
+ # configuration. Empty means the sender cannot send or receive anything yet: a
21
+ # phoneNumber alone does not enable SMS or voice. Check this rather than inferring
22
+ # capability from phoneNumber or emailAddress.
23
+ sig { returns(T.nilable(T::Array[String])) }
24
+ attr_reader :channels
25
+
26
+ sig { params(channels: T::Array[String]).void }
27
+ attr_writer :channels
28
+
19
29
  sig { returns(T.nilable(Time)) }
20
30
  attr_reader :created_at
21
31
 
@@ -78,6 +88,7 @@ module Zavudev
78
88
  id: String,
79
89
  name: String,
80
90
  phone_number: String,
91
+ channels: T::Array[String],
81
92
  created_at: Time,
82
93
  email_address: String,
83
94
  email_catch_all_enabled: T::Boolean,
@@ -93,6 +104,11 @@ module Zavudev
93
104
  name:,
94
105
  # Phone number in E.164 format.
95
106
  phone_number:,
107
+ # Channels this sender can actually send on right now, computed from its
108
+ # configuration. Empty means the sender cannot send or receive anything yet: a
109
+ # phoneNumber alone does not enable SMS or voice. Check this rather than inferring
110
+ # capability from phoneNumber or emailAddress.
111
+ channels: nil,
96
112
  created_at: nil,
97
113
  # From-address for the email channel, if configured.
98
114
  email_address: nil,
@@ -119,6 +135,7 @@ module Zavudev
119
135
  id: String,
120
136
  name: String,
121
137
  phone_number: String,
138
+ channels: T::Array[String],
122
139
  created_at: Time,
123
140
  email_address: String,
124
141
  email_catch_all_enabled: T::Boolean,
@@ -46,8 +46,30 @@ module Zavudev
46
46
  sig { params(email_receiving_enabled: T::Boolean).void }
47
47
  attr_writer :email_receiving_enabled
48
48
 
49
- # Phone number in E.164 format. Required for phone-based channels (SMS, WhatsApp).
50
- # Omit for an email-only sender.
49
+ # Enable the one-way SMS channel (`sms_oneway`). Needs nothing else — no phone
50
+ # number, no credential — so it is the fastest way to get a sender that can send.
51
+ # Recipients cannot reply. Confirm with `sms_oneway` in the `channels` array on
52
+ # the response.
53
+ sig { returns(T.nilable(T::Boolean)) }
54
+ attr_reader :enable_sms_oneway
55
+
56
+ sig { params(enable_sms_oneway: T::Boolean).void }
57
+ attr_writer :enable_sms_oneway
58
+
59
+ # Let this sender place and answer phone calls. Requires `phoneNumber`; enabling
60
+ # it without one returns 400. Check the `channels` array on the response to
61
+ # confirm `voice` is on.
62
+ sig { returns(T.nilable(T::Boolean)) }
63
+ attr_reader :enable_voice
64
+
65
+ sig { params(enable_voice: T::Boolean).void }
66
+ attr_writer :enable_voice
67
+
68
+ # Phone number in E.164 format, and it must be a number your project already owns
69
+ # (see `GET /v1/phone-numbers`). The number is routed to the sender as part of
70
+ # this call, which is what turns the SMS channel on. Passing a number the project
71
+ # does not own, or one already attached to another sender, returns 400 rather than
72
+ # creating a sender that cannot send. Omit for an email-only sender.
51
73
  sig { returns(T.nilable(String)) }
52
74
  attr_reader :phone_number
53
75
 
@@ -69,6 +91,35 @@ module Zavudev
69
91
  end
70
92
  attr_writer :webhook_events
71
93
 
94
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
95
+ #
96
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
97
+ # configurable. Existing webhooks stay on it until you move them.
98
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
99
+ # default for new senders. It signs the timestamp together with the body.
100
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
101
+ # reading either one works, so you can deploy and confirm your new verifier
102
+ # before switching over.
103
+ #
104
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
105
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
106
+ sig do
107
+ returns(
108
+ T.nilable(
109
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::OrSymbol
110
+ )
111
+ )
112
+ end
113
+ attr_reader :webhook_signature_version
114
+
115
+ sig do
116
+ params(
117
+ webhook_signature_version:
118
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::OrSymbol
119
+ ).void
120
+ end
121
+ attr_writer :webhook_signature_version
122
+
72
123
  # HTTPS URL for webhook events.
73
124
  sig { returns(T.nilable(String)) }
74
125
  attr_reader :webhook_url
@@ -83,9 +134,13 @@ module Zavudev
83
134
  email_domain_id: String,
84
135
  email_from_name: String,
85
136
  email_receiving_enabled: T::Boolean,
137
+ enable_sms_oneway: T::Boolean,
138
+ enable_voice: T::Boolean,
86
139
  phone_number: String,
87
140
  set_as_default: T::Boolean,
88
141
  webhook_events: T::Array[Zavudev::WebhookEvent::OrSymbol],
142
+ webhook_signature_version:
143
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::OrSymbol,
89
144
  webhook_url: String,
90
145
  request_options: Zavudev::RequestOptions::OrHash
91
146
  ).returns(T.attached_class)
@@ -104,12 +159,37 @@ module Zavudev
104
159
  # Enable inbound email receiving on this sender. Requires a verified MX record on
105
160
  # the domain; ignored otherwise.
106
161
  email_receiving_enabled: nil,
107
- # Phone number in E.164 format. Required for phone-based channels (SMS, WhatsApp).
108
- # Omit for an email-only sender.
162
+ # Enable the one-way SMS channel (`sms_oneway`). Needs nothing else — no phone
163
+ # number, no credential — so it is the fastest way to get a sender that can send.
164
+ # Recipients cannot reply. Confirm with `sms_oneway` in the `channels` array on
165
+ # the response.
166
+ enable_sms_oneway: nil,
167
+ # Let this sender place and answer phone calls. Requires `phoneNumber`; enabling
168
+ # it without one returns 400. Check the `channels` array on the response to
169
+ # confirm `voice` is on.
170
+ enable_voice: nil,
171
+ # Phone number in E.164 format, and it must be a number your project already owns
172
+ # (see `GET /v1/phone-numbers`). The number is routed to the sender as part of
173
+ # this call, which is what turns the SMS channel on. Passing a number the project
174
+ # does not own, or one already attached to another sender, returns 400 rather than
175
+ # creating a sender that cannot send. Omit for an email-only sender.
109
176
  phone_number: nil,
110
177
  set_as_default: nil,
111
178
  # Events to subscribe to.
112
179
  webhook_events: nil,
180
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
181
+ #
182
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
183
+ # configurable. Existing webhooks stay on it until you move them.
184
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
185
+ # default for new senders. It signs the timestamp together with the body.
186
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
187
+ # reading either one works, so you can deploy and confirm your new verifier
188
+ # before switching over.
189
+ #
190
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
191
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
192
+ webhook_signature_version: nil,
113
193
  # HTTPS URL for webhook events.
114
194
  webhook_url: nil,
115
195
  request_options: {}
@@ -124,9 +204,13 @@ module Zavudev
124
204
  email_domain_id: String,
125
205
  email_from_name: String,
126
206
  email_receiving_enabled: T::Boolean,
207
+ enable_sms_oneway: T::Boolean,
208
+ enable_voice: T::Boolean,
127
209
  phone_number: String,
128
210
  set_as_default: T::Boolean,
129
211
  webhook_events: T::Array[Zavudev::WebhookEvent::OrSymbol],
212
+ webhook_signature_version:
213
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::OrSymbol,
130
214
  webhook_url: String,
131
215
  request_options: Zavudev::RequestOptions
132
216
  }
@@ -134,6 +218,54 @@ module Zavudev
134
218
  end
135
219
  def to_hash
136
220
  end
221
+
222
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
223
+ #
224
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
225
+ # configurable. Existing webhooks stay on it until you move them.
226
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
227
+ # default for new senders. It signs the timestamp together with the body.
228
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
229
+ # reading either one works, so you can deploy and confirm your new verifier
230
+ # before switching over.
231
+ #
232
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
233
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
234
+ module WebhookSignatureVersion
235
+ extend Zavudev::Internal::Type::Enum
236
+
237
+ TaggedSymbol =
238
+ T.type_alias do
239
+ T.all(Symbol, Zavudev::SenderCreateParams::WebhookSignatureVersion)
240
+ end
241
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
242
+
243
+ V1 =
244
+ T.let(
245
+ :v1,
246
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::TaggedSymbol
247
+ )
248
+ V1_V2 =
249
+ T.let(
250
+ :"v1+v2",
251
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::TaggedSymbol
252
+ )
253
+ V2 =
254
+ T.let(
255
+ :v2,
256
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::TaggedSymbol
257
+ )
258
+
259
+ sig do
260
+ override.returns(
261
+ T::Array[
262
+ Zavudev::SenderCreateParams::WebhookSignatureVersion::TaggedSymbol
263
+ ]
264
+ )
265
+ end
266
+ def self.values
267
+ end
268
+ end
137
269
  end
138
270
  end
139
271
  end
@@ -53,6 +53,24 @@ module Zavudev
53
53
  sig { params(email_receiving_enabled: T::Boolean).void }
54
54
  attr_writer :email_receiving_enabled
55
55
 
56
+ # Turn the one-way SMS channel on or off. Enabling needs nothing else and takes
57
+ # effect immediately; disabling removes the channel from the sender. Confirm with
58
+ # the `channels` array on the response.
59
+ sig { returns(T.nilable(T::Boolean)) }
60
+ attr_reader :enable_sms_oneway
61
+
62
+ sig { params(enable_sms_oneway: T::Boolean).void }
63
+ attr_writer :enable_sms_oneway
64
+
65
+ # Turn the voice channel on or off. The sender must already have a phone number
66
+ # provisioned for calls; enabling it otherwise returns 400 instead of storing a
67
+ # flag that changes nothing. Confirm with the `channels` array on the response.
68
+ sig { returns(T.nilable(T::Boolean)) }
69
+ attr_reader :enable_voice
70
+
71
+ sig { params(enable_voice: T::Boolean).void }
72
+ attr_writer :enable_voice
73
+
56
74
  sig { returns(T.nilable(String)) }
57
75
  attr_reader :name
58
76
 
@@ -81,6 +99,35 @@ module Zavudev
81
99
  end
82
100
  attr_writer :webhook_events
83
101
 
102
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
103
+ #
104
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
105
+ # configurable. Existing webhooks stay on it until you move them.
106
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
107
+ # default for new senders. It signs the timestamp together with the body.
108
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
109
+ # reading either one works, so you can deploy and confirm your new verifier
110
+ # before switching over.
111
+ #
112
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
113
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
114
+ sig do
115
+ returns(
116
+ T.nilable(
117
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::OrSymbol
118
+ )
119
+ )
120
+ end
121
+ attr_reader :webhook_signature_version
122
+
123
+ sig do
124
+ params(
125
+ webhook_signature_version:
126
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::OrSymbol
127
+ ).void
128
+ end
129
+ attr_writer :webhook_signature_version
130
+
84
131
  # HTTPS URL for webhook events. Set to null to remove webhook.
85
132
  sig { returns(T.nilable(String)) }
86
133
  attr_accessor :webhook_url
@@ -93,10 +140,14 @@ module Zavudev
93
140
  email_domain_id: String,
94
141
  email_from_name: String,
95
142
  email_receiving_enabled: T::Boolean,
143
+ enable_sms_oneway: T::Boolean,
144
+ enable_voice: T::Boolean,
96
145
  name: String,
97
146
  set_as_default: T::Boolean,
98
147
  webhook_active: T::Boolean,
99
148
  webhook_events: T::Array[Zavudev::WebhookEvent::OrSymbol],
149
+ webhook_signature_version:
150
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::OrSymbol,
100
151
  webhook_url: T.nilable(String),
101
152
  request_options: Zavudev::RequestOptions::OrHash
102
153
  ).returns(T.attached_class)
@@ -117,12 +168,33 @@ module Zavudev
117
168
  email_from_name: nil,
118
169
  # Enable or disable inbound email receiving for this sender.
119
170
  email_receiving_enabled: nil,
171
+ # Turn the one-way SMS channel on or off. Enabling needs nothing else and takes
172
+ # effect immediately; disabling removes the channel from the sender. Confirm with
173
+ # the `channels` array on the response.
174
+ enable_sms_oneway: nil,
175
+ # Turn the voice channel on or off. The sender must already have a phone number
176
+ # provisioned for calls; enabling it otherwise returns 400 instead of storing a
177
+ # flag that changes nothing. Confirm with the `channels` array on the response.
178
+ enable_voice: nil,
120
179
  name: nil,
121
180
  set_as_default: nil,
122
181
  # Whether the webhook is active.
123
182
  webhook_active: nil,
124
183
  # Events to subscribe to.
125
184
  webhook_events: nil,
185
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
186
+ #
187
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
188
+ # configurable. Existing webhooks stay on it until you move them.
189
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
190
+ # default for new senders. It signs the timestamp together with the body.
191
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
192
+ # reading either one works, so you can deploy and confirm your new verifier
193
+ # before switching over.
194
+ #
195
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
196
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
197
+ webhook_signature_version: nil,
126
198
  # HTTPS URL for webhook events. Set to null to remove webhook.
127
199
  webhook_url: nil,
128
200
  request_options: {}
@@ -138,10 +210,14 @@ module Zavudev
138
210
  email_domain_id: String,
139
211
  email_from_name: String,
140
212
  email_receiving_enabled: T::Boolean,
213
+ enable_sms_oneway: T::Boolean,
214
+ enable_voice: T::Boolean,
141
215
  name: String,
142
216
  set_as_default: T::Boolean,
143
217
  webhook_active: T::Boolean,
144
218
  webhook_events: T::Array[Zavudev::WebhookEvent::OrSymbol],
219
+ webhook_signature_version:
220
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::OrSymbol,
145
221
  webhook_url: T.nilable(String),
146
222
  request_options: Zavudev::RequestOptions
147
223
  }
@@ -149,6 +225,54 @@ module Zavudev
149
225
  end
150
226
  def to_hash
151
227
  end
228
+
229
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
230
+ #
231
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
232
+ # configurable. Existing webhooks stay on it until you move them.
233
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
234
+ # default for new senders. It signs the timestamp together with the body.
235
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
236
+ # reading either one works, so you can deploy and confirm your new verifier
237
+ # before switching over.
238
+ #
239
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
240
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
241
+ module WebhookSignatureVersion
242
+ extend Zavudev::Internal::Type::Enum
243
+
244
+ TaggedSymbol =
245
+ T.type_alias do
246
+ T.all(Symbol, Zavudev::SenderUpdateParams::WebhookSignatureVersion)
247
+ end
248
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
249
+
250
+ V1 =
251
+ T.let(
252
+ :v1,
253
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::TaggedSymbol
254
+ )
255
+ V1_V2 =
256
+ T.let(
257
+ :"v1+v2",
258
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::TaggedSymbol
259
+ )
260
+ V2 =
261
+ T.let(
262
+ :v2,
263
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::TaggedSymbol
264
+ )
265
+
266
+ sig do
267
+ override.returns(
268
+ T::Array[
269
+ Zavudev::SenderUpdateParams::WebhookSignatureVersion::TaggedSymbol
270
+ ]
271
+ )
272
+ end
273
+ def self.values
274
+ end
275
+ end
152
276
  end
153
277
  end
154
278
  end
@@ -16,6 +16,21 @@ module Zavudev
16
16
  sig { returns(T::Array[Zavudev::WebhookEvent::TaggedSymbol]) }
17
17
  attr_accessor :events
18
18
 
19
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
20
+ #
21
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
22
+ # configurable. Existing webhooks stay on it until you move them.
23
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
24
+ # default for new senders. It signs the timestamp together with the body.
25
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
26
+ # reading either one works, so you can deploy and confirm your new verifier
27
+ # before switching over.
28
+ #
29
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
30
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
31
+ sig { returns(Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol) }
32
+ attr_accessor :signature_version
33
+
19
34
  # HTTPS URL that will receive webhook events.
20
35
  sig { returns(String) }
21
36
  attr_accessor :url
@@ -33,6 +48,7 @@ module Zavudev
33
48
  params(
34
49
  active: T::Boolean,
35
50
  events: T::Array[Zavudev::WebhookEvent::OrSymbol],
51
+ signature_version: Zavudev::SenderWebhook::SignatureVersion::OrSymbol,
36
52
  url: String,
37
53
  secret: String
38
54
  ).returns(T.attached_class)
@@ -42,6 +58,19 @@ module Zavudev
42
58
  active:,
43
59
  # List of events the webhook is subscribed to.
44
60
  events:,
61
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
62
+ #
63
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
64
+ # configurable. Existing webhooks stay on it until you move them.
65
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
66
+ # default for new senders. It signs the timestamp together with the body.
67
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
68
+ # reading either one works, so you can deploy and confirm your new verifier
69
+ # before switching over.
70
+ #
71
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
72
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
73
+ signature_version:,
45
74
  # HTTPS URL that will receive webhook events.
46
75
  url:,
47
76
  # Webhook secret for signature verification. Only returned on create or
@@ -55,6 +84,8 @@ module Zavudev
55
84
  {
56
85
  active: T::Boolean,
57
86
  events: T::Array[Zavudev::WebhookEvent::TaggedSymbol],
87
+ signature_version:
88
+ Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol,
58
89
  url: String,
59
90
  secret: String
60
91
  }
@@ -62,6 +93,44 @@ module Zavudev
62
93
  end
63
94
  def to_hash
64
95
  end
96
+
97
+ # Which `X-Zavu-Signature` scheme this receiver is sent.
98
+ #
99
+ # - `v1`: `v1=HMAC_SHA256(secret, body)`. The scheme used before this was
100
+ # configurable. Existing webhooks stay on it until you move them.
101
+ # - `v2`: `v2=HMAC_SHA256(secret, "{t}.{body}")`. The current scheme, and the
102
+ # default for new senders. It signs the timestamp together with the body.
103
+ # - `v1+v2`: both signatures, sharing one `t`. The migration setting: a receiver
104
+ # reading either one works, so you can deploy and confirm your new verifier
105
+ # before switching over.
106
+ #
107
+ # Moving from `v1` straight to `v2` returns `400`. Set `v1+v2` first. See
108
+ # https://docs.zavu.dev/guides/receiving-messages/signature-migration
109
+ module SignatureVersion
110
+ extend Zavudev::Internal::Type::Enum
111
+
112
+ TaggedSymbol =
113
+ T.type_alias do
114
+ T.all(Symbol, Zavudev::SenderWebhook::SignatureVersion)
115
+ end
116
+ OrSymbol = T.type_alias { T.any(Symbol, String) }
117
+
118
+ V1 = T.let(:v1, Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol)
119
+ V1_V2 =
120
+ T.let(
121
+ :"v1+v2",
122
+ Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol
123
+ )
124
+ V2 = T.let(:v2, Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol)
125
+
126
+ sig do
127
+ override.returns(
128
+ T::Array[Zavudev::SenderWebhook::SignatureVersion::TaggedSymbol]
129
+ )
130
+ end
131
+ def self.values
132
+ end
133
+ end
65
134
  end
66
135
  end
67
136
  end
@@ -51,6 +51,19 @@ module Zavudev
51
51
  sig { returns(String) }
52
52
  attr_accessor :webhook_url
53
53
 
54
+ # Signing secret for this tool's webhook. **Returned only when the tool is
55
+ # created**, never on a later read.
56
+ #
57
+ # Zavu generates one if you do not supply it, and signs every call to this tool
58
+ # with it: `X-Zavu-Signature: <hex>`, the HMAC-SHA256 of the request body. Verify
59
+ # it before trusting the call. Lost it? Rotate with
60
+ # `POST /v1/senders/{senderId}/agent/tools/{toolId}/webhook/secret`.
61
+ sig { returns(T.nilable(String)) }
62
+ attr_reader :webhook_secret
63
+
64
+ sig { params(webhook_secret: String).void }
65
+ attr_writer :webhook_secret
66
+
54
67
  sig do
55
68
  params(
56
69
  id: String,
@@ -61,7 +74,8 @@ module Zavudev
61
74
  name: String,
62
75
  parameters: Zavudev::Senders::Agent::ToolParameters::OrHash,
63
76
  updated_at: Time,
64
- webhook_url: String
77
+ webhook_url: String,
78
+ webhook_secret: String
65
79
  ).returns(T.attached_class)
66
80
  end
67
81
  def self.new(
@@ -75,7 +89,15 @@ module Zavudev
75
89
  parameters:,
76
90
  updated_at:,
77
91
  # HTTPS URL to call when the tool is executed.
78
- webhook_url:
92
+ webhook_url:,
93
+ # Signing secret for this tool's webhook. **Returned only when the tool is
94
+ # created**, never on a later read.
95
+ #
96
+ # Zavu generates one if you do not supply it, and signs every call to this tool
97
+ # with it: `X-Zavu-Signature: <hex>`, the HMAC-SHA256 of the request body. Verify
98
+ # it before trusting the call. Lost it? Rotate with
99
+ # `POST /v1/senders/{senderId}/agent/tools/{toolId}/webhook/secret`.
100
+ webhook_secret: nil
79
101
  )
80
102
  end
81
103
 
@@ -90,7 +112,8 @@ module Zavudev
90
112
  name: String,
91
113
  parameters: Zavudev::Senders::Agent::ToolParameters,
92
114
  updated_at: Time,
93
- webhook_url: String
115
+ webhook_url: String,
116
+ webhook_secret: String
94
117
  }
95
118
  )
96
119
  end
@@ -45,7 +45,9 @@ module Zavudev
45
45
  sig { params(enabled: T::Boolean).void }
46
46
  attr_writer :enabled
47
47
 
48
- # Optional secret for webhook signature verification.
48
+ # Signing secret for the webhook. Optional: Zavu generates one when omitted and
49
+ # returns it on this response only. Supply your own if you already have a secret
50
+ # you want reused.
49
51
  sig { returns(T.nilable(String)) }
50
52
  attr_reader :webhook_secret
51
53
 
@@ -72,7 +74,9 @@ module Zavudev
72
74
  # Must be HTTPS.
73
75
  webhook_url:,
74
76
  enabled: nil,
75
- # Optional secret for webhook signature verification.
77
+ # Signing secret for the webhook. Optional: Zavu generates one when omitted and
78
+ # returns it on this response only. Supply your own if you already have a secret
79
+ # you want reused.
76
80
  webhook_secret: nil,
77
81
  request_options: {}
78
82
  )