@whooshbang/contracts 1.0.0-rc.13 → 1.0.0-rc.16
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.
- package/CHANGELOG.md +234 -0
- package/contract-manifest.json +58 -33
- package/dist/generated/artifact-index.d.ts +35 -35
- package/dist/generated/artifact-index.js +57 -32
- package/dist/generated/artifact-index.js.map +1 -1
- package/dist/generated/core-scenario.d.ts +1 -1
- package/dist/generated/fixture-index.d.ts +1 -1
- package/dist/generated/interaction-machine-scenario.d.ts +1 -1
- package/dist/generated/validators-standalone.d.ts +252 -150
- package/dist/generated/validators-standalone.js +8371 -1701
- package/dist/generated/validators-standalone.js.map +1 -1
- package/dist/generated/validators.d.ts +9 -1
- package/dist/generated/validators.js +9 -1
- package/dist/generated/validators.js.map +1 -1
- package/dist/generated/whooshbang-v1.d.ts +750 -5
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/fixtures/core-v1/fixture-index.json +187 -1
- package/fixtures/core-v1/requests/attach-notifier-connection.json +5 -0
- package/fixtures/core-v1/requests/create-channel-connection-byok.json +6 -0
- package/fixtures/core-v1/requests/create-channel-connection-managed.json +6 -0
- package/fixtures/core-v1/requests/create-channel-connection.json +5 -0
- package/fixtures/core-v1/requests/create-message-connection.json +16 -0
- package/fixtures/core-v1/requests/create-subscription-link.json +1 -0
- package/fixtures/core-v1/requests/rotate-channel-connection-credential.json +3 -0
- package/fixtures/core-v1/requests/rotate-channel-connection-managed.json +3 -0
- package/fixtures/core-v1/requests/update-channel-connection.json +4 -0
- package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
- package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
- package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
- package/fixtures/core-v1/scenarios/cross-account-project.json +1 -1
- package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
- package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
- package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
- package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
- package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
- package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
- package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
- package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
- package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
- package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +16 -0
- package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +17 -0
- package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
- package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +18 -0
- package/fixtures/core-v1/success/channel-connection-archived.json +22 -0
- package/fixtures/core-v1/success/channel-connection-byok-created.json +21 -0
- package/fixtures/core-v1/success/channel-connection-collection.json +25 -0
- package/fixtures/core-v1/success/channel-connection-created.json +20 -0
- package/fixtures/core-v1/success/channel-connection-credential-rotated.json +22 -0
- package/fixtures/core-v1/success/channel-connection-health-checked.json +22 -0
- package/fixtures/core-v1/success/channel-connection-managed-pending.json +23 -0
- package/fixtures/core-v1/success/channel-connection-managed-rotated.json +22 -0
- package/fixtures/core-v1/success/channel-connection-managed-setup-failed.json +24 -0
- package/fixtures/core-v1/success/channel-connection-purged.json +23 -0
- package/fixtures/core-v1/success/channel-connection-repaired.json +22 -0
- package/fixtures/core-v1/success/channel-connection-setup-restarted.json +23 -0
- package/fixtures/core-v1/success/connection-provider-collection.json +27 -0
- package/fixtures/core-v1/success/message-accepted.json +1 -0
- package/fixtures/core-v1/success/message-cancellation-too-late.json +1 -0
- package/fixtures/core-v1/success/message-cancelled.json +1 -0
- package/fixtures/core-v1/success/message-outcome-unknown.json +1 -0
- package/fixtures/core-v1/success/message-provider-accepted.json +1 -0
- package/fixtures/core-v1/success/notifier-connection-collection.json +14 -0
- package/fixtures/core-v1/success/subscription-link-activated.json +7 -0
- package/fixtures/core-v1/success/subscription-link-cancelled.json +6 -0
- package/fixtures/core-v1/success/subscription-link-paused.json +7 -0
- package/fixtures/core-v1/success/subscription-link-pending.json +7 -1
- package/fixtures/core-v1/success/subscription-link-revoked.json +7 -0
- package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
- package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
- package/fixtures/interaction-machine-v1/success/message-interaction-open.json +1 -0
- package/openapi/generated/whooshbang-v1.bundle.json +1813 -213
- package/openapi/whooshbang-v1.yaml +941 -2
- package/package.json +1 -1
- package/schemas/core-scenario.schema.json +2 -2
- package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
- package/schemas/events/interaction-expired-v1.schema.json +1 -1
- package/schemas/events/interaction-received-v1.schema.json +1 -1
- package/schemas/events/message-delivered-v1.schema.json +1 -1
- package/schemas/events/message-expired-v1.schema.json +1 -1
- package/schemas/events/message-failed-v1.schema.json +1 -1
- package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
- package/schemas/events/subscription-activated-v1.schema.json +1 -1
- package/schemas/events/subscription-revoked-v1.schema.json +1 -1
- package/schemas/events/whooshbang-event-v1.schema.json +1 -1
- package/schemas/fixture-index.schema.json +2 -2
- package/schemas/interaction-machine-scenario.schema.json +2 -2
- package/schemas/interaction-v1.schema.json +1 -1
- package/schemas/machine-v1.schema.json +1 -1
- package/schemas/provider-capabilities-v1.schema.json +1 -1
- package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
- package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
- 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
|
package/contract-manifest.json
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schema": "flowxo.contract-manifest.v1",
|
|
3
3
|
"artifact": "@whooshbang/contracts",
|
|
4
|
-
"version": "1.0.0-rc.
|
|
4
|
+
"version": "1.0.0-rc.16",
|
|
5
5
|
"openapi": [
|
|
6
6
|
{
|
|
7
7
|
"id": "whooshbang-rest-v1",
|
|
8
|
-
"version": "1.0.0-rc.
|
|
8
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
15
|
+
"version": "1.0.0-rc.16",
|
|
16
16
|
"path": "schemas/whooshbang-v1.schema.json"
|
|
17
17
|
},
|
|
18
18
|
{
|
|
19
19
|
"id": "interaction-v1",
|
|
20
|
-
"version": "1.0.0-rc.
|
|
20
|
+
"version": "1.0.0-rc.16",
|
|
21
21
|
"path": "schemas/interaction-v1.schema.json"
|
|
22
22
|
},
|
|
23
23
|
{
|
|
24
24
|
"id": "machine-v1",
|
|
25
|
-
"version": "1.0.0-rc.
|
|
25
|
+
"version": "1.0.0-rc.16",
|
|
26
26
|
"path": "schemas/machine-v1.schema.json"
|
|
27
27
|
},
|
|
28
28
|
{
|
|
29
29
|
"id": "provider-capabilities-v1",
|
|
30
|
-
"version": "1.0.0-rc.
|
|
30
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
35
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
40
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
45
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
50
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
55
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
60
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
65
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
70
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
75
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
80
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
85
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
90
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
95
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
100
|
+
"version": "1.0.0-rc.16",
|
|
101
101
|
"path": "schemas/core-scenario.schema.json"
|
|
102
102
|
},
|
|
103
103
|
{
|
|
104
104
|
"id": "core-fixture-index",
|
|
105
|
-
"version": "1.0.0-rc.
|
|
105
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
112
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
190
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
218
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
230
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
247
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
268
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
274
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
311
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
327
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
333
|
+
"version": "1.0.0-rc.16",
|
|
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.
|
|
339
|
+
"version": "1.0.0-rc.16",
|
|
315
340
|
"schema": "schemas/fixture-index.schema.json",
|
|
316
341
|
"fixtures": ["fixtures/core-v1/fixture-index.json"]
|
|
317
342
|
}
|