@whooshbang/contracts 1.0.0-rc.13 → 1.0.0-rc.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/CHANGELOG.md +234 -0
  2. package/contract-manifest.json +58 -33
  3. package/dist/generated/artifact-index.d.ts +35 -35
  4. package/dist/generated/artifact-index.js +57 -32
  5. package/dist/generated/artifact-index.js.map +1 -1
  6. package/dist/generated/core-scenario.d.ts +4 -1
  7. package/dist/generated/fixture-index.d.ts +4 -1
  8. package/dist/generated/interaction-machine-scenario.d.ts +4 -1
  9. package/dist/generated/validators-standalone.d.ts +252 -150
  10. package/dist/generated/validators-standalone.js +8371 -1701
  11. package/dist/generated/validators-standalone.js.map +1 -1
  12. package/dist/generated/validators.d.ts +9 -1
  13. package/dist/generated/validators.js +9 -1
  14. package/dist/generated/validators.js.map +1 -1
  15. package/dist/generated/whooshbang-v1.d.ts +750 -5
  16. package/dist/index.d.ts +2 -2
  17. package/dist/index.js +1 -1
  18. package/dist/index.js.map +1 -1
  19. package/fixtures/core-v1/fixture-index.json +187 -1
  20. package/fixtures/core-v1/requests/attach-notifier-connection.json +5 -0
  21. package/fixtures/core-v1/requests/create-channel-connection-byok.json +6 -0
  22. package/fixtures/core-v1/requests/create-channel-connection-managed.json +6 -0
  23. package/fixtures/core-v1/requests/create-channel-connection.json +5 -0
  24. package/fixtures/core-v1/requests/create-message-connection.json +16 -0
  25. package/fixtures/core-v1/requests/create-subscription-link.json +1 -0
  26. package/fixtures/core-v1/requests/rotate-channel-connection-credential.json +3 -0
  27. package/fixtures/core-v1/requests/rotate-channel-connection-managed.json +3 -0
  28. package/fixtures/core-v1/requests/update-channel-connection.json +4 -0
  29. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  30. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  31. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  32. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  33. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  34. package/fixtures/core-v1/scenarios/cross-account-project.json +1 -1
  35. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  36. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  37. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  38. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  39. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  40. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  41. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  42. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  43. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  44. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  45. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  46. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +16 -0
  47. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +17 -0
  48. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  49. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +18 -0
  50. package/fixtures/core-v1/success/channel-connection-archived.json +22 -0
  51. package/fixtures/core-v1/success/channel-connection-byok-created.json +21 -0
  52. package/fixtures/core-v1/success/channel-connection-collection.json +25 -0
  53. package/fixtures/core-v1/success/channel-connection-created.json +20 -0
  54. package/fixtures/core-v1/success/channel-connection-credential-rotated.json +22 -0
  55. package/fixtures/core-v1/success/channel-connection-health-checked.json +22 -0
  56. package/fixtures/core-v1/success/channel-connection-managed-pending.json +23 -0
  57. package/fixtures/core-v1/success/channel-connection-managed-rotated.json +22 -0
  58. package/fixtures/core-v1/success/channel-connection-managed-setup-failed.json +24 -0
  59. package/fixtures/core-v1/success/channel-connection-purged.json +23 -0
  60. package/fixtures/core-v1/success/channel-connection-repaired.json +22 -0
  61. package/fixtures/core-v1/success/channel-connection-setup-restarted.json +23 -0
  62. package/fixtures/core-v1/success/connection-provider-collection.json +27 -0
  63. package/fixtures/core-v1/success/message-accepted.json +1 -0
  64. package/fixtures/core-v1/success/message-cancellation-too-late.json +1 -0
  65. package/fixtures/core-v1/success/message-cancelled.json +1 -0
  66. package/fixtures/core-v1/success/message-outcome-unknown.json +1 -0
  67. package/fixtures/core-v1/success/message-provider-accepted.json +1 -0
  68. package/fixtures/core-v1/success/notifier-connection-collection.json +14 -0
  69. package/fixtures/core-v1/success/subscription-link-activated.json +7 -0
  70. package/fixtures/core-v1/success/subscription-link-cancelled.json +6 -0
  71. package/fixtures/core-v1/success/subscription-link-paused.json +7 -0
  72. package/fixtures/core-v1/success/subscription-link-pending.json +7 -1
  73. package/fixtures/core-v1/success/subscription-link-revoked.json +7 -0
  74. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  75. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  76. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  77. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  78. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  79. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  80. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  81. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  82. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  83. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  84. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  85. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  86. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  87. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  88. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  89. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  90. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  91. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  92. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  93. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  94. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  95. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  96. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  97. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  98. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  99. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  100. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  101. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  102. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  103. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  104. package/fixtures/interaction-machine-v1/success/message-interaction-open.json +1 -0
  105. package/openapi/generated/whooshbang-v1.bundle.json +1813 -213
  106. package/openapi/whooshbang-v1.yaml +941 -2
  107. package/package.json +2 -2
  108. package/schemas/core-scenario.schema.json +4 -2
  109. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  110. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  111. package/schemas/events/interaction-received-v1.schema.json +1 -1
  112. package/schemas/events/message-delivered-v1.schema.json +1 -1
  113. package/schemas/events/message-expired-v1.schema.json +1 -1
  114. package/schemas/events/message-failed-v1.schema.json +1 -1
  115. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  116. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  117. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  118. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  119. package/schemas/fixture-index.schema.json +4 -2
  120. package/schemas/interaction-machine-scenario.schema.json +4 -2
  121. package/schemas/interaction-v1.schema.json +1 -1
  122. package/schemas/machine-v1.schema.json +1 -1
  123. package/schemas/provider-capabilities-v1.schema.json +1 -1
  124. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  125. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  126. package/schemas/whooshbang-v1.schema.json +542 -5
