@termix-ssh/plugin-sdk 1.0.12 → 1.0.15

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 (46) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/PLUGIN-GUIDE.md +106 -59
  3. package/dist/backend.d.ts +534 -1
  4. package/dist/backend.js +7 -0
  5. package/dist/capabilities.js +7 -0
  6. package/dist/db.js +1 -0
  7. package/dist/desktop.d.ts +0 -243
  8. package/dist/frontend.d.ts +23 -2
  9. package/dist/host/{PluginsTab-EV4MSGY6.js → PluginsTab-S33WIIGC.js} +511 -178
  10. package/dist/host/{chunk-AWR6FYDO.js → chunk-2IV3VX7F.js} +5552 -5550
  11. package/dist/host/{chunk-RUPLD6RF.js → chunk-3L45NNT5.js} +29 -84
  12. package/dist/host/{chunk-VEWOYAMZ.js → chunk-57DJU2ZA.js} +1 -1
  13. package/dist/host/{chunk-XKA3DBB2.js → chunk-V44FCJBQ.js} +135 -54
  14. package/dist/host/{chunk-X4QZKO5G.js → chunk-VFTB2RDP.js} +54 -5
  15. package/dist/host/core-classes.json +1 -1
  16. package/dist/host/{linked-server-B4NEG4MA.js → linked-server-SCJH7DSL.js} +1 -1
  17. package/dist/host/{rbac-api-OUO3LUOC.js → rbac-api-KA5IPQQL.js} +1 -1
  18. package/dist/host/testing-host.js +4 -4
  19. package/dist/host/types/src/types/index.d.ts +10 -0
  20. package/dist/host/types/src/types/onboarding.d.ts +0 -2
  21. package/dist/host/types/src/types/ui-types.d.ts +3 -1
  22. package/dist/host/types/src/ui/api/audit-log-api.d.ts +0 -10
  23. package/dist/host/types/src/ui/api/auth-methods-api.d.ts +2 -0
  24. package/dist/host/types/src/ui/api/credentials-api.d.ts +0 -22
  25. package/dist/host/types/src/ui/api/plugins-api.d.ts +4 -0
  26. package/dist/host/types/src/ui/api/settings-api.d.ts +6 -6
  27. package/dist/host/types/src/ui/api/ssh-host-management-api.d.ts +6 -28
  28. package/dist/host/types/src/ui/main-axios.d.ts +3 -3
  29. package/dist/host/types/src/ui/onboarding/onboarding-registry.d.ts +3 -1
  30. package/dist/host/types/src/ui/plugin-host/sdk-ui.d.ts +6 -7
  31. package/dist/host/types/src/ui/plugins/plugin-model.d.ts +20 -0
  32. package/dist/host/types/src/ui/plugins/use-plugins-manager.d.ts +3 -0
  33. package/dist/host/types/src/ui/sidebar/AuthEnrollmentSections.d.ts +4 -1
  34. package/dist/host/types/src/ui/sidebar/host-contributions.d.ts +10 -0
  35. package/dist/host/ui.js +36 -210
  36. package/dist/host/{use-permissions-6VSHHUMB.js → use-permissions-LLN6TLAL.js} +1 -1
  37. package/dist/manifest.d.ts +10 -1
  38. package/dist/manifest.js +16 -1
  39. package/dist/ssh-keys.d.ts +29 -0
  40. package/dist/ssh-keys.js +85 -0
  41. package/dist/testing.d.ts +52 -15
  42. package/dist/testing.js +279 -2
  43. package/dist/vitest-preset.js +23 -0
  44. package/package.json +5 -1
  45. package/schema/manifest.schema.json +12 -0
  46. package/dist/host/types/src/ui/sidebar/host-export-payload.d.ts +0 -30
