@whooshbang/contracts 1.0.0-rc.19 → 1.0.0-rc.21

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 (107) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/contract-manifest.json +46 -32
  3. package/dist/generated/artifact-index.d.ts +34 -34
  4. package/dist/generated/artifact-index.js +46 -32
  5. package/dist/generated/artifact-index.js.map +1 -1
  6. package/dist/generated/validators-standalone.d.ts +384 -254
  7. package/dist/generated/validators-standalone.js +25421 -15666
  8. package/dist/generated/validators-standalone.js.map +1 -1
  9. package/dist/generated/validators.d.ts +11 -1
  10. package/dist/generated/validators.js +132 -31
  11. package/dist/generated/validators.js.map +1 -1
  12. package/dist/generated/whooshbang-v1.d.ts +836 -9
  13. package/dist/index.d.ts +6 -2
  14. package/dist/index.js +1 -1
  15. package/dist/index.js.map +1 -1
  16. package/fixtures/core-v1/fixture-index.json +110 -1
  17. package/fixtures/core-v1/problems/credential-account-mismatch.json +9 -0
  18. package/fixtures/core-v1/requests/create-account-credential.json +4 -0
  19. package/fixtures/core-v1/requests/create-connection-test.json +3 -0
  20. package/fixtures/core-v1/requests/rotate-account-credential.json +3 -0
  21. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  22. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  23. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  24. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  25. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  26. package/fixtures/core-v1/scenarios/cross-account-project.json +1 -1
  27. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  28. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  29. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  30. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  31. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  32. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  33. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  34. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  35. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  36. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  37. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  38. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  39. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  40. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  41. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  42. package/fixtures/core-v1/success/account-credential-collection.json +17 -0
  43. package/fixtures/core-v1/success/account-credential-created.json +12 -0
  44. package/fixtures/core-v1/success/account-credential-revoked.json +11 -0
  45. package/fixtures/core-v1/success/account-credential-rotated.json +25 -0
  46. package/fixtures/core-v1/success/channel-connection-slack-customer-active.json +31 -0
  47. package/fixtures/core-v1/success/channel-connection-slack-customer-pending.json +36 -0
  48. package/fixtures/core-v1/success/connection-test-collection.json +39 -0
  49. package/fixtures/core-v1/success/connection-test-pending.json +16 -0
  50. package/fixtures/core-v1/success/connection-test-succeeded.json +20 -0
  51. package/fixtures/core-v1/success/customer-owned-slack-app-manifest.json +53 -0
  52. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  60. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  61. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  62. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  63. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  64. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  65. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  66. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  67. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  68. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  69. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  70. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  71. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  72. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  73. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  74. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  75. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  76. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  77. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  78. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  79. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  80. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  81. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  82. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  83. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  84. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  85. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
  86. package/openapi/generated/whooshbang-v1.bundle.json +1623 -99
  87. package/openapi/whooshbang-v1.yaml +687 -14
  88. package/package.json +1 -1
  89. package/schemas/core-scenario.schema.json +1 -1
  90. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  91. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  92. package/schemas/events/interaction-received-v1.schema.json +1 -1
  93. package/schemas/events/message-delivered-v1.schema.json +1 -1
  94. package/schemas/events/message-expired-v1.schema.json +1 -1
  95. package/schemas/events/message-failed-v1.schema.json +1 -1
  96. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  97. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  98. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  99. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  100. package/schemas/fixture-index.schema.json +1 -1
  101. package/schemas/interaction-machine-scenario.schema.json +1 -1
  102. package/schemas/interaction-v1.schema.json +1 -1
  103. package/schemas/machine-v1.schema.json +1 -1
  104. package/schemas/provider-capabilities-v1.schema.json +1 -1
  105. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  106. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  107. package/schemas/whooshbang-v1.schema.json +798 -8
@@ -5,7 +5,7 @@
5
5
  /**
6
6
  * Public request, resource, summary, and Problem Details models for the WhooshBang V1 REST API.
7
7
  */
8
- export type WhooshBangV1ContractDocument = AccountProjection | CreateProjectRequest | Project | ProjectCollection | RecipientCopyOverrideCollection | UpdateRecipientCopyOverrideRequest | CreateApiCredentialRequest | RotateApiCredentialRequest | ApiCredential | ApiCredentialCollection | ApiCredentialSecretReveal | ApiCredentialRotation | CreateCustomerEndpointRequest | CustomerEndpoint | CustomerEndpointCollection | CustomerEndpointMutationResult | CustomerEndpointAttemptCollection | CustomerEndpointVerificationChallenge | CreateSubscriptionLinkRequest | SubscriptionLink | CreateMessageRequest | Message | Problem | IdempotencyKey | ProviderCapabilitiesCollection | ConnectionProviderCollection | ChannelConnection | ChannelConnectionCollection | CreateChannelConnectionRequest | UpdateChannelConnectionRequest | RotateChannelConnectionCredentialRequest | NotifierConnectionCollection | AttachNotifierConnectionRequest | ProjectRecipientExperience | UpdateProjectRecipientExperienceRequest | RecipientBrandLogoUpload | NotificationImageAsset | EnvironmentRecipientExperience | UpdateEnvironmentRecipientExperienceRequest | CreateRecipientSessionRequest | CreateRecipientSessionResponse | RecipientSession | CreateProviderHandoffRequest | ProviderHandoff | RecipientHandoffCompletion | SetPreferredBindingRequest | PreferredBinding1 | CreateSubscriberRequest | Subscriber | CreateRecipientGroupRequest | RecipientGroup | RecipientGroupCollection | RecipientGroupMembership | RecipientGroupMembershipCollection | CreateGroupBroadcastRequest | GroupBroadcast;
8
+ export type WhooshBangV1ContractDocument = AccountProjection | CreateProjectRequest | Project | ProjectCollection | RecipientCopyOverrideCollection | UpdateRecipientCopyOverrideRequest | CreateApiCredentialRequest | RotateApiCredentialRequest | ApiCredential | ApiCredentialCollection | ApiCredentialSecretReveal | ApiCredentialRotation | CreateAccountCredentialRequest | RotateAccountCredentialRequest | AccountCredential | AccountCredentialCollection | AccountCredentialSecretReveal | AccountCredentialRotation | CreateCustomerEndpointRequest | CustomerEndpoint | CustomerEndpointCollection | CustomerEndpointMutationResult | CustomerEndpointAttemptCollection | CustomerEndpointVerificationChallenge | CreateSubscriptionLinkRequest | SubscriptionLink | CreateMessageRequest | Message | Problem | IdempotencyKey | ProviderCapabilitiesCollection | ConnectionProviderCollection | ChannelConnection | ChannelConnectionCollection | CreateChannelConnectionRequest | UpdateChannelConnectionRequest | RotateChannelConnectionCredentialRequest | NotifierConnectionCollection | AttachNotifierConnectionRequest | ConnectionTest | ConnectionTestCollection | CreateConnectionTestRequest | CustomerOwnedSlackAppManifest | ProjectRecipientExperience | UpdateProjectRecipientExperienceRequest | RecipientBrandLogoUpload | NotificationImageAsset | EnvironmentRecipientExperience | UpdateEnvironmentRecipientExperienceRequest | CreateRecipientSessionRequest | CreateRecipientSessionResponse | RecipientSession | CreateProviderHandoffRequest | ProviderHandoff | RecipientHandoffCompletion | SetPreferredBindingRequest | PreferredBinding1 | CreateSubscriberRequest | Subscriber | CreateRecipientGroupRequest | RecipientGroup | RecipientGroupCollection | RecipientGroupMembership | RecipientGroupMembershipCollection | CreateGroupBroadcastRequest | GroupBroadcast;
9
9
  /**
10
10
  * An opaque identifier. Its shape, ordering, and embedded content are not public promises.
11
11
  */