package/CHANGELOG.md CHANGED
@@ -2,6 +2,240 @@
2
2
 
3
3
  All notable contract changes are recorded here.
4
4
 
5
+ ## 1.0.0-rc.16
6
+
7
+ - Notifier routing becomes a public contract. `NotifierConnectionRoute`,
8
+ `NotifierConnectionCollection`, and `AttachNotifierConnectionRequest` publish
9
+ which connection a notifier sends and authorizes through, with `GET`, `POST`,
10
+ and `DELETE` on
11
+ `/v1/projects/{project_id}/environments/{environment_id}/notifier-connections`.
12
+ A connection nothing routes to is inert — it delivers nothing and a
13
+ subscriber cannot authorize against it — so this is the surface that decides
14
+ whether a connection does anything at all. Additive: existing notifier-first
15
+ sends are unchanged.
16
+ - `connection-archived.problem` documents the refusal a caller receives for
17
+ routing a notifier through an archived connection: `request_invalid` with a
18
+ `connection_archived` field error on `/connection_id`. It is a 400 rather
19
+ than a 404 because the caller can see the connection and is entitled to know
20
+ its retirement is the reason.
21
+
22
+ - `CreateMessageRequest.delivery_target` makes transport explicit: `connection`
23
+ delivers through the subscriber's selected environment connection and
24
+ `simulator` keeps deterministic fixture delivery independent of environment.
25
+ Omitting it preserves reserved simulator destinations while ordinary
26
+ subscribers default to connection delivery. `Message.delivery_target`
27
+ records the effective choice on every accepted and terminal response.
28
+ - `CreateSubscriptionLinkRequest` may select an exact Telegram
29
+ `connection_id`. The chosen connection is fixed on the link and returned as
30
+ a safe summary containing its mode, display name, and public bot username;
31
+ idempotent replay therefore cannot silently move consent to a new default.
32
+ - A pending Telegram link now opens the selected bot directly with an opaque
33
+ `start` capability. Activated bindings carry the same `connection_id`, so a
34
+ subscriber's consent stays attached to the bot they actually saw and can be
35
+ routed through that bot in the subsequent delivery story.
36
+ - The change is additive. Callers may omit `connection_id` and let the service
37
+ choose an unambiguous compatible connection, while existing links and
38
+ bindings remain readable without the new fields.
39
+ - Published authorization examples use deliberately non-secret start values
40
+ while preserving Telegram's exact 43-character capability shape. A semantic
41
+ fixture also pins that the direct link reveals neither the link id nor the
42
+ selected connection id.
43
+ - A signed callback is still scoped to the selected connection. Presenting a
44
+ valid capability to another authenticated bot is ignored without sending a
45
+ consent card, creating a binding, or consuming the pending link.
46
+
47
+ - `CreateChannelConnectionRequest` gains its third arm. `customer_managed` has
48
+ Telegram create a brand new bot on the administrator's own Telegram account,
49
+ which is what an application needs when it wants its own sender and has no
50
+ bot yet — the gap between `whooshbang_shared`, which lends ours, and
51
+ `customer_byok`, which adopts one they already built. Neither customer mode
52
+ supersedes the other: a bot that already exists can never be moved into
53
+ managed mode, because the manager permitted to act for a bot is fixed when
54
+ the bot is created.
55
+ - The arm carries **no credential field at all**, and that absence is the whole
56
+ point of the mode. Telegram hands the new bot's token to WhooshBang server to
57
+ server, so it never passes through a browser, a clipboard, this request, or
58
+ any response. There is nothing here for a caller to paste and therefore
59
+ nothing for a caller to leak — which is a stronger promise than `writeOnly`
60
+ makes for `customer_byok`, where the customer necessarily holds the secret
61
+ already.
62
+ - `suggested_bot_username` is required and comes from the caller rather than
63
+ from us. It is the handle every subscriber sees forever and Telegram will not
64
+ let it be changed once the bot exists, so a WhooshBang-generated handle would
65
+ permanently brand a customer's own bot with our naming — the one thing the
66
+ customer-owned modes exist to prevent. It is bounded to Telegram's own rule
67
+ (5–32 characters, a letter first, ending in `bot`) so a caller learns the
68
+ shape is wrong before an administrator is standing in front of the dialog. It
69
+ is a suggestion and not a reservation: the administrator can type something
70
+ else, and Telegram refuses a handle somebody already holds. Optional
71
+ `suggested_bot_name` prefills the display name in the same dialog and can be
72
+ changed afterwards, which is why it is a convenience rather than a
73
+ commitment.
74
+ - `ChannelConnection` gains optional `setup`: the unfinished half of a
75
+ customer-managed connection, present only while one is unfinished. Its
76
+ absence is how a caller knows nothing further is expected of anyone — a
77
+ connection that never used guided setup never has it, and one that finished a
78
+ setup loses it, because from then on what the setup produced is described by
79
+ `identity` and `status` and the record of the attempt is not part of the
80
+ identity a subscriber consents to. The object is structurally incapable of
81
+ carrying a secret, which is what makes it safe to poll, render in a
82
+ dashboard, or forward to whoever is actually doing the setup.
83
+ - `ChannelConnectionSetupStatus` is the only thing a caller can act on while a
84
+ connection is still `pending`, which `ChannelConnectionStatus` alone cannot
85
+ express. `awaiting_handoff` waits for the administrator to open the link on
86
+ the account that will own the bot; `awaiting_creation` means that account is
87
+ bound and the bot does not exist yet; `provisioning` means the bot exists and
88
+ delivery is being installed. `failed` and `expired` end an attempt without
89
+ ending the connection, and neither withdraws a bot Telegram already created,
90
+ because no provider API can delete one — the product says so rather than
91
+ implying a cleanup it cannot perform.
92
+ - `handoff_url` is a capability for exactly one setup session. It names no
93
+ account, no project, and no environment, it stops working at `expires_at`,
94
+ and only the first Telegram account to open it is bound. It is not credential
95
+ material, so displaying it costs nothing beyond letting whoever sees it first
96
+ own the bot this setup creates. `failure_reason` is absent whenever there is
97
+ nothing both safe and useful to say: an attempt refused because that Telegram
98
+ account already holds a live setup says only that, because naming the
99
+ account, project, or environment holding the other one would disclose another
100
+ customer.
101
+ - Add `restartChannelConnectionSetup`, `connections:write`, no body, returning
102
+ `ChannelConnection`. An abandoned or lapsed setup must always be able to end,
103
+ or one administrator's forgotten attempt would hold their Telegram account's
104
+ only managed-setup slot across the whole deployment, permanently. The
105
+ connection is reused rather than replaced because it is still `pending`:
106
+ nothing was provisioned under it, no identity was claimed, and no subscriber
107
+ consented to anything through it. It takes no body so that resuming cannot
108
+ rename a bot an administrator is already looking at — a different suggestion
109
+ is a different connection. Repeating it is safe: a session still usable comes
110
+ back as it stands, so two dashboard tabs converge on one link instead of
111
+ racing to strand each other's.
112
+ - `RotateChannelConnectionCredentialRequest` becomes a union discriminated by
113
+ where a replacement can come from at all, not by caller preference. A
114
+ customer-owned bot has one only its owner can produce, so that arm sends
115
+ `credential` and is unchanged. A managed bot has one only Telegram can issue:
116
+ asked to rotate, it revokes the current token and returns the successor to
117
+ the manager that created the bot, so that arm sends a `source` of
118
+ `provider_managed` and nothing else. It is stated rather than
119
+ inferred from an empty body so that a request which lost its credential in
120
+ transit is refused as malformed instead of being read as a request to have
121
+ the provider mint a new token. Either way the identity is untouched: the same
122
+ bot keeps the same `@username` and the same subscribers, and only the secret
123
+ behind it is new.
124
+ - A provider-managed rotation is one-shot, which changes what
125
+ `provider_outcome_unknown` means on that operation. Once the replace call may
126
+ have reached Telegram, the outcome is resolved by asking Telegram for the
127
+ bot's current token, never by replacing again — a second replace would revoke
128
+ the token the first one issued. On this operation the code is an instruction
129
+ to read the connection, not a hint to repeat the call.
130
+ - No new `ProblemCode` members. The enum is closed and widening it would be
131
+ breaking, so every new refusal reuses a published code and is distinguished
132
+ by `field_errors[].code`: a rotation arm that does not match how the
133
+ connection holds its secret is `request_invalid` with
134
+ `rotation_source_mismatch` at `/credential` or `/source`; a restart on a
135
+ connection that never used guided setup is `idempotency_conflict` with
136
+ `setup_not_managed`; a restart on one that already finished, or is archived,
137
+ is `idempotency_conflict` with `invalid_connection_transition`.
138
+ - Everything that can go wrong in a managed setup after the create returns is
139
+ reported on `setup` rather than as a refusal, because by then the connection
140
+ exists and the failing party is a person the request has already answered.
141
+ Both `failed` and `expired` are recoverable through
142
+ `restartChannelConnectionSetup` on the same connection.
143
+ - The change is additive. `setup` is optional, both new arms are new members of
144
+ existing unions, and no existing field moved, so a client written against
145
+ `1.0.0-rc.16` keeps working unchanged.
146
+
147
+ - Document that an occupied provider identity is a **warning, not a
148
+ prohibition**. Repeating the request with `confirm_webhook_takeover` connects
149
+ it whoever owns the endpoint it currently delivers to. WhooshBang is not the
150
+ caretaker of a customer's bot, and a developer comparing frameworks routinely
151
+ points one at us that already feeds something else.
152
+ - Document `whooshbang_connection_takeover_required` on
153
+ `createChannelConnection`, for the case where the webhook being displaced
154
+ belongs to another WhooshBang connection. Separate from
155
+ `webhook_takeover_required` because the consequence is separate: confirming
156
+ this one **disables** the other connection, which would otherwise go on
157
+ reporting itself healthy while receiving nothing.
158
+ - Document `provider_identity_unverifiable` on
159
+ `rotateChannelConnectionCredential`, for a connection whose own identity
160
+ cannot be established and whose replacement therefore cannot be proved to
161
+ belong to it.
162
+
163
+ No schema changed. These are refusals the closed Problem vocabulary already
164
+ carries, distinguished by `field_errors[].code`, and they are written down here
165
+ because an integrator branching on those codes has no other way to learn them.
166
+
167
+ ## 1.0.0-rc.15
168
+
169
+ - `CreateChannelConnectionRequest` becomes a union discriminated on `mode`.
170
+ The existing `whooshbang_shared` arm is unchanged; a new `customer_byok` arm
171
+ connects a provider identity the customer already owns by supplying its
172
+ credential, with an optional `confirm_webhook_takeover`. `customer_managed`
173
+ stays in the mode vocabulary and is still not creatable.
174
+ - The `customer_byok` arm carries **no** identity field, and the absence is
175
+ load-bearing. `provider_identity_digest` is unique across every tenant, so an
176
+ endpoint that digested a client-supplied identity would answer "already
177
+ claimed" for a bot the caller does not own — an oracle for whether any given
178
+ bot is connected to WhooshBang by anyone. The identity is derived
179
+ server-side from a provider-validated `getMe` on the submitted credential,
180
+ which no caller can forge without holding the credential itself.
181
+ - `credential` is bounded at 1–512 characters and marked `writeOnly`. It is
182
+ sealed on arrival and is echoed by no response; no reference to it appears in
183
+ `ChannelConnection`, exactly as for the shared identities WhooshBang
184
+ operates.
185
+ - Add `repairChannelConnection`, `rotateChannelConnectionCredential`,
186
+ `checkChannelConnectionHealth`, and `purgeChannelConnection` on one
187
+ connection, each `connections:write` and each returning `ChannelConnection`.
188
+ Rotation carries the new `RotateChannelConnectionCredentialRequest`; the
189
+ other three carry no body. Purge is repeat-safe: destroying something already
190
+ destroyed reports the same archived connection, because a caller that lost
191
+ the first response has to be able to confirm the outcome.
192
+ - `checkChannelConnectionHealth` is `connections:write` rather than
193
+ `connections:read` deliberately. It makes a live provider call and advances
194
+ the connection's recorded health, so it is not a safe read.
195
+ - No new `ProblemCode` members. The enum is closed and widening it would be
196
+ breaking, so every new refusal reuses a published code and is distinguished
197
+ by `field_errors[].code`, as `AlphaAccessRequiredError` established: a
198
+ rejected credential is `request_invalid` with `provider_credential_invalid`,
199
+ an occupied webhook is `request_invalid` with `webhook_takeover_required`, a
200
+ replacement for another bot is `request_invalid` with
201
+ `provider_identity_mismatch`, a bot any account already connected is
202
+ `idempotency_conflict` with `provider_identity_claimed`, and rotating a
203
+ WhooshBang-operated credential is `idempotency_conflict` with
204
+ `credential_not_customer_owned`. An unreachable provider is
205
+ `provider_outcome_unknown` and a rate-limited one is `provider_retryable`
206
+ with `retry_at`.
207
+ - `ChannelConnection` is unchanged. `status` already separates `pending` from
208
+ `active`, so a client can already tell a provisioned connection from a
209
+ half-provisioned one, which keeps this bump purely additive.
210
+ - Coordinate with SDK `1.0.0-rc.16` and deterministic mock `1.0.0-rc.19`.
211
+ `1.0.0-rc.14` remains immutable.
212
+
213
+ ## 1.0.0-rc.14
214
+
215
+ - Add Channel Connections: an environment's explicit selection of the provider
216
+ identity its recipients will see. `listConnectionProviders` reports the
217
+ supported providers, their setup modes, and the WhooshBang-owned identities an
218
+ environment may select; `listChannelConnections`, `createChannelConnection`,
219
+ `getChannelConnection`, `updateChannelConnection`, and
220
+ `archiveChannelConnection` manage one environment's own connections.
221
+ - Credential material and every reference to one are structurally absent from
222
+ the `ChannelConnection` shape, including for shared identities WhooshBang
223
+ operates. Selecting a shared identity never conveys the ability to read,
224
+ rotate, or retire it.
225
+ - `updateChannelConnection` requires the `row_version` that was read, so a
226
+ rename and a disable issued at the same time cannot silently undo each other.
227
+ Archiving is terminal: reconnecting later is a new connection, so consent a
228
+ subscriber gave to the archived identity is never revived under it.
229
+ - Add the `connections:read` and `connections:write` credential scopes. Choosing
230
+ which identity an environment sends through is neither a messaging power nor
231
+ project administration, so it does not ride on either. Existing scopes and
232
+ operations are unchanged.
233
+ - Only `whooshbang_shared` is accepted on create today. The customer-owned modes
234
+ are published in the vocabulary because they are the accepted model, and they
235
+ become creatable with the provider setup journeys that can supply an identity.
236
+ - Coordinate with SDK `1.0.0-rc.15` and deterministic mock `1.0.0-rc.17`.
237
+ `1.0.0-rc.13` remains immutable.
238
+
5
239
  ## 1.0.0-rc.13
