Lifecycle
Versioning & restart-to-load
DeskSSH versions five things independently: the Desk, the Contract, the app-runtime, each app, and each adapter. Plugins declare the ranges they need; the Desk resolves them at load.
Under 0.x a minor bump is treated as potentially breaking — a caret range like ^0.1.0 does not admit 0.2.0. So an app pins a contract range and a desk range; an adapter pins a contract range. If a joint does not resolve, the plugin is declined with a readable reason instead of loading broken.
Plugins live under ~/.deskssh/plugins/. You add or update one from Settings → Import and it loads on the next restart — a predictable, auditable lifecycle, never hot code injection into a running session.
~/.deskssh/plugins/
├── adapters/ # .json — OS adapters (declarative)
└── apps/ # .zip — app plugins (bundled)