@openwop/spec-artifacts 2.0.0-rc.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.
- package/CORPUS-STAMP.json +234 -0
- package/LICENSE +201 -0
- package/README.md +7 -0
- package/api/.redocly.lint-ignore.yaml +22 -0
- package/api/asyncapi.yaml +834 -0
- package/api/grpc/openwop.proto +251 -0
- package/api/openapi.yaml +2693 -0
- package/api/redocly.yaml +23 -0
- package/api/seams-v2.yaml +680 -0
- package/api/v2/asyncapi.yaml +528 -0
- package/api/v2/openapi.yaml +3139 -0
- package/api/v2/redocly.yaml +16 -0
- package/package.json +10 -0
- package/schemas/README.md +144 -0
- package/schemas/a2a-task-state.schema.json +78 -0
- package/schemas/a2ui-surface-delta-frame.schema.json +48 -0
- package/schemas/agent-deployment-transition.schema.json +49 -0
- package/schemas/agent-deployment.schema.json +54 -0
- package/schemas/agent-eval-suite.schema.json +140 -0
- package/schemas/agent-inventory-response.schema.json +115 -0
- package/schemas/agent-manifest.schema.json +156 -0
- package/schemas/agent-org-chart.schema.json +82 -0
- package/schemas/agent-ref.schema.json +63 -0
- package/schemas/agent-roster-entry.schema.json +81 -0
- package/schemas/agent-roster-response.schema.json +21 -0
- package/schemas/ai-envelope.schema.json +134 -0
- package/schemas/annotation-create.schema.json +37 -0
- package/schemas/annotation.schema.json +56 -0
- package/schemas/artifact-type-pack-manifest.schema.json +244 -0
- package/schemas/audit-verify-result.schema.json +90 -0
- package/schemas/budget-policy.schema.json +18 -0
- package/schemas/capabilities.schema.json +4160 -0
- package/schemas/certification-bundle-v2.schema.json +118 -0
- package/schemas/channel-presence-payload.schema.json +41 -0
- package/schemas/channel-written-payload.schema.json +55 -0
- package/schemas/chat-card-pack-manifest.schema.json +253 -0
- package/schemas/compact-tool-descriptor.schema.json +51 -0
- package/schemas/compensation-policy.schema.json +64 -0
- package/schemas/conformance-certification-bundle.schema.json +86 -0
- package/schemas/connection-pack-manifest.schema.json +353 -0
- package/schemas/conversation-event.schema.json +168 -0
- package/schemas/conversation-turn.schema.json +117 -0
- package/schemas/core-conformance-mock-agent-config.schema.json +152 -0
- package/schemas/credential-provenance.schema.json +18 -0
- package/schemas/credential-reference.schema.json +21 -0
- package/schemas/debug-bundle.schema.json +196 -0
- package/schemas/dispatch-config.schema.json +112 -0
- package/schemas/envelopes/clarification.request.schema.json +52 -0
- package/schemas/envelopes/error.schema.json +30 -0
- package/schemas/envelopes/media.audio.schema.json +38 -0
- package/schemas/envelopes/media.file.schema.json +37 -0
- package/schemas/envelopes/media.image.schema.json +33 -0
- package/schemas/envelopes/schema.request.schema.json +26 -0
- package/schemas/envelopes/schema.response.schema.json +22 -0
- package/schemas/envelopes/ui.a2ui-surface.schema.json +154 -0
- package/schemas/error-envelope.schema.json +25 -0
- package/schemas/eval-summary.schema.json +92 -0
- package/schemas/export-bundle.schema.json +66 -0
- package/schemas/form-content-pack-manifest.schema.json +243 -0
- package/schemas/frontend-plugin-manifest.schema.json +109 -0
- package/schemas/goal.schema.json +104 -0
- package/schemas/heartbeat-evaluated.schema.json +14 -0
- package/schemas/heartbeat-state-changed.schema.json +14 -0
- package/schemas/localized-content-language-settings.schema.json +26 -0
- package/schemas/localized-content-page-response.schema.json +60 -0
- package/schemas/localized-content-page.schema.json +62 -0
- package/schemas/localized-content-section.schema.json +51 -0
- package/schemas/memory-entry.schema.json +36 -0
- package/schemas/memory-list-options.schema.json +37 -0
- package/schemas/node-pack-manifest.schema.json +654 -0
- package/schemas/orchestrator-decision.schema.json +90 -0
- package/schemas/org-chart-responsibility-view.schema.json +26 -0
- package/schemas/pack-lockfile.schema.json +108 -0
- package/schemas/prompt-kind.schema.json +8 -0
- package/schemas/prompt-pack-manifest.schema.json +117 -0
- package/schemas/prompt-ref.schema.json +40 -0
- package/schemas/prompt-template.schema.json +149 -0
- package/schemas/proposal.schema.json +84 -0
- package/schemas/registry-version-manifest.schema.json +208 -0
- package/schemas/residency.schema.json +16 -0
- package/schemas/run-ancestry-response.schema.json +54 -0
- package/schemas/run-diff-response.schema.json +64 -0
- package/schemas/run-event-payloads.schema.json +4452 -0
- package/schemas/run-event.schema.json +211 -0
- package/schemas/run-options.schema.json +80 -0
- package/schemas/run-orchestrator-decided-event.schema.json +20 -0
- package/schemas/run-snapshot.schema.json +148 -0
- package/schemas/security-advisory.schema.json +109 -0
- package/schemas/self-hosted-runner-dispatch-frame.schema.json +79 -0
- package/schemas/self-hosted-runner-registration.schema.json +53 -0
- package/schemas/self-hosted-runner-result-frame.schema.json +38 -0
- package/schemas/subject.schema.json +56 -0
- package/schemas/suspend-request.schema.json +207 -0
- package/schemas/tool-descriptor.schema.json +63 -0
- package/schemas/trigger-event.schema.json +222 -0
- package/schemas/trigger-subscription-registration.schema.json +67 -0
- package/schemas/trigger-subscription.schema.json +26 -0
- package/schemas/ui-plugin-message.schema.json +90 -0
- package/schemas/v2/a2a-task-state.schema.json +102 -0
- package/schemas/v2/a2ui-surface-delta-frame.schema.json +62 -0
- package/schemas/v2/agent-deployment-transition.schema.json +67 -0
- package/schemas/v2/agent-deployment.schema.json +68 -0
- package/schemas/v2/agent-eval-suite.schema.json +214 -0
- package/schemas/v2/agent-inventory-response.schema.json +172 -0
- package/schemas/v2/agent-manifest.schema.json +218 -0
- package/schemas/v2/agent-org-chart.schema.json +149 -0
- package/schemas/v2/agent-ref.schema.json +67 -0
- package/schemas/v2/agent-roster-entry.schema.json +104 -0
- package/schemas/v2/agent-roster-response.schema.json +27 -0
- package/schemas/v2/ai-envelope.schema.json +167 -0
- package/schemas/v2/annotation-create.schema.json +109 -0
- package/schemas/v2/annotation.schema.json +142 -0
- package/schemas/v2/artifact-type-pack-manifest.schema.json +245 -0
- package/schemas/v2/audit-verify-result.schema.json +110 -0
- package/schemas/v2/budget-policy.schema.json +61 -0
- package/schemas/v2/capabilities.schema.json +7644 -0
- package/schemas/v2/certification-bundle.schema.json +401 -0
- package/schemas/v2/channel-presence-payload.schema.json +60 -0
- package/schemas/v2/channel-written-payload.schema.json +64 -0
- package/schemas/v2/chat-card-pack-manifest.schema.json +254 -0
- package/schemas/v2/compact-tool-descriptor.schema.json +108 -0
- package/schemas/v2/compensation-policy.schema.json +91 -0
- package/schemas/v2/compensation-projection.schema.json +95 -0
- package/schemas/v2/configurable.schema.json +110 -0
- package/schemas/v2/connection-pack-manifest.schema.json +354 -0
- package/schemas/v2/conversation-event.schema.json +281 -0
- package/schemas/v2/conversation-turn.schema.json +165 -0
- package/schemas/v2/credential-provenance.schema.json +62 -0
- package/schemas/v2/credential-reference.schema.json +28 -0
- package/schemas/v2/debug-bundle.schema.json +312 -0
- package/schemas/v2/dispatch-config.schema.json +147 -0
- package/schemas/v2/effect-ledger-projection.schema.json +71 -0
- package/schemas/v2/effect-seam-manifest.schema.json +98 -0
- package/schemas/v2/envelopes/clarification.request.schema.json +59 -0
- package/schemas/v2/envelopes/error.schema.json +35 -0
- package/schemas/v2/envelopes/media.audio.schema.json +41 -0
- package/schemas/v2/envelopes/media.file.schema.json +40 -0
- package/schemas/v2/envelopes/media.image.schema.json +36 -0
- package/schemas/v2/envelopes/schema.request.schema.json +29 -0
- package/schemas/v2/envelopes/schema.response.schema.json +26 -0
- package/schemas/v2/envelopes/ui.a2ui-surface.schema.json +292 -0
- package/schemas/v2/error-envelope.schema.json +229 -0
- package/schemas/v2/eval-summary.schema.json +166 -0
- package/schemas/v2/export-bundle.schema.json +94 -0
- package/schemas/v2/form-content-pack-manifest.schema.json +241 -0
- package/schemas/v2/frontend-plugin-manifest.schema.json +152 -0
- package/schemas/v2/goal.schema.json +188 -0
- package/schemas/v2/heartbeat-evaluated.schema.json +34 -0
- package/schemas/v2/heartbeat-state-changed.schema.json +31 -0
- package/schemas/v2/ids.schema.json +31 -0
- package/schemas/v2/localized-content-language-settings.schema.json +34 -0
- package/schemas/v2/localized-content-page-response.schema.json +94 -0
- package/schemas/v2/localized-content-page.schema.json +87 -0
- package/schemas/v2/localized-content-section.schema.json +63 -0
- package/schemas/v2/memory-entry.schema.json +45 -0
- package/schemas/v2/memory-list-options.schema.json +41 -0
- package/schemas/v2/node-pack-manifest.schema.json +657 -0
- package/schemas/v2/orchestrator-decision.schema.json +120 -0
- package/schemas/v2/org-chart-responsibility-view.schema.json +36 -0
- package/schemas/v2/pack-lockfile.schema.json +139 -0
- package/schemas/v2/prompt-kind.schema.json +14 -0
- package/schemas/v2/prompt-pack-manifest.schema.json +118 -0
- package/schemas/v2/prompt-ref.schema.json +42 -0
- package/schemas/v2/prompt-template.schema.json +209 -0
- package/schemas/v2/proposal.schema.json +145 -0
- package/schemas/v2/registry-version-manifest.schema.json +292 -0
- package/schemas/v2/residency.schema.json +19 -0
- package/schemas/v2/run-ancestry-response.schema.json +68 -0
- package/schemas/v2/run-diff-response.schema.json +80 -0
- package/schemas/v2/run-event-payloads.schema.json +4588 -0
- package/schemas/v2/run-event.schema.json +324 -0
- package/schemas/v2/run-options.schema.json +90 -0
- package/schemas/v2/run-orchestrator-decided-event.schema.json +22 -0
- package/schemas/v2/run-snapshot.schema.json +207 -0
- package/schemas/v2/security-advisory.schema.json +138 -0
- package/schemas/v2/self-hosted-runner-dispatch-frame.schema.json +119 -0
- package/schemas/v2/self-hosted-runner-registration.schema.json +74 -0
- package/schemas/v2/self-hosted-runner-result-frame.schema.json +47 -0
- package/schemas/v2/subject-link.schema.json +69 -0
- package/schemas/v2/subject.schema.json +597 -0
- package/schemas/v2/suspend-request.schema.json +370 -0
- package/schemas/v2/tool-descriptor.schema.json +150 -0
- package/schemas/v2/trigger-event.schema.json +508 -0
- package/schemas/v2/trigger-subscription-registration.schema.json +99 -0
- package/schemas/v2/trigger-subscription.schema.json +79 -0
- package/schemas/v2/ui-plugin-message.schema.json +149 -0
- package/schemas/v2/workflow-chain-pack-manifest.schema.json +610 -0
- package/schemas/v2/workflow-definition.schema.json +864 -0
- package/schemas/v2/workload-identity.schema.json +115 -0
- package/schemas/v2/workspace-file-create.schema.json +23 -0
- package/schemas/v2/workspace-file.schema.json +45 -0
- package/schemas/workflow-chain-pack-manifest.schema.json +615 -0
- package/schemas/workflow-definition.schema.json +850 -0
- package/schemas/workload-identity.schema.json +79 -0
- package/schemas/workspace-file-create.schema.json +20 -0
- package/schemas/workspace-file.schema.json +39 -0
- package/spec/v1/alias-detectors.json +283 -0
- package/spec/v1/capability-declaration-classes.json +176 -0
- package/spec/v1/core-standard-manifest.json +423 -0
- package/spec/v1/deprecations.json +854 -0
- package/spec/v1/deprecations.schema.json +187 -0
- package/spec/v1/event-codemap.json +1089 -0
- package/spec/v1/event-codemap.schema.json +41 -0
- package/spec/v1/extensions.json +1273 -0
- package/spec/v1/gaps.json +14581 -0
- package/spec/v1/gaps.schema.json +55 -0
- package/spec/v1/migrations.json +1822 -0
- package/spec/v1/migrations.schema.json +44 -0
- package/spec/v1/operation-path-manifest.json +462 -0
- package/spec/v1/spec-gaps.json +4823 -0
- package/spec/v2/declaration.json +1862 -0
- package/spec/v2/declaration.schema.json +305 -0
- package/spec/v2/errors.json +837 -0
- package/spec/v2/event-codemap.json +1099 -0
- package/spec/v2/event-codemap.schema.json +114 -0
- package/spec/v2/ext/provider-idempotency/registry.json +6 -0
- package/spec/v2/facets/a2a.schema.json +51 -0
- package/spec/v2/facets/aiProviders.schema.json +56 -0
- package/spec/v2/facets/auth.schema.json +91 -0
- package/spec/v2/facets/heartbeat.schema.json +20 -0
- package/spec/v2/facets/interrupt.schema.json +29 -0
- package/spec/v2/facets/mcp.schema.json +81 -0
- package/spec/v2/facets/replay.schema.json +34 -0
- package/spec/v2/facets/sandbox.schema.json +31 -0
- package/spec/v2/facets/webhooks.schema.json +18 -0
- package/spec/v2/path-manifest.json +279 -0
- package/spec/v2/peer-dependency-aliases.json +165 -0
- package/spec/v2/profiles.json +45 -0
- package/spec/v2/release.json +6 -0
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/trigger-event.schema.json",
|
|
4
|
+
"title": "TriggerEvent",
|
|
5
|
+
"description": "RFC 0099 §F.1. The normalized external-event envelope a host hands a started run as `ctx.triggerData` when an externally-originated event (`webhook`/`email`/`form`/`stream`/`change`) is delivered to an `active` TriggerSubscription (RFC 0083). This is an IN-RUN payload only — it never appears on the durable event log; the `trigger.delivery.attempted` event stays content-free (RFC 0083 §C / SECURITY `trigger-ingestion-content-redaction`). A TriggerEvent carries exactly the per-source sub-object matching its `source`. All content is `untrusted` (SECURITY `threat-model-prompt-injection.md`).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"source",
|
|
10
|
+
"subscriptionId",
|
|
11
|
+
"deliveryId",
|
|
12
|
+
"receivedAt"
|
|
13
|
+
],
|
|
14
|
+
"properties": {
|
|
15
|
+
"source": {
|
|
16
|
+
"type": "string",
|
|
17
|
+
"enum": [
|
|
18
|
+
"webhook",
|
|
19
|
+
"email",
|
|
20
|
+
"form",
|
|
21
|
+
"stream",
|
|
22
|
+
"change"
|
|
23
|
+
],
|
|
24
|
+
"description": "Which external source originated the event. A TriggerEvent MUST carry exactly the per-source sub-object matching this value and MUST NOT carry the others (RFC 0099 §F.1; `stream`/`change` per RFC 0127)."
|
|
25
|
+
},
|
|
26
|
+
"subscriptionId": {
|
|
27
|
+
"$ref": "ids.schema.json#/$defs/subscriptionId",
|
|
28
|
+
"description": "The RFC 0083 §B subscription this event was delivered to."
|
|
29
|
+
},
|
|
30
|
+
"deliveryId": {
|
|
31
|
+
"$ref": "ids.schema.json#/$defs/deliveryId",
|
|
32
|
+
"description": "Stable per-delivery id; equals the `causationId` stamped on `run.started` (RFC 0083 §C-3 / RFC 0040)."
|
|
33
|
+
},
|
|
34
|
+
"dedupKey": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"description": "The host-opaque dedup key (RFC 0083 §C-1). Present iff the subscription's `dedupEnabled`. MUST NOT embed inbound body/header content in cleartext (SECURITY `trigger-ingestion-content-redaction`)."
|
|
37
|
+
},
|
|
38
|
+
"receivedAt": {
|
|
39
|
+
"type": "string",
|
|
40
|
+
"format": "date-time",
|
|
41
|
+
"description": "When the host received the external event."
|
|
42
|
+
},
|
|
43
|
+
"verified": {
|
|
44
|
+
"type": "boolean",
|
|
45
|
+
"description": "Whether the host verified the source's authenticity (webhook signature / email DMARC / form CSRF+origin) before delivery per the subscription's `verification` policy (RFC 0099 §F.2). A run MUST be able to gate on this."
|
|
46
|
+
},
|
|
47
|
+
"contentTrust": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"enum": [
|
|
50
|
+
"untrusted"
|
|
51
|
+
],
|
|
52
|
+
"description": "Always `untrusted`. Inbound external content reaching an LLM node MUST be wrapped per `threat-model-prompt-injection.md` §UNTRUSTED; a TriggerEvent MUST NOT directly advance a HITL approval gate (the `prompt-injection-mcp-no-approval` invariant generalizes)."
|
|
53
|
+
},
|
|
54
|
+
"permittedPurposes": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": {
|
|
57
|
+
"type": "string"
|
|
58
|
+
},
|
|
59
|
+
"description": "RFC 0128 — OPTIONAL declared uses the receiver is permitted to make of the accompanying data. Opaque purpose strings mapped to the host's local vocabulary; carries purpose categories only, never subject identifiers or consent records. Absent ⇒ unlabelled (no constraint asserted); `[]` ⇒ no onward use permitted (NOT the same as absent). A host advertising `purposePropagation` MUST honor the RFC 0128 §3 propagation rules for this label."
|
|
60
|
+
},
|
|
61
|
+
"webhook": {
|
|
62
|
+
"$ref": "#/$defs/WebhookEvent"
|
|
63
|
+
},
|
|
64
|
+
"email": {
|
|
65
|
+
"$ref": "#/$defs/EmailEvent"
|
|
66
|
+
},
|
|
67
|
+
"form": {
|
|
68
|
+
"$ref": "#/$defs/FormEvent"
|
|
69
|
+
},
|
|
70
|
+
"stream": {
|
|
71
|
+
"$ref": "#/$defs/StreamEvent"
|
|
72
|
+
},
|
|
73
|
+
"change": {
|
|
74
|
+
"$ref": "#/$defs/ChangeEvent"
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"allOf": [
|
|
78
|
+
{
|
|
79
|
+
"description": "RFC 0099 §F.1 — a TriggerEvent MUST carry exactly the per-source sub-object matching its `source` and MUST NOT carry the others.",
|
|
80
|
+
"if": {
|
|
81
|
+
"properties": {
|
|
82
|
+
"source": {
|
|
83
|
+
"const": "webhook"
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
},
|
|
87
|
+
"then": {
|
|
88
|
+
"not": {
|
|
89
|
+
"anyOf": [
|
|
90
|
+
{
|
|
91
|
+
"required": [
|
|
92
|
+
"email"
|
|
93
|
+
]
|
|
94
|
+
},
|
|
95
|
+
{
|
|
96
|
+
"required": [
|
|
97
|
+
"form"
|
|
98
|
+
]
|
|
99
|
+
},
|
|
100
|
+
{
|
|
101
|
+
"required": [
|
|
102
|
+
"stream"
|
|
103
|
+
]
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
"required": [
|
|
107
|
+
"change"
|
|
108
|
+
]
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
"if": {
|
|
116
|
+
"properties": {
|
|
117
|
+
"source": {
|
|
118
|
+
"const": "email"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
"then": {
|
|
123
|
+
"not": {
|
|
124
|
+
"anyOf": [
|
|
125
|
+
{
|
|
126
|
+
"required": [
|
|
127
|
+
"webhook"
|
|
128
|
+
]
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
"required": [
|
|
132
|
+
"form"
|
|
133
|
+
]
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"required": [
|
|
137
|
+
"stream"
|
|
138
|
+
]
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"required": [
|
|
142
|
+
"change"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"if": {
|
|
151
|
+
"properties": {
|
|
152
|
+
"source": {
|
|
153
|
+
"const": "form"
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
},
|
|
157
|
+
"then": {
|
|
158
|
+
"not": {
|
|
159
|
+
"anyOf": [
|
|
160
|
+
{
|
|
161
|
+
"required": [
|
|
162
|
+
"webhook"
|
|
163
|
+
]
|
|
164
|
+
},
|
|
165
|
+
{
|
|
166
|
+
"required": [
|
|
167
|
+
"email"
|
|
168
|
+
]
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"required": [
|
|
172
|
+
"stream"
|
|
173
|
+
]
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
"required": [
|
|
177
|
+
"change"
|
|
178
|
+
]
|
|
179
|
+
}
|
|
180
|
+
]
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"if": {
|
|
186
|
+
"properties": {
|
|
187
|
+
"source": {
|
|
188
|
+
"const": "stream"
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
},
|
|
192
|
+
"then": {
|
|
193
|
+
"not": {
|
|
194
|
+
"anyOf": [
|
|
195
|
+
{
|
|
196
|
+
"required": [
|
|
197
|
+
"webhook"
|
|
198
|
+
]
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"required": [
|
|
202
|
+
"email"
|
|
203
|
+
]
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"required": [
|
|
207
|
+
"form"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"required": [
|
|
212
|
+
"change"
|
|
213
|
+
]
|
|
214
|
+
}
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"if": {
|
|
221
|
+
"properties": {
|
|
222
|
+
"source": {
|
|
223
|
+
"const": "change"
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"then": {
|
|
228
|
+
"not": {
|
|
229
|
+
"anyOf": [
|
|
230
|
+
{
|
|
231
|
+
"required": [
|
|
232
|
+
"webhook"
|
|
233
|
+
]
|
|
234
|
+
},
|
|
235
|
+
{
|
|
236
|
+
"required": [
|
|
237
|
+
"email"
|
|
238
|
+
]
|
|
239
|
+
},
|
|
240
|
+
{
|
|
241
|
+
"required": [
|
|
242
|
+
"form"
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"required": [
|
|
247
|
+
"stream"
|
|
248
|
+
]
|
|
249
|
+
}
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
],
|
|
255
|
+
"$defs": {
|
|
256
|
+
"WebhookEvent": {
|
|
257
|
+
"type": "object",
|
|
258
|
+
"additionalProperties": false,
|
|
259
|
+
"description": "Present iff `source == \"webhook\"`.",
|
|
260
|
+
"properties": {
|
|
261
|
+
"method": {
|
|
262
|
+
"type": "string",
|
|
263
|
+
"enum": [
|
|
264
|
+
"POST",
|
|
265
|
+
"PUT",
|
|
266
|
+
"PATCH"
|
|
267
|
+
]
|
|
268
|
+
},
|
|
269
|
+
"headers": {
|
|
270
|
+
"type": "object",
|
|
271
|
+
"additionalProperties": {
|
|
272
|
+
"type": "string"
|
|
273
|
+
},
|
|
274
|
+
"description": "Host-allowlisted headers only — a host MUST NOT pass through `Authorization`, `Cookie`, `Proxy-Authorization`, or any header carrying credential material (RFC 0099 §F.1 / SECURITY `trigger-ingestion-content-redaction`)."
|
|
275
|
+
},
|
|
276
|
+
"body": {
|
|
277
|
+
"description": "The parsed JSON body, or a string for non-JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
},
|
|
281
|
+
"EmailEvent": {
|
|
282
|
+
"type": "object",
|
|
283
|
+
"additionalProperties": false,
|
|
284
|
+
"description": "Present iff `source == \"email\"`.",
|
|
285
|
+
"properties": {
|
|
286
|
+
"from": {
|
|
287
|
+
"type": "string"
|
|
288
|
+
},
|
|
289
|
+
"to": {
|
|
290
|
+
"type": "array",
|
|
291
|
+
"items": {
|
|
292
|
+
"type": "string"
|
|
293
|
+
}
|
|
294
|
+
},
|
|
295
|
+
"subject": {
|
|
296
|
+
"type": "string"
|
|
297
|
+
},
|
|
298
|
+
"text": {
|
|
299
|
+
"type": "string"
|
|
300
|
+
},
|
|
301
|
+
"html": {
|
|
302
|
+
"type": "string"
|
|
303
|
+
},
|
|
304
|
+
"attachments": {
|
|
305
|
+
"type": "array",
|
|
306
|
+
"items": {
|
|
307
|
+
"$ref": "#/$defs/AttachmentRef"
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
},
|
|
312
|
+
"FormEvent": {
|
|
313
|
+
"type": "object",
|
|
314
|
+
"additionalProperties": false,
|
|
315
|
+
"description": "Present iff `source == \"form\"`.",
|
|
316
|
+
"properties": {
|
|
317
|
+
"fields": {
|
|
318
|
+
"type": "object",
|
|
319
|
+
"additionalProperties": true,
|
|
320
|
+
"description": "The submitted field map."
|
|
321
|
+
},
|
|
322
|
+
"files": {
|
|
323
|
+
"type": "array",
|
|
324
|
+
"items": {
|
|
325
|
+
"$ref": "#/$defs/AttachmentRef"
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
},
|
|
330
|
+
"StreamEvent": {
|
|
331
|
+
"type": "object",
|
|
332
|
+
"additionalProperties": false,
|
|
333
|
+
"description": "Present iff `source == \"stream\"` (RFC 0127). One message consumed from a streaming broker (Kafka / Kinesis / Pub-Sub); the host is the consumer and each delivered message normalizes to one TriggerEvent. The broker connection is a credential-brokered egress (RFC 0095), never a wire field.",
|
|
334
|
+
"properties": {
|
|
335
|
+
"topic": {
|
|
336
|
+
"type": "string",
|
|
337
|
+
"description": "The broker topic/stream/subscription name the message was consumed from."
|
|
338
|
+
},
|
|
339
|
+
"partition": {
|
|
340
|
+
"type": "integer",
|
|
341
|
+
"minimum": 0,
|
|
342
|
+
"description": "Broker partition/shard, where the broker has one. With `offset`, feeds the RFC 0127 §4 dedup-key guidance `(topic, partition, offset)`."
|
|
343
|
+
},
|
|
344
|
+
"offset": {
|
|
345
|
+
"type": "string",
|
|
346
|
+
"description": "Broker offset / sequence number as an opaque string (brokers disagree on integer width)."
|
|
347
|
+
},
|
|
348
|
+
"key": {
|
|
349
|
+
"type": "string",
|
|
350
|
+
"description": "The message key, where the broker has one."
|
|
351
|
+
},
|
|
352
|
+
"message": {
|
|
353
|
+
"description": "The consumed message payload — parsed JSON, or a string for non-JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"ChangeEvent": {
|
|
358
|
+
"type": "object",
|
|
359
|
+
"additionalProperties": false,
|
|
360
|
+
"required": [
|
|
361
|
+
"op"
|
|
362
|
+
],
|
|
363
|
+
"description": "Present iff `source == \"change\"` (RFC 0127). One change-data-capture record from a warehouse/database changelog. `op` is REQUIRED. The warehouse connection is a credential-brokered egress (RFC 0095), never a wire field.",
|
|
364
|
+
"properties": {
|
|
365
|
+
"op": {
|
|
366
|
+
"type": "string",
|
|
367
|
+
"enum": [
|
|
368
|
+
"insert",
|
|
369
|
+
"update",
|
|
370
|
+
"delete"
|
|
371
|
+
],
|
|
372
|
+
"description": "The change operation. REQUIRED (RFC 0127 §2 / resolved Q1 — one `change` source with an `op` discriminator, not per-verb sources)."
|
|
373
|
+
},
|
|
374
|
+
"table": {
|
|
375
|
+
"type": "string",
|
|
376
|
+
"description": "The source table/collection/entity name. With `changelogId`, feeds the RFC 0127 §4 dedup-key guidance `(table, changelog-id)`."
|
|
377
|
+
},
|
|
378
|
+
"changelogId": {
|
|
379
|
+
"type": "string",
|
|
380
|
+
"description": "The changelog position/LSN/row-version as an opaque string."
|
|
381
|
+
},
|
|
382
|
+
"before": {
|
|
383
|
+
"description": "The pre-image row where the feed provides one (typically `update`/`delete`). Parsed JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
384
|
+
},
|
|
385
|
+
"after": {
|
|
386
|
+
"description": "The post-image row where the feed provides one (typically `insert`/`update`). Parsed JSON. Bounded by `triggerBridge.ingestion.maxBodyBytes`."
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
},
|
|
390
|
+
"AttachmentRef": {
|
|
391
|
+
"type": "object",
|
|
392
|
+
"additionalProperties": false,
|
|
393
|
+
"required": [
|
|
394
|
+
"ref"
|
|
395
|
+
],
|
|
396
|
+
"description": "A host-internal opaque handle to a resolved attachment/upload — NEVER a raw external URL the run is expected to fetch itself (RFC 0099 §F.1/§F.4). The host resolves and ingests attachments through its SSRF guard (SECURITY `trigger-ingestion-ssrf`), then hands the run an internal ref.",
|
|
397
|
+
"properties": {
|
|
398
|
+
"ref": {
|
|
399
|
+
"type": "string",
|
|
400
|
+
"minLength": 1,
|
|
401
|
+
"description": "A host-internal opaque handle (e.g. a `host.blobStorage` key)."
|
|
402
|
+
},
|
|
403
|
+
"filename": {
|
|
404
|
+
"type": "string"
|
|
405
|
+
},
|
|
406
|
+
"mediaType": {
|
|
407
|
+
"type": "string"
|
|
408
|
+
},
|
|
409
|
+
"bytes": {
|
|
410
|
+
"type": "integer",
|
|
411
|
+
"minimum": 0
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
"examples": [
|
|
417
|
+
{
|
|
418
|
+
"source": "email",
|
|
419
|
+
"subscriptionId": "sub_7",
|
|
420
|
+
"deliveryId": "dlv_a1b2",
|
|
421
|
+
"dedupKey": "msgid:abc@in.example.com",
|
|
422
|
+
"receivedAt": "2026-06-13T18:04:11Z",
|
|
423
|
+
"verified": true,
|
|
424
|
+
"contentTrust": "untrusted",
|
|
425
|
+
"email": {
|
|
426
|
+
"from": "customer@example.org",
|
|
427
|
+
"to": [
|
|
428
|
+
"triage-support+sub_7@in.example.com"
|
|
429
|
+
],
|
|
430
|
+
"subject": "Cannot log in",
|
|
431
|
+
"text": "I keep getting a 403.",
|
|
432
|
+
"attachments": [
|
|
433
|
+
{
|
|
434
|
+
"ref": "blob_a1",
|
|
435
|
+
"filename": "screenshot.png",
|
|
436
|
+
"mediaType": "image/png",
|
|
437
|
+
"bytes": 20481
|
|
438
|
+
}
|
|
439
|
+
]
|
|
440
|
+
}
|
|
441
|
+
},
|
|
442
|
+
{
|
|
443
|
+
"source": "webhook",
|
|
444
|
+
"subscriptionId": "sub_9",
|
|
445
|
+
"deliveryId": "dlv_c3d4",
|
|
446
|
+
"receivedAt": "2026-06-13T18:10:00Z",
|
|
447
|
+
"verified": true,
|
|
448
|
+
"contentTrust": "untrusted",
|
|
449
|
+
"webhook": {
|
|
450
|
+
"method": "POST",
|
|
451
|
+
"headers": {
|
|
452
|
+
"X-Event-Type": "issue.created"
|
|
453
|
+
},
|
|
454
|
+
"body": {
|
|
455
|
+
"issue": {
|
|
456
|
+
"id": 42,
|
|
457
|
+
"title": "Bug"
|
|
458
|
+
}
|
|
459
|
+
}
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
"source": "stream",
|
|
464
|
+
"subscriptionId": "sub_12",
|
|
465
|
+
"deliveryId": "dlv_e5f6",
|
|
466
|
+
"dedupKey": "events:3:88412",
|
|
467
|
+
"receivedAt": "2026-07-06T12:00:00Z",
|
|
468
|
+
"verified": true,
|
|
469
|
+
"contentTrust": "untrusted",
|
|
470
|
+
"stream": {
|
|
471
|
+
"topic": "events",
|
|
472
|
+
"partition": 3,
|
|
473
|
+
"offset": "88412",
|
|
474
|
+
"key": "user_77",
|
|
475
|
+
"message": {
|
|
476
|
+
"type": "page_view",
|
|
477
|
+
"path": "/pricing"
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
},
|
|
481
|
+
{
|
|
482
|
+
"source": "change",
|
|
483
|
+
"subscriptionId": "sub_13",
|
|
484
|
+
"deliveryId": "dlv_a7b8",
|
|
485
|
+
"dedupKey": "contacts:lsn:0/1C4F9D0",
|
|
486
|
+
"receivedAt": "2026-07-06T12:01:00Z",
|
|
487
|
+
"verified": true,
|
|
488
|
+
"contentTrust": "untrusted",
|
|
489
|
+
"permittedPurposes": [
|
|
490
|
+
"analytics"
|
|
491
|
+
],
|
|
492
|
+
"change": {
|
|
493
|
+
"op": "update",
|
|
494
|
+
"table": "contacts",
|
|
495
|
+
"changelogId": "0/1C4F9D0",
|
|
496
|
+
"before": {
|
|
497
|
+
"id": 77,
|
|
498
|
+
"tier": "free"
|
|
499
|
+
},
|
|
500
|
+
"after": {
|
|
501
|
+
"id": 77,
|
|
502
|
+
"tier": "pro"
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
],
|
|
507
|
+
"x-openwop-seeded-from": "v1"
|
|
508
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/trigger-subscription-registration.schema.json",
|
|
4
|
+
"title": "TriggerSubscriptionRegistration",
|
|
5
|
+
"description": "RFC 0099 §F.2. The portable create request for an external-event trigger subscription, served by `POST /v1/trigger-subscriptions`. Binds an external source (`webhook`/`email`/`form`) to a Workflow to start, with a dedup config and a source-authenticity verification policy. This is the unified create surface RFC 0083 UQ1 left per-source. The response returns the created `TriggerSubscription` (RFC 0083 §B) plus a source-specific `binding`; the binding secret/URL is returned ONCE at creation and is not re-fetchable in cleartext (SR-1).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"source",
|
|
10
|
+
"workflowId"
|
|
11
|
+
],
|
|
12
|
+
"properties": {
|
|
13
|
+
"source": {
|
|
14
|
+
"type": "string",
|
|
15
|
+
"enum": [
|
|
16
|
+
"webhook",
|
|
17
|
+
"email",
|
|
18
|
+
"form",
|
|
19
|
+
"stream",
|
|
20
|
+
"change"
|
|
21
|
+
],
|
|
22
|
+
"description": "The external source this subscription ingests. MUST appear in the host's `capabilities.triggerBridge.ingestion.externalSources[]`."
|
|
23
|
+
},
|
|
24
|
+
"workflowId": {
|
|
25
|
+
"$ref": "ids.schema.json#/$defs/workflowId",
|
|
26
|
+
"description": "The Workflow a delivered event starts (the run's `workflowId`). MUST resolve under the caller's RFC 0048 owner triple — a registration MUST NOT bind a workflow the caller cannot start (RFC 0049 scope check)."
|
|
27
|
+
},
|
|
28
|
+
"dedupEnabled": {
|
|
29
|
+
"type": "boolean",
|
|
30
|
+
"default": true,
|
|
31
|
+
"description": "Per RFC 0083 §C-1. Defaults true for external sources — at-least-once inbound delivery without dedup is a footgun."
|
|
32
|
+
},
|
|
33
|
+
"retryPolicy": {
|
|
34
|
+
"type": "object",
|
|
35
|
+
"additionalProperties": false,
|
|
36
|
+
"description": "Delivery retry policy (RFC 0083 §C-2). Same shape as `trigger-subscription.schema.json#/properties/retryPolicy`. On exhaustion the delivery transitions to `dead-lettered` (RFC 0053).",
|
|
37
|
+
"properties": {
|
|
38
|
+
"maxAttempts": {
|
|
39
|
+
"type": "integer",
|
|
40
|
+
"minimum": 1,
|
|
41
|
+
"description": "Maximum delivery attempts before dead-lettering."
|
|
42
|
+
},
|
|
43
|
+
"backoff": {
|
|
44
|
+
"type": "string",
|
|
45
|
+
"enum": [
|
|
46
|
+
"none",
|
|
47
|
+
"fixed",
|
|
48
|
+
"exponential"
|
|
49
|
+
],
|
|
50
|
+
"description": "Backoff strategy between attempts."
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"verification": {
|
|
55
|
+
"type": "object",
|
|
56
|
+
"additionalProperties": false,
|
|
57
|
+
"description": "Source-authenticity policy. The host MUST verify per this policy BEFORE delivery and stamp `TriggerEvent.verified`; an event failing a `required` verification MUST NOT start a run (it transitions `trigger.delivery.attempted{outcome:'dead-lettered'}` with `trigger.subscription.state.changed.reason:'signature-invalid'`).",
|
|
58
|
+
"properties": {
|
|
59
|
+
"mode": {
|
|
60
|
+
"type": "string",
|
|
61
|
+
"enum": [
|
|
62
|
+
"required",
|
|
63
|
+
"best-effort",
|
|
64
|
+
"none"
|
|
65
|
+
],
|
|
66
|
+
"default": "required",
|
|
67
|
+
"description": "`required`: an unverified event is dead-lettered, no run. `best-effort`: the host verifies when it can and stamps `verified` accordingly but still delivers. `none`: no verification."
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"inputMapping": {
|
|
72
|
+
"type": "object",
|
|
73
|
+
"additionalProperties": true,
|
|
74
|
+
"description": "OPTIONAL host-extension hint mapping `TriggerEvent` fields onto the workflow's `inputs`. Non-normative shape (host-specific); absent ⇒ the run receives the whole `TriggerEvent` as `ctx.triggerData`."
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
"examples": [
|
|
78
|
+
{
|
|
79
|
+
"source": "email",
|
|
80
|
+
"workflowId": "triage-support",
|
|
81
|
+
"dedupEnabled": true,
|
|
82
|
+
"verification": {
|
|
83
|
+
"mode": "required"
|
|
84
|
+
}
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"source": "webhook",
|
|
88
|
+
"workflowId": "ingest-jira-issue",
|
|
89
|
+
"verification": {
|
|
90
|
+
"mode": "required"
|
|
91
|
+
},
|
|
92
|
+
"retryPolicy": {
|
|
93
|
+
"maxAttempts": 5,
|
|
94
|
+
"backoff": "exponential"
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
],
|
|
98
|
+
"x-openwop-seeded-from": "v1"
|
|
99
|
+
}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/trigger-subscription.schema.json",
|
|
4
|
+
"title": "TriggerSubscription",
|
|
5
|
+
"description": "RFC 0083 §B. A durable inbound-trigger subscription record (a webhook registration, a schedule, a queue consumer) with a standardized four-state machine layered over the existing per-source registration. Composes RFC 0052/0053/0017 + webhooks.md + RFC 0040 causation; the channel wire format stays a vendor extension (§E). Content-free of inbound payloads/credentials (SR-1).",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"additionalProperties": false,
|
|
8
|
+
"required": [
|
|
9
|
+
"subscriptionId",
|
|
10
|
+
"source",
|
|
11
|
+
"state"
|
|
12
|
+
],
|
|
13
|
+
"properties": {
|
|
14
|
+
"subscriptionId": {
|
|
15
|
+
"$ref": "ids.schema.json#/$defs/subscriptionId",
|
|
16
|
+
"description": "Stable host-unique id for the subscription. Correlates the §C delivery events + the management surface."
|
|
17
|
+
},
|
|
18
|
+
"source": {
|
|
19
|
+
"type": "string",
|
|
20
|
+
"enum": [
|
|
21
|
+
"webhook",
|
|
22
|
+
"schedule",
|
|
23
|
+
"queue",
|
|
24
|
+
"email",
|
|
25
|
+
"form",
|
|
26
|
+
"stream",
|
|
27
|
+
"change"
|
|
28
|
+
],
|
|
29
|
+
"description": "Which trigger source backs the subscription. Channels beyond these (Slack/Discord/SMS) bridge as a vendor extension by registering a subscription of the closest source kind (§E)."
|
|
30
|
+
},
|
|
31
|
+
"state": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"enum": [
|
|
34
|
+
"active",
|
|
35
|
+
"paused",
|
|
36
|
+
"failed",
|
|
37
|
+
"dead-lettered"
|
|
38
|
+
],
|
|
39
|
+
"description": "The §B state. `active`: accepting + delivering; `paused`: retained, not delivering (operator-held); `failed`: delivery failing past policy (the webhooks.md circuit-breaker generalized); `dead-lettered`: terminal, deliveries routed to the RFC 0053 sink."
|
|
40
|
+
},
|
|
41
|
+
"dedupEnabled": {
|
|
42
|
+
"type": "boolean",
|
|
43
|
+
"description": "When true, the host de-duplicates inbound events by `dedupKey` within the retention window (§C-1; the idempotency.md Layer-1 model applied to inbound triggers)."
|
|
44
|
+
},
|
|
45
|
+
"retryPolicy": {
|
|
46
|
+
"type": "object",
|
|
47
|
+
"additionalProperties": false,
|
|
48
|
+
"description": "Delivery retry policy (§C-2). On exhaustion the subscription/delivery transitions to `dead-lettered` (RFC 0053).",
|
|
49
|
+
"properties": {
|
|
50
|
+
"maxAttempts": {
|
|
51
|
+
"type": "integer",
|
|
52
|
+
"minimum": 1,
|
|
53
|
+
"description": "Maximum delivery attempts before dead-lettering."
|
|
54
|
+
},
|
|
55
|
+
"backoff": {
|
|
56
|
+
"type": "string",
|
|
57
|
+
"enum": [
|
|
58
|
+
"none",
|
|
59
|
+
"fixed",
|
|
60
|
+
"exponential"
|
|
61
|
+
],
|
|
62
|
+
"description": "Backoff strategy between attempts."
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
},
|
|
66
|
+
"webhookId": {
|
|
67
|
+
"type": "string",
|
|
68
|
+
"minLength": 1,
|
|
69
|
+
"description": "MAY — for `source: \"webhook\"`, the existing webhooks.md register key (unchanged; the state machine layers over it)."
|
|
70
|
+
},
|
|
71
|
+
"secretFingerprint": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"minLength": 1,
|
|
74
|
+
"maxLength": 32,
|
|
75
|
+
"description": "MAY — for `source: \"webhook\"`, an identifier for the signing secret (the `(webhookId, secretFingerprint)` register key). It MUST be a **salted or host-keyed, TRUNCATED** one-way digest (e.g. the first 8–16 hex of `HMAC(hostKey, secret)`) — NOT the raw secret (SR-1) and NOT a full unsalted `SHA256(secret)` (a full unsalted hash of a low-entropy secret is an offline brute-force / confirmation oracle). The `maxLength: 32` ceiling structurally rejects a full 64-hex digest."
|
|
76
|
+
}
|
|
77
|
+
},
|
|
78
|
+
"x-openwop-seeded-from": "v1"
|
|
79
|
+
}
|