6
240
 
7
241
  - Publish the unchanged contract schemas and fixtures as the first public npm
@@ -1,115 +1,115 @@
1
1
  {
2
2
  "schema": "flowxo.contract-manifest.v1",
3
3
  "artifact": "@whooshbang/contracts",
4
- "version": "1.0.0-rc.13",
4
+ "version": "1.0.0-rc.17",
5
5
  "openapi": [
6
6
  {
7
7
  "id": "whooshbang-rest-v1",
8
- "version": "1.0.0-rc.13",
8
+ "version": "1.0.0-rc.17",
9
9
  "path": "openapi/whooshbang-v1.yaml"
10
10
  }
11
11
  ],
12
12
  "schemas": [
13
13
  {
14
14
  "id": "whooshbang-v1",
15
- "version": "1.0.0-rc.13",
15
+ "version": "1.0.0-rc.17",
16
16
  "path": "schemas/whooshbang-v1.schema.json"
17
17
  },
18
18
  {
19
19
  "id": "interaction-v1",
20
- "version": "1.0.0-rc.13",
20
+ "version": "1.0.0-rc.17",
21
21
  "path": "schemas/interaction-v1.schema.json"
22
22
  },
23
23
  {
24
24
  "id": "machine-v1",
25
- "version": "1.0.0-rc.13",
25
+ "version": "1.0.0-rc.17",
26
26
  "path": "schemas/machine-v1.schema.json"
27
27
  },
28
28
  {
29
29
  "id": "provider-capabilities-v1",
30
- "version": "1.0.0-rc.13",
30
+ "version": "1.0.0-rc.17",
31
31
  "path": "schemas/provider-capabilities-v1.schema.json"
32
32
  },
33
33
  {
34
34
  "id": "whooshbang-event-v1",
35
- "version": "1.0.0-rc.13",
35
+ "version": "1.0.0-rc.17",
36
36
  "path": "schemas/events/whooshbang-event-v1.schema.json"
37
37
  },
38
38
  {
39
39
  "id": "subscription-activated-event-v1",
40
- "version": "1.0.0-rc.13",
40
+ "version": "1.0.0-rc.17",
41
41
  "path": "schemas/events/subscription-activated-v1.schema.json"
42
42
  },
43
43
  {
44
44
  "id": "subscription-revoked-event-v1",
45
- "version": "1.0.0-rc.13",
45
+ "version": "1.0.0-rc.17",
46
46
  "path": "schemas/events/subscription-revoked-v1.schema.json"
47
47
  },
48
48
  {
49
49
  "id": "message-provider-accepted-event-v1",
50
- "version": "1.0.0-rc.13",
50
+ "version": "1.0.0-rc.17",
51
51
  "path": "schemas/events/message-provider-accepted-v1.schema.json"
52
52
  },
53
53
  {
54
54
  "id": "message-delivered-event-v1",
55
- "version": "1.0.0-rc.13",
55
+ "version": "1.0.0-rc.17",
56
56
  "path": "schemas/events/message-delivered-v1.schema.json"
57
57
  },
58
58
  {
59
59
  "id": "message-failed-event-v1",
60
- "version": "1.0.0-rc.13",
60
+ "version": "1.0.0-rc.17",
61
61
  "path": "schemas/events/message-failed-v1.schema.json"
62
62
  },
63
63
  {
64
64
  "id": "message-expired-event-v1",
65
- "version": "1.0.0-rc.13",
65
+ "version": "1.0.0-rc.17",
66
66
  "path": "schemas/events/message-expired-v1.schema.json"
67
67
  },
68
68
  {
69
69
  "id": "interaction-received-event-v1",
70
- "version": "1.0.0-rc.13",
70
+ "version": "1.0.0-rc.17",
71
71
  "path": "schemas/events/interaction-received-v1.schema.json"
72
72
  },
73
73
  {
74
74
  "id": "interaction-expired-event-v1",
75
- "version": "1.0.0-rc.13",
75
+ "version": "1.0.0-rc.17",
76
76
  "path": "schemas/events/interaction-expired-v1.schema.json"
77
77
  },
78
78
  {
79
79
  "id": "agent-binding-degraded-event-v1",
80
- "version": "1.0.0-rc.13",
80
+ "version": "1.0.0-rc.17",
81
81
  "path": "schemas/events/agent-binding-degraded-v1.schema.json"
82
82
  },
83
83
  {
84
84
  "id": "webhook-signing-vector-v1",
85
- "version": "1.0.0-rc.13",
85
+ "version": "1.0.0-rc.17",
86
86
  "path": "schemas/webhooks/webhook-signing-vector-v1.schema.json"
87
87
  },
88
88
  {
89
89
  "id": "webhook-delivery-case-v1",
90
- "version": "1.0.0-rc.13",
90
+ "version": "1.0.0-rc.17",
91
91
  "path": "schemas/webhooks/webhook-delivery-case-v1.schema.json"
92
92
  },
93
93
  {
94
94
  "id": "interaction-machine-scenario",
95
- "version": "1.0.0-rc.13",
95
+ "version": "1.0.0-rc.17",
96
96
  "path": "schemas/interaction-machine-scenario.schema.json"
97
97
  },
98
98
  {
99
99
  "id": "core-contract-scenario",
100
- "version": "1.0.0-rc.13",
100
+ "version": "1.0.0-rc.17",
101
101
  "path": "schemas/core-scenario.schema.json"
102
102
  },
103
103
  {
104
104
  "id": "core-fixture-index",
105
- "version": "1.0.0-rc.13",
105
+ "version": "1.0.0-rc.17",
106
106
  "path": "schemas/fixture-index.schema.json"
107
107
  }
108
108
  ],
109
109
  "fixture_sets": [
110
110
  {
111
111
  "id": "core-api-bodies",
112
- "version": "1.0.0-rc.13",
112
+ "version": "1.0.0-rc.17",
113
113
  "schema": "schemas/whooshbang-v1.schema.json",
114
114
  "fixtures": [
115
115
  "fixtures/core-v1/requests/create-project.json",
@@ -131,6 +131,7 @@
131
131
  "fixtures/core-v1/success/customer-endpoint-attempts.json",
132
132
  "fixtures/core-v1/requests/create-subscription-link.json",
133
133
  "fixtures/core-v1/requests/create-message.json",
134
+ "fixtures/core-v1/requests/create-message-connection.json",
134
135
  "fixtures/core-v1/success/subscription-link-pending.json",
135
136
  "fixtures/core-v1/success/subscription-link-activated.json",
136
137
  "fixtures/core-v1/success/subscription-link-paused.json",
@@ -160,12 +161,33 @@
160
161
  "fixtures/core-v1/problems/rate-limited.json",
161
162
  "fixtures/core-v1/problems/provider-retryable.json",
162
163
  "fixtures/core-v1/problems/provider-terminal.json",
163
- "fixtures/core-v1/problems/provider-outcome-unknown.json"
164
+ "fixtures/core-v1/problems/provider-outcome-unknown.json",
165
+ "fixtures/core-v1/requests/create-channel-connection.json",
166
+ "fixtures/core-v1/requests/create-channel-connection-byok.json",
167
+ "fixtures/core-v1/requests/create-channel-connection-managed.json",
168
+ "fixtures/core-v1/requests/update-channel-connection.json",
169
+ "fixtures/core-v1/requests/rotate-channel-connection-credential.json",
170
+ "fixtures/core-v1/requests/rotate-channel-connection-managed.json",
171
+ "fixtures/core-v1/requests/attach-notifier-connection.json",
172
+ "fixtures/core-v1/success/connection-provider-collection.json",
173
+ "fixtures/core-v1/success/channel-connection-collection.json",
174
+ "fixtures/core-v1/success/channel-connection-created.json",
175
+ "fixtures/core-v1/success/channel-connection-byok-created.json",
176
+ "fixtures/core-v1/success/channel-connection-managed-pending.json",
177
+ "fixtures/core-v1/success/channel-connection-managed-setup-failed.json",
178
+ "fixtures/core-v1/success/channel-connection-setup-restarted.json",
179
+ "fixtures/core-v1/success/channel-connection-repaired.json",
180
+ "fixtures/core-v1/success/channel-connection-credential-rotated.json",
181
+ "fixtures/core-v1/success/channel-connection-managed-rotated.json",
182
+ "fixtures/core-v1/success/channel-connection-health-checked.json",
183
+ "fixtures/core-v1/success/channel-connection-archived.json",
184
+ "fixtures/core-v1/success/channel-connection-purged.json",
185
+ "fixtures/core-v1/success/notifier-connection-collection.json"
164
186
  ]
165
187
  },
166
188
  {
167
189
  "id": "core-semantic-scenarios",
168
- "version": "1.0.0-rc.13",
190
+ "version": "1.0.0-rc.17",
169
191
  "schema": "schemas/core-scenario.schema.json",
170
192
  "fixtures": [
171
193
  "fixtures/core-v1/scenarios/project-create-equivalent-replay.json",
@@ -182,6 +204,9 @@
182
204
  "fixtures/core-v1/scenarios/missing-scope.json",
183
205
  "fixtures/core-v1/scenarios/malformed-bearer.json",
184
206
  "fixtures/core-v1/scenarios/subscription-activation-replay.json",
207
+ "fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json",
208
+ "fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json",
209
+ "fixtures/core-v1/scenarios/subscription-selected-connection-replay.json",
185
210
  "fixtures/core-v1/scenarios/subscription-expired-replay.json",
186
211
  "fixtures/core-v1/scenarios/provider-outcome-unknown.json",
187
212
  "fixtures/core-v1/scenarios/cancellation-too-late.json",
@@ -190,7 +215,7 @@
190
215
  },
191
216
  {
192
217
  "id": "interaction-message-api-bodies",
193
- "version": "1.0.0-rc.13",
218
+ "version": "1.0.0-rc.17",
194
219
  "schema": "schemas/whooshbang-v1.schema.json",
195
220
  "fixtures": [
196
221
  "fixtures/interaction-machine-v1/requests/create-message-confirm.json",
@@ -202,7 +227,7 @@
202
227
  },
203
228
  {
204
229
  "id": "interaction-contract-bodies",
205
- "version": "1.0.0-rc.13",
230
+ "version": "1.0.0-rc.17",
206
231
  "schema": "schemas/interaction-v1.schema.json",
207
232
  "fixtures": [
208
233
  "fixtures/interaction-machine-v1/success/interaction-open.json",
@@ -219,7 +244,7 @@
219
244
  },
220
245
  {
221
246
  "id": "machine-api-bodies",
222
- "version": "1.0.0-rc.13",
247
+ "version": "1.0.0-rc.17",
223
248
  "schema": "schemas/machine-v1.schema.json",
224
249
  "fixtures": [
225
250
  "fixtures/interaction-machine-v1/requests/create-machine-client.json",
@@ -240,13 +265,13 @@
240
265
  },
241
266
  {
242
267
  "id": "provider-capability-bodies",
243
- "version": "1.0.0-rc.13",
268
+ "version": "1.0.0-rc.17",
244
269
  "schema": "schemas/provider-capabilities-v1.schema.json",
245
270
  "fixtures": ["fixtures/interaction-machine-v1/capabilities/telegram.json"]
246
271
  },
247
272
  {
248
273
  "id": "interaction-machine-semantic-scenarios",
249
- "version": "1.0.0-rc.13",
274
+ "version": "1.0.0-rc.17",
250
275
  "schema": "schemas/interaction-machine-scenario.schema.json",
251
276
  "fixtures": [
252
277
  "fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json",
@@ -283,7 +308,7 @@
283
308
  },
284
309
  {
285
310
  "id": "customer-event-bodies",
286
- "version": "1.0.0-rc.13",
311
+ "version": "1.0.0-rc.17",
287
312
  "schema": "schemas/events/whooshbang-event-v1.schema.json",
288
313
  "fixtures": [
289
314
  "fixtures/whooshbang-events-v1/events/subscription-activated.json",
@@ -299,19 +324,19 @@
299
324
  },
300
325
  {
301
326
  "id": "webhook-signing-vectors",
302
- "version": "1.0.0-rc.13",
327
+ "version": "1.0.0-rc.17",
303
328
  "schema": "schemas/webhooks/webhook-signing-vector-v1.schema.json",
304
329
  "fixtures": ["fixtures/whooshbang-events-v1/signing/vectors.json"]
305
330
  },
306
331
  {
307
332
  "id": "webhook-delivery-cases",
308
- "version": "1.0.0-rc.13",
333
+ "version": "1.0.0-rc.17",
309
334
  "schema": "schemas/webhooks/webhook-delivery-case-v1.schema.json",
310
335
  "fixtures": ["fixtures/whooshbang-events-v1/delivery/cases.json"]
311
336
  },
312
337
  {
313
338
  "id": "core-fixture-index",
314
- "version": "1.0.0-rc.13",
339
+ "version": "1.0.0-rc.17",
315
340
  "schema": "schemas/fixture-index.schema.json",
316
341
  "fixtures": ["fixtures/core-v1/fixture-index.json"]
317
342
  }