@whooshbang/contracts 3.0.0 → 3.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/contract-manifest.json +32 -32
  3. package/dist/generated/artifact-index.d.ts +33 -33
  4. package/dist/generated/artifact-index.js +32 -32
  5. package/dist/generated/validators-standalone.js +1319 -822
  6. package/dist/generated/validators-standalone.js.map +1 -1
  7. package/dist/generated/whooshbang-v1.d.ts +304 -1
  8. package/fixtures/core-v1/fixture-index.json +1 -1
  9. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  10. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  11. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  12. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  13. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  14. package/fixtures/core-v1/scenarios/cross-organization-project.json +1 -1
  15. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  16. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  17. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  18. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  19. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  20. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  21. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  22. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  23. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  24. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  25. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  26. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  27. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  28. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  29. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  30. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  31. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  32. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  33. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  34. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  35. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  36. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  37. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  38. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  39. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  40. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  41. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  42. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  43. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  44. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  45. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  46. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  47. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  48. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  49. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  50. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  51. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  52. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  60. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  61. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  62. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  63. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
  64. package/openapi/generated/whooshbang-v1.bundle.json +82 -4
  65. package/openapi/whooshbang-v1.yaml +37 -2
  66. package/package.json +1 -1
  67. package/schemas/core-scenario.schema.json +1 -1
  68. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  69. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  70. package/schemas/events/interaction-received-v1.schema.json +1 -1
  71. package/schemas/events/message-delivered-v1.schema.json +1 -1
  72. package/schemas/events/message-expired-v1.schema.json +1 -1
  73. package/schemas/events/message-failed-v1.schema.json +1 -1
  74. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  75. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  76. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  77. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  78. package/schemas/fixture-index.schema.json +1 -1
  79. package/schemas/interaction-machine-scenario.schema.json +1 -1
  80. package/schemas/interaction-v1.schema.json +1 -1
  81. package/schemas/machine-v1.schema.json +1 -1
  82. package/schemas/provider-capabilities-v1.schema.json +1 -1
  83. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  84. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  85. package/schemas/whooshbang-v1.schema.json +36 -2
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-crash-before-ack",
4
4
  "category": "machine_poll",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-notifier-mismatch",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-other-message-read",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-owned-message-read",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-subscriber-mismatch",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "poll-uncommitted-cursor-rejected",
4
4
  "category": "machine_poll",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "project-credential-machine-endpoint-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "quarantine-integrity-rejected",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "quarantine-signature-rejected",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "quarantine-valid",
4
4
  "category": "quarantine",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "revoked-machine-credential",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "membership-broadcast-snapshot",
4
4
  "category": "membership_broadcast",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "preferred-binding-resolution",
4
4
  "category": "preference_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "recipient-session-security",
4
4
  "category": "recipient_security",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "3.0.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscriber-initial-groups-transaction",
4
4
  "category": "subscriber_groups",
5
5
  "given": {
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.1",
3
3
  "info": {
4
4
  "title": "WhooshBang API",
5
- "version": "3.0.0",
5
+ "version": "3.1.0",
6
6
  "description": "The V1 contract for human organization/project administration, project-scoped\nsubscription links, and asynchronous text messages. A Clerk session selects\none organization for administration. A project credential selects one organization,\nproject, and `test` or `live` environment for product operations; request\nbodies cannot override either authenticated scope.\n\nA person's OAuth grant selects one organization and carries scopes, but no\nproject. It names the project and environment it acts in through the URL\npath, on the environment-scoped form of each operation; the service checks\nthat path against the granting person's membership on every call. The flat\nforms remain credential-only and are unchanged.\n\nResource identifiers are opaque and are not authorization. Reads outside the\ncredential scope return the same `404` shape as absent resources. Provider\ncredentials, raw Telegram identity, and protected provider responses are\nnever part of this API.\n",
7
7
  "termsOfService": "https://flowxo.com/terms",
8
8
  "contact": {
@@ -407,6 +407,46 @@
407
407
  }
408
408
  }
409
409
  },
