@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.
Files changed (200) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -2
  3. package/api/asyncapi.yaml +127 -0
  4. package/api/openapi.yaml +518 -1
  5. package/coverage.md +44 -2
  6. package/fixtures/conformance-run-duration-breach.json +33 -0
  7. package/fixtures/oauth-providers/synthetic.json +38 -0
  8. package/fixtures.md +29 -0
  9. package/package.json +1 -1
  10. package/schemas/README.md +22 -0
  11. package/schemas/agent-deployment-transition.schema.json +49 -0
  12. package/schemas/agent-deployment.schema.json +54 -0
  13. package/schemas/agent-eval-suite.schema.json +140 -0
  14. package/schemas/agent-inventory-response.schema.json +115 -0
  15. package/schemas/agent-manifest.schema.json +5 -0
  16. package/schemas/agent-org-chart.schema.json +82 -0
  17. package/schemas/agent-ref.schema.json +12 -2
  18. package/schemas/agent-roster-entry.schema.json +81 -0
  19. package/schemas/agent-roster-response.schema.json +21 -0
  20. package/schemas/ai-envelope.schema.json +28 -0
  21. package/schemas/artifact-type-pack-manifest.schema.json +160 -0
  22. package/schemas/budget-policy.schema.json +18 -0
  23. package/schemas/capabilities.schema.json +448 -4
  24. package/schemas/chat-card-pack-manifest.schema.json +158 -0
  25. package/schemas/credential-provenance.schema.json +18 -0
  26. package/schemas/envelopes/media.audio.schema.json +38 -0
  27. package/schemas/envelopes/media.file.schema.json +37 -0
  28. package/schemas/envelopes/media.image.schema.json +33 -0
  29. package/schemas/eval-summary.schema.json +92 -0
  30. package/schemas/heartbeat-evaluated.schema.json +14 -0
  31. package/schemas/heartbeat-state-changed.schema.json +14 -0
  32. package/schemas/node-pack-manifest.schema.json +33 -1
  33. package/schemas/org-chart-responsibility-view.schema.json +26 -0
  34. package/schemas/run-event-payloads.schema.json +380 -6
  35. package/schemas/run-event.schema.json +23 -0
  36. package/schemas/tool-descriptor.schema.json +63 -0
  37. package/schemas/trigger-subscription.schema.json +26 -0
  38. package/schemas/workflow-definition.schema.json +5 -0
  39. package/schemas/workspace-file-create.schema.json +20 -0
  40. package/schemas/workspace-file.schema.json +39 -0
  41. package/src/lib/agentLoop.ts +44 -0
  42. package/src/lib/agentRoster.ts +76 -0
  43. package/src/lib/agentRuntime.ts +45 -0
  44. package/src/lib/artifactTypes.ts +96 -0
  45. package/src/lib/cardPacks.ts +52 -0
  46. package/src/lib/discovery-capabilities.ts +50 -0
  47. package/src/lib/distillation.ts +38 -0
  48. package/src/lib/feedback.ts +3 -3
  49. package/src/lib/heartbeat.ts +31 -0
  50. package/src/lib/liveRuntime.ts +59 -0
  51. package/src/lib/memoryAttribution.ts +48 -0
  52. package/src/lib/profiles.ts +157 -0
  53. package/src/lib/runtimeRequires.ts +38 -0
  54. package/src/lib/safeFetch.ts +87 -0
  55. package/src/lib/subRunAttestation.ts +35 -0
  56. package/src/lib/toolHooks.ts +33 -0
  57. package/src/scenarios/agent-deployment-shape.test.ts +139 -0
  58. package/src/scenarios/agent-eval-suite-shape.test.ts +167 -0
  59. package/src/scenarios/agent-live-allowlist-enforced.test.ts +53 -0
  60. package/src/scenarios/agent-live-invocation-bracket.test.ts +98 -0
  61. package/src/scenarios/agent-live-runtime-shape.test.ts +98 -0
  62. package/src/scenarios/agent-live-structured-output.test.ts +58 -0
  63. package/src/scenarios/agent-loop-iteration-monotonic.test.ts +33 -0
  64. package/src/scenarios/agent-loop-stateful-resume.test.ts +28 -0
  65. package/src/scenarios/agent-loop-version5-shape.test.ts +41 -0
  66. package/src/scenarios/agent-loop-workspace-snapshot.test.ts +33 -0
  67. package/src/scenarios/agent-manifest-runtime.test.ts +85 -0
  68. package/src/scenarios/agent-org-chart-shape.test.ts +127 -0
  69. package/src/scenarios/agent-platform-profile.test.ts +158 -0
  70. package/src/scenarios/agent-roster-attribution.test.ts +179 -0
  71. package/src/scenarios/agent-roster-shape.test.ts +146 -0
  72. package/src/scenarios/ai-envelope-shape.test.ts +14 -18
  73. package/src/scenarios/aiEnvelope.capBreached.test.ts +2 -1
  74. package/src/scenarios/aiEnvelope.schemaDrift.test.ts +2 -1
  75. package/src/scenarios/aiEnvelope.universalKinds.test.ts +2 -1
  76. package/src/scenarios/approval-gate-flow.test.ts +4 -6
  77. package/src/scenarios/artifact-schema-compile-bounded.test.ts +126 -0
  78. package/src/scenarios/artifact-type-pack-install.test.ts +78 -0
  79. package/src/scenarios/artifact-type-pack-manifest-validation.test.ts +140 -0
  80. package/src/scenarios/artifact-type-store-without-render.test.ts +54 -0
  81. package/src/scenarios/audit-log-integrity.test.ts +3 -2
  82. package/src/scenarios/auth-api-key-rotation.test.ts +2 -1
  83. package/src/scenarios/auth-mtls.test.ts +2 -1
  84. package/src/scenarios/auth-oauth2-client-credentials.test.ts +2 -1
  85. package/src/scenarios/auth-oidc-user-bearer.test.ts +2 -1
  86. package/src/scenarios/auth-saml-profile.test.ts +2 -1
  87. package/src/scenarios/auth-scim-profile.test.ts +2 -1
  88. package/src/scenarios/authorization-fail-closed.test.ts +2 -1
  89. package/src/scenarios/authorization-roles-shape.test.ts +2 -1
  90. package/src/scenarios/budget-policy-shape.test.ts +136 -0
  91. package/src/scenarios/byok-auth-modes.test.ts +141 -0
  92. package/src/scenarios/chat-card-pack-execution.test.ts +56 -0
  93. package/src/scenarios/chat-card-pack-manifest-validation.test.ts +128 -0
  94. package/src/scenarios/commitment-fired.test.ts +83 -0
  95. package/src/scenarios/credential-payload-redaction.test.ts +2 -1
  96. package/src/scenarios/credentials-capability-shape.test.ts +2 -1
  97. package/src/scenarios/cross-engine-append-ordering.test.ts +2 -1
  98. package/src/scenarios/cross-host-ancestry-endpoint.test.ts +3 -2
  99. package/src/scenarios/cross-host-causation-shape.test.ts +3 -2
  100. package/src/scenarios/deadletter-capability-shape.test.ts +2 -1
  101. package/src/scenarios/deadletter-retry-exhaustion.test.ts +2 -1
  102. package/src/scenarios/distillation-index-roundtrip.test.ts +35 -0
  103. package/src/scenarios/distillation-secret-carryforward.test.ts +35 -0
  104. package/src/scenarios/distillation-shape.test.ts +41 -0
  105. package/src/scenarios/distillation-stable-archive.test.ts +37 -0
  106. package/src/scenarios/distillation-token-budget.test.ts +45 -0
  107. package/src/scenarios/egress-provenance-shape.test.ts +137 -0
  108. package/src/scenarios/envelope-completion-distinguishes-truncation.test.ts +4 -3
  109. package/src/scenarios/envelope-reasoning-secret-redaction.test.ts +5 -4
  110. package/src/scenarios/envelope-reasoning-shape.test.ts +3 -2
  111. package/src/scenarios/envelope-refusal-shape.test.ts +3 -2
  112. package/src/scenarios/envelope-rendering-hint.test.ts +95 -0
  113. package/src/scenarios/envelope-retry-attempted.test.ts +2 -1
  114. package/src/scenarios/envelope-tier-one-subset-static.test.ts +3 -2
  115. package/src/scenarios/exec-not-protocol-tier.test.ts +137 -0
  116. package/src/scenarios/experimental-tier-shape.test.ts +5 -4
  117. package/src/scenarios/fs-path-traversal.test.ts +2 -1
  118. package/src/scenarios/heartbeat-capability-shape.test.ts +35 -0
  119. package/src/scenarios/heartbeat-fires-once-per-tick.test.ts +28 -0
  120. package/src/scenarios/heartbeat-idempotent-no-spam.test.ts +43 -0
  121. package/src/scenarios/heartbeat-runtime-bound.test.ts +30 -0
  122. package/src/scenarios/http-client-ssrf.test.ts +10 -13
  123. package/src/scenarios/mcp-toolcall-redaction.test.ts +3 -2
  124. package/src/scenarios/media-url-inline-cap.test.ts +167 -0
  125. package/src/scenarios/memory-attribution-emits-on-write.test.ts +54 -0
  126. package/src/scenarios/memory-attribution-no-content.test.ts +45 -0
  127. package/src/scenarios/memory-attribution-replay-stable.test.ts +60 -0
  128. package/src/scenarios/memory-attribution-shape.test.ts +28 -0
  129. package/src/scenarios/memory-attribution-tenant-scoped.test.ts +44 -0
  130. package/src/scenarios/memory-capability-model-shape.test.ts +186 -0
  131. package/src/scenarios/memory-compaction-event-emitted.test.ts +2 -1
  132. package/src/scenarios/memory-compaction-provenance-tag.test.ts +2 -1
  133. package/src/scenarios/memory-compaction-sr1-carry-forward.test.ts +2 -1
  134. package/src/scenarios/memory-consolidation-idempotent.test.ts +77 -0
  135. package/src/scenarios/memory-consolidation-shape.test.ts +90 -0
  136. package/src/scenarios/model-capability-substituted.test.ts +2 -1
  137. package/src/scenarios/multi-agent-confidence-escalation.test.ts +5 -4
  138. package/src/scenarios/multi-agent-handoff-state-machine.test.ts +6 -5
  139. package/src/scenarios/multi-agent-memory-lifecycle.test.ts +4 -3
  140. package/src/scenarios/multi-region-idempotency.test.ts +10 -10
  141. package/src/scenarios/oauth-authorization-code-roundtrip.test.ts +145 -0
  142. package/src/scenarios/oauth-capability-shape.test.ts +2 -1
  143. package/src/scenarios/oauth-connector-redaction.test.ts +2 -1
  144. package/src/scenarios/pause-resume.test.ts +3 -3
  145. package/src/scenarios/production-backpressure.test.ts +2 -2
  146. package/src/scenarios/production-retention-expiry.test.ts +2 -2
  147. package/src/scenarios/prompt-all-four-kinds-events.test.ts +2 -1
  148. package/src/scenarios/prompt-composed-secret-redaction.test.ts +2 -1
  149. package/src/scenarios/prompt-composed-trust-marker.test.ts +2 -1
  150. package/src/scenarios/prompt-end-to-end-events.test.ts +2 -1
  151. package/src/scenarios/prompt-list-and-fetch.test.ts +2 -1
  152. package/src/scenarios/prompt-mutable-lifecycle.test.ts +2 -1
  153. package/src/scenarios/prompt-mutation-workspace-membership-enforced.test.ts +2 -1
  154. package/src/scenarios/prompt-pack-install.test.ts +2 -1
  155. package/src/scenarios/prompt-read-workspace-membership-enforced.test.ts +2 -1
  156. package/src/scenarios/prompt-render-deterministic.test.ts +2 -1
  157. package/src/scenarios/prompt-resolution-chain-agent-intrinsic.test.ts +2 -1
  158. package/src/scenarios/prompt-resolution-chain-fallback-cascade.test.ts +2 -1
  159. package/src/scenarios/prompt-resolution-chain-node-wins.test.ts +2 -1
  160. package/src/scenarios/prompt-template-shape.test.ts +2 -1
  161. package/src/scenarios/provider-usage.test.ts +2 -1
  162. package/src/scenarios/replay-divergence-at-refusal.test.ts +4 -3
  163. package/src/scenarios/replay-fork-arbitrary.test.ts +3 -1
  164. package/src/scenarios/replay-llm-cache-key-portable.test.ts +2 -1
  165. package/src/scenarios/replayDeterminism.test.ts +3 -1
  166. package/src/scenarios/run-execution-bounds-shape.test.ts +133 -0
  167. package/src/scenarios/runtime-requires-install-gate.test.ts +92 -0
  168. package/src/scenarios/runtime-requires-shape.test.ts +134 -0
  169. package/src/scenarios/safefetch-behavior.test.ts +99 -0
  170. package/src/scenarios/safefetch-live-audit.test.ts +175 -0
  171. package/src/scenarios/sandbox-memory-cap.test.ts +2 -1
  172. package/src/scenarios/sandbox-mvp-behavior.test.ts +2 -1
  173. package/src/scenarios/sandbox-no-host-fs-escape.test.ts +2 -1
  174. package/src/scenarios/sandbox-timeout-cap.test.ts +2 -1
  175. package/src/scenarios/scheduling-capability-shape.test.ts +2 -1
  176. package/src/scenarios/scheduling-cron-fires-once.test.ts +2 -1
  177. package/src/scenarios/secret-leakage-otel-attribute.test.ts +7 -6
  178. package/src/scenarios/spec-corpus-validity.test.ts +20 -4
  179. package/src/scenarios/subrun-approval-fail-closed.test.ts +33 -0
  180. package/src/scenarios/subrun-approval-gate.test.ts +35 -0
  181. package/src/scenarios/subrun-attestation-shape.test.ts +30 -0
  182. package/src/scenarios/subrun-checksum-stable.test.ts +43 -0
  183. package/src/scenarios/tool-descriptor-shape.test.ts +133 -0
  184. package/src/scenarios/tool-hooks-authorization-fail-closed.test.ts +39 -0
  185. package/src/scenarios/tool-hooks-content-free.test.ts +40 -0
  186. package/src/scenarios/tool-hooks-rate-limit.test.ts +32 -0
  187. package/src/scenarios/tool-hooks-secret-redaction.test.ts +34 -0
  188. package/src/scenarios/tool-hooks-shape.test.ts +34 -0
  189. package/src/scenarios/trigger-bridge-shape.test.ts +135 -0
  190. package/src/scenarios/wasm-pack-abi-version-rejection.test.ts +3 -10
  191. package/src/scenarios/wasm-pack-invoke-completed.test.ts +2 -2
  192. package/src/scenarios/wasm-pack-invoke-suspended.test.ts +2 -2
  193. package/src/scenarios/wasm-pack-load.test.ts +2 -2
  194. package/src/scenarios/wasm-pack-memory-cap.test.ts +3 -6
  195. package/src/scenarios/wasm-pack-replay-determinism.test.ts +2 -2
  196. package/src/scenarios/workflow-primary-output-annotation.test.ts +142 -0
  197. package/src/scenarios/workspace-behavior.test.ts +134 -0
  198. package/src/scenarios/workspace-capability-shape.test.ts +73 -0
  199. package/src/scenarios/workspace-cross-tenant-isolation.test.ts +84 -0
  200. 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