native macOS codings agent orchestrator prowl.onev.cat
Something went wrong. Try again.
15 kB · 631 lines
Swift
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632// ProwlShared/WorkflowJSONSchema.swift// Draft 2020-12 JSON Schema of a `prowl.workflow/v1` file, printed by `prowl workflow schema`.// The same document is checked in as ProwlCLIContracts/Resources/workflow-definition-schema.json;// a test pins the two together. Structural shape only — cross-reference rules are the validator's.
import Foundation
nonisolated public enum WorkflowJSONSchema { public static let identifier = "https://prowl.onev.cat/contracts/workflow/v1/workflow-definition.json"
public static func definitionSchemaObject() throws -> [String: Any] { let object = try JSONSerialization.jsonObject(with: Data(definitionSchemaJSON.utf8)) guard let dictionary = object as? [String: Any] else { throw CocoaError(.coderInvalidValue) } return dictionary }
public static let definitionSchemaJSON = #""" { "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://prowl.onev.cat/contracts/workflow/v1/workflow-definition.json", "title": "Prowl Agent Workflow (prowl.workflow/v1)", "description": "Declarative multi-agent workflow run by Prowl (docs-ai 063 dsl-spec.md).", "type": "object", "additionalProperties": false, "required": [ "schema", "id", "name", "steps" ], "properties": { "schema": { "const": "prowl.workflow/v1" }, "id": { "$ref": "#/$defs/workflowId" }, "name": { "type": "string", "minLength": 1 }, "description": { "type": "string" }, "icon": { "type": "string", "description": "SF Symbol name" }, "inputs": { "type": "object", "propertyNames": { "$ref": "#/$defs/slug" }, "additionalProperties": { "$ref": "#/$defs/input" } }, "roles": { "type": "object", "propertyNames": { "$ref": "#/$defs/slug" }, "additionalProperties": { "$ref": "#/$defs/role" } }, "steps": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/step" } }, "state": { "type": "object", "propertyNames": { "$ref": "#/$defs/slug" }, "additionalProperties": { "type": "object", "required": [ "type", "initial" ], "additionalProperties": false, "properties": { "type": { "type": "string", "pattern": "^(boolean|integer|number|string|array<.+>)$" }, "initial": {} } } } }, "$defs": { "slug": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]{0,63}$" }, "workflowId": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_.-]{0,63}$" }, "template": { "type": "string" }, "input": { "oneOf": [ { "$ref": "#/$defs/integerInput" }, { "$ref": "#/$defs/stringInput" }, { "$ref": "#/$defs/enumInput" } ] }, "integerInput": { "type": "object", "additionalProperties": false, "required": [ "type" ], "properties": { "type": { "const": "integer" }, "default": { "type": "integer" }, "min": { "type": "integer" }, "max": { "type": "integer" }, "prompt": { "type": "string" } } }, "stringInput": { "type": "object", "additionalProperties": false, "required": [ "type" ], "properties": { "type": { "const": "string" }, "default": { "type": "string" }, "prompt": { "type": "string" } } }, "enumInput": { "type": "object", "additionalProperties": false, "required": [ "type", "values" ], "properties": { "type": { "const": "enum" }, "values": { "type": "array", "minItems": 1, "uniqueItems": true, "items": { "type": "string", "minLength": 1 } }, "default": { "type": "string" }, "prompt": { "type": "string" } } }, "role": { "oneOf": [ { "$ref": "#/$defs/currentRole" }, { "$ref": "#/$defs/pickRole" }, { "$ref": "#/$defs/launchRole" } ] }, "currentRole": { "type": "object", "additionalProperties": false, "required": [ "source" ], "properties": { "source": { "const": "current" } } }, "pickRole": { "type": "object", "additionalProperties": false, "required": [ "source" ], "properties": { "source": { "const": "pick" } } }, "launchRole": { "type": "object", "additionalProperties": false, "required": [ "source" ], "properties": { "source": { "const": "launch" }, "kind": { "const": "interactive" }, "agents": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "suggest": { "$ref": "#/$defs/suggest" }, "bind": { "enum": [ "ask", "auto" ] }, "placement": { "enum": [ "split", "tab" ] }, "direction": { "enum": [ "right", "left", "up", "down" ] }, "background": { "type": "boolean" } } }, "suggest": { "type": "object", "additionalProperties": false, "properties": { "agent": { "type": "string" }, "model": { "type": "string" }, "reasoning_effort": { "type": "string" }, "execution_mode": { "type": "string" } } }, "step": { "oneOf": [ { "$ref": "#/$defs/messageStep" }, { "$ref": "#/$defs/launchStep" }, { "$ref": "#/$defs/actionStep" }, { "$ref": "#/$defs/notifyStep" }, { "$ref": "#/$defs/closeStep" }, { "$ref": "#/$defs/ifStep" }, { "$ref": "#/$defs/whileStep" }, { "$ref": "#/$defs/setStep" }, { "$ref": "#/$defs/breakStep" }, { "$ref": "#/$defs/continueStep" } ] }, "messageStep": { "type": "object", "additionalProperties": false, "required": [ "id", "message", "prompt" ], "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "$ref": "#/$defs/template" }, "message": { "$ref": "#/$defs/slug" }, "prompt": { "$ref": "#/$defs/template" }, "expect": { "$ref": "#/$defs/expect" } } }, "launchStep": { "type": "object", "additionalProperties": false, "required": [ "id", "launch", "prompt" ], "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "$ref": "#/$defs/template" }, "launch": { "$ref": "#/$defs/slug" }, "prompt": { "$ref": "#/$defs/template" }, "skill": { "$ref": "#/$defs/workflowId" }, "expect": { "$ref": "#/$defs/expect" } } }, "actionStep": { "type": "object", "additionalProperties": false, "required": [ "id", "action" ], "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "$ref": "#/$defs/template" }, "action": { "type": "string", "anyOf": [ { "enum": ["builtin:assert-condition", "builtin:collect-worktree-context", "builtin:save-handoff"] }, { "pattern": "^local:(?=[a-z0-9-]{1,64}$)[a-z][a-z0-9]*(?:-[a-z0-9]+)*$" } ] }, "with": { "type": "object", "propertyNames": { "$ref": "#/$defs/slug" }, "additionalProperties": {} } } }, "notifyStep": { "type": "object", "additionalProperties": false, "required": [ "id", "notify" ], "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "$ref": "#/$defs/template" }, "notify": { "$ref": "#/$defs/template" } } }, "closeStep": { "type": "object", "additionalProperties": false, "required": [ "id", "close" ], "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "$ref": "#/$defs/template" }, "close": { "$ref": "#/$defs/slug" } } }, "expect": { "type": "object", "additionalProperties": false, "properties": { "delivery": { "$ref": "#/$defs/slug" }, "format": { "enum": [ "markdown", "text", "json" ] }, "sections": { "type": "array", "items": { "type": "string", "minLength": 1 } }, "verdicts": { "type": "array", "minItems": 2, "maxItems": 4, "uniqueItems": true, "items": { "$ref": "#/$defs/slug" } }, "timeout": { "type": "string", "pattern": "^\\d+\\s*[smh]$" }, "on_timeout": { "enum": [ "attention", "skip", "cancel" ] }, "strict": { "type": "boolean" } }, "dependentRequired": { "on_timeout": [ "timeout" ] } }, "ifStep": { "type": "object", "required": [ "id", "if", "then" ], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "type": "string" }, "if": { "type": "string" }, "then": { "$ref": "#/$defs/stepList" }, "else": { "$ref": "#/$defs/stepList" } } }, "whileStep": { "type": "object", "required": [ "id", "while", "steps" ], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "type": "string" }, "while": { "type": "string" }, "steps": { "$ref": "#/$defs/stepList" }, "max_iterations": { "type": "integer", "minimum": 1 } } }, "setStep": { "type": "object", "required": [ "id", "set" ], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "type": "string" }, "set": { "type": "object", "additionalProperties": { "type": [ "string", "boolean", "number" ] } } } }, "breakStep": { "type": "object", "required": [ "id", "break" ], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "type": "string" }, "break": { "const": true } } }, "continueStep": { "type": "object", "required": [ "id", "continue" ], "additionalProperties": false, "properties": { "id": { "$ref": "#/$defs/slug" }, "title": { "type": "string" }, "continue": { "const": true } } }, "stepList": { "type": "array", "minItems": 1, "items": { "$ref": "#/$defs/step" } } } } """#}