Commit Graph
61 Commits
Author SHA1 Message Date
LukeGus d4ec444558 feat: finish the homepage plugin, move service links and canvas out of core (B19) 2026-09-24 15:07:25 -05:00
LukeGus 21937a6b02 feat: finish the ai plugin (B18) 2026-09-24 13:43:26 -05:00
LukeGus 6b4d1432ab feat: finish the automations plugin (B17) 2026-09-24 13:05:44 -05:00
LukeGus 993a91c899 feat: finish the docker plugin (B15) 2026-09-24 11:58:20 -05:00
LukeGus 0a3f05d99d feat: finish the host-metrics plugin, move host status into core (B16) 2026-09-24 11:21:23 -05:00
LukeGus 14eb558b85 feat: finish the remote-desktop plugin (B14) 2026-09-24 01:02:45 -05:00
LukeGus 0af2c94983 feat: turn session recording into a plugin (B13) 2026-09-24 00:09:48 -05:00
LukeGus a276f6898c feat: move session sharing and collab rooms into a plugin (B12) 2026-09-23 23:42:46 -05:00
LukeGus 791d8656a1 feat: convert serial console into the serial plugin 2026-09-23 23:06:37 -05:00
LukeGus 708eedb861 feat: convert tmux monitoring into a plugin (B10) 2026-09-23 22:42:56 -05:00
LukeGus 79d77678c9 feat: move the terminal fully into the ssh-terminal plugin (B9) 2026-09-23 21:41:22 -05:00
LukeGus 535126fd1b feat: finish the web-endpoint plugin, add ctx.desktop (B8) 2026-09-23 18:36:41 -05:00
LukeGus 1682861853 feat: convert ssh tunnels into a plugin 2026-09-23 17:27:28 -05:00
LukeGus c85c1fdb86 feat: convert file manager into a plugin 2026-09-23 16:27:29 -05:00
LukeGus c381955ed0 feat: finish the fleets plugin, add ctx.hosts and host-commands SDK (B4) 2026-09-23 13:10:18 -05:00
LukeGus 3b2c849514 feat: finish the fleets plugin, add ctx.hosts and host-commands SDK (B4) 2026-09-23 11:24:16 -05:00
LukeGus d2ff5fc78f feat: finish the tailscale plugin, including SSH auth (B3) 2026-09-23 09:41:20 -05:00
LukeGus e07221eaf3 feat: move snippets backend and tables into a plugin (B2) 2026-09-23 08:58:53 -05:00
LukeGus fdedca39fd feat: convert network-topology to a full plugin (B1) 2026-09-23 07:36:39 -05:00
LukeGus 95abe24798 fix: gate second factors after SSO/LDAP behind an admin setting 2026-09-23 07:17:03 -05:00
LukeGus f217d8db89 feat: rebuild workspaces as the reference plugin 2026-09-23 07:04:03 -05:00
LukeGus d774df8b41 feat: add auth extension points and one ssh connect pipeline 2026-09-23 00:44:33 -05:00
LukeGus e88d5a52e3 feat: load plugin frontends at runtime and remove plugin ids from the shell 2026-09-22 20:15:52 -05:00
LukeGus 49f0286a14 feat: give plugins their own settings and one settings screen 2026-09-22 18:31:19 -05:00
LukeGus cc15559ea1 feat: namespace plugin permissions and keep them valid when a plugin is off 2026-09-22 17:30:00 -05:00
LukeGus 8431570ff7 feat: serve plugin http and websockets from one mount instead of ports 2026-09-22 16:39:41 -05:00
LukeGus c496a093ca feat: give plugins their own tables, migrations and sync entities 2026-09-22 15:49:54 -05:00
LukeGus 5796186a1c feat: make each plugin an npm workspace built by a termix-plugin CLI 2026-09-22 15:09:50 -05:00
LukeGus 4758016f41 feat: collapse plugin runtime to one tier behind a plugin SDK 2026-09-22 14:11:50 -05:00
LukeGus 6e058f6e9e feat: move web endpoint into a first-party plugin 2026-09-22 12:30:35 -05:00
LukeGus 6f0dff58a3 feat: move workspaces into a first-party plugin 2026-09-22 10:45:15 -05:00
LukeGus 8742c5d381 feat: move tailscale device discovery and settings into a plugin
Adds plugins/tailscale/ with a devices sidebar tab, admin settings
section, and re-auth dialog. Host Metrics tailscale manager card and
SSH re-auth banner parsing stay in core.
2026-09-22 10:45:15 -05:00
LukeGus 5fbd5fb7e2 feat: move network topology into a first-party plugin 2026-09-22 10:45:15 -05:00
LukeGus e372b0eda7 feat: remove legacy alert rules, superseded by automations
Alert rules already auto-migrate into automations on boot and the old
engine stands down after. Deletes the rule/firing tables, routes, UI,
and AI tools; keeps notification channels since automations still use
them. Also fixes automations' notify step, which still called the
deleted repository.
2026-09-22 10:45:12 -05:00
LukeGus e0f14f2ecf feat: move automations into a first-party plugin 2026-09-22 08:14:03 -05:00
LukeGus a6f6a0439c feat: move fleets into a first-party plugin 2026-09-21 20:44:00 -05:00
LukeGus 76b2e5739a feat: wire remote-desktop plugin into core and rename i18n keys
Repoints core consumers (dispatcher, collab, session-sharing, tab
utils) at the plugin, adds isTabTypeAvailable gating for rdp/vnc/
telnet, widens hostCapability to accept an array, and renames the
guacamole i18n namespace to remoteDesktop.
2026-09-21 20:26:09 -05:00
LukeGus c6bcfdb80d feat: move remote desktop (RDP/VNC/Telnet) into a first-party plugin
Relocates guacamole backend/frontend source and tests into
plugins/remote-desktop, following the ssh-terminal/docker pattern.
2026-09-21 20:25:52 -05:00
LukeGus d440ce9073 feat: move proxmox discovery/import/sync into a first-party plugin 2026-09-21 19:20:17 -05:00
LukeGus 9db66d5780 feat: add cross-plugin secret references gated by the provider's RBAC permission 2026-09-21 17:09:28 -05:00
LukeGus 2d6c1cdecb feat: add a permission-gated UI action registry and action slots for plugins
Moves the terminal toolbar's hardwired AI button into a slot the ssh-terminal
plugin offers and the ai plugin fills, gated on ai.services.use.
2026-09-21 16:56:15 -05:00
LukeGus 225f618337 feat: add a permission-gated backend service registry for plugins 2026-09-21 16:23:00 -05:00
LukeGus 504710b065 feat: ship the AI assistant as a first-party in-process plugin
Moves src/backend/ai and its routes into plugins/ai, mounted through a
small /ai dispatcher instead of its own port. Moves the ai-enabled and
ai-private-endpoints settings routes out of user-settings-routes.ts
into the plugin too, so it has no leftover core dependents.
2026-09-21 15:20:05 -05:00
LukeGus c58ccbfc3f fix: harden plugin auth and add per-request identity for ctx calls
Require auth on /plugin-api, gate plugin enable/grant/revoke routes
behind admin.plugins.manage, and thread the calling user through
worker ctx.hosts/ctx.ssh calls instead of always using the install
owner. Also adds the plugin permissions grant/revoke UI.
2026-09-21 14:32:59 -05:00
LukeGus 19b70430a1 feat: ship host metrics as a first-party in-process plugin 2026-09-21 11:30:46 -05:00
LukeGus a2479c19b0 feat: ship docker as a first-party in-process plugin
Moves docker backend and frontend into plugins/docker/, alongside
ssh-terminal. Adds a host editor tab seam, a dashboard card registry,
and a build step to compile plugin backends into dist.
2026-09-21 09:55:37 -05:00
LukeGus c94a453f1e feat: ship the ssh terminal as a first-party in-process plugin
Adds a hardcoded process:transport-owner tier so the terminal can own its
WebSocket server and ssh2 clients, which cannot cross the worker boundary.
2026-09-21 08:28:50 -05:00
LukeGus 4e1dec8435 feat: dispatch plugin HTTP routes and wire the runtime into startup
ctx.http.route now registers a real router on the /plugin-api/:pluginId
dispatcher, replacing its stub 404. A plugin never touches the Express
req/res: it gets a plain summary and returns a plain object, so sockets
and session cookies stay on this side of the boundary. Authorization and
cookie headers are not forwarded.

