@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,354 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/connection-pack-manifest.schema.json",
|
|
4
|
+
"title": "ConnectionPackManifest",
|
|
5
|
+
"description": "RFC 0095. Manifest for a published OpenWOP connection pack — `pack.json` at the pack root with `kind: \"connection\"`. Peer to and disjoint from `node-pack-manifest.schema.json` (RFC 0003), `prompt-pack-manifest.schema.json` (RFC 0028), and `workflow-chain-pack-manifest.schema.json` (RFC 0013) via the `kind` discriminator. A connection pack is a portable PROVIDER definition — the authorize/token/revoke endpoints, the read/write OAuth scope catalog, and how the integration is reached (an MCP server, an OpenAPI surface, or a core integration node). It carries NO secret: the OAuth client credential is a host concern (RFC 0047), supplied out of band. When installed, it makes an RFC 0045 connector's `auth.provider` / an RFC 0047 `host.oauth` provider string resolve against `provider.id` instead of host-locked code. See `spec/v1/connection-packs.md`.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"name",
|
|
9
|
+
"version",
|
|
10
|
+
"kind",
|
|
11
|
+
"engines",
|
|
12
|
+
"provider"
|
|
13
|
+
],
|
|
14
|
+
"additionalProperties": false,
|
|
15
|
+
"properties": {
|
|
16
|
+
"name": {
|
|
17
|
+
"type": "string",
|
|
18
|
+
"description": "Reverse-DNS pack name per `node-packs.md` §Naming. Reserved scopes are identical (`core.*` / `vendor.<org>.*` / `community.<author>.*` / `private.<host>.*`). Mirror of `prompt-pack-manifest.schema.json#/properties/name`.",
|
|
19
|
+
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
20
|
+
"minLength": 1,
|
|
21
|
+
"maxLength": 256
|
|
22
|
+
},
|
|
23
|
+
"version": {
|
|
24
|
+
"type": "string",
|
|
25
|
+
"description": "Pack-level SemVer 2.0.0.",
|
|
26
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
|
|
27
|
+
},
|
|
28
|
+
"kind": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"const": "connection",
|
|
31
|
+
"description": "Pack kind discriminator. MUST be the literal string `\"connection\"` for this schema."
|
|
32
|
+
},
|
|
33
|
+
"description": {
|
|
34
|
+
"type": "string",
|
|
35
|
+
"maxLength": 1024
|
|
36
|
+
},
|
|
37
|
+
"author": {
|
|
38
|
+
"type": "string"
|
|
39
|
+
},
|
|
40
|
+
"license": {
|
|
41
|
+
"type": "string",
|
|
42
|
+
"description": "SPDX license identifier (e.g., `Apache-2.0`)."
|
|
43
|
+
},
|
|
44
|
+
"homepage": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"format": "uri"
|
|
47
|
+
},
|
|
48
|
+
"repository": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"format": "uri"
|
|
51
|
+
},
|
|
52
|
+
"keywords": {
|
|
53
|
+
"type": "array",
|
|
54
|
+
"items": {
|
|
55
|
+
"type": "string",
|
|
56
|
+
"maxLength": 64
|
|
57
|
+
},
|
|
58
|
+
"maxItems": 50
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"type": "object",
|
|
62
|
+
"required": [
|
|
63
|
+
"openwop"
|
|
64
|
+
],
|
|
65
|
+
"additionalProperties": false,
|
|
66
|
+
"properties": {
|
|
67
|
+
"openwop": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"description": "SemVer range of the openwop spec version this pack targets."
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
"provider": {
|
|
74
|
+
"type": "object",
|
|
75
|
+
"description": "The portable provider definition. Exactly one per connection pack.",
|
|
76
|
+
"required": [
|
|
77
|
+
"id",
|
|
78
|
+
"displayName",
|
|
79
|
+
"category",
|
|
80
|
+
"auth",
|
|
81
|
+
"reach"
|
|
82
|
+
],
|
|
83
|
+
"additionalProperties": false,
|
|
84
|
+
"allOf": [
|
|
85
|
+
{
|
|
86
|
+
"$comment": "RFC 0120 UQ1: apiHosts is REQUIRED when reach is openapi (a credentialed REST/OpenAPI egress surface). A pure metadata / mcp / integration provider MAY omit it. The runtime binding-site validator (spec §Manifest item 13) is the complementary check for credentialed-egress paths the manifest cannot see.",
|
|
87
|
+
"if": {
|
|
88
|
+
"required": [
|
|
89
|
+
"reach"
|
|
90
|
+
],
|
|
91
|
+
"properties": {
|
|
92
|
+
"reach": {
|
|
93
|
+
"required": [
|
|
94
|
+
"openapi"
|
|
95
|
+
]
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"then": {
|
|
100
|
+
"required": [
|
|
101
|
+
"apiHosts"
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
],
|
|
106
|
+
"properties": {
|
|
107
|
+
"id": {
|
|
108
|
+
"type": "string",
|
|
109
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
110
|
+
"description": "Stable provider id an RFC 0045/0047 `provider` string resolves to, e.g. `github`."
|
|
111
|
+
},
|
|
112
|
+
"displayName": {
|
|
113
|
+
"type": "string",
|
|
114
|
+
"minLength": 1
|
|
115
|
+
},
|
|
116
|
+
"category": {
|
|
117
|
+
"type": "string",
|
|
118
|
+
"enum": [
|
|
119
|
+
"communication",
|
|
120
|
+
"docs",
|
|
121
|
+
"crm",
|
|
122
|
+
"dev",
|
|
123
|
+
"storage",
|
|
124
|
+
"email-calendar",
|
|
125
|
+
"ticketing",
|
|
126
|
+
"data-warehouse",
|
|
127
|
+
"marketing",
|
|
128
|
+
"finance",
|
|
129
|
+
"hr",
|
|
130
|
+
"esignature",
|
|
131
|
+
"support",
|
|
132
|
+
"project-management",
|
|
133
|
+
"payments",
|
|
134
|
+
"other"
|
|
135
|
+
]
|
|
136
|
+
},
|
|
137
|
+
"vendor": {
|
|
138
|
+
"type": "string",
|
|
139
|
+
"minLength": 1,
|
|
140
|
+
"description": "RFC 0123. OPTIONAL. The commercial vendor / ecosystem this connector belongs to (e.g. \"Microsoft 365\", \"Google\", \"Workday\"). Presentational grouping ONLY — it is NOT the resolution key (RFC 0047 `provider` still resolves auth). Free-form (not an enum) so a new vendor needs no schema change; a host/registry groups connectors sharing a `vendor` under one heading and MUST fall back to the provider `displayName` when it is absent."
|
|
141
|
+
},
|
|
142
|
+
"auth": {
|
|
143
|
+
"type": "object",
|
|
144
|
+
"required": [
|
|
145
|
+
"kind"
|
|
146
|
+
],
|
|
147
|
+
"additionalProperties": false,
|
|
148
|
+
"properties": {
|
|
149
|
+
"kind": {
|
|
150
|
+
"type": "string",
|
|
151
|
+
"enum": [
|
|
152
|
+
"oauth2",
|
|
153
|
+
"api_key",
|
|
154
|
+
"bearer",
|
|
155
|
+
"basic"
|
|
156
|
+
]
|
|
157
|
+
},
|
|
158
|
+
"authFlow": {
|
|
159
|
+
"type": "string",
|
|
160
|
+
"enum": [
|
|
161
|
+
"pkce",
|
|
162
|
+
"client_credentials",
|
|
163
|
+
"manual",
|
|
164
|
+
"none"
|
|
165
|
+
]
|
|
166
|
+
},
|
|
167
|
+
"scopeModel": {
|
|
168
|
+
"type": "string",
|
|
169
|
+
"enum": [
|
|
170
|
+
"groups",
|
|
171
|
+
"coarse",
|
|
172
|
+
"capabilities"
|
|
173
|
+
],
|
|
174
|
+
"default": "groups",
|
|
175
|
+
"description": "`groups` = read/write scope groups (Google/Jira/Graph). `coarse` = a single read-vs-write toggle (Stripe Connect read_only/read_write). `capabilities` = consent is a static developer-portal capability set, not per-request scopes (Notion)."
|
|
176
|
+
},
|
|
177
|
+
"endpoints": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"additionalProperties": false,
|
|
180
|
+
"description": "Fixed, manifest-declared https endpoints (RFC 0095 §B.3). Never derived from runtime user input — not an SSRF surface.",
|
|
181
|
+
"properties": {
|
|
182
|
+
"authorize": {
|
|
183
|
+
"type": "string",
|
|
184
|
+
"format": "uri",
|
|
185
|
+
"pattern": "^https://"
|
|
186
|
+
},
|
|
187
|
+
"token": {
|
|
188
|
+
"type": "string",
|
|
189
|
+
"format": "uri",
|
|
190
|
+
"pattern": "^https://"
|
|
191
|
+
},
|
|
192
|
+
"revoke": {
|
|
193
|
+
"type": "string",
|
|
194
|
+
"format": "uri",
|
|
195
|
+
"pattern": "^https://"
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
},
|
|
199
|
+
"scopes": {
|
|
200
|
+
"type": "object",
|
|
201
|
+
"additionalProperties": false,
|
|
202
|
+
"description": "Read/write scope groups. `write` is requested as a SEPARATE re-consent step (RFC 0095 §B.4).",
|
|
203
|
+
"properties": {
|
|
204
|
+
"read": {
|
|
205
|
+
"type": "array",
|
|
206
|
+
"items": {
|
|
207
|
+
"$ref": "#/$defs/ScopeGroup"
|
|
208
|
+
}
|
|
209
|
+
},
|
|
210
|
+
"write": {
|
|
211
|
+
"type": "array",
|
|
212
|
+
"items": {
|
|
213
|
+
"$ref": "#/$defs/ScopeGroup"
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
"instanceUrlTemplate": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"description": "For per-account-host providers (Snowflake/NetSuite/ServiceNow): a template the host fills per connection, e.g. `https://{account}.snowflakecomputing.com`. Its presence signals the provider cannot use a single global OAuth app."
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
},
|
|
224
|
+
"reach": {
|
|
225
|
+
"type": "object",
|
|
226
|
+
"minProperties": 1,
|
|
227
|
+
"maxProperties": 1,
|
|
228
|
+
"additionalProperties": false,
|
|
229
|
+
"description": "Exactly ONE of mcp | openapi | integration — which core node injects the resolved credential (RFC 0095 §B.5).",
|
|
230
|
+
"properties": {
|
|
231
|
+
"mcp": {
|
|
232
|
+
"type": "object",
|
|
233
|
+
"required": [
|
|
234
|
+
"server"
|
|
235
|
+
],
|
|
236
|
+
"additionalProperties": false,
|
|
237
|
+
"properties": {
|
|
238
|
+
"server": {
|
|
239
|
+
"type": "object",
|
|
240
|
+
"required": [
|
|
241
|
+
"url",
|
|
242
|
+
"transport"
|
|
243
|
+
],
|
|
244
|
+
"additionalProperties": false,
|
|
245
|
+
"properties": {
|
|
246
|
+
"url": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"format": "uri",
|
|
249
|
+
"pattern": "^https://"
|
|
250
|
+
},
|
|
251
|
+
"transport": {
|
|
252
|
+
"type": "string",
|
|
253
|
+
"enum": [
|
|
254
|
+
"http",
|
|
255
|
+
"sse"
|
|
256
|
+
]
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
},
|
|
262
|
+
"openapi": {
|
|
263
|
+
"type": "object",
|
|
264
|
+
"required": [
|
|
265
|
+
"ref"
|
|
266
|
+
],
|
|
267
|
+
"additionalProperties": false,
|
|
268
|
+
"properties": {
|
|
269
|
+
"ref": {
|
|
270
|
+
"type": "string",
|
|
271
|
+
"description": "URL or in-pack path of the OpenAPI document for core.openwop.http.openapi-call."
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
},
|
|
275
|
+
"integration": {
|
|
276
|
+
"type": "object",
|
|
277
|
+
"required": [
|
|
278
|
+
"node"
|
|
279
|
+
],
|
|
280
|
+
"additionalProperties": false,
|
|
281
|
+
"properties": {
|
|
282
|
+
"node": {
|
|
283
|
+
"type": "string",
|
|
284
|
+
"description": "A core.openwop.integration.* node typeId."
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
},
|
|
290
|
+
"consumerNodes": {
|
|
291
|
+
"type": "array",
|
|
292
|
+
"items": {
|
|
293
|
+
"type": "string"
|
|
294
|
+
},
|
|
295
|
+
"description": "The core node typeIds that consume this provider's credential (e.g. core.openwop.mcp.invoke-tool)."
|
|
296
|
+
},
|
|
297
|
+
"docsUrl": {
|
|
298
|
+
"type": "string",
|
|
299
|
+
"format": "uri"
|
|
300
|
+
},
|
|
301
|
+
"apiHosts": {
|
|
302
|
+
"type": "array",
|
|
303
|
+
"description": "RFC 0120. API host(s) a host MAY send this provider's resolved credential to for connector egress (RFC 0045). Each entry is a bare registrable hostname — lowercase ASCII, >=2 labels, TLD label beginning with a letter; no scheme, port, path, wildcard, or IP literal. Matched by dot-anchored suffix containment (request host == entry OR ends with '.'+entry); eTLD+1 is the floor and a pack MAY list a tighter exact host (e.g. googleads.googleapis.com). Omitted => no credential-bearing connector egress is reachable (fails closed). REQUIRED when reach is openapi (see the provider-level allOf).",
|
|
304
|
+
"items": {
|
|
305
|
+
"type": "string",
|
|
306
|
+
"format": "hostname",
|
|
307
|
+
"pattern": "^(?!-)[a-z0-9-]{1,63}(\\.[a-z0-9-]{1,63})*\\.[a-z][a-z0-9-]*$"
|
|
308
|
+
},
|
|
309
|
+
"uniqueItems": true,
|
|
310
|
+
"minItems": 1
|
|
311
|
+
}
|
|
312
|
+
},
|
|
313
|
+
"patternProperties": {
|
|
314
|
+
"^(openwop-|x-|vendor\\.)": {
|
|
315
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
},
|
|
320
|
+
"$defs": {
|
|
321
|
+
"ScopeGroup": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"required": [
|
|
324
|
+
"key",
|
|
325
|
+
"label",
|
|
326
|
+
"scopes"
|
|
327
|
+
],
|
|
328
|
+
"additionalProperties": false,
|
|
329
|
+
"properties": {
|
|
330
|
+
"key": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"pattern": "^[a-z][a-z0-9._-]*$"
|
|
333
|
+
},
|
|
334
|
+
"label": {
|
|
335
|
+
"type": "string",
|
|
336
|
+
"minLength": 1
|
|
337
|
+
},
|
|
338
|
+
"scopes": {
|
|
339
|
+
"type": "array",
|
|
340
|
+
"items": {
|
|
341
|
+
"type": "string"
|
|
342
|
+
},
|
|
343
|
+
"description": "The provider's raw scope strings, e.g. `https://www.googleapis.com/auth/drive.readonly`."
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
},
|
|
348
|
+
"patternProperties": {
|
|
349
|
+
"^(openwop-|x-|vendor\\.)": {
|
|
350
|
+
"description": "Vendor / host extension escape hatch (RFC 0138). A property matching `^(x-|vendor\\.)` is a HOST EXTENSION: its semantics are unspecified by this protocol, and a consumer that does not recognize one MUST ignore it rather than reject the pack. Resolves the contradiction in `host-extensions.md` §\"Vendor-prefixed namespaces\", which requires a client receiving an unknown vendor-prefixed field to treat it as opaque — a field that `additionalProperties: false` previously made impossible to carry. SECURITY: an extension value is PACK-AUTHORED, therefore untrusted; \"ignore\" means ignore. See `node-packs.md` §\"Vendor extensions on pack manifests\" and the `pack-manifest-extension-opaque` invariant."
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
"x-openwop-seeded-from": "v1"
|
|
354
|
+
}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/conversation-event.schema.json",
|
|
4
|
+
"title": "ConversationEvent",
|
|
5
|
+
"description": "Discriminated payload for the three new run events RFC 0005 introduces: `conversation.opened`, `conversation.exchanged`, `conversation.closed`. Discriminator is the parent `RunEventDoc.type` field (see `run-event.schema.json`); this schema constrains `payload` shape. The `ConversationTurn` shape is inlined under `$defs` (rather than $ref'd to `conversation-turn.schema.json`) for self-containment under per-file Ajv compile order — keep in sync with `conversation-turn.schema.json`. See RFC 0005 §B.",
|
|
6
|
+
"oneOf": [
|
|
7
|
+
{
|
|
8
|
+
"$ref": "#/$defs/ConversationOpenedPayload"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"$ref": "#/$defs/ConversationExchangedPayload"
|
|
12
|
+
},
|
|
13
|
+
{
|
|
14
|
+
"$ref": "#/$defs/ConversationClosedPayload"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"$defs": {
|
|
18
|
+
"AgentRef": {
|
|
19
|
+
"type": "object",
|
|
20
|
+
"description": "RFC 0101. Slim wire-shape projection of an agent's identity. Mirror of the relevant subset of `agent-ref.schema.json`; kept in sync (inlined for self-containment under per-file Ajv compile order, same convention as `ConversationTurn`). Used by `ConversationOpenedPayload.participants` — the cohort permitted to speak. `agentId` here is the roster INSTANCE id (`host:<id>` per RFC 0086) for council members, matching a turn's `speakerId`.",
|
|
21
|
+
"required": [
|
|
22
|
+
"agentId"
|
|
23
|
+
],
|
|
24
|
+
"properties": {
|
|
25
|
+
"agentId": {
|
|
26
|
+
"$ref": "ids.schema.json#/$defs/agentId"
|
|
27
|
+
},
|
|
28
|
+
"name": {
|
|
29
|
+
"type": "string",
|
|
30
|
+
"maxLength": 256
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"additionalProperties": false
|
|
34
|
+
},
|
|
35
|
+
"ConversationTurn": {
|
|
36
|
+
"type": "object",
|
|
37
|
+
"description": "One turn in a multi-turn conversation. Mirror of `conversation-turn.schema.json`; kept in sync. Structural superset of `ConversationMessage` (RFC 0002 §G).",
|
|
38
|
+
"required": [
|
|
39
|
+
"messageId",
|
|
40
|
+
"from",
|
|
41
|
+
"content",
|
|
42
|
+
"ts",
|
|
43
|
+
"role",
|
|
44
|
+
"turnIndex"
|
|
45
|
+
],
|
|
46
|
+
"properties": {
|
|
47
|
+
"messageId": {
|
|
48
|
+
"type": "string",
|
|
49
|
+
"minLength": 1,
|
|
50
|
+
"maxLength": 256
|
|
51
|
+
},
|
|
52
|
+
"from": {
|
|
53
|
+
"type": "string",
|
|
54
|
+
"minLength": 1,
|
|
55
|
+
"maxLength": 256
|
|
56
|
+
},
|
|
57
|
+
"to": {
|
|
58
|
+
"type": "string",
|
|
59
|
+
"maxLength": 256
|
|
60
|
+
},
|
|
61
|
+
"groupId": {
|
|
62
|
+
"type": "string",
|
|
63
|
+
"maxLength": 256
|
|
64
|
+
},
|
|
65
|
+
"content": {
|
|
66
|
+
"type": [
|
|
67
|
+
"object",
|
|
68
|
+
"array",
|
|
69
|
+
"string",
|
|
70
|
+
"number",
|
|
71
|
+
"boolean",
|
|
72
|
+
"null"
|
|
73
|
+
]
|
|
74
|
+
},
|
|
75
|
+
"ts": {
|
|
76
|
+
"type": "integer",
|
|
77
|
+
"minimum": 0
|
|
78
|
+
},
|
|
79
|
+
"role": {
|
|
80
|
+
"type": "string",
|
|
81
|
+
"enum": [
|
|
82
|
+
"user",
|
|
83
|
+
"agent",
|
|
84
|
+
"system"
|
|
85
|
+
]
|
|
86
|
+
},
|
|
87
|
+
"agent": {
|
|
88
|
+
"type": "object",
|
|
89
|
+
"properties": {
|
|
90
|
+
"agentId": {
|
|
91
|
+
"$ref": "ids.schema.json#/$defs/agentId"
|
|
92
|
+
},
|
|
93
|
+
"agentSharing": {
|
|
94
|
+
"type": "string",
|
|
95
|
+
"enum": [
|
|
96
|
+
"isolated",
|
|
97
|
+
"shared",
|
|
98
|
+
"shared:%shared%"
|
|
99
|
+
]
|
|
100
|
+
},
|
|
101
|
+
"memoryRef": {
|
|
102
|
+
"type": "string"
|
|
103
|
+
}
|
|
104
|
+
},
|
|
105
|
+
"additionalProperties": false
|
|
106
|
+
},
|
|
107
|
+
"turnIndex": {
|
|
108
|
+
"type": "integer",
|
|
109
|
+
"minimum": 0
|
|
110
|
+
},
|
|
111
|
+
"speakerId": {
|
|
112
|
+
"type": "string",
|
|
113
|
+
"minLength": 1,
|
|
114
|
+
"maxLength": 256,
|
|
115
|
+
"description": "RFC 0101. Roster INSTANCE id of this turn's speaker (`host:<id>` AgentRef per RFC 0086). REQUIRED when `role: 'agent'` (the `allOf`/`if` conditional below). Mirror of `conversation-turn.schema.json`'s `speakerId`; kept in sync."
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
"allOf": [
|
|
119
|
+
{
|
|
120
|
+
"$comment": "RFC 0101 — agent turns MUST carry speaker attribution. Mirror of `conversation-turn.schema.json`; kept in sync.",
|
|
121
|
+
"if": {
|
|
122
|
+
"properties": {
|
|
123
|
+
"role": {
|
|
124
|
+
"const": "agent"
|
|
125
|
+
}
|
|
126
|
+
},
|
|
127
|
+
"required": [
|
|
128
|
+
"role"
|
|
129
|
+
]
|
|
130
|
+
},
|
|
131
|
+
"then": {
|
|
132
|
+
"required": [
|
|
133
|
+
"speakerId"
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
],
|
|
138
|
+
"additionalProperties": false
|
|
139
|
+
},
|
|
140
|
+
"ConversationOpenedPayload": {
|
|
141
|
+
"type": "object",
|
|
142
|
+
"description": "Payload for `RunEventType: 'conversation.opened'`. Emitted when a node calls `ctx.interrupt({kind: 'conversation', operation: 'start', ...})`. Causation: this event's `causationId` MUST equal the `eventId` of the accompanying `node.suspended`.",
|
|
143
|
+
"required": [
|
|
144
|
+
"conversationId",
|
|
145
|
+
"initialTurn"
|
|
146
|
+
],
|
|
147
|
+
"properties": {
|
|
148
|
+
"conversationId": {
|
|
149
|
+
"type": "string",
|
|
150
|
+
"description": "Host-assigned conversation identifier. Deterministic for replay (typically `${runId}:${nodeId}:${attempt}`). Persists across all turns of this conversation.",
|
|
151
|
+
"minLength": 1,
|
|
152
|
+
"maxLength": 256
|
|
153
|
+
},
|
|
154
|
+
"agentId": {
|
|
155
|
+
"$ref": "ids.schema.json#/$defs/agentId",
|
|
156
|
+
"description": "Optional. The agent driving this conversation (RFC 0002 §A1). For multi-agent conversations, identifies the conversation owner."
|
|
157
|
+
},
|
|
158
|
+
"participants": {
|
|
159
|
+
"type": "array",
|
|
160
|
+
"items": {
|
|
161
|
+
"$ref": "#/$defs/AgentRef"
|
|
162
|
+
},
|
|
163
|
+
"description": "RFC 0101. OPTIONAL. The agent cohort permitted to speak in this conversation (multi-party group conversation / advisory council). Each `agentId` is a roster INSTANCE id (`host:<id>` per RFC 0086). When present (and the host advertises `multiPartyConversation.supported`), a turn whose `speakerId` is not a member of this roster MUST be rejected. Disambiguates the singular `agentId` (the owner) from the full speaking cohort. Absent ⇒ no roster enforcement (back-compat: single-agent conversations are unaffected). MVP: declared at open-time only; mid-conversation roster mutation is out of scope (RFC 0101 §Resolved questions)."
|
|
164
|
+
},
|
|
165
|
+
"initialTurn": {
|
|
166
|
+
"$ref": "#/$defs/ConversationTurn"
|
|
167
|
+
},
|
|
168
|
+
"schema": {
|
|
169
|
+
"type": "object",
|
|
170
|
+
"description": "Optional JSON Schema for resume turn validation. Servers SHOULD validate subsequent `conversation.exchanged` turns against this schema.",
|
|
171
|
+
"additionalProperties": true
|
|
172
|
+
},
|
|
173
|
+
"capabilities": {
|
|
174
|
+
"type": "array",
|
|
175
|
+
"description": "Informative host capability hints. Future RFCs may normate values; current namespace is open.",
|
|
176
|
+
"items": {
|
|
177
|
+
"type": "string",
|
|
178
|
+
"enum": [
|
|
179
|
+
"multi-turn",
|
|
180
|
+
"streaming"
|
|
181
|
+
]
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
"additionalProperties": false,
|
|
186
|
+
"examples": [
|
|
187
|
+
{
|
|
188
|
+
"$comment": "RFC 0101 POSITIVE — a 3-agent advisory council opens with a participant roster (instance ids) and a user's opening turn.",
|
|
189
|
+
"conversationId": "run-abc:n1:0",
|
|
190
|
+
"agentId": "host:advisor-cfo",
|
|
191
|
+
"participants": [
|
|
192
|
+
{
|
|
193
|
+
"agentId": "host:advisor-cfo",
|
|
194
|
+
"name": "CFO"
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
"agentId": "host:advisor-cmo",
|
|
198
|
+
"name": "CMO"
|
|
199
|
+
},
|
|
200
|
+
{
|
|
201
|
+
"agentId": "host:advisor-cto",
|
|
202
|
+
"name": "CTO"
|
|
203
|
+
}
|
|
204
|
+
],
|
|
205
|
+
"initialTurn": {
|
|
206
|
+
"messageId": "run-abc:n1:0:user",
|
|
207
|
+
"from": "user",
|
|
208
|
+
"content": "Should we launch in Q3 or Q4?",
|
|
209
|
+
"ts": 1718900000000,
|
|
210
|
+
"role": "user",
|
|
211
|
+
"turnIndex": 0
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
]
|
|
215
|
+
},
|
|
216
|
+
"ConversationExchangedPayload": {
|
|
217
|
+
"type": "object",
|
|
218
|
+
"description": "Payload for `RunEventType: 'conversation.exchanged'`. Emitted on each `operation: 'exchange'` turn round-trip. The `turnIndex` MUST monotonically increase within a `conversationId`.",
|
|
219
|
+
"required": [
|
|
220
|
+
"conversationId",
|
|
221
|
+
"turnIndex",
|
|
222
|
+
"turn"
|
|
223
|
+
],
|
|
224
|
+
"properties": {
|
|
225
|
+
"conversationId": {
|
|
226
|
+
"type": "string",
|
|
227
|
+
"description": "MUST match the `conversation.opened` payload's `conversationId`.",
|
|
228
|
+
"minLength": 1,
|
|
229
|
+
"maxLength": 256
|
|
230
|
+
},
|
|
231
|
+
"turnIndex": {
|
|
232
|
+
"type": "integer",
|
|
233
|
+
"minimum": 1,
|
|
234
|
+
"description": "1-based index within the conversation. `conversation.opened.initialTurn` is `turnIndex: 0`; the first `exchanged` is `turnIndex: 1`; etc."
|
|
235
|
+
},
|
|
236
|
+
"turn": {
|
|
237
|
+
"$ref": "#/$defs/ConversationTurn"
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
"additionalProperties": false
|
|
241
|
+
},
|
|
242
|
+
"ConversationClosedPayload": {
|
|
243
|
+
"type": "object",
|
|
244
|
+
"description": "Payload for `RunEventType: 'conversation.closed'`. Emitted on `operation: 'close'`. Terminates the conversation; no further events MAY carry this `conversationId`.",
|
|
245
|
+
"required": [
|
|
246
|
+
"conversationId",
|
|
247
|
+
"turnIndex",
|
|
248
|
+
"finalTurn"
|
|
249
|
+
],
|
|
250
|
+
"properties": {
|
|
251
|
+
"conversationId": {
|
|
252
|
+
"type": "string",
|
|
253
|
+
"description": "MUST match the `conversation.opened` payload's `conversationId`.",
|
|
254
|
+
"minLength": 1,
|
|
255
|
+
"maxLength": 256
|
|
256
|
+
},
|
|
257
|
+
"turnIndex": {
|
|
258
|
+
"type": "integer",
|
|
259
|
+
"minimum": 0,
|
|
260
|
+
"description": "Total turn count — equal to the closing turn's index."
|
|
261
|
+
},
|
|
262
|
+
"finalTurn": {
|
|
263
|
+
"$ref": "#/$defs/ConversationTurn"
|
|
264
|
+
},
|
|
265
|
+
"outcome": {
|
|
266
|
+
"description": "Opaque host-defined goal value. The conversation's resolved output. Spec does not constrain the shape; hosts MAY layer their own schemas via the `schema` field on `conversation.opened`.",
|
|
267
|
+
"type": [
|
|
268
|
+
"object",
|
|
269
|
+
"array",
|
|
270
|
+
"string",
|
|
271
|
+
"number",
|
|
272
|
+
"boolean",
|
|
273
|
+
"null"
|
|
274
|
+
]
|
|
275
|
+
}
|
|
276
|
+
},
|
|
277
|
+
"additionalProperties": false
|
|
278
|
+
}
|
|
279
|
+
},
|
|
280
|
+
"x-openwop-seeded-from": "v1"
|
|
281
|
+
}
|