@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,657 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://openwop.dev/spec/v2/node-pack-manifest.schema.json",
|
|
4
|
+
"title": "NodePackManifest",
|
|
5
|
+
"description": "Manifest for a published OpenWOP node pack — `pack.json` at the pack root. Language-neutral. See node-packs.md for the canonical contract.",
|
|
6
|
+
"type": "object",
|
|
7
|
+
"required": [
|
|
8
|
+
"engines",
|
|
9
|
+
"kind",
|
|
10
|
+
"name",
|
|
11
|
+
"runtime",
|
|
12
|
+
"version"
|
|
13
|
+
],
|
|
14
|
+
"anyOf": [
|
|
15
|
+
{
|
|
16
|
+
"properties": {
|
|
17
|
+
"nodes": {
|
|
18
|
+
"type": "array",
|
|
19
|
+
"minItems": 1
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"required": [
|
|
23
|
+
"nodes"
|
|
24
|
+
]
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"properties": {
|
|
28
|
+
"agents": {
|
|
29
|
+
"type": "array",
|
|
30
|
+
"minItems": 1
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
"required": [
|
|
34
|
+
"agents"
|
|
35
|
+
]
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"properties": {
|
|
39
|
+
"kind": {
|
|
40
|
+
"type": "string",
|
|
41
|
+
"const": "node",
|
|
42
|
+
"description": "Pack kind discriminator. For node packs (the default and original kind) `kind` is either omitted entirely OR set to the literal string `\"node\"`. Manifests carrying `kind: \"workflow-chain\"` validate against `workflow-chain-pack-manifest.schema.json` instead — see workflow-chain-packs.md and RFC 0013."
|
|
43
|
+
},
|
|
44
|
+
"name": {
|
|
45
|
+
"type": "string",
|
|
46
|
+
"description": "Reverse-DNS pack name. Reserved scopes: `core.*` (spec-canonical), `vendor.<org>.*` (vendor-published), `community.<author>.*` (individual), `private.<host>.*` (host-internal — MUST NOT appear in `packs.openwop.dev`). `local.*` is for in-repo unpublished packs and MUST NOT appear in any registry. See node-packs.md §Naming for the full reservation table.",
|
|
47
|
+
"pattern": "^(core|vendor|community|private)\\.[a-z][a-z0-9_-]*(\\.[a-z][a-zA-Z0-9_-]*)+$",
|
|
48
|
+
"minLength": 1,
|
|
49
|
+
"maxLength": 256
|
|
50
|
+
},
|
|
51
|
+
"version": {
|
|
52
|
+
"type": "string",
|
|
53
|
+
"description": "Pack version per Semantic Versioning 2.0.0.",
|
|
54
|
+
"pattern": "^\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$"
|
|
55
|
+
},
|
|
56
|
+
"description": {
|
|
57
|
+
"type": "string",
|
|
58
|
+
"maxLength": 1024
|
|
59
|
+
},
|
|
60
|
+
"author": {
|
|
61
|
+
"type": "string"
|
|
62
|
+
},
|
|
63
|
+
"license": {
|
|
64
|
+
"type": "string",
|
|
65
|
+
"description": "SPDX license identifier (e.g., `Apache-2.0`, `MIT`)."
|
|
66
|
+
},
|
|
67
|
+
"homepage": {
|
|
68
|
+
"type": "string",
|
|
69
|
+
"format": "uri"
|
|
70
|
+
},
|
|
71
|
+
"repository": {
|
|
72
|
+
"type": "string",
|
|
73
|
+
"format": "uri"
|
|
74
|
+
},
|
|
75
|
+
"keywords": {
|
|
76
|
+
"type": "array",
|
|
77
|
+
"items": {
|
|
78
|
+
"type": "string",
|
|
79
|
+
"maxLength": 64
|
|
80
|
+
},
|
|
81
|
+
"maxItems": 50
|
|
82
|
+
},
|
|
83
|
+
"engines": {
|
|
84
|
+
"type": "object",
|
|
85
|
+
"additionalProperties": false,
|
|
86
|
+
"required": [
|
|
87
|
+
"openwop"
|
|
88
|
+
],
|
|
89
|
+
"properties": {
|
|
90
|
+
"openwop": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"pattern": "^>=\\d+(\\.\\d+){0,2} <\\d+\\.0\\.0$",
|
|
93
|
+
"description": "RFC 0177 §A.1 — explicit upper bound required."
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
"dependencies": {
|
|
98
|
+
"type": "object",
|
|
99
|
+
"additionalProperties": {
|
|
100
|
+
"type": "string"
|
|
101
|
+
},
|
|
102
|
+
"description": "Other node packs this pack depends on. Map of pack name → semver range. Engine resolves transitively at workflow-register time."
|
|
103
|
+
},
|
|
104
|
+
"peerDependencies": {
|
|
105
|
+
"type": "object",
|
|
106
|
+
"additionalProperties": {
|
|
107
|
+
"type": "string"
|
|
108
|
+
},
|
|
109
|
+
"description": "Engine-supplied capabilities the pack consumes (e.g., a particular AI provider extension). Resolved against `Capabilities` at register time. Each entry is REQUIRED by default — an unmet entry fails install with `pack_peer_dependency_missing` — unless marked optional in `peerDependenciesMeta` (RFC 0072 §C)."
|
|
110
|
+
},
|
|
111
|
+
"peerDependenciesMeta": {
|
|
112
|
+
"type": "object",
|
|
113
|
+
"description": "Per-peer-dependency metadata (RFC 0072 §C). Keys mirror `peerDependencies` keys. Marking an entry `optional: true` makes it degrade-if-unmet instead of refuse-if-unmet: a host that does not satisfy it MUST install the pack with that capability inert AND surface it in the affected agents' inventory `degraded[]` (RFC 0072 §A); it MUST NOT silently ignore the declared dependency. Default (absent entry) is required. Packs published before RFC 0072 validate unchanged.",
|
|
114
|
+
"additionalProperties": {
|
|
115
|
+
"type": "object",
|
|
116
|
+
"additionalProperties": false,
|
|
117
|
+
"properties": {
|
|
118
|
+
"optional": {
|
|
119
|
+
"type": "boolean",
|
|
120
|
+
"default": false,
|
|
121
|
+
"description": "When true, an unmet peer dependency degrades (inert + surfaced in `degraded[]`) rather than failing install."
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
"nodes": {
|
|
127
|
+
"type": "array",
|
|
128
|
+
"items": {
|
|
129
|
+
"$ref": "#/$defs/PackNode"
|
|
130
|
+
},
|
|
131
|
+
"description": "Node typeIds the pack contributes. Each MUST have a unique `typeId` within the pack. A pack MAY omit `nodes` entirely if it ships only `agents[]` — the top-level `anyOf` constraint requires at least one of `nodes` or `agents` to be non-empty."
|
|
132
|
+
},
|
|
133
|
+
"agents": {
|
|
134
|
+
"type": "array",
|
|
135
|
+
"items": {
|
|
136
|
+
"$ref": "agent-manifest.schema.json"
|
|
137
|
+
},
|
|
138
|
+
"description": "Optional agent manifests shipped alongside this pack. Each entry is an AgentManifest (see agent-manifest.schema.json + RFC 0003 §`agents[]` extension). Pure-agent packs MUST set `runtime.language: 'remote'` — agents are interpreted by the host, not bundled as executable artifacts. Mixed packs (nodes + agents) declare the runtime that loads the node implementations; agents remain host-interpreted."
|
|
139
|
+
},
|
|
140
|
+
"runtime": {
|
|
141
|
+
"$ref": "#/$defs/Runtime"
|
|
142
|
+
},
|
|
143
|
+
"signing": {
|
|
144
|
+
"$ref": "#/$defs/Signing"
|
|
145
|
+
},
|
|
146
|
+
"connector": {
|
|
147
|
+
"$ref": "#/$defs/Connector"
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"additionalProperties": false,
|
|
151
|
+
"$defs": {
|
|
152
|
+
"PackNode": {
|
|
153
|
+
"type": "object",
|
|
154
|
+
"required": [
|
|
155
|
+
"typeId",
|
|
156
|
+
"version",
|
|
157
|
+
"category",
|
|
158
|
+
"role"
|
|
159
|
+
],
|
|
160
|
+
"properties": {
|
|
161
|
+
"typeId": {
|
|
162
|
+
"type": "string",
|
|
163
|
+
"description": "Canonical node type ID. MUST match the same pattern as `WorkflowNode.typeId` in workflow-definition.schema.json. The pack's `name` prefix is recommended (e.g., a pack `vendor.acme.salesforce-tools` exposing `vendor.acme.salesforce.upsert`).",
|
|
164
|
+
"pattern": "^[a-z][a-zA-Z0-9._-]*$",
|
|
165
|
+
"minLength": 1,
|
|
166
|
+
"maxLength": 256
|
|
167
|
+
},
|
|
168
|
+
"version": {
|
|
169
|
+
"type": "string",
|
|
170
|
+
"description": "Per-node semver. MAY differ from the pack's overall version — useful when a single pack ships multiple nodes that evolve independently."
|
|
171
|
+
},
|
|
172
|
+
"label": {
|
|
173
|
+
"type": "string",
|
|
174
|
+
"minLength": 1
|
|
175
|
+
},
|
|
176
|
+
"description": {
|
|
177
|
+
"type": "string"
|
|
178
|
+
},
|
|
179
|
+
"category": {
|
|
180
|
+
"type": "string",
|
|
181
|
+
"enum": [
|
|
182
|
+
"chat",
|
|
183
|
+
"control",
|
|
184
|
+
"data",
|
|
185
|
+
"canvas",
|
|
186
|
+
"coordination",
|
|
187
|
+
"integration"
|
|
188
|
+
],
|
|
189
|
+
"description": "Engine-side classification used for scheduling and UI grouping."
|
|
190
|
+
},
|
|
191
|
+
"role": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"description": "Semantic role from the `NodeRole` taxonomy. Drives engine scheduling. Common values: `pure`, `side-effect`, `human-input`, `streaming-output`, `gate`."
|
|
194
|
+
},
|
|
195
|
+
"capabilities": {
|
|
196
|
+
"type": "array",
|
|
197
|
+
"items": {
|
|
198
|
+
"type": "string",
|
|
199
|
+
"enum": [
|
|
200
|
+
"streamable",
|
|
201
|
+
"cacheable",
|
|
202
|
+
"side-effectful",
|
|
203
|
+
"mcp-exportable"
|
|
204
|
+
]
|
|
205
|
+
},
|
|
206
|
+
"uniqueItems": true,
|
|
207
|
+
"description": "Orthogonal capability traits. The engine uses these to decide caching, MCP exposure, idempotency enforcement."
|
|
208
|
+
},
|
|
209
|
+
"configSchemaRef": {
|
|
210
|
+
"type": "string",
|
|
211
|
+
"description": "Path inside the pack tarball to the JSON Schema for the node's config. Server fetches the file when resolving the pack."
|
|
212
|
+
},
|
|
213
|
+
"inputSchemaRef": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"description": "Path to the JSON Schema for the node's input ports."
|
|
216
|
+
},
|
|
217
|
+
"outputSchemaRef": {
|
|
218
|
+
"type": "string",
|
|
219
|
+
"description": "Path to the JSON Schema for the node's output ports."
|
|
220
|
+
},
|
|
221
|
+
"outputs": {
|
|
222
|
+
"type": "object",
|
|
223
|
+
"additionalProperties": {
|
|
224
|
+
"type": "object",
|
|
225
|
+
"properties": {
|
|
226
|
+
"sensitive": {
|
|
227
|
+
"type": "boolean",
|
|
228
|
+
"default": false,
|
|
229
|
+
"description": "When true, the engine masks this output port's value in `node.completed` event payloads. Use when a NodeModule ALWAYS handles sensitive data (e.g., a Salesforce upsert always touches PII). Workflows MAY override per-instance via `WorkflowNode.outputSensitivity`. See observability.md §Privacy classification (closes O5)."
|
|
230
|
+
}
|
|
231
|
+
},
|
|
232
|
+
"additionalProperties": false
|
|
233
|
+
},
|
|
234
|
+
"description": "Per-output-port metadata. Keys are output port names; values are per-port markers. Currently the only marker is `sensitive`; future additions live alongside (additionalProperties: true on each port)."
|
|
235
|
+
},
|
|
236
|
+
"envelopeContractRef": {
|
|
237
|
+
"type": "string",
|
|
238
|
+
"description": "Optional path to a JSON document declaring the LLM envelope contract for AI-backed nodes."
|
|
239
|
+
},
|
|
240
|
+
"artifact": {
|
|
241
|
+
"type": "object",
|
|
242
|
+
"properties": {
|
|
243
|
+
"typeId": {
|
|
244
|
+
"type": "string"
|
|
245
|
+
},
|
|
246
|
+
"syncOn": {
|
|
247
|
+
"type": "string",
|
|
248
|
+
"enum": [
|
|
249
|
+
"completion",
|
|
250
|
+
"approval",
|
|
251
|
+
"manual"
|
|
252
|
+
]
|
|
253
|
+
},
|
|
254
|
+
"supportsCheckpoint": {
|
|
255
|
+
"type": "boolean"
|
|
256
|
+
}
|
|
257
|
+
},
|
|
258
|
+
"additionalProperties": false
|
|
259
|
+
},
|
|
260
|
+
"mcp": {
|
|
261
|
+
"type": "object",
|
|
262
|
+
"properties": {
|
|
263
|
+
"exposeAsTool": {
|
|
264
|
+
"type": "boolean"
|
|
265
|
+
},
|
|
266
|
+
"toolName": {
|
|
267
|
+
"type": "string"
|
|
268
|
+
}
|
|
269
|
+
},
|
|
270
|
+
"additionalProperties": false
|
|
271
|
+
},
|
|
272
|
+
"requiresSecrets": {
|
|
273
|
+
"type": "array",
|
|
274
|
+
"items": {
|
|
275
|
+
"$ref": "#/$defs/SecretRequirement"
|
|
276
|
+
},
|
|
277
|
+
"description": "Secrets the node needs to execute. Resolved by the host's secret-resolution adapter at dispatch time. Hosts that don't advertise `Capabilities.secrets.supported` MUST refuse to dispatch a node with non-empty `requiresSecrets` and return `credential_unavailable`."
|
|
278
|
+
},
|
|
279
|
+
"requiredCredentials": {
|
|
280
|
+
"type": "array",
|
|
281
|
+
"items": {
|
|
282
|
+
"$ref": "#/$defs/CredentialRequirement"
|
|
283
|
+
},
|
|
284
|
+
"description": "RFC 0046. Credentials the node needs, resolved by the host's `host.credentials` resolver at dispatch time (distinct from `requiresSecrets`, which targets the informal BYOK annex). Hosts that don't advertise `Capabilities.credentials.supported` MUST refuse to dispatch a node with non-empty `requiredCredentials` and return `credential_unavailable` (peerDependency `credentials: 'supported'`)."
|
|
285
|
+
},
|
|
286
|
+
"auth": {
|
|
287
|
+
"$ref": "#/$defs/NodeAuth",
|
|
288
|
+
"description": "RFC 0047. The node's third-party authentication need. The host acquires + refreshes the token via the `host.oauth` flow and resolves it into the node sandbox as a bearer token. Hosts that don't advertise `Capabilities.oauth.supported` (or lack the named provider/scope) MUST refuse to register the pack (`oauth_provider_unsupported` / `oauth_scope_unsupported`)."
|
|
289
|
+
},
|
|
290
|
+
"requiredModelCapabilities": {
|
|
291
|
+
"type": "array",
|
|
292
|
+
"items": {
|
|
293
|
+
"type": "string",
|
|
294
|
+
"pattern": "^([a-z][a-z0-9-]*|x-host-[a-z][a-z0-9-]*-[a-z][a-z0-9-]*)$"
|
|
295
|
+
},
|
|
296
|
+
"uniqueItems": true,
|
|
297
|
+
"maxItems": 32,
|
|
298
|
+
"description": "RFC 0031 §B. Model capabilities this NodeModule requires the active model to advertise in `capabilities.modelCapabilities.advertised[]`. Distinct from `requires`, which gates on HOST capabilities (`capabilities.runtimeCapabilities[]`) — this field gates on MODEL capabilities. Spec-reserved identifiers: `structured-output`, `discriminator-enum`, `long-context`, `reasoning` (model-native thinking-tokens), `function-calling`. Host-private extensions MUST prefix with `x-host-<host>-` per `host-extensions.md` §\"Canonical-prefix table\". Empty array (or absent field) means no model-capability requirements. When the active model does not satisfy the declared set, the host MUST follow the dispatch flow in RFC 0031 §B: substitute to `fallbackModel` (emit `model.capability.substituted`) or refuse (emit `model.capability.insufficient` + terminate with `capability_not_provided`)."
|
|
299
|
+
},
|
|
300
|
+
"fallbackModel": {
|
|
301
|
+
"type": "object",
|
|
302
|
+
"additionalProperties": false,
|
|
303
|
+
"required": [
|
|
304
|
+
"provider",
|
|
305
|
+
"model"
|
|
306
|
+
],
|
|
307
|
+
"description": "RFC 0031 §B. Substitute model coordinates the host MAY use if the active model lacks the declared `requiredModelCapabilities`. When the host substitutes, it MUST emit `model.capability.substituted` per RFC 0031 §D. Absent means no substitution permitted; the host MUST refuse to dispatch with `capability_not_provided` when capabilities are unmet. The fallback is single-shot — if the fallback itself fails capability checks or authentication, the host emits `model.capability.insufficient` with `fallbackAttempted: true` and refuses (no recursive fallback chains per RFC 0031 §\"Unresolved questions\" #3).",
|
|
308
|
+
"properties": {
|
|
309
|
+
"provider": {
|
|
310
|
+
"type": "string",
|
|
311
|
+
"pattern": "^[a-z][a-z0-9-]*$",
|
|
312
|
+
"description": "Provider id per `capabilities.aiProviders.supported` (e.g., `anthropic`, `openai`, `gemini`). MUST be in the host's `capabilities.aiProviders.supported[]` for the substitution to fire; otherwise the host emits `model.capability.insufficient` with `fallbackAttempted: true`."
|
|
313
|
+
},
|
|
314
|
+
"model": {
|
|
315
|
+
"type": "string",
|
|
316
|
+
"minLength": 1,
|
|
317
|
+
"description": "Provider-stamped model id (e.g., `claude-opus-4-7`, `gpt-5`, `gemini-2.5-pro`)."
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
},
|
|
322
|
+
"additionalProperties": false,
|
|
323
|
+
"patternProperties": {
|
|
324
|
+
"^(openwop-|x-|vendor\\.)": {
|
|
325
|
+
"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."
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
"SecretRequirement": {
|
|
330
|
+
"type": "object",
|
|
331
|
+
"required": [
|
|
332
|
+
"id",
|
|
333
|
+
"kind"
|
|
334
|
+
],
|
|
335
|
+
"description": "Declared secret requirement. The engine surfaces this to the host's `SecretResolver` which returns an opaque `ResolvedSecret` reference; the executor passes the reference to provider adapters that dereference internally. Raw key material NEVER reaches the protocol surface (events, logs, traces, etc.).",
|
|
336
|
+
"properties": {
|
|
337
|
+
"id": {
|
|
338
|
+
"type": "string",
|
|
339
|
+
"minLength": 1,
|
|
340
|
+
"description": "Stable identifier the node executor uses to look up the resolved secret (e.g., `'primary-anthropic-key'`)."
|
|
341
|
+
},
|
|
342
|
+
"kind": {
|
|
343
|
+
"type": "string",
|
|
344
|
+
"enum": [
|
|
345
|
+
"ai-provider",
|
|
346
|
+
"api-key",
|
|
347
|
+
"oauth-token",
|
|
348
|
+
"custom"
|
|
349
|
+
],
|
|
350
|
+
"description": "Coarse classification driving host-side resolution policy. `ai-provider` triggers the BYOK / aiProviders flow; `api-key` is generic; `oauth-token` integrates with the host's OAuth refresh flow; `custom` is host-extensible."
|
|
351
|
+
},
|
|
352
|
+
"provider": {
|
|
353
|
+
"type": "string",
|
|
354
|
+
"description": "For `kind: 'ai-provider'`, the provider id (`anthropic`, `openai`, `gemini`, etc.). MUST be in `Capabilities.aiProviders.supported`. Optional for other kinds."
|
|
355
|
+
},
|
|
356
|
+
"scope": {
|
|
357
|
+
"type": "string",
|
|
358
|
+
"enum": [
|
|
359
|
+
"tenant",
|
|
360
|
+
"user",
|
|
361
|
+
"run"
|
|
362
|
+
],
|
|
363
|
+
"description": "Where the host should look up the secret. MUST match a scope in `Capabilities.secrets.scopes`. Defaults to `tenant` when omitted."
|
|
364
|
+
}
|
|
365
|
+
},
|
|
366
|
+
"additionalProperties": false
|
|
367
|
+
},
|
|
368
|
+
"CredentialRequirement": {
|
|
369
|
+
"type": "object",
|
|
370
|
+
"required": [
|
|
371
|
+
"key"
|
|
372
|
+
],
|
|
373
|
+
"description": "RFC 0046. A credential the node needs, resolved by the host's `host.credentials` resolver into the node sandbox at dispatch time. The node declares only the requirement; raw key material NEVER reaches the protocol surface (events, logs, traces, replay) per the `credential-payload-redaction` invariant.",
|
|
374
|
+
"properties": {
|
|
375
|
+
"key": {
|
|
376
|
+
"type": "string",
|
|
377
|
+
"minLength": 1,
|
|
378
|
+
"description": "Stable identifier the node executor uses to look up the resolved credential (e.g., `'slack-bot-token'`)."
|
|
379
|
+
},
|
|
380
|
+
"scope": {
|
|
381
|
+
"type": "string",
|
|
382
|
+
"enum": [
|
|
383
|
+
"user",
|
|
384
|
+
"workspace",
|
|
385
|
+
"tenant"
|
|
386
|
+
],
|
|
387
|
+
"description": "Resolution scope. MUST match a scope in `Capabilities.credentials.scopes`. Defaults to the host's default scope when omitted."
|
|
388
|
+
},
|
|
389
|
+
"displayName": {
|
|
390
|
+
"type": "string",
|
|
391
|
+
"description": "Optional human-readable label for credential-management UIs."
|
|
392
|
+
}
|
|
393
|
+
},
|
|
394
|
+
"additionalProperties": false
|
|
395
|
+
},
|
|
396
|
+
"NodeAuth": {
|
|
397
|
+
"type": "object",
|
|
398
|
+
"required": [
|
|
399
|
+
"type",
|
|
400
|
+
"provider"
|
|
401
|
+
],
|
|
402
|
+
"description": "RFC 0047. A node's third-party authentication declaration. The node declares only which provider + scopes it needs; the host performs the OAuth dance and resolves the token in-sandbox. Raw token material NEVER reaches the protocol surface (`credential-payload-redaction` invariant).",
|
|
403
|
+
"properties": {
|
|
404
|
+
"type": {
|
|
405
|
+
"type": "string",
|
|
406
|
+
"enum": [
|
|
407
|
+
"oauth2"
|
|
408
|
+
],
|
|
409
|
+
"description": "Authentication mechanism. `oauth2` routes through the `host.oauth` flow."
|
|
410
|
+
},
|
|
411
|
+
"provider": {
|
|
412
|
+
"type": "string",
|
|
413
|
+
"minLength": 1,
|
|
414
|
+
"description": "Provider id; MUST match an advertised `capabilities.oauth.providers[].id` (e.g. `slack`, `google`)."
|
|
415
|
+
},
|
|
416
|
+
"scopes": {
|
|
417
|
+
"type": "array",
|
|
418
|
+
"items": {
|
|
419
|
+
"type": "string"
|
|
420
|
+
},
|
|
421
|
+
"description": "OAuth scopes the node requires; each MUST be in the provider's advertised `scopesSupported`."
|
|
422
|
+
}
|
|
423
|
+
},
|
|
424
|
+
"additionalProperties": false
|
|
425
|
+
},
|
|
426
|
+
"ConnectorAuth": {
|
|
427
|
+
"description": "RFC 0045. The auth declaration shared by a connector's actions. Either an RFC 0047 OAuth2 declaration or an RFC 0046 stored-credential reference.",
|
|
428
|
+
"oneOf": [
|
|
429
|
+
{
|
|
430
|
+
"$ref": "#/$defs/NodeAuth"
|
|
431
|
+
},
|
|
432
|
+
{
|
|
433
|
+
"type": "object",
|
|
434
|
+
"required": [
|
|
435
|
+
"type",
|
|
436
|
+
"key"
|
|
437
|
+
],
|
|
438
|
+
"properties": {
|
|
439
|
+
"type": {
|
|
440
|
+
"type": "string",
|
|
441
|
+
"enum": [
|
|
442
|
+
"credential"
|
|
443
|
+
],
|
|
444
|
+
"description": "Static stored-credential auth via the RFC 0046 host.credentials resolver."
|
|
445
|
+
},
|
|
446
|
+
"key": {
|
|
447
|
+
"type": "string",
|
|
448
|
+
"minLength": 1,
|
|
449
|
+
"description": "CredentialRequirement key the host resolves into the node sandbox."
|
|
450
|
+
},
|
|
451
|
+
"scope": {
|
|
452
|
+
"type": "string",
|
|
453
|
+
"enum": [
|
|
454
|
+
"user",
|
|
455
|
+
"workspace",
|
|
456
|
+
"tenant"
|
|
457
|
+
],
|
|
458
|
+
"description": "Resolution scope; MUST match a scope in `capabilities.credentials.scopes`."
|
|
459
|
+
}
|
|
460
|
+
},
|
|
461
|
+
"additionalProperties": false
|
|
462
|
+
}
|
|
463
|
+
]
|
|
464
|
+
},
|
|
465
|
+
"Connector": {
|
|
466
|
+
"type": "object",
|
|
467
|
+
"required": [
|
|
468
|
+
"id",
|
|
469
|
+
"displayName"
|
|
470
|
+
],
|
|
471
|
+
"description": "RFC 0045. Declares this pack a named connector — a typed integration exposing actions (and reusing the existing trigger model). Optional; packs without it remain plain node packs. Actions are normal side-effectful nodes from this pack's `nodes[]` annotated with scheduler hints; the connector block adds metadata, not a new execution kind.",
|
|
472
|
+
"properties": {
|
|
473
|
+
"id": {
|
|
474
|
+
"type": "string",
|
|
475
|
+
"pattern": "^[a-z][a-z0-9.-]*$",
|
|
476
|
+
"description": "Stable connector id, e.g. `salesforce`."
|
|
477
|
+
},
|
|
478
|
+
"displayName": {
|
|
479
|
+
"type": "string",
|
|
480
|
+
"minLength": 1
|
|
481
|
+
},
|
|
482
|
+
"auth": {
|
|
483
|
+
"$ref": "#/$defs/ConnectorAuth",
|
|
484
|
+
"description": "RFC 0047/0046 auth declaration shared by the connector's actions."
|
|
485
|
+
},
|
|
486
|
+
"actions": {
|
|
487
|
+
"type": "array",
|
|
488
|
+
"description": "Typed actions the connector exposes. Each `typeId` MUST resolve to a node typeId defined in this pack's `nodes[]` (validation error `connector_action_unresolved` otherwise).",
|
|
489
|
+
"items": {
|
|
490
|
+
"type": "object",
|
|
491
|
+
"required": [
|
|
492
|
+
"typeId",
|
|
493
|
+
"displayName"
|
|
494
|
+
],
|
|
495
|
+
"properties": {
|
|
496
|
+
"typeId": {
|
|
497
|
+
"type": "string",
|
|
498
|
+
"minLength": 1,
|
|
499
|
+
"description": "MUST match a `nodes[].typeId` in this manifest."
|
|
500
|
+
},
|
|
501
|
+
"displayName": {
|
|
502
|
+
"type": "string",
|
|
503
|
+
"minLength": 1
|
|
504
|
+
},
|
|
505
|
+
"idempotent": {
|
|
506
|
+
"type": "boolean",
|
|
507
|
+
"description": "Action is safe to auto-retry without an idempotency key. Absent/false ⇒ the host MUST NOT auto-retry without one (composes with idempotency.md)."
|
|
508
|
+
},
|
|
509
|
+
"rateLimit": {
|
|
510
|
+
"type": "object",
|
|
511
|
+
"properties": {
|
|
512
|
+
"requests": {
|
|
513
|
+
"type": "integer",
|
|
514
|
+
"minimum": 1
|
|
515
|
+
},
|
|
516
|
+
"perSeconds": {
|
|
517
|
+
"type": "integer",
|
|
518
|
+
"minimum": 1
|
|
519
|
+
}
|
|
520
|
+
},
|
|
521
|
+
"additionalProperties": false,
|
|
522
|
+
"description": "Advertised rate-limit hint the host scheduler SHOULD honor. Does not change the node's wire shape."
|
|
523
|
+
},
|
|
524
|
+
"paginated": {
|
|
525
|
+
"type": "boolean",
|
|
526
|
+
"description": "Action returns paginated results."
|
|
527
|
+
}
|
|
528
|
+
},
|
|
529
|
+
"additionalProperties": false
|
|
530
|
+
}
|
|
531
|
+
},
|
|
532
|
+
"triggers": {
|
|
533
|
+
"type": "array",
|
|
534
|
+
"items": {
|
|
535
|
+
"type": "string",
|
|
536
|
+
"minLength": 1
|
|
537
|
+
},
|
|
538
|
+
"description": "typeIds of triggers (from the existing trigger model) this connector exposes. Each MUST resolve to a node/trigger typeId in this pack."
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
"additionalProperties": false
|
|
542
|
+
},
|
|
543
|
+
"Runtime": {
|
|
544
|
+
"type": "object",
|
|
545
|
+
"required": [
|
|
546
|
+
"language",
|
|
547
|
+
"entry"
|
|
548
|
+
],
|
|
549
|
+
"properties": {
|
|
550
|
+
"language": {
|
|
551
|
+
"type": "string",
|
|
552
|
+
"enum": [
|
|
553
|
+
"javascript",
|
|
554
|
+
"python",
|
|
555
|
+
"go",
|
|
556
|
+
"wasm",
|
|
557
|
+
"wasm-component",
|
|
558
|
+
"remote"
|
|
559
|
+
],
|
|
560
|
+
"description": "How the engine loads the pack. See node-packs.md §runtime formats. `wasm` is the core-module WASM ABI (RFC 0008). `wasm-component` is the WASM Component Model variant (WIT-defined interfaces); hosts that advertise `capabilities.nodePackRuntimes.wasmComponent.supported: true` load it via wasmtime / wasmer Component Model runtimes. Both share the openwop ABI envelope; the wasm-component variant uses WIT interfaces instead of hand-rolled imports/exports."
|
|
561
|
+
},
|
|
562
|
+
"entry": {
|
|
563
|
+
"type": "string",
|
|
564
|
+
"description": "Path inside the tarball to the runtime artifact, OR a URL when `language: remote`."
|
|
565
|
+
},
|
|
566
|
+
"format": {
|
|
567
|
+
"type": "string",
|
|
568
|
+
"enum": [
|
|
569
|
+
"esm",
|
|
570
|
+
"cjs",
|
|
571
|
+
"wheel",
|
|
572
|
+
"binary",
|
|
573
|
+
"shared-library",
|
|
574
|
+
"wasm",
|
|
575
|
+
"wasm-component"
|
|
576
|
+
],
|
|
577
|
+
"description": "Runtime-specific format hint. `esm`/`cjs` for JS, `wheel` for Python, `binary`/`shared-library` for Go, `wasm` for core-module WASM (RFC 0008), `wasm-component` for WASM Component Model preview 3+ (WIT-defined interfaces, additive RFC 0008.1)."
|
|
578
|
+
},
|
|
579
|
+
"minRuntimeVersion": {
|
|
580
|
+
"type": "string",
|
|
581
|
+
"description": "Minimum host runtime version (e.g., `node>=20`, `python>=3.10`, `go>=1.22`)."
|
|
582
|
+
},
|
|
583
|
+
"requires": {
|
|
584
|
+
"type": "array",
|
|
585
|
+
"uniqueItems": true,
|
|
586
|
+
"description": "RFC 0076. Abstract platform primitives the pack's runtime code exercises, for install-time sandbox gating. Runtime-agnostic (not language builtin names). Absent or [] ⇒ no elevated platform needs. A sandbox host MUST evaluate this at install time and refuse (`pack_runtime_requirement_unmet`) any primitive it will not grant; see node-packs.md §\"Runtime platform requirements\".",
|
|
587
|
+
"items": {
|
|
588
|
+
"oneOf": [
|
|
589
|
+
{
|
|
590
|
+
"const": "net.dns",
|
|
591
|
+
"description": "Resolves hostnames (e.g., SSRF pre-flight)."
|
|
592
|
+
},
|
|
593
|
+
{
|
|
594
|
+
"const": "net.outbound",
|
|
595
|
+
"description": "Opens outbound network connections / fetch."
|
|
596
|
+
},
|
|
597
|
+
{
|
|
598
|
+
"const": "crypto",
|
|
599
|
+
"description": "Primitives beyond the standard hashing the host already provides."
|
|
600
|
+
},
|
|
601
|
+
{
|
|
602
|
+
"const": "subprocess",
|
|
603
|
+
"description": "Spawns a child process (composes with the RFC 0069 exec-class contract when the host advertises it)."
|
|
604
|
+
},
|
|
605
|
+
{
|
|
606
|
+
"const": "fs.read",
|
|
607
|
+
"description": "Reads the local filesystem."
|
|
608
|
+
},
|
|
609
|
+
{
|
|
610
|
+
"const": "fs.write",
|
|
611
|
+
"description": "Writes the local filesystem."
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"const": "env.read",
|
|
615
|
+
"description": "Reads the process environment (may expose deployment secrets if the host does not scrub it)."
|
|
616
|
+
},
|
|
617
|
+
{
|
|
618
|
+
"const": "clock",
|
|
619
|
+
"description": "Reads wall-clock time as a behavioral input — gated for REPLAY determinism, not access control. A pack that branches on the clock is non-deterministic on replay (replay.md)."
|
|
620
|
+
}
|
|
621
|
+
]
|
|
622
|
+
}
|
|
623
|
+
}
|
|
624
|
+
},
|
|
625
|
+
"additionalProperties": false
|
|
626
|
+
},
|
|
627
|
+
"Signing": {
|
|
628
|
+
"type": "object",
|
|
629
|
+
"description": "Optional signing metadata. See node-packs.md §signing.",
|
|
630
|
+
"properties": {
|
|
631
|
+
"publicKeyRef": {
|
|
632
|
+
"type": "string",
|
|
633
|
+
"description": "Path inside the tarball to the Ed25519 public key (PEM-encoded)."
|
|
634
|
+
},
|
|
635
|
+
"signatureRef": {
|
|
636
|
+
"type": "string",
|
|
637
|
+
"description": "Path to the detached signature over `pack.json`."
|
|
638
|
+
},
|
|
639
|
+
"method": {
|
|
640
|
+
"type": "string",
|
|
641
|
+
"enum": [
|
|
642
|
+
"manual",
|
|
643
|
+
"sigstore"
|
|
644
|
+
],
|
|
645
|
+
"description": "Signing method. `manual` uses publicKeyRef + signatureRef; `sigstore` uses a Sigstore bundle at `pack.json.sigstore`."
|
|
646
|
+
}
|
|
647
|
+
},
|
|
648
|
+
"additionalProperties": false
|
|
649
|
+
}
|
|
650
|
+
},
|
|
651
|
+
"patternProperties": {
|
|
652
|
+
"^(openwop-|x-|vendor\\.)": {
|
|
653
|
+
"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."
|
|
654
|
+
}
|
|
655
|
+
},
|
|
656
|
+
"x-openwop-anyOf-note": "constraint fragments (kind-conditional requirements) — closure is the root's"
|
|
657
|
+
}
|