Found while validating #2120 (ent#358/#361/#381), which merged the Workspace multi-agent chat.
What happens
The Workspace "+ New chat" picker (components/portal/PortalAgentPicker.vue) lets a client select several agents, captioned "they will share this conversation". Selecting 2+ routes to store.createRoom() → POST /api/rooms.
/api/rooms exists only in the enterprise submodule (shared_sessions). There is no OSS router with that prefix:
$ grep -rn 'prefix="/api/rooms"' src/backend --include='*.py'
src/backend/enterprise/backend/shared_sessions/router.py:29: prefix="/api/rooms",
So on an OSS-only build — or any install without the shared_sessions entitlement — picking two agents produces a 404, and Portal.vue renders the generic 'Could not start that chat.' The affordance is always offered and silently cannot work.
Why it regressed
The surface this replaced was gated. NavBar.vue before #2120:
<router-link v-if="enterpriseStore.isEntitled('shared_sessions')" to="/sessions">
#2120 removed that entry (ent#381) and moved the capability into the picker, but no equivalent gate came with it. The new /workspace/r/:roomId route also carries no requiresEntitlement, unlike the /sessions/:roomId? route it replaced.
Why this is not a one-liner
isEntitled() reads enterprise_features from /api/settings/feature-flags, which requires platform auth. The Workspace is reachable by an external client on an email-OTP portal session with no platform JWT, so the flag is not currently available to the principal that needs it. Fixing this properly means exposing a rooms-availability signal to a portal principal (e.g. on the /my-agents roster payload or a portal-scoped flags read), then gating the multi-select on it.
Acceptance criteria
Related: #2120, abilityai/trinity-enterprise#361, abilityai/trinity-enterprise#381
Found while validating #2120 (ent#358/#361/#381), which merged the Workspace multi-agent chat.
What happens
The Workspace "+ New chat" picker (
components/portal/PortalAgentPicker.vue) lets a client select several agents, captioned "they will share this conversation". Selecting 2+ routes tostore.createRoom()→POST /api/rooms./api/roomsexists only in the enterprise submodule (shared_sessions). There is no OSS router with that prefix:So on an OSS-only build — or any install without the
shared_sessionsentitlement — picking two agents produces a 404, andPortal.vuerenders the generic'Could not start that chat.'The affordance is always offered and silently cannot work.Why it regressed
The surface this replaced was gated.
NavBar.vuebefore #2120:#2120 removed that entry (ent#381) and moved the capability into the picker, but no equivalent gate came with it. The new
/workspace/r/:roomIdroute also carries norequiresEntitlement, unlike the/sessions/:roomId?route it replaced.Why this is not a one-liner
isEntitled()readsenterprise_featuresfrom/api/settings/feature-flags, which requires platform auth. The Workspace is reachable by an external client on an email-OTP portal session with no platform JWT, so the flag is not currently available to the principal that needs it. Fixing this properly means exposing a rooms-availability signal to a portal principal (e.g. on the/my-agentsroster payload or a portal-scoped flags read), then gating the multi-select on it.Acceptance criteria
shared_sessions, the picker does not offer multi-agent selection (or offers it visibly disabled with a reason) — never a dead-ended 404/workspace/r/:roomIdrefuses/redirects when rooms are unavailable, rather than rendering an empty roomRelated: #2120, abilityai/trinity-enterprise#361, abilityai/trinity-enterprise#381