Files
Netcatty/packages/plugin-contract/schema/plugin-contract.schema.json
T
2026-07-17 23:12:26 +08:00

1048 lines
35 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://netcatty.com/schemas/plugins/0.1.0-internal/plugin-contract.schema.json",
"title": "Netcatty Plugin Contract",
"description": "Canonical public contract for Netcatty plugin manifests and host RPC messages.",
"$ref": "#/$defs/PluginManifest",
"$defs": {
"JsonPrimitive": {
"oneOf": [
{ "type": "string" },
{ "type": "number" },
{ "type": "boolean" },
{ "type": "null" }
]
},
"JsonValue": {
"oneOf": [
{ "$ref": "#/$defs/JsonPrimitive" },
{ "type": "array", "items": { "$ref": "#/$defs/JsonValue" } },
{
"type": "object",
"additionalProperties": { "$ref": "#/$defs/JsonValue" }
}
]
},
"JsonValueLimits": {
"description": "Host-enforced structural limits for every plugin protocol JSON value.",
"const": {
"maxDepth": 128,
"maxNodes": 100000
}
},
"WireIntegerLimits": {
"description": "Host-enforced integer precision limit for JSON protocol fields used in identity, ordering, and correlation.",
"const": {
"maxSafeInteger": 9007199254740991
}
},
"SafeUnsignedInteger": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"SafePositiveInteger": {
"type": "integer",
"minimum": 1,
"maximum": 9007199254740991
},
"StreamLimits": {
"description": "Host-enforced identifier and byte limits for stream frames.",
"const": {
"maxStreamIdLength": 128,
"maxChunkBytes": 16777216,
"minWindowBytes": 1024,
"maxWindowBytes": 16777216,
"maxCreditBytes": 16777216
}
},
"StreamId": {
"type": "string",
"minLength": 1,
"maxLength": 128
},
"StreamChunkByteLength": {
"type": "integer",
"minimum": 0,
"maximum": 16777216
},
"StreamWindowBytes": {
"type": "integer",
"minimum": 1024,
"maximum": 16777216
},
"StreamCreditBytes": {
"type": "integer",
"minimum": 1,
"maximum": 16777216
},
"RelativePackagePath": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"pattern": "^(?!/)(?![A-Za-z]:)(?!.*//)(?!.*\\\\)(?!.*[\\u0000-\\u001F<>:\"|?*])(?!\\.{1,2}(?:/|$))(?!.*\\/\\.{1,2}(?:/|$))(?!(?:[Cc][Oo][Nn]|[Pp][Rr][Nn]|[Aa][Uu][Xx]|[Nn][Uu][Ll]|[Cc][Oo][Mm][1-9]|[Ll][Pp][Tt][1-9])(?:\\.[^/]*)?(?:/|$))(?!.*\\/(?:[Cc][Oo][Nn]|[Pp][Rr][Nn]|[Aa][Uu][Xx]|[Nn][Uu][Ll]|[Cc][Oo][Mm][1-9]|[Ll][Pp][Tt][1-9])(?:\\.[^/]*)?(?:/|$))(?!.*[. ](?:/|$))[^/]+(?:/[^/]+)*$"
},
"PluginId": {
"type": "string",
"minLength": 3,
"maxLength": 128,
"pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+$"
},
"ContributionId": {
"type": "string",
"minLength": 5,
"maxLength": 192,
"description": "A globally unique contribution id. Semantic validation requires the exact '<pluginId>.' prefix.",
"pattern": "^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+\\.[A-Za-z][A-Za-z0-9_-]*(?:\\.[A-Za-z][A-Za-z0-9_-]*)*$"
},
"FeatureId": {
"type": "string",
"minLength": 3,
"maxLength": 128,
"pattern": "^[a-z][a-z0-9-]*(?:\\.[a-z0-9][a-z0-9_-]*)+$"
},
"SecretRef": {
"description": "An opaque host-issued reference to secret material. The identifier is never sufficient authority on its own; privileged consumers must revalidate plugin ownership and operation scope.",
"type": "object",
"required": ["kind", "id"],
"properties": {
"kind": { "const": "secret" },
"id": { "type": "string", "minLength": 16, "maxLength": 256 }
},
"additionalProperties": false
},
"SemanticVersion": {
"type": "string",
"pattern": "^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[A-Za-z-][0-9A-Za-z-]*))*)?(?:\\+[0-9A-Za-z-]+(?:\\.[0-9A-Za-z-]+)*)?$"
},
"SemverRange": {
"type": "string",
"minLength": 1,
"maxLength": 128,
"description": "A node-semver compatible range. Official consumers must also run semantic validation.",
"pattern": "^(?! *$)[0-9A-Za-z<>=~^*xX|.\\-+ ]+$"
},
"LocalizedText": {
"oneOf": [
{ "type": "string", "minLength": 1, "maxLength": 512 },
{
"type": "object",
"minProperties": 1,
"propertyNames": { "pattern": "^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$" },
"additionalProperties": { "type": "string", "minLength": 1, "maxLength": 512 }
}
]
},
"PluginPermission": {
"type": "string",
"enum": [
"storage",
"settings.read",
"settings.write",
"commands",
"menus",
"views",
"clipboard.read",
"clipboard.write",
"terminal.metadata",
"terminal.output",
"terminal.input",
"terminal.decorate",
"terminal.complete",
"terminal.intercept.input",
"terminal.intercept.output",
"vault.metadata",
"vault.write",
"vault.credentials",
"sftp.read",
"sftp.write",
"network",
"filesystem.read",
"filesystem.write",
"secrets",
"companion.execute",
"provider.terminal",
"provider.connection",
"provider.authentication",
"provider.sync",
"provider.importer"
]
},
"PermissionDeclaration": {
"oneOf": [
{ "$ref": "#/$defs/PluginPermission" },
{
"type": "object",
"required": ["permission", "resources"],
"properties": {
"permission": { "$ref": "#/$defs/PluginPermission" },
"resources": {
"type": "array",
"minItems": 1,
"maxItems": 128,
"uniqueItems": true,
"items": { "type": "string", "minLength": 1, "maxLength": 2048 }
},
"reason": { "type": "string", "maxLength": 1024 }
},
"additionalProperties": false
}
]
},
"PermissionSet": {
"type": "object",
"properties": {
"required": {
"type": "array",
"maxItems": 64,
"items": { "$ref": "#/$defs/PermissionDeclaration" }
},
"optional": {
"type": "array",
"maxItems": 64,
"items": { "$ref": "#/$defs/PermissionDeclaration" }
}
},
"additionalProperties": false
},
"PluginEntrypoints": {
"type": "object",
"properties": {
"browser": { "$ref": "#/$defs/RelativePackagePath" },
"node": { "$ref": "#/$defs/RelativePackagePath" }
},
"minProperties": 1,
"additionalProperties": false
},
"PluginEngines": {
"type": "object",
"required": ["netcatty", "api"],
"properties": {
"netcatty": { "$ref": "#/$defs/SemverRange" },
"api": { "$ref": "#/$defs/SemverRange" }
},
"additionalProperties": false
},
"PluginEngineHeader": {
"type": "object",
"required": ["netcatty", "api"],
"properties": {
"netcatty": { "$ref": "#/$defs/SemverRange" },
"api": { "$ref": "#/$defs/SemverRange" }
},
"additionalProperties": true
},
"PluginFeatures": {
"type": "object",
"properties": {
"required": {
"type": "array",
"maxItems": 128,
"uniqueItems": true,
"items": { "$ref": "#/$defs/FeatureId" }
},
"optional": {
"type": "array",
"maxItems": 128,
"uniqueItems": true,
"items": { "$ref": "#/$defs/FeatureId" }
}
},
"additionalProperties": false
},
"ActivationEvent": {
"oneOf": [
{ "const": "onStartupFinished" },
{
"type": "string",
"maxLength": 256,
"pattern": "^on(?:Command|View|Provider):[a-z0-9](?:[a-z0-9-]*[a-z0-9])?(?:\\.[a-z0-9](?:[a-z0-9-]*[a-z0-9])?)+\\.[A-Za-z][A-Za-z0-9_-]*(?:\\.[A-Za-z][A-Za-z0-9_-]*)*$"
}
]
},
"ContextKeyExpression": {
"type": "string",
"minLength": 1,
"maxLength": 1024,
"description": "A host-parsed Context Key expression. Plugins must not evaluate this string themselves."
},
"ThemeIcon": {
"type": "object",
"required": ["kind", "name"],
"properties": {
"kind": { "const": "theme" },
"name": {
"type": "string",
"minLength": 1,
"maxLength": 64,
"pattern": "^[a-z][a-z0-9-]*$"
}
},
"additionalProperties": false
},
"PackageIcon": {
"type": "object",
"required": ["kind", "light"],
"properties": {
"kind": { "const": "package" },
"light": { "$ref": "#/$defs/RelativePackagePath" },
"dark": { "$ref": "#/$defs/RelativePackagePath" }
},
"additionalProperties": false
},
"IconReference": {
"oneOf": [
{ "$ref": "#/$defs/ThemeIcon" },
{ "$ref": "#/$defs/PackageIcon" }
]
},
"SettingScope": {
"type": "string",
"enum": ["application", "workspace", "host", "session", "device"]
},
"SettingControl": {
"type": "string",
"enum": [
"switch",
"radio",
"select",
"multiselect",
"text",
"textarea",
"number",
"slider",
"password",
"color",
"font",
"file",
"directory",
"keybinding",
"list",
"table"
]
},
"SettingOption": {
"type": "object",
"required": ["value", "label"],
"properties": {
"value": { "type": "string", "maxLength": 256 },
"label": { "$ref": "#/$defs/LocalizedText" },
"description": { "$ref": "#/$defs/LocalizedText" }
},
"additionalProperties": false
},
"SettingContribution": {
"type": "object",
"required": ["id", "label", "control", "scope"],
"properties": {
"id": { "$ref": "#/$defs/ContributionId" },
"label": { "$ref": "#/$defs/LocalizedText" },
"description": { "$ref": "#/$defs/LocalizedText" },
"control": { "$ref": "#/$defs/SettingControl" },
"scope": { "$ref": "#/$defs/SettingScope" },
"default": { "$ref": "#/$defs/JsonValue" },
"secret": { "type": "boolean", "default": false },
"required": { "type": "boolean", "default": false },
"options": {
"type": "array",
"maxItems": 256,
"items": { "$ref": "#/$defs/SettingOption" }
},
"minimum": { "type": "number" },
"maximum": { "type": "number" },
"step": { "type": "number", "exclusiveMinimum": 0 },
"pattern": { "type": "string", "maxLength": 512 },
"placeholder": { "$ref": "#/$defs/LocalizedText" },
"when": { "$ref": "#/$defs/ContextKeyExpression" },
"restartRequired": { "type": "boolean", "default": false },
"sync": { "type": "boolean", "default": false },
"sortable": { "type": "boolean", "default": false },
"valueSchema": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"CommandContribution": {
"type": "object",
"required": ["id", "title"],
"properties": {
"id": { "$ref": "#/$defs/ContributionId" },
"title": { "$ref": "#/$defs/LocalizedText" },
"category": { "$ref": "#/$defs/LocalizedText" },
"description": { "$ref": "#/$defs/LocalizedText" },
"icon": { "$ref": "#/$defs/IconReference" },
"enablement": { "$ref": "#/$defs/ContextKeyExpression" }
},
"additionalProperties": false
},
"KeybindingContribution": {
"type": "object",
"required": ["command", "key"],
"properties": {
"command": { "$ref": "#/$defs/ContributionId" },
"key": { "type": "string", "minLength": 1, "maxLength": 128 },
"mac": { "type": "string", "minLength": 1, "maxLength": 128 },
"linux": { "type": "string", "minLength": 1, "maxLength": 128 },
"windows": { "type": "string", "minLength": 1, "maxLength": 128 },
"when": { "$ref": "#/$defs/ContextKeyExpression" },
"args": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"MenuLocation": {
"type": "string",
"enum": [
"commandPalette",
"application",
"host/context",
"terminal/context",
"terminal/toolbar",
"statusBar"
]
},
"MenuContribution": {
"type": "object",
"required": ["command", "location"],
"properties": {
"command": { "$ref": "#/$defs/ContributionId" },
"alt": { "$ref": "#/$defs/ContributionId" },
"location": { "$ref": "#/$defs/MenuLocation" },
"title": { "$ref": "#/$defs/LocalizedText" },
"icon": { "$ref": "#/$defs/IconReference" },
"group": { "type": "string", "maxLength": 128 },
"order": { "type": "number" },
"when": { "$ref": "#/$defs/ContextKeyExpression" },
"enablement": { "$ref": "#/$defs/ContextKeyExpression" },
"checked": { "$ref": "#/$defs/ContextKeyExpression" },
"showKeybinding": { "type": "boolean", "default": true }
},
"additionalProperties": false
},
"ViewLocation": {
"type": "string",
"enum": ["aside", "panel", "tab", "modal", "settings"]
},
"ViewContribution": {
"type": "object",
"required": ["id", "title", "location", "entry"],
"properties": {
"id": { "$ref": "#/$defs/ContributionId" },
"title": { "$ref": "#/$defs/LocalizedText" },
"location": { "$ref": "#/$defs/ViewLocation" },
"entry": { "$ref": "#/$defs/RelativePackagePath" },
"icon": { "$ref": "#/$defs/IconReference" },
"order": { "type": "number" },
"when": { "$ref": "#/$defs/ContextKeyExpression" },
"retainContextWhenHidden": { "type": "boolean", "default": false }
},
"additionalProperties": false
},
"ProviderKind": {
"type": "string",
"enum": [
"terminal.completion",
"terminal.decoration",
"terminal.link",
"terminal.hover",
"terminal.matcher",
"terminal.semantic",
"terminal.prompt",
"terminal.background",
"terminal.interceptor.input",
"terminal.interceptor.output",
"connection",
"authentication",
"sync",
"importer"
]
},
"ProviderContribution": {
"type": "object",
"required": ["id", "label", "kind"],
"properties": {
"id": { "$ref": "#/$defs/ContributionId" },
"label": { "$ref": "#/$defs/LocalizedText" },
"description": { "$ref": "#/$defs/LocalizedText" },
"kind": { "$ref": "#/$defs/ProviderKind" },
"capabilities": {
"type": "array",
"maxItems": 64,
"uniqueItems": true,
"items": { "$ref": "#/$defs/FeatureId" }
},
"configurationSchema": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"CompanionPlatform": {
"type": "string",
"enum": [
"darwin-arm64",
"darwin-x64",
"linux-arm64",
"linux-x64",
"win32-arm64",
"win32-x64"
]
},
"CompanionExecutableVariant": {
"type": "object",
"required": ["path", "platforms", "sha256"],
"properties": {
"path": { "$ref": "#/$defs/RelativePackagePath" },
"platforms": {
"type": "array",
"minItems": 1,
"maxItems": 6,
"uniqueItems": true,
"items": { "$ref": "#/$defs/CompanionPlatform" }
},
"sha256": { "type": "string", "pattern": "^[a-f0-9]{64}$" }
},
"additionalProperties": false
},
"CompanionExecutable": {
"type": "object",
"required": ["id", "variants"],
"properties": {
"id": { "$ref": "#/$defs/ContributionId" },
"variants": {
"type": "array",
"minItems": 1,
"maxItems": 12,
"items": { "$ref": "#/$defs/CompanionExecutableVariant" }
},
"permissions": {
"type": "array",
"maxItems": 32,
"uniqueItems": true,
"items": { "$ref": "#/$defs/PluginPermission" }
}
},
"additionalProperties": false
},
"PluginContributions": {
"type": "object",
"properties": {
"settings": { "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/SettingContribution" } },
"commands": { "type": "array", "maxItems": 512, "items": { "$ref": "#/$defs/CommandContribution" } },
"keybindings": { "type": "array", "maxItems": 1024, "items": { "$ref": "#/$defs/KeybindingContribution" } },
"menus": { "type": "array", "maxItems": 1024, "items": { "$ref": "#/$defs/MenuContribution" } },
"views": { "type": "array", "maxItems": 128, "items": { "$ref": "#/$defs/ViewContribution" } },
"providers": { "type": "array", "maxItems": 256, "items": { "$ref": "#/$defs/ProviderContribution" } }
},
"additionalProperties": false
},
"PluginManifestHeader": {
"type": "object",
"required": ["manifestVersion", "id", "version", "engines"],
"properties": {
"$schema": { "type": "string", "format": "uri-reference" },
"manifestVersion": { "type": "integer", "minimum": 1, "maximum": 65535 },
"id": { "$ref": "#/$defs/PluginId" },
"version": { "$ref": "#/$defs/SemanticVersion" },
"engines": { "$ref": "#/$defs/PluginEngineHeader" }
},
"additionalProperties": true
},
"PluginManifest": {
"type": "object",
"required": ["manifestVersion", "id", "name", "version", "publisher", "engines", "main"],
"properties": {
"$schema": { "type": "string", "format": "uri-reference" },
"manifestVersion": { "const": 1 },
"id": { "$ref": "#/$defs/PluginId" },
"name": { "type": "string", "minLength": 1, "maxLength": 128 },
"displayName": { "$ref": "#/$defs/LocalizedText" },
"description": { "$ref": "#/$defs/LocalizedText" },
"version": { "$ref": "#/$defs/SemanticVersion" },
"publisher": { "type": "string", "minLength": 1, "maxLength": 128 },
"license": { "type": "string", "maxLength": 128 },
"homepage": { "type": "string", "format": "uri" },
"repository": { "type": "string", "format": "uri" },
"engines": { "$ref": "#/$defs/PluginEngines" },
"features": { "$ref": "#/$defs/PluginFeatures" },
"main": { "$ref": "#/$defs/PluginEntrypoints" },
"activationEvents": {
"type": "array",
"maxItems": 256,
"uniqueItems": true,
"items": { "$ref": "#/$defs/ActivationEvent" }
},
"permissions": { "$ref": "#/$defs/PermissionSet" },
"contributes": { "$ref": "#/$defs/PluginContributions" },
"companionExecutables": {
"type": "array",
"maxItems": 32,
"items": { "$ref": "#/$defs/CompanionExecutable" }
}
},
"additionalProperties": false
},
"RpcId": {
"oneOf": [
{ "type": "string", "minLength": 1, "maxLength": 128 },
{ "$ref": "#/$defs/SafeUnsignedInteger" }
]
},
"NullableRpcId": {
"oneOf": [
{ "$ref": "#/$defs/RpcId" },
{ "type": "null" }
]
},
"RpcRequest": {
"type": "object",
"description": "A generic request. Reserved methods with dedicated schemas are excluded and must validate against their exact contract.",
"required": ["jsonrpc", "id", "method"],
"properties": {
"jsonrpc": { "const": "2.0" },
"id": { "$ref": "#/$defs/RpcId" },
"method": { "type": "string", "minLength": 1, "maxLength": 256 },
"params": { "$ref": "#/$defs/JsonValue" },
"deadlineMs": { "type": "integer", "minimum": 1, "maximum": 300000 },
"cancellationId": { "type": "string", "minLength": 1, "maxLength": 128 }
},
"not": {
"required": ["method"],
"properties": {
"method": { "enum": ["plugin.initialize", "$/cancelRequest", "$/progress"] }
}
},
"additionalProperties": false
},
"RpcNotification": {
"type": "object",
"description": "A generic notification. Reserved notifications with dedicated schemas are excluded and must validate against their exact contract.",
"required": ["jsonrpc", "method"],
"properties": {
"jsonrpc": { "const": "2.0" },
"method": { "type": "string", "minLength": 1, "maxLength": 256 },
"params": { "$ref": "#/$defs/JsonValue" }
},
"not": {
"required": ["method"],
"properties": {
"method": { "enum": ["plugin.initialize", "$/cancelRequest", "$/progress"] }
}
},
"additionalProperties": false
},
"RpcSuccess": {
"type": "object",
"required": ["jsonrpc", "id", "result"],
"properties": {
"jsonrpc": { "const": "2.0" },
"id": { "$ref": "#/$defs/RpcId" },
"result": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"JsonRpcStandardErrorCode": {
"type": "integer",
"enum": [-32700, -32600, -32601, -32602, -32603]
},
"PluginWireErrorCode": {
"type": "integer",
"enum": [-32001, -32002, -32003, -32004, -32005, -32006, -32007, -32008, -32009, -32010, -32011, -32012, -32013, -32014, -32015, -32016]
},
"PluginErrorName": {
"type": "string",
"enum": [
"cancelled",
"unknown",
"deadline_exceeded",
"invalid_argument",
"not_found",
"already_exists",
"permission_denied",
"resource_exhausted",
"failed_precondition",
"aborted",
"out_of_range",
"unavailable",
"unsupported",
"internal",
"data_loss",
"unauthenticated"
]
},
"PluginErrorData": {
"type": "object",
"required": ["pluginCode"],
"properties": {
"pluginCode": { "$ref": "#/$defs/PluginErrorName" },
"details": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"RpcErrorCode": {
"oneOf": [
{ "$ref": "#/$defs/JsonRpcStandardErrorCode" },
{ "$ref": "#/$defs/PluginWireErrorCode" }
]
},
"RpcErrorObject": {
"type": "object",
"required": ["code", "message"],
"properties": {
"code": { "$ref": "#/$defs/RpcErrorCode" },
"message": { "type": "string", "minLength": 1, "maxLength": 2048 },
"data": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
"RpcFailure": {
"type": "object",
"required": ["jsonrpc", "id", "error"],
"properties": {
"jsonrpc": { "const": "2.0" },
"id": { "$ref": "#/$defs/NullableRpcId" },
"error": { "$ref": "#/$defs/RpcErrorObject" }
},
"additionalProperties": false
},
"ProgressToken": {
"$ref": "#/$defs/RpcId"
},
"ProgressBegin": {
"type": "object",
"required": ["kind", "title"],
"properties": {
"kind": { "const": "begin" },
"title": { "type": "string", "minLength": 1, "maxLength": 256 },
"message": { "type": "string", "maxLength": 1024 },
"percentage": { "type": "number", "minimum": 0, "maximum": 100 },
"cancellable": { "type": "boolean" }
},
"additionalProperties": false
},
"ProgressReport": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": { "const": "report" },
"message": { "type": "string", "maxLength": 1024 },
"percentage": { "type": "number", "minimum": 0, "maximum": 100 },
"increment": { "type": "number", "minimum": 0, "maximum": 100 }
},
"not": {
"required": ["percentage", "increment"],
"properties": {
"percentage": true,
"increment": true
}
},
"additionalProperties": false
},
"ProgressEnd": {
"type": "object",
"required": ["kind"],
"properties": {
"kind": { "const": "end" },
"message": { "type": "string", "maxLength": 1024 }
},
"additionalProperties": false
},
"ProgressValue": {
"oneOf": [
{ "$ref": "#/$defs/ProgressBegin" },
{ "$ref": "#/$defs/ProgressReport" },
{ "$ref": "#/$defs/ProgressEnd" }
]
},
"RpcProgressNotification": {
"type": "object",
"required": ["jsonrpc", "method", "params"],
"properties": {
"jsonrpc": { "const": "2.0" },
"method": { "const": "$/progress" },
"params": {
"type": "object",
"required": ["token", "value"],
"properties": {
"token": { "$ref": "#/$defs/ProgressToken" },
"value": { "$ref": "#/$defs/ProgressValue" }
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"RpcCancel": {
"type": "object",
"required": ["jsonrpc", "method", "params"],
"properties": {
"jsonrpc": { "const": "2.0" },
"method": { "const": "$/cancelRequest" },
"params": {
"type": "object",
"required": ["cancellationId"],
"properties": {
"cancellationId": { "type": "string", "minLength": 1, "maxLength": 128 }
},
"additionalProperties": false
}
},
"additionalProperties": false
},
"StreamChunkData": {
"oneOf": [
{
"type": "object",
"required": ["encoding", "value", "byteLength"],
"properties": {
"encoding": { "const": "json" },
"value": { "$ref": "#/$defs/JsonValue" },
"byteLength": { "$ref": "#/$defs/StreamChunkByteLength" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["encoding", "value", "byteLength"],
"properties": {
"encoding": { "const": "base64" },
"value": {
"type": "string",
"maxLength": 22369624,
"contentEncoding": "base64"
},
"byteLength": { "$ref": "#/$defs/StreamChunkByteLength" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["encoding", "byteLength"],
"properties": {
"encoding": { "const": "transfer" },
"byteLength": { "$ref": "#/$defs/StreamChunkByteLength" }
},
"additionalProperties": false
}
]
},
"StreamFrame": {
"oneOf": [
{
"type": "object",
"required": ["streamId", "sequence", "kind", "windowBytes"],
"properties": {
"streamId": { "$ref": "#/$defs/StreamId" },
"sequence": { "const": 0 },
"kind": { "const": "open" },
"windowBytes": { "$ref": "#/$defs/StreamWindowBytes" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["streamId", "sequence", "kind", "data"],
"properties": {
"streamId": { "$ref": "#/$defs/StreamId" },
"sequence": { "$ref": "#/$defs/SafePositiveInteger" },
"kind": { "const": "chunk" },
"data": { "$ref": "#/$defs/StreamChunkData" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["streamId", "sequence", "kind"],
"properties": {
"streamId": { "$ref": "#/$defs/StreamId" },
"sequence": { "$ref": "#/$defs/SafePositiveInteger" },
"kind": { "enum": ["end", "cancel"] }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["streamId", "sequence", "kind", "error"],
"properties": {
"streamId": { "$ref": "#/$defs/StreamId" },
"sequence": { "$ref": "#/$defs/SafePositiveInteger" },
"kind": { "const": "error" },
"error": { "$ref": "#/$defs/RpcErrorObject" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["streamId", "sequence", "kind", "creditBytes"],
"properties": {
"streamId": { "$ref": "#/$defs/StreamId" },
"sequence": { "$ref": "#/$defs/SafeUnsignedInteger" },
"kind": { "const": "windowUpdate" },
"creditBytes": { "$ref": "#/$defs/StreamCreditBytes" }
},
"additionalProperties": false
}
]
},
"RuntimeInitializeParams": {
"type": "object",
"required": ["netcattyVersion", "apiVersion", "supportedFeatures"],
"properties": {
"netcattyVersion": { "$ref": "#/$defs/SemanticVersion" },
"apiVersion": { "$ref": "#/$defs/SemanticVersion" },
"supportedFeatures": {
"type": "array",
"maxItems": 256,
"uniqueItems": true,
"items": { "$ref": "#/$defs/FeatureId" }
}
},
"additionalProperties": false
},
"RuntimeInitializeResult": {
"type": "object",
"required": ["pluginId", "pluginVersion", "apiVersion", "enabledFeatures"],
"properties": {
"pluginId": { "$ref": "#/$defs/PluginId" },
"pluginVersion": { "$ref": "#/$defs/SemanticVersion" },
"apiVersion": { "$ref": "#/$defs/SemanticVersion" },
"enabledFeatures": {
"type": "array",
"maxItems": 256,
"uniqueItems": true,
"items": { "$ref": "#/$defs/FeatureId" }
}
},
"additionalProperties": false
},
"RuntimeInitializeRequest": {
"type": "object",
"required": ["jsonrpc", "id", "method", "params"],
"properties": {
"jsonrpc": { "const": "2.0" },
"id": { "$ref": "#/$defs/RpcId" },
"method": { "const": "plugin.initialize" },
"params": { "$ref": "#/$defs/RuntimeInitializeParams" },
"deadlineMs": { "type": "integer", "minimum": 1, "maximum": 300000 },
"cancellationId": { "type": "string", "minLength": 1, "maxLength": 128 }
},
"additionalProperties": false
},
"RuntimeInitializeSuccess": {
"type": "object",
"required": ["jsonrpc", "id", "result"],
"properties": {
"jsonrpc": { "const": "2.0" },
"id": { "$ref": "#/$defs/RpcId" },
"result": { "$ref": "#/$defs/RuntimeInitializeResult" }
},
"additionalProperties": false
},
"RpcMessage": {
"description": "A mutually exclusive RPC wire envelope. Reserved inbound methods use their exact schemas. Successful responses require method-specific validation through request correlation.",
"oneOf": [
{ "$ref": "#/$defs/RpcRequest" },
{ "$ref": "#/$defs/RpcNotification" },
{ "$ref": "#/$defs/RpcSuccess" },
{ "$ref": "#/$defs/RpcFailure" },
{ "$ref": "#/$defs/RpcCancel" },
{ "$ref": "#/$defs/RpcProgressNotification" },
{ "$ref": "#/$defs/RuntimeInitializeRequest" }
]
},
"PermissionGrantScope": {
"type": "string",
"enum": ["once", "session", "application", "always"]
},
"PermissionRequest": {
"type": "object",
"required": ["requestId", "pluginId", "permission", "reason"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"pluginId": { "$ref": "#/$defs/PluginId" },
"permission": { "$ref": "#/$defs/PluginPermission" },
"resources": {
"type": "array",
"maxItems": 128,
"uniqueItems": true,
"items": { "type": "string", "minLength": 1, "maxLength": 2048 }
},
"reason": { "type": "string", "minLength": 1, "maxLength": 1024 },
"operationId": { "type": "string", "minLength": 1, "maxLength": 128 }
},
"additionalProperties": false
},
"PermissionDecision": {
"oneOf": [
{
"type": "object",
"required": ["requestId", "decision", "scope"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"decision": { "const": "allow" },
"scope": { "$ref": "#/$defs/PermissionGrantScope" },
"resources": {
"type": "array",
"maxItems": 128,
"uniqueItems": true,
"items": { "type": "string", "minLength": 1, "maxLength": 2048 }
}
},
"additionalProperties": false
},
{
"type": "object",
"required": ["requestId", "decision"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"decision": { "enum": ["deny", "cancel"] }
},
"additionalProperties": false
}
]
},
"ProviderRequest": {
"type": "object",
"required": ["providerId", "operation", "requestId"],
"properties": {
"providerId": { "$ref": "#/$defs/ContributionId" },
"operation": { "type": "string", "minLength": 1, "maxLength": 128 },
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"payload": { "$ref": "#/$defs/JsonValue" },
"deadlineMs": { "type": "integer", "minimum": 1, "maximum": 300000 },
"cancellationId": { "type": "string", "minLength": 1, "maxLength": 128 }
},
"additionalProperties": false
},
"ProviderResult": {
"oneOf": [
{
"type": "object",
"required": ["requestId", "status", "result"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"status": { "const": "ok" },
"result": { "$ref": "#/$defs/JsonValue" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["requestId", "status"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"status": { "const": "cancelled" }
},
"additionalProperties": false
},
{
"type": "object",
"required": ["requestId", "status", "error"],
"properties": {
"requestId": { "type": "string", "minLength": 1, "maxLength": 128 },
"status": { "const": "failed" },
"error": { "$ref": "#/$defs/RpcErrorObject" }
},
"additionalProperties": false
}
]
}
}
}