Member Junction
    Preparing search index...

    Where the user was standing when a record was opened — captured by NavigationService.OpenEntityRecord into the record tab's configuration. Powers the origin crumb in the records region ("← App › Page"), which takes the user straight back to that page. Origin is PROVENANCE, not location: records are a global surface with no canonical parent, so this trail is a convenience affordance ("return to where I came from"), never an ancestry claim. All fields optional because capture is best-effort (e.g. no active app at open time, or the source tab has since been closed).

    interface RecordSourceContext {
        sourceAppId?: string;
        sourceAppName?: string;
        sourceLabel?: string;
        sourceNavItemName?: string;
        sourceNavLabel?: string;
        sourceParentOrigin?: RecordSourceContext;
        sourceQueryParams?: Record<string, string>;
        sourceRecordEntity?: string;
        sourceRecordId?: string;
        sourceTabId?: string;
    }
    Index

    Properties

    sourceAppId?: string
    sourceAppName?: string
    sourceLabel?: string

    Display label for NON-TAB origins (overlays, dialogs, agent actions — e.g. 'Conversation', 'Search'). When present, the crumb renders this label instead of "App › Page". Surfaces that aren't workspace tabs MUST set this (via NavigationOptions.recordSource) instead of letting captureSourceContext blame whatever tab sits behind the overlay.

    sourceNavItemName?: string

    Canonical nav-item identity of the source tab (its configuration navItemName). Titles MUTATE — dashboards rename their tab as the user drills (Data Explorer sets it to the selected entity) — so identity checks and nav re-resolution use THIS; the label is display-only. Absent for dynamic nav items, which never get navItemName stamped.

    sourceNavLabel?: string

    Display title of the source tab at capture (what the user saw)

    sourceParentOrigin?: RecordSourceContext

    The PARENT record's own origin, carried forward so a return can restore it instead of recapturing.

    Without this the crumb ping-pongs. Under the preview-tab model an in-record link CONSUMES the parent's tab, so by the time the user clicks the crumb back, the parent's tab no longer holds the parent — the reactivate-the-tab fast path in ReturnToRecordSource misses and it re-opens the parent, capturing wherever the user is standing (the CHILD) as the new origin. The two records then point at each other and the entry point ("Data Explorer › Data") is lost for good.

    Nesting makes this unwind at any depth: Data › A › B › C returns to B carrying A, then to A carrying Data. Truncated at MAX_RECORD_ORIGIN_DEPTH — it rides in the tab configuration and is persisted with the workspace.

    sourceQueryParams?: Record<string, string>

    Query params to apply when returning via the app + nav-label fallback

    sourceRecordEntity?: string

    Set when the record was opened from INSIDE another record (Matt's record→record call, 2026-07-28: the crumb points at the PARENT record). Identity — not the tab id — is what the return path verifies and, when the parent's tab has been closed, re-opens.

    sourceRecordId?: string
    sourceTabId?: string

    The exact workspace tab the user was on — highest-fidelity return target