Session roleParticipants (OdySSEy Lite multi-user)
External systems that need per-role insights for a session should read:
GET /api/sessions/{id}(or/users) →sessionUsers[]withrole+externalId(HEAT Auth GUID). For OL, setSessionUser.Roleto the Auth first-name role code (station/seat). Do not store Auth email or legal names on the session.MetadataJson.roleParticipants(via sessionmetadatastring on GET, orPOST /api/sessions/query→metadataJson) → origin binding for bio/signal/cognitive.
Shape (object map, no arrays)
{
"roleParticipants": {
"version": 1,
"Aircraft_1": {
"role": "Aircraft 1",
"kind": "pilot",
"originUuid": "<capture-origin-uuid-or-null>",
"externalHeatId": "<auth-user-guid-or-null>",
"entityKey": "site:app:entity-or-null",
"marking": "TAMIM 11-or-null"
},
"C2_1": {
"role": "C2-1",
"kind": "c2",
"originUuid": null,
"externalHeatId": null,
"entityKey": null,
"marking": null
}
}
}Keys are slugified role labels (Aircraft 1 → Aircraft_1). Compatible with session-metadata-enrich (no arrays).
Who writes it
session-model.js builds the map from:
session-config.originRoleOverrides(uuid→role or role→{ originUuid, externalHeatId })- DIS role assignment (entity census) as last-resort
originUuid - Fixed aircraft / C2 station label slots even when unbound
Then await ctx.session.metadata.set("roleParticipants", …).
Downstream
- Cognitive / HR:
cognitive_load_by_origin/heartrate_by_originkeyed byoriginUuid; dashboards resolve viaroleParticipants. - Signal transcripts:
groupByOriginzip + merge byoriginUuid; dashboards flatten all entries.