feat: choose your own pool account; skills with "token" in a doc name upload; System Health off Linux

- Skill snapshot/upload: a key file's name (.env, *.pem, id_rsa, .netrc,
  .credentials.json…) is always refused, but a word like token/secret/
  password/credential only in a data file's name — design-tokens.md or
  count_tokens.py is skill content, not a key.
- System Health: off Linux the History, CPU threads and Busiest processes
  cards (all read from /proc) are left out instead of shown empty; the CPU
  bar without a sample and Windows' always-zero Load row go too.
- Users pick their own pool account per tool (/api/me/pool-accounts,
  Settings → AI tools), within their groups, refused while pinned.
- Admin user detail, 9router update, session replay and Antigravity
  catalog changes from parallel sessions.
This commit is contained in:
2026-10-28 10:41:53 +07:00
parent 4999325210
commit 0f17efe3b4
39 changed files with 1306 additions and 230 deletions
+26 -1
View File
@@ -109,7 +109,11 @@ start (`server/db.js`), and `member` is no longer accepted.
`/api/settings`, `/updates`, `/codex-config`,
`/git-credentials`, `/ai-tools`, `/import`, `/pricing`, `/budgets`,
`/webhooks`, `/remote-sources`, `/reports`, `/pets`, `/users` and
`/alerts/rules` (`ADMIN_WRITE_PREFIXES` in `server/lib/auth.js`), plus a write
`/alerts/rules` (`ADMIN_WRITE_PREFIXES` in `server/lib/auth.js`) — except
the two update buttons any signed-in user may press, `POST
/api/ai-tools/update-all` and `POST /api/ai-proxies/9router/update`
(`MEMBER_WRITE_EXCEPTIONS`; both run only what the catalog / the fixed 9router
job names) — plus a write
to a shared AI Proxy (see [AI Proxy profiles](#ai-proxy-profiles)) and the
host-wide parts of `/cc-config` (see
[Your own Claude Code config](#your-own-claude-code-config)). A
@@ -609,6 +613,27 @@ by team (Users page → **Account pool → Groups**, server mode only,
an account takes it out of every group; deleting a group sends its members
back to the shared pool and removes no account.
### A user's own pool account
When the pool holds more than one account a user may use, they pick which one
their own new sessions run on: **Settings → AI tools → Pool account**, one
select per tool (Claude, Codex, Cursor), every role, server mode only
(`GET/PUT /api/me/pool-accounts`, `account_choices`, `server/lib/account-pins.js`).
- The list is only what their group allows (or the shared pool); a choice
outside it is refused (`ENOACCOUNT`), and one later taken from the group
falls back to the balancer.
- **Automatic** (the default) leaves it to the balancer.
- An admin's pin wins and locks the select (`ELOCKED`); the choice comes back
once the pin is removed.
- A Claude login goes into the user's home at once, like an admin's switch,
so running panes follow it; Codex and Cursor take it at the next session (a
ChatGPT login still waits while another holds the home).
- It is the user's own change: the login cookie only (a pane token cannot),
audited, no password step-up. The Users page's user detail shows it as
"chose <account>". Oh My Pi has no pool to choose from (its sharing is the
host's one login).
The tab bar also shows Oh My Pi (its login sharing, below) and every other
installed tool, which says it has no pool (Antigravity keeps its Google login
in the system keyring; there is no key AgentHub could hand a session).