feat(server-mode): share a workspace with other users (sharing phase 1)
A workspace's owner (or an admin) shares it from its ⋯ menu → Share… (lane_shares, GET/PUT /api/lanes/:id/shares, audited). The users it is shared with see it, its sessions, Changes, history and live updates, join and type into its open terminals, commit and push — every check through scope.js (canSeeLane, sessionWhere, laneWhere, broadcastAudience viewers). Rename, reset, remove, delete and sharing stay the owner's or an admin's (403 ENOTOWNER), and a collaborator starts no AI session there yet (403 ECOLLABSTART; a plain terminal tab is fine). Budgets and Today stay on owned rows only (ownedOnlySessionWhere). Taking a share back sends lane_access to those users and their terminals close at the next attach re-check. Under S3 a collaborator works as the owner's Linux account; the Share dialog says so plainly (docs/plans/workspace-sharing/, R1 option a).
This commit is contained in:
@@ -701,6 +701,43 @@ const paths = {
|
||||
},
|
||||
},
|
||||
},
|
||||
"/api/lanes/{id}/shares": {
|
||||
get: {
|
||||
tags: ["Lanes"],
|
||||
summary: "The users a workspace is shared with",
|
||||
description:
|
||||
"Server mode (local mode: `{shares: [], canManage: false}`). `{shares:[{id, username, name, sharedAt}], canManage}` — names only; `canManage` is whether this caller (the owner or an admin) may change the list. A user it is shared with may read it too.",
|
||||
operationId: "getLaneShares",
|
||||
parameters: [idParam],
|
||||
responses: { 200: { description: "`{shares, canManage}`.", ...json(obj) }, 404: notFound },
|
||||
},
|
||||
put: {
|
||||
tags: ["Lanes"],
|
||||
summary: "Set the users a workspace is shared with",
|
||||
description:
|
||||
"`{userIds:[…]}` is the WHOLE list (≤ 200 enabled users, never the owner). The owner or an admin only (`403 ENOTOWNER`); same-origin; each user added or taken off is written to the audit log. A user it is shared with sees it and works in it like its owner — under S3 as the owner's Linux account — except rename, reset, remove, delete and sharing (`ENOTOWNER`), and starts no AI session in it yet (`ECOLLABSTART`). Users taken off get `lane_access` and lose access at once.",
|
||||
operationId: "setLaneShares",
|
||||
parameters: [idParam],
|
||||
requestBody: {
|
||||
required: true,
|
||||
content: {
|
||||
"application/json": {
|
||||
schema: {
|
||||
type: "object",
|
||||
required: ["userIds"],
|
||||
properties: { userIds: { type: "array", items: { type: "integer" } } },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
responses: {
|
||||
200: { description: "`{shares}`.", ...json(obj) },
|
||||
400: { description: "EBADUSER or ELOCALMODE." },
|
||||
403: { description: "ENOTOWNER." },
|
||||
404: notFound,
|
||||
},
|
||||
},
|
||||
},
|
||||
"/api/lanes/{id}/memory": {
|
||||
get: {
|
||||
tags: ["Lanes"],
|
||||
|
||||
Reference in New Issue
Block a user