Demo

Handing a conversation to a real person

When a visitor asks to talk to someone, the agent does not paste a link. A join card appears in the conversation, backed by a real room. This page plays that conversation end to end against this workspace's own room, then spells out the workflow behind it and every way joining can refuse.

Three doors

Not a mock — these read this workspace's own room. Start opens it in place and tells you first whether anyone is already in there. Book hands over to the real calendar. Join checks the name before it sends you anywhere.

The same three are offered in the chat as starter buttons — the agent has the tools behind each one, so pressing a starter does the thing rather than describing it.

Watch it happen

The conversation below plays itself. After three seconds the offer card presses its own button — the same press the agent makes when it decides a person is wanted — and the meeting arrives in the transcript. Move your cursor onto the card to stop the countdown and press it yourself.

Two things are load-bearing here. The countdown starts the conversation, never a camera: the meeting card that lands still waits for your tap, and visitors join on a guest role that cannot publish video at all. And the room mounts without its own chat — you are already in one, and a second box beside the video only makes you choose.

The meeting workflow

Six steps, and the visitor is carried through every one of them inside the thread they started in. Nothing hands them off to a calendar, an inbox, or a download.

  1. 01 Ask A visitor asks for a person. No link is pasted and nothing is scheduled.
  2. 02 Read The agent reads the standing room first — staffed, empty, or busy with someone else.
  3. 03 Room Staffed hands over that room and names the person. Otherwise a private room is opened.
  4. 04 Page The team is paged where it already listens, once per room per ten minutes.
  5. 05 Talk The room opens inside the transcript. Guest role: they can be seen and heard, they cannot broadcast.
  6. 06 Wrap The call ends in the same thread it started in, with what happens next attached.

What Join actually does

  1. 1. The card mounts, nothing else does

    The video client is a lazy import. Until someone taps Join, the browser has not fetched it, has not asked for a camera, and has not called the token endpoint.

  2. 2. Join asks the server for a token

    One request to /api/stream/token with the mode, the room slug and the workspace. The server looks the room up by that pair and signs a join token for the role the mode maps to.

  3. 3. A token connects, an error is written out in words

    With a token the room opens in place. Without one the card is replaced by a single sentence naming the cause, taken from the table below.

Every way joining can fail, and what the person reads

The server answers a failed token request with a short machine token. Showing that raw reads as a crash, so each one is mapped to a sentence that names the cause and only suggests retrying when retrying can fix it. These are read straight from the mapping the room itself uses.

Join error tokens, the sentence shown to the person, and who can reach each one
From the server What the person reads Who sees it
room not found That room doesn't exist, or it has been switched off. Anyone joining
unauthorized Sign in to host this room. Host only
forbidden You don't have permission to host in this workspace. Host only
authority check unavailable Permissions could not be checked just now. Reload in a moment. Host only
HMS credentials not configured Video is not configured for this site yet. Anyone joining
invalid_code That invite link is no longer valid. Invite links
invalid mode This room is misconfigured — the join mode is not one the server accepts. Anyone joining
Failed to get token The server did not return a join token. Anyone joining
Failed to reach token endpoint Couldn't reach the server. Check your connection and reload. Anyone joining
anything unmapped The room could not be joined. Anyone joining

A visitor handed a room from a conversation always joins as a guest, so the three host-only rows are unreachable from that path. They exist for the operator opening the same room to host it.

Where the room comes from

The agent calls one tool. A room is created for that conversation, or the existing one is reused if the visitor asks again, and the reason they gave is appended to the room's thread every time. The team is alerted wherever it already listens, with a button that opens the room. The card then arrives in the same reply — there is no second message to lose.

Rooms are provisioned by the workspace, not by the visitor, and anonymous requests are capped per hour. Past that cap the answer is no. A stranger is never seated in someone else's live call.