@@ -52,7 +52,7 @@ export type RecipientCopyKey = "hostedConsent.openProvider" | "hostedConsent.rea
52
52
  export type RecipientCopyOverrideValue = string;
53
53
  /**
54
54
  * @minItems 1
55
- * @maxItems 9
55
+ * @maxItems 11
56
56
  */
57
57
  export type ApiCredentialScopeSet = [ApiCredentialScope] | [ApiCredentialScope, ApiCredentialScope] | [ApiCredentialScope, ApiCredentialScope, ApiCredentialScope] | [
58
58
  ApiCredentialScope,
@@ -99,11 +99,34 @@ export type ApiCredentialScopeSet = [ApiCredentialScope] | [ApiCredentialScope,
99
99
  ApiCredentialScope,
100
100
  ApiCredentialScope,
101
101
  ApiCredentialScope
102
+ ] | [
103
+ ApiCredentialScope,
104
+ ApiCredentialScope,
105
+ ApiCredentialScope,
106
+ ApiCredentialScope,
107
+ ApiCredentialScope,
108
+ ApiCredentialScope,
109
+ ApiCredentialScope,
110
+ ApiCredentialScope,
111
+ ApiCredentialScope,
112
+ ApiCredentialScope
113
+ ] | [
114
+ ApiCredentialScope,
115
+ ApiCredentialScope,
116
+ ApiCredentialScope,
117
+ ApiCredentialScope,
118
+ ApiCredentialScope,
119
+ ApiCredentialScope,
120
+ ApiCredentialScope,
121
+ ApiCredentialScope,
122
+ ApiCredentialScope,
123
+ ApiCredentialScope,
124
+ ApiCredentialScope
102
125
  ];
103
126
  /**
104
- * One project-credential capability. Environment authority always comes from the credential record, never a scope or request field.
127
+ * One project-credential capability. Environment authority always comes from the credential record, never a scope or request field. `projects:write` configures the credential's own project and environment; it never creates a project, which remains an account authority. The project-wide singletons — brand, default locale, logo and recipient copy — are what a live recipient sees, so writing them requires a live credential; a test credential may read them and may write its own environment's policy.
105
128
  */
106
- export type ApiCredentialScope = "messages:write" | "messages:read" | "subscriptions:write" | "subscriptions:read" | "machine-clients:write" | "machine-clients:read" | "capabilities:read" | "connections:write" | "connections:read";
129
+ export type ApiCredentialScope = "projects:write" | "projects:read" | "messages:write" | "messages:read" | "subscriptions:write" | "subscriptions:read" | "machine-clients:write" | "machine-clients:read" | "capabilities:read" | "connections:write" | "connections:read";
107
130
  /**
108
131
  * Safe environment-scoped API credential metadata. It never contains a bearer secret, digest, Clerk identifier, or digest-key reference.
109
132
  */
@@ -142,6 +165,131 @@ export type ApiCredentialPrefix = string;
142
165
  * The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes.
143
166
  */
144
167
  export type ApiCredentialSecret = string;
168
+ /**
169
+ * @minItems 1
170
+ * @maxItems 12
171
+ */
172
+ export type AccountCredentialScopeSet = [AccountCredentialScope] | [AccountCredentialScope, AccountCredentialScope] | [AccountCredentialScope, AccountCredentialScope, AccountCredentialScope] | [
173
+ AccountCredentialScope,
174
+ AccountCredentialScope,
175
+ AccountCredentialScope,
176
+ AccountCredentialScope
177
+ ] | [
178
+ AccountCredentialScope,
179
+ AccountCredentialScope,
180
+ AccountCredentialScope,
181
+ AccountCredentialScope,
182
+ AccountCredentialScope
183
+ ] | [
184
+ AccountCredentialScope,
185
+ AccountCredentialScope,
186
+ AccountCredentialScope,
187
+ AccountCredentialScope,
188
+ AccountCredentialScope,
189
+ AccountCredentialScope
190
+ ] | [
191
+ AccountCredentialScope,
192
+ AccountCredentialScope,
193
+ AccountCredentialScope,
194
+ AccountCredentialScope,
195
+ AccountCredentialScope,
196
+ AccountCredentialScope,
197
+ AccountCredentialScope
198
+ ] | [
199
+ AccountCredentialScope,
200
+ AccountCredentialScope,
201
+ AccountCredentialScope,
202
+ AccountCredentialScope,
203
+ AccountCredentialScope,
204
+ AccountCredentialScope,
205
+ AccountCredentialScope,
206
+ AccountCredentialScope
207
+ ] | [
208
+ AccountCredentialScope,
209
+ AccountCredentialScope,
210
+ AccountCredentialScope,
211
+ AccountCredentialScope,
212
+ AccountCredentialScope,
213
+ AccountCredentialScope,
214
+ AccountCredentialScope,
215
+ AccountCredentialScope,
216
+ AccountCredentialScope
217
+ ] | [
218
+ AccountCredentialScope,
219
+ AccountCredentialScope,
220
+ AccountCredentialScope,
221
+ AccountCredentialScope,
222
+ AccountCredentialScope,
223
+ AccountCredentialScope,
224
+ AccountCredentialScope,
225
+ AccountCredentialScope,
226
+ AccountCredentialScope,
227
+ AccountCredentialScope
228
+ ] | [
229
+ AccountCredentialScope,
230
+ AccountCredentialScope,
231
+ AccountCredentialScope,
232
+ AccountCredentialScope,
233
+ AccountCredentialScope,
234
+ AccountCredentialScope,
235
+ AccountCredentialScope,
236
+ AccountCredentialScope,
237
+ AccountCredentialScope,
238
+ AccountCredentialScope,
239
+ AccountCredentialScope
240
+ ] | [
241
+ AccountCredentialScope,
242
+ AccountCredentialScope,
243
+ AccountCredentialScope,
244
+ AccountCredentialScope,
245
+ AccountCredentialScope,
246
+ AccountCredentialScope,
247
+ AccountCredentialScope,
248
+ AccountCredentialScope,
249
+ AccountCredentialScope,
250
+ AccountCredentialScope,
251
+ AccountCredentialScope,
252
+ AccountCredentialScope
253
+ ];
254
+ /**
255
+ * One account-credential capability. `account:read` is the account's project directory — listing the account's projects and reading one — and is the only scope here a project credential can never carry; it authorizes nothing below the account. Every other name is the project-credential vocabulary unchanged, and is exercised only on the environment-scoped routes, where the project and environment come from the path and the credential's authority is the intersection of these scopes with the project-credential vocabulary. An account credential is therefore never wider than a project credential would have been for the same project environment.
256
+ */
257
+ export type AccountCredentialScope = "account:read" | "projects:write" | "projects:read" | "messages:write" | "messages:read" | "subscriptions:write" | "subscriptions:read" | "machine-clients:write" | "machine-clients:read" | "capabilities:read" | "connections:write" | "connections:read";
258
+ /**
259
+ * Safe account-scoped API credential metadata. It carries no project or environment, because it names neither: a request does, in its path. It never contains a bearer secret, digest, Clerk identifier, or digest-key reference.
260
+ */
261
+ export type AccountCredential = {
262
+ [k: string]: unknown;
263
+ } & {
264
+ id: AccountCredentialId;
265
+ prefix: AccountCredentialPrefix;
266
+ label: string;
267
+ scopes: AccountCredentialScopeSet;
268
+ /**
269
+ * An opaque identifier. Its shape, ordering, and embedded content are not public promises.
270
+ */
271
+ created_by: string;
272
+ created_at: Timestamp;
273
+ last_used_at?: Timestamp;
274
+ /**
275
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
276
+ */
277
+ scheduled_revocation_at?: string;
278
+ status: "active" | "revoked";
279
+ revoked_at?: Timestamp;
280
+ };
281
+ /**
282
+ * acred_ followed by the canonical unpadded base64url encoding of exactly 16 random bytes.
283
+ */
284
+ export type AccountCredentialId = string;
285
+ /**
286
+ * A safe display prefix containing the account-credential format marker and first eight base64url identity characters, never secret bytes.
287
+ */
288
+ export type AccountCredentialPrefix = string;
289
+ /**
290
+ * The exact one-time runtime bearer syntax. The final segment is canonical unpadded base64url for exactly 32 random secret bytes.
291
+ */
292
+ export type AccountCredentialSecret = string;
145
293
  export type CustomerEventType = "subscription.activated" | "subscription.revoked" | "message.provider_accepted" | "message.delivered" | "message.failed" | "message.expired" | "interaction.received" | "interaction.expired" | "agent_binding.degraded";
146
294
  export type CustomerEndpointStatus = "unverified" | "active" | "paused" | "disabled";
147
295
  /**
@@ -199,7 +347,7 @@ export type SubscriptionLink = {
199
347
  */
200
348
  cancellation_effective?: boolean;
201
349
  };
