@whooshbang/contracts 2.2.0 → 2.3.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 (96) hide show
  1. package/CHANGELOG.md +6 -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/interaction-v1.d.ts +72 -4
  6. package/dist/generated/validators-standalone.d.ts +492 -480
  7. package/dist/generated/validators-standalone.js +4191 -2276
  8. package/dist/generated/validators-standalone.js.map +1 -1
  9. package/dist/generated/validators.d.ts +2 -1
  10. package/dist/generated/validators.js +2 -1
  11. package/dist/generated/validators.js.map +1 -1
  12. package/dist/generated/whooshbang-v1.d.ts +94 -17
  13. package/dist/index.d.ts +3 -2
  14. package/dist/index.js +2 -1
  15. package/dist/index.js.map +1 -1
  16. package/dist/interaction-expiry.d.ts +17 -0
  17. package/dist/interaction-expiry.js +67 -0
  18. package/dist/interaction-expiry.js.map +1 -0
  19. package/fixtures/core-v1/fixture-index.json +1 -1
  20. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +1 -1
  21. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +1 -1
  22. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +1 -1
  23. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +1 -1
  24. package/fixtures/core-v1/scenarios/cancellation-too-late.json +1 -1
  25. package/fixtures/core-v1/scenarios/cross-organization-project.json +1 -1
  26. package/fixtures/core-v1/scenarios/cross-project-resource.json +1 -1
  27. package/fixtures/core-v1/scenarios/environment-mismatch.json +1 -1
  28. package/fixtures/core-v1/scenarios/idempotency-conflict.json +1 -1
  29. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +1 -1
  30. package/fixtures/core-v1/scenarios/malformed-bearer.json +1 -1
  31. package/fixtures/core-v1/scenarios/metadata-overrun.json +1 -1
  32. package/fixtures/core-v1/scenarios/missing-scope.json +1 -1
  33. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +1 -1
  34. package/fixtures/core-v1/scenarios/project-slug-conflict.json +1 -1
  35. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +1 -1
  36. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +1 -1
  37. package/fixtures/core-v1/scenarios/subscription-authorization-capability-opacity.json +1 -1
  38. package/fixtures/core-v1/scenarios/subscription-cross-connection-callback-rejected.json +1 -1
  39. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +1 -1
  40. package/fixtures/core-v1/scenarios/subscription-selected-connection-replay.json +1 -1
  41. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +1 -1
  42. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +1 -1
  43. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +1 -1
  44. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +1 -1
  45. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +1 -1
  46. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +1 -1
  47. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +1 -1
  48. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +1 -1
  49. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +1 -1
  50. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +1 -1
  51. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +1 -1
  52. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +1 -1
  53. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +1 -1
  54. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +1 -1
  55. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +1 -1
  56. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +1 -1
  57. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +1 -1
  58. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +1 -1
  59. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +1 -1
  60. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +1 -1
  61. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +1 -1
  62. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +1 -1
  63. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +1 -1
  64. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +1 -1
  65. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +1 -1
  66. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +1 -1
  67. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +1 -1
  68. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +1 -1
  69. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +1 -1
  70. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +1 -1
  71. package/fixtures/recipient-experience-v1/scenarios/membership-broadcast-snapshot.json +1 -1
  72. package/fixtures/recipient-experience-v1/scenarios/preferred-binding-resolution.json +1 -1
  73. package/fixtures/recipient-experience-v1/scenarios/recipient-session-security.json +1 -1
  74. package/fixtures/recipient-experience-v1/scenarios/subscriber-initial-groups-transaction.json +1 -1
  75. package/openapi/generated/whooshbang-v1.bundle.json +128 -20
  76. package/openapi/whooshbang-v1.yaml +4 -2
  77. package/package.json +1 -1
  78. package/schemas/core-scenario.schema.json +1 -1
  79. package/schemas/events/agent-binding-degraded-v1.schema.json +1 -1
  80. package/schemas/events/interaction-expired-v1.schema.json +1 -1
  81. package/schemas/events/interaction-received-v1.schema.json +1 -1
  82. package/schemas/events/message-delivered-v1.schema.json +1 -1
  83. package/schemas/events/message-expired-v1.schema.json +1 -1
  84. package/schemas/events/message-failed-v1.schema.json +1 -1
  85. package/schemas/events/message-provider-accepted-v1.schema.json +1 -1
  86. package/schemas/events/subscription-activated-v1.schema.json +1 -1
  87. package/schemas/events/subscription-revoked-v1.schema.json +1 -1
  88. package/schemas/events/whooshbang-event-v1.schema.json +1 -1
  89. package/schemas/fixture-index.schema.json +1 -1
  90. package/schemas/interaction-machine-scenario.schema.json +1 -1
  91. package/schemas/interaction-v1.schema.json +151 -19
  92. package/schemas/machine-v1.schema.json +1 -1
  93. package/schemas/provider-capabilities-v1.schema.json +1 -1
  94. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +1 -1
  95. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +1 -1
  96. package/schemas/whooshbang-v1.schema.json +52 -48