Plugins load last in the start-up sequence, after the server is fully
wired, and are terminated before the database on shutdown so none can
outlive it. A plugin that fails to load cannot stop the backend.

fix: correct the nginx plugin-api location regex

The pattern was ^/plugin-api/(/.*)?$, which needs a double slash and so
never matched /plugin-api/<id>/<route>. Every other block in the file
uses ^/prefix(/.*)?$. Left alone, plugin routes would work in dev and
404 only behind Docker.
2026-09-21 07:19:02 -05:00
LukeGus 4311a0e98a feat: add plugin ctx broker with permission gate and audit
Every ctx call a plugin makes is checked against its granted
capabilities, performed by the main thread, then audited. A capability
must be both declared in the manifest and granted in the database, so
widening a plugin's reach always needs a new manifest the user can see,
never just a database row.

Audit attribution is set by the broker, not the plugin. The plugin
supplies only the details, so it cannot forge the actor.

fix: stop plugin workers seeing plaintext credentials in error messages

A failing ctx.ssh.connect handed the worker the raw error from deep in
the SSH stack, which embeds the connect config. The worker received, in
full:

  Authentication failed for root using password <SECRET>

where <SECRET> was the host's real plaintext password. Any plugin with
ssh.exec could read it by catching the error, defeating the whole point
of the handle-based ssh API.

Errors crossing the boundary are now sanitised. Only PluginFacingError
and PluginPermissionError, both authored here, reach a plugin verbatim;
anything else becomes a generic message and the real one goes to the
log. This uses a marker class rather than matching on message text,
because matching would start leaking again the moment an upstream error
happened to contain a familiar phrase.

Covered by credential-isolation.test.ts, which plants a sentinel in
every secret-bearing field and asserts it appears in no message the
worker ever receives.
2026-09-21 07:19:01 -05:00
LukeGus 1393fa7581 feat: route internal events through a shared plugin event bus
Formalises three ad-hoc publish paths that already existed:
automation-events.ts, metrics/automation-bridge.ts and the
hostSessionStatus singleton, now the host.session.status topic.

Both invariants the old code relied on are preserved. Publishing stays
fire-and-forget, so a failing subscriber cannot disturb a metrics poll or
a host delete. The automations engine subscribes to the bus at scheduler
start instead of being imported ad hoc, which keeps the edge
one-directional: automations may import repositories, hosts modules must
not import automations.
2026-09-21 07:19:01 -05:00