410
+ "/v1/projects/{project_id}/environments/{environment_id}/notification-preferences/bindings/{binding_id}/resume": {
411
+ "post": {
412
+ "operationId": "resumeOperatorBinding",
413
+ "x-notification-scopes": ["notifications:self", "notifications:team"],
414
+ "summary": "resumeOperatorBinding",
415
+ "description": "Resumes one of the authenticated person's own paused channels. Only the authenticated human can manage personal preferences; this never establishes consent or revives a revoked binding.",
416
+ "tags": ["Operators"],
417
+ "security": [
418
+ { "clerkSession": [] },
419
+ { "bearerCredential": [] },
420
+ { "bearerGrant": ["messages:write"] },
421
+ { "bearerGrant": ["notifications:self"] },
422
+ { "bearerGrant": ["notifications:team"] }
423
+ ],
424
+ "x-required-scopes": ["messages:write"],
425
+ "parameters": [
426
+ { "$ref": "#/components/parameters/ProjectId" },
427
+ { "$ref": "#/components/parameters/EnvironmentId" },
428
+ {
429
+ "in": "path",
430
+ "name": "binding_id",
431
+ "required": true,
432
+ "schema": { "$ref": "#/components/schemas/OpaqueIdentifier" }
433
+ }
434
+ ],
435
+ "responses": {
436
+ "200": {
437
+ "description": "Authorized result.",
438
+ "content": {
439
+ "application/json": {
440
+ "schema": { "$ref": "#/components/schemas/OperatorPreferences" }
441
+ }
442
+ }
443
+ },
444
+ "401": { "$ref": "#/components/responses/Unauthorized" },
445
+ "403": { "$ref": "#/components/responses/Forbidden" },
446
+ "404": { "$ref": "#/components/responses/NotFound" }
447
+ }
448
+ }
449
+ },
410
450
  "/v1/projects/{project_id}/environments/{environment_id}/notification-preferences/connect": {
411
451
  "post": {
412
452
  "operationId": "connectOperatorChannel",
@@ -11897,6 +11937,29 @@
11897
11937
  "settings": {
11898
11938
  "$ref": "#/components/schemas/SubscriberChannelSettings"
11899
11939
  },
11940
+ "accounts": {
11941
+ "type": "array",
11942
+ "maxItems": 10,
11943
+ "description": "Who each of your connected channels reaches, as the channel named you when you connected: a Telegram or Slack name and username, by binding. Kept only on the Standard privacy setting, so it is empty otherwise.",
11944
+ "items": {
11945
+ "type": "object",
11946
+ "required": ["binding_id"],
11947
+ "properties": {
11948
+ "binding_id": {
11949
+ "type": "string",
11950
+ "minLength": 1,
11951
+ "maxLength": 128
11952
+ },
11953
+ "name": { "type": "string", "minLength": 1, "maxLength": 254 },
11954
+ "username": {
11955
+ "type": "string",
11956
+ "minLength": 1,
11957
+ "maxLength": 80
11958
+ }
11959
+ },
11960
+ "additionalProperties": false
11961
+ }
11962
+ },
11900
11963
  "connections": {
11901
11964
  "type": "array",
11902
11965
  "items": {
@@ -11957,7 +12020,7 @@
11957
12020
  },
11958
12021
  "MessageListEntry": {
11959
12022
  "type": "object",
11960
- "description": "Content-free accepted-message summary. Includes neither the notification nor an interaction answer.",
12023
+ "description": "Accepted-message summary: a one-line snippet of what the message said, and no interaction answer.",
11961
12024
  "required": [
11962
12025
  "accepted_at",
11963
12026
  "diagnostic_id",
@@ -12005,6 +12068,16 @@
12005
12068
  "classified_error": {
12006
12069
  "$ref": "#/components/schemas/ClassifiedError"
12007
12070
  },
12071
+ "content_snippet": {
12072
+ "type": "string",
12073
+ "minLength": 1,
12074
+ "maxLength": 121,
12075
+ "description": "The start of what the message said, on one line: its text, or the title of block content, cut to 120 characters with an ellipsis. Absent when `content_retained` is false."
12076
+ },
12077
+ "content_retained": {
12078
+ "type": "boolean",
12079
+ "description": "False once the message's content has been deleted at the end of its retention period (7 days, or 90 on paid plans, after it finished). The rest of the entry is kept."
12080
+ },
12008
12081
  "channel": { "$ref": "#/components/schemas/Channel" }
12009
12082
  },
12010
12083
  "additionalProperties": false
@@ -18716,6 +18789,11 @@
18716
18789
  "maxLength": 254,
18717
18790
  "description": "What to call this subscriber: `display_name` when your application sent one, otherwise the name their channel gave when they connected (a Telegram username, a Slack display name, an email address), which is kept only on the standard privacy setting. Absent when there is neither; show `subscriber_id` then."
18718
18791
  },
18792
+ "team_member": {
18793
+ "type": "boolean",
18794
+ "const": true,
18795
+ "description": "Present when this subscriber is someone on your WhooshBang team, messaged through the operators group. `name` is then their WhooshBang account name. They manage their own channels in notification preferences, so the subscriber can be read but not renamed, paused or erased."
18796
+ },
18719
18797
  "locale": { "$ref": "#/components/schemas/RecipientLanguage" },
18720
18798
  "time_zone": { "$ref": "#/components/schemas/TimeZone" },
18721
18799
  "channels": {
@@ -21485,7 +21563,7 @@
21485
21563
  "provider-capabilities-v1.schema": {
21486
21564
  "$schema": "https://json-schema.org/draft/2020-12/schema",
21487
21565
  "$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
21488
- "x-contract-version": "3.0.0",
21566
+ "x-contract-version": "3.1.0",
21489
21567
  "title": "ProviderCapabilitiesV1",
21490
21568
  "description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
21491
21569
  "type": "object",
@@ -22287,5 +22365,5 @@
22287
22365
  }
22288
22366
  }
22289
22367
  },
22290
- "x-contract-version": "3.0.0"
22368
+ "x-contract-version": "3.1.0"
22291
22369
  }
@@ -1,10 +1,10 @@
1
1
  openapi: 3.1.1
2
2
  jsonSchemaDialect: https://json-schema.org/draft/2020-12/schema
3
3
  # whooshbang:public-origin production api https://api.whooshbang.com
4
- x-contract-version: 3.0.0
4
+ x-contract-version: 3.1.0
5
5
  info:
6
6
  title: WhooshBang API
7
- version: 3.0.0
7
+ version: 3.1.0
8
8
  description: |
9
9
  The V1 contract for human organization/project administration, project-scoped
10
10
  subscription links, and asynchronous text messages. A Clerk session selects
@@ -327,6 +327,41 @@ paths:
327
327
  $ref: "#/components/responses/Unauthorized"
328
328
  "403":
329
329
  $ref: "#/components/responses/Forbidden"
330
+ /v1/projects/{project_id}/environments/{environment_id}/notification-preferences/bindings/{binding_id}/resume:
331
+ post:
332
+ operationId: resumeOperatorBinding
333
+ x-notification-scopes: [notifications:self, notifications:team]
334
+ summary: resumeOperatorBinding
335
+ description: Resumes one of the authenticated person's own paused channels. Only the authenticated human can manage personal preferences; this never establishes consent or revives a revoked binding.
336
+ tags: [Operators]
337
+ security:
338
+ - clerkSession: []
339
+ - bearerCredential: []
340
+ - bearerGrant: [messages:write]
341
+ - bearerGrant: [notifications:self]
342
+ - bearerGrant: [notifications:team]
343
+ x-required-scopes: [messages:write]
344
+ parameters:
345
+ - $ref: "#/components/parameters/ProjectId"
346
+ - $ref: "#/components/parameters/EnvironmentId"
347
+ - in: path
348
+ name: binding_id
349
+ required: true
350
+ schema:
351
+ $ref: "../schemas/whooshbang-v1.schema.json#/$defs/OpaqueIdentifier"
352
+ responses:
353
+ "200":
354
+ description: Authorized result.
355
+ content:
356
+ application/json:
357
+ schema:
358
+ $ref: "#/components/schemas/OperatorPreferences"
359
+ "401":
360
+ $ref: "#/components/responses/Unauthorized"
361
+ "403":
362
+ $ref: "#/components/responses/Forbidden"
363
+ "404":
364
+ $ref: "#/components/responses/NotFound"
330
365
  /v1/projects/{project_id}/environments/{environment_id}/notification-preferences/connect:
331
366
  post:
332
367
  operationId: connectOperatorChannel
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whooshbang/contracts",
3
- "version": "3.0.0",
3
+ "version": "3.1.0",
4
4
  "description": "Versioned public contracts for WhooshBang",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/core-scenario.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "CoreContractScenario",
6
6
  "description": "A deterministic C0-02 semantic, state, idempotency, or isolation scenario.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/agent-binding-degraded-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "AgentBindingDegradedEventV1",
6
6
  "description": "An agent binding entered a provider-neutral degraded state.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/AgentBindingDegradedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/interaction-expired-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "InteractionExpiredEventV1",
6
6
  "description": "An interaction reached its terminal expiry without a valid answer.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/InteractionExpiredEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/interaction-received-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "InteractionReceivedEventV1",
6
6
  "description": "One authenticated, provider-neutral interaction answer was received.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/InteractionReceivedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/message-delivered-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "MessageDeliveredEventV1",
6
6
  "description": "A provider supplied trustworthy evidence that a message was delivered.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/MessageDeliveredEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/message-expired-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "MessageExpiredEventV1",
6
6
  "description": "A message expired before reaching a later delivery state.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/MessageExpiredEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/message-failed-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "MessageFailedEventV1",
6
6
  "description": "A message reached a classified terminal failure.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/MessageFailedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/message-provider-accepted-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "MessageProviderAcceptedEventV1",
6
6
  "description": "The provider accepted a message without implying delivery.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/MessageProviderAcceptedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/subscription-activated-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "SubscriptionActivatedEventV1",
6
6
  "description": "A subscription became active with a safe public channel binding.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/SubscriptionActivatedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/subscription-revoked-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "SubscriptionRevokedEventV1",
6
6
  "description": "A subscription and its safe public channel binding were revoked.",
7
7
  "$ref": "whooshbang-event-v1.schema.json#/$defs/SubscriptionRevokedEvent"
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/events/whooshbang-event-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "WhooshBangEventV1ContractDocument",
6
6
  "description": "Strict public customer-event envelope and initial WhooshBang event union.",
7
7
  "oneOf": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/fixture-index.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "CoreFixtureIndex",
6
6
  "description": "The machine-readable index of deterministic C0-02 through C0-04 golden fixtures.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/interaction-machine-scenario.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "InteractionMachineScenario",
6
6
  "description": "A deterministic C0-03 interaction, credential, authorization, polling, acknowledgement, or quarantine scenario.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/interaction-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "InteractionV1ContractDocument",
6
6
  "description": "Provider-neutral confirm, single-select, input, lifecycle, callback-token, and authenticated answer-event contracts.",
7
7
  "$defs": {
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/machine-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "MachineV1ContractDocument",
6
6
  "description": "Machine-client administration, locally generated credential metadata, durable long-poll, and contiguous acknowledgement contracts.",
7
7
  "oneOf": [
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "ProviderCapabilitiesV1",
6
6
  "description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/webhooks/webhook-delivery-case-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "WebhookDeliveryCaseSetV1",
6
6
  "description": "Deterministic customer webhook response classification, Retry-After, and delivery-bound cases.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/webhooks/webhook-signing-vector-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "WebhookSigningVectorSetV1",
6
6
  "description": "Language-neutral deterministic Standard Webhooks V1 verification vectors. All key material is public synthetic test data and must never be used outside fixtures.",
7
7
  "type": "object",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://whooshbang.flowxo.com/schemas/whooshbang-v1.schema.json",
4
- "x-contract-version": "3.0.0",
4
+ "x-contract-version": "3.1.0",
5
5
  "title": "WhooshBangV1ContractDocument",
6
6
  "description": "Public request, resource, summary, and Problem Details models for the WhooshBang V1 REST API.",
7
7
  "anyOf": [
@@ -3764,6 +3764,11 @@
3764
3764
  "maxLength": 254,
3765
3765
  "description": "What to call this subscriber: `display_name` when your application sent one, otherwise the name their channel gave when they connected (a Telegram username, a Slack display name, an email address), which is kept only on the standard privacy setting. Absent when there is neither; show `subscriber_id` then."
3766
3766
  },
3767
+ "team_member": {
3768
+ "type": "boolean",
3769
+ "const": true,
3770
+ "description": "Present when this subscriber is someone on your WhooshBang team, messaged through the operators group. `name` is then their WhooshBang account name. They manage their own channels in notification preferences, so the subscriber can be read but not renamed, paused or erased."
3771
+ },
3767
3772
  "locale": {
3768
3773
  "$ref": "#/$defs/RecipientLanguage"
3769
3774
  },
@@ -9984,7 +9989,7 @@
9984
9989
  },
9985
9990
  "MessageListEntry": {
9986
9991
  "type": "object",
9987
- "description": "Content-free accepted-message summary. Includes neither the notification nor an interaction answer.",
9992
+ "description": "Accepted-message summary: a one-line snippet of what the message said, and no interaction answer.",
9988
9993
  "required": [
9989
9994
  "accepted_at",
9990
9995
  "diagnostic_id",
@@ -10055,6 +10060,16 @@
10055
10060
  "classified_error": {
10056
10061
  "$ref": "#/$defs/ClassifiedError"
10057
10062
  },
10063
+ "content_snippet": {
10064
+ "type": "string",
10065
+ "minLength": 1,
10066
+ "maxLength": 121,
10067
+ "description": "The start of what the message said, on one line: its text, or the title of block content, cut to 120 characters with an ellipsis. Absent when `content_retained` is false."
10068
+ },
10069
+ "content_retained": {
10070
+ "type": "boolean",
10071
+ "description": "False once the message's content has been deleted at the end of its retention period (7 days, or 90 on paid plans, after it finished). The rest of the entry is kept."
10072
+ },
10058
10073
  "channel": {
10059
10074
  "$ref": "#/$defs/Channel"
10060
10075
  }
@@ -11952,6 +11967,25 @@
11952
11967
  "settings": {
11953
11968
  "$ref": "#/$defs/SubscriberChannelSettings"
11954
11969
  },
11970
+ "accounts": {
11971
+ "type": "array",
11972
+ "maxItems": 10,
11973
+ "description": "Who each of your connected channels reaches, as the channel named you when you connected: a Telegram or Slack name and username, by binding. Kept only on the Standard privacy setting, so it is empty otherwise.",
11974
+ "items": {
11975
+ "type": "object",
11976
+ "required": ["binding_id"],
11977
+ "properties": {
11978
+ "binding_id": {
11979
+ "type": "string",
11980
+ "minLength": 1,
11981
+ "maxLength": 128
11982
+ },
11983
+ "name": { "type": "string", "minLength": 1, "maxLength": 254 },
11984
+ "username": { "type": "string", "minLength": 1, "maxLength": 80 }
11985
+ },
11986
+ "additionalProperties": false
11987
+ }
11988
+ },
11955
11989
  "connections": {
11956
11990
  "type": "array",
11957
11991
  "items": {