202
- export type ProblemCode = "authentication_required" | "credential_invalid" | "scope_forbidden" | "environment_mismatch" | "idempotency_key_required" | "idempotency_conflict" | "project_slug_conflict" | "request_invalid" | "replay_unavailable" | "subscriber_unbound" | "recipient_configuration_invalid" | "recipient_origin_forbidden" | "return_destination_not_found" | "recipient_capability_invalid" | "recipient_handoff_invalid" | "preferred_binding_conflict" | "preferred_binding_unavailable" | "subscriber_conflict" | "recipient_group_conflict" | "recipient_group_archived" | "resource_not_found" | "resource_expired" | "cancellation_too_late" | "endpoint_rotation_conflict" | "rate_limited" | "provider_retryable" | "provider_terminal" | "provider_outcome_unknown";
350
+ export type ProblemCode = "authentication_required" | "credential_invalid" | "scope_forbidden" | "environment_mismatch" | "idempotency_key_required" | "idempotency_conflict" | "project_slug_conflict" | "request_invalid" | "replay_unavailable" | "subscriber_unbound" | "recipient_configuration_invalid" | "recipient_origin_forbidden" | "return_destination_not_found" | "recipient_capability_invalid" | "recipient_handoff_invalid" | "preferred_binding_conflict" | "preferred_binding_unavailable" | "subscriber_conflict" | "recipient_group_conflict" | "recipient_group_archived" | "resource_not_found" | "resource_expired" | "cancellation_too_late" | "credential_account_mismatch" | "endpoint_rotation_conflict" | "rate_limited" | "provider_retryable" | "provider_terminal" | "provider_outcome_unknown";
203
351
  /**
204
352
  * Creates one logical message for one subscriber and one resolved channel binding.
205
353
  */
