chore: v2.8.5 — Trash opens on one folder per user, server setup installs S3

- Files → Trash: ONE sidebar entry. An admin's opens on a folder per user's
  Trash (My Trash first, item counts from GET /api/homes/trash, an unreadable
  one showing its error); a folder opens that user's Trash (path bar
  Trash › user, Up back to the folders). An admin may restore/purge in
  another user's Trash (audited); purging asks first. The merged "All users"
  list is gone from the UI.
- A home's Trash is its user's whole recycle bin (home store + host store,
  items tagged `store`).
- `agenthub server setup` installs one Linux user per account on Linux by
  default (`--no-system` opts out); install-system messages drop `sudo`.
- Settings → Git: the author email suggests <username>@<AGENTHUB_EMAIL_DOMAIN>.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-15 16:02:11 +07:00
parent 09efb089cf
commit 758609775f
27 changed files with 839 additions and 107 deletions
+34 -14
View File
@@ -15,8 +15,9 @@ Local mode does not change at all. The login code stays dormant until
> **What server mode separates, and what it does not.** In the dashboard and
> its API, each developer sees only their own workspaces and the sessions,
> prompts, events, tokens and cost under them (see [What each user sees](#what-each-user-sees)).
> Until [one Linux user per account](#one-linux-user-per-account) is installed
> (`agenthub server install-system`), every terminal pane runs as the one Linux
> On Linux, `agenthub server setup` installs [one Linux user per account](#one-linux-user-per-account)
> by default. Without it (`--no-system`, a machine that is not Linux, or an
> install that failed), every terminal pane runs as the one Linux
> account that runs the dashboard. An agent in a pane can then read every
> user's folders, transcripts and the database straight from disk. Without it,
> use server mode only with people you trust.
@@ -27,12 +28,14 @@ On the machine that will host the dashboard, logged in as the account that
runs it:
```bash
# 1. Turn server mode on, allow the public name, and create the first admin
# 1. Turn server mode on, allow the public name, create the first admin and,
# on Linux, install one Linux user per account (one sudo; it moves the
# dashboard to the system unit agenthub.service, which picks the mode up)
agenthub server setup --hostname agenthub.example.com --admin boss
# (asks for the admin's password twice; from a script: pipe it on stdin)
# 2. Restart the dashboard so it picks the mode up
systemctl --user restart agenthub # or: agenthub start
# 2. Log out and back in once, so your shell joins the agenthub groups
# (with --no-system instead: systemctl --user restart agenthub)
# 3. Add the other people
agenthub users add alice # developer
@@ -42,7 +45,14 @@ agenthub users add carol --role analyst # reads everyone, works in their o
`setup` writes `AGENTHUB_MODE=server` and `DASHBOARD_ALLOWED_HOSTS` into
AgentHub's settings file (`~/.config/agenthub/settings.env`). The real
environment and a checkout's `.env` still take priority over that file. Run
setup again whenever you need to: it creates an admin only when none exists.
setup again whenever you need to: it creates an admin only when none exists,
runs `install-system` only while `/etc/agenthub/server.conf` is missing, and
gives every user their Linux account (`users provision --all`, idempotent).
The machine needs what [What a new machine needs](#what-a-new-machine-needs-before-install-system)
lists first. If the install fails, server mode stays on with every pane on the
host account, and the error says so: fix the cause and run
`agenthub server install-system`, or choose that shared account on purpose
with `agenthub server setup --no-system`.
## Put HTTPS in front of it
@@ -687,7 +697,7 @@ a pane really is. Each case below is refused or bounded, with a test in
through `/opt/agenthub/libexec/tmux-member` (root's, in sudoers): it runs
the call with the binary of the member's running server (`/proc/<pid>/exe`,
found from their socket), else with `TMUX_BIN`, so a newer tmux never asks
an older server. Until `sudo agenthub server install-system` has installed
an older server. Until `agenthub server install-system` has installed
it, calls use `TMUX_BIN` directly, as before. A member's server keeps its
version until their last pane closes; the next start runs `TMUX_BIN`.
- **Users → Members' tmux** (admin/analyst read, admin acts): each member's
@@ -763,12 +773,21 @@ itself, once.
`/opt/agenthub/libexec` by `install-system` only — an update of AgentHub does
not touch root-owned files. When a release changes them (v2.7.7: `write-as`
learned `move`/`copy` for the File Explorer; v2.8.4 added `tmux-member`),
re-run it once:
re-run it once, as the host account and **without** `sudo` in front (it asks
for the sudo password itself; as root it refuses, and `sudo agenthub …` fails
with `command not found` because sudo's `secure_path` has no `~/.local/bin`):
```bash
sudo agenthub server install-system
agenthub server install-system
```
A member server that a newer tmux already reached before `tmux-member` was
installed can stay wedged: every call on that socket — `tmux-member`'s too —
prints `server exited unexpectedly`. If Users → Members' tmux shows it with
no panes, stop that one server (its pid is the `ah-<name>` process running
`tmux -S <USERS_ROOT>/<name>/.agenthub/tmux/sock`) with `sudo kill -9 <pid>`;
the next start runs a fresh server on `TMUX_BIN`. Never `tmux kill-server`.
Until then the File Explorer's move, copy and delete in a member's folder
answer `409 EUPGRADE` (listing, upload, new folder/file and zip work).
The same re-run installs `agenthub-provision delete`, behind the Users page's
@@ -803,9 +822,10 @@ again under the same name gets a NEW, empty Linux account and home.
4. AgentHub installed for the host account, as the plugin or a checkout
(`npm run setup && npm run build`), and running once
(`agenthub start`).
5. Server mode on, with the first admin:
`agenthub server setup --hostname agenthub.example.com --admin boss`
(see [Set it up](#set-it-up)).
5. Server mode itself is NOT a step before this: `agenthub server setup`
(see [Set it up](#set-it-up)) turns it on and then runs `install-system`
and `users provision --all` below itself. Run the Install steps by hand only
after a `setup --no-system` or a failed install, or to repeat one.
6. The AI tools members will use, installed for the host account (the AI
Tools page or by hand).
7. The HTTPS reverse proxy (see [Put HTTPS in front of it](#put-https-in-front-of-it)).
@@ -860,8 +880,8 @@ again changes nothing that is already in place):
What a new machine still needs by hand after it:
1. `agenthub users provision --all`: users created before S3 was on (the
admin from `server setup` is one) have no Linux account yet.
1. `agenthub users provision --all`: users created before S3 was on have no
Linux account yet (`server setup` already ran this for you).
2. Log out and back in once, so your own shell joins `agenthub` and
`agenthub-proc` (the unit gets them on its own).
3. `chmod o-rwx ~` for the host account if the installer warned: the database