@@ -2,7 +2,7 @@
2
2
  "openapi": "3.1.1",
3
3
  "info": {
4
4
  "title": "WhooshBang API",
5
- "version": "2.2.0",
5
+ "version": "2.3.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": {
@@ -11203,7 +11203,9 @@
11203
11203
  "maxLength": 128
11204
11204
  },
11205
11205
  "metadata": { "$ref": "#/components/schemas/Metadata" },
11206
- "interaction": { "$ref": "#/components/schemas/InteractionRequest" },
11206
+ "interaction": {
11207
+ "$ref": "#/components/schemas/InteractionSendRequest"
11208
+ },
11207
11209
  "purpose": {
11208
11210
  "enum": ["service", "marketing"],
11209
11211
  "default": "service",
@@ -12597,7 +12599,9 @@
12597
12599
  "description": "The words a `subscriber_message` test sends, as plain text."
12598
12600
  },
12599
12601
  "content": { "$ref": "#/components/schemas/MessageContent" },
12600
- "interaction": { "$ref": "#/components/schemas/InteractionRequest" }
12602
+ "interaction": {
12603
+ "$ref": "#/components/schemas/InteractionSendRequest"
12604
+ }
12601
12605
  },
12602
12606
  "allOf": [
12603
12607
  {
@@ -15502,7 +15506,9 @@
15502
15506
  "maxLength": 128
15503
15507
  },
15504
15508
  "metadata": { "$ref": "#/components/schemas/Metadata" },
15505
- "interaction": { "$ref": "#/components/schemas/InteractionRequest" },
15509
+ "interaction": {
15510
+ "$ref": "#/components/schemas/InteractionSendRequest"
15511
+ },
15506
15512
  "purpose": {
15507
15513
  "enum": ["service", "marketing"],
15508
15514
  "default": "service",
@@ -16363,6 +16369,14 @@
16363
16369
  ],
16364
16370
  "additionalProperties": false
16365
16371
  },
16372
+ "InteractionSendRequest": {
16373
+ "description": "Send-time interaction. Choose expires_in_seconds or expires_at; omit both for 24 hours from server acceptance. Idempotent replays retain the original resolved deadline.",
16374
+ "oneOf": [
16375
+ { "$ref": "#/components/schemas/ConfirmInteractionSendRequest" },
16376
+ { "$ref": "#/components/schemas/SelectInteractionSendRequest" },
16377
+ { "$ref": "#/components/schemas/InputInteractionSendRequest" }
16378
+ ]
16379
+ },
16366
16380
  "InteractionRequest": {
16367
16381
  "description": "A required-type tagged union. C0 supports confirm, single-select, and input only.",
16368
16382
  "oneOf": [
@@ -18186,7 +18200,9 @@
18186
18200
  "maxLength": 128
18187
18201
  },
18188
18202
  "metadata": { "$ref": "#/components/schemas/Metadata" },
18189
- "interaction": { "$ref": "#/components/schemas/InteractionRequest" },
18203
+ "interaction": {
18204
+ "$ref": "#/components/schemas/InteractionSendRequest"
18205
+ },
18190
18206
  "purpose": {
18191
18207
  "enum": ["service", "marketing"],
18192
18208
  "default": "service",
@@ -18231,7 +18247,11 @@
18231
18247
  "accepted_at": { "$ref": "#/components/schemas/Timestamp" },
18232
18248
  "updated_at": { "$ref": "#/components/schemas/Timestamp" },
18233
18249
  "expires_at": { "$ref": "#/components/schemas/Timestamp" },
18234
- "diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" }
18250
+ "diagnostic_id": { "$ref": "#/components/schemas/DiagnosticId" },
18251
+ "interaction_expires_at": {
18252
+ "$ref": "#/components/schemas/Timestamp",
18253
+ "description": "Authoritatively resolved answer deadline shared by this broadcast’s interactions, independent of delivery expires_at."
18254
+ }
18235
18255
  },