package/CHANGELOG.md CHANGED
@@ -1,5 +1,47 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.0.15
4
+
5
+ Plugin API 1.7.0.
6
+
7
+ ### Added
8
+
9
+ - `ctx.auth.policy.provide` and the `auth:policy` capability, so a plugin can set an idle timeout, cap session length, turn off remember me and require a second factor
10
+ - `ctx.auth.listSecondFactors` lists the second factors from every running plugin
11
+ - `AuthEnrollmentSections` takes `factorsOnly`
12
+ - `getHttpsSettings` and `updateHttpsSettings` in `@termix-ssh/plugin-sdk/ui`
13
+
14
+ ### Fixed
15
+
16
+ - Plugin frontend tests against a locally linked SDK failed with a second copy of React
17
+
18
+ ## 1.0.14
19
+
20
+ Plugin API 1.6.0.
21
+
22
+ ### Added
23
+
24
+ - `ctx.hosts.locks.provide` and the `hosts:lock` capability, so a plugin can manage hosts that stay read only for everyone else and block adding hosts by hand
25
+ - `ctx.hosts.setShares` to replace every grant on a host in one call
26
+ - `ctx.credentials.list` returns the acting user's credentials by name, without secrets
27
+ - `ctx.hosts.create` and `update` take `password`, `key`, `keyPassword`, `keyType`, `sudoPassword`, `protocolAuth` and `pluginEnable`
28
+
29
+ ## 1.0.13
30
+
31
+ Plugin API 1.5.0.
32
+
33
+ ### Added
34
+
35
+ - `runtime: "desktop"` in the manifest for a plugin that only loads on the desktop app
36
+ - `desktop:local` and `ctx.desktop.local`: file system, local shell and machine info on the desktop app's own backend
37
+ - `ctx.audit.subscribe`, `ctx.audit.list` and `ctx.audit.exportBatches` under `audit:read`
38
+ - `ctx.hosts.importMany`, `importSshConfig`, `exportMany` and `registerImportNormalizer`, with the `hosts:export` capability
39
+ - `ctx.credentials.publicKey` and `resolveKeyRefs`, `ctx.ssh.exec`, and `@termix-ssh/plugin-sdk/ssh-keys`
40
+ - `ctx.hosts.status.provide` and `ctx.hosts.activity.provide` so a plugin can own host status and recent activity, with `ctx.network.tcpProbe`, `ctx.ssh.probe`, `ctx.hosts.probeTargets` and `ctx.hosts.sessionActive`
41
+ - `registerHostStatusIndicator` and `registerHostEditorToolbarItem`, and `order` for host badges
42
+ - Onboarding steps can sit in a `start` section, take a `position` and `replaces` a core step
43
+ - A plugin can provide the app name, tagline and logo through the `<id>.brandingProvider` registry key
44
+
3
45
  ## 1.0.12
4
46
 
5
47
  Plugin API 1.4.0.
package/PLUGIN-GUIDE.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # Termix plugin guide
2
2
 
3
- SDK 1.0.12 | Plugin API 1.4.0
3
+ SDK 1.0.15 | Plugin API 1.7.0
4
4
 
5
5
  This guide is for anyone, person or AI coding tool, building a Termix plugin. It ships inside
6
6
  `@termix-ssh/plugin-sdk`, so the copy in your `node_modules` always matches the SDK you have installed.
