@openwop/spec-artifacts 2.42.5 → 2.42.7
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 +64 -63
- package/api/seams-v2.yaml +238 -316
- package/api/v2/asyncapi.yaml +83 -113
- package/api/v2/openapi.yaml +339 -724
- package/package.json +1 -1
- package/schemas/audit-verify-result.schema.json +2 -2
- package/schemas/v2/audit-verify-result.schema.json +2 -2
- package/schemas/v2/capabilities.schema.json +2 -5
- package/spec/v1/core-standard-manifest.json +2 -2
- package/spec/v1/gaps.json +171 -1
- package/spec/v2/README.md +34 -36
- package/spec/v2/core/capabilities.md +186 -119
- package/spec/v2/core/conformance.md +78 -27
- package/spec/v2/core/connection-packs.md +8 -3
- package/spec/v2/core/conversation.md +10 -4
- package/spec/v2/core/errors.md +30 -9
- package/spec/v2/core/events.md +116 -80
- package/spec/v2/core/form-content-packs.md +11 -13
- package/spec/v2/core/headers.md +22 -14
- package/spec/v2/core/host-services.md +22 -5
- package/spec/v2/core/idempotency.md +48 -36
- package/spec/v2/core/identity.md +110 -42
- package/spec/v2/core/interop.md +82 -21
- package/spec/v2/core/interrupt.md +79 -40
- package/spec/v2/core/node-pack-runtimes.md +18 -4
- package/spec/v2/core/oauth.md +40 -6
- package/spec/v2/core/overview.md +61 -33
- package/spec/v2/core/packs.md +53 -28
- package/spec/v2/core/persistence.md +61 -80
- package/spec/v2/core/replay.md +56 -42
- package/spec/v2/core/runs.md +198 -60
- package/spec/v2/core/security-defaults.md +57 -33
- package/spec/v2/core/tool-catalog.md +29 -6
- package/spec/v2/core/versioning.md +95 -49
- package/spec/v2/core/webhooks.md +59 -20
- package/spec/v2/core/workflow-chain-packs.md +16 -14
- package/spec/v2/corrections.json +17 -1
- package/spec/v2/corrections.schema.json +1 -1
- package/spec/v2/declaration.json +24 -7
- package/spec/v2/declaration.schema.json +10 -0
- package/spec/v2/errors.json +109 -2
- package/spec/v2/errors.schema.json +38 -0
- package/spec/v2/ext/README.md +36 -23
- package/spec/v2/ext/a2uiSurface/README.md +75 -89
- package/spec/v2/ext/brand/README.md +15 -15
- package/spec/v2/ext/canvas/README.md +15 -15
- package/spec/v2/ext/chat/README.md +15 -15
- package/spec/v2/ext/coordination/README.md +15 -15
- package/spec/v2/ext/dataIntegration/README.md +17 -20
- package/spec/v2/ext/entities/README.md +15 -15
- package/spec/v2/ext/grpc-transport/README.md +6 -8
- package/spec/v2/ext/kanban/README.md +15 -15
- package/spec/v2/ext/knowledge/README.md +15 -15
- package/spec/v2/ext/launchStudio/README.md +16 -16
- package/spec/v2/ext/messaging/README.md +15 -15
- package/spec/v2/ext/portability/README.md +3 -17
- package/spec/v2/ext/provider-idempotency/README.md +7 -10
- package/spec/v2/ext/restTransport/README.md +30 -19
- package/spec/v2/ext/sandbox-runtime-notes/README.md +7 -9
- package/spec/v2/ext/webResearch/README.md +16 -16
- package/spec/v2/profiles.json +6 -2
- package/spec/v2/release.json +2 -2
- package/spec/v2/surface-baseline.json +542 -2
package/api/seams-v2.yaml
CHANGED
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
openapi: 3.1.0
|
|
2
2
|
info:
|
|
3
3
|
title: OpenWOP conformance seams profile (openwop-conformance-seams-v2)
|
|
4
|
-
version: 2.42.
|
|
5
|
-
description: '
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
version: 2.42.7
|
|
5
|
+
description: 'The OpenWOP conformance seams profile (`openwop-conformance-seams-v2`): test-only operations in their own
|
|
6
|
+
path space, `/conformance/seams/…`. The profile is versioned and validated against the canonical v2 schemas with no tolerance
|
|
7
|
+
path. It is not a capability: a host advertises the profile, never a `testSeams` flag.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
Generated from `api/openapi.yaml` by `scripts/derive-v2-api.py`; do not edit.'
|
|
10
11
|
servers:
|
|
11
12
|
- url: https://{host}
|
|
12
|
-
description:
|
|
13
|
+
description: An OpenWOP server.
|
|
13
14
|
variables:
|
|
14
15
|
host:
|
|
15
16
|
default: api.example.com
|
|
@@ -19,18 +20,10 @@ paths:
|
|
|
19
20
|
get:
|
|
20
21
|
tags:
|
|
21
22
|
- host
|
|
22
|
-
summary: Read the persisted durable A2A task projection (
|
|
23
|
-
description: 'Returns the persisted `A2ATaskState` for `taskId` (
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
durable projection that survives caller disconnect. The normative A2A
|
|
28
|
-
|
|
29
|
-
read surface remains the A2A `tasks/get` JSON-RPC method. Hosts that do
|
|
30
|
-
|
|
31
|
-
not advertise `capabilities.a2a.durableTasks` return `501`.
|
|
32
|
-
|
|
33
|
-
'
|
|
23
|
+
summary: Read the persisted durable A2A task projection (host extension).
|
|
24
|
+
description: 'Returns the persisted `A2ATaskState` for `taskId` (equal to the backing `runId`): a host-extension convenience
|
|
25
|
+
read of the durable projection, which survives caller disconnect. The normative A2A read surface remains the A2A `tasks/get`
|
|
26
|
+
JSON-RPC method. Hosts that do not advertise `capabilities.a2a.durableTasks` return `501`.'
|
|
34
27
|
operationId: getA2ATaskState
|
|
35
28
|
security:
|
|
36
29
|
- ApiKeyAuth:
|
|
@@ -61,7 +54,7 @@ paths:
|
|
|
61
54
|
'404':
|
|
62
55
|
$ref: '#/components/responses/NotFound'
|
|
63
56
|
'501':
|
|
64
|
-
description: Host does not advertise capabilities.a2a.durableTasks
|
|
57
|
+
description: Host does not advertise `capabilities.a2a.durableTasks`.
|
|
65
58
|
content:
|
|
66
59
|
application/json:
|
|
67
60
|
schema:
|
|
@@ -70,14 +63,9 @@ paths:
|
|
|
70
63
|
get:
|
|
71
64
|
tags:
|
|
72
65
|
- host
|
|
73
|
-
summary: List workspace file metadata for the caller's tenant·workspace
|
|
74
|
-
description:
|
|
75
|
-
|
|
76
|
-
workspace}` per RFC 0059 §C. Optional `?prefix=` filters the flat
|
|
77
|
-
|
|
78
|
-
`path` namespace to entries starting with the given prefix.
|
|
79
|
-
|
|
80
|
-
'
|
|
66
|
+
summary: List workspace file metadata for the caller's tenant·workspace.
|
|
67
|
+
description: Returns file metadata, without bodies, for the caller's `{tenant, workspace}`. An optional `?prefix=` filters
|
|
68
|
+
the flat `path` namespace to entries starting with that prefix.
|
|
81
69
|
operationId: listWorkspaceFiles
|
|
82
70
|
security:
|
|
83
71
|
- ApiKeyAuth:
|
|
@@ -108,7 +96,7 @@ paths:
|
|
|
108
96
|
'403':
|
|
109
97
|
$ref: '#/components/responses/Forbidden'
|
|
110
98
|
'501':
|
|
111
|
-
description: Host does not advertise capabilities.workspace.supported
|
|
99
|
+
description: Host does not advertise `capabilities.workspace.supported`.
|
|
112
100
|
content:
|
|
113
101
|
application/json:
|
|
114
102
|
schema:
|
|
@@ -117,14 +105,9 @@ paths:
|
|
|
117
105
|
get:
|
|
118
106
|
tags:
|
|
119
107
|
- host
|
|
120
|
-
summary: Read one workspace file
|
|
121
|
-
description: 'Returns the `WorkspaceFile` at `path` for the caller''s `{tenant,
|
|
122
|
-
|
|
123
|
-
workspace}`. When `capabilities.workspace.versioned: true`, an
|
|
124
|
-
|
|
125
|
-
optional `?version=N` returns the historical snapshot at version N.
|
|
126
|
-
|
|
127
|
-
'
|
|
108
|
+
summary: Read one workspace file.
|
|
109
|
+
description: 'Returns the `WorkspaceFile` at `path` for the caller''s `{tenant, workspace}`. When `capabilities.workspace.versioned:
|
|
110
|
+
true`, an optional `?version=N` returns the historical snapshot at version N.'
|
|
128
111
|
operationId: getWorkspaceFile
|
|
129
112
|
security:
|
|
130
113
|
- ApiKeyAuth:
|
|
@@ -150,7 +133,7 @@ paths:
|
|
|
150
133
|
'404':
|
|
151
134
|
$ref: '#/components/responses/NotFound'
|
|
152
135
|
'501':
|
|
153
|
-
description: Host does not advertise capabilities.workspace.supported
|
|
136
|
+
description: Host does not advertise `capabilities.workspace.supported`.
|
|
154
137
|
content:
|
|
155
138
|
application/json:
|
|
156
139
|
schema:
|
|
@@ -158,20 +141,11 @@ paths:
|
|
|
158
141
|
put:
|
|
159
142
|
tags:
|
|
160
143
|
- host
|
|
161
|
-
summary:
|
|
162
|
-
description: 'Atomically creates or replaces the file at `path`
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
workspace_conflict` (`details.currentVersion` carries the live
|
|
167
|
-
|
|
168
|
-
version). On success the host bumps `version`, recomputes `etag`,
|
|
169
|
-
|
|
170
|
-
and emits a `workspace.updated` event. A `content` exceeding
|
|
171
|
-
|
|
172
|
-
`capabilities.workspace.maxFileBytes` returns `workspace_too_large`.
|
|
173
|
-
|
|
174
|
-
'
|
|
144
|
+
summary: Atomically create or replace a workspace file.
|
|
145
|
+
description: 'Atomically creates or replaces the file at `path`. MUST honor `If-Match: <etag>`: a stale token returns
|
|
146
|
+
`409 workspace_conflict`, with `details.currentVersion` carrying the live version. On success the host bumps `version`,
|
|
147
|
+
recomputes `etag`, and emits a `workspace.updated` event. A `content` exceeding `capabilities.workspace.maxFileBytes`
|
|
148
|
+
returns `workspace_too_large`.'
|
|
175
149
|
operationId: putWorkspaceFile
|
|
176
150
|
security:
|
|
177
151
|
- ApiKeyAuth:
|
|
@@ -216,7 +190,7 @@ paths:
|
|
|
216
190
|
schema:
|
|
217
191
|
$ref: ../schemas/v2/error-envelope.schema.json
|
|
218
192
|
'501':
|
|
219
|
-
description: Host does not advertise capabilities.workspace.supported
|
|
193
|
+
description: Host does not advertise `capabilities.workspace.supported`.
|
|
220
194
|
content:
|
|
221
195
|
application/json:
|
|
222
196
|
schema:
|
|
@@ -224,12 +198,9 @@ paths:
|
|
|
224
198
|
delete:
|
|
225
199
|
tags:
|
|
226
200
|
- host
|
|
227
|
-
summary: Delete a workspace file
|
|
228
|
-
description: 'Removes the file at `path` (and, when `versioned: true`, writes a
|
|
229
|
-
|
|
230
|
-
tombstone). Emits a `workspace.updated` event on success.
|
|
231
|
-
|
|
232
|
-
'
|
|
201
|
+
summary: Delete a workspace file.
|
|
202
|
+
description: 'Removes the file at `path` (and, when `versioned: true`, writes a tombstone). Emits a `workspace.updated`
|
|
203
|
+
event on success.'
|
|
233
204
|
operationId: deleteWorkspaceFile
|
|
234
205
|
security:
|
|
235
206
|
- ApiKeyAuth:
|
|
@@ -251,7 +222,7 @@ paths:
|
|
|
251
222
|
'404':
|
|
252
223
|
$ref: '#/components/responses/NotFound'
|
|
253
224
|
'501':
|
|
254
|
-
description: Host does not advertise capabilities.workspace.supported
|
|
225
|
+
description: Host does not advertise `capabilities.workspace.supported`.
|
|
255
226
|
content:
|
|
256
227
|
application/json:
|
|
257
228
|
schema:
|
|
@@ -264,35 +235,15 @@ paths:
|
|
|
264
235
|
tags:
|
|
265
236
|
- packs-test
|
|
266
237
|
summary: Publish a pack tarball to the isolated test catalog.
|
|
267
|
-
description: '
|
|
268
|
-
|
|
269
|
-
`
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
publish error catalog (`invalid_pack_scope`, `invalid_pack_name`,
|
|
274
|
-
|
|
275
|
-
`invalid_version`, `invalid_body`, eight `tarball_*` codes,
|
|
276
|
-
|
|
277
|
-
`invalid_manifest`, `manifest_mismatch` (or the granular
|
|
278
|
-
|
|
279
|
-
`manifest_name_mismatch` / `manifest_version_mismatch` pair),
|
|
280
|
-
|
|
281
|
-
`pack_integrity_failure`, `unsupported_runtime`, `forbidden`,
|
|
282
|
-
|
|
283
|
-
`conflict`/`version_conflict`) MUST be served verbatim. The
|
|
284
|
-
|
|
285
|
-
test catalog MUST be isolated per RFC 0025 §C — a pack PUT''d
|
|
238
|
+
description: 'Mirrors the registry''s `PUT /v1/packs/{name}/-/{version}.tgz` (`spec/v1/node-packs.md`). The request
|
|
239
|
+
shape, response shape, status codes, and publish error catalog MUST be served verbatim: `invalid_pack_scope`, `invalid_pack_name`,
|
|
240
|
+
`invalid_version`, `invalid_body`, eight `tarball_*` codes, `invalid_manifest`, `manifest_mismatch` (or the granular
|
|
241
|
+
`manifest_name_mismatch` / `manifest_version_mismatch` pair), `pack_integrity_failure`, `unsupported_runtime`, `forbidden`,
|
|
242
|
+
`conflict`/`version_conflict`.
|
|
286
243
|
|
|
287
|
-
here MUST NOT appear in `GET /v1/packs/{name}` listings.
|
|
288
244
|
|
|
289
|
-
The
|
|
290
|
-
|
|
291
|
-
(`registry-operations.md`), not defined in this host document
|
|
292
|
-
|
|
293
|
-
(see the `packs-test` tag scope note).
|
|
294
|
-
|
|
295
|
-
'
|
|
245
|
+
The test catalog MUST be isolated: a pack PUT here MUST NOT appear in `GET /v1/packs/{name}` listings. The mirrored
|
|
246
|
+
production path is registry-service surface (`registry-operations.md`), not defined in this document.'
|
|
296
247
|
operationId: putTestPackTarball
|
|
297
248
|
security:
|
|
298
249
|
- ApiKeyAuth:
|
|
@@ -352,29 +303,12 @@ paths:
|
|
|
352
303
|
schema:
|
|
353
304
|
$ref: '#/components/schemas/TestPackPublishRecord'
|
|
354
305
|
'400':
|
|
355
|
-
description: 'One of the
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
tarball extraction (`tarball_gunzip_failed`, `tarball_too_large`,
|
|
362
|
-
|
|
363
|
-
`tarball_manifest_missing`, `tarball_manifest_too_large`,
|
|
364
|
-
|
|
365
|
-
`tarball_manifest_not_json`, `tarball_entry_missing`,
|
|
366
|
-
|
|
367
|
-
`tarball_entry_too_large`, `tarball_path_traversal`,
|
|
368
|
-
|
|
369
|
-
`tarball_tar_parse_failed`),
|
|
370
|
-
|
|
371
|
-
manifest contents (`invalid_manifest`, `manifest_mismatch` or
|
|
372
|
-
|
|
373
|
-
the granular `manifest_name_mismatch` / `manifest_version_mismatch` pair,
|
|
374
|
-
|
|
375
|
-
`pack_integrity_failure`, `unsupported_runtime`).
|
|
376
|
-
|
|
377
|
-
'
|
|
306
|
+
description: 'One of the documented 400-class publish error codes: URL or scope (`invalid_pack_scope`, `invalid_pack_name`,
|
|
307
|
+
`invalid_version`), body shape (`invalid_body`), tarball extraction (`tarball_gunzip_failed`, `tarball_too_large`,
|
|
308
|
+
`tarball_manifest_missing`, `tarball_manifest_too_large`, `tarball_manifest_not_json`, `tarball_entry_missing`,
|
|
309
|
+
`tarball_entry_too_large`, `tarball_path_traversal`, `tarball_tar_parse_failed`), or manifest contents (`invalid_manifest`,
|
|
310
|
+
`manifest_mismatch` or the granular `manifest_name_mismatch` / `manifest_version_mismatch` pair, `pack_integrity_failure`,
|
|
311
|
+
`unsupported_runtime`).'
|
|
378
312
|
content:
|
|
379
313
|
application/json:
|
|
380
314
|
schema:
|
|
@@ -404,10 +338,9 @@ paths:
|
|
|
404
338
|
tags:
|
|
405
339
|
- packs-test
|
|
406
340
|
summary: Fetch a published test-catalog tarball.
|
|
407
|
-
description: '
|
|
408
|
-
application/tar+gzip` and an `ETag: "sha256-..."` matching the manifest''s `tarballSha256`. The mirrored
|
|
409
|
-
path is registry-service surface (`registry-operations.md`), not defined in this
|
|
410
|
-
tag scope note).'
|
|
341
|
+
description: 'Mirrors the registry''s `GET /v1/packs/{name}/-/{version}.tgz`. Returns the gzipped tarball bytes with
|
|
342
|
+
`Content-Type: application/tar+gzip` and an `ETag: "sha256-..."` matching the manifest''s `tarballSha256`. The mirrored
|
|
343
|
+
production path is registry-service surface (`registry-operations.md`), not defined in this document.'
|
|
411
344
|
operationId: getTestPackTarball
|
|
412
345
|
security:
|
|
413
346
|
- ApiKeyAuth:
|
|
@@ -452,26 +385,11 @@ paths:
|
|
|
452
385
|
delete:
|
|
453
386
|
tags:
|
|
454
387
|
- packs-test
|
|
455
|
-
summary: Unpublish a test-catalog version (
|
|
456
|
-
description: '
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
for versions older than the registry''s unpublish window
|
|
461
|
-
|
|
462
|
-
(default 72h). Test-mode implementations MAY shorten the
|
|
463
|
-
|
|
464
|
-
window for tractable conformance fixtures but MUST surface
|
|
465
|
-
|
|
466
|
-
the same error code. The mirrored production path is
|
|
467
|
-
|
|
468
|
-
registry-service surface (`registry-operations.md`), not
|
|
469
|
-
|
|
470
|
-
defined in this host document (see the `packs-test` tag
|
|
471
|
-
|
|
472
|
-
scope note).
|
|
473
|
-
|
|
474
|
-
'
|
|
388
|
+
summary: Unpublish a test-catalog version (same unpublish-window semantics as the registry).
|
|
389
|
+
description: Mirrors the registry's `DELETE /v1/packs/{name}/-/{version}` (`spec/v1/node-packs.md`). Returns `400 unpublish_window_expired`
|
|
390
|
+
for versions older than the registry's unpublish window (default 72h). Test-mode implementations MAY shorten the window
|
|
391
|
+
for tractable conformance fixtures but MUST surface the same error code. The mirrored production path is registry-service
|
|
392
|
+
surface (`registry-operations.md`), not defined in this document.
|
|
475
393
|
operationId: deleteTestPackVersion
|
|
476
394
|
security:
|
|
477
395
|
- ApiKeyAuth:
|
|
@@ -511,17 +429,9 @@ paths:
|
|
|
511
429
|
tags:
|
|
512
430
|
- packs-test
|
|
513
431
|
summary: Fetch the detached Ed25519 signature for a test-catalog pack.
|
|
514
|
-
description: '
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
to a storage-backend signed URL. The mirrored production path is
|
|
519
|
-
|
|
520
|
-
registry-service surface (`registry-operations.md`), not defined
|
|
521
|
-
|
|
522
|
-
in this host document (see the `packs-test` tag scope note).
|
|
523
|
-
|
|
524
|
-
'
|
|
432
|
+
description: Mirrors the registry's `GET /v1/packs/{name}/-/{version}.sig`. Returns the signature blob over `pack.json`
|
|
433
|
+
for this version. MAY 302-redirect to a storage-backend signed URL. The mirrored production path is registry-service
|
|
434
|
+
surface (`registry-operations.md`), not defined in this document.
|
|
525
435
|
operationId: getTestPackSignature
|
|
526
436
|
security:
|
|
527
437
|
- ApiKeyAuth:
|
|
@@ -560,19 +470,9 @@ paths:
|
|
|
560
470
|
schema:
|
|
561
471
|
$ref: ../schemas/v2/error-envelope.schema.json
|
|
562
472
|
'404':
|
|
563
|
-
description: '`signature_not_available
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
is unwired. The four cases are intentionally
|
|
568
|
-
|
|
569
|
-
indistinguishable per spec/v1/node-packs.md §"GET /v1/packs/{name}/-/{version}.sig".
|
|
570
|
-
|
|
571
|
-
Also returned when the host does not advertise
|
|
572
|
-
|
|
573
|
-
`capabilities.packs.testMode.supported: true`.
|
|
574
|
-
|
|
575
|
-
'
|
|
473
|
+
description: '`signature_not_available`: the version is missing, yanked, or unsigned at publish time, or the registry''s
|
|
474
|
+
storage backend is unwired. The four cases are intentionally indistinguishable (spec/v1/node-packs.md). Also returned
|
|
475
|
+
when the host does not advertise `capabilities.packs.testMode.supported: true`.'
|
|
576
476
|
content:
|
|
577
477
|
application/json:
|
|
578
478
|
schema:
|
|
@@ -582,11 +482,11 @@ paths:
|
|
|
582
482
|
tags:
|
|
583
483
|
- Seams
|
|
584
484
|
operationId: seedEra2EventLog
|
|
585
|
-
summary: Persist a run whose event log
|
|
586
|
-
description: 'The host MUST persist the rows verbatim
|
|
587
|
-
the run reads as era `2` by the absent-⇒-`2` rule of persistence.md
|
|
588
|
-
|
|
589
|
-
witness. `status` is the snapshot status the seeded run holds.'
|
|
485
|
+
summary: Persist a run whose event log uses v1 vocabulary (era 2)
|
|
486
|
+
description: 'Seeds a run whose stored event log is in v1 vocabulary. The host MUST persist the rows verbatim: v1 `type`
|
|
487
|
+
strings, the given `sequence` space, and no era stamp, so the run reads as era `2` by the absent-⇒-`2` rule of persistence.md.
|
|
488
|
+
The host MUST NOT translate at write time. The scenarios `v2-v1-events-translated`, `v2-unmapped-type-refused`, `v2-fork-a-v1-run`
|
|
489
|
+
and `v2-pinned-run-disposition` witness the read projection. `status` is the snapshot status the seeded run holds.'
|
|
590
490
|
requestBody:
|
|
591
491
|
required: true
|
|
592
492
|
content:
|
|
@@ -648,22 +548,79 @@ paths:
|
|
|
648
548
|
$ref: '#/components/responses/ValidationError'
|
|
649
549
|
'401':
|
|
650
550
|
$ref: '#/components/responses/Unauthenticated'
|
|
551
|
+
/conformance/seams/sample/event-log/append:
|
|
552
|
+
post:
|
|
553
|
+
tags:
|
|
554
|
+
- Seams
|
|
555
|
+
operationId: appendEra2Event
|
|
556
|
+
summary: Append a v2-named event to a seeded era-2 run through the host's production writer
|
|
557
|
+
description: 'The host MUST append the event through the same writer its own code uses for that run (the storage boundary
|
|
558
|
+
that applies the writer rule, persistence.md §The writer rule) and MUST NOT branch on the seam. An era-2 run stores
|
|
559
|
+
the event under its v1 spelling (the codemap''s v1 side), so the production read returns the v2 `type` given here.
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
The seam MUST refuse a `runId` that `seedEra2EventLog` did not create with `404`, exactly as for an unknown run, so
|
|
563
|
+
it cannot inject into a real run. A terminal run answers `409 run_terminal`; a `type` that is not a v2 registry name
|
|
564
|
+
answers `400`. Used by `v2-era-2-append-vocabulary`.'
|
|
565
|
+
requestBody:
|
|
566
|
+
required: true
|
|
567
|
+
content:
|
|
568
|
+
application/json:
|
|
569
|
+
schema:
|
|
570
|
+
type: object
|
|
571
|
+
additionalProperties: false
|
|
572
|
+
required:
|
|
573
|
+
- runId
|
|
574
|
+
- type
|
|
575
|
+
- payload
|
|
576
|
+
properties:
|
|
577
|
+
runId:
|
|
578
|
+
$ref: ../schemas/v2/ids.schema.json#/$defs/runId
|
|
579
|
+
type:
|
|
580
|
+
type: string
|
|
581
|
+
description: A v2 event type name (schemas/v2/run-event.schema.json `type` enum).
|
|
582
|
+
payload:
|
|
583
|
+
type: object
|
|
584
|
+
responses:
|
|
585
|
+
'202':
|
|
586
|
+
description: The event was appended.
|
|
587
|
+
content:
|
|
588
|
+
application/json:
|
|
589
|
+
schema:
|
|
590
|
+
type: object
|
|
591
|
+
additionalProperties: false
|
|
592
|
+
required:
|
|
593
|
+
- runId
|
|
594
|
+
- sequence
|
|
595
|
+
properties:
|
|
596
|
+
runId:
|
|
597
|
+
$ref: ../schemas/v2/ids.schema.json#/$defs/runId
|
|
598
|
+
sequence:
|
|
599
|
+
type: integer
|
|
600
|
+
minimum: 0
|
|
601
|
+
'400':
|
|
602
|
+
$ref: '#/components/responses/ValidationError'
|
|
603
|
+
'401':
|
|
604
|
+
$ref: '#/components/responses/Unauthenticated'
|
|
605
|
+
'404':
|
|
606
|
+
$ref: '#/components/responses/NotFound'
|
|
607
|
+
'409':
|
|
608
|
+
description: The run is terminal (`run_terminal`).
|
|
651
609
|
/conformance/seams/sample/effect-seams/fire:
|
|
652
610
|
post:
|
|
653
611
|
tags:
|
|
654
612
|
- Seams
|
|
655
613
|
operationId: fireEffectSeam
|
|
656
|
-
summary: Fire one named effect
|
|
614
|
+
summary: Fire one named effect seam inside a run
|
|
657
615
|
description: 'The host runs a workflow that drives the named seam once. The scenario then forks the run in `replay`
|
|
658
|
-
mode and reads `GET /runs/{runId}/effects` on the fork
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
re-fire on branch would have built this seam only to find the scenario still declining to call it.'
|
|
616
|
+
mode and reads `GET /runs/{runId}/effects` on the fork. A guarded seam MUST NOT produce a new effect attempt there:
|
|
617
|
+
replay suppression is unconditional (`replay.md` §Suppression rule 1) and does not depend on `branchReFires`, which
|
|
618
|
+
states only what a `branch` re-fires by design (§Branch: a host "MUST NOT report that as replay suppression"). The
|
|
619
|
+
witness is the host''s own Layer-2 ledger, so the leg needs no externally reachable receiver.
|
|
620
|
+
|
|
621
|
+
|
|
622
|
+
The scenario fires the first `GET /host/effect-seams` row with `guarded: true`, not every row. When no row is guarded
|
|
623
|
+
it records `inapplicable` without calling this operation.'
|
|
667
624
|
requestBody:
|
|
668
625
|
required: true
|
|
669
626
|
content:
|
|
@@ -677,12 +634,12 @@ paths:
|
|
|
677
634
|
seam:
|
|
678
635
|
type: string
|
|
679
636
|
minLength: 1
|
|
680
|
-
description: The `seam` value of a row in GET /host/effect-seams
|
|
637
|
+
description: The `seam` value of a row in `GET /host/effect-seams`.
|
|
681
638
|
receiverUrl:
|
|
682
639
|
type: string
|
|
683
640
|
format: uri
|
|
684
|
-
description: Optional destination for seams whose kind needs one. Omitted, the host uses its own unreachable
|
|
685
|
-
fixture destination
|
|
641
|
+
description: Optional destination, for seams whose kind needs one. Omitted, the host uses its own unreachable
|
|
642
|
+
fixture destination; the witness is the effect ledger, not delivery.
|
|
686
643
|
responses:
|
|
687
644
|
'201':
|
|
688
645
|
description: The run that fired the seam.
|
|
@@ -707,11 +664,10 @@ paths:
|
|
|
707
664
|
tags:
|
|
708
665
|
- Seams
|
|
709
666
|
operationId: forceEffectTransportRetry
|
|
710
|
-
summary: Drive one effect through the suite fixture provider with a forced transport retry
|
|
711
|
-
description:
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
obligation is only claims-checkable.'
|
|
667
|
+
summary: Drive one effect through the suite's fixture provider with a forced transport retry
|
|
668
|
+
description: The host issues one outbound effect to `providerUrl` and retries it at the transport layer. The fixture
|
|
669
|
+
provider records the idempotency key of each attempt. A Layer-2 host MUST present the same business-identity key on
|
|
670
|
+
both attempts; a provider that sees a changed key fails the leg.
|
|
715
671
|
requestBody:
|
|
716
672
|
required: true
|
|
717
673
|
content:
|
|
@@ -752,12 +708,11 @@ paths:
|
|
|
752
708
|
tags:
|
|
753
709
|
- Seams
|
|
754
710
|
operationId: armIdempotencyHold
|
|
755
|
-
summary: Hold the caller's next same-key create in flight
|
|
711
|
+
summary: Hold the caller's next same-key create in flight
|
|
756
712
|
description: 'Arms a single-use hold: the caller tenant''s next real `POST /runs` carrying `key` as its Idempotency-Key
|
|
757
713
|
keeps its Layer-1 claim in flight for `holdMs` after claiming, then completes normally. The seam MUST NOT answer a
|
|
758
714
|
create or emit a 409: the refusal a concurrent same-key create receives while the claim is held comes from the host''s
|
|
759
|
-
production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key);
|
|
760
|
-
delayed.'
|
|
715
|
+
production in-flight branch (idempotency.md §Concurrency). Keyed by (tenant, key); an unarmed key is never delayed.'
|
|
761
716
|
requestBody:
|
|
762
717
|
required: true
|
|
763
718
|
content:
|
|
@@ -801,10 +756,11 @@ paths:
|
|
|
801
756
|
tags:
|
|
802
757
|
- Seams
|
|
803
758
|
operationId: receiveWebhookDelivery
|
|
804
|
-
summary: Run a webhook delivery through the host's inbound receiver
|
|
805
|
-
description:
|
|
806
|
-
as the subscription secret and reports the verdict
|
|
807
|
-
MUST be accepted (`v2-v1-signed-webhook-accepted`)
|
|
759
|
+
summary: Run a webhook delivery through the host's inbound receiver
|
|
760
|
+
description: Exercises the host as a webhook subscriber. The host verifies `headers` and `body` with its production
|
|
761
|
+
verifier, using `secret` as the subscription secret, and reports the verdict. A scheme-`v1` delivery carrying only
|
|
762
|
+
`X-openwop-*` headers, signed over `{timestamp}.{rawBody}`, MUST be accepted (`v2-v1-signed-webhook-accepted`); a
|
|
763
|
+
tampered signature MUST be refused.
|
|
808
764
|
requestBody:
|
|
809
765
|
required: true
|
|
810
766
|
content:
|
|
@@ -850,19 +806,24 @@ paths:
|
|
|
850
806
|
tags:
|
|
851
807
|
- Seams
|
|
852
808
|
operationId: emitA2uiSurface
|
|
853
|
-
summary: Admit one `ui.a2ui-surface` envelope into a run through the production
|
|
854
|
-
description: '
|
|
855
|
-
one from the canonical wire
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
809
|
+
summary: Admit one `ui.a2ui-surface` envelope into a run through the production admission path
|
|
810
|
+
description: 'Supplies one `ui.a2ui-surface` envelope for the host to admit. A real one is emitted by a model inside
|
|
811
|
+
a node turn, so the suite cannot choose one from the canonical wire; this seam supplies the envelope only.
|
|
812
|
+
|
|
813
|
+
|
|
814
|
+
The host MUST admit it through its production envelope-admission path and MUST record it exactly as production would.
|
|
815
|
+
That path covers the envelope-kind catalog (`supportedEnvelopes`, `schemaVersions`, `envelopeStrictness`; events.md
|
|
816
|
+
§"The envelope-kind catalog"), validation against the one per-kind branch the schema version selects (never the `anyOf`
|
|
817
|
+
union), the cross-field rules (every message `surfaceId` equals the payload `surfaceId`; a `createSurface.catalogId`
|
|
818
|
+
equals the payload `catalogId`), the surface-fold guard (spec/v2/ext/a2uiSurface/README.md §"The fold"), trust propagation,
|
|
819
|
+
and SR-1 redaction. It MUST NOT be a mock that records without those rules. `envelope.nodeId`, when present, binds
|
|
820
|
+
the surface to that node, so a surface emitted at a node suspended on an `approval` interrupt is the surface whose
|
|
821
|
+
`resume` action would resolve it (§"Trust": a tainted fold blocks that interrupt).
|
|
822
|
+
|
|
823
|
+
|
|
824
|
+
Refusals use the canonical error envelope: `422 unknown_schema_version` above the floor, or below it under `strict`;
|
|
825
|
+
`422 envelope_invalid` for a payload that fails its branch, a cross-field rule, or the fold guard; `422 unknown_envelope_kind`
|
|
826
|
+
when the host does not list the kind. `details` SHOULD name the rule. A host that has not wired the seam answers `404`/`405`,
|
|
866
827
|
and the scenario records `inapplicable`.'
|
|
867
828
|
requestBody:
|
|
868
829
|
required: true
|
|
@@ -912,19 +873,23 @@ paths:
|
|
|
912
873
|
tags:
|
|
913
874
|
- Seams
|
|
914
875
|
operationId: startOAuthAuthorization
|
|
915
|
-
summary: Begin an authorization-code grant
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
876
|
+
summary: Begin an authorization-code grant through the production authorization-URL builder
|
|
877
|
+
description: 'Points `provider` at the given endpoints (the suite''s authorization-server double), then begins an authorization-code
|
|
878
|
+
grant for the authenticated caller by calling the host''s production authorization-URL builder, and returns the URL
|
|
879
|
+
a user agent would be redirected to. The provider is a test-only provider definition or, with `connection`, the connection
|
|
880
|
+
pack''s provider registered through the host''s production registration path, which runs discovery and pins its tuple.
|
|
881
|
+
|
|
882
|
+
|
|
883
|
+
The builder MUST be the one production uses: PKCE S256, a fresh `state` bound to the caller''s Subject and the provider,
|
|
884
|
+
the provider''s fixed redirect URI, `iss` expectations, and `resource` for an MCP reach. A seam that assembles its
|
|
885
|
+
own URL measures a stub, and a bundle citing it MUST say which. The grant completes on the host''s production callback
|
|
886
|
+
route, which the suite calls as the user agent. `redirectUri` is a probe: the host MUST ignore it (the redirect URI
|
|
887
|
+
is fixed per provider, oauth.md rule 5).
|
|
888
|
+
|
|
889
|
+
|
|
890
|
+
A refused grant (an MCP-reach provider with no `issuer`, `pkce: "unsupported"`, or discovered metadata that disagrees
|
|
891
|
+
with the manifest or the pinned tuple) is `422 connection_auth_metadata_mismatch`, and no authorization URL is issued.
|
|
892
|
+
A host that has not wired the seam answers `404`, and the scenarios record `blocked`.'
|
|
928
893
|
requestBody:
|
|
929
894
|
required: true
|
|
930
895
|
content:
|
|
@@ -962,8 +927,8 @@ paths:
|
|
|
962
927
|
minLength: 1
|
|
963
928
|
connection:
|
|
964
929
|
$ref: ../schemas/v2/connection-pack-manifest.schema.json
|
|
965
|
-
description: A connection pack whose provider is reached as an MCP server
|
|
966
|
-
|
|
930
|
+
description: A connection pack whose provider is reached as an MCP server; registered through the production
|
|
931
|
+
path.
|
|
967
932
|
redirectUri:
|
|
968
933
|
type: string
|
|
969
934
|
description: A probe the host MUST ignore.
|
|
@@ -999,14 +964,13 @@ paths:
|
|
|
999
964
|
tags:
|
|
1000
965
|
- Seams
|
|
1001
966
|
operationId: expireOAuthAccessToken
|
|
1002
|
-
summary: Expire the caller's stored access token for a provider so its next use refreshes
|
|
1003
|
-
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
provider.'
|
|
967
|
+
summary: Expire the caller's stored access token for a provider so its next use refreshes
|
|
968
|
+
description: 'Marks the access token of the caller''s stored credential for `provider` expired, and nothing else. The
|
|
969
|
+
next node that uses it refreshes through the host''s production refresh path against the provider''s token endpoint
|
|
970
|
+
(the suite''s double, which decides whether the refresh token is still good). A terminal refresh failure then follows
|
|
971
|
+
oauth.md §Token lifecycle: `connector.auth-expired`, and either the node fails `connector_auth_expired` or, under
|
|
972
|
+
`oauth.credentialInterrupt`, it suspends on a `credential` interrupt with `reason: "expired"`. `404` when the caller
|
|
973
|
+
holds no credential for the provider.'
|
|
1010
974
|
requestBody:
|
|
1011
975
|
required: true
|
|
1012
976
|
content:
|
|
@@ -1034,9 +998,9 @@ paths:
|
|
|
1034
998
|
tags:
|
|
1035
999
|
- Seams
|
|
1036
1000
|
operationId: mintLaneCredential
|
|
1037
|
-
summary: Mint a fresh credential on an advertised lane for the caller's tenant
|
|
1001
|
+
summary: Mint a fresh credential on an advertised lane for the caller's tenant
|
|
1038
1002
|
description: 'Issues a new credential on `lane` (an advertised `auth.lanes[].lane` whose `revocation` is `next-request`;
|
|
1039
|
-
absent ⇒ `api-key`) for the
|
|
1003
|
+
absent ⇒ `api-key`) for the authenticated caller''s tenant, through the host''s production issuance path, so the credential
|
|
1040
1004
|
it returns authenticates on the canonical API exactly as an ordinary one does. The suite uses it only to hold a credential
|
|
1041
1005
|
it can then revoke: the revocation, and the refusal on the next request (`401 credential_revoked`), are production
|
|
1042
1006
|
behaviour the seam does not simulate. A host that has not wired the seam answers `404`, and the scenario records the
|
|
@@ -1079,8 +1043,7 @@ paths:
|
|
|
1079
1043
|
- kind
|
|
1080
1044
|
description: 'How the suite presents `credential` on the canonical API. Absent ⇒ bearer. A lane whose
|
|
1081
1045
|
production credential is cookie-borne (a `session` lane) answers `{ kind: "cookie", name }`, and the
|
|
1082
|
-
suite sends `Cookie: <name>=<credential>`.
|
|
1083
|
-
can be witnessed without advertising a false rule.'
|
|
1046
|
+
suite sends `Cookie: <name>=<credential>`.'
|
|
1084
1047
|
properties:
|
|
1085
1048
|
kind:
|
|
1086
1049
|
type: string
|
|
@@ -1090,7 +1053,7 @@ paths:
|
|
|
1090
1053
|
name:
|
|
1091
1054
|
type: string
|
|
1092
1055
|
pattern: ^[!#$%&'*+.^_`|~0-9A-Za-z-]+$
|
|
1093
|
-
description: The cookie name (RFC 6265 token). Required when `kind` is `cookie`.
|
|
1056
|
+
description: The cookie name (an RFC 6265 token). Required when `kind` is `cookie`.
|
|
1094
1057
|
if:
|
|
1095
1058
|
properties:
|
|
1096
1059
|
kind:
|
|
@@ -1113,8 +1076,8 @@ paths:
|
|
|
1113
1076
|
tags:
|
|
1114
1077
|
- Seams
|
|
1115
1078
|
operationId: revokeLaneCredential
|
|
1116
|
-
summary: Revoke a credential the mint seam issued
|
|
1117
|
-
description: Revokes `credential` through the host's
|
|
1079
|
+
summary: Revoke a credential the mint seam issued
|
|
1080
|
+
description: Revokes `credential` through the host's production revocation path. On a `next-request` lane the very next
|
|
1118
1081
|
request presenting it MUST be refused `401 credential_revoked` (identity.md §2.2); the suite observes that on the
|
|
1119
1082
|
canonical API, not through this seam. `404` when no active credential matches.
|
|
1120
1083
|
requestBody:
|
|
@@ -1160,16 +1123,25 @@ paths:
|
|
|
1160
1123
|
tags:
|
|
1161
1124
|
- Seams
|
|
1162
1125
|
operationId: getTranscriptWindow
|
|
1163
|
-
summary:
|
|
1164
|
-
description: '
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
|
|
1170
|
-
|
|
1171
|
-
|
|
1172
|
-
|
|
1126
|
+
summary: Read the host's accounting of what it fed the model on one orchestrator turn
|
|
1127
|
+
description: 'Returns what the host fed the model on turn `iteration` of `runId`. The orchestrator transcript a host
|
|
1128
|
+
assembles each iteration is host-internal and never crosses the wire, so this seam reports the host''s own accounting:
|
|
1129
|
+
|
|
1130
|
+
|
|
1131
|
+
- `tokenCount`, in the advertised `contextBudget.tokenCounter` unit. MUST be ≤ `transcriptTokenBudget`.
|
|
1132
|
+
|
|
1133
|
+
- `eventIds`: the verbatim recent tail, in event-log order.
|
|
1134
|
+
|
|
1135
|
+
- `summarizedRanges`.
|
|
1136
|
+
|
|
1137
|
+
- `entries[] { eventId, rendered }`: the exact text fed per item. REQUIRED when `tokenCounter` is `chars`, so the
|
|
1138
|
+
suite can sum the rendered Unicode code points and require the sum to equal `tokenCount`. A summary substitution''s
|
|
1139
|
+
entry names its `context.summarized` event and renders the summary text.
|
|
1140
|
+
|
|
1141
|
+
|
|
1142
|
+
Served in test mode only; `rendered` MUST NOT carry secret material (SR-1). The ceiling is advertise-and-attest: the
|
|
1143
|
+
seam proves the declared accounting is consistent and bounded, not that nothing else reached the model. A turn past
|
|
1144
|
+
the run''s last answers `400`/`422`; an unwired seam answers `404`/`405`.'
|
|
1173
1145
|
parameters:
|
|
1174
1146
|
- name: runId
|
|
1175
1147
|
in: query
|
|
@@ -1255,28 +1227,13 @@ components:
|
|
|
1255
1227
|
type: http
|
|
1256
1228
|
scheme: bearer
|
|
1257
1229
|
bearerFormat: API key
|
|
1258
|
-
description:
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
|
|
1262
|
-
(`manifest:read`, `runs:create`, `runs:read`, `runs:cancel`,
|
|
1263
|
-
|
|
1264
|
-
`artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`).
|
|
1265
|
-
|
|
1266
|
-
See `auth.md`.
|
|
1267
|
-
|
|
1268
|
-
'
|
|
1230
|
+
description: OpenWOP API key. The format is implementation-defined; the reference implementation uses `hk_`/`hk_test_`
|
|
1231
|
+
prefixes. Each key carries one or more scopes from the canonical vocabulary (`manifest:read`, `runs:create`, `runs:read`,
|
|
1232
|
+
`runs:cancel`, `artifacts:read`, `webhooks:manage`, `approvals:respond`, `audit:read`). See `auth.md`.
|
|
1269
1233
|
OAuth2:
|
|
1270
1234
|
type: oauth2
|
|
1271
|
-
description: '
|
|
1272
|
-
|
|
1273
|
-
v2 `auth.lanes[].lane: "oauth2"`. Discovery is RFC 9728 Protected Resource
|
|
1274
|
-
|
|
1275
|
-
Metadata at the path-inserted well-known URI (`identity.md` §2.5).
|
|
1276
|
-
|
|
1277
|
-
Placeholder URLs.
|
|
1278
|
-
|
|
1279
|
-
'
|
|
1235
|
+
description: 'The OAuth 2.0 lane (`auth.lanes[].lane: "oauth2"`). Discovery is RFC 9728 Protected Resource Metadata
|
|
1236
|
+
at the path-inserted well-known URI (`identity.md` §2.5). The URLs are placeholders.'
|
|
1280
1237
|
flows:
|
|
1281
1238
|
clientCredentials:
|
|
1282
1239
|
tokenUrl: https://issuer.example/oauth2/token
|
|
@@ -1328,26 +1285,14 @@ components:
|
|
|
1328
1285
|
OpenIdConnect:
|
|
1329
1286
|
type: openIdConnect
|
|
1330
1287
|
openIdConnectUrl: https://issuer.example/.well-known/openid-configuration
|
|
1331
|
-
description: '
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`.
|
|
1336
|
-
|
|
1337
|
-
Placeholder URL.
|
|
1338
|
-
|
|
1339
|
-
'
|
|
1288
|
+
description: 'The OpenID Connect lane (`auth.lanes[].lane: "oidc"`). An ID token MAY be the bearer only when its `aud`
|
|
1289
|
+
equals the host''s configured audience (`identity.md` §2.1); any other `aud` is `audience_mismatch`. The URL is a
|
|
1290
|
+
placeholder.'
|
|
1340
1291
|
MutualTLS:
|
|
1341
1292
|
type: mutualTLS
|
|
1342
|
-
description: '
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
in no canonical requirement below: a host that requires it adds `MutualTLS: []`
|
|
1347
|
-
|
|
1348
|
-
inside each requirement object (AND).
|
|
1349
|
-
|
|
1350
|
-
'
|
|
1293
|
+
description: 'The mTLS lane (`auth.lanes[].lane: "mtls"`). mTLS is required *in addition to* a bearer, never instead
|
|
1294
|
+
of one, so it appears in no canonical requirement below. A host that requires it adds `MutualTLS: []` inside each
|
|
1295
|
+
requirement object (AND).'
|
|
1351
1296
|
parameters:
|
|
1352
1297
|
IdempotencyKey:
|
|
1353
1298
|
in: header
|
|
@@ -1356,15 +1301,8 @@ components:
|
|
|
1356
1301
|
schema:
|
|
1357
1302
|
type: string
|
|
1358
1303
|
maxLength: 255
|
|
1359
|
-
description: 'Per-mutation idempotency token (
|
|
1360
|
-
|
|
1361
|
-
Server caches `(tenantId, endpoint, key)` → response for ≥24h.
|
|
1362
|
-
|
|
1363
|
-
Duplicate requests return the cached response with header
|
|
1364
|
-
|
|
1365
|
-
`OpenWOP-Idempotent-Replay: true`.
|
|
1366
|
-
|
|
1367
|
-
'
|
|
1304
|
+
description: 'Per-mutation idempotency token (`idempotency.md` Layer 1). The server caches `(tenantId, endpoint, key)`
|
|
1305
|
+
→ response for ≥24h. A duplicate request returns the cached response with `OpenWOP-Idempotent-Replay: true`.'
|
|
1368
1306
|
WorkspacePath:
|
|
1369
1307
|
in: path
|
|
1370
1308
|
name: path
|
|
@@ -1372,13 +1310,8 @@ components:
|
|
|
1372
1310
|
schema:
|
|
1373
1311
|
type: string
|
|
1374
1312
|
pattern: ^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$
|
|
1375
|
-
description:
|
|
1376
|
-
|
|
1377
|
-
`/`-in-names; no `..`, no leading `/`. Matches
|
|
1378
|
-
|
|
1379
|
-
`workspace-file.schema.json#path`.
|
|
1380
|
-
|
|
1381
|
-
'
|
|
1313
|
+
description: Workspace-relative file path in a flat namespace that allows `/` in names; no `..` and no leading `/`.
|
|
1314
|
+
Matches `workspace-file.schema.json#path`.
|
|
1382
1315
|
WorkspacePrefix:
|
|
1383
1316
|
in: query
|
|
1384
1317
|
name: prefix
|
|
@@ -1386,7 +1319,7 @@ components:
|
|
|
1386
1319
|
schema:
|
|
1387
1320
|
type: string
|
|
1388
1321
|
maxLength: 256
|
|
1389
|
-
description:
|
|
1322
|
+
description: Optional prefix filter over the flat `path` namespace for `listWorkspaceFiles`.
|
|
1390
1323
|
WorkspaceVersion:
|
|
1391
1324
|
in: query
|
|
1392
1325
|
name: version
|
|
@@ -1394,11 +1327,8 @@ components:
|
|
|
1394
1327
|
schema:
|
|
1395
1328
|
type: integer
|
|
1396
1329
|
minimum: 1
|
|
1397
|
-
description: '
|
|
1398
|
-
|
|
1399
|
-
historical snapshot at this version. Absent = latest.
|
|
1400
|
-
|
|
1401
|
-
'
|
|
1330
|
+
description: 'When `capabilities.workspace.versioned: true`, requests the historical snapshot at this version. Absent
|
|
1331
|
+
means latest.'
|
|
1402
1332
|
IfMatch:
|
|
1403
1333
|
in: header
|
|
1404
1334
|
name: If-Match
|
|
@@ -1406,11 +1336,8 @@ components:
|
|
|
1406
1336
|
schema:
|
|
1407
1337
|
type: string
|
|
1408
1338
|
maxLength: 255
|
|
1409
|
-
description: '
|
|
1410
|
-
|
|
1411
|
-
A `PUT` carrying a stale `If-Match` returns `409 workspace_conflict`.
|
|
1412
|
-
|
|
1413
|
-
'
|
|
1339
|
+
description: 'Optimistic-concurrency token: the file''s current `etag`. A `PUT` carrying a stale `If-Match` returns
|
|
1340
|
+
`409 workspace_conflict`.'
|
|
1414
1341
|
PackName:
|
|
1415
1342
|
in: path
|
|
1416
1343
|
name: name
|
|
@@ -1433,8 +1360,8 @@ components:
|
|
|
1433
1360
|
description: Missing or invalid credential.
|
|
1434
1361
|
headers:
|
|
1435
1362
|
WWW-Authenticate:
|
|
1436
|
-
description:
|
|
1437
|
-
|
|
1363
|
+
description: A `Bearer` challenge. On a host with an oauth2 or oidc lane it carries `resource_metadata` and `error="invalid_token"`.
|
|
1364
|
+
Never sent on a non-disclosure 404.
|
|
1438
1365
|
schema:
|
|
1439
1366
|
type: string
|
|
1440
1367
|
content:
|
|
@@ -1445,8 +1372,8 @@ components:
|
|
|
1445
1372
|
description: Credential valid but lacks required scope or fails resource binding.
|
|
1446
1373
|
headers:
|
|
1447
1374
|
WWW-Authenticate:
|
|
1448
|
-
description:
|
|
1449
|
-
|
|
1375
|
+
description: On a scope refusal, `error="insufficient_scope"` with every required `scope`. Absent on a resource-binding
|
|
1376
|
+
403.
|
|
1450
1377
|
schema:
|
|
1451
1378
|
type: string
|
|
1452
1379
|
content:
|
|
@@ -1469,13 +1396,8 @@ components:
|
|
|
1469
1396
|
Error:
|
|
1470
1397
|
$ref: ../schemas/v2/error-envelope.schema.json
|
|
1471
1398
|
TestPackPublishRecord:
|
|
1472
|
-
description:
|
|
1473
|
-
|
|
1474
|
-
registry namespace (RFC 0025). Mirror of the production publish
|
|
1475
|
-
|
|
1399
|
+
description: Response body for a successful publish to the test-mode registry namespace. Mirrors the production publish
|
|
1476
1400
|
record returned by `PUT /v1/packs/{name}/-/{version}.tgz`.
|
|
1477
|
-
|
|
1478
|
-
'
|
|
1479
1401
|
type: object
|
|
1480
1402
|
required:
|
|
1481
1403
|
- name
|