18236
18256
  "additionalProperties": false
18237
18257
  },
@@ -18671,9 +18691,9 @@
18671
18691
  "pattern": "^[^\\u0000-\\u001F\\u007F]+$",
18672
18692
  "description": "Caller-owned opaque correlation returned as data, never treated as execution authority."
18673
18693
  },
18674
- "ConfirmInteractionRequest": {
18694
+ "ConfirmInteractionSendRequest": {
18675
18695
  "type": "object",
18676
- "required": ["type", "prompt", "expires_at"],
18696
+ "required": ["type", "prompt"],
18677
18697
  "properties": {
18678
18698
  "type": { "const": "confirm" },
18679
18699
  "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
@@ -18685,13 +18705,22 @@
18685
18705
  "deny_label": { "type": "string", "minLength": 1, "maxLength": 40 },
18686
18706
  "expires_at": {
18687
18707
  "$ref": "#/components/schemas/Timestamp-2",
18688
- "description": "Must be 30 seconds through 24 hours after server acceptance."
18708
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
18689
18709
  },
18690
18710
  "correlation_id": {
18691
18711
  "$ref": "#/components/schemas/InteractionCorrelationId"
18712
+ },
18713
+ "expires_in_seconds": {
18714
+ "type": "integer",
18715
+ "minimum": 30,
18716
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
18692
18717
  }
18693
18718
  },
18694
- "additionalProperties": false
18719
+ "additionalProperties": false,
18720
+ "not": {
18721
+ "required": ["expires_at", "expires_in_seconds"],
18722
+ "properties": { "expires_at": {}, "expires_in_seconds": {} }
18723
+ }
18695
18724
  },
18696
18725
  "InteractionOption": {
18697
18726
  "type": "object",
@@ -18714,9 +18743,9 @@
18714
18743
  },
18715
18744
  "additionalProperties": false
18716
18745
  },
18717
- "SelectInteractionRequest": {
18746
+ "SelectInteractionSendRequest": {
18718
18747
  "type": "object",
18719
- "required": ["type", "prompt", "options", "expires_at"],
18748
+ "required": ["type", "prompt", "options"],
18720
18749
  "properties": {
18721
18750
  "type": { "const": "select" },
18722
18751
  "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
@@ -18729,29 +18758,47 @@
18729
18758
  },
18730
18759
  "expires_at": {
18731
18760
  "$ref": "#/components/schemas/Timestamp-2",
18732
- "description": "Must be 30 seconds through 24 hours after server acceptance."
18761
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
18733
18762
  },
18734
18763
  "correlation_id": {
18735
18764
  "$ref": "#/components/schemas/InteractionCorrelationId"
18765
+ },
18766
+ "expires_in_seconds": {
18767
+ "type": "integer",
18768
+ "minimum": 30,
18769
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
18736
18770
  }
18737
18771
  },
18738
- "additionalProperties": false
18772
+ "additionalProperties": false,
18773
+ "not": {
18774
+ "required": ["expires_at", "expires_in_seconds"],
18775
+ "properties": { "expires_at": {}, "expires_in_seconds": {} }
18776
+ }
18739
18777
  },
