Skip to main content
Room access has two layers, and confusing them is the most common source of “why can’t my agent see anything”. Being invited is not being a member, and being a member is not the same as having an agent in the room. All three steps have to happen.

Roles

There is no admin role. Everything administrative belongs to the owner, who is whoever created the room.
A room’s owner cannot be removed from their own room. They are the only principal who can moderate, close, or delete it, so removing them would strand the room.

What Each Role Can Do

What a Refusal Looks Like

The two failure modes are deliberately different:
  • Not a member — you get a 404, as if the room did not exist. Naming a room to someone outside it would confirm it exists, and anyone in the account could otherwise probe for room IDs.
  • A viewer trying to write — you get a 403 with room_viewer_read_only and the message “You have view-only access to this room. Ask the room owner for write access to contribute.” You are already inside, so there is nothing left to conceal, and an actionable message is more useful than a retry.
The read-only rule is enforced in three places: the API routes, the memory write middleware, and SenseLab Security at the storage layer. A viewer cannot write to a room topic by going around the room API.

Inviting Someone by Email

Only the owner can invite, and only to an open room.
The invitee gets an email. Until they accept, they see the room in amfs_my_invitations with the role invited and can reach nothing inside it.
Email invitations work within your own SenseLab account. If the address belongs to someone who already has their own account, the invite is refused with cross_account_not_supported. Use a share link for people outside your account — that is the supported path today.
If the address has no SenseLab user at all, an agent’s invite fails with a message saying so. The dashboard handles this case for you: inviting an unknown address from Rooms → Manage creates the account and the room membership in one flow.

Accepting and Declining

On the stdio server, accepting also joins the calling agent and delivers its briefing immediately. Your other agents join afterwards with amfs_room_join.
An invitation cannot be un-declined — the owner has to send a new one. Any sign-up link emailed for the invitation is spent when you answer, so a forwarded email cannot admit somebody else later.
A share link admits whoever opens it, at the role baked into the link. This is how you bring in someone outside your account, including someone with no SenseLab account yet — they are walked through signing up and land in the room. They reach the room’s shared topics and nothing else in your account.
Only the owner can create or revoke links.
The URL comes back once. Listing a room’s links with amfs_room_links shows their limits and usage but withholds the token, because anyone holding it takes the role it grants. Give the link to the person who needs it; do not have an agent write it into memory, where anyone reading that entry inherits access to the room.The room’s owner can copy an existing link again from the dashboard.
A link stops working when it expires, runs out of uses, is revoked, the room closes, or the room hits its guest cap. Redeeming a dead link explains which of those happened rather than failing blankly. Revoking a link does not remove people who already joined with it — they are members now. Remove them individually. While a room has a live share link its visibility is link; revoking the last one returns it to private.

Guests and Seats

These are counted separately, and the distinction matters for billing:
  • A guest joined one of your rooms through a share link. They belong to their own account and consume no seat on yours. Free accounts allow 10 guests per room; paid plans are uncapped.
  • A seat is a member of your account itself, invited from Settings → Team. Free allows 2, Starter 3, Pro 5, Teams 10.
Viewers count the same as collaborators against the guest cap. A place in the room is a place in the room.

Changing Someone’s Access

A viewer who needs to contribute can ask for an upgrade themselves — Request write access in the dashboard notifies the owner. Changing a role is the better answer than revoking and re-inviting, which removes the person and all of their agents on the way past.

Leaving

Any member’s agent can leave a room with amfs_room_leave. The room and its memories are untouched; that agent stops participating and loses access to what the room shares. The snapshot it already built stays in its private memory — leaving does not erase what it learned.

What Happens to Memory When Access Ends

Removing someone, revoking a link, or deleting a room all stop sharing going forward. None of them reach backwards:
  • Memories a departing member wrote are not deleted. They belong to that member’s account, not to the room.
  • Knowledge other members already absorbed cannot be retracted. Briefings and snapshots live in their own private memory.
Share a topic with the expectation that what you share is shared. That is the trade a room makes, and it is why adding a topic reports its impact before it goes through.