@termix-ssh/plugin-sdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (236) hide show
  1. package/README.md +52 -0
  2. package/cli/commands/build.mjs +246 -0
  3. package/cli/commands/migrations.mjs +248 -0
  4. package/cli/commands/pack.mjs +42 -0
  5. package/cli/commands/sign.mjs +83 -0
  6. package/cli/commands/test.mjs +33 -0
  7. package/cli/commands/validate.mjs +215 -0
  8. package/cli/index.mjs +65 -0
  9. package/cli/lib/changelog.mjs +126 -0
  10. package/cli/lib/externals.mjs +46 -0
  11. package/cli/lib/plugin-dir.mjs +29 -0
  12. package/cli/lib/signing.mjs +86 -0
  13. package/cli/lib/static-url-imports.mjs +54 -0
  14. package/cli/lib/tmxplug.mjs +106 -0
  15. package/cli/patches/guacamole-common-js-flush.cjs +76 -0
  16. package/cli/patches/xterm-android-ime.cjs +130 -0
  17. package/client.d.ts +13 -0
  18. package/dist/backend.d.ts +1777 -0
  19. package/dist/backend.js +84 -0
  20. package/dist/capabilities.d.ts +38 -0
  21. package/dist/capabilities.js +71 -0
  22. package/dist/db.d.ts +112 -0
  23. package/dist/db.js +189 -0
  24. package/dist/ddl.d.ts +76 -0
  25. package/dist/ddl.js +678 -0
  26. package/dist/desktop.d.ts +346 -0
  27. package/dist/desktop.js +5 -0
  28. package/dist/frontend.d.ts +1206 -0
  29. package/dist/frontend.js +388 -0
  30. package/dist/host/chunk-F3SDZDDG.js +6017 -0
  31. package/dist/host/chunk-XGWE7BTJ.js +90 -0
  32. package/dist/host/chunk-XH5NXL6Y.js +56314 -0
  33. package/dist/host/chunk-YC2MAKSP.js +14 -0
  34. package/dist/host/linked-server-FZGWQW32.js +12 -0
  35. package/dist/host/rbac-api-6KDMBVDZ.js +52 -0
  36. package/dist/host/testing-host.js +414 -0
  37. package/dist/host/theme.css +91 -0
  38. package/dist/host/types/src/types/auth-protocols.d.ts +10 -0
  39. package/dist/host/types/src/types/connection-log.d.ts +13 -0
  40. package/dist/host/types/src/types/credential-sidebar-preferences.d.ts +38 -0
  41. package/dist/host/types/src/types/host-defaults.d.ts +60 -0
  42. package/dist/host/types/src/types/host-sidebar-preferences.d.ts +55 -0
  43. package/dist/host/types/src/types/index.d.ts +298 -0
  44. package/dist/host/types/src/types/keybindings.d.ts +27 -0
  45. package/dist/host/types/src/types/ui-preferences.d.ts +102 -0
  46. package/dist/host/types/src/types/ui-types.d.ts +260 -0
  47. package/dist/host/types/src/ui/api/admin-user-data-api.d.ts +11 -0
  48. package/dist/host/types/src/ui/api/auth-methods-api.d.ts +63 -0
  49. package/dist/host/types/src/ui/api/credential-sidebar-preferences-api.d.ts +3 -0
  50. package/dist/host/types/src/ui/api/credentials-api.d.ts +56 -0
  51. package/dist/host/types/src/ui/api/dashboard-api.d.ts +23 -0
  52. package/dist/host/types/src/ui/api/external-account-api.d.ts +8 -0
  53. package/dist/host/types/src/ui/api/host-sidebar-preferences-api.d.ts +3 -0
  54. package/dist/host/types/src/ui/api/host-status-api.d.ts +11 -0
  55. package/dist/host/types/src/ui/api/open-tabs-api.d.ts +74 -0
  56. package/dist/host/types/src/ui/api/plugins-api.d.ts +128 -0
  57. package/dist/host/types/src/ui/api/rbac-api.d.ts +167 -0
  58. package/dist/host/types/src/ui/api/settings-api.d.ts +22 -0
  59. package/dist/host/types/src/ui/api/ssh-host-management-api.d.ts +65 -0
  60. package/dist/host/types/src/ui/api/sync-api.d.ts +93 -0
  61. package/dist/host/types/src/ui/api/system-status-api.d.ts +49 -0
  62. package/dist/host/types/src/ui/api/ui-preferences-api.d.ts +8 -0
  63. package/dist/host/types/src/ui/api/user-management-api.d.ts +80 -0
  64. package/dist/host/types/src/ui/auth/Auth.d.ts +12 -0
  65. package/dist/host/types/src/ui/auth/auth-bits.d.ts +11 -0
  66. package/dist/host/types/src/ui/auth/silent-signin.d.ts +2 -0
  67. package/dist/host/types/src/ui/components/FullScreenAppWrapper.d.ts +9 -0
  68. package/dist/host/types/src/ui/components/alert-dialog.d.ts +14 -0
  69. package/dist/host/types/src/ui/components/alert.d.ts +9 -0
  70. package/dist/host/types/src/ui/components/badge.d.ts +9 -0
  71. package/dist/host/types/src/ui/components/button.d.ts +13 -0
  72. package/dist/host/types/src/ui/components/card-grid/CardGridCanvas.d.ts +22 -0
  73. package/dist/host/types/src/ui/components/card-grid/layout-utils.d.ts +26 -0
  74. package/dist/host/types/src/ui/components/card-grid/types.d.ts +29 -0
  75. package/dist/host/types/src/ui/components/card-masonry.d.ts +16 -0
  76. package/dist/host/types/src/ui/components/card.d.ts +11 -0
  77. package/dist/host/types/src/ui/components/charts/BarSeries.d.ts +16 -0
  78. package/dist/host/types/src/ui/components/charts/LineChart.d.ts +17 -0
  79. package/dist/host/types/src/ui/components/charts/RadialGauge.d.ts +18 -0
  80. package/dist/host/types/src/ui/components/charts/Sparkline.d.ts +22 -0
  81. package/dist/host/types/src/ui/components/charts/StatRow.d.ts +15 -0
  82. package/dist/host/types/src/ui/components/charts/geometry.d.ts +20 -0
  83. package/dist/host/types/src/ui/components/charts/index.d.ts +4 -0
  84. package/dist/host/types/src/ui/components/checkbox.d.ts +4 -0
  85. package/dist/host/types/src/ui/components/connection/ConnectionGate.d.ts +56 -0
  86. package/dist/host/types/src/ui/components/connection/ConnectionLogPanel.d.ts +9 -0
  87. package/dist/host/types/src/ui/components/connection/ConnectionScreen.d.ts +34 -0
  88. package/dist/host/types/src/ui/components/connection/connection-status.d.ts +1 -0
  89. package/dist/host/types/src/ui/components/data-view.d.ts +32 -0
  90. package/dist/host/types/src/ui/components/dialog.d.ts +17 -0
  91. package/dist/host/types/src/ui/components/dropdown-menu.d.ts +29 -0
  92. package/dist/host/types/src/ui/components/empty-state.d.ts +19 -0
  93. package/dist/host/types/src/ui/components/form-fields.d.ts +115 -0
  94. package/dist/host/types/src/ui/components/input.d.ts +3 -0
  95. package/dist/host/types/src/ui/components/kbd.d.ts +12 -0
  96. package/dist/host/types/src/ui/components/label.d.ts +4 -0
  97. package/dist/host/types/src/ui/components/manager-card.d.ts +25 -0
  98. package/dist/host/types/src/ui/components/meter.d.ts +14 -0
  99. package/dist/host/types/src/ui/components/metric-card.d.ts +18 -0
  100. package/dist/host/types/src/ui/components/panel-layout.d.ts +83 -0
  101. package/dist/host/types/src/ui/components/password-input.d.ts +4 -0
  102. package/dist/host/types/src/ui/components/popover.d.ts +7 -0
  103. package/dist/host/types/src/ui/components/scroll-area.d.ts +5 -0
  104. package/dist/host/types/src/ui/components/section-card.d.ts +29 -0
  105. package/dist/host/types/src/ui/components/select.d.ts +15 -0
  106. package/dist/host/types/src/ui/components/select2.d.ts +8 -0
  107. package/dist/host/types/src/ui/components/separator.d.ts +4 -0
  108. package/dist/host/types/src/ui/components/sheet.d.ts +14 -0
  109. package/dist/host/types/src/ui/components/sidebar.d.ts +69 -0
  110. package/dist/host/types/src/ui/components/skeleton.d.ts +2 -0
  111. package/dist/host/types/src/ui/components/slider.d.ts +4 -0
  112. package/dist/host/types/src/ui/components/sonner.d.ts +4 -0
  113. package/dist/host/types/src/ui/components/surface/prompt-styles.d.ts +4 -0
  114. package/dist/host/types/src/ui/components/surface/surface-scope.d.ts +79 -0
  115. package/dist/host/types/src/ui/components/switch.d.ts +4 -0
  116. package/dist/host/types/src/ui/components/tab-strip.d.ts +19 -0
  117. package/dist/host/types/src/ui/components/tabs.d.ts +7 -0
  118. package/dist/host/types/src/ui/components/textarea.d.ts +4 -0
  119. package/dist/host/types/src/ui/components/theme-provider.d.ts +14 -0
  120. package/dist/host/types/src/ui/components/tooltip.d.ts +7 -0
  121. package/dist/host/types/src/ui/contexts/BrandingContext.d.ts +15 -0
  122. package/dist/host/types/src/ui/contexts/UiPreferencesContext.d.ts +38 -0
  123. package/dist/host/types/src/ui/contexts/branding-document.d.ts +10 -0
  124. package/dist/host/types/src/ui/dashboard/dashboard-cards-registry.d.ts +30 -0
  125. package/dist/host/types/src/ui/hooks/use-action-slot.d.ts +10 -0
  126. package/dist/host/types/src/ui/hooks/use-adaptive-polling.d.ts +5 -0
  127. package/dist/host/types/src/ui/hooks/use-mobile.d.ts +1 -0
  128. package/dist/host/types/src/ui/hooks/use-permissions.d.ts +29 -0
  129. package/dist/host/types/src/ui/hooks/use-status-color-scheme.d.ts +12 -0
  130. package/dist/host/types/src/ui/hooks/use-sync-status.d.ts +4 -0
  131. package/dist/host/types/src/ui/hooks/useSshAuthProviders.d.ts +17 -0
  132. package/dist/host/types/src/ui/i18n/i18n.d.ts +52 -0
  133. package/dist/host/types/src/ui/lib/ServerStatusContext.d.ts +33 -0
  134. package/dist/host/types/src/ui/lib/adaptive-polling.d.ts +29 -0
  135. package/dist/host/types/src/ui/lib/adaptive-resource-budget.d.ts +39 -0
  136. package/dist/host/types/src/ui/lib/app-keyboard-shortcuts.d.ts +8 -0
  137. package/dist/host/types/src/ui/lib/base-path.d.ts +1 -0
  138. package/dist/host/types/src/ui/lib/clipboard-provider.d.ts +9 -0
  139. package/dist/host/types/src/ui/lib/clipboard.d.ts +20 -0
  140. package/dist/host/types/src/ui/lib/connection-origin.d.ts +47 -0
  141. package/dist/host/types/src/ui/lib/db-health-monitor.d.ts +34 -0
  142. package/dist/host/types/src/ui/lib/device-id.d.ts +1 -0
  143. package/dist/host/types/src/ui/lib/electron.d.ts +1 -0
  144. package/dist/host/types/src/ui/lib/embedded-server-status.d.ts +15 -0
  145. package/dist/host/types/src/ui/lib/error-message.d.ts +9 -0
  146. package/dist/host/types/src/ui/lib/frontend-logger.d.ts +67 -0
  147. package/dist/host/types/src/ui/lib/global-shortcut-handler.d.ts +3 -0
  148. package/dist/host/types/src/ui/lib/host-defaults-context.d.ts +48 -0
  149. package/dist/host/types/src/ui/lib/hosts-request-cache.d.ts +9 -0
  150. package/dist/host/types/src/ui/lib/keybinding-match.d.ts +3 -0
  151. package/dist/host/types/src/ui/lib/linked-server.d.ts +10 -0
  152. package/dist/host/types/src/ui/lib/local-adaptive-engine.d.ts +40 -0
  153. package/dist/host/types/src/ui/lib/permissions.d.ts +16 -0
  154. package/dist/host/types/src/ui/lib/plugin-i18n.d.ts +11 -0
  155. package/dist/host/types/src/ui/lib/plugin-icon.d.ts +11 -0
  156. package/dist/host/types/src/ui/lib/plugin-transport.d.ts +50 -0
  157. package/dist/host/types/src/ui/lib/registry.d.ts +29 -0
  158. package/dist/host/types/src/ui/lib/rem.d.ts +7 -0
  159. package/dist/host/types/src/ui/lib/remote-server-api.d.ts +11 -0
  160. package/dist/host/types/src/ui/lib/server-status-store.d.ts +37 -0
  161. package/dist/host/types/src/ui/lib/sync-events.d.ts +2 -0
  162. package/dist/host/types/src/ui/lib/sync-status.d.ts +6 -0
  163. package/dist/host/types/src/ui/lib/tab-jump-hotkey.d.ts +4 -0
  164. package/dist/host/types/src/ui/lib/theme.d.ts +21 -0
  165. package/dist/host/types/src/ui/lib/ttl-request-cache.d.ts +10 -0
  166. package/dist/host/types/src/ui/lib/usage-color.d.ts +5 -0
  167. package/dist/host/types/src/ui/lib/utils.d.ts +2 -0
  168. package/dist/host/types/src/ui/lib/visible-interval.d.ts +5 -0
  169. package/dist/host/types/src/ui/lib/widget-title.d.ts +8 -0
  170. package/dist/host/types/src/ui/lib/ws-auth.d.ts +1 -0
  171. package/dist/host/types/src/ui/main-axios.d.ts +170 -0
  172. package/dist/host/types/src/ui/plugin-host/PluginViewPlaceholder.d.ts +13 -0
  173. package/dist/host/types/src/ui/plugin-host/app.d.ts +18 -0
  174. package/dist/host/types/src/ui/plugin-host/auth-registry.d.ts +50 -0
  175. package/dist/host/types/src/ui/plugin-host/bridge.d.ts +26 -0
  176. package/dist/host/types/src/ui/plugin-host/component-registry.d.ts +24 -0
  177. package/dist/host/types/src/ui/plugin-host/desktop.d.ts +7 -0
  178. package/dist/host/types/src/ui/plugin-host/extension-registry.d.ts +16 -0
  179. package/dist/host/types/src/ui/plugin-host/host-scope.d.ts +26 -0
  180. package/dist/host/types/src/ui/plugin-host/loader.d.ts +52 -0
  181. package/dist/host/types/src/ui/plugin-host/plugin-store.d.ts +40 -0
  182. package/dist/host/types/src/ui/plugin-host/scope.d.ts +20 -0
  183. package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +99 -0
  184. package/dist/host/types/src/ui/plugin-host/shell-bridge.d.ts +67 -0
  185. package/dist/host/types/src/ui/plugin-host/view-ownership.d.ts +31 -0
  186. package/dist/host/types/src/ui/settings/HostPluginSections.d.ts +31 -0
  187. package/dist/host/types/src/ui/settings/SettingsFields.d.ts +22 -0
  188. package/dist/host/types/src/ui/settings/host-feature-tabs.d.ts +11 -0
  189. package/dist/host/types/src/ui/settings/settings-components.d.ts +32 -0
  190. package/dist/host/types/src/ui/settings/settings-fields-util.d.ts +11 -0
  191. package/dist/host/types/src/ui/shell/ActionSlot.d.ts +41 -0
  192. package/dist/host/types/src/ui/shell/TabContext.d.ts +30 -0
  193. package/dist/host/types/src/ui/shell/action-registry.d.ts +99 -0
  194. package/dist/host/types/src/ui/shell/keybinding-registry.d.ts +62 -0
  195. package/dist/host/types/src/ui/shell/palette-registry.d.ts +55 -0
  196. package/dist/host/types/src/ui/shell/panel-registry.d.ts +24 -0
  197. package/dist/host/types/src/ui/shell/tab-registry.d.ts +92 -0
  198. package/dist/host/types/src/ui/sidebar/HostManagerTabs.d.ts +65 -0
  199. package/dist/host/types/src/ui/sidebar/host-contributions.d.ts +72 -0
  200. package/dist/host/types/src/ui/sidebar/host-defaults/catalog.d.ts +17 -0
  201. package/dist/host/types/src/ui/sidebar/host-protocols.d.ts +49 -0
  202. package/dist/host/types/src/ui/sidebar/quick-connect-host.d.ts +21 -0
  203. package/dist/host/types/src/ui/sidebar/rail-items.d.ts +103 -0
  204. package/dist/host/types/src/ui/ssh/connection-log/ConnectionLogContext.d.ts +17 -0
  205. package/dist/host/types/src/ui/ssh/dialogs/BrowserSignInDialog.d.ts +18 -0
  206. package/dist/host/types/src/ui/ssh/dialogs/HostKeyVerificationDialog.d.ts +17 -0
  207. package/dist/host/types/src/ui/ssh/dialogs/PassphraseDialog.d.ts +15 -0
  208. package/dist/host/types/src/ui/ssh/dialogs/SSHAuthDialog.d.ts +20 -0
  209. package/dist/host/types/src/ui/ssh/dialogs/TOTPDialog.d.ts +13 -0
  210. package/dist/host/ui.d.ts +1 -0
  211. package/dist/host/ui.js +31754 -0
  212. package/dist/host/use-permissions-NULZL43J.js +18 -0
  213. package/dist/host-commands.d.ts +89 -0
  214. package/dist/host-commands.js +387 -0
  215. package/dist/manifest.d.ts +461 -0
  216. package/dist/manifest.js +1499 -0
  217. package/dist/settings.d.ts +43 -0
  218. package/dist/settings.js +168 -0
  219. package/dist/ssh-certs.d.ts +25 -0
  220. package/dist/ssh-certs.js +234 -0
  221. package/dist/ssh-options.d.ts +23 -0
  222. package/dist/ssh-options.js +1 -0
  223. package/dist/table-builder.d.ts +26 -0
  224. package/dist/table-builder.js +87 -0
  225. package/dist/testing/safe-ports.d.ts +10 -0
  226. package/dist/testing/safe-ports.js +59 -0
  227. package/dist/testing/setup.d.ts +7 -0
  228. package/dist/testing/setup.js +146 -0
  229. package/dist/testing.d.ts +537 -0
  230. package/dist/testing.js +1451 -0
  231. package/dist/vitest-preset.d.ts +54 -0
  232. package/dist/vitest-preset.js +96 -0
  233. package/package.json +143 -0
  234. package/schema/changelog.schema.json +67 -0
  235. package/schema/manifest.schema.json +1160 -0
  236. package/tsconfig.plugin.json +31 -0
