@whooshbang/contracts 1.0.0-rc.13

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 (229) hide show
  1. package/CHANGELOG.md +198 -0
  2. package/LICENSE +21 -0
  3. package/README.md +120 -0
  4. package/contract-manifest.json +390 -0
  5. package/dist/base64url.d.ts +2 -0
  6. package/dist/base64url.js +51 -0
  7. package/dist/base64url.js.map +1 -0
  8. package/dist/generated/artifact-index.d.ts +205 -0
  9. package/dist/generated/artifact-index.js +396 -0
  10. package/dist/generated/artifact-index.js.map +1 -0
  11. package/dist/generated/contract-manifest.d.ts +66 -0
  12. package/dist/generated/contract-manifest.js +6 -0
  13. package/dist/generated/contract-manifest.js.map +1 -0
  14. package/dist/generated/core-scenario.d.ts +18 -0
  15. package/dist/generated/core-scenario.js +6 -0
  16. package/dist/generated/core-scenario.js.map +1 -0
  17. package/dist/generated/fixture-index.d.ts +33 -0
  18. package/dist/generated/fixture-index.js +6 -0
  19. package/dist/generated/fixture-index.js.map +1 -0
  20. package/dist/generated/interaction-machine-scenario.d.ts +263 -0
  21. package/dist/generated/interaction-machine-scenario.js +6 -0
  22. package/dist/generated/interaction-machine-scenario.js.map +1 -0
  23. package/dist/generated/interaction-v1.d.ts +152 -0
  24. package/dist/generated/interaction-v1.js +6 -0
  25. package/dist/generated/interaction-v1.js.map +1 -0
  26. package/dist/generated/machine-v1.d.ts +169 -0
  27. package/dist/generated/machine-v1.js +6 -0
  28. package/dist/generated/machine-v1.js.map +1 -0
  29. package/dist/generated/provider-capabilities-v1.d.ts +78 -0
  30. package/dist/generated/provider-capabilities-v1.js +6 -0
  31. package/dist/generated/provider-capabilities-v1.js.map +1 -0
  32. package/dist/generated/validators-standalone.d.ts +659 -0
  33. package/dist/generated/validators-standalone.js +47800 -0
  34. package/dist/generated/validators-standalone.js.map +1 -0
  35. package/dist/generated/validators.d.ts +74 -0
  36. package/dist/generated/validators.js +493 -0
  37. package/dist/generated/validators.js.map +1 -0
  38. package/dist/generated/webhook-delivery-case-v1.d.ts +91 -0
  39. package/dist/generated/webhook-delivery-case-v1.js +6 -0
  40. package/dist/generated/webhook-delivery-case-v1.js.map +1 -0
  41. package/dist/generated/webhook-signing-vector-v1.d.ts +88 -0
  42. package/dist/generated/webhook-signing-vector-v1.js +6 -0
  43. package/dist/generated/webhook-signing-vector-v1.js.map +1 -0
  44. package/dist/generated/whooshbang-event-v1.d.ts +191 -0
  45. package/dist/generated/whooshbang-event-v1.js +6 -0
  46. package/dist/generated/whooshbang-event-v1.js.map +1 -0
  47. package/dist/generated/whooshbang-v1.d.ts +1162 -0
  48. package/dist/generated/whooshbang-v1.js +6 -0
  49. package/dist/generated/whooshbang-v1.js.map +1 -0
  50. package/dist/index.d.ts +20 -0
  51. package/dist/index.js +7 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/machine-credential.d.ts +31 -0
  54. package/dist/machine-credential.js +78 -0
  55. package/dist/machine-credential.js.map +1 -0
  56. package/dist/webhook-consumer.d.ts +50 -0
  57. package/dist/webhook-consumer.js +71 -0
  58. package/dist/webhook-consumer.js.map +1 -0
  59. package/dist/webhook-delivery.d.ts +46 -0
  60. package/dist/webhook-delivery.js +126 -0
  61. package/dist/webhook-delivery.js.map +1 -0
  62. package/dist/webhook-signature.d.ts +36 -0
  63. package/dist/webhook-signature.js +255 -0
  64. package/dist/webhook-signature.js.map +1 -0
  65. package/examples/python/verify_webhook.py +283 -0
  66. package/fixtures/.gitkeep +1 -0
  67. package/fixtures/core-v1/fixture-index.json +963 -0
  68. package/fixtures/core-v1/problems/auth-invalid.json +9 -0
  69. package/fixtures/core-v1/problems/authentication-required.json +9 -0
  70. package/fixtures/core-v1/problems/cancellation-too-late.json +9 -0
  71. package/fixtures/core-v1/problems/endpoint-rotation-conflict.json +10 -0
  72. package/fixtures/core-v1/problems/environment-mismatch.json +9 -0
  73. package/fixtures/core-v1/problems/idempotency-conflict.json +9 -0
  74. package/fixtures/core-v1/problems/idempotency-key-required.json +9 -0
  75. package/fixtures/core-v1/problems/project-slug-conflict.json +16 -0
  76. package/fixtures/core-v1/problems/provider-outcome-unknown.json +9 -0
  77. package/fixtures/core-v1/problems/provider-retryable.json +10 -0
  78. package/fixtures/core-v1/problems/provider-terminal.json +9 -0
  79. package/fixtures/core-v1/problems/rate-limited.json +10 -0
  80. package/fixtures/core-v1/problems/replay-unavailable-not-terminal.json +16 -0
  81. package/fixtures/core-v1/problems/replay-unavailable-payload.json +16 -0
  82. package/fixtures/core-v1/problems/replay-unavailable-rollout.json +16 -0
  83. package/fixtures/core-v1/problems/request-invalid.json +16 -0
  84. package/fixtures/core-v1/problems/resource-expired.json +9 -0
  85. package/fixtures/core-v1/problems/resource-not-found.json +9 -0
  86. package/fixtures/core-v1/problems/scope-forbidden.json +9 -0
  87. package/fixtures/core-v1/problems/subscriber-unbound.json +9 -0
  88. package/fixtures/core-v1/requests/create-api-credential.json +9 -0
  89. package/fixtures/core-v1/requests/create-customer-endpoint.json +5 -0
  90. package/fixtures/core-v1/requests/create-message.json +15 -0
  91. package/fixtures/core-v1/requests/create-project.json +4 -0
  92. package/fixtures/core-v1/requests/create-subscription-link.json +5 -0
  93. package/fixtures/core-v1/requests/rotate-api-credential.json +3 -0
  94. package/fixtures/core-v1/requests/rotate-customer-endpoint.json +3 -0
  95. package/fixtures/core-v1/scenarios/api-credential-invalid-indistinguishable.json +14 -0
  96. package/fixtures/core-v1/scenarios/api-credential-one-time-reveal.json +21 -0
  97. package/fixtures/core-v1/scenarios/api-credential-revocation-replay.json +17 -0
  98. package/fixtures/core-v1/scenarios/api-credential-rotation-overlap.json +18 -0
  99. package/fixtures/core-v1/scenarios/cancellation-too-late.json +15 -0
  100. package/fixtures/core-v1/scenarios/cross-account-project.json +14 -0
  101. package/fixtures/core-v1/scenarios/cross-project-resource.json +17 -0
  102. package/fixtures/core-v1/scenarios/environment-mismatch.json +17 -0
  103. package/fixtures/core-v1/scenarios/idempotency-conflict.json +35 -0
  104. package/fixtures/core-v1/scenarios/idempotency-equivalent-replay.json +27 -0
  105. package/fixtures/core-v1/scenarios/malformed-bearer.json +14 -0
  106. package/fixtures/core-v1/scenarios/metadata-overrun.json +14 -0
  107. package/fixtures/core-v1/scenarios/missing-scope.json +15 -0
  108. package/fixtures/core-v1/scenarios/project-create-equivalent-replay.json +26 -0
  109. package/fixtures/core-v1/scenarios/project-slug-conflict.json +21 -0
  110. package/fixtures/core-v1/scenarios/provider-outcome-unknown.json +15 -0
  111. package/fixtures/core-v1/scenarios/subscription-activation-replay.json +18 -0
  112. package/fixtures/core-v1/scenarios/subscription-expired-replay.json +16 -0
  113. package/fixtures/core-v1/success/account-projection.json +11 -0
  114. package/fixtures/core-v1/success/api-credential-collection.json +22 -0
  115. package/fixtures/core-v1/success/api-credential-created.json +20 -0
  116. package/fixtures/core-v1/success/api-credential-revoked.json +19 -0
  117. package/fixtures/core-v1/success/api-credential-rotated.json +41 -0
  118. package/fixtures/core-v1/success/customer-endpoint-attempts.json +15 -0
  119. package/fixtures/core-v1/success/customer-endpoint-collection.json +26 -0
  120. package/fixtures/core-v1/success/customer-endpoint-create-replayed.json +16 -0
  121. package/fixtures/core-v1/success/customer-endpoint-created.json +17 -0
  122. package/fixtures/core-v1/success/customer-endpoint-rotated.json +21 -0
  123. package/fixtures/core-v1/success/message-accepted.json +30 -0
  124. package/fixtures/core-v1/success/message-cancellation-too-late.json +27 -0
  125. package/fixtures/core-v1/success/message-cancelled.json +27 -0
  126. package/fixtures/core-v1/success/message-outcome-unknown.json +33 -0
  127. package/fixtures/core-v1/success/message-provider-accepted.json +30 -0
  128. package/fixtures/core-v1/success/project-collection.json +42 -0
  129. package/fixtures/core-v1/success/project-created.json +38 -0
  130. package/fixtures/core-v1/success/subscription-link-activated.json +22 -0
  131. package/fixtures/core-v1/success/subscription-link-cancelled.json +14 -0
  132. package/fixtures/core-v1/success/subscription-link-paused.json +22 -0
  133. package/fixtures/core-v1/success/subscription-link-pending.json +14 -0
  134. package/fixtures/core-v1/success/subscription-link-revoked.json +22 -0
  135. package/fixtures/interaction-machine-v1/capabilities/providers.json +57 -0
  136. package/fixtures/interaction-machine-v1/capabilities/telegram.json +52 -0
  137. package/fixtures/interaction-machine-v1/events/confirm-answered.json +22 -0
  138. package/fixtures/interaction-machine-v1/events/input-answered.json +22 -0
  139. package/fixtures/interaction-machine-v1/events/input-redacted.json +18 -0
  140. package/fixtures/interaction-machine-v1/events/select-answered.json +22 -0
  141. package/fixtures/interaction-machine-v1/requests/ack-processed.json +5 -0
  142. package/fixtures/interaction-machine-v1/requests/ack-quarantined.json +5 -0
  143. package/fixtures/interaction-machine-v1/requests/create-machine-client.json +6 -0
  144. package/fixtures/interaction-machine-v1/requests/create-message-confirm.json +18 -0
  145. package/fixtures/interaction-machine-v1/requests/create-message-input.json +16 -0
  146. package/fixtures/interaction-machine-v1/requests/create-message-select.json +26 -0
  147. package/fixtures/interaction-machine-v1/requests/register-machine-credential.json +4 -0
  148. package/fixtures/interaction-machine-v1/scenarios/ack-conflict.json +14 -0
  149. package/fixtures/interaction-machine-v1/scenarios/ack-cross-machine.json +15 -0
  150. package/fixtures/interaction-machine-v1/scenarios/ack-out-of-order.json +15 -0
  151. package/fixtures/interaction-machine-v1/scenarios/ack-replay.json +17 -0
  152. package/fixtures/interaction-machine-v1/scenarios/ambiguous-free-text.json +15 -0
  153. package/fixtures/interaction-machine-v1/scenarios/callback-token-opacity.json +16 -0
  154. package/fixtures/interaction-machine-v1/scenarios/credential-registration-conflict.json +16 -0
  155. package/fixtures/interaction-machine-v1/scenarios/credential-registration-replay.json +15 -0
  156. package/fixtures/interaction-machine-v1/scenarios/credential-revocation-replay.json +14 -0
  157. package/fixtures/interaction-machine-v1/scenarios/credential-rotation.json +16 -0
  158. package/fixtures/interaction-machine-v1/scenarios/first-credential-activates.json +15 -0
  159. package/fixtures/interaction-machine-v1/scenarios/interaction-duplicate.json +16 -0
  160. package/fixtures/interaction-machine-v1/scenarios/interaction-expired.json +17 -0
  161. package/fixtures/interaction-machine-v1/scenarios/interaction-mismatch.json +16 -0
  162. package/fixtures/interaction-machine-v1/scenarios/interaction-retired.json +16 -0
  163. package/fixtures/interaction-machine-v1/scenarios/interaction-stale.json +16 -0
  164. package/fixtures/interaction-machine-v1/scenarios/machine-admin-denied.json +14 -0
  165. package/fixtures/interaction-machine-v1/scenarios/machine-bound-message-create.json +22 -0
  166. package/fixtures/interaction-machine-v1/scenarios/machine-cancel-denied.json +14 -0
  167. package/fixtures/interaction-machine-v1/scenarios/machine-crash-before-ack.json +16 -0
  168. package/fixtures/interaction-machine-v1/scenarios/machine-notifier-mismatch.json +14 -0
  169. package/fixtures/interaction-machine-v1/scenarios/machine-other-message-read.json +14 -0
  170. package/fixtures/interaction-machine-v1/scenarios/machine-owned-message-read.json +22 -0
  171. package/fixtures/interaction-machine-v1/scenarios/machine-subscriber-mismatch.json +14 -0
  172. package/fixtures/interaction-machine-v1/scenarios/poll-uncommitted-cursor-rejected.json +17 -0
  173. package/fixtures/interaction-machine-v1/scenarios/project-credential-machine-endpoint-denied.json +14 -0
  174. package/fixtures/interaction-machine-v1/scenarios/quarantine-integrity-rejected.json +15 -0
  175. package/fixtures/interaction-machine-v1/scenarios/quarantine-signature-rejected.json +16 -0
  176. package/fixtures/interaction-machine-v1/scenarios/quarantine-valid.json +15 -0
  177. package/fixtures/interaction-machine-v1/scenarios/revoked-machine-credential.json +15 -0
  178. package/fixtures/interaction-machine-v1/success/ack-out-of-order.json +8 -0
  179. package/fixtures/interaction-machine-v1/success/ack-processed.json +8 -0
  180. package/fixtures/interaction-machine-v1/success/ack-quarantined.json +9 -0
  181. package/fixtures/interaction-machine-v1/success/interaction-answered-confirm.json +10 -0
  182. package/fixtures/interaction-machine-v1/success/interaction-answered-input.json +10 -0
  183. package/fixtures/interaction-machine-v1/success/interaction-answered-redacted.json +8 -0
  184. package/fixtures/interaction-machine-v1/success/interaction-answered-select.json +10 -0
  185. package/fixtures/interaction-machine-v1/success/interaction-open.json +7 -0
  186. package/fixtures/interaction-machine-v1/success/machine-client-active.json +20 -0
  187. package/fixtures/interaction-machine-v1/success/machine-client-provisioning.json +19 -0
  188. package/fixtures/interaction-machine-v1/success/machine-client-revoked.json +21 -0
  189. package/fixtures/interaction-machine-v1/success/machine-credential-active.json +13 -0
  190. package/fixtures/interaction-machine-v1/success/machine-credential-revoked.json +14 -0
  191. package/fixtures/interaction-machine-v1/success/message-interaction-open.json +33 -0
  192. package/fixtures/interaction-machine-v1/success/poll-empty.json +6 -0
  193. package/fixtures/interaction-machine-v1/success/poll-events.json +51 -0
  194. package/fixtures/interaction-machine-v1/tokens/callback-token.json +1 -0
  195. package/fixtures/whooshbang-events-v1/delivery/cases.json +418 -0
  196. package/fixtures/whooshbang-events-v1/events/agent-binding-degraded.json +17 -0
  197. package/fixtures/whooshbang-events-v1/events/interaction-expired.json +16 -0
  198. package/fixtures/whooshbang-events-v1/events/interaction-received.json +23 -0
  199. package/fixtures/whooshbang-events-v1/events/message-delivered.json +16 -0
  200. package/fixtures/whooshbang-events-v1/events/message-expired.json +15 -0
  201. package/fixtures/whooshbang-events-v1/events/message-failed.json +17 -0
  202. package/fixtures/whooshbang-events-v1/events/message-provider-accepted.json +15 -0
  203. package/fixtures/whooshbang-events-v1/events/subscription-activated.json +18 -0
  204. package/fixtures/whooshbang-events-v1/events/subscription-revoked.json +18 -0
  205. package/fixtures/whooshbang-events-v1/signing/vectors.json +852 -0
  206. package/openapi/.gitkeep +1 -0
  207. package/openapi/generated/whooshbang-v1.bundle.json +5913 -0
  208. package/openapi/whooshbang-v1.yaml +2334 -0
  209. package/package.json +63 -0
  210. package/schemas/contract-manifest.schema.json +140 -0
  211. package/schemas/core-scenario.schema.json +38 -0
  212. package/schemas/events/agent-binding-degraded-v1.schema.json +8 -0
  213. package/schemas/events/interaction-expired-v1.schema.json +8 -0
  214. package/schemas/events/interaction-received-v1.schema.json +8 -0
  215. package/schemas/events/message-delivered-v1.schema.json +8 -0
  216. package/schemas/events/message-expired-v1.schema.json +8 -0
  217. package/schemas/events/message-failed-v1.schema.json +8 -0
  218. package/schemas/events/message-provider-accepted-v1.schema.json +8 -0
  219. package/schemas/events/subscription-activated-v1.schema.json +8 -0
  220. package/schemas/events/subscription-revoked-v1.schema.json +8 -0
  221. package/schemas/events/whooshbang-event-v1.schema.json +689 -0
  222. package/schemas/fixture-index.schema.json +67 -0
  223. package/schemas/interaction-machine-scenario.schema.json +700 -0
  224. package/schemas/interaction-v1.schema.json +483 -0
  225. package/schemas/machine-v1.schema.json +430 -0
  226. package/schemas/provider-capabilities-v1.schema.json +263 -0
  227. package/schemas/webhooks/webhook-delivery-case-v1.schema.json +167 -0
  228. package/schemas/webhooks/webhook-signing-vector-v1.schema.json +197 -0
  229. package/schemas/whooshbang-v1.schema.json +2173 -0
