"description":"Connection protocols whose per-host login core stores, encrypts, shares and syncs for the plugin.",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id"],
"properties":{
"id":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,31}$",
"not":{
"enum":["ssh"]
}
},
"credentialFields":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["key"],
"properties":{
"key":{
"type":"string",
"pattern":"^[a-zA-Z][a-zA-Z0-9]{0,31}$",
"not":{
"enum":[
"username",
"password",
"authType",
"credentialId"
]
}
},
"secret":{
"type":"boolean"
}
}
}
},
"defaultPort":{
"type":"integer",
"minimum":1,
"maximum":65535
},
"hostLoginFallback":{
"type":"array",
"uniqueItems":true,
"items":{
"enum":["username","password"]
}
}
}
}
},
"keybindingActions":{
"type":"array",
"description":"Keybinding actions the plugin adds, with the parameters a saved binding carries.",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id"],
"properties":{
"id":{
"type":"string",
"pattern":"^[a-zA-Z][a-zA-Z0-9.-]{0,63}$",
"not":{
"enum":[
"nextTab",
"previousTab",
"openCommandPalette",
"reconnectSession"
]
}
},
"params":{
"type":"object",
"propertyNames":{
"pattern":"^[a-zA-Z][a-zA-Z0-9]{0,31}$",
"not":{
"const":"type"
}
},
"additionalProperties":{
"type":"object",
"additionalProperties":false,
"required":["type"],
"properties":{
"type":{
"enum":["string","boolean"]
},
"required":{
"type":"boolean"
},
"pattern":{
"type":"string"
},
"maxLength":{
"type":"integer",
"minimum":1
},
"syncEntity":{
"type":"string",
"pattern":"^[a-zA-Z][a-zA-Z0-9]*$"
}
}
}
}
}
}
},
"syncEntities":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"description":"Wire names of the sync entities this plugin registers.",
"items":{
"type":"string",
"pattern":"^[a-zA-Z][a-zA-Z0-9]*$"
}
},
"guestViews":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]*$"
}
},
"auth":{
"type":"object",
"additionalProperties":false,
"properties":{
"sshAuthTypes":{
"type":"array",
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,63}$"
}
},
"loginMethods":{
"type":"array",
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,63}$"
}
},
"secondFactors":{
"type":"array",
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,63}$"
}
},
"secretSchemes":{
"type":"array",
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,63}$"
}
},
"keyboardInteractive":{
"type":"array",
"items":{
"type":"string",
"pattern":"^[a-z][a-z0-9-]{0,63}$"
}
}
}
},
"panels":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","titleKey"],
"properties":{
"id":{
"type":"string",
"minLength":1
},
"titleKey":{
"type":"string",
"minLength":1
},
"icon":{
"type":"string",
"minLength":1
}
}
}
},
"dashboardCards":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","titleKey"],
"properties":{
"id":{
"type":"string",
"minLength":1
},
"titleKey":{
"type":"string",
"minLength":1
},
"icon":{
"type":"string",
"minLength":1
}
}
}
},
"actions":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","titleKey","handler"],
"properties":{
"id":{
"type":"string",
"pattern":"^[a-z0-9-]+(\\.[a-zA-Z0-9-]+)+$"
},
"titleKey":{
"type":"string",
"minLength":1
},
"handler":{
"type":"string",
"pattern":"^[A-Za-z_$][A-Za-z0-9_$]*$"
},
"icon":{
"type":"string",
"minLength":1
},
"permission":{
"type":"string",
"minLength":1
},
"slot":{
"type":"string",
"minLength":1
},
"kind":{
"type":"string",
"enum":["button","component"]
}
}
}
},
"actionSlots":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","accepts"],
"properties":{
"id":{
"type":"string",
"pattern":"^[a-z0-9-]+(\\.[a-zA-Z0-9-]+)+$"
},
"accepts":{
"type":"array",
"minItems":1,
"items":{
"type":"string",
"enum":["button","component"]
}
},
"descriptionKey":{
"type":"string",
"minLength":1
}
}
}
},
"permissions":{
"type":"array",
"description":"Role permissions this plugin contributes. Core registers each as <pluginId>.<name>.",
"items":{
"type":"object",
"additionalProperties":false,
"required":["name","titleKey","descriptionKey"],
"properties":{
"name":{
"type":"string",
"description":"Plugin-relative name. May contain dots. Must not start with a core group or this plugin's id.",
"pattern":"^[a-z0-9_-]+(\\.[a-z0-9_-]+)*$"
},
"titleKey":{
"type":"string",
"minLength":1
},
"descriptionKey":{
"type":"string",
"minLength":1
},
"defaultRoles":{
"type":"array",
"description":"System roles that hold this the first time it is seen.",
"items":{
"type":"string",
"enum":["admin","user"]
}
}
}
}
},
"settings":{
"type":"object",
"description":"Settings fields core renders on the plugin's settings page and in the host editor.",
"additionalProperties":false,
"properties":{
"admin":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["key","type"],
"properties":{
"key":{
"type":"string",
"description":"Storage key, unique within its scope.",
"pattern":"^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
},
"type":{
"type":"string",
"enum":[
"boolean",
"string",
"number",
"select",
"multiselect",
"secret",
"textarea",
"json",
"custom"
]
},
"labelKey":{
"type":"string",
"minLength":1,
"description":"Required for every type except \"custom\"."
},
"descriptionKey":{
"type":"string",
"minLength":1
},
"placeholderKey":{
"type":"string",
"minLength":1
},
"default":{
"description":"Value used until one is written."
},
"options":{
"type":"array",
"description":"select and multiselect only.",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["value","labelKey"],
"properties":{
"value":{
"type":"string",
"minLength":1
},
"labelKey":{
"type":"string",
"minLength":1
}
}
}
},
"min":{
"type":"number",
"description":"number fields only."
},
"max":{
"type":"number",
"description":"number fields only."
},
"requires":{
"type":"string",
"description":"Key of a boolean field in the same scope that must be on."
},
"permission":{
"type":"string",
"minLength":1,
"description":"Permission needed to write it. Admin fields default to admin.plugins.manage."
},
"group":{
"type":"string",
"minLength":1,
"description":"Section heading this field sits under."
},
"component":{
"type":"string",
"minLength":1,
"description":"Registered component id. Required when type is \"custom\"."
},
"hidden":{
"type":"boolean",
"description":"Stored and validated, but not drawn by the generic settings form."
}
}
}
},
"user":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["key","type"],
"properties":{
"key":{
"type":"string",
"description":"Storage key, unique within its scope.",
"pattern":"^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
},
"type":{
"type":"string",
"enum":[
"boolean",
"string",
"number",
"select",
"multiselect",
"secret",
"textarea",
"json",
"custom"
]
},
"labelKey":{
"type":"string",
"minLength":1,
"description":"Required for every type except \"custom\"."
},
"descriptionKey":{
"type":"string",
"minLength":1
},
"placeholderKey":{
"type":"string",
"minLength":1
},
"default":{
"description":"Value used until one is written."
},
"options":{
"type":"array",
"description":"select and multiselect only.",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["value","labelKey"],
"properties":{
"value":{
"type":"string",
"minLength":1
},
"labelKey":{
"type":"string",
"minLength":1
}
}
}
},
"min":{
"type":"number",
"description":"number fields only."
},
"max":{
"type":"number",
"description":"number fields only."
},
"requires":{
"type":"string",
"description":"Key of a boolean field in the same scope that must be on."
},
"permission":{
"type":"string",
"minLength":1,
"description":"Permission needed to write it. Admin fields default to admin.plugins.manage."
},
"group":{
"type":"string",
"minLength":1,
"description":"Section heading this field sits under."
},
"component":{
"type":"string",
"minLength":1,
"description":"Registered component id. Required when type is \"custom\"."
},
"hidden":{
"type":"boolean",
"description":"Stored and validated, but not drawn by the generic settings form."
}
}
}
},
"host":{
"type":"object",
"additionalProperties":false,
"required":["fields"],
"properties":{
"enableKey":{
"type":"string",
"pattern":"^[a-zA-Z][a-zA-Z0-9_-]{0,63}$",
"description":"Boolean rendered first, gating the rest of the section."
},
"enableLabelKey":{
"type":"string",
"minLength":1
},
"enableDescriptionKey":{
"type":"string",
"minLength":1
},
"fields":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["key","type"],
"properties":{
"key":{
"type":"string",
"description":"Storage key, unique within its scope.",
"pattern":"^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
},
"type":{
"type":"string",
"enum":[
"boolean",
"string",
"number",
"select",
"multiselect",
"secret",
"textarea",
"json",
"custom"
]
},
"labelKey":{
"type":"string",
"minLength":1,
"description":"Required for every type except \"custom\"."
},
"descriptionKey":{
"type":"string",
"minLength":1
},
"placeholderKey":{
"type":"string",
"minLength":1
},
"default":{
"description":"Value used until one is written."
},
"options":{
"type":"array",
"description":"select and multiselect only.",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["value","labelKey"],
"properties":{
"value":{
"type":"string",
"minLength":1
},
"labelKey":{
"type":"string",
"minLength":1
}
}
}
},
"min":{
"type":"number",
"description":"number fields only."
},
"max":{
"type":"number",
"description":"number fields only."
},
"requires":{
"type":"string",
"description":"Key of a boolean field in the same scope that must be on."
},
"permission":{
"type":"string",
"minLength":1,
"description":"Permission needed to write it. Admin fields default to admin.plugins.manage."
},
"group":{
"type":"string",
"minLength":1,
"description":"Section heading this field sits under."
},
"component":{
"type":"string",
"minLength":1,
"description":"Registered component id. Required when type is \"custom\"."
},
"hidden":{
"type":"boolean",
"description":"Stored and validated, but not drawn by the generic settings form."
},
"defaultFrom":{
"type":"string",
"minLength":1,
"description":"Deprecated and ignored. Host defaults cover every host field."
},
"defaultable":{
"type":"boolean",
"description":"Whether the field can have a host default. On by default for non-secret fields."
},
"defaultLevels":{
"type":"array",
"minItems":1,
"items":{"enum":["admin","user","folder"]},
"description":"Levels that may set a default for the field. All three by default."
},
"personal":{
"type":"boolean",
"description":"A look-and-feel value: a user a host is shared with gets their own default for it."
},
"shareRead":{
"type":"string",
"enum":["connect","view","edit","manage"],
"description":"Lowest share level whose recipients see the value in the host payload."
},
"ownerOnly":{
"type":"boolean",
"description":"Only the host's owner may change it."
},
"secretKeys":{
"type":"array",
"minItems":1,
"items":{
"type":"string",
"minLength":1
},
"description":"JSON fields only: keys inside the stored object that hold secrets."
}
}
}
},
"enableDefault":{
"type":"boolean",
"description":"What the enable switch reads before a host saves it. Off by default."
},
"editorGroup":{
"enum":["top","ssh"],
"description":"Host editor strip the generated tab sits in. Defaults to top."
},
"editorOrder":{
"type":"number",
"description":"Position among that strip's tabs, core ones included."
}
}
}
}
},
"hostCapability":{
"description":"A host-editor checkbox backed by a boolean column on the host record. Reshaped by a later step.",
"oneOf":[
{
"$ref":"#/$defs/hostCapability"
},
{
"type":"array",
"minItems":1,
"items":{
"$ref":"#/$defs/hostCapability"
}
}
]
},
"http":{
"type":"object",
"additionalProperties":false,
"description":"HTTP options for the plugin's /plugin-api/<id>/ router.",
"properties":{
"adminImpersonation":{
"type":"boolean",
"description":"An admin may call the plugin's routes on behalf of another user with the X-Admin-Target-User header."
},
"legacyPaths":{
"type":"array",
"description":"Old URLs under /<plugin id>/ served by the plugin's router with that prefix removed.",
"items":{
"type":"string",
"pattern":"^/[a-z][a-z0-9-]*(/[A-Za-z0-9_.-]+)+$"
}
},
"legacyRedirects":{
"type":"array",
"description":"Old URLs outside the plugin's namespace, redirected to a path in its router with the rest of the path and the query kept.",
"items":{
"type":"object",
"additionalProperties":false,
"required":["from","to"],
"properties":{
"from":{
"type":"string",
"pattern":"^(/[A-Za-z0-9_.-]+)+$"
},
"to":{
"type":"string",
"pattern":"^(/[A-Za-z0-9_.-]+)+$"
},
"status":{
"enum":[307,308]
}
}
}
}
}
},
"uiPresets":{
"type":"object",
"additionalProperties":false,
"required":["simple","balanced","advanced"],
"description":"The plugin's Appearance defaults for each interface preset, read with usePluginUiPreferences.",
"properties":{
"simple":{
"type":"object",
"additionalProperties":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"number"
},
{
"type":"string"
},
{
"type":"array",
"items":{
"type":"string"
}
}
]
}
},
"balanced":{
"type":"object",
"additionalProperties":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"number"
},
{
"type":"string"
},
{
"type":"array",
"items":{
"type":"string"
}
}
]
}
},
"advanced":{
"type":"object",
"additionalProperties":{
"anyOf":[
{
"type":"boolean"
},
{
"type":"number"
},
{
"type":"string"
},
{
"type":"array",
"items":{
"type":"string"
}
}
]
}
}
}
},
"uses":{
"type":"array",
"minItems":1,
"uniqueItems":true,
"description":"Other plugins' action, slot and extension point ids this plugin calls, fills or extends.",
"items":{
"type":"string",
"pattern":"^[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
}
}
}
},
"backend":{
"type":"string",
"minLength":1,
"description":"Built backend entry, relative to the plugin root. Defaults to dist/backend.js."
},
"frontend":{
"type":"string",
"minLength":1,
"description":"Built frontend entry, relative to the plugin root. Defaults to dist/frontend.js."
},
"locales":{
"type":"string",
"minLength":1,
"description":"Locales directory, relative to the plugin root. Defaults to locales."
},
"platforms":{
"type":"array",
"minItems":1,
"items":{
"type":"string",
"enum":["linux","win32","darwin"]
}
},
"desktop":{
"type":"string",
"enum":["mirror","local","server"],
"description":"How a desktop linked to a server treats this plugin: mirror follows the server, local is decided on each desktop, server never runs on a linked desktop. Defaults to mirror."
},
"nativeDependencies":{
"type":"array",
"minItems":1,
"description":"Bare npm package names this plugin depends on that carry a native (.node) binding. The build never bundles them: they stay a real dependency in the plugin's own package.json and are resolved from node_modules at runtime, the same as a host-provided package, so the compiled native binary is never copied into the JS bundle.",