feat(server-mode): pane presence and typing audit (sharing phase 4)

A pane's tab shows the other people who have it open (pane-presence.js,
in memory, fed by the /ws-pty attach; GET /api/lanes/:id/presence and the
pane_presence broadcast to the owner and full collaborators) and says
"Billed to <name>" for a pane a collaborator opened (startedBy on the run).
The first real keystroke of each attach into a shared workspace's pane by
anyone but its owner is audited as `type into <run id>` (mouse, focus and
terminal replies to tmux do not count). The pty socket now pings, so a
vanished browser is ended at the next re-check and leaves the presence list.
This commit is contained in:
2026-11-06 11:32:25 +07:00
parent 879a6bb02d
commit 18e574a765
21 changed files with 568 additions and 8 deletions
+11
View File
@@ -738,6 +738,17 @@ const paths = {
},
},
},
"/api/lanes/{id}/presence": {
get: {
tags: ["Lanes"],
summary: "Who has which of a workspace's panes open",
description:
"Server mode (local mode: `{panes: {}}`). `{panes: {<run id>: [{id, name}]}}` — the users with a terminal attached to each pane, from memory; changes arrive as the WebSocket message `pane_presence` `{laneId, runId, users}` (the workspace's owner and the users it is shared with).",
operationId: "getLanePresence",
parameters: [idParam],
responses: { 200: { description: "`{panes}`.", ...json(obj) }, 404: notFound },
},
},
"/api/lanes/{id}/sessions/{sid}/shares": {
get: {
tags: ["Lanes"],