@@ -0,0 +1,1160 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://termix.site/schemas/plugin-manifest.schema.json",
4
+ "title": "Termix Plugin Manifest v2",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": [
8
+ "id",
9
+ "name",
10
+ "version",
11
+ "description",
12
+ "author",
13
+ "license",
14
+ "engine",
15
+ "category",
16
+ "capabilities"
17
+ ],
18
+ "properties": {
19
+ "id": {
20
+ "type": "string",
21
+ "pattern": "^[a-z][a-z0-9-]{1,39}$",
22
+ "description": "Unique plugin id. Lowercase, starts with a letter, 2-40 characters. Must equal the plugin's directory name."
23
+ },
24
+ "name": {
25
+ "type": "string",
26
+ "minLength": 1
27
+ },
28
+ "version": {
29
+ "type": "string",
30
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-.]+)?(\\+[0-9A-Za-z-.]+)?$",
31
+ "description": "Semver version string."
32
+ },
33
+ "description": {
34
+ "type": "string",
35
+ "minLength": 1
36
+ },
37
+ "author": {
38
+ "type": "object",
39
+ "additionalProperties": false,
40
+ "required": ["name"],
41
+ "properties": {
42
+ "name": {
43
+ "type": "string",
44
+ "minLength": 1
45
+ },
46
+ "url": {
47
+ "type": "string",
48
+ "minLength": 1
49
+ }
50
+ }
51
+ },
52
+ "license": {
53
+ "type": "string",
54
+ "minLength": 1
55
+ },
56
+ "repository": {
57
+ "type": "string",
58
+ "minLength": 1
59
+ },
60
+ "category": {
61
+ "type": "string",
62
+ "enum": [
63
+ "Terminal",
64
+ "Files & Transfer",
65
+ "Infrastructure",
66
+ "Monitoring",
67
+ "Networking",
68
+ "Access & Security",
69
+ "Productivity"
70
+ ]
71
+ },
72
+ "icon": {
73
+ "type": "string",
74
+ "minLength": 1,
75
+ "description": "A Lucide icon name, or a relative path to an icon.svg in the plugin root."
76
+ },
77
+ "engine": {
78
+ "type": "object",
79
+ "additionalProperties": false,
80
+ "required": ["termix", "api"],
81
+ "properties": {
82
+ "termix": {
83
+ "type": "string",
84
+ "minLength": 1,
85
+ "description": "Semver range of Termix releases the plugin runs on, e.g. \">=2.9.0\"."
86
+ },
87
+ "api": {
88
+ "type": "string",
89
+ "minLength": 1,
90
+ "description": "Semver range of the plugin API it needs, e.g. \"1\" or \"^1.2\"."
91
+ }
92
+ }
93
+ },
94
+ "capabilities": {
95
+ "type": "array",
96
+ "description": "Catalog capability ids this plugin's code needs. See the SDK capability catalog.",
97
+ "items": {
98
+ "type": "string",
99
+ "enum": [
100
+ "credentials:read",
101
+ "ssh:connect",
102
+ "process:spawn",
103
+ "users:write",
104
+ "auth:provide",
105
+ "system:tls",
106
+ "device:serial",
107
+ "hosts:write",
108
+ "credentials:use",
109
+ "credentials:write",
110
+ "network:outbound",
111
+ "network:serve",
112
+ "network:broadcast",
113
+ "users:read",
114
+ "events:core",
115
+ "notify:send",
116
+ "audit:read",
117
+ "desktop:window",
118
+ "users:impersonate",
119
+ "db:core-refs",
120
+ "hosts:read",
121
+ "db:own",
122
+ "kv:own",
123
+ "files:own",
124
+ "secrets:own",
125
+ "settings:read-core",
126
+ "ui:surface"
127
+ ]
128
+ }
129
+ },
130
+ "dependencies": {
131
+ "type": "object",
132
+ "description": "Plugin ids this plugin cannot run without, mapped to a semver range.",
133
+ "additionalProperties": {
134
+ "type": "string",
135
+ "minLength": 1
136
+ },
137
+ "propertyNames": {
138
+ "pattern": "^[a-z][a-z0-9-]{1,39}$"
139
+ }
140
+ },
141
+ "optionalDependencies": {
142
+ "type": "object",
143
+ "description": "Plugin ids this plugin uses when present. It must keep working without them.",
144
+ "additionalProperties": {
145
+ "type": "string",
146
+ "minLength": 1
147
+ },
148
+ "propertyNames": {
149
+ "pattern": "^[a-z][a-z0-9-]{1,39}$"
150
+ }
151
+ },
152
+ "provides": {
153
+ "type": "array",
154
+ "items": {
155
+ "type": "object",
156
+ "additionalProperties": false,
157
+ "required": ["service", "version", "permission"],
158
+ "properties": {
159
+ "service": {
160
+ "type": "string",
161
+ "pattern": "^[a-z0-9-]+(\\.[a-z0-9-]+)+$"
162
+ },
163
+ "version": {
164
+ "type": "string",
165
+ "pattern": "^\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-.]+)?(\\+[0-9A-Za-z-.]+)?$"
166
+ },
167
+ "permission": {
168
+ "type": "string",
169
+ "minLength": 1
170
+ },
171
+ "names": {
172
+ "type": "array",
173
+ "minItems": 1,
174
+ "uniqueItems": true,
175
+ "items": {
176
+ "type": "string",
177
+ "pattern": "^[a-z][a-z0-9-]*$"
178
+ }
179
+ }
180
+ }
181
+ }
182
+ },
183
+ "requires": {
184
+ "type": "array",
185
+ "items": {
186
+ "type": "object",
187
+ "additionalProperties": false,
188
+ "required": ["service", "versionRange"],
189
+ "properties": {
190
+ "service": {
191
+ "type": "string",
192
+ "pattern": "^[a-z0-9-]+(\\.[a-z0-9-]+)+$"
193
+ },
194
+ "versionRange": {
195
+ "type": "string",
196
+ "minLength": 1
197
+ },
198
+ "optional": {
199
+ "type": "boolean"
200
+ }
201
+ }
202
+ }
203
+ },
204
+ "providesSecret": {
205
+ "type": "array",
206
+ "items": {
207
+ "type": "object",
208
+ "additionalProperties": false,
209
+ "required": ["key", "permission"],
210
+ "properties": {
211
+ "key": {
212
+ "type": "string",
213
+ "pattern": "^[a-z0-9-]+$"
214
+ },
215
+ "permission": {
216
+ "type": "string",
217
+ "minLength": 1
218
+ },
219
+ "descriptionKey": {
220
+ "type": "string",
221
+ "minLength": 1
222
+ }
223
+ }
224
+ }
225
+ },
226
+ "requiresSecret": {
227
+ "type": "array",
228
+ "items": {
229
+ "type": "object",
230
+ "additionalProperties": false,
231
+ "required": ["plugin", "key"],
232
+ "properties": {
233
+ "plugin": {
234
+ "type": "string",
235
+ "pattern": "^[a-z][a-z0-9-]{1,39}$"
236
+ },
237
+ "key": {
238
+ "type": "string",
239
+ "pattern": "^[a-z0-9-]+$"
240
+ },
241
+ "optional": {
242
+ "type": "boolean"
243
+ }
244
+ }
245
+ }
246
+ },
247
+ "contributes": {
248
+ "type": "object",
249
+ "additionalProperties": false,
250
+ "properties": {
251
+ "tabs": {
252
+ "type": "array",
253
+ "items": {
254
+ "type": "object",
255
+ "additionalProperties": false,
256
+ "required": ["id", "titleKey", "icon", "openFrom"],
257
+ "properties": {
258
+ "id": {
259
+ "type": "string",
260
+ "minLength": 1
261
+ },
262
+ "titleKey": {
263
+ "type": "string",
264
+ "minLength": 1
265
+ },
266
+ "icon": {
267
+ "type": "string",
268
+ "minLength": 1
269
+ },
270
+ "openFrom": {
271
+ "type": "array",
272
+ "minItems": 1,
273
+ "items": {
274
+ "type": "string",
275
+ "enum": ["rail", "host-context-menu", "palette"]
276
+ }
277
+ }
278
+ }
279
+ }
280
+ },
281
+ "guest": {
282
+ "type": "boolean"
283
+ },
284
+ "protocols": {
285
+ "type": "array",
286
+ "description": "Connection protocols whose per-host login core stores, encrypts, shares and syncs for the plugin.",
287
+ "items": {
288
+ "type": "object",
289
+ "additionalProperties": false,
290
+ "required": ["id"],
291
+ "properties": {
292
+ "id": {
293
+ "type": "string",
294
+ "pattern": "^[a-z][a-z0-9-]{0,31}$",
295
+ "not": {
296
+ "enum": ["ssh"]
297
+ }
298
+ },
299
+ "credentialFields": {
300
+ "type": "array",
301
+ "items": {
302
+ "type": "object",
303
+ "additionalProperties": false,
304
+ "required": ["key"],
305
+ "properties": {
306
+ "key": {
307
+ "type": "string",
308
+ "pattern": "^[a-zA-Z][a-zA-Z0-9]{0,31}$",
309
+ "not": {
310
+ "enum": [
311
+ "username",
312
+ "password",
313
+ "authType",
314
+ "credentialId"
315
+ ]
316
+ }
317
+ },
318
+ "secret": {
319
+ "type": "boolean"
320
+ }
321
+ }
322
+ }
323
+ },
324
+ "defaultPort": {
325
+ "type": "integer",
326
+ "minimum": 1,
327
+ "maximum": 65535
328
+ },
329
+ "hostLoginFallback": {
330
+ "type": "array",
331
+ "uniqueItems": true,
332
+ "items": {
333
+ "enum": ["username", "password"]
334
+ }
335
+ }
336
+ }
337
+ }
338
+ },
339
+ "keybindingActions": {
340
+ "type": "array",
341
+ "description": "Keybinding actions the plugin adds, with the parameters a saved binding carries.",
342
+ "items": {
343
+ "type": "object",
344
+ "additionalProperties": false,
345
+ "required": ["id"],
346
+ "properties": {
347
+ "id": {
348
+ "type": "string",
349
+ "pattern": "^[a-zA-Z][a-zA-Z0-9.-]{0,63}$",
350
+ "not": {
351
+ "enum": [
352
+ "nextTab",
353
+ "previousTab",
354
+ "openCommandPalette",
355
+ "reconnectSession"
356
+ ]
357
+ }
358
+ },
359
+ "params": {
360
+ "type": "object",
361
+ "propertyNames": {
362
+ "pattern": "^[a-zA-Z][a-zA-Z0-9]{0,31}$",
363
+ "not": {
364
+ "const": "type"
365
+ }
366
+ },
367
+ "additionalProperties": {
368
+ "type": "object",
369
+ "additionalProperties": false,
370
+ "required": ["type"],
371
+ "properties": {
372
+ "type": {
373
+ "enum": ["string", "boolean"]
374
+ },
375
+ "required": {
376
+ "type": "boolean"
377
+ },
378
+ "pattern": {
379
+ "type": "string"
380
+ },
381
+ "maxLength": {
382
+ "type": "integer",
383
+ "minimum": 1
384
+ },
385
+ "syncEntity": {
386
+ "type": "string",
387
+ "pattern": "^[a-zA-Z][a-zA-Z0-9]*$"
388
+ }
389
+ }
390
+ }
391
+ }
392
+ }
393
+ }
394
+ },
395
+ "syncEntities": {
396
+ "type": "array",
397
+ "minItems": 1,
398
+ "uniqueItems": true,
399
+ "description": "Wire names of the sync entities this plugin registers.",
400
+ "items": {
401
+ "type": "string",
402
+ "pattern": "^[a-zA-Z][a-zA-Z0-9]*$"
403
+ }
404
+ },
405
+ "guestViews": {
406
+ "type": "array",
407
+ "minItems": 1,
408
+ "uniqueItems": true,
409
+ "items": {
410
+ "type": "string",
411
+ "pattern": "^[a-z][a-z0-9-]*$"
412
+ }
413
+ },
414
+ "auth": {
415
+ "type": "object",
416
+ "additionalProperties": false,
417
+ "properties": {
418
+ "sshAuthTypes": {
419
+ "type": "array",
420
+ "items": {
421
+ "type": "string",
422
+ "pattern": "^[a-z][a-z0-9-]{0,63}$"
423
+ }
424
+ },
425
+ "loginMethods": {
426
+ "type": "array",
427
+ "items": {
428
+ "type": "string",
429
+ "pattern": "^[a-z][a-z0-9-]{0,63}$"
430
+ }
431
+ },
432
+ "secondFactors": {
433
+ "type": "array",
434
+ "items": {
435
+ "type": "string",
436
+ "pattern": "^[a-z][a-z0-9-]{0,63}$"
437
+ }
438
+ },
439
+ "secretSchemes": {
440
+ "type": "array",
441
+ "items": {
442
+ "type": "string",
443
+ "pattern": "^[a-z][a-z0-9-]{0,63}$"
444
+ }
445
+ },
446
+ "keyboardInteractive": {
447
+ "type": "array",
448
+ "items": {
449
+ "type": "string",
450
+ "pattern": "^[a-z][a-z0-9-]{0,63}$"
451
+ }
452
+ }
453
+ }
454
+ },
455
+ "panels": {
456
+ "type": "array",
457
+ "items": {
458
+ "type": "object",
459
+ "additionalProperties": false,
460
+ "required": ["id", "titleKey"],
461
+ "properties": {
462
+ "id": {
463
+ "type": "string",
464
+ "minLength": 1
465
+ },
466
+ "titleKey": {
467
+ "type": "string",
468
+ "minLength": 1
469
+ },
470
+ "icon": {
471
+ "type": "string",
472
+ "minLength": 1
473
+ }
474
+ }
475
+ }
476
+ },
477
+ "dashboardCards": {
478
+ "type": "array",
479
+ "items": {
480
+ "type": "object",
481
+ "additionalProperties": false,
482
+ "required": ["id", "titleKey"],
483
+ "properties": {
484
+ "id": {
485
+ "type": "string",
486
+ "minLength": 1
487
+ },
488
+ "titleKey": {
489
+ "type": "string",
490
+ "minLength": 1
491
+ },
492
+ "icon": {
493
+ "type": "string",
494
+ "minLength": 1
495
+ }
496
+ }
497
+ }
498
+ },
499
+ "actions": {
500
+ "type": "array",
501
+ "items": {
502
+ "type": "object",
503
+ "additionalProperties": false,
504
+ "required": ["id", "titleKey", "handler"],
505
+ "properties": {
506
+ "id": {
507
+ "type": "string",
508
+ "pattern": "^[a-z0-9-]+(\\.[a-zA-Z0-9-]+)+$"
509
+ },
510
+ "titleKey": {
511
+ "type": "string",
512
+ "minLength": 1
513
+ },
514
+ "handler": {
515
+ "type": "string",
516
+ "pattern": "^[A-Za-z_$][A-Za-z0-9_$]*$"
517
+ },
518
+ "icon": {
519
+ "type": "string",
520
+ "minLength": 1
521
+ },
522
+ "permission": {
523
+ "type": "string",
524
+ "minLength": 1
525
+ },
526
+ "slot": {
527
+ "type": "string",
528
+ "minLength": 1
529
+ },
530
+ "kind": {
531
+ "type": "string",
532
+ "enum": ["button", "component"]
533
+ }
534
+ }
535
+ }
536
+ },
537
+ "actionSlots": {
538
+ "type": "array",
539
+ "items": {
540
+ "type": "object",
541
+ "additionalProperties": false,
542
+ "required": ["id", "accepts"],
543
+ "properties": {
544
+ "id": {
545
+ "type": "string",
546
+ "pattern": "^[a-z0-9-]+(\\.[a-zA-Z0-9-]+)+$"
547
+ },
548
+ "accepts": {
549
+ "type": "array",
550
+ "minItems": 1,
551
+ "items": {
552
+ "type": "string",
553
+ "enum": ["button", "component"]
554
+ }
555
+ },
556
+ "descriptionKey": {
557
+ "type": "string",
558
+ "minLength": 1
559
+ }
560
+ }
561
+ }
562
+ },
563
+ "permissions": {
564
+ "type": "array",
565
+ "description": "Role permissions this plugin contributes. Core registers each as <pluginId>.<name>.",
566
+ "items": {
567
+ "type": "object",
568
+ "additionalProperties": false,
569
+ "required": ["name", "titleKey", "descriptionKey"],
570
+ "properties": {
571
+ "name": {
572
+ "type": "string",
573
+ "description": "Plugin-relative name. May contain dots. Must not start with a core group or this plugin's id.",
574
+ "pattern": "^[a-z0-9_-]+(\\.[a-z0-9_-]+)*$"
575
+ },
576
+ "titleKey": {
577
+ "type": "string",
578
+ "minLength": 1
579
+ },
580
+ "descriptionKey": {
581
+ "type": "string",
582
+ "minLength": 1
583
+ },
584
+ "defaultRoles": {
585
+ "type": "array",
586
+ "description": "System roles that hold this the first time it is seen.",
587
+ "items": {
588
+ "type": "string",
589
+ "enum": ["admin", "user"]
590
+ }
591
+ }
592
+ }
593
+ }
594
+ },
595
+ "settings": {
596
+ "type": "object",
597
+ "description": "Settings fields core renders on the plugin's settings page and in the host editor.",
598
+ "additionalProperties": false,
599
+ "properties": {
600
+ "admin": {
601
+ "type": "array",
602
+ "items": {
603
+ "type": "object",
604
+ "additionalProperties": false,
605
+ "required": ["key", "type"],
606
+ "properties": {
607
+ "key": {
608
+ "type": "string",
609
+ "description": "Storage key, unique within its scope.",
610
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
611
+ },
612
+ "type": {
613
+ "type": "string",
614
+ "enum": [
615
+ "boolean",
616
+ "string",
617
+ "number",
618
+ "select",
619
+ "multiselect",
620
+ "secret",
621
+ "textarea",
622
+ "json",
623
+ "custom"
624
+ ]
625
+ },
626
+ "labelKey": {
627
+ "type": "string",
628
+ "minLength": 1,
629
+ "description": "Required for every type except \"custom\"."
630
+ },
631
+ "descriptionKey": {
632
+ "type": "string",
633
+ "minLength": 1
634
+ },
635
+ "placeholderKey": {
636
+ "type": "string",
637
+ "minLength": 1
638
+ },
639
+ "default": {
640
+ "description": "Value used until one is written."
641
+ },
642
+ "options": {
643
+ "type": "array",
644
+ "description": "select and multiselect only.",
645
+ "minItems": 1,
646
+ "items": {
647
+ "type": "object",
648
+ "additionalProperties": false,
649
+ "required": ["value", "labelKey"],
650
+ "properties": {
651
+ "value": {
652
+ "type": "string",
653
+ "minLength": 1
654
+ },
655
+ "labelKey": {
656
+ "type": "string",
657
+ "minLength": 1
658
+ }
659
+ }
660
+ }
661
+ },
662
+ "min": {
663
+ "type": "number",
664
+ "description": "number fields only."
665
+ },
666
+ "max": {
667
+ "type": "number",
668
+ "description": "number fields only."
669
+ },
670
+ "requires": {
671
+ "type": "string",
672
+ "description": "Key of a boolean field in the same scope that must be on."
673
+ },
674
+ "permission": {
675
+ "type": "string",
676
+ "minLength": 1,
677
+ "description": "Permission needed to write it. Admin fields default to admin.plugins.manage."
678
+ },
679
+ "group": {
680
+ "type": "string",
681
+ "minLength": 1,
682
+ "description": "Section heading this field sits under."
683
+ },
684
+ "component": {
685
+ "type": "string",
686
+ "minLength": 1,
687
+ "description": "Registered component id. Required when type is \"custom\"."
688
+ },
689
+ "hidden": {
690
+ "type": "boolean",
691
+ "description": "Stored and validated, but not drawn by the generic settings form."
692
+ }
693
+ }
694
+ }
695
+ },
696
+ "user": {
697
+ "type": "array",
698
+ "items": {
699
+ "type": "object",
700
+ "additionalProperties": false,
701
+ "required": ["key", "type"],
702
+ "properties": {
703
+ "key": {
704
+ "type": "string",
705
+ "description": "Storage key, unique within its scope.",
706
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
707
+ },
708
+ "type": {
709
+ "type": "string",
710
+ "enum": [
711
+ "boolean",
712
+ "string",
713
+ "number",
714
+ "select",
715
+ "multiselect",
716
+ "secret",
717
+ "textarea",
718
+ "json",
719
+ "custom"
720
+ ]
721
+ },
722
+ "labelKey": {
723
+ "type": "string",
724
+ "minLength": 1,
725
+ "description": "Required for every type except \"custom\"."
726
+ },
727
+ "descriptionKey": {
728
+ "type": "string",
729
+ "minLength": 1
730
+ },
731
+ "placeholderKey": {
732
+ "type": "string",
733
+ "minLength": 1
734
+ },
735
+ "default": {
736
+ "description": "Value used until one is written."
737
+ },
738
+ "options": {
739
+ "type": "array",
740
+ "description": "select and multiselect only.",
741
+ "minItems": 1,
742
+ "items": {
743
+ "type": "object",
744
+ "additionalProperties": false,
745
+ "required": ["value", "labelKey"],
746
+ "properties": {
747
+ "value": {
748
+ "type": "string",
749
+ "minLength": 1
750
+ },
751
+ "labelKey": {
752
+ "type": "string",
753
+ "minLength": 1
754
+ }
755
+ }
756
+ }
757
+ },
758
+ "min": {
759
+ "type": "number",
760
+ "description": "number fields only."
761
+ },
762
+ "max": {
763
+ "type": "number",
764
+ "description": "number fields only."
765
+ },
766
+ "requires": {
767
+ "type": "string",
768
+ "description": "Key of a boolean field in the same scope that must be on."
769
+ },
770
+ "permission": {
771
+ "type": "string",
772
+ "minLength": 1,
773
+ "description": "Permission needed to write it. Admin fields default to admin.plugins.manage."
774
+ },
775
+ "group": {
776
+ "type": "string",
777
+ "minLength": 1,
778
+ "description": "Section heading this field sits under."
779
+ },
780
+ "component": {
781
+ "type": "string",
782
+ "minLength": 1,
783
+ "description": "Registered component id. Required when type is \"custom\"."
784
+ },
785
+ "hidden": {
786
+ "type": "boolean",
787
+ "description": "Stored and validated, but not drawn by the generic settings form."
788
+ }
789
+ }
790
+ }
791
+ },
792
+ "host": {
793
+ "type": "object",
794
+ "additionalProperties": false,
795
+ "required": ["fields"],
796
+ "properties": {
797
+ "enableKey": {
798
+ "type": "string",
799
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{0,63}$",
800
+ "description": "Boolean rendered first, gating the rest of the section."
801
+ },
802
+ "enableLabelKey": {
803
+ "type": "string",
804
+ "minLength": 1
805
+ },
806
+ "enableDescriptionKey": {
807
+ "type": "string",
808
+ "minLength": 1
809
+ },
810
+ "fields": {
811
+ "type": "array",
812
+ "items": {
813
+ "type": "object",
814
+ "additionalProperties": false,
815
+ "required": ["key", "type"],
816
+ "properties": {
817
+ "key": {
818
+ "type": "string",
819
+ "description": "Storage key, unique within its scope.",
820
+ "pattern": "^[a-zA-Z][a-zA-Z0-9_-]{0,63}$"
821
+ },
822
+ "type": {
823
+ "type": "string",
824
+ "enum": [
825
+ "boolean",
826
+ "string",
827
+ "number",
828
+ "select",
829
+ "multiselect",
830
+ "secret",
831
+ "textarea",
832
+ "json",
833
+ "custom"
834
+ ]
835
+ },
836
+ "labelKey": {
837
+ "type": "string",
838
+ "minLength": 1,
839
+ "description": "Required for every type except \"custom\"."
840
+ },
841
+ "descriptionKey": {
842
+ "type": "string",
843
+ "minLength": 1
844
+ },
845
+ "placeholderKey": {
846
+ "type": "string",
847
+ "minLength": 1
848
+ },
849
+ "default": {
850
+ "description": "Value used until one is written."
851
+ },
852
+ "options": {
853
+ "type": "array",
854
+ "description": "select and multiselect only.",
855
+ "minItems": 1,
856
+ "items": {
857
+ "type": "object",
858
+ "additionalProperties": false,
859
+ "required": ["value", "labelKey"],
860
+ "properties": {
861
+ "value": {
862
+ "type": "string",
863
+ "minLength": 1
864
+ },
865
+ "labelKey": {
866
+ "type": "string",
867
+ "minLength": 1
868
+ }
869
+ }
870
+ }
871
+ },
872
+ "min": {
873
+ "type": "number",
874
+ "description": "number fields only."
875
+ },
876
+ "max": {
877
+ "type": "number",
878
+ "description": "number fields only."
879
+ },
880
+ "requires": {
881
+ "type": "string",
882
+ "description": "Key of a boolean field in the same scope that must be on."
883
+ },
884
+ "permission": {
885
+ "type": "string",
886
+ "minLength": 1,
887
+ "description": "Permission needed to write it. Admin fields default to admin.plugins.manage."
888
+ },
889
+ "group": {
890
+ "type": "string",
891
+ "minLength": 1,
892
+ "description": "Section heading this field sits under."
893
+ },
894
+ "component": {
895
+ "type": "string",
896
+ "minLength": 1,
897
+ "description": "Registered component id. Required when type is \"custom\"."
898
+ },
899
+ "hidden": {
900
+ "type": "boolean",
901
+ "description": "Stored and validated, but not drawn by the generic settings form."
902
+ },
903
+ "defaultFrom": {
904
+ "type": "string",
905
+ "minLength": 1,
906
+ "description": "Deprecated and ignored. Host defaults cover every host field."
907
+ },
908
+ "defaultable": {
909
+ "type": "boolean",
910
+ "description": "Whether the field can have a host default. On by default for non-secret fields."
911
+ },
912
+ "defaultLevels": {
913
+ "type": "array",
914
+ "minItems": 1,
915
+ "items": { "enum": ["admin", "user", "folder"] },
916
+ "description": "Levels that may set a default for the field. All three by default."
917
+ },
918
+ "personal": {
919
+ "type": "boolean",
920
+ "description": "A look-and-feel value: a user a host is shared with gets their own default for it."
921
+ },
922
+ "shareRead": {
923
+ "type": "string",
924
+ "enum": ["connect", "view", "edit", "manage"],
925
+ "description": "Lowest share level whose recipients see the value in the host payload."
926
+ },
927
+ "ownerOnly": {
928
+ "type": "boolean",
929
+ "description": "Only the host's owner may change it."
930
+ },
931
+ "secretKeys": {
932
+ "type": "array",
933
+ "minItems": 1,
934
+ "items": {
935
+ "type": "string",
936
+ "minLength": 1
937
+ },
938
+ "description": "JSON fields only: keys inside the stored object that hold secrets."
939
+ }
940
+ }
941
+ }
942
+ },
943
+ "enableDefault": {
944
+ "type": "boolean",
945
+ "description": "What the enable switch reads before a host saves it. Off by default."
946
+ },
947
+ "editorGroup": {
948
+ "enum": ["top", "ssh"],
949
+ "description": "Host editor strip the generated tab sits in. Defaults to top."
950
+ },
951
+ "editorOrder": {
952
+ "type": "number",
953
+ "description": "Position among that strip's tabs, core ones included."
954
+ }
955
+ }
956
+ }
957
+ }
958
+ },
959
+ "hostCapability": {
960
+ "description": "A host-editor checkbox backed by a boolean column on the host record. Reshaped by a later step.",
961
+ "oneOf": [
962
+ {
963
+ "$ref": "#/$defs/hostCapability"
964
+ },
965
+ {
966
+ "type": "array",
967
+ "minItems": 1,
968
+ "items": {
969
+ "$ref": "#/$defs/hostCapability"
970
+ }
971
+ }
972
+ ]
973
+ },
974
+ "http": {
975
+ "type": "object",
976
+ "additionalProperties": false,
977
+ "description": "HTTP options for the plugin's /plugin-api/<id>/ router.",
978
+ "properties": {
979
+ "adminImpersonation": {
980
+ "type": "boolean",
981
+ "description": "An admin may call the plugin's routes on behalf of another user with the X-Admin-Target-User header."
982
+ },
983
+ "legacyPaths": {
984
+ "type": "array",
985
+ "description": "Old URLs under /<plugin id>/ served by the plugin's router with that prefix removed.",
986
+ "items": {
987
+ "type": "string",
988
+ "pattern": "^/[a-z][a-z0-9-]*(/[A-Za-z0-9_.-]+)+$"
989
+ }
990
+ },
991
+ "legacyRedirects": {
992
+ "type": "array",
993
+ "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.",
994
+ "items": {
995
+ "type": "object",
996
+ "additionalProperties": false,
997
+ "required": ["from", "to"],
998
+ "properties": {
999
+ "from": {
1000
+ "type": "string",
1001
+ "pattern": "^(/[A-Za-z0-9_.-]+)+$"
1002
+ },
1003
+ "to": {
1004
+ "type": "string",
1005
+ "pattern": "^(/[A-Za-z0-9_.-]+)+$"
1006
+ },
1007
+ "status": {
1008
+ "enum": [307, 308]
1009
+ }
1010
+ }
1011
+ }
1012
+ }
1013
+ }
1014
+ },
1015
+ "uiPresets": {
1016
+ "type": "object",
1017
+ "additionalProperties": false,
1018
+ "required": ["simple", "balanced", "advanced"],
1019
+ "description": "The plugin's Appearance defaults for each interface preset, read with usePluginUiPreferences.",
1020
+ "properties": {
1021
+ "simple": {
1022
+ "type": "object",
1023
+ "additionalProperties": {
1024
+ "anyOf": [
1025
+ {
1026
+ "type": "boolean"
1027
+ },
1028
+ {
1029
+ "type": "number"
1030
+ },
1031
+ {
1032
+ "type": "string"
1033
+ },
1034
+ {
1035
+ "type": "array",
1036
+ "items": {
1037
+ "type": "string"
1038
+ }
1039
+ }
1040
+ ]
1041
+ }
1042
+ },
1043
+ "balanced": {
1044
+ "type": "object",
1045
+ "additionalProperties": {
1046
+ "anyOf": [
1047
+ {
1048
+ "type": "boolean"
1049
+ },
1050
+ {
1051
+ "type": "number"
1052
+ },
1053
+ {
1054
+ "type": "string"
1055
+ },
1056
+ {
1057
+ "type": "array",
1058
+ "items": {
1059
+ "type": "string"
1060
+ }
1061
+ }
1062
+ ]
1063
+ }
1064
+ },
1065
+ "advanced": {
1066
+ "type": "object",
1067
+ "additionalProperties": {
1068
+ "anyOf": [
1069
+ {
1070
+ "type": "boolean"
1071
+ },
1072
+ {
1073
+ "type": "number"
1074
+ },
1075
+ {
1076
+ "type": "string"
1077
+ },
1078
+ {
1079
+ "type": "array",
1080
+ "items": {
1081
+ "type": "string"
1082
+ }
1083
+ }
1084
+ ]
1085
+ }
1086
+ }
1087
+ }
1088
+ },
1089
+ "uses": {
1090
+ "type": "array",
1091
+ "minItems": 1,
1092
+ "uniqueItems": true,
1093
+ "description": "Other plugins' action, slot and extension point ids this plugin calls, fills or extends.",
1094
+ "items": {
1095
+ "type": "string",
1096
+ "pattern": "^[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)+$"
1097
+ }
1098
+ }
1099
+ }
1100
+ },
1101
+ "backend": {
1102
+ "type": "string",
1103
+ "minLength": 1,
1104
+ "description": "Built backend entry, relative to the plugin root. Defaults to dist/backend.js."
1105
+ },
1106
+ "frontend": {
1107
+ "type": "string",
1108
+ "minLength": 1,
1109
+ "description": "Built frontend entry, relative to the plugin root. Defaults to dist/frontend.js."
1110
+ },
1111
+ "locales": {
1112
+ "type": "string",
1113
+ "minLength": 1,
1114
+ "description": "Locales directory, relative to the plugin root. Defaults to locales."
1115
+ },
1116
+ "platforms": {
1117
+ "type": "array",
1118
+ "minItems": 1,
1119
+ "items": {
1120
+ "type": "string",
1121
+ "enum": ["linux", "win32", "darwin"]
1122
+ }
1123
+ },
1124
+ "desktop": {
1125
+ "type": "string",
1126
+ "enum": ["mirror", "local", "server"],
1127
+ "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."
1128
+ },
1129
+ "nativeDependencies": {
1130
+ "type": "array",
1131
+ "minItems": 1,
1132
+ "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.",
1133
+ "items": {
1134
+ "type": "string",
1135
+ "minLength": 1
1136
+ }
1137
+ }
1138
+ },
1139
+ "$defs": {
1140
+ "hostCapability": {
1141
+ "type": "object",
1142
+ "additionalProperties": false,
1143
+ "required": ["key", "labelKey", "editorTab"],
1144
+ "properties": {
1145
+ "key": {
1146
+ "type": "string",
1147
+ "minLength": 1
1148
+ },
1149
+ "labelKey": {
1150
+ "type": "string",
1151
+ "minLength": 1
1152
+ },
1153
+ "editorTab": {
1154
+ "type": "string",
1155
+ "minLength": 1
1156
+ }
1157
+ }
1158
+ }
1159
+ }
1160
+ }