@@ -164,7 +164,7 @@ Unknown fields are refused at every level, so a typo fails validation. The schem
164
164
  | `icon` | A [Lucide](https://lucide.dev/icons/) icon name, like `Hand`. |
165
165
  | `features` | Up to 20 short lines shown on the plugin's page. |
166
166
  | `docs` | An https link to your docs. |
167
- | `engine.termix` | Termix versions you work with, like `>=26.10.0`. |
167
+ | `engine.termix` | Termix versions you work with, like `>=26.10.0`. Older Termix builds don't list a release they can't run. |
168
168
  | `engine.api` | Plugin API range, like `^1.2`. A major bump of the API is breaking. |
169
169
  | `capabilities` | What your code may do. See the reference at the end. |
170
170
  | `dependencies`, `optionalDependencies` | Other plugins, `{ "snippets": "^1.0.0" }`. You must keep working without optional ones. |
@@ -226,6 +226,7 @@ Bundled as ESM for Node 22+ into `dist/backend.js`. Backend imports of your own
226
226
  | `sync` | none | Sync your tables to a linked desktop |
227
227
  | `auth` | `auth:provide` | Login methods, second factors, SSH auth types |
228
228
  | `auth.issueUserToken` | `users:impersonate` | A short-lived session for calling Termix's API as a user |
229
+ | `auth.policy` | `auth:policy` | Login rules: idle timeout, session length, second factors |
229
230
  | `users.getLocale` | `users:read` | A user's UI language |
230
231
  | `system` | `system:tls` | The server's HTTPS certificate |
231
232
  | `plugins.list()` | `plugins:read` | Which plugins are installed |
@@ -300,6 +301,11 @@ router.post("/notes", async (req, res) => {
300
301
  - `ctx.rbac.require("manage")` on a single route, `await ctx.rbac.has("manage")` in code. A full id like
301
302
  `hosts.edit` checks a core permission.
302
303
  - Host access: `ctx.hosts.checkAccess(hostId, "connect" | "view" | "edit" | "manage")`.
304
+ - Managed hosts: with `hosts:lock`, `ctx.hosts.locks.provide({ isLocked, note, allowManualCreate })` makes
305
+ the hosts you manage read only for the UI, the API and other plugins (pins and order still work), and
306
+ `allowManualCreate: () => false` blocks adding hosts by hand. Your own `ctx.hosts` writes still go
307
+ through. `ctx.hosts.setShares(hostId, grants)` replaces a host's whole grant list, and
308
+ `ctx.credentials.list()` finds the acting user's credentials by name.
303
309
 
304
310
  ### Errors
305
311
 
@@ -325,6 +331,24 @@ try {
325
331
  commands. `@termix-ssh/plugin-sdk/host-commands` has helpers to detect the OS and run package manager and
326
332
  sudo commands. Hosts from `ctx.hosts` never carry secrets. Pass the host or its id to `ctx.ssh`.
327
333
 
334
+ ### The desktop app
335
+
336
+ Set `"runtime": "desktop"` in the manifest for a plugin that only makes sense on a desktop app. It never
337
+ loads on a server, ignores server sync and may declare `desktop:local`. Any plugin can declare
338
+ `desktop:local` and check `ctx.desktop.local.available()` at runtime.
339
+
340
+ `ctx.desktop.local` works on the desktop app's own backend only:
341
+
342
+ - `info()`: home folder, platform, user data folder, backend port and the linked server (url and token) or null
343
+ - `fs`: `list`, `mkdir`, `createFile`, `rename`, `ensureDir`, `exists`, `walk`, `trash`, `reveal`, `open`,
344
+ `openRead` and `openDownload`. Downloads stay inside the folder the user picked, links in it are refused and
345
+ an existing file is never replaced by accident
346
+ - `pty.spawn()`: a local shell, stopped when the plugin stops
347
+ - `pluginFetch(origin, subPath, init)`: calls this plugin's own routes on the desktop's backend ("local") or the linked server ("remote") as the acting user. Bodies can be streams, so a plugin can move big files without the renderer
348
+
349
+ Use `ctx.audit.subscribe`, `list` and `exportBatches` (`audit:read`) to read the audit trail. Subscribers
350
+ are called after a line is accepted and never delay the action that wrote it.
351
+
328
352
  ### Events, timers, alerts, services
329
353
 
330
354
  ```ts
@@ -470,13 +494,15 @@ your plugin's error boundary and Suspense.
470
494
  | `registerHostEditorSection` | Your own host editor section (host settings get one for free) |
471
495
  | `registerHostProtocol` | A connection protocol next to SSH |
472
496
  | `registerHostBadge`, `registerHostContextMenuItem` | Badges and menu items on host rows |
497
+ | `registerHostStatusIndicator` | The status dot or stripe on a host row (a layout draws it) |
498
+ | `registerHostEditorToolbarItem` | A control in the host editor toolbar (a layout draws it) |
473
499
  | `registerPaletteEntry`, `registerPaletteGroup` | Command palette entries |
474
500
  | `registerKeybindingAction`, `registerKeybindingDefault` | Bindable actions |
475
501
  | `registerSettingsComponent` | A component for a `custom` settings field |
476
502
  | `registerAction`, `invokeAction` | Actions across plugins |
477
503
  | `registerSlotContribution`, `declareActionSlot` | Fill or own a UI slot |
478
504
  | `registerComponent`, `registerExtension` | Offer a component by id, add to an extension point |
479
- | `registerOnboardingStep` | A first run setup step |
505
+ | `registerOnboardingStep` | A first run setup step (`section`, `position`, `replaces`) |
480
506
  | `registerLoginMethod`, `registerSecondFactorUI`, `registerSshAuthEditor` | Sign in UI |
481
507
  | `registerLayout` | A whole-app layout (`contributes.layouts`, API 1.4) |
482
508
  | `api` | Axios client for your `/plugin-api/<id>/` routes, auth included |
@@ -484,6 +510,16 @@ your plugin's error boundary and Suspense.
484
510
  | `docs`, `tabs`, `confirm`, `listHosts`, `getHost`, `t`, `hasPermission`, `desktop` | Helpers |
485
511
  | `onSettingsChanged`, `onDispose` | Hooks |
486
512
 
513
+ Badges, status indicators and toolbar items take `{ id, when(host), component, order? }`; lower `order`
514
+ comes first. An onboarding step sits in a section (`start`, `setup`, `explore`, `security`) or at an exact
515
+ `position` from 1 to 99. `replaces: ["preset"]` lists older step keys the step took over, so people who saw
516
+ those are not shown it again.
517
+
518
+ Branding: a plugin that owns the app name, tagline and logo provides
519
+ `ctx.registry.provide("<id>.brandingProvider", async () => ({ appName, tagline, logo }))` in its backend.
520
+ Core reads it for `GET /users/branding` (the login page, the browser tab and the sync server name) and falls
521
+ back to "Termix" with no logo when no plugin provides one. `logo` is a PNG data URL or null.
522
+
487
523
  Hooks from `@termix-ssh/plugin-sdk/frontend`: `useTranslation`, `usePermission`, `useSettings`, `useHost`,
488
524
  `useHosts`, `usePluginApi`, `useCurrentUser`, `useTheme`, `useToast`, `useDocsUrl`, `useTabs`,
489
525
  `useSlotContributions`, `useSshAuthTypes`, `useExtensions`, `useShell`.
@@ -563,8 +599,6 @@ export function activate(app: TermixApp) {
563
599
  `classic-layout.hostTree` and `classic-layout.dashboard` for other plugins to place with `PluginComponent`.
564
600
  It reads the shell with `useShellController()` from `@termix-ssh/plugin-sdk/ui`, which exposes more than
565
601
  `useShell()` and may change with Termix. A third party layout should start from `useShell()`.
566
- - Example Top Bar Layout (https://github.com/Termix-SSH/Plugin-Example-Topbar-Layout) is a small third party
567
- style layout built only on `useShell()`, `TabStage` and `@termix-ssh/plugin-sdk/ui`, with a phone version.
568
602
 
569
603
  A theme is CSS only. Declare it in `contributes.themes` (`id`, `label`, `mode` light or dark, `css` path,
570
604
  optional `swatch` colors for the picker) with the `ui:theme` capability. The id becomes a class on `<html>`,
@@ -582,9 +616,7 @@ A plugin that only holds themes needs no code. Leave out `src/`: `termix-plugin
582
616
  - Themes show in the picker in the order core lists its own, then the plugin's order.
583
617
  - A theme someone saved that no longer exists shows as System. It comes back when the plugin does.
584
618
  - Accent color, UI font, font size and density are not part of a theme. Core applies them on top.
585
- - Bundled Classic Themes (https://github.com/Termix-SSH/Plugin-Classic-Themes) is a full example, and
586
- Example Theme (https://github.com/Termix-SSH/Plugin-Example-Theme) a small one with one light and one dark
587
- theme.
619
+ - Bundled Classic Themes (https://github.com/Termix-SSH/Plugin-Classic-Themes) is a full example.
588
620
 
589
621
  ## Looking native
590
622
 
@@ -668,6 +700,13 @@ closely. Declare ids in `contributes.auth` and register them with `ctx.auth.regi
668
700
  `registerSecondFactor` or `registerSshAuthProvider`. Connection protocols go in `contributes.protocols`
669
701
  and `app.registerHostProtocol`. Read https://docs.termix.site/develop/auth before starting one.
670
702
 
703
+ Login rules need `auth:policy`. `ctx.auth.policy.provide({ evaluate, allowRememberDevice })` is asked at
704
+ every login with the user, the method, the device and every second factor (`ctx.auth.listSecondFactors()`
705
+ lists them too). `evaluate` returns `allowRememberDevice`, `maxSessionSeconds`, `idleTimeoutSeconds` and
706
+ `secondFactor` (`"always"` or `"new-device"`). The strictest answer from all plugins wins, and a throw
707
+ refuses the login. A user who must have a second factor but has none gets a session that can only set one
708
+ up, and `/users/me` reports `restriction: "second-factor-setup"`.
709
+
671
710
  ## Testing
672
711
 
673
712
  ```ts
@@ -832,60 +871,68 @@ To run your own registry instead, see https://docs.termix.site/develop/registrie
832
871
 
833
872
  ## SDK entry points
834
873
 
835
- | Import | What it is |
836
- | -------------------------------------------------------------------- | --------------------------------------------------------------------- |
837
- | `@termix-ssh/plugin-sdk/backend` | `PluginContext` and the backend types |
838
- | `@termix-ssh/plugin-sdk/frontend` | `TermixApp`, `TabProps` and the hooks |
839
- | `@termix-ssh/plugin-sdk/ui` | The UI kit, served by Termix at runtime |
840
- | `@termix-ssh/plugin-sdk/db` | `defineTable` and column builders |
841
- | `@termix-ssh/plugin-sdk/manifest` | `PluginManifest` type and manifest checks |
842
- | `@termix-ssh/plugin-sdk/capabilities` | The capability catalog |
843
- | `@termix-ssh/plugin-sdk/settings` | Settings field validation |
844
- | `@termix-ssh/plugin-sdk/testing` | `createMockCtx`, `createTestDb`, `renderWithApp`, `createFakeContext` |
845
- | `@termix-ssh/plugin-sdk/vitest-preset` | `pluginVitestConfig` |
846
- | `@termix-ssh/plugin-sdk/host-commands` | OS detection, package manager and sudo helpers over ssh2 |
847
- | `@termix-ssh/plugin-sdk/ssh-certs` | `applyCertificateAuth()` for certificate based SSH auth |
848
- | `@termix-ssh/plugin-sdk/desktop` | The desktop app bridge, typed. Check it exists before use |
849
- | `@termix-ssh/plugin-sdk/openapi` | `buildOpenApi()` |
850
- | `@termix-ssh/plugin-sdk/changelog` | Changelog parsing and checks |
851
- | `@termix-ssh/plugin-sdk/docs` | Docs link and env var helpers |
852
- | `@termix-ssh/plugin-sdk/ddl`, `@termix-ssh/plugin-sdk/table-builder` | Table to SQL and Drizzle mapping. You rarely need these |
874
+ | Import | What it is |
875
+ | -------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
876
+ | `@termix-ssh/plugin-sdk/backend` | `PluginContext` and the backend types |
877
+ | `@termix-ssh/plugin-sdk/frontend` | `TermixApp`, `TabProps` and the hooks |
878
+ | `@termix-ssh/plugin-sdk/ui` | The UI kit, served by Termix at runtime |
879
+ | `@termix-ssh/plugin-sdk/db` | `defineTable` and column builders |
880
+ | `@termix-ssh/plugin-sdk/manifest` | `PluginManifest` type and manifest checks |
881
+ | `@termix-ssh/plugin-sdk/capabilities` | The capability catalog |
882
+ | `@termix-ssh/plugin-sdk/settings` | Settings field validation |
883
+ | `@termix-ssh/plugin-sdk/testing` | `createMockCtx`, `createTestDb`, `renderWithApp`, `createFakeContext` |
884
+ | `@termix-ssh/plugin-sdk/vitest-preset` | `pluginVitestConfig` |
885
+ | `@termix-ssh/plugin-sdk/host-commands` | OS detection, package manager and sudo helpers over ssh2 |
886
+ | `@termix-ssh/plugin-sdk/ssh-certs` | `applyCertificateAuth()` for certificate based SSH auth |
887
+ | `@termix-ssh/plugin-sdk/ssh-keys` | `generateSshKeyPair()`, `detectSshKeyType()`, `publicKeyFromPrivate()`, `validateSshKeyPair()` |
888
+ | `@termix-ssh/plugin-sdk/desktop` | The desktop app bridge, typed. Check it exists before use |
889
+ | `@termix-ssh/plugin-sdk/openapi` | `buildOpenApi()` |
890
+ | `@termix-ssh/plugin-sdk/changelog` | Changelog parsing and checks |
891
+ | `@termix-ssh/plugin-sdk/docs` | Docs link and env var helpers |
892
+ | `@termix-ssh/plugin-sdk/ddl`, `@termix-ssh/plugin-sdk/table-builder` | Table to SQL and Drizzle mapping. You rarely need these |
853
893
 
854
894
  ## Capabilities
855
895
 
856
- | Capability | Risk | What it allows |
857
- | -------------------- | -------- | ------------------------------------------------------- |
858
- | `credentials:read` | critical | Read stored secrets for hosts the user can reach |
859
- | `system:tls` | critical | Replace the HTTPS certificate, answer CA domain checks |
860
- | `ssh:connect` | high | Run any command on hosts, with the user's access |
861
- | `process:spawn` | high | Run programs on the Termix server |
862
- | `users:write` | high | Add users and change their roles |
863
- | `users:impersonate` | high | Act as another user, or get a session for them, audited |
864
- | `db:core-refs` | high | Query core users, roles and hosts tables (read only) |
865
- | `auth:provide` | high | Add login methods, second factors, SSH auth types |
866
- | `device:serial` | high | Open serial and USB ports on the server |
867
- | `notify:hub` | high | Receive every alert (the alerts hub only) |
868
- | `ui:layout` | high | Replace the whole app layout |
869
- | `hosts:write` | medium | Add and edit hosts |
870
- | `credentials:use` | medium | Connect with saved credentials without seeing them |
871
- | `credentials:write` | medium | Save new credentials |
872
- | `network:outbound` | medium | Outbound HTTP through `ctx.fetch` |
873
- | `network:serve` | medium | HTTP routes and sockets |
874
- | `network:broadcast` | medium | Local network broadcasts, like Wake-on-LAN |
875
- | `users:read` | medium | Usernames, roles and UI language |
876
- | `events:core` | medium | Listen to core events |
877
- | `notify:send` | medium | Send alerts |
878
- | `audit:read` | medium | Read the audit log |
879
- | `desktop:window` | medium | Open windows in the desktop app |
880
- | `hosts:read` | low | Read hosts the user can see |
881
- | `db:own` | low | Your own tables |
882
- | `kv:own` | low | Small key value state |
883
- | `files:own` | low | Your own folder on disk |
884
- | `secrets:own` | low | Your own encrypted secrets |
885
- | `settings:read-core` | low | Read Termix server settings |
886
- | `plugins:read` | low | See installed plugins |
887
- | `ui:surface` | low | Add tabs, panels and settings |
888
- | `ui:theme` | low | Add color themes, CSS only |
896
+ | Capability | Risk | What it allows |
897
+ | ------------------------ | -------- | ------------------------------------------------------- |
898
+ | `credentials:read` | critical | Read stored secrets for hosts the user can reach |
899
+ | `system:tls` | critical | Replace the HTTPS certificate, answer CA domain checks |
900
+ | `ssh:connect` | high | Run any command on hosts, with the user's access |
901
+ | `process:spawn` | high | Run programs on the Termix server |
902
+ | `users:write` | high | Add users and change their roles |
903
+ | `users:impersonate` | high | Act as another user, or get a session for them, audited |
904
+ | `db:core-refs` | high | Query core users, roles and hosts tables (read only) |
905
+ | `auth:provide` | high | Add login methods, second factors, SSH auth types |
906
+ | `auth:policy` | high | Set login rules: idle timeout, session length, 2FA |
907
+ | `device:serial` | high | Open serial and USB ports on the server |
908
+ | `desktop:local` | high | Use the user's own computer, desktop app only |
909
+ | `hosts:export` | high | Export hosts with their saved logins |
910
+ | `notify:hub` | high | Receive every alert (the alerts hub only) |
911
+ | `ui:layout` | high | Replace the whole app layout |
912
+ | `hosts:write` | medium | Add and edit hosts |
913
+ | `hosts:status-provide` | medium | Be the source of host status dots |
914
+ | `hosts:activity-provide` | medium | Be the source of the recent activity list |
915
+ | `hosts:lock` | medium | Make hosts it manages read only for everyone else |
916
+ | `network:probe` | medium | Check that a host answers on a TCP port |
917
+ | `credentials:use` | medium | Connect with saved credentials without seeing them |
918
+ | `credentials:write` | medium | Save new credentials |
919
+ | `network:outbound` | medium | Outbound HTTP through `ctx.fetch` |
920
+ | `network:serve` | medium | HTTP routes and sockets |
921
+ | `network:broadcast` | medium | Local network broadcasts, like Wake-on-LAN |
922
+ | `users:read` | medium | Usernames, roles and UI language |
923
+ | `events:core` | medium | Listen to core events |
924
+ | `notify:send` | medium | Send alerts |
925
+ | `audit:read` | medium | Read the audit log |
926
+ | `desktop:window` | medium | Open windows in the desktop app |
927
+ | `hosts:read` | low | Read hosts the user can see |
928
+ | `db:own` | low | Your own tables |
929
+ | `kv:own` | low | Small key value state |
930
+ | `files:own` | low | Your own folder on disk |
931
+ | `secrets:own` | low | Your own encrypted secrets |
932
+ | `settings:read-core` | low | Read Termix server settings |
933
+ | `plugins:read` | low | See installed plugins |
934
+ | `ui:surface` | low | Add tabs, panels and settings |
935
+ | `ui:theme` | low | Add color themes, CSS only |
889
936
 
890
937
  An update that adds a capability waits for an admin to approve it.
891
938