diff --git a/contracts/workflow-api.manifest.json b/contracts/workflow-api.manifest.json index 6b5af7e8..fff50a0a 100644 --- a/contracts/workflow-api.manifest.json +++ b/contracts/workflow-api.manifest.json @@ -2516,6 +2516,21 @@ ], "type": "object" }, + "ListSchedulesResult": { + "description": "Schedule listing payload shared by the admin surface.", + "properties": { + "schedules": { + "items": { + "$ref": "#/components/schemas/ScheduleResult" + }, + "type": "array" + } + }, + "required": [ + "schedules" + ], + "type": "object" + }, "ListSourcesResult": { "description": "Cursor-paged compact source discovery result.", "properties": { @@ -2874,6 +2889,52 @@ ], "type": "object" }, + "OccurrencePage": { + "description": "One occurrence-history page, optionally with a live pending row.\n\nMatches the schedule-store page shape (``occurrences``, ``total``,\n``cursor``, ``next_cursor``, ``limit``); see\n``WorkflowScheduleApi.list_schedule_occurrences`` for the pending-row\nsynthesis contract.", + "properties": { + "cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "limit": { + "type": "integer" + }, + "next_cursor": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "occurrences": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "occurrences", + "total", + "cursor", + "next_cursor", + "limit" + ], + "type": "object" + }, "OutputBinding": { "additionalProperties": false, "description": "Map one node-local output path into one workflow state path.", @@ -3831,6 +3892,101 @@ ], "type": "object" }, + "ScheduleResult": { + "description": "JSON projection of one schedule definition.\n\nMirrors ``Schedule.model_dump(mode=\"json\")`` exactly; ``created_at`` and\n``updated_at`` are ISO strings in this projection.", + "properties": { + "blocked_reason": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "created_at": { + "type": "string" + }, + "deleted": { + "type": "boolean" + }, + "deployment_id": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "exhausted": { + "type": "boolean" + }, + "id": { + "type": "string" + }, + "input_bindings": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + "lateness_allowance_s": { + "type": "number" + }, + "max_active_runs": { + "type": "integer" + }, + "max_steps": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ] + }, + "misfire": { + "type": "string" + }, + "overlap": { + "type": "string" + }, + "paused": { + "type": "boolean" + }, + "revision": { + "type": "integer" + }, + "trigger": { + "additionalProperties": true, + "type": "object" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "id", + "deployment_id", + "trigger", + "input_bindings", + "max_steps", + "overlap", + "misfire", + "max_active_runs", + "lateness_allowance_s", + "revision", + "enabled", + "paused", + "deleted", + "exhausted", + "blocked_reason", + "created_at", + "updated_at" + ], + "type": "object" + }, "SchemaRef": { "additionalProperties": true, "description": "JSON Schema object used at workflow and node boundaries.", @@ -8647,6 +8803,7 @@ "anyOf": [ { "enum": [ + "admitted", "completed", "failed", "interrupted" @@ -8855,6 +9012,489 @@ } } }, + { + "action": "create", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.create", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + }, + { + "name": "deployment_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + }, + { + "name": "trigger", + "required": true, + "schema": { + "additionalProperties": true, + "type": "object" + } + }, + { + "name": "input_bindings", + "required": false, + "schema": { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + } + }, + { + "name": "overlap", + "required": false, + "schema": { + "default": "skip", + "type": "string" + } + }, + { + "name": "misfire", + "required": false, + "schema": { + "default": "skip", + "type": "string" + } + }, + { + "name": "max_active_runs", + "required": false, + "schema": { + "default": 1, + "minimum": 1, + "type": "integer" + } + }, + { + "name": "lateness_allowance_s", + "required": false, + "schema": { + "default": 60.0, + "minimum": 0, + "type": "number" + } + }, + { + "name": "max_steps", + "required": false, + "schema": { + "anyOf": [ + { + "minimum": 1, + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Optional schedule step budget. The server default applies when omitted." + } + }, + { + "name": "enabled", + "required": false, + "schema": { + "default": true, + "type": "boolean" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, + { + "action": "delete", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.delete", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, + { + "action": "get", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.get", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, + { + "action": "list", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.list", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "include_deleted", + "required": false, + "schema": { + "default": false, + "type": "boolean" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ListSchedulesResult" + } + } + }, + { + "action": "list", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.occurrences.list", + "namespace": [ + "workflow", + "schedules", + "occurrences" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + }, + { + "name": "cursor", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "limit", + "required": false, + "schema": { + "default": 50, + "maximum": 100, + "minimum": 1, + "type": "integer" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/OccurrencePage" + } + } + }, + { + "action": "pause", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.pause", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, + { + "action": "resume", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.resume", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, + { + "action": "update", + "errors": [ + { + "$ref": "#/components/errors/5000" + } + ], + "method": "workflow.schedules.update", + "namespace": [ + "workflow", + "schedules" + ], + "params": [ + { + "name": "schedule_id", + "required": true, + "schema": { + "minLength": 1, + "type": "string" + } + }, + { + "name": "expected_revision", + "required": true, + "schema": { + "type": "integer" + } + }, + { + "name": "deployment_id", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "trigger", + "required": false, + "schema": { + "anyOf": [ + { + "additionalProperties": true, + "type": "object" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "input_bindings", + "required": false, + "schema": { + "anyOf": [ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "overlap", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "misfire", + "required": false, + "schema": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "max_active_runs", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "lateness_allowance_s", + "required": false, + "schema": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "max_steps", + "required": false, + "schema": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "default": null + } + }, + { + "name": "enabled", + "required": false, + "schema": { + "anyOf": [ + { + "type": "boolean" + }, + { + "type": "null" + } + ], + "default": null + } + } + ], + "result": { + "schema": { + "$ref": "#/components/schemas/ScheduleResult" + } + } + }, { "action": "diagnose", "errors": [ diff --git a/tests/wf_contract_manifest/test_generate.py b/tests/wf_contract_manifest/test_generate.py index deadfd28..b0bea7ff 100644 --- a/tests/wf_contract_manifest/test_generate.py +++ b/tests/wf_contract_manifest/test_generate.py @@ -90,9 +90,9 @@ def test_generates_the_complete_real_workflow_contract() -> None: manifest = generate_manifest() schemas = manifest["components"]["schemas"] - assert len(manifest["operations"]) == 72 - assert len({operation["method"] for operation in manifest["operations"]}) == 72 - assert len(schemas) == 141 + assert len(manifest["operations"]) == 80 + assert len({operation["method"] for operation in manifest["operations"]}) == 80 + assert len(schemas) == 144 assert len(manifest["components"]["errors"]) == 1 assert all( set(operation["result"]["schema"]) == {"$ref"}