chore: v2.8.71 — remote clients (company hub), artifacts shared with chosen people, folders and viewable copies, fixes
Remote clients (docs/plans/remote-clients/README.md, B1–B3 for the Claude pool): - server/hub/ holds the hub-only code (devices, remote sessions, upload ingest, LAN gateway), required only in server mode; hub-boundary.test.js keeps local code from importing it. - A local install enrolls with `agenthub remote login` or Settings → AI tools → Company hub; the "Company account" AI Proxy (reserved name agenthub.company) sends a session through the hub's gateway, which adds a pool account's token — no credential reaches the machine. Only those sessions are uploaded, hourly and at their end; secret-shaped strings are redacted on the client. - Gateway refuses: unknown device (401), a message without a session id, an unregistered session under AGENTHUB_REMOTE_GATE=block, a user over quota (EQUOTA), a purged session (410). Device tokens 90 days, conversations 30. - New alert rule type remote_unmonitored: a company-account session its device never registered; a late registration clears the flag instead. - The hub imports a session once per upload round (chunks carry `more`), not once per chunk. Artifacts: - Share an artifact with chosen people (artifact_shares, PATCH sharedWith, GET /api/artifacts/people) besides everyone; a "Shared with you" tab. Only the owner or an admin sees or edits who it is shared with; audited. - Folders: each account's own arrangement (agenthub.artifacts.folders pref). - A claude.ai page keeps a copy viewable without the publishing account: its HTML file (and supporting files) snapshotted at publish, or the copy Claude saves for a Doc / Slides / Design in artifacts-export/ (a synchronous PostToolUse hint hook, scripts/artifact-export-hint.js, admin switch), attached to the page at Stop. Viewed in HtmlFrame's sandbox, Markdown, or pdf.js (pdfjs-dist 6.4.299, legacy build, loaded only for a PDF). Fixes: - tmux: a cached /proc/<pid>/exe of an exited server falls back to PATH's tmux (stop the last pane, start again within 10 s failed with ENOENT). - shelves: a shelf restores beside changes in other files. - chat: a finished reply ends the turn even with no hook at all. - Settings → AI tools: profile list display tweaks.
This commit is contained in:
@@ -184,6 +184,11 @@ function createApp() {
|
||||
: next()
|
||||
);
|
||||
app.use("/api/proxy-gw", require("./lib/proxy-gateway").proxyGateway);
|
||||
// Server mode only: the hub half of the remote-clients architecture
|
||||
// (server/hub/) — its gateway and device-token routes come before the body
|
||||
// parsers and the cookie gate. A local install never loads that folder.
|
||||
const hub = isServerMode() ? require("./hub") : null;
|
||||
if (hub) hub.mountEarly(app);
|
||||
app.use(express.json({ limit: "1mb" }));
|
||||
// Express 4's parser left `req.body` as `{}` when there was no JSON body;
|
||||
// Express 5's leaves it undefined, and handlers destructure it.
|
||||
@@ -245,6 +250,9 @@ function createApp() {
|
||||
app.use("/api/reports", reportsRouter);
|
||||
app.use("/api/webhooks", webhooksRouter);
|
||||
app.use("/api/remote-sources", remoteSourcesRouter);
|
||||
// A local AgentHub's link to the company hub (lib/remote-client.js).
|
||||
app.use("/api/remote-client", require("./routes/remote-client"));
|
||||
if (hub) hub.mountRoutes(app);
|
||||
app.use("/api/metrics", metricsRouter);
|
||||
app.get("/api/openapi.json", (_req, res) => {
|
||||
res.json(openApiSpec);
|
||||
@@ -903,6 +911,11 @@ function startBackgroundServices() {
|
||||
if (quotaTimer.unref) quotaTimer.unref();
|
||||
setImmediate(quotaSweep);
|
||||
}
|
||||
// The hub's remote-client conversations past their retention (server/hub/);
|
||||
// on a local install enrolled with a hub, the hourly upload of its
|
||||
// Company-account sessions (lib/remote-client.js — idle when not enrolled).
|
||||
if (require("./lib/auth").isServerMode()) require("./hub").startTimers();
|
||||
else require("./lib/remote-client").startUploader();
|
||||
// Another dashboard on the same database (hooks reach only one of them)
|
||||
// moving a lane: re-broadcast it here. One pragma per beat when nothing
|
||||
// changed — and only while such a dashboard runs at all: alone on its data
|
||||
|
||||
Reference in New Issue
Block a user