@whooshbang/contracts 2.6.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 (89) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/contract-manifest.json +32 -33
  3. package/dist/generated/artifact-index.d.ts +34 -34
  4. package/dist/generated/artifact-index.js +32 -33
  5. package/dist/generated/artifact-index.js.map +1 -1
  6. package/dist/generated/validators-standalone.js +2449 -1754
  7. package/dist/generated/validators-standalone.js.map +1 -1
  8. package/dist/generated/validators.js +1 -0
  9. package/dist/generated/validators.js.map +1 -1
  10. package/dist/generated/whooshbang-v1.d.ts +307 -1
  11. package/fixtures/core-v1/fixture-index.json +1 -9
  12. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  13. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  14. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  15. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  16. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  17. package/fixtures/core-v1/scenarios/cross-organization-project.json +1 -1
  18. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  19. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  20. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  21. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  22. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  23. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  24. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  25. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  26. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  27. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  28. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  29. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  30. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  31. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  32. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  33. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  34. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  35. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  36. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  37. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  38. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  39. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  40. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  41. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  42. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  43. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  44. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  45. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  46. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  47. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  48. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  49. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  50. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  51. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  52. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  60. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  61. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  62. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  63. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  64. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  65. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  66. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
  67. package/openapi/generated/whooshbang-v1.bundle.json +93 -9
  68. package/openapi/whooshbang-v1.yaml +38 -3
  69. package/package.json +1 -1
  70. package/schemas/core-scenario.schema.json +1 -1
  71. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  72. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  73. package/schemas/events/interaction-received-v1.schema.json +1 -1
  74. package/schemas/events/message-delivered-v1.schema.json +1 -1
  75. package/schemas/events/message-expired-v1.schema.json +1 -1
  76. package/schemas/events/message-failed-v1.schema.json +1 -1
  77. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  78. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  79. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  80. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  81. package/schemas/fixture-index.schema.json +1 -1
  82. package/schemas/interaction-machine-scenario.schema.json +1 -1
  83. package/schemas/interaction-v1.schema.json +1 -1
  84. package/schemas/machine-v1.schema.json +1 -1
  85. package/schemas/provider-capabilities-v1.schema.json +1 -1
  86. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  87. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  88. package/schemas/whooshbang-v1.schema.json +46 -2
  89. package/fixtures/core-v1/problems/replay-unavailable-rollout.json +0 -16
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "metadata-overrun",
4
4
  "category": "message_outcome",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "missing-scope",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "project-create-equivalent-replay",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "project-slug-conflict",
4
4
  "category": "idempotency",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "provider-outcome-unknown",
4
4
  "category": "message_outcome",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscription-activation-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscription-authorization-capability-opacity",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscription-cross-connection-callback-rejected",
4
4
  "category": "isolation",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscription-expired-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "subscription-selected-connection-replay",
4
4
  "category": "subscription_replay",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "ack-conflict",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "ack-cross-machine",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "ack-out-of-order",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "ack-replay",
4
4
  "category": "machine_ack",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "ambiguous-free-text",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "callback-token-opacity",
4
4
  "category": "callback_token",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "credential-registration-conflict",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "credential-registration-replay",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "credential-revocation-replay",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "credential-rotation",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "first-credential-activates",
4
4
  "category": "machine_credential",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "interaction-duplicate",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "interaction-expired",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "interaction-mismatch",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "interaction-retired",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "interaction-stale",
4
4
  "category": "interaction_resolution",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-admin-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-bound-message-create",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.0",
2
+ "contract_version": "3.1.0",
3
3
  "id": "machine-cancel-denied",
4
4
  "category": "machine_authorization",
5
5
  "given": {
@@ -1,5 +1,5 @@
1
1
  {
2
- "contract_version": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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": "2.6.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
@@ -15777,7 +15850,13 @@
15777
15850
  "last_failure": {
15778
15851
  "$ref": "#/components/schemas/CustomerEndpointFailure"
15779
15852
  },
15780
- "diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" }
15853
+ "diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" },
15854
+ "pause_reason": {
15855
+ "type": "string",
15856
+ "enum": ["customer", "sustained_failure", "probe_failed"]
15857
+ },
15858
+ "next_probe_at": { "$ref": "#/components/schemas/Timestamp" },
15859
+ "recovery_pending": { "type": "boolean" }
15781
15860
  },
15782
15861
  "additionalProperties": false
15783
15862
  },
@@ -18710,6 +18789,11 @@
18710
18789
  "maxLength": 254,
18711
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."
18712
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
+ },
18713
18797
  "locale": { "$ref": "#/components/schemas/RecipientLanguage" },
18714
18798
  "time_zone": { "$ref": "#/components/schemas/TimeZone" },
18715
18799
  "channels": {
@@ -21479,7 +21563,7 @@
21479
21563
  "provider-capabilities-v1.schema": {
21480
21564
  "$schema": "https://json-schema.org/draft/2020-12/schema",
21481
21565
  "$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
21482
- "x-contract-version": "2.6.0",
21566
+ "x-contract-version": "3.1.0",
21483
21567
  "title": "ProviderCapabilitiesV1",
21484
21568
  "description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
21485
21569
  "type": "object",
@@ -22035,15 +22119,15 @@
22035
22119
  "type": "https://whooshbang.flowxo.com/problems/replay_unavailable",
22036
22120
  "title": "Replay unavailable",
22037
22121
  "status": 409,
22038
- "detail": "Customer event replay is not enabled for this project environment.",
22122
+ "detail": "Replay is available only after the latest delivery sequence reaches terminal failure.",
22039
22123
  "code": "replay_unavailable",
22040
- "diagnostic_id": "diag_replay_unavailable_rollout_001",
22124
+ "diagnostic_id": "diag_replay_unavailable_not_terminal_001",
22041
22125
  "retryable": false,
22042
22126
  "field_errors": [
22043
22127
  {
22044
22128
  "field": "/",
22045
- "code": "rollout_disabled",
22046
- "detail": "Customer event replay is not enabled for this project environment."
22129
+ "code": "not_terminal",
22130
+ "detail": "Replay is available only after the latest delivery sequence reaches terminal failure."
22047
22131
  }
22048
22132
  ]
22049
22133
  }
@@ -22281,5 +22365,5 @@
22281
22365
  }
22282
22366
  }
22283
22367
  },
22284
- "x-contract-version": "2.6.0"
22368
+ "x-contract-version": "3.1.0"
22285
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: 2.6.0
4
+ x-contract-version: 3.1.0
5
5
  info:
6
6
  title: WhooshBang API
7
- version: 2.6.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
@@ -9551,7 +9586,7 @@ components:
9551
9586
  projectSlugConflict:
9552
9587
  externalValue: ../fixtures/core-v1/problems/project-slug-conflict.json
9553
9588
  replayUnavailable:
9554
- externalValue: ../fixtures/core-v1/problems/replay-unavailable-rollout.json
9589
+ externalValue: ../fixtures/core-v1/problems/replay-unavailable-not-terminal.json
9555
9590
  Unprocessable:
9556
9591
  description: The request is valid in shape but names no usable authorized binding or registered return destination.
9557
9592
  headers:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whooshbang/contracts",
3
- "version": "2.6.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": "2.6.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",