@@ -773,6 +921,13 @@ export type Problem1 = {
773
921
  code?: "cancellation_too_late";
774
922
  retryable?: false;
775
923
  [k: string]: unknown;
924
+ } | {
925
+ type?: "https://whooshbang.flowxo.com/problems/credential_account_mismatch";
926
+ title?: "Credential account mismatch";
927
+ status?: 403;
928
+ code?: "credential_account_mismatch";
929
+ retryable?: false;
930
+ [k: string]: unknown;
776
931
  } | {
777
932
  type?: "https://whooshbang.flowxo.com/problems/rate_limited";
778
933
  title?: "Rate limited";
@@ -1203,7 +1358,14 @@ export type ConnectionProvider = {
1203
1358
  } | {
1204
1359
  provider: "slack";
1205
1360
  display_name: string;
1206
- setup_modes: unknown[];
1361
+ /**
1362
+ * @minItems 1
1363
+ * @maxItems 2
1364
+ */
1365
+ setup_modes: ["whooshbang_hosted" | "customer_managed"] | [
1366
+ "whooshbang_hosted" | "customer_managed",
1367
+ "whooshbang_hosted" | "customer_managed"
1368
+ ];
1207
1369
  /**
1208
1370
  * @maxItems 9
1209
1371
  */
@@ -1268,7 +1430,7 @@ export type ProviderHealthState = "unknown" | "healthy" | "degraded" | "unhealth
1268
1430
  /**
1269
1431
  * One environment's provider-discriminated connection. Credentials and provider-native authority identifiers are structurally absent.
1270
1432
  */
1271
- export type ChannelConnection = TelegramChannelConnection | HostedChannelConnection;
1433
+ export type ChannelConnection = TelegramChannelConnection | HostedChannelConnection | CustomerOwnedSlackChannelConnection;
1272
1434
  /**
1273
1435
  * `degraded` still delivers: the identity a subscriber consented to has not changed, only its last health check. `archived` is terminal, so consent granted against it is never revived.
1274
1436
  */
@@ -1305,6 +1467,14 @@ export type ProviderInstallationStatus = "pending" | "active" | "reauthorization
1305
1467
  * The exact safe next action for the current hosted lifecycle state. Provider wire errors and secret material never occupy this field.
1306
1468
  */
1307
1469
  export type HostedConnectionRecoveryAction = "none" | "complete_authorization" | "wait_for_admin_approval" | "retry_authorization" | "reinstall" | "retry_later" | "contact_support";
1470
+ /**
1471
+ * How far a customer-owned Slack setup has reached, which is the only thing a caller can act on while the connection is still `pending`. Each verification state names a different authority, because Slack hands the app's secrets over together but exercises them at different moments: `awaiting_authorization` has the three values and is waiting for the install, `awaiting_ingress_proof` has a bot grant Slack confirmed and is waiting for the first request Slack itself signs. Collapsing them would let a connection report a verified ingress it has never verified.
1472
+ */
1473
+ export type CustomerOwnedSlackSetupStatus = "awaiting_app_creation" | "awaiting_authorities" | "awaiting_authorization" | "awaiting_ingress_proof" | "provisioning" | "failed" | "expired";
1474
+ /**
1475
+ * One app-specific authority the owner hands over. Product vocabulary for what each value is for, never the value: `client_identity` is safe metadata, and the other two are write-only.
1476
+ */
1477
+ export type CustomerOwnedSlackAppAuthority = "client_identity" | "client_secret" | "signing_secret";
1308
1478
  /**
1309
1479
  * Selects the provider identity this environment will send through, discriminated on `mode`, and naming the provider it is for. The two customer-owned modes differ only in where the bot comes from: `customer_byok` connects one the customer already has, and `customer_managed` has Telegram create a new one on the administrator's own account. Neither supersedes the other, because a bot that already exists can never be adopted into managed mode — the manager that may act for a bot is fixed when the bot is created.
1310
1480
  */
@@ -1343,6 +1513,25 @@ export type CreateChannelConnectionRequest = {
1343
1513
  * The display name prefilled in the same dialog — what a subscriber reads at the top of the chat, as opposed to the @username they address. Unlike the username this one can be changed afterwards, so it is a convenience rather than a commitment. Omit it and Telegram's dialog opens with no name suggested.
1344
1514
  */
1345
1515
  suggested_bot_name?: string;
1516
+ } | {
1517
+ mode: "customer_managed";
1518
+ provider: "slack";
1519
+ /**
1520
+ * What this connection is called inside WhooshBang. Unrelated to what Slack shows the workspace.
1521
+ */
1522
+ display_name: string;
1523
+ /**
1524
+ * The app name Slack's creation dialog is prefilled with, constrained to Slack's own 35-character limit. The owner can still change it in Slack; this is a suggestion, not a reservation.
1525
+ */
1526
+ app_name: string;
1527
+ /**
1528
+ * The bot display name in the same dialog — what a recipient reads at the top of the conversation. Slack's own 80-character limit.
1529
+ */
1530
+ bot_display_name: string;
1531
+ /**
1532
+ * The short description Slack shows beside the app, within Slack's own 140-character limit.
1533
+ */
1534
+ app_description: string;
1346
1535
  } | {
1347
1536
  mode: "whooshbang_hosted";
1348
1537
  provider: "slack";
@@ -1353,9 +1542,25 @@ export type CreateChannelConnectionRequest = {
1353
1542
  */
1354
1543
  export type SuggestedBotUsername = string;
1355
1544
  /**
1356
- * Replaces the secret behind a connection, discriminated by where a replacement can come from at all. A customer-owned bot has one only its owner can produce and therefore sends it; a managed bot has one only Telegram can issue and therefore sends nothing. Either way the connection keeps its provider identity, so a subscriber stays bound to the identity it consented to and only the secret changes.
1545
+ * Replaces the secret behind a connection, discriminated by where a replacement can come from at all. A customer-owned bot has one only its owner can produce and therefore sends it; a managed bot has one only Telegram can issue and therefore sends nothing. A customer-owned Slack app has three separate authorities and names which of them it is replacing. Either way the connection keeps its provider identity, so a subscriber stays bound to the identity it consented to and only the secret changes.
1546
+ *
1547
+ * The first submission during setup uses this same boundary. Handing a secret over and replacing it are the same operation — a write that never reads the old value back — and giving initial setup its own endpoint would have meant two ways to do one thing, differing only in what the connection's status happened to be.
1357
1548
  */
1358
1549
  export type RotateChannelConnectionCredentialRequest = {
1550
+ provider: "slack";
1551
+ /**
1552
+ * The app's Client ID, in Slack's own `<digits>.<digits>` shape. Safe app metadata rather than an authority: it identifies the app in an OAuth redirect the workspace can already see, so unlike the other two it is echoed back.
1553
+ */
1554
+ client_identity: string;
1555
+ /**
1556
+ * The app's Client Secret. Write-only: sealed on arrival, never echoed here or by any later read, and reachable only by the installation and identity exchanges — delivery cannot obtain it, and holding it sends no message.
1557
+ */
1558
+ client_secret: string;
1559
+ /**
1560
+ * The app's Signing Secret, which verifies that an inbound request really came from Slack. Write-only on the same terms, and reachable only by ingress verification.
1561
+ */
1562
+ signing_secret: string;
1563
+ } | {
1359
1564
  /**
1360
1565
  * The replacement provider credential. Write-only on the same terms as the credential a `customer_byok` create supplies: sealed on arrival and never echoed.
1361
1566
  */
@@ -1366,12 +1571,28 @@ export type RotateChannelConnectionCredentialRequest = {
1366
1571
  */
1367
1572
  source: "provider_managed";
1368
1573
  };
1574
+ /**
1575
+ * Which half of a connection a test exercises. `outbound_notification` proves this exact identity can put a message in front of the person who set it up. `signed_interaction` proves the opposite direction: that the provider can reach this deployment's interactivity URL and that the request it signs verifies against the secret we hold. The two fail for entirely different reasons, so they are never collapsed into one result.
1576
+ */
1577
+ export type ConnectionTestKind = "outbound_notification" | "signed_interaction";
1578
+ /**
1579
+ * `pending` means the test is placed and its answer has not arrived; a signed-interaction test stays there until somebody presses the button it sent. `expired` is the honest reading of a pending test whose window closed: nothing failed, nobody answered.
1580
+ */
1581
+ export type ConnectionTestStatus = "pending" | "succeeded" | "failed" | "expired";
1582
+ /**
1583
+ * Why a test did not pass, in a vocabulary the owner can act on rather than the provider's wire error.
1584
+ *
1585
+ * `verification_target_unknown` means nobody has installed the app from this deployment yet, so there is no owner to send a test to. `unverified_request_received` is a statement of fact and not a diagnosis: a request carrying this test's own challenge reached the interactivity URL and its signature did not verify against the secret this connection holds.
1586
+ *
1587
+ * A window that closed with nothing arriving is not in this list, because it is not a failure: it reads as `expired`, which says nobody answered rather than that anything broke.
1588
+ */
1589
+ export type ConnectionTestFailureCode = "setup_incomplete" | "verification_target_unknown" | "credential_unavailable" | "provider_rejected" | "provider_unavailable" | "provider_rate_limited" | "unverified_request_received";
1369
1590
  /**
1370
1591
  * An opaque identifier for one normalized project-owned recipient brand logo.
1371
1592
  */
1372
1593
  export type RecipientBrandAssetId = string;
1373
1594
  /**
1374
- * One exact scheme, host, and optional port. Paths, queries, fragments, credentials, and wildcards are forbidden; HTTP is accepted only for localhost or synthetic .test configuration.
1595
+ * One exact scheme, host, and optional port, in any spelling that means that same origin. A trailing slash, an uppercase host, and an explicitly written default port are accepted and stored in canonical form. Paths, queries, fragments, credentials, and wildcards are forbidden; HTTP is accepted only for localhost or synthetic .test configuration.
1375
1596
  */
1376
1597
  export type ExactOrigin = string;
1377
1598
  /**
@@ -1753,6 +1974,46 @@ export interface ApiCredentialRotation {
1753
1974
  credential: ApiCredentialSecretReveal;
1754
1975
  replaced_credential: ApiCredential;
1755
1976
  }
1977
+ /**
1978
+ * Creates one credential against the whole account rather than one project environment.
1979
+ */
1980
+ export interface CreateAccountCredentialRequest {
1981
+ label: string;
1982
+ scopes: AccountCredentialScopeSet;
1983
+ }
1984
+ /**
1985
+ * Creates a replacement with the same label and scopes and schedules terminal revocation of the replaced credential after the declared overlap.
1986
+ */
1987
+ export interface RotateAccountCredentialRequest {
1988
+ overlap_seconds: number;
1989
+ }
1990
+ /**
1991
+ * A stable page of safe account-credential metadata for one account.
1992
+ */
1993
+ export interface AccountCredentialCollection {
1994
+ /**
1995
+ * @maxItems 100
1996
+ */
1997
+ items: AccountCredential[];
1998
+ next_cursor?: string;
1999
+ page?: ListPageNumber;
2000
+ page_size?: ListPageSize;
2001
+ total?: ListTotal;
2002
+ }
2003
+ /**
2004
+ * The creation-only response. The secret is emitted in this response exactly once and is never available from list, rotate-target, revoke, or later read responses.
2005
+ */
2006
+ export interface AccountCredentialSecretReveal {
2007
+ credential: AccountCredential;
2008
+ secret: AccountCredentialSecret;
2009
+ }
2010
+ /**
2011
+ * A creation-only replacement secret plus safe metadata for the credential it replaces.
2012
+ */
2013
+ export interface AccountCredentialRotation {
2014
+ credential: AccountCredentialSecretReveal;
2015
+ replaced_credential: AccountCredential;
2016
+ }
1756
2017
  /**
1757
2018
  * Creates one project/environment endpoint. The service validates the final normalized destination and never returns it from health or diagnostic reads.
1758
2019
  */
@@ -2876,6 +3137,7 @@ export interface TelegramChannelConnection {
2876
3137
  identity?: TelegramConnectionIdentity;
2877
3138
  setup?: ChannelConnectionSetup;
2878
3139
  authorization_setup?: never;
3140
+ app_setup?: never;
2879
3141
  installation?: never;
2880
3142
  /**
2881
3143
  * Send this back on an update. A stale value is refused rather than silently overwriting a change made in between.
@@ -2930,6 +3192,7 @@ export interface HostedChannelConnection {
2930
3192
  capabilities: [] | [HostedConnectionCapability];
2931
3193
  identity?: SlackConnectionIdentity;
2932
3194
  setup?: never;
3195
+ app_setup?: never;
2933
3196
  /**
2934
3197
  * The additive hosted authorization state. Older tolerant readers discard this unknown field rather than interpreting it as Telegram setup.
2935
3198
  */
@@ -2979,6 +3242,97 @@ export interface ProviderInstallationSummary {
2979
3242
  status: ProviderInstallationStatus;
2980
3243
  health: ProviderHealthState;
2981
3244
  }
3245
+ /**
3246
+ * A Slack app the customer created and owns, referenced by one exact environment connection.
3247
+ *
3248
+ * It differs from the hosted arm in who owns the app and its lifecycle, not in what a notification can do. WhooshBang custodies the three app-specific authorities Slack makes unavoidable and none of them appears here or in any other read: absence, not redaction, is the mechanism.
3249
+ */
3250
+ export interface CustomerOwnedSlackChannelConnection {
3251
+ id: OpaqueIdentifier;
3252
+ project_id: OpaqueIdentifier;
3253
+ environment_id: OpaqueIdentifier;
3254
+ environment: Environment;
3255
+ provider: "slack";
3256
+ mode: "customer_managed";
3257
+ display_name: string;
3258
+ status: ChannelConnectionStatus;
3259
+ health: ProviderHealthState;
3260
+ /**
3261
+ * @maxItems 1
3262
+ */
3263
+ capabilities: [] | [HostedConnectionCapability];
3264
+ identity?: SlackConnectionIdentity;
3265
+ setup?: never;
3266
+ authorization_setup?: never;
3267
+ app_setup?: CustomerOwnedSlackConnectionSetup;
3268
+ installation?: ProviderInstallationSummary1;
3269
+ /**
3270
+ * A provider-owned App Home deep link for the customer's own workspace and their own app. It is not a caller-supplied return URL.
3271
+ */
3272
+ management_url?: string;
3273
+ recovery_action: HostedConnectionRecoveryAction;
3274
+ last_successful_verification_at?: Timestamp;
3275
+ last_successful_delivery_at?: Timestamp;
3276
+ /**
3277
+ * Send this back on an update. A stale value is refused rather than silently overwriting a change made in between.
3278
+ */
3279
+ row_version: number;
3280
+ created_at: Timestamp;
3281
+ updated_at: Timestamp;
3282
+ archived_at?: Timestamp;
3283
+ health_checked_at?: Timestamp;
3284
+ last_transition_at?: Timestamp;
3285
+ last_transition_reason?: string;
3286
+ diagnostic_id: DiagnosticId;
3287
+ }
3288
+ /**
3289
+ * The guided customer-owned setup state. A distinct field from Telegram's `setup` and the hosted arm's `authorization_setup` so a tolerant reader can never mistake one journey's progress for another's.
3290
+ */
3291
+ export interface CustomerOwnedSlackConnectionSetup {
3292
+ status: CustomerOwnedSlackSetupStatus;
3293
+ /**
3294
+ * Slack's own app-creation flow, opened with this app's manifest already filled in, so the owner reviews and presses Create rather than writing or pasting YAML. The URL carries configuration only: it names no account, project, or environment and contains no credential. The opaque handle it does carry selects candidate setup state and authorizes nothing.
3295
+ */
3296
+ creation_url: string;
3297
+ /**
3298
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
3299
+ */
3300
+ expires_at: string;
3301
+ /**
3302
+ * The short-lived handoff that installs the owner's app into their workspace, present once the three authorities have arrived and an installation has been started. It carries opaque state, never a provider credential or a raw authorization code, and the bot grant it produces is returned to WhooshBang by Slack rather than to the browser.
3303
+ */
3304
+ authorization_url?: string;
3305
+ /**
3306
+ * The name the owner chose, echoed so a resumed session shows the same app it started with. Slack's own limit.
3307
+ */
3308
+ app_name: string;
3309
+ /**
3310
+ * The bot display name the owner chose, echoed for the same reason. Slack's own limit.
3311
+ */
3312
+ bot_display_name: string;
3313
+ /**
3314
+ * Which of the three app-specific values this setup is still waiting for. Empty once they have all arrived; it never says what any of them are.
3315
+ *
3316
+ * @maxItems 3
3317
+ */
3318
+ outstanding_authorities: [] | [CustomerOwnedSlackAppAuthority] | [CustomerOwnedSlackAppAuthority, CustomerOwnedSlackAppAuthority] | [
3319
+ CustomerOwnedSlackAppAuthority,
3320
+ CustomerOwnedSlackAppAuthority,
3321
+ CustomerOwnedSlackAppAuthority
3322
+ ];
3323
+ /**
3324
+ * Why this attempt ended, in terms the owner can act on. It never echoes a submitted secret, whole or in part, and never names another customer: a Slack app already connected elsewhere says only that.
3325
+ */
3326
+ failure_reason?: string;
3327
+ }
3328
+ /**
3329
+ * The safe installation this exact connection owns. It exposes no provider-native identifier and no credential reference.
3330
+ */
3331
+ export interface ProviderInstallationSummary1 {
3332
+ display_name: string;
3333
+ status: ProviderInstallationStatus;
3334
+ health: ProviderHealthState;
3335
+ }
2982
3336
  export interface ChannelConnectionCollection {
2983
3337
  /**
2984
3338
  * @maxItems 100
@@ -3040,6 +3394,479 @@ export interface AttachNotifierConnectionRequest {
3040
3394
  */
3041
3395
  is_default?: boolean;
3042
3396
  }
3397
+ /**
3398
+ * One owner-triggered proof that an exact connection still works, run on demand and answered with evidence rather than with a claim.
3399
+ *
3400
+ * It is deliberately incapable of carrying a secret: nothing here is a credential, a provider-native identifier, or message content, and a test that failed says why in a closed vocabulary rather than by quoting a provider.
3401
+ */
3402
+ export interface ConnectionTest {
3403
+ id: OpaqueIdentifier;
3404
+ connection_id: OpaqueIdentifier;
3405
+ kind: ConnectionTestKind;
3406
+ status: ConnectionTestStatus;
3407
+ requested_at: Timestamp;
3408
+ /**
3409
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
3410
+ */
3411
+ completed_at?: string;
3412
+ /**
3413
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
3414
+ */
3415
+ expires_at: string;
3416
+ evidence?: ConnectionTestEvidence;
3417
+ failure_code?: ConnectionTestFailureCode;
3418
+ /**
3419
+ * The exact safe next action for this result. `none` on a pass.
3420
+ */
3421
+ recovery_action: "none" | "complete_setup" | "replace_credentials" | "reinstall" | "retry_later" | "check_request_url" | "contact_support";
3422
+ diagnostic_id: DiagnosticId;
3423
+ }
3424
+ /**
3425
+ * What a finished test actually observed. Every field is safe to render, log, and paste into an issue: no credential, no provider-native app, workspace, channel, or user identifier, and no message content.
3426
+ */
3427
+ export interface ConnectionTestEvidence {
3428
+ /**
3429
+ * The visible handle the test went out as — the same identity a subscriber would see.
3430
+ */
3431
+ identity_handle?: string;
3432
+ /**
3433
+ * The provider workspace the test ran in, as its own members see it named.
3434
+ */
3435
+ workspace_display_name?: string;
3436
+ /**
3437
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
3438
+ */
3439
+ accepted_at?: string;
3440
+ /**
3441
+ * An RFC 3339 timestamp with a UTC offset. The server is authoritative.
3442
+ */
3443
+ observed_at?: string;
3444
+ /**
3445
+ * Milliseconds from placing the test to observing its answer.
3446
+ */
3447
+ round_trip_ms?: number;
3448
+ /**
3449
+ * Whether the provider's signature over the untouched request body verified against the secret this connection custodies. Present only once a request has arrived.
3450
+ */
3451
+ signature_verified?: boolean;
3452
+ /**
3453
+ * The public host the provider actually called, which is what a misconfigured or stale request URL gets wrong. It is this deployment's own hostname and names no tenant.
3454
+ */
3455
+ ingress_host?: string;
3456
+ }
3457
+ /**
3458
+ * This connection's recent tests, newest first. It is the audit-safe failure history for a connection: what was tried, when, and what came back.
3459
+ */
3460
+ export interface ConnectionTestCollection {
3461
+ /**
3462
+ * @maxItems 100
3463
+ */
3464
+ items: ConnectionTest[];
3465
+ next_cursor?: string;
3466
+ page?: ListPageNumber;
3467
+ page_size?: ListPageSize;
3468
+ total?: ListTotal;
3469
+ }
3470
+ /**
3471
+ * Places one test against an exact connection. It carries nothing but which test to run: a test needs no target, because the only person it may address is the one who installed the app.
3472
+ */
3473
+ export interface CreateConnectionTestRequest {
3474
+ kind: ConnectionTestKind;
3475
+ }
3476
+ /**
3477
+ * The exact configuration a customer-owned Slack app is created from, as data rather than as a URL-encoded blob.
3478
+ *
3479
+ * It exists so the owner can read what they are about to approve, and so a reviewer can check it, without opening Slack. It carries configuration only: no account, project, or environment, no credential, and no provider-native identifier. The opaque handle inside the request URLs selects candidate setup state and authorizes nothing — a request still has to carry Slack's signature over the untouched body before anything inside it is believed.
3480
+ */
3481
+ export interface CustomerOwnedSlackAppManifest {
3482
+ /**
3483
+ * The same prefilled creation link the setup carries, repeated here so one read answers both questions.
3484
+ */
3485
+ creation_url: string;
3486
+ app_name: string;
3487
+ bot_display_name: string;
3488
+ description: string;
3489
+ /**
3490
+ * Every provider scope the bot will ask for, exactly as Slack will show them. Raw provider vocabulary on purpose: this is the screen the owner is about to approve, and translating it would make it unverifiable.
3491
+ *
3492
+ * @maxItems 20
3493
+ */
3494
+ bot_scopes: [] | [string] | [string, string] | [string, string, string] | [string, string, string, string] | [string, string, string, string, string] | [string, string, string, string, string, string] | [string, string, string, string, string, string, string] | [string, string, string, string, string, string, string, string] | [string, string, string, string, string, string, string, string, string] | [
3495
+ string,
3496
+ string,
3497
+ string,
3498
+ string,
3499
+ string,
3500
+ string,
3501
+ string,
3502
+ string,
3503
+ string,
3504
+ string
3505
+ ] | [
3506
+ string,
3507
+ string,
3508
+ string,
3509
+ string,
3510
+ string,
3511
+ string,
3512
+ string,
3513
+ string,
3514
+ string,
3515
+ string,
3516
+ string
3517
+ ] | [
3518
+ string,
3519
+ string,
3520
+ string,
3521
+ string,
3522
+ string,
3523
+ string,
3524
+ string,
3525
+ string,
3526
+ string,
3527
+ string,
3528
+ string,
3529
+ string
3530
+ ] | [
3531
+ string,
3532
+ string,
3533
+ string,
3534
+ string,
3535
+ string,
3536
+ string,
3537
+ string,
3538
+ string,
3539
+ string,
3540
+ string,
3541
+ string,
3542
+ string,
3543
+ string
3544
+ ] | [
3545
+ string,
3546
+ string,
3547
+ string,
3548
+ string,
3549
+ string,
3550
+ string,
3551
+ string,
3552
+ string,
3553
+ string,
3554
+ string,
3555
+ string,
3556
+ string,
3557
+ string,
3558
+ string
3559
+ ] | [
3560
+ string,
3561
+ string,
3562
+ string,
3563
+ string,
3564
+ string,
3565
+ string,
3566
+ string,
3567
+ string,
3568
+ string,
3569
+ string,
3570
+ string,
3571
+ string,
3572
+ string,
3573
+ string,
3574
+ string
3575
+ ] | [
3576
+ string,
3577
+ string,
3578
+ string,
3579
+ string,
3580
+ string,
3581
+ string,
3582
+ string,
3583
+ string,
3584
+ string,
3585
+ string,
3586
+ string,
3587
+ string,
3588
+ string,
3589
+ string,
3590
+ string,
3591
+ string
3592
+ ] | [
3593
+ string,
3594
+ string,
3595
+ string,
3596
+ string,
3597
+ string,
3598
+ string,
3599
+ string,
3600
+ string,
3601
+ string,
3602
+ string,
3603
+ string,
3604
+ string,
3605
+ string,
3606
+ string,
3607
+ string,
3608
+ string,
3609
+ string
3610
+ ] | [
3611
+ string,
3612
+ string,
3613
+ string,
3614
+ string,
3615
+ string,
3616
+ string,
3617
+ string,
3618
+ string,
3619
+ string,
3620
+ string,
3621
+ string,
3622
+ string,
3623
+ string,
3624
+ string,
3625
+ string,
3626
+ string,
3627
+ string,
3628
+ string
3629
+ ] | [
3630
+ string,
3631
+ string,
3632
+ string,
3633
+ string,
3634
+ string,
3635
+ string,
3636
+ string,
3637
+ string,
3638
+ string,
3639
+ string,
3640
+ string,
3641
+ string,
3642
+ string,
3643
+ string,
3644
+ string,
3645
+ string,
3646
+ string,
3647
+ string,
3648
+ string
3649
+ ] | [
3650
+ string,
3651
+ string,
3652
+ string,
3653
+ string,
3654
+ string,
3655
+ string,
3656
+ string,
3657
+ string,
3658
+ string,
3659
+ string,
3660
+ string,
3661
+ string,
3662
+ string,
3663
+ string,
3664
+ string,
3665
+ string,
3666
+ string,
3667
+ string,
3668
+ string,
3669
+ string
3670
+ ];
3671
+ /**
3672
+ * Every provider scope a recipient will be asked for when they sign in. Separate from the bot scopes because they are approved by different people at different moments.
3673
+ *
3674
+ * @maxItems 20
3675
+ */
3676
+ user_scopes: [] | [string] | [string, string] | [string, string, string] | [string, string, string, string] | [string, string, string, string, string] | [string, string, string, string, string, string] | [string, string, string, string, string, string, string] | [string, string, string, string, string, string, string, string] | [string, string, string, string, string, string, string, string, string] | [
3677
+ string,
3678
+ string,
3679
+ string,
3680
+ string,
3681
+ string,
3682
+ string,
3683
+ string,
3684
+ string,
3685
+ string,
3686
+ string
3687
+ ] | [
3688
+ string,
3689
+ string,
3690
+ string,
3691
+ string,
3692
+ string,
3693
+ string,
3694
+ string,
3695
+ string,
3696
+ string,
3697
+ string,
3698
+ string
3699
+ ] | [
3700
+ string,
3701
+ string,
3702
+ string,
3703
+ string,
3704
+ string,
3705
+ string,
3706
+ string,
3707
+ string,
3708
+ string,
3709
+ string,
3710
+ string,
3711
+ string
3712
+ ] | [
3713
+ string,
3714
+ string,
3715
+ string,
3716
+ string,
3717
+ string,
3718
+ string,
3719
+ string,
3720
+ string,
3721
+ string,
3722
+ string,
3723
+ string,
3724
+ string,
3725
+ string
3726
+ ] | [
3727
+ string,
3728
+ string,
3729
+ string,
3730
+ string,
3731
+ string,
3732
+ string,
3733
+ string,
3734
+ string,
3735
+ string,
3736
+ string,
3737
+ string,
3738
+ string,
3739
+ string,
3740
+ string
3741
+ ] | [
3742
+ string,
3743
+ string,
3744
+ string,
3745
+ string,
3746
+ string,
3747
+ string,
3748
+ string,
3749
+ string,
3750
+ string,
3751
+ string,
3752
+ string,
3753
+ string,
3754
+ string,
3755
+ string,
3756
+ string
3757
+ ] | [
3758
+ string,
3759
+ string,
3760
+ string,
3761
+ string,
3762
+ string,
3763
+ string,
3764
+ string,
3765
+ string,
3766
+ string,
3767
+ string,
3768
+ string,
3769
+ string,
3770
+ string,
3771
+ string,
3772
+ string,
3773
+ string
3774
+ ] | [
3775
+ string,
3776
+ string,
3777
+ string,
3778
+ string,
3779
+ string,
3780
+ string,
3781
+ string,
3782
+ string,
3783
+ string,
3784
+ string,
3785
+ string,
3786
+ string,
3787
+ string,
3788
+ string,
3789
+ string,
3790
+ string,
3791
+ string
3792
+ ] | [
3793
+ string,
3794
+ string,
3795
+ string,
3796
+ string,
3797
+ string,
3798
+ string,
3799
+ string,
3800
+ string,
3801
+ string,
3802
+ string,
3803
+ string,
3804
+ string,
3805
+ string,
3806
+ string,
3807
+ string,
3808
+ string,
3809
+ string,
3810
+ string
3811
+ ] | [
3812
+ string,
3813
+ string,
3814
+ string,
3815
+ string,
3816
+ string,
3817
+ string,
3818
+ string,
3819
+ string,
3820
+ string,
3821
+ string,
3822
+ string,
3823
+ string,
3824
+ string,
3825
+ string,
3826
+ string,
3827
+ string,
3828
+ string,
3829
+ string,
3830
+ string
3831
+ ] | [
3832
+ string,
3833
+ string,
3834
+ string,
3835
+ string,
3836
+ string,
3837
+ string,
3838
+ string,
3839
+ string,
3840
+ string,
3841
+ string,
3842
+ string,
3843
+ string,
3844
+ string,
3845
+ string,
3846
+ string,
3847
+ string,
3848
+ string,
3849
+ string,
3850
+ string,
3851
+ string
3852
+ ];
3853
+ /**
3854
+ * Where this deployment answers the app. A stale or edited value here is the failure a signed-interaction test detects.
3855
+ */
3856
+ request_urls: {
3857
+ events: string;
3858
+ interactions: string;
3859
+ installation_redirect: string;
3860
+ recipient_redirect: string;
3861
+ };
3862
+ /**
3863
+ * The literal manifest document Slack is handed. Reproduced whole so what the owner reviews and what Slack receives cannot drift apart.
3864
+ */
3865
+ manifest: {
3866
+ [k: string]: unknown;
3867
+ };
3868
+ diagnostic_id: DiagnosticId;
3869
+ }
3043
3870
  /**
3044
3871
  * The project-owned recipient identity and fallback locale.
3045
3872
  */