@@ -0,0 +1,18 @@
1
+ {
2
+ "contract_version": "1.0.0-rc.13",
3
+ "id": "subscription-activation-replay",
4
+ "category": "subscription_replay",
5
+ "given": {
6
+ "link_id": "slink_synthetic_001",
7
+ "link_project_id": "project_synthetic",
8
+ "link_environment": "test",
9
+ "link_status": "activated",
10
+ "existing_binding_id": "binding_synthetic_001",
11
+ "repeated_provider_update": true
12
+ },
13
+ "expected": {
14
+ "status": "activated",
15
+ "binding_id": "binding_synthetic_001",
16
+ "bindings_created": 0
17
+ }
18
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "contract_version": "1.0.0-rc.13",
3
+ "id": "subscription-expired-replay",
4
+ "category": "subscription_replay",
5
+ "given": {
6
+ "link_id": "slink_synthetic_expired",
7
+ "link_project_id": "project_synthetic",
8
+ "link_environment": "test",
9
+ "link_status": "expired",
10
+ "repeated_provider_update": true
11
+ },
12
+ "expected": {
13
+ "status": "expired",
14
+ "bindings_created": 0
15
+ }
16
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "account_synthetic_001",
3
+ "name": "Synthetic Organization",
4
+ "status": "active",
5
+ "membership": {
6
+ "role": "admin"
7
+ },
8
+ "created_at": "2026-07-28T12:00:00Z",
9
+ "updated_at": "2026-07-28T12:00:00Z",
10
+ "diagnostic_id": "diag_account_synthetic_001"
11
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "id": "pcred_AAAAAAAAAAAAAAAAAAAAAA",
5
+ "project_id": "project_synthetic_001",
6
+ "environment_id": "environment_live_synthetic_001",
7
+ "environment": "live",
8
+ "prefix": "wb_pc1.pcred_AAAAAAAA",
9
+ "label": "Synthetic production integration",
10
+ "scopes": [
11
+ "messages:write",
12
+ "messages:read",
13
+ "subscriptions:write",
14
+ "subscriptions:read"
15
+ ],
16
+ "created_by": "member_synthetic_001",
17
+ "created_at": "2026-07-25T17:45:00Z",
18
+ "last_used_at": "2026-07-25T17:50:00Z",
19
+ "status": "active"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "credential": {
3
+ "id": "pcred_AAAAAAAAAAAAAAAAAAAAAA",
4
+ "project_id": "project_synthetic_001",
5
+ "environment_id": "environment_live_synthetic_001",
6
+ "environment": "live",
7
+ "prefix": "wb_pc1.pcred_AAAAAAAA",
8
+ "label": "Synthetic production integration",
9
+ "scopes": [
10
+ "messages:write",
11
+ "messages:read",
12
+ "subscriptions:write",
13
+ "subscriptions:read"
14
+ ],
15
+ "created_by": "member_synthetic_001",
16
+ "created_at": "2026-07-25T17:45:00Z",
17
+ "status": "active"
18
+ },
19
+ "secret": "wb_pc1.pcred_AAAAAAAAAAAAAAAAAAAAAA.AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"
20
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "id": "pcred_AAAAAAAAAAAAAAAAAAAAAA",
3
+ "project_id": "project_synthetic_001",
4
+ "environment_id": "environment_live_synthetic_001",
5
+ "environment": "live",
6
+ "prefix": "wb_pc1.pcred_AAAAAAAA",
7
+ "label": "Synthetic production integration",
8
+ "scopes": [
9
+ "messages:write",
10
+ "messages:read",
11
+ "subscriptions:write",
12
+ "subscriptions:read"
13
+ ],
14
+ "created_by": "member_synthetic_001",
15
+ "created_at": "2026-07-25T17:45:00Z",
16
+ "last_used_at": "2026-07-25T17:50:00Z",
17
+ "status": "revoked",
18
+ "revoked_at": "2026-07-25T17:55:00Z"
19
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "credential": {
3
+ "credential": {
4
+ "id": "pcred_BBBBBBBBBBBBBBBBBBBBBA",
5
+ "project_id": "project_synthetic_001",
6
+ "environment_id": "environment_live_synthetic_001",
7
+ "environment": "live",
8
+ "prefix": "wb_pc1.pcred_BBBBBBBB",
9
+ "label": "Synthetic production integration",
10
+ "scopes": [
11
+ "messages:write",
12
+ "messages:read",
13
+ "subscriptions:write",
14
+ "subscriptions:read"
15
+ ],
16
+ "created_by": "member_synthetic_001",
17
+ "created_at": "2026-07-25T17:45:00Z",
18
+ "status": "active"
19
+ },
20
+ "secret": "wb_pc1.pcred_BBBBBBBBBBBBBBBBBBBBBA.BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBA"
21
+ },
22
+ "replaced_credential": {
23
+ "id": "pcred_AAAAAAAAAAAAAAAAAAAAAA",
24
+ "project_id": "project_synthetic_001",
25
+ "environment_id": "environment_live_synthetic_001",
26
+ "environment": "live",
27
+ "prefix": "wb_pc1.pcred_AAAAAAAA",
28
+ "label": "Synthetic production integration",
29
+ "scopes": [
30
+ "messages:write",
31
+ "messages:read",
32
+ "subscriptions:write",
33
+ "subscriptions:read"
34
+ ],
35
+ "created_by": "member_synthetic_001",
36
+ "created_at": "2026-07-25T17:45:00Z",
37
+ "last_used_at": "2026-07-25T17:50:00Z",
38
+ "scheduled_revocation_at": "2026-07-25T18:45:00Z",
39
+ "status": "active"
40
+ }
41
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "endpoint_id": "endpoint_11111111111111111111111111111111",
3
+ "attempts": [
4
+ {
5
+ "id": "ceattempt_11111111111111111111111111111111",
6
+ "event_id": "evt_interaction_received_synthetic",
7
+ "attempt": 1,
8
+ "status": "terminal_failed",
9
+ "diagnostic_code": "network_failure",
10
+ "started_at": "2026-08-06T14:00:00.000Z",
11
+ "completed_at": "2026-08-06T14:00:01.000Z",
12
+ "created_at": "2026-08-06T14:00:00.000Z"
13
+ }
14
+ ]
15
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "id": "endpoint_11111111111111111111111111111111",
5
+ "project_id": "project_synthetic_alpha",
6
+ "environment_id": "environment_test_synthetic_alpha",
7
+ "environment": "test",
8
+ "status": "active",
9
+ "verification_status": "verified",
10
+ "event_types": ["interaction.received", "message.delivered"],
11
+ "secret_version": 2,
12
+ "health": "failing",
13
+ "created_at": "2026-08-06T12:00:00.000Z",
14
+ "updated_at": "2026-08-06T14:00:00.000Z",
15
+ "verification_attempted_at": "2026-08-06T12:05:00.000Z",
16
+ "verified_at": "2026-08-06T12:05:00.000Z",
17
+ "rotated_at": "2026-08-06T13:00:00.000Z",
18
+ "last_success_at": "2026-08-06T13:30:00.000Z",
19
+ "last_failure": {
20
+ "at": "2026-08-06T14:00:00.000Z",
21
+ "category": "network_failure"
22
+ },
23
+ "diagnostic_id": "diag_endpoint_list_001"
24
+ }
25
+ ]
26
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "endpoint": {
3
+ "id": "endpoint_11111111111111111111111111111111",
4
+ "project_id": "project_synthetic_alpha",
5
+ "environment_id": "environment_test_synthetic_alpha",
6
+ "environment": "test",
7
+ "status": "unverified",
8
+ "verification_status": "pending",
9
+ "event_types": ["interaction.received", "message.delivered"],
10
+ "secret_version": 1,
11
+ "health": "never_delivered",
12
+ "created_at": "2026-08-06T12:00:00.000Z",
13
+ "updated_at": "2026-08-06T12:00:00.000Z",
14
+ "diagnostic_id": "diag_endpoint_replay_001"
15
+ }
16
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "endpoint": {
3
+ "id": "endpoint_11111111111111111111111111111111",
4
+ "project_id": "project_synthetic_alpha",
5
+ "environment_id": "environment_test_synthetic_alpha",
6
+ "environment": "test",
7
+ "status": "unverified",
8
+ "verification_status": "pending",
9
+ "event_types": ["interaction.received", "message.delivered"],
10
+ "secret_version": 1,
11
+ "health": "never_delivered",
12
+ "created_at": "2026-08-06T12:00:00.000Z",
13
+ "updated_at": "2026-08-06T12:00:00.000Z",
14
+ "diagnostic_id": "diag_endpoint_create_001"
15
+ },
16
+ "secret": "whsec_AAECAwQFBgcICQoLDA0ODxAREhMUFRYXGBkaGxwdHh8="
17
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "endpoint": {
3
+ "id": "endpoint_11111111111111111111111111111111",
4
+ "project_id": "project_synthetic_alpha",
5
+ "environment_id": "environment_test_synthetic_alpha",
6
+ "environment": "test",
7
+ "status": "active",
8
+ "verification_status": "verified",
9
+ "event_types": ["interaction.received", "message.delivered"],
10
+ "secret_version": 2,
11
+ "health": "healthy",
12
+ "created_at": "2026-08-06T12:00:00.000Z",
13
+ "updated_at": "2026-08-06T13:00:00.000Z",
14
+ "verification_attempted_at": "2026-08-06T12:05:00.000Z",
15
+ "verified_at": "2026-08-06T12:05:00.000Z",
16
+ "rotated_at": "2026-08-06T13:00:00.000Z",
17
+ "last_success_at": "2026-08-06T12:30:00.000Z",
18
+ "diagnostic_id": "diag_endpoint_rotate_001"
19
+ },
20
+ "secret": "whsec_AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="
21
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "msg_synthetic_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_123",
6
+ "notifier_id": "default",
7
+ "binding": {
8
+ "id": "binding_synthetic_001",
9
+ "project_id": "project_synthetic",
10
+ "environment": "test",
11
+ "subscriber_id": "customer_123",
12
+ "notifier_id": "default",
13
+ "channel": "telegram",
14
+ "status": "active"
15
+ },
16
+ "state": "accepted",
17
+ "accepted_at": "2026-07-25T17:45:00Z",
18
+ "updated_at": "2026-07-25T17:45:00Z",
19
+ "expires_at": "2026-07-26T17:45:00Z",
20
+ "delivery": {
21
+ "attempt_count": 0,
22
+ "highest_proven_provider_state": "none",
23
+ "retry_scheduled": false
24
+ },
25
+ "diagnostic_id": "diag_message_accept_001",
26
+ "correlation_id": "export_987",
27
+ "metadata": {
28
+ "job": "export_987"
29
+ }
30
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "msg_synthetic_004",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_999",
6
+ "notifier_id": "default",
7
+ "binding": {
8
+ "id": "binding_synthetic_004",
9
+ "project_id": "project_synthetic",
10
+ "environment": "test",
11
+ "subscriber_id": "customer_999",
12
+ "notifier_id": "default",
13
+ "channel": "telegram",
14
+ "status": "active"
15
+ },
16
+ "state": "sending",
17
+ "accepted_at": "2026-07-25T17:45:00Z",
18
+ "updated_at": "2026-07-25T17:45:02Z",
19
+ "expires_at": "2026-07-26T17:45:00Z",
20
+ "delivery": {
21
+ "attempt_count": 1,
22
+ "highest_proven_provider_state": "none",
23
+ "retry_scheduled": false
24
+ },
25
+ "diagnostic_id": "diag_message_race_001",
26
+ "cancellation_effective": false
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "msg_synthetic_003",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_789",
6
+ "notifier_id": "default",
7
+ "binding": {
8
+ "id": "binding_synthetic_003",
9
+ "project_id": "project_synthetic",
10
+ "environment": "test",
11
+ "subscriber_id": "customer_789",
12
+ "notifier_id": "default",
13
+ "channel": "telegram",
14
+ "status": "active"
15
+ },
16
+ "state": "cancelled",
17
+ "accepted_at": "2026-07-25T17:45:00Z",
18
+ "updated_at": "2026-07-25T17:45:01Z",
19
+ "expires_at": "2026-07-26T17:45:00Z",
20
+ "delivery": {
21
+ "attempt_count": 0,
22
+ "highest_proven_provider_state": "none",
23
+ "retry_scheduled": false
24
+ },
25
+ "diagnostic_id": "diag_message_cancel_001",
26
+ "cancellation_effective": true
27
+ }
@@ -0,0 +1,33 @@
1
+ {
2
+ "id": "msg_synthetic_002",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_456",
6
+ "notifier_id": "default",
7
+ "binding": {
8
+ "id": "binding_synthetic_002",
9
+ "project_id": "project_synthetic",
10
+ "environment": "test",
11
+ "subscriber_id": "customer_456",
12
+ "notifier_id": "default",
13
+ "channel": "telegram",
14
+ "status": "active"
15
+ },
16
+ "state": "outcome_unknown",
17
+ "accepted_at": "2026-07-25T17:45:00Z",
18
+ "updated_at": "2026-07-25T17:45:03Z",
19
+ "expires_at": "2026-07-26T17:45:00Z",
20
+ "delivery": {
21
+ "attempt_count": 1,
22
+ "highest_proven_provider_state": "none",
23
+ "retry_scheduled": false,
24
+ "classified_error": {
25
+ "code": "provider_outcome_unknown",
26
+ "retryable": false,
27
+ "detail": "The provider may have accepted the request, but no trustworthy result is available.",
28
+ "diagnostic_id": "diag_provider_unknown_001"
29
+ }
30
+ },
31
+ "diagnostic_id": "diag_message_unknown_001",
32
+ "outcome_guidance": "Delivery may have been accepted by the provider. No automatic retry is scheduled; create a new message explicitly if another attempt is appropriate."
33
+ }
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "msg_synthetic_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_123",
6
+ "notifier_id": "default",
7
+ "binding": {
8
+ "id": "binding_synthetic_001",
9
+ "project_id": "project_synthetic",
10
+ "environment": "test",
11
+ "subscriber_id": "customer_123",
12
+ "notifier_id": "default",
13
+ "channel": "telegram",
14
+ "status": "active"
15
+ },
16
+ "state": "provider_accepted",
17
+ "accepted_at": "2026-07-25T17:45:00Z",
18
+ "updated_at": "2026-07-25T17:45:02Z",
19
+ "expires_at": "2026-07-26T17:45:00Z",
20
+ "delivery": {
21
+ "attempt_count": 1,
22
+ "highest_proven_provider_state": "provider_accepted",
23
+ "retry_scheduled": false
24
+ },
25
+ "diagnostic_id": "diag_message_provider_001",
26
+ "correlation_id": "export_987",
27
+ "metadata": {
28
+ "job": "export_987"
29
+ }
30
+ }
@@ -0,0 +1,42 @@
1
+ {
2
+ "items": [
3
+ {
4
+ "id": "project_synthetic_001",
5
+ "account_id": "account_synthetic_001",
6
+ "name": "Synthetic Alerts",
7
+ "slug": "synthetic-alerts",
8
+ "status": "active",
9
+ "environments": [
10
+ {
11
+ "id": "environment_synthetic_test_001",
12
+ "project_id": "project_synthetic_001",
13
+ "kind": "test",
14
+ "status": "active",
15
+ "default_notifier": {
16
+ "id": "notifier_synthetic_test_default_001",
17
+ "environment_id": "environment_synthetic_test_001",
18
+ "display_name": "Default",
19
+ "status": "active",
20
+ "is_default": true
21
+ }
22
+ },
23
+ {
24
+ "id": "environment_synthetic_live_001",
25
+ "project_id": "project_synthetic_001",
26
+ "kind": "live",
27
+ "status": "active",
28
+ "default_notifier": {
29
+ "id": "notifier_synthetic_live_default_001",
30
+ "environment_id": "environment_synthetic_live_001",
31
+ "display_name": "Default",
32
+ "status": "active",
33
+ "is_default": true
34
+ }
35
+ }
36
+ ],
37
+ "created_at": "2026-07-28T12:05:00Z",
38
+ "updated_at": "2026-07-28T12:05:00Z",
39
+ "diagnostic_id": "diag_project_synthetic_001"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "id": "project_synthetic_001",
3
+ "account_id": "account_synthetic_001",
4
+ "name": "Synthetic Alerts",
5
+ "slug": "synthetic-alerts",
6
+ "status": "active",
7
+ "environments": [
8
+ {
9
+ "id": "environment_synthetic_test_001",
10
+ "project_id": "project_synthetic_001",
11
+ "kind": "test",
12
+ "status": "active",
13
+ "default_notifier": {
14
+ "id": "notifier_synthetic_test_default_001",
15
+ "environment_id": "environment_synthetic_test_001",
16
+ "display_name": "Default",
17
+ "status": "active",
18
+ "is_default": true
19
+ }
20
+ },
21
+ {
22
+ "id": "environment_synthetic_live_001",
23
+ "project_id": "project_synthetic_001",
24
+ "kind": "live",
25
+ "status": "active",
26
+ "default_notifier": {
27
+ "id": "notifier_synthetic_live_default_001",
28
+ "environment_id": "environment_synthetic_live_001",
29
+ "display_name": "Default",
30
+ "status": "active",
31
+ "is_default": true
32
+ }
33
+ }
34
+ ],
35
+ "created_at": "2026-07-28T12:05:00Z",
36
+ "updated_at": "2026-07-28T12:05:00Z",
37
+ "diagnostic_id": "diag_project_synthetic_001"
38
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "slink_synthetic_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_123",
6
+ "notifier_id": "default",
7
+ "channels": ["telegram"],
8
+ "status": "activated",
9
+ "binding": {
10
+ "id": "binding_synthetic_001",
11
+ "project_id": "project_synthetic",
12
+ "environment": "test",
13
+ "subscriber_id": "customer_123",
14
+ "notifier_id": "default",
15
+ "channel": "telegram",
16
+ "status": "active"
17
+ },
18
+ "created_at": "2026-07-25T17:45:00Z",
19
+ "updated_at": "2026-07-25T17:47:00Z",
20
+ "expires_at": "2026-07-25T18:00:00Z",
21
+ "diagnostic_id": "diag_link_active_001"
22
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "slink_synthetic_002",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_456",
6
+ "notifier_id": "default",
7
+ "channels": ["telegram"],
8
+ "status": "cancelled",
9
+ "created_at": "2026-07-25T17:45:00Z",
10
+ "updated_at": "2026-07-25T17:46:00Z",
11
+ "expires_at": "2026-07-25T18:00:00Z",
12
+ "diagnostic_id": "diag_link_cancel_001",
13
+ "cancellation_effective": true
14
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "slink_synthetic_paused_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "live",
5
+ "subscriber_id": "customer_paused_123",
6
+ "notifier_id": "default",
7
+ "channels": ["telegram"],
8
+ "status": "activated",
9
+ "binding": {
10
+ "id": "binding_synthetic_paused_001",
11
+ "project_id": "project_synthetic",
12
+ "environment": "live",
13
+ "subscriber_id": "customer_paused_123",
14
+ "notifier_id": "default",
15
+ "channel": "telegram",
16
+ "status": "paused"
17
+ },
18
+ "created_at": "2026-07-30T14:00:00Z",
19
+ "updated_at": "2026-07-30T14:05:00Z",
20
+ "expires_at": "2026-07-30T14:15:00Z",
21
+ "diagnostic_id": "diag_link_paused_001"
22
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "id": "slink_synthetic_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "test",
5
+ "subscriber_id": "customer_123",
6
+ "notifier_id": "default",
7
+ "channels": ["telegram"],
8
+ "status": "pending",
9
+ "authorization_url": "https://subscribe.whooshbang.test/s/synthetic-link-token",
10
+ "created_at": "2026-07-25T17:45:00Z",
11
+ "updated_at": "2026-07-25T17:45:00Z",
12
+ "expires_at": "2026-07-25T18:00:00Z",
13
+ "diagnostic_id": "diag_link_pending_001"
14
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "slink_synthetic_revoked_001",
3
+ "project_id": "project_synthetic",
4
+ "environment": "live",
5
+ "subscriber_id": "customer_revoked_123",
6
+ "notifier_id": "default",
7
+ "channels": ["telegram"],
8
+ "status": "revoked",
9
+ "binding": {
10
+ "id": "binding_synthetic_revoked_001",
11
+ "project_id": "project_synthetic",
12
+ "environment": "live",
13
+ "subscriber_id": "customer_revoked_123",
14
+ "notifier_id": "default",
15
+ "channel": "telegram",
16
+ "status": "revoked"
17
+ },
18
+ "created_at": "2026-07-30T14:00:00Z",
19
+ "updated_at": "2026-07-30T14:10:00Z",
20
+ "expires_at": "2026-07-30T14:15:00Z",
21
+ "diagnostic_id": "diag_link_revoked_001"
22
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "schema": "whooshbang.provider-capabilities-collection.v1",
3
+ "providers": [
4
+ {
5
+ "schema": "whooshbang.provider-capabilities.v1",
6
+ "provider": "telegram",
7
+ "text": {
8
+ "supported": true,
9
+ "maximum_bytes": 8192
10
+ },
11
+ "interaction": {
12
+ "confirm": {
13
+ "mode": "native"
14
+ },
15
+ "select": {
16
+ "mode": "native"
17
+ },
18
+ "input": {
19
+ "mode": "conditional",
20
+ "explanation": "Input requires an exact provider reply context."
21
+ }
22
+ },
23
+ "streaming": {
24
+ "mode": "edit",
25
+ "explanation": "Progressive content uses bounded message edits."
26
+ },
27
+ "edit": {
28
+ "supported": true
29
+ },
30
+ "receipts": {
31
+ "provider_accepted": true,
32
+ "delivered": false,
33
+ "read": false
34
+ },
35
+ "contexts": {
36
+ "private_chat": {
37
+ "mode": "supported"
38
+ },
39
+ "thread": {
40
+ "mode": "conditional",
41
+ "explanation": "Thread support depends on the bound Telegram chat context."
42
+ },
43
+ "group": {
44
+ "mode": "conditional",
45
+ "explanation": "Group use requires an authenticated subscriber binding and exact reply context."
46
+ }
47
+ },
48
+ "rate_limit": {
49
+ "strategy": "provider_retry_after",
50
+ "explanation": "Safe provider retry timing is honored when available."
51
+ },
52
+ "degradation": {
53
+ "active": false
54
+ }
55
+ }
56
+ ]
57
+ }