{ "$schema": "https://json-schema.org/draft-07/schema#", "$id": "https://open-wanderer.github.io/wanderer/schemas/plugin.schema.json", "title": "wanderer plugin manifest", "description": "Schema for wanderer plugin.json manifests.", "type": "object", "additionalProperties": false, "required": [ "manifestVersion", "id", "type", "name", "version", "runtime", "capabilities" ], "properties": { "$schema": { "type": "string", "description": "Optional editor schema reference." }, "manifestVersion": { "type": "string", "const": "1.0" }, "id": { "type": "string", "pattern": "^[a-z0-9][a-z0-9_-]*$" }, "type": { "type": "string", "enum": ["trails"] }, "name": { "type": "string", "minLength": 1 }, "description": { "type": "string" }, "version": { "type": "string", "minLength": 1 }, "runtime": { "$ref": "#/definitions/runtime" }, "capabilities": { "type": "array", "minItems": 1, "items": { "$ref": "#/definitions/capability" } }, "auth": { "$ref": "#/definitions/auth" }, "permissions": { "$ref": "#/definitions/permissions" }, "configSchema": { "type": "array", "items": { "$ref": "#/definitions/configField" } }, "hostConfig": { "$ref": "#/definitions/hostConfig" }, "metadata": { "$ref": "#/definitions/metadata" } }, "definitions": { "runtime": { "type": "object", "additionalProperties": false, "required": ["type", "entrypoint"], "properties": { "type": { "type": "string", "const": "wasm" }, "entrypoint": { "type": "string", "minLength": 1 } } }, "capability": { "type": "object", "additionalProperties": false, "required": ["name", "version", "export"], "properties": { "name": { "type": "string", "minLength": 1 }, "version": { "type": "string", "minLength": 1 }, "export": { "type": "string", "minLength": 1 }, "requiredHostFunctions": { "type": "array", "items": { "type": "string", "minLength": 1 }, "uniqueItems": true }, "job": { "type": "string", "minLength": 1 } } }, "auth": { "type": "object", "additionalProperties": false, "properties": { "contexts": { "type": "object", "additionalProperties": { "$ref": "#/definitions/authContext" } } } }, "authContext": { "type": "object", "additionalProperties": false, "required": ["type"], "properties": { "type": { "type": "string", "enum": ["oauth2", "api_key", "bearer", "session"] }, "fields": { "$ref": "#/definitions/stringList" }, "authorizationUrl": { "type": "string", "format": "uri" }, "tokenUrl": { "type": "string", "format": "uri" }, "scopes": { "$ref": "#/definitions/stringList" }, "scopeSeparator": { "type": "string" }, "pkce": { "type": "boolean" }, "tokenRequestFormat": { "type": "string", "enum": ["json", "form"] }, "tokenAuth": { "type": "string", "enum": ["client_secret_post", "client_secret_basic"] }, "authorizationParams": { "$ref": "#/definitions/stringMap" }, "refresh": { "$ref": "#/definitions/authRefresh" }, "placement": { "type": "string", "enum": ["query"] }, "name": { "type": "string", "minLength": 1 }, "secretField": { "type": "string", "minLength": 1 }, "secretFields": { "$ref": "#/definitions/stringList" } } }, "authRefresh": { "type": "object", "additionalProperties": false, "required": ["mode"], "properties": { "mode": { "type": "string", "enum": ["host", "plugin"] }, "grantType": { "type": "string", "minLength": 1 }, "function": { "type": "string", "minLength": 1 } } }, "permissions": { "type": "object", "additionalProperties": false, "properties": { "network": { "$ref": "#/definitions/networkPermissions" }, "auth": { "$ref": "#/definitions/stringList" }, "downloads": { "$ref": "#/definitions/transferPermissions" }, "uploads": { "$ref": "#/definitions/transferPermissions" } } }, "networkPermissions": { "type": "object", "additionalProperties": false, "properties": { "connectors": { "type": "array", "items": { "$ref": "#/definitions/connector" } }, "redirects": { "$ref": "#/definitions/redirects" } } }, "connector": { "type": "object", "additionalProperties": false, "required": ["name", "type"], "properties": { "name": { "type": "string", "minLength": 1 }, "type": { "type": "string", "enum": ["public_api", "configured"] }, "fixedBaseURL": { "type": "string", "format": "uri" }, "configKey": { "type": "string", "minLength": 1 }, "allowedPathPrefixes": { "$ref": "#/definitions/stringList" }, "auth": { "$ref": "#/definitions/stringList" }, "supportsMediaAuth": { "type": "boolean" }, "supportsStorageRedirects": { "type": "boolean" }, "supportsCustomTLS": { "type": "boolean" } }, "allOf": [ { "if": { "properties": { "type": { "const": "public_api" } } }, "then": { "required": ["fixedBaseURL"], "not": { "required": ["configKey"] } } }, { "if": { "properties": { "type": { "const": "configured" } } }, "then": { "required": ["configKey"], "not": { "required": ["fixedBaseURL"] } } } ] }, "redirects": { "type": "object", "additionalProperties": false, "properties": { "mode": { "type": "string", "enum": ["declared_hosts_only"] }, "hosts": { "$ref": "#/definitions/stringList" } } }, "transferPermissions": { "type": "object", "additionalProperties": false, "properties": { "maxBytes": { "type": "integer", "minimum": 0 }, "contentTypes": { "$ref": "#/definitions/stringList" } } }, "configField": { "type": "object", "additionalProperties": false, "required": ["key", "type"], "properties": { "key": { "type": "string", "minLength": 1 }, "type": { "type": "string", "enum": ["boolean", "date", "select", "text", "url"] }, "label": { "type": "string" }, "labels": { "$ref": "#/definitions/stringMap" }, "description": { "type": "string" }, "descriptions": { "$ref": "#/definitions/stringMap" }, "options": { "type": "array", "items": { "$ref": "#/definitions/configFieldOption" } }, "default": {}, "required": { "type": "boolean" }, "hidden": { "type": "boolean" } } }, "configFieldOption": { "type": "object", "additionalProperties": false, "required": ["value"], "properties": { "value": { "type": "string" }, "label": { "type": "string" }, "labels": { "$ref": "#/definitions/stringMap" } } }, "hostConfig": { "type": "object", "additionalProperties": true, "properties": { "planned": { "type": "boolean" }, "completed": { "type": "boolean" }, "privacy": { "type": "string", "enum": ["original", "settings"] }, "merge": { "type": "object", "additionalProperties": true, "properties": { "available": { "type": "boolean" }, "enabled": { "type": "boolean" } } }, "createSummitLogForCompleted": { "type": "boolean" }, "categoryMapping": { "$ref": "#/definitions/stringMap" }, "connectors": { "type": "object", "additionalProperties": { "type": "object" } } } }, "metadata": { "type": "object", "additionalProperties": true, "properties": { "displayName": { "type": "string" }, "displayNames": { "$ref": "#/definitions/stringMap" }, "descriptions": { "$ref": "#/definitions/stringMap" }, "providerCategories": { "type": "object", "additionalProperties": { "$ref": "#/definitions/providerCategoryMetadata" } }, "icons": { "type": "object", "additionalProperties": true, "properties": { "light": { "type": "string" }, "dark": { "type": "string" } } } } }, "stringList": { "type": "array", "items": { "type": "string" }, "uniqueItems": true }, "stringMap": { "type": "object", "additionalProperties": { "type": "string" } }, "providerCategoryMetadata": { "type": "object", "additionalProperties": true, "properties": { "labels": { "$ref": "#/definitions/stringMap" } } } } }