18740
- "InputInteractionRequest": {
18778
+ "InputInteractionSendRequest": {
18741
18779
  "type": "object",
18742
- "required": ["type", "prompt", "expires_at"],
18780
+ "required": ["type", "prompt"],
18743
18781
  "properties": {
18744
18782
  "type": { "const": "input" },
18745
18783
  "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
18746
18784
  "expires_at": {
18747
18785
  "$ref": "#/components/schemas/Timestamp-2",
18748
- "description": "Must be 30 seconds through 24 hours after server acceptance."
18786
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
18749
18787
  },
18750
18788
  "correlation_id": {
18751
18789
  "$ref": "#/components/schemas/InteractionCorrelationId"
18790
+ },
18791
+ "expires_in_seconds": {
18792
+ "type": "integer",
18793
+ "minimum": 30,
18794
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
18752
18795
  }
18753
18796
  },
18754
- "additionalProperties": false
18797
+ "additionalProperties": false,
18798
+ "not": {
18799
+ "required": ["expires_at", "expires_in_seconds"],
18800
+ "properties": { "expires_at": {}, "expires_in_seconds": {} }
18801
+ }
18755
18802
  },
18756
18803
  "HighestProvenProviderState": {
18757
18804
  "type": "string",
@@ -20340,7 +20387,7 @@
20340
20387
  "provider-capabilities-v1.schema": {
20341
20388
  "$schema": "https://json-schema.org/draft/2020-12/schema",
20342
20389
  "$id": "https://whooshbang.flowxo.com/schemas/provider-capabilities-v1.schema.json",
20343
- "x-contract-version": "2.2.0",
20390
+ "x-contract-version": "2.3.0",
20344
20391
  "title": "ProviderCapabilitiesV1",
20345
20392
  "description": "Provider-neutral, renderer-facing delivery and interaction capabilities with explicit degradation.",
20346
20393
  "type": "object",
@@ -20601,6 +20648,67 @@
20601
20648
  },
20602
20649
  "additionalProperties": false
20603
20650
  },
20651
+ "ConfirmInteractionRequest": {
20652
+ "type": "object",
20653
+ "required": ["type", "prompt", "expires_at"],
20654
+ "properties": {
20655
+ "type": { "const": "confirm" },
20656
+ "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
20657
+ "confirm_label": {
20658
+ "type": "string",
20659
+ "minLength": 1,
20660
+ "maxLength": 40
20661
+ },
20662
+ "deny_label": { "type": "string", "minLength": 1, "maxLength": 40 },
20663
+ "expires_at": {
20664
+ "$ref": "#/components/schemas/Timestamp-2",
20665
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
20666
+ },
20667
+ "correlation_id": {
20668
+ "$ref": "#/components/schemas/InteractionCorrelationId"
20669
+ }
20670
+ },
20671
+ "additionalProperties": false
20672
+ },
20673
+ "SelectInteractionRequest": {
20674
+ "type": "object",
20675
+ "required": ["type", "prompt", "options", "expires_at"],
20676
+ "properties": {
20677
+ "type": { "const": "select" },
20678
+ "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
20679
+ "options": {
20680
+ "type": "array",
20681
+ "minItems": 2,
20682
+ "maxItems": 6,
20683
+ "items": { "$ref": "#/components/schemas/InteractionOption" },
20684
+ "x-unique-property": "value"
20685
+ },
20686
+ "expires_at": {
20687
+ "$ref": "#/components/schemas/Timestamp-2",
20688
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
20689
+ },
20690
+ "correlation_id": {
20691
+ "$ref": "#/components/schemas/InteractionCorrelationId"
20692
+ }
20693
+ },
20694
+ "additionalProperties": false
20695
+ },
20696
+ "InputInteractionRequest": {
20697
+ "type": "object",
20698
+ "required": ["type", "prompt", "expires_at"],
20699
+ "properties": {
20700
+ "type": { "const": "input" },
20701
+ "prompt": { "$ref": "#/components/schemas/InteractionPrompt" },
20702
+ "expires_at": {
20703
+ "$ref": "#/components/schemas/Timestamp-2",
20704
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
20705
+ },
20706
+ "correlation_id": {
20707
+ "$ref": "#/components/schemas/InteractionCorrelationId"
20708
+ }
20709
+ },
20710
+ "additionalProperties": false
20711
+ },
20604
20712
  "EmailBindingImportRow": {
20605
20713
  "type": "object",
20606
20714
  "required": ["subscriber_id", "notifier_id", "address", "consent"],
@@ -21060,5 +21168,5 @@
21060
21168
  }
21061
21169
  }
21062
21170
  },
21063
- "x-contract-version": "2.2.0"
21171
+ "x-contract-version": "2.3.0"
21064
21172
  }
@@ -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.2.0
4
+ x-contract-version: 2.3.0
5
5
  info:
6
6
  title: WhooshBang API
7
- version: 2.2.0
7
+ version: 2.3.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
@@ -8849,6 +8849,8 @@ components:
8849
8849
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/Message
8850
8850
  Problem:
8851
8851
  $ref: ../schemas/whooshbang-v1.schema.json#/$defs/Problem
8852
+ InteractionSendRequest:
8853
+ $ref: ../schemas/interaction-v1.schema.json#/$defs/InteractionSendRequest
8852
8854
  InteractionRequest:
8853
8855
  $ref: ../schemas/interaction-v1.schema.json#/$defs/InteractionRequest
8854
8856
  InteractionSummary:
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@whooshbang/contracts",
3
- "version": "2.2.0",
3
+ "version": "2.3.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.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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": "2.2.0",
4
+ "x-contract-version": "2.3.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,23 +1,9 @@
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": "2.2.0",
4
+ "x-contract-version": "2.3.0",
5
5
  "title": "InteractionV1ContractDocument",
6
6
  "description": "Provider-neutral confirm, single-select, input, lifecycle, callback-token, and authenticated answer-event contracts.",
7
- "oneOf": [
8
- {
9
- "$ref": "#/$defs/InteractionRequest"
10
- },
11
- {
12
- "$ref": "#/$defs/InteractionSummary"
13
- },
14
- {
15
- "$ref": "#/$defs/InteractionEvent"
16
- },
17
- {
18
- "$ref": "#/$defs/ProviderCallbackToken"
19
- }
20
- ],
21
7
  "$defs": {
22
8
  "OpaqueIdentifier": {
23
9
  "type": "string",
@@ -90,7 +76,7 @@
90
76
  },
91
77
  "expires_at": {
92
78
  "$ref": "#/$defs/Timestamp",
93
- "description": "Must be 30 seconds through 24 hours after server acceptance."
79
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
94
80
  },
95
81
  "correlation_id": {
96
82
  "$ref": "#/$defs/InteractionCorrelationId"
@@ -119,7 +105,7 @@
119
105
  },
120
106
  "expires_at": {
121
107
  "$ref": "#/$defs/Timestamp",
122
- "description": "Must be 30 seconds through 24 hours after server acceptance."
108
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
123
109
  },
124
110
  "correlation_id": {
125
111
  "$ref": "#/$defs/InteractionCorrelationId"
@@ -139,7 +125,7 @@
139
125
  },
140
126
  "expires_at": {
141
127
  "$ref": "#/$defs/Timestamp",
142
- "description": "Must be 30 seconds through 24 hours after server acceptance."
128
+ "description": "At least 30 seconds after server acceptance; no fixed maximum. A resolved RFC3339 deadline with millisecond precision, no later than 9999-12-31T23:59:59.999Z."
143
129
  },
144
130
  "correlation_id": {
145
131
  "$ref": "#/$defs/InteractionCorrelationId"
@@ -486,6 +472,152 @@
486
472
  "type": "string",
487
473
  "pattern": "^itok_[A-Za-z0-9_-]{21}[AQgw]$",
488
474
  "description": "An opaque single-purpose reference containing exactly 128 random bits and no trusted identity, answer, command, or business data."
475
+ },
476
+ "ConfirmInteractionSendRequest": {
477
+ "type": "object",
478
+ "required": ["type", "prompt"],
479
+ "properties": {
480
+ "type": {
481
+ "const": "confirm"
482
+ },
483
+ "prompt": {
484
+ "$ref": "#/$defs/InteractionPrompt"
485
+ },
486
+ "confirm_label": {
487
+ "type": "string",
488
+ "minLength": 1,
489
+ "maxLength": 40
490
+ },
491
+ "deny_label": {
492
+ "type": "string",
493
+ "minLength": 1,
494
+ "maxLength": 40
495
+ },
496
+ "expires_at": {
497
+ "$ref": "#/$defs/Timestamp",
498
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
499
+ },
500
+ "correlation_id": {
501
+ "$ref": "#/$defs/InteractionCorrelationId"
502
+ },
503
+ "expires_in_seconds": {
504
+ "type": "integer",
505
+ "minimum": 30,
506
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
507
+ }
508
+ },
509
+ "additionalProperties": false,
510
+ "not": {
511
+ "required": ["expires_at", "expires_in_seconds"],
512
+ "properties": {
513
+ "expires_at": {},
514
+ "expires_in_seconds": {}
515
+ }
516
+ }
517
+ },
518
+ "InteractionSendRequest": {
519
+ "description": "Send-time interaction. Choose expires_in_seconds or expires_at; omit both for 24 hours from server acceptance. Idempotent replays retain the original resolved deadline.",
520
+ "oneOf": [
521
+ {
522
+ "$ref": "#/$defs/ConfirmInteractionSendRequest"
523
+ },
524
+ {
525
+ "$ref": "#/$defs/SelectInteractionSendRequest"
526
+ },
527
+ {
528
+ "$ref": "#/$defs/InputInteractionSendRequest"
529
+ }
530
+ ]
531
+ },
532
+ "SelectInteractionSendRequest": {
533
+ "type": "object",
534
+ "required": ["type", "prompt", "options"],
535
+ "properties": {
536
+ "type": {
537
+ "const": "select"
538
+ },
539
+ "prompt": {
540
+ "$ref": "#/$defs/InteractionPrompt"
541
+ },
542
+ "options": {
543
+ "type": "array",
544
+ "minItems": 2,
545
+ "maxItems": 6,
546
+ "items": {
547
+ "$ref": "#/$defs/InteractionOption"
548
+ },
549
+ "x-unique-property": "value"
550
+ },
551
+ "expires_at": {
552
+ "$ref": "#/$defs/Timestamp",
553
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
554
+ },
555
+ "correlation_id": {
556
+ "$ref": "#/$defs/InteractionCorrelationId"
557
+ },
558
+ "expires_in_seconds": {
559
+ "type": "integer",
560
+ "minimum": 30,
561
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
562
+ }
563
+ },
564
+ "additionalProperties": false,
565
+ "not": {
566
+ "required": ["expires_at", "expires_in_seconds"],
567
+ "properties": {
568
+ "expires_at": {},
569
+ "expires_in_seconds": {}
570
+ }
571
+ }
572
+ },
573
+ "InputInteractionSendRequest": {
574
+ "type": "object",
575
+ "required": ["type", "prompt"],
576
+ "properties": {
577
+ "type": {
578
+ "const": "input"
579
+ },
580
+ "prompt": {
581
+ "$ref": "#/$defs/InteractionPrompt"
582
+ },
583
+ "expires_at": {
584
+ "$ref": "#/$defs/Timestamp",
585
+ "description": "Absolute RFC3339 deadline with an explicit timezone and at most millisecond precision. At least 30 seconds after server acceptance. Mutually exclusive with expires_in_seconds."
586
+ },
587
+ "correlation_id": {
588
+ "$ref": "#/$defs/InteractionCorrelationId"
589
+ },
590
+ "expires_in_seconds": {
591
+ "type": "integer",
592
+ "minimum": 30,
593
+ "description": "Whole seconds from server acceptance. No fixed maximum; the resolved timestamp must be representable through year 9999. Mutually exclusive with expires_at. Omit both for 86400 seconds (24 hours)."
594
+ }
595
+ },
596
+ "additionalProperties": false,
597
+ "not": {
598
+ "required": ["expires_at", "expires_in_seconds"],
599
+ "properties": {
600
+ "expires_at": {},
601
+ "expires_in_seconds": {}
602
+ }
603
+ }
604
+ }
605
+ },
606
+ "anyOf": [
607
+ {
608
+ "$ref": "#/$defs/InteractionRequest"
609
+ },
610
+ {
611
+ "$ref": "#/$defs/InteractionSummary"
612
+ },
613
+ {
614
+ "$ref": "#/$defs/InteractionEvent"
615
+ },
616
+ {
617
+ "$ref": "#/$defs/ProviderCallbackToken"
618
+ },
619
+ {
620
+ "$ref": "#/$defs/InteractionSendRequest"
489
621
  }
490
- }
622
+ ]
491
623
  }
@@ -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": "2.2.0",
4
+ "x-contract-version": "2.3.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": [