@openwop/openwop-conformance 1.6.1 → 1.11.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/CHANGELOG.md +44 -0
- package/README.md +2 -2
- package/api/asyncapi.yaml +127 -0
- package/api/openapi.yaml +518 -1
- package/coverage.md +44 -2
- package/fixtures/conformance-run-duration-breach.json +33 -0
- package/fixtures/oauth-providers/synthetic.json +38 -0
- package/fixtures.md +29 -0
- package/package.json +1 -1
- package/schemas/README.md +22 -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 +5 -0
- package/schemas/agent-org-chart.schema.json +82 -0
- package/schemas/agent-ref.schema.json +12 -2
- package/schemas/agent-roster-entry.schema.json +81 -0
- package/schemas/agent-roster-response.schema.json +21 -0
- package/schemas/ai-envelope.schema.json +28 -0
- package/schemas/artifact-type-pack-manifest.schema.json +160 -0
- package/schemas/budget-policy.schema.json +18 -0
- package/schemas/capabilities.schema.json +448 -4
- package/schemas/chat-card-pack-manifest.schema.json +158 -0
- package/schemas/credential-provenance.schema.json +18 -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/eval-summary.schema.json +92 -0
- package/schemas/heartbeat-evaluated.schema.json +14 -0
- package/schemas/heartbeat-state-changed.schema.json +14 -0
- package/schemas/node-pack-manifest.schema.json +33 -1
- package/schemas/org-chart-responsibility-view.schema.json +26 -0
- package/schemas/run-event-payloads.schema.json +380 -6
- package/schemas/run-event.schema.json +23 -0
- package/schemas/tool-descriptor.schema.json +63 -0
- package/schemas/trigger-subscription.schema.json +26 -0
- package/schemas/workflow-definition.schema.json +5 -0
- package/schemas/workspace-file-create.schema.json +20 -0
- package/schemas/workspace-file.schema.json +39 -0
- package/src/lib/agentLoop.ts +44 -0
- package/src/lib/agentRoster.ts +76 -0
- package/src/lib/agentRuntime.ts +45 -0
- package/src/lib/artifactTypes.ts +96 -0
- package/src/lib/cardPacks.ts +52 -0
- package/src/lib/discovery-capabilities.ts +50 -0
- package/src/lib/distillation.ts +38 -0
- package/src/lib/feedback.ts +3 -3
- package/src/lib/heartbeat.ts +31 -0
- package/src/lib/liveRuntime.ts +59 -0
- package/src/lib/memoryAttribution.ts +48 -0
- package/src/lib/profiles.ts +157 -0
- package/src/lib/runtimeRequires.ts +38 -0
- package/src/lib/safeFetch.ts +87 -0
- package/src/lib/subRunAttestation.ts +35 -0
- package/src/lib/toolHooks.ts +33 -0
- package/src/scenarios/agent-deployment-shape.test.ts +139 -0
- package/src/scenarios/agent-eval-suite-shape.test.ts +167 -0
- package/src/scenarios/agent-live-allowlist-enforced.test.ts +53 -0
- package/src/scenarios/agent-live-invocation-bracket.test.ts +98 -0
- package/src/scenarios/agent-live-runtime-shape.test.ts +98 -0
- package/src/scenarios/agent-live-structured-output.test.ts +58 -0
- package/src/scenarios/agent-loop-iteration-monotonic.test.ts +33 -0
- package/src/scenarios/agent-loop-stateful-resume.test.ts +28 -0
- package/src/scenarios/agent-loop-version5-shape.test.ts +41 -0
- package/src/scenarios/agent-loop-workspace-snapshot.test.ts +33 -0
- package/src/scenarios/agent-manifest-runtime.test.ts +85 -0
- package/src/scenarios/agent-org-chart-shape.test.ts +127 -0
- package/src/scenarios/agent-platform-profile.test.ts +158 -0
- package/src/scenarios/agent-roster-attribution.test.ts +179 -0
- package/src/scenarios/agent-roster-shape.test.ts +146 -0
- package/src/scenarios/ai-envelope-shape.test.ts +14 -18
- package/src/scenarios/aiEnvelope.capBreached.test.ts +2 -1
- package/src/scenarios/aiEnvelope.schemaDrift.test.ts +2 -1
- package/src/scenarios/aiEnvelope.universalKinds.test.ts +2 -1
- package/src/scenarios/approval-gate-flow.test.ts +4 -6
- package/src/scenarios/artifact-schema-compile-bounded.test.ts +126 -0
- package/src/scenarios/artifact-type-pack-install.test.ts +78 -0
- package/src/scenarios/artifact-type-pack-manifest-validation.test.ts +140 -0
- package/src/scenarios/artifact-type-store-without-render.test.ts +54 -0
- package/src/scenarios/audit-log-integrity.test.ts +3 -2
- package/src/scenarios/auth-api-key-rotation.test.ts +2 -1
- package/src/scenarios/auth-mtls.test.ts +2 -1
- package/src/scenarios/auth-oauth2-client-credentials.test.ts +2 -1
- package/src/scenarios/auth-oidc-user-bearer.test.ts +2 -1
- package/src/scenarios/auth-saml-profile.test.ts +2 -1
- package/src/scenarios/auth-scim-profile.test.ts +2 -1
- package/src/scenarios/authorization-fail-closed.test.ts +2 -1
- package/src/scenarios/authorization-roles-shape.test.ts +2 -1
- package/src/scenarios/budget-policy-shape.test.ts +136 -0
- package/src/scenarios/byok-auth-modes.test.ts +141 -0
- package/src/scenarios/chat-card-pack-execution.test.ts +56 -0
- package/src/scenarios/chat-card-pack-manifest-validation.test.ts +128 -0
- package/src/scenarios/commitment-fired.test.ts +83 -0
- package/src/scenarios/credential-payload-redaction.test.ts +2 -1
- package/src/scenarios/credentials-capability-shape.test.ts +2 -1
- package/src/scenarios/cross-engine-append-ordering.test.ts +2 -1
- package/src/scenarios/cross-host-ancestry-endpoint.test.ts +3 -2
- package/src/scenarios/cross-host-causation-shape.test.ts +3 -2
- package/src/scenarios/deadletter-capability-shape.test.ts +2 -1
- package/src/scenarios/deadletter-retry-exhaustion.test.ts +2 -1
- package/src/scenarios/distillation-index-roundtrip.test.ts +35 -0
- package/src/scenarios/distillation-secret-carryforward.test.ts +35 -0
- package/src/scenarios/distillation-shape.test.ts +41 -0
- package/src/scenarios/distillation-stable-archive.test.ts +37 -0
- package/src/scenarios/distillation-token-budget.test.ts +45 -0
- package/src/scenarios/egress-provenance-shape.test.ts +137 -0
- package/src/scenarios/envelope-completion-distinguishes-truncation.test.ts +4 -3
- package/src/scenarios/envelope-reasoning-secret-redaction.test.ts +5 -4
- package/src/scenarios/envelope-reasoning-shape.test.ts +3 -2
- package/src/scenarios/envelope-refusal-shape.test.ts +3 -2
- package/src/scenarios/envelope-rendering-hint.test.ts +95 -0
- package/src/scenarios/envelope-retry-attempted.test.ts +2 -1
- package/src/scenarios/envelope-tier-one-subset-static.test.ts +3 -2
- package/src/scenarios/exec-not-protocol-tier.test.ts +137 -0
- package/src/scenarios/experimental-tier-shape.test.ts +5 -4
- package/src/scenarios/fs-path-traversal.test.ts +2 -1
- package/src/scenarios/heartbeat-capability-shape.test.ts +35 -0
- package/src/scenarios/heartbeat-fires-once-per-tick.test.ts +28 -0
- package/src/scenarios/heartbeat-idempotent-no-spam.test.ts +43 -0
- package/src/scenarios/heartbeat-runtime-bound.test.ts +30 -0
- package/src/scenarios/http-client-ssrf.test.ts +10 -13
- package/src/scenarios/mcp-toolcall-redaction.test.ts +3 -2
- package/src/scenarios/media-url-inline-cap.test.ts +167 -0
- package/src/scenarios/memory-attribution-emits-on-write.test.ts +54 -0
- package/src/scenarios/memory-attribution-no-content.test.ts +45 -0
- package/src/scenarios/memory-attribution-replay-stable.test.ts +60 -0
- package/src/scenarios/memory-attribution-shape.test.ts +28 -0
- package/src/scenarios/memory-attribution-tenant-scoped.test.ts +44 -0
- package/src/scenarios/memory-capability-model-shape.test.ts +186 -0
- package/src/scenarios/memory-compaction-event-emitted.test.ts +2 -1
- package/src/scenarios/memory-compaction-provenance-tag.test.ts +2 -1
- package/src/scenarios/memory-compaction-sr1-carry-forward.test.ts +2 -1
- package/src/scenarios/memory-consolidation-idempotent.test.ts +77 -0
- package/src/scenarios/memory-consolidation-shape.test.ts +90 -0
- package/src/scenarios/model-capability-substituted.test.ts +2 -1
- package/src/scenarios/multi-agent-confidence-escalation.test.ts +5 -4
- package/src/scenarios/multi-agent-handoff-state-machine.test.ts +6 -5
- package/src/scenarios/multi-agent-memory-lifecycle.test.ts +4 -3
- package/src/scenarios/multi-region-idempotency.test.ts +10 -10
- package/src/scenarios/oauth-authorization-code-roundtrip.test.ts +145 -0
- package/src/scenarios/oauth-capability-shape.test.ts +2 -1
- package/src/scenarios/oauth-connector-redaction.test.ts +2 -1
- package/src/scenarios/pause-resume.test.ts +3 -3
- package/src/scenarios/production-backpressure.test.ts +2 -2
- package/src/scenarios/production-retention-expiry.test.ts +2 -2
- package/src/scenarios/prompt-all-four-kinds-events.test.ts +2 -1
- package/src/scenarios/prompt-composed-secret-redaction.test.ts +2 -1
- package/src/scenarios/prompt-composed-trust-marker.test.ts +2 -1
- package/src/scenarios/prompt-end-to-end-events.test.ts +2 -1
- package/src/scenarios/prompt-list-and-fetch.test.ts +2 -1
- package/src/scenarios/prompt-mutable-lifecycle.test.ts +2 -1
- package/src/scenarios/prompt-mutation-workspace-membership-enforced.test.ts +2 -1
- package/src/scenarios/prompt-pack-install.test.ts +2 -1
- package/src/scenarios/prompt-read-workspace-membership-enforced.test.ts +2 -1
- package/src/scenarios/prompt-render-deterministic.test.ts +2 -1
- package/src/scenarios/prompt-resolution-chain-agent-intrinsic.test.ts +2 -1
- package/src/scenarios/prompt-resolution-chain-fallback-cascade.test.ts +2 -1
- package/src/scenarios/prompt-resolution-chain-node-wins.test.ts +2 -1
- package/src/scenarios/prompt-template-shape.test.ts +2 -1
- package/src/scenarios/provider-usage.test.ts +2 -1
- package/src/scenarios/replay-divergence-at-refusal.test.ts +4 -3
- package/src/scenarios/replay-fork-arbitrary.test.ts +3 -1
- package/src/scenarios/replay-llm-cache-key-portable.test.ts +2 -1
- package/src/scenarios/replayDeterminism.test.ts +3 -1
- package/src/scenarios/run-execution-bounds-shape.test.ts +133 -0
- package/src/scenarios/runtime-requires-install-gate.test.ts +92 -0
- package/src/scenarios/runtime-requires-shape.test.ts +134 -0
- package/src/scenarios/safefetch-behavior.test.ts +99 -0
- package/src/scenarios/safefetch-live-audit.test.ts +175 -0
- package/src/scenarios/sandbox-memory-cap.test.ts +2 -1
- package/src/scenarios/sandbox-mvp-behavior.test.ts +2 -1
- package/src/scenarios/sandbox-no-host-fs-escape.test.ts +2 -1
- package/src/scenarios/sandbox-timeout-cap.test.ts +2 -1
- package/src/scenarios/scheduling-capability-shape.test.ts +2 -1
- package/src/scenarios/scheduling-cron-fires-once.test.ts +2 -1
- package/src/scenarios/secret-leakage-otel-attribute.test.ts +7 -6
- package/src/scenarios/spec-corpus-validity.test.ts +20 -4
- package/src/scenarios/subrun-approval-fail-closed.test.ts +33 -0
- package/src/scenarios/subrun-approval-gate.test.ts +35 -0
- package/src/scenarios/subrun-attestation-shape.test.ts +30 -0
- package/src/scenarios/subrun-checksum-stable.test.ts +43 -0
- package/src/scenarios/tool-descriptor-shape.test.ts +133 -0
- package/src/scenarios/tool-hooks-authorization-fail-closed.test.ts +39 -0
- package/src/scenarios/tool-hooks-content-free.test.ts +40 -0
- package/src/scenarios/tool-hooks-rate-limit.test.ts +32 -0
- package/src/scenarios/tool-hooks-secret-redaction.test.ts +34 -0
- package/src/scenarios/tool-hooks-shape.test.ts +34 -0
- package/src/scenarios/trigger-bridge-shape.test.ts +135 -0
- package/src/scenarios/wasm-pack-abi-version-rejection.test.ts +3 -10
- package/src/scenarios/wasm-pack-invoke-completed.test.ts +2 -2
- package/src/scenarios/wasm-pack-invoke-suspended.test.ts +2 -2
- package/src/scenarios/wasm-pack-load.test.ts +2 -2
- package/src/scenarios/wasm-pack-memory-cap.test.ts +3 -6
- package/src/scenarios/wasm-pack-replay-determinism.test.ts +2 -2
- package/src/scenarios/workflow-primary-output-annotation.test.ts +142 -0
- package/src/scenarios/workspace-behavior.test.ts +134 -0
- package/src/scenarios/workspace-capability-shape.test.ts +73 -0
- package/src/scenarios/workspace-cross-tenant-isolation.test.ts +84 -0
- package/src/scenarios/x-openwop-form-pack-manifest.test.ts +155 -0
package/api/openapi.yaml
CHANGED
|
@@ -51,6 +51,8 @@ tags:
|
|
|
51
51
|
description: Workflow definition manifest.
|
|
52
52
|
- name: runs
|
|
53
53
|
description: Run lifecycle — create, read, stream, cancel, fork.
|
|
54
|
+
- name: agents
|
|
55
|
+
description: Manifest-agent inventory (RFC 0072 §A). Read-only; gated on capabilities.agents.manifestRuntime. Dispatch rides the run surface (WorkflowNode.agent + POST /v1/runs).
|
|
54
56
|
- name: hitl
|
|
55
57
|
description: Human-in-the-loop interrupts and approvals.
|
|
56
58
|
- name: artifacts
|
|
@@ -61,6 +63,8 @@ tags:
|
|
|
61
63
|
description: Audit-log integrity verification (gated on the `openwop-audit-log-integrity` profile).
|
|
62
64
|
- name: prompts
|
|
63
65
|
description: Prompt-template library — list, fetch, render, mutate (RFC 0028; gated on `capabilities.prompts.*`).
|
|
66
|
+
- name: host
|
|
67
|
+
description: Host-capability resources — e.g. the RFC 0059 agent workspace file store (gated on `capabilities.workspace.*`).
|
|
64
68
|
- name: packs-test
|
|
65
69
|
description: |
|
|
66
70
|
RFC 0025 (`Draft`). Test-mode mirror of the production `/v1/packs/*` publish/get/delete/sig surface against
|
|
@@ -175,7 +179,6 @@ paths:
|
|
|
175
179
|
# so callers see one unified body shape.
|
|
176
180
|
allOf:
|
|
177
181
|
- type: object
|
|
178
|
-
required: [workflowId]
|
|
179
182
|
properties:
|
|
180
183
|
workflowId: { type: string, minLength: 1 }
|
|
181
184
|
inputs:
|
|
@@ -191,7 +194,33 @@ paths:
|
|
|
191
194
|
type: string
|
|
192
195
|
format: uri
|
|
193
196
|
description: Signed-token HITL callback URL (see `interrupt.md`).
|
|
197
|
+
mode:
|
|
198
|
+
type: string
|
|
199
|
+
enum: [eval]
|
|
200
|
+
description: |
|
|
201
|
+
RFC 0081 §B. When `eval`, this run is an eval-suite projection
|
|
202
|
+
(not a workflow run): the host runs the `evalSuiteRef` against
|
|
203
|
+
`agentId`, emits the content-free `eval.*` family, and terminates
|
|
204
|
+
with an `EvalSummary` readable via `GET /v1/runs/{runId}/eval-summary`.
|
|
205
|
+
Capability-gated on `capabilities.agents.evalSuite.supported`; a
|
|
206
|
+
host that omits it rejects `mode: "eval"` with 501. Omit for a
|
|
207
|
+
normal workflow run.
|
|
208
|
+
evalSuiteRef:
|
|
209
|
+
type: string
|
|
210
|
+
minLength: 1
|
|
211
|
+
description: RFC 0081 — URI of the `AgentEvalSuite` to run. Required when mode is `eval`.
|
|
212
|
+
agentId:
|
|
213
|
+
type: string
|
|
214
|
+
minLength: 1
|
|
215
|
+
description: RFC 0081 — the manifest agent the eval suite targets. Required when mode is `eval`.
|
|
194
216
|
additionalProperties: false
|
|
217
|
+
if:
|
|
218
|
+
properties: { mode: { const: eval } }
|
|
219
|
+
required: [mode]
|
|
220
|
+
then:
|
|
221
|
+
required: [evalSuiteRef, agentId]
|
|
222
|
+
else:
|
|
223
|
+
required: [workflowId]
|
|
195
224
|
- $ref: '../schemas/run-options.schema.json'
|
|
196
225
|
responses:
|
|
197
226
|
'201':
|
|
@@ -427,6 +456,146 @@ paths:
|
|
|
427
456
|
schema:
|
|
428
457
|
$ref: '../schemas/error-envelope.schema.json'
|
|
429
458
|
|
|
459
|
+
# ── Agent workspace files (RFC 0059) ─────────────────────────────────
|
|
460
|
+
# Gated on `capabilities.workspace.supported: true`. A versioned,
|
|
461
|
+
# tenant·workspace-scoped (RFC 0048) ground-truth file store with atomic,
|
|
462
|
+
# optimistically-concurrent (`If-Match`) writes. A successful PUT/DELETE
|
|
463
|
+
# emits a content-free `workspace.updated` event. Hosts without the
|
|
464
|
+
# advertised capability return `501 capability_not_provided`.
|
|
465
|
+
/v1/host/workspace/files:
|
|
466
|
+
get:
|
|
467
|
+
tags: [host]
|
|
468
|
+
summary: List workspace file metadata for the caller's tenant·workspace (RFC 0059).
|
|
469
|
+
description: |
|
|
470
|
+
Returns file metadata (no bodies) for the caller's `{tenant,
|
|
471
|
+
workspace}` per RFC 0059 §C. Optional `?prefix=` filters the flat
|
|
472
|
+
`path` namespace to entries starting with the given prefix.
|
|
473
|
+
operationId: listWorkspaceFiles
|
|
474
|
+
parameters:
|
|
475
|
+
- $ref: '#/components/parameters/WorkspacePrefix'
|
|
476
|
+
responses:
|
|
477
|
+
'200':
|
|
478
|
+
description: Workspace file metadata (tenant·workspace-scoped; bodies omitted).
|
|
479
|
+
content:
|
|
480
|
+
application/json:
|
|
481
|
+
schema:
|
|
482
|
+
type: object
|
|
483
|
+
required: [files]
|
|
484
|
+
properties:
|
|
485
|
+
files:
|
|
486
|
+
type: array
|
|
487
|
+
items:
|
|
488
|
+
$ref: '../schemas/workspace-file.schema.json'
|
|
489
|
+
additionalProperties: false
|
|
490
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
491
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
492
|
+
'501':
|
|
493
|
+
description: 'Host does not advertise capabilities.workspace.supported (RFC 0059).'
|
|
494
|
+
content:
|
|
495
|
+
application/json:
|
|
496
|
+
schema:
|
|
497
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
498
|
+
|
|
499
|
+
/v1/host/workspace/files/{path}:
|
|
500
|
+
get:
|
|
501
|
+
tags: [host]
|
|
502
|
+
summary: Read one workspace file (RFC 0059).
|
|
503
|
+
description: |
|
|
504
|
+
Returns the `WorkspaceFile` at `path` for the caller's `{tenant,
|
|
505
|
+
workspace}`. When `capabilities.workspace.versioned: true`, an
|
|
506
|
+
optional `?version=N` returns the historical snapshot at version N.
|
|
507
|
+
operationId: getWorkspaceFile
|
|
508
|
+
parameters:
|
|
509
|
+
- $ref: '#/components/parameters/WorkspacePath'
|
|
510
|
+
- $ref: '#/components/parameters/WorkspaceVersion'
|
|
511
|
+
responses:
|
|
512
|
+
'200':
|
|
513
|
+
description: The workspace file (current version, or `?version=N` when versioned).
|
|
514
|
+
content:
|
|
515
|
+
application/json:
|
|
516
|
+
schema:
|
|
517
|
+
$ref: '../schemas/workspace-file.schema.json'
|
|
518
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
519
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
520
|
+
'404': { $ref: '#/components/responses/NotFound' }
|
|
521
|
+
'501':
|
|
522
|
+
description: 'Host does not advertise capabilities.workspace.supported (RFC 0059).'
|
|
523
|
+
content:
|
|
524
|
+
application/json:
|
|
525
|
+
schema:
|
|
526
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
527
|
+
put:
|
|
528
|
+
tags: [host]
|
|
529
|
+
summary: Atomic create/replace of a workspace file (RFC 0059).
|
|
530
|
+
description: |
|
|
531
|
+
Atomically creates or replaces the file at `path` per RFC 0059 §C.
|
|
532
|
+
MUST honor `If-Match: <etag>` — a stale token returns `409
|
|
533
|
+
workspace_conflict` (`details.currentVersion` carries the live
|
|
534
|
+
version). On success the host bumps `version`, recomputes `etag`,
|
|
535
|
+
and emits a `workspace.updated` event. A `content` exceeding
|
|
536
|
+
`capabilities.workspace.maxFileBytes` returns `workspace_too_large`.
|
|
537
|
+
operationId: putWorkspaceFile
|
|
538
|
+
parameters:
|
|
539
|
+
- $ref: '#/components/parameters/WorkspacePath'
|
|
540
|
+
- $ref: '#/components/parameters/IfMatch'
|
|
541
|
+
- $ref: '#/components/parameters/IdempotencyKey'
|
|
542
|
+
requestBody:
|
|
543
|
+
required: true
|
|
544
|
+
content:
|
|
545
|
+
application/json:
|
|
546
|
+
schema:
|
|
547
|
+
$ref: '../schemas/workspace-file-create.schema.json'
|
|
548
|
+
responses:
|
|
549
|
+
'200':
|
|
550
|
+
description: File created or replaced. Returns the persisted WorkspaceFile.
|
|
551
|
+
content:
|
|
552
|
+
application/json:
|
|
553
|
+
schema:
|
|
554
|
+
$ref: '../schemas/workspace-file.schema.json'
|
|
555
|
+
'400': { $ref: '#/components/responses/ValidationError' }
|
|
556
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
557
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
558
|
+
'409':
|
|
559
|
+
description: 'Stale `If-Match` — the file changed since the supplied etag (`workspace_conflict`).'
|
|
560
|
+
content:
|
|
561
|
+
application/json:
|
|
562
|
+
schema:
|
|
563
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
564
|
+
'413':
|
|
565
|
+
description: 'Content exceeds `capabilities.workspace.maxFileBytes` (`workspace_too_large`).'
|
|
566
|
+
content:
|
|
567
|
+
application/json:
|
|
568
|
+
schema:
|
|
569
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
570
|
+
'501':
|
|
571
|
+
description: 'Host does not advertise capabilities.workspace.supported (RFC 0059).'
|
|
572
|
+
content:
|
|
573
|
+
application/json:
|
|
574
|
+
schema:
|
|
575
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
576
|
+
delete:
|
|
577
|
+
tags: [host]
|
|
578
|
+
summary: Delete a workspace file (RFC 0059).
|
|
579
|
+
description: |
|
|
580
|
+
Removes the file at `path` (and, when `versioned: true`, writes a
|
|
581
|
+
tombstone). Emits a `workspace.updated` event on success.
|
|
582
|
+
operationId: deleteWorkspaceFile
|
|
583
|
+
parameters:
|
|
584
|
+
- $ref: '#/components/parameters/WorkspacePath'
|
|
585
|
+
- $ref: '#/components/parameters/IdempotencyKey'
|
|
586
|
+
responses:
|
|
587
|
+
'204':
|
|
588
|
+
description: File deleted.
|
|
589
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
590
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
591
|
+
'404': { $ref: '#/components/responses/NotFound' }
|
|
592
|
+
'501':
|
|
593
|
+
description: 'Host does not advertise capabilities.workspace.supported (RFC 0059).'
|
|
594
|
+
content:
|
|
595
|
+
application/json:
|
|
596
|
+
schema:
|
|
597
|
+
$ref: '../schemas/error-envelope.schema.json'
|
|
598
|
+
|
|
430
599
|
/v1/runs:bulk-cancel:
|
|
431
600
|
post:
|
|
432
601
|
tags: [runs]
|
|
@@ -575,6 +744,317 @@ paths:
|
|
|
575
744
|
application/json:
|
|
576
745
|
schema: { $ref: '#/components/schemas/Error' }
|
|
577
746
|
|
|
747
|
+
/v1/agents:
|
|
748
|
+
get:
|
|
749
|
+
tags: [agents]
|
|
750
|
+
summary: |
|
|
751
|
+
RFC 0072 §A — list the manifest agents this host has installed into its
|
|
752
|
+
AgentRegistry (RFC 0070). Capability-gated on
|
|
753
|
+
`capabilities.agents.manifestRuntime.supported: true`; hosts that don't
|
|
754
|
+
advertise it return 404. Read-only projection — never carries the
|
|
755
|
+
system-prompt body, resolved handoff schemas, or credential material (SR-1).
|
|
756
|
+
Dispatch is not a bespoke endpoint: a manifest agent is invoked as a run
|
|
757
|
+
whose node pins it via `WorkflowNode.agent` + `POST /v1/runs` (RFC 0072 §B).
|
|
758
|
+
RFC 0074 — the result is scoped to the authenticated principal's owner
|
|
759
|
+
triple (RFC 0048). When `capabilities.agents.manifestRuntime.installScope`
|
|
760
|
+
is `'tenant'`, only the agents available to the caller's tenant·workspace
|
|
761
|
+
are returned (an agent another workspace installed is absent, never
|
|
762
|
+
disclosed); when `'host'` (default) the inventory is host-global as in
|
|
763
|
+
RFC 0072. A `'tenant'`-scoped host MUST reject unauthenticated/unscoped
|
|
764
|
+
requests per its standard auth contract rather than fall back to a global list.
|
|
765
|
+
operationId: listAgents
|
|
766
|
+
responses:
|
|
767
|
+
'200':
|
|
768
|
+
description: Installed manifest agents (agentId-sorted).
|
|
769
|
+
content:
|
|
770
|
+
application/json:
|
|
771
|
+
schema:
|
|
772
|
+
$ref: '../schemas/agent-inventory-response.schema.json'
|
|
773
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
774
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
775
|
+
'404':
|
|
776
|
+
description: |
|
|
777
|
+
Host does not advertise `capabilities.agents.manifestRuntime` and
|
|
778
|
+
treats the endpoint as absent.
|
|
779
|
+
content:
|
|
780
|
+
application/json:
|
|
781
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
782
|
+
|
|
783
|
+
/v1/agents/{agentId}:
|
|
784
|
+
get:
|
|
785
|
+
tags: [agents]
|
|
786
|
+
summary: |
|
|
787
|
+
RFC 0072 §A — return one installed manifest agent's inventory entry, or
|
|
788
|
+
404 when no such agent is installed (or the host doesn't advertise
|
|
789
|
+
`capabilities.agents.manifestRuntime`). RFC 0074 — resolved within the
|
|
790
|
+
authenticated principal's owner triple (RFC 0048): on an
|
|
791
|
+
`installScope: 'tenant'` host an agent the caller's workspace has not
|
|
792
|
+
approved 404s identically to "not installed", so the surface never
|
|
793
|
+
discloses another tenant's inventory.
|
|
794
|
+
operationId: getAgent
|
|
795
|
+
parameters:
|
|
796
|
+
- in: path
|
|
797
|
+
name: agentId
|
|
798
|
+
required: true
|
|
799
|
+
schema: { type: string }
|
|
800
|
+
description: The manifest agentId.
|
|
801
|
+
responses:
|
|
802
|
+
'200':
|
|
803
|
+
description: The agent's inventory entry.
|
|
804
|
+
content:
|
|
805
|
+
application/json:
|
|
806
|
+
schema:
|
|
807
|
+
$ref: '../schemas/agent-inventory-response.schema.json#/$defs/AgentInventoryEntry'
|
|
808
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
809
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
810
|
+
'404':
|
|
811
|
+
description: No such agent, or the host doesn't advertise the capability.
|
|
812
|
+
content:
|
|
813
|
+
application/json:
|
|
814
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
815
|
+
|
|
816
|
+
/v1/agents/{agentId}/deployments:
|
|
817
|
+
get:
|
|
818
|
+
tags: [agents]
|
|
819
|
+
summary: |
|
|
820
|
+
RFC 0082 §C/§E — list the deployment records (per-(agentId, version)) for
|
|
821
|
+
a manifest agent: the lifecycle `state`, the named `channels`, the canary
|
|
822
|
+
share, the rollback pointer, and the last-transition provenance. Read-only,
|
|
823
|
+
content-free of any manifest body or credential (SR-1). Capability-gated on
|
|
824
|
+
`capabilities.agents.deployment.supported: true`; hosts that don't advertise
|
|
825
|
+
it return 404. Tenant-scoped to the caller's owner triple (RFC 0048/0074)
|
|
826
|
+
when `installScope: 'tenant'`.
|
|
827
|
+
operationId: listAgentDeployments
|
|
828
|
+
parameters:
|
|
829
|
+
- in: path
|
|
830
|
+
name: agentId
|
|
831
|
+
required: true
|
|
832
|
+
schema: { type: string }
|
|
833
|
+
description: The manifest agentId.
|
|
834
|
+
responses:
|
|
835
|
+
'200':
|
|
836
|
+
description: The agent's deployment records (version-sorted).
|
|
837
|
+
content:
|
|
838
|
+
application/json:
|
|
839
|
+
schema:
|
|
840
|
+
type: array
|
|
841
|
+
items: { $ref: '../schemas/agent-deployment.schema.json' }
|
|
842
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
843
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
844
|
+
'404':
|
|
845
|
+
description: No such agent, or the host doesn't advertise `capabilities.agents.deployment`.
|
|
846
|
+
content:
|
|
847
|
+
application/json:
|
|
848
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
849
|
+
post:
|
|
850
|
+
tags: [agents]
|
|
851
|
+
summary: |
|
|
852
|
+
RFC 0082 §E — request a deployment state transition (promote / pause /
|
|
853
|
+
deprecate / rollback / adjust-canary). The host MUST authorize fail-closed
|
|
854
|
+
against the RFC 0049 `deploy:*` scope (absent/unseeded role denies), run any
|
|
855
|
+
configured RFC 0051 approvalGate, and — when the gate carries `requiredEval`
|
|
856
|
+
— verify the referenced RFC 0081 eval run is terminal and `EvalSummary.passed`
|
|
857
|
+
BEFORE emitting `deployment.promoted`. On success returns the updated
|
|
858
|
+
deployment record and emits the matching content-free `deployment.*` event.
|
|
859
|
+
operationId: transitionAgentDeployment
|
|
860
|
+
parameters:
|
|
861
|
+
- in: path
|
|
862
|
+
name: agentId
|
|
863
|
+
required: true
|
|
864
|
+
schema: { type: string }
|
|
865
|
+
description: The manifest agentId.
|
|
866
|
+
- $ref: '#/components/parameters/IdempotencyKey'
|
|
867
|
+
requestBody:
|
|
868
|
+
required: true
|
|
869
|
+
content:
|
|
870
|
+
application/json:
|
|
871
|
+
schema:
|
|
872
|
+
$ref: '../schemas/agent-deployment-transition.schema.json'
|
|
873
|
+
responses:
|
|
874
|
+
'200':
|
|
875
|
+
description: The deployment record after the applied transition.
|
|
876
|
+
content:
|
|
877
|
+
application/json:
|
|
878
|
+
schema:
|
|
879
|
+
$ref: '../schemas/agent-deployment.schema.json'
|
|
880
|
+
'400':
|
|
881
|
+
description: |
|
|
882
|
+
Validation error, or a transition that the host's advertised
|
|
883
|
+
`states`/`canary` cannot satisfy, or `no_active_deployment` when a
|
|
884
|
+
referenced channel resolves to no active version.
|
|
885
|
+
content:
|
|
886
|
+
application/json:
|
|
887
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
888
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
889
|
+
'403':
|
|
890
|
+
description: |
|
|
891
|
+
Fail-closed authorization denial (the principal lacks the required
|
|
892
|
+
`deploy:*` scope — RFC 0049), or `eval_gate_unmet` when a `requiredEval`
|
|
893
|
+
gate's referenced eval run is not terminal-and-passed (RFC 0081).
|
|
894
|
+
content:
|
|
895
|
+
application/json:
|
|
896
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
897
|
+
'404':
|
|
898
|
+
description: No such agent, or the host doesn't advertise `capabilities.agents.deployment`.
|
|
899
|
+
content:
|
|
900
|
+
application/json:
|
|
901
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
902
|
+
|
|
903
|
+
/v1/agents/roster:
|
|
904
|
+
get:
|
|
905
|
+
tags: [agents]
|
|
906
|
+
summary: |
|
|
907
|
+
RFC 0086 §B — list the standing agent roster (named "digital-twin
|
|
908
|
+
employee" instances + their workflow portfolios) visible to the
|
|
909
|
+
caller. Capability-gated on `capabilities.agents.roster.supported:
|
|
910
|
+
true`; hosts that don't advertise it return 404. Tenant-scoped per
|
|
911
|
+
RFC 0074 — on an `installScope: 'tenant'` host only the caller's
|
|
912
|
+
owner-triple entries are returned. Read-only; content-free (SR-1).
|
|
913
|
+
operationId: listAgentRoster
|
|
914
|
+
responses:
|
|
915
|
+
'200':
|
|
916
|
+
description: The caller's standing roster (rosterId-sorted).
|
|
917
|
+
content:
|
|
918
|
+
application/json:
|
|
919
|
+
schema:
|
|
920
|
+
$ref: '../schemas/agent-roster-response.schema.json'
|
|
921
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
922
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
923
|
+
'404':
|
|
924
|
+
description: Host does not advertise `capabilities.agents.roster`.
|
|
925
|
+
content:
|
|
926
|
+
application/json:
|
|
927
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
928
|
+
|
|
929
|
+
/v1/agents/roster/{rosterId}:
|
|
930
|
+
get:
|
|
931
|
+
tags: [agents]
|
|
932
|
+
summary: |
|
|
933
|
+
RFC 0086 §B — return one standing roster entry, or 404 when no such
|
|
934
|
+
entry exists, the host doesn't advertise `capabilities.agents.roster`,
|
|
935
|
+
or (on an `installScope: 'tenant'` host) the entry is outside the
|
|
936
|
+
caller's owner triple — a cross-tenant entry 404s identically to
|
|
937
|
+
"not found", never disclosing another tenant's roster.
|
|
938
|
+
operationId: getAgentRosterEntry
|
|
939
|
+
parameters:
|
|
940
|
+
- in: path
|
|
941
|
+
name: rosterId
|
|
942
|
+
required: true
|
|
943
|
+
schema: { type: string }
|
|
944
|
+
description: The standing instance id (a `host:<id>` AgentRef agentId).
|
|
945
|
+
responses:
|
|
946
|
+
'200':
|
|
947
|
+
description: The roster entry.
|
|
948
|
+
content:
|
|
949
|
+
application/json:
|
|
950
|
+
schema:
|
|
951
|
+
$ref: '../schemas/agent-roster-entry.schema.json'
|
|
952
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
953
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
954
|
+
'404':
|
|
955
|
+
description: No such entry, cross-tenant, or capability unadvertised.
|
|
956
|
+
content:
|
|
957
|
+
application/json:
|
|
958
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
959
|
+
|
|
960
|
+
/v1/agents/org-chart:
|
|
961
|
+
get:
|
|
962
|
+
tags: [agents]
|
|
963
|
+
summary: |
|
|
964
|
+
RFC 0087 §C — return the caller's agent org-chart (departments + roles
|
|
965
|
+
+ `reportsTo` edges over roster members). Capability-gated on
|
|
966
|
+
`capabilities.agents.orgChart.supported: true`; hosts that don't
|
|
967
|
+
advertise it return 404. Tenant-scoped per RFC 0074. DESCRIPTIVE only:
|
|
968
|
+
an org edge confers no authority (§B `org-position-no-authority-escalation`).
|
|
969
|
+
operationId: getAgentOrgChart
|
|
970
|
+
responses:
|
|
971
|
+
'200':
|
|
972
|
+
description: The caller's org-chart.
|
|
973
|
+
content:
|
|
974
|
+
application/json:
|
|
975
|
+
schema:
|
|
976
|
+
$ref: '../schemas/agent-org-chart.schema.json'
|
|
977
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
978
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
979
|
+
'404':
|
|
980
|
+
description: Host does not advertise `capabilities.agents.orgChart`.
|
|
981
|
+
content:
|
|
982
|
+
application/json:
|
|
983
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
984
|
+
|
|
985
|
+
/v1/agents/org-chart/{departmentId}:
|
|
986
|
+
get:
|
|
987
|
+
tags: [agents]
|
|
988
|
+
summary: |
|
|
989
|
+
RFC 0087 §D — one department's subtree + responsibility roll-up (the
|
|
990
|
+
union of its members' RFC 0086 portfolios). `?recursive=false` narrows
|
|
991
|
+
the roll-up to direct members without changing the response shape.
|
|
992
|
+
404 when the department is unknown, cross-tenant, or the host doesn't
|
|
993
|
+
advertise `capabilities.agents.orgChart`. The roll-up grants nothing (§B).
|
|
994
|
+
operationId: getAgentOrgChartDepartment
|
|
995
|
+
parameters:
|
|
996
|
+
- in: path
|
|
997
|
+
name: departmentId
|
|
998
|
+
required: true
|
|
999
|
+
schema: { type: string }
|
|
1000
|
+
description: The department id to root the subtree + roll-up at.
|
|
1001
|
+
- in: query
|
|
1002
|
+
name: recursive
|
|
1003
|
+
required: false
|
|
1004
|
+
schema: { type: boolean, default: true }
|
|
1005
|
+
description: When `false`, the roll-up scopes to direct members only.
|
|
1006
|
+
responses:
|
|
1007
|
+
'200':
|
|
1008
|
+
description: The department subtree + responsibility roll-up.
|
|
1009
|
+
content:
|
|
1010
|
+
application/json:
|
|
1011
|
+
schema:
|
|
1012
|
+
$ref: '../schemas/org-chart-responsibility-view.schema.json'
|
|
1013
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
1014
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
1015
|
+
'404':
|
|
1016
|
+
description: Unknown/cross-tenant department, or capability unadvertised.
|
|
1017
|
+
content:
|
|
1018
|
+
application/json:
|
|
1019
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
1020
|
+
|
|
1021
|
+
/v1/runs/{runId}/eval-summary:
|
|
1022
|
+
get:
|
|
1023
|
+
tags: [runs]
|
|
1024
|
+
summary: |
|
|
1025
|
+
RFC 0081 §C — return the `EvalSummary` scorecard for a terminal eval run
|
|
1026
|
+
(a run started with `mode: "eval"`): aggregate + per-task scores, cost,
|
|
1027
|
+
latency, schema-validity, and redaction-safe safety findings, plus the
|
|
1028
|
+
suite provenance and (regression mode) the score delta vs a baseline.
|
|
1029
|
+
Content-free of task output / rubric prose / credentials (SR-1; the
|
|
1030
|
+
`eval-summary-no-content-leak` invariant). Capability-gated on
|
|
1031
|
+
`capabilities.agents.evalSuite.supported: true`; hosts that don't advertise
|
|
1032
|
+
it return 404. 409 when the run is not yet terminal.
|
|
1033
|
+
operationId: getEvalSummary
|
|
1034
|
+
parameters:
|
|
1035
|
+
- $ref: '#/components/parameters/RunId'
|
|
1036
|
+
responses:
|
|
1037
|
+
'200':
|
|
1038
|
+
description: The eval run's scorecard.
|
|
1039
|
+
content:
|
|
1040
|
+
application/json:
|
|
1041
|
+
schema:
|
|
1042
|
+
$ref: '../schemas/eval-summary.schema.json'
|
|
1043
|
+
'401': { $ref: '#/components/responses/Unauthenticated' }
|
|
1044
|
+
'403': { $ref: '#/components/responses/Forbidden' }
|
|
1045
|
+
'404':
|
|
1046
|
+
description: |
|
|
1047
|
+
No such run, the run is not an eval run, or the host doesn't advertise
|
|
1048
|
+
`capabilities.agents.evalSuite`.
|
|
1049
|
+
content:
|
|
1050
|
+
application/json:
|
|
1051
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
1052
|
+
'409':
|
|
1053
|
+
description: The eval run is still running; the summary is not yet final.
|
|
1054
|
+
content:
|
|
1055
|
+
application/json:
|
|
1056
|
+
schema: { $ref: '#/components/schemas/Error' }
|
|
1057
|
+
|
|
578
1058
|
/v1/runs/{runId}:diff:
|
|
579
1059
|
get:
|
|
580
1060
|
tags: [runs]
|
|
@@ -1513,6 +1993,43 @@ components:
|
|
|
1513
1993
|
Duplicate requests return the cached response with header
|
|
1514
1994
|
`openwop-Idempotent-Replay: true`.
|
|
1515
1995
|
|
|
1996
|
+
WorkspacePath:
|
|
1997
|
+
in: path
|
|
1998
|
+
name: path
|
|
1999
|
+
required: true
|
|
2000
|
+
schema:
|
|
2001
|
+
type: string
|
|
2002
|
+
pattern: '^[A-Za-z0-9][A-Za-z0-9._/-]{0,255}$'
|
|
2003
|
+
description: |
|
|
2004
|
+
RFC 0059 workspace-relative file path. Flat namespace with
|
|
2005
|
+
`/`-in-names; no `..`, no leading `/`. Matches
|
|
2006
|
+
`workspace-file.schema.json#path`.
|
|
2007
|
+
|
|
2008
|
+
WorkspacePrefix:
|
|
2009
|
+
in: query
|
|
2010
|
+
name: prefix
|
|
2011
|
+
required: false
|
|
2012
|
+
schema: { type: string, maxLength: 256 }
|
|
2013
|
+
description: RFC 0059. Optional prefix filter over the flat `path` namespace for `listWorkspaceFiles`.
|
|
2014
|
+
|
|
2015
|
+
WorkspaceVersion:
|
|
2016
|
+
in: query
|
|
2017
|
+
name: version
|
|
2018
|
+
required: false
|
|
2019
|
+
schema: { type: integer, minimum: 1 }
|
|
2020
|
+
description: |
|
|
2021
|
+
RFC 0059. When `capabilities.workspace.versioned: true`, request the
|
|
2022
|
+
historical snapshot at this version. Absent = latest.
|
|
2023
|
+
|
|
2024
|
+
IfMatch:
|
|
2025
|
+
in: header
|
|
2026
|
+
name: If-Match
|
|
2027
|
+
required: false
|
|
2028
|
+
schema: { type: string, maxLength: 255 }
|
|
2029
|
+
description: |
|
|
2030
|
+
RFC 0059 optimistic-concurrency token — the file's current `etag`.
|
|
2031
|
+
A `PUT` carrying a stale `If-Match` returns `409 workspace_conflict`.
|
|
2032
|
+
|
|
1516
2033
|
PackName:
|
|
1517
2034
|
in: path
|
|
1518
2035
|
name: name
|