# EmbeddedSessionMixin

Auto-generated @jbrowse/mobx-state-tree API for the current JBrowse release —
see [pluggable elements](https://jbrowse.org/jb2-staging/docs/developer_guide/) for concepts. Built into
JBrowse core.
[View source](https://github.com/GMOD/jbrowse-components/blob/main/packages/embedded-core/src/EmbeddedSessionMixin.ts).

Everything the two single-view embedded products' sessions
(react-linear-genome-view, react-circular-genome-view) share: the mixin set they
compose and the three getters that read the root model. The twin of
createEmbeddedRootModel one level down.

A mixin the product composes, deliberately, rather than a factory taking the
product's view type and tracks mixin as parameters. That factory is the obvious
shape and it does not work: `types.compose`'s overloads are declared over
`IModelType<P, O, FC, FS>`, so a model handed in as a naked type parameter has
nothing to infer those four from and the composed result degrades —
`session.view` becomes `any`, which typechecks at every embedder call site and
is caught by nothing. Keeping every argument to `compose` concrete is what keeps
the products' views typed.

So each product still spells out its own tracks mixin, `view` prop, and the
`views`/`addView`/`removeView` members that read `self.view` — those are the
ones that need its concrete view type.

Members a composed model contributes are listed here too, so these tables are
the whole surface.

## Properties

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="property-id">**id**</span><br><code>id: ElementId</code> |  | [BaseSessionModel](../basesessionmodel#property-id) |
| <span id="property-name">**name**</span><br><code>name: types.string</code> |  | [BaseSessionModel](../basesessionmodel#property-name) |
| <span id="property-focusedviewid">**focusedViewId**</span><br><code>focusedViewId: types.maybe(types.string)</code> | <span data-pagefind-ignore>used to keep track of which view is in focus</span> | [BaseSessionModel](../basesessionmodel#property-focusedviewid) |
| <span id="property-highlightsvisible">**highlightsVisible**</span><br><code>highlightsVisible: types.stripDefault(types.boolean, true)</code> | <span data-pagefind-ignore>one session-wide toggle for all region highlight bands (URL/view highlights and bookmark overlays)</span> | [BaseSessionModel](../basesessionmodel#property-highlightsvisible) |
| <span id="property-drawerposition">**drawerPosition**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>drawerPosition: types.optional( types.string, () =&gt; localStorag…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>drawerPosition: types.optional(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.string,&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;() =&gt; localStorageGetItem('drawerPosition') ?? 'right',&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#property-drawerposition) |
| <span id="property-drawerwidth">**drawerWidth**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>drawerWidth: types.stripDefault( types.refinement(types.integer…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>drawerWidth: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.refinement(types.integer, width =&gt; width &gt;= minDrawerWidth),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;384,&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#property-drawerwidth) |
| <span id="property-widgets">**widgets**</span><br><code>widgets: types.stripDefault(types.map(widgetStateModelType), {})</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#property-widgets) |
| <span id="property-activewidgets">**activeWidgets**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>activeWidgets: types.stripDefault( types.map(types.safeReferenc…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>activeWidgets: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.map(types.safeReference(widgetStateModelType)),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{},&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#property-activewidgets) |
| <span id="property-minimized">**minimized**</span><br><code>minimized: types.stripDefault(types.boolean, false)</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#property-minimized) |
| <span id="property-connectioninstances">**connectionInstances**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>connectionInstances: types.stripDefault( types.array(pluginMana…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>connectionInstances: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.array(pluginManager.pluggableMstType('connection', 'stateModel')),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[],&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> |  | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#property-connectioninstances) |
| <span id="property-connectiontrackconfigs">**connectionTrackConfigs**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>connectionTrackConfigs: types.stripDefault( types.frozen&lt;Record…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>connectionTrackConfigs: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.frozen&lt;Record&lt;string, ConnectionTrackConfigEntry&gt;&gt;(),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{},&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> | <span data-pagefind-ignore>Persisted configs of connection tracks the user has opened, keyed by trackId. Unlike `connectionInstances` (stripped from snapshots, holds the whole fetched hub), this holds only the tracks in use, so an open connection track resolves synchronously on session load without re-establishing the connection.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#property-connectiontrackconfigs) |

## Volatiles

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="volatile-selection">**selection**</span><br><code>selection: undefined as unknown</code> | <span data-pagefind-ignore>this is the globally "selected" object. can be anything. code that wants to deal with this should examine it to see what kind of thing it is.</span> | [BaseSessionModel](../basesessionmodel#volatile-selection) |
| <span id="volatile-hovered">**hovered**</span><br><code>hovered: undefined as unknown</code> | <span data-pagefind-ignore>this is the globally "hovered" object. can be anything. code that wants to deal with this should examine it to see what kind of thing it is.</span> | [BaseSessionModel](../basesessionmodel#volatile-hovered) |
| <span id="volatile-queueofdialogs">**queueOfDialogs**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>queueOfDialogs: [] as [DialogComponentType, Record&lt;string, unkn…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>queueOfDialogs: [] as [DialogComponentType, Record&lt;string, unknown&gt;][]</code></pre></dialog></span> |  | [BaseSessionModel](../basesessionmodel#volatile-queueofdialogs) |
| <span id="volatile-preferencesoverrides">**preferencesOverrides**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>preferencesOverrides: observable.map&lt;string, unknown&gt;(undefined…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>preferencesOverrides: observable.map&lt;string, unknown&gt;(undefined, {&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;deep: false,&#10;&#160;&#160;&#160;&#160;&#160;&#160;})</code></pre></dialog></span> | <span data-pagefind-ignore>runtime user-preference overrides keyed by preference id, resolved by `getPreference` against the `configuration.preferences` admin defaults. Empty here (config-only); products that let users edit preferences load and persist these via localStorage. A runtime override map layered over config defaults, kept off the snapshot since prefs are local UI.<br><br>An `observable.map` (not a plain object reassigned wholesale) so each preference is its own tracked key: writing one (`setScrollZoom`) can't invalidate a reader of another (`getDisplayTypeDefault` in a track's `rpcProps`). A single spread-replaced object made every setter wake every reader, so toggling scroll-to-zoom re-fetched every track. For the same reason each promoted per-display-type default is a flat composite key (see `displayTypeDefaultKey`), not a single nested `displayTypeDefaults` object — promoting one default can't wake readers of a different one.<br><br>`deep: false` is load-bearing, not a micro-optimization. The default enhancer wraps an object/array value in a MobX Proxy on `set`, and a promoted default is handed straight back out by `getConf` — so an object-valued promotable slot (alignments `colorBy`) put a Proxy into `rpcProps()`, and V8's structured-clone serializer rejects a Proxy: `worker.postMessage` threw `DataCloneError` on the next fetch of any track following that default (electron IPC and `structuredClone` in the share bake likewise). The map still notifies per key on `set`, so shallow values lose no reactivity — and nothing can mutate a preference in place, because `setPreferenceOverride` freezes what it stores.</span> | [BaseSessionModel](../basesessionmodel#volatile-preferencesoverrides) |
| <span id="volatile-snackbarmessages">**snackbarMessages**</span><br><code>snackbarMessages: observable.array&lt;SnackbarMessage&gt;()</code> |  | [SnackbarModel](../snackbarmodel#volatile-snackbarmessages) |
| <span id="volatile-errordialog">**errorDialog**</span><br><code>errorDialog: undefined as ErrorDialogState &#124; undefined</code> | <span data-pagefind-ignore>the error currently shown in the stack-trace dialog. Kept off the dialog queue so it can stack on top of an already-open dialog (e.g. the one whose action raised the error) instead of waiting behind it</span> | [SnackbarModel](../snackbarmodel#volatile-errordialog) |
| <span id="volatile-poppedout">**poppedOut**</span><br><code>poppedOut: false</code> | <span data-pagefind-ignore>true while the visible widget is shown in a modal dialog instead of the drawer. Volatile because a restored session that opened straight into a modal, with no drawer behind it, is disorienting</span> | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#volatile-poppedout) |

## Getters

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="getter-version">**version**</span><br><code>string</code> |  | EmbeddedSessionMixin |
| <span id="getter-assemblynames">**assemblyNames**</span><br><code>string[]</code> |  | EmbeddedSessionMixin |
| <span id="getter-assemblymanager">**assemblyManager**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp;…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; {…} &amp; IStateTreeNode&lt;…&gt;</code></pre></dialog></span> |  | EmbeddedSessionMixin |
| <span id="getter-root">**root**</span><br><code>TypeOrStateTreeNodeToStateTreeNode&lt;ROOT_MODEL_TYPE&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-root) |
| <span id="getter-jbrowse">**jbrowse**</span><br><code>any</code> |  | [BaseSessionModel](../basesessionmodel#getter-jbrowse) |
| <span id="getter-rpcmanager">**rpcManager**</span><br><code>RpcManager</code> |  | [BaseSessionModel](../basesessionmodel#getter-rpcmanager) |
| <span id="getter-configuration">**configuration**</span><br><code>Instance&lt;JB_CONFIG_SCHEMA&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-configuration) |
| <span id="getter-adminmode">**adminMode**</span><br><code>boolean</code> |  | [BaseSessionModel](../basesessionmodel#getter-adminmode) |
| <span id="getter-textsearchmanager">**textSearchManager**</span><br><code>TextSearchManager</code> |  | [BaseSessionModel](../basesessionmodel#getter-textsearchmanager) |
| <span id="getter-assemblies">**assemblies**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, d…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;string, unknown&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;...&gt;)[]</code></pre></dialog></span> |  | [BaseSessionModel](../basesessionmodel#getter-assemblies) |
| <span id="getter-dialogcomponent">**DialogComponent**</span><br><code>DialogComponentType</code> |  | [BaseSessionModel](../basesessionmodel#getter-dialogcomponent) |
| <span id="getter-dialogprops">**DialogProps**</span><br><code>Record&lt;string, unknown&gt;</code> |  | [BaseSessionModel](../basesessionmodel#getter-dialogprops) |
| <span id="getter-animationmode">**animationMode**</span><br><code>AnimationMode</code> | <span data-pagefind-ignore>resolved feature-layout animation mode (never undefined)</span> | [BaseSessionModel](../basesessionmodel#getter-animationmode) |
| <span id="getter-scrollzoom">**scrollZoom**</span><br><code>boolean</code> | <span data-pagefind-ignore>resolved scroll-to-zoom preference. Global and personal (never shared in a session snapshot); every wheel-zoom view reads this single value.</span> | [BaseSessionModel](../basesessionmodel#getter-scrollzoom) |
| <span id="getter-numbergrouping">**numberGrouping**</span><br><code>boolean</code> | <span data-pagefind-ignore>resolved thousand-separator preference. Read for display in the Preferences dialog; the formatter itself reads a plain module variable set at startup in each realm (see `setNumberGrouping`), because worker- built strings can't see a main-thread observable.</span> | [BaseSessionModel](../basesessionmodel#getter-numbergrouping) |
| <span id="getter-snackbarmessageset">**snackbarMessageSet**</span><br><code>Map&lt;string, SnackbarMessage&gt;</code> |  | [SnackbarModel](../snackbarmodel#getter-snackbarmessageset) |
| <span id="getter-visiblewidget">**visibleWidget**</span><br><code>Widget &#124; undefined</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#getter-visiblewidget) |
| <span id="getter-connections">**connections**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, d…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;string, unknown&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;...&gt;)[]</code></pre></dialog></span> |  | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#getter-connections) |
| <span id="getter-themeoptions">**themeOptions**</span><br><code>SerializableThemeArgs</code> | <span data-pagefind-ignore>Serializable theme description (the canonical `themeOptions` contract shared with the app-core/web sessions). This is what crosses the RPC worker boundary — e.g. the canvas display reads `getSession(self).themeOptions` in its rpcProps so worker-baked colors (CDS frames, stroke fallback) honor the config `theme` slot.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#getter-themeoptions) |
| <span id="getter-palette">**palette**</span><br><code>JBrowsePalette</code> | <span data-pagefind-ignore>Every color JBrowse renders, resolved to plain strings and free of any UI toolkit. This is what rendering reads. See the canonical `ThemeManagerSessionMixin` getter of the same name.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#getter-palette) |
| <span id="getter-styletheme">**styleTheme**</span><br><code>JBrowseStyleTheme</code> | <span data-pagefind-ignore>The palette plus the sizing tokens `makeStyles` reads. See the canonical `ThemeManagerSessionMixin` getter of the same name.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#getter-styletheme) |
| <span id="getter-theme">**theme**</span><br><code>Theme</code> | <span data-pagefind-ignore>Resolved MUI theme, mirroring the product's ThemeProvider. Lets headless/RPC consumers derive theme-dependent state without a mounted component. Shares its colors with `palette` by construction.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#getter-theme) |

## Methods

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="method-getpreferencedefault">**getPreferenceDefault**</span><br><code>(key: string) =&gt; unknown</code> | <span data-pagefind-ignore>the admin/embedder `configuration.preferences` value for a key, ignoring any runtime override — i.e. what a reset falls back to. Exposed rather than inlined because "differs from the default" is a question the Preferences reset diff asks about settings this map doesn't hold (see `defaultUseWorkspaces`).</span> | [BaseSessionModel](../basesessionmodel#method-getpreferencedefault) |
| <span id="method-getpreference">**getPreference**</span><br><code>(key: string) =&gt; unknown</code> | <span data-pagefind-ignore>resolved value of a user preference: a runtime override if the user set one, otherwise the admin/embedder `configuration.preferences` default. The override map is empty unless the product loads it (web/desktop).</span> | [BaseSessionModel](../basesessionmodel#method-getpreference) |
| <span id="method-getdisplaytypedefault">**getDisplayTypeDefault**</span><br><code>(displayType: string, slot: string) =&gt; unknown</code> | <span data-pagefind-ignore>resolved value of a per-display-type slot default the user promoted (see `setDisplayTypeDefault`); undefined when nothing was promoted.</span> | [BaseSessionModel](../basesessionmodel#method-getdisplaytypedefault) |
| <span id="method-getdisplaytypedefaults">**getDisplayTypeDefaults**</span><br><code>() =&gt; { displayType: string; slot: string; value: unknown; }[]</code> | <span data-pagefind-ignore>every per-display-type default the user has promoted, as `{ displayType, slot, value }` — the inventory the Preferences dialog lists and clears one at a time (`setDisplayTypeDefault(…, undefined)`).<br><br>Here rather than filtered out of `getPreferenceChanges` by the dialog, because the composite-key layout is this file's: a consumer that recognized these rows by matching the path head is exactly the coupling `DISPLAY_TYPE_DEFAULTS_PATH_HEAD` stopped being exported over, where a rename on one side alone silently no-ops the other.</span> | [BaseSessionModel](../basesessionmodel#method-getdisplaytypedefaults) |
| <span id="method-getpreferencechanges">**getPreferenceChanges**</span><br><code>() =&gt; TrackConfigChange[]</code> | <span data-pagefind-ignore>every runtime preference-override that currently differs from its config/admin default, as `{ path, from, to }` rows — the exact set `clearPreferenceOverrides` reverts. Backs the confirmation diff shown before "Reset to defaults" (mirrors the per-track changes dialog). A scalar pref (animationMode, scrollZoom) whose override equals the default is omitted (reverting it is a no-op); each promoted per-display-type default is always a difference from the un-promoted state, so `from` reads "(default)".</span> | [BaseSessionModel](../basesessionmodel#method-getpreferencechanges) |
| <span id="method-getreferringmultiple">**getReferringMultiple**</span><br><code>(trackIds: string[]) =&gt; Map&lt;string, ReferringNode[]&gt;</code> | <span data-pagefind-ignore>Walk the tree once and map each requested trackId to the nodes holding a `types.reference` that resolves to it (a view's track entry, a config editor widget). Track configs are matched by trackId, not identity, so a frozen base and its hydrated MST node compare equal.</span> | [ReferenceManagementSessionMixin](../referencemanagementsessionmixin#method-getreferringmultiple) |
| <span id="method-getreferring">**getReferring**</span><br><code>(trackId: string) =&gt; ReferringNode[]</code> | <span data-pagefind-ignore>The nodes currently referring to `trackId` (see getReferringMultiple).</span> | [ReferenceManagementSessionMixin](../referencemanagementsessionmixin#method-getreferring) |
| <span id="method-gettracklistmenuitems">**getTrackListMenuItems**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(config: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;, v…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(config: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;, view?: TrackActionView &#124; undefined) =&gt; MenuItem[]</code></pre></dialog></span> | <span data-pagefind-ignore>flattened menu items for use in hierarchical track selector</span> | [TrackMenuSessionMixin](../trackmenusessionmixin#method-gettracklistmenuitems) |
| <span id="method-gettrackactionmenuitems">**getTrackActionMenuItems**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>({…}: { config: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNod…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>({…}: { config: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;; view?: TrackActionView &#124; undefined; }) =&gt; MenuItem[]</code></pre></dialog></span> |  | [TrackMenuSessionMixin](../trackmenusessionmixin#method-gettrackactionmenuitems) |
| <span id="method-getactivethemeoptions">**getActiveThemeOptions**</span><br><code>(_name?: string &#124; undefined) =&gt; ThemeOptions &#124; undefined</code> | <span data-pagefind-ignore>Raw `ThemeOptions` for the active theme, which every view's SVG export threads into each display's `renderSvg` as a `configTheme` and rebuilds outside React. The config slot is the whole answer here because it is the whole of an embedded product's theming: no picker, no `allThemes`, and it is what `setThemeMode` writes and `palette` resolves from. `name` is accepted and ignored — the app session's counterpart looks a named preset up in `allThemes()`.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#method-getactivethemeoptions) |

## Actions

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="action-setselection">**setSelection**</span><br><code>(thing: unknown) =&gt; void</code> | <span data-pagefind-ignore>set the global selection, i.e. the globally-selected object. can be a feature, a view, just about anything<br><br>A feature is unwrapped on the way in, so app state never holds a jexlFeatureProxy. `isFeature` accepts a proxy, but on one `id` is a data field rather than the method the Feature type promises — every consumer doing `isFeature(selection) ? selection.id() : …` would throw.</span> | [BaseSessionModel](../basesessionmodel#action-setselection) |
| <span id="action-clearselection">**clearSelection**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>clears the global selection</span> | [BaseSessionModel](../basesessionmodel#action-clearselection) |
| <span id="action-sethovered">**setHovered**</span><br><code>(thing: unknown) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-sethovered) |
| <span id="action-sethighlightsvisible">**setHighlightsVisible**</span><br><code>(arg: boolean) =&gt; void</code> | <span data-pagefind-ignore>toggle all region highlight bands across every view</span> | [BaseSessionModel](../basesessionmodel#action-sethighlightsvisible) |
| <span id="action-revealhighlights">**revealHighlights**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>turn highlight bands back on, so a newly made highlight or bookmark is never silently swallowed by an earlier "highlights off"</span> | [BaseSessionModel](../basesessionmodel#action-revealhighlights) |
| <span id="action-setpreferenceoverride">**setPreferenceOverride**</span><br><code>(key: string, value: unknown) =&gt; void</code> | <span data-pagefind-ignore>set a runtime user-preference override (see `getPreference`). Mutates volatile state; products persist these to localStorage. An `undefined` value deletes the key (rather than leaving a phantom entry that `getPreference` reads as absent) so the store never holds dead keys.</span> | [BaseSessionModel](../basesessionmodel#action-setpreferenceoverride) |
| <span id="action-clearpreferenceoverrides">**clearPreferenceOverrides**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>clear every runtime preference override at once — scrollZoom, animationMode, and every promoted per-display-type default (see `setDisplayTypeDefault`) — so each falls back to its config/admin default. Backs the Preferences dialog "Reset to defaults" button.</span> | [BaseSessionModel](../basesessionmodel#action-clearpreferenceoverrides) |
| <span id="action-clearpreferenceoverride">**clearPreferenceOverride**</span><br><code>(key: string) =&gt; void</code> | <span data-pagefind-ignore>clear a single runtime preference override (see `getPreference`) so it falls back to its config/admin default. Backs the per-entry reset in the Preferences dialog "Reset to defaults" confirmation.</span> | [BaseSessionModel](../basesessionmodel#action-clearpreferenceoverride) |
| <span id="action-resetpreferencechange">**resetPreferenceChange**</span><br><code>(path: string[]) =&gt; void</code> | <span data-pagefind-ignore>revert one row emitted by `getPreferenceChanges`, addressed by its display `path`. Backs the per-entry reset in the Preferences dialog's "Reset to defaults" confirmation.<br><br>Lives here rather than in that dialog because this model owns both path shapes it has to undo: a promoted per-display-type default, whose row path is a readable label over a flat composite storage key, and every other override, whose path *is* its key. The dialog used to re-derive the first case from an exported path-head constant.</span> | [BaseSessionModel](../basesessionmodel#action-resetpreferencechange) |
| <span id="action-setscrollzoom">**setScrollZoom**</span><br><code>(flag: boolean) =&gt; void</code> | <span data-pagefind-ignore>set the global scroll-to-zoom preference (see the `scrollZoom` getter)</span> | [BaseSessionModel](../basesessionmodel#action-setscrollzoom) |
| <span id="action-setdisplaytypedefault">**setDisplayTypeDefault**</span><br><code>(displayType: string, slot: string, value: unknown) =&gt; void</code> | <span data-pagefind-ignore>promote (or, with `value` undefined, clear) a per-display-type slot default. Just a preference override under one flat composite key (see `displayTypeDefaultKey`), so it persists and independently tracks like any other pref, and clearing deletes only that key.</span> | [BaseSessionModel](../basesessionmodel#action-setdisplaytypedefault) |
| <span id="action-setname">**setName**</span><br><code>(str: string) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-setname) |
| <span id="action-setfocusedviewid">**setFocusedViewId**</span><br><code>(viewId: string &#124; undefined) =&gt; void</code> | <span data-pagefind-ignore>`undefined` is "no view is focused", which the property has always been able to hold (`types.maybe`) and this had no way to spell. Nothing cleared it on teardown as a result: a view that was focused when it left the session left its id behind, and since every consumer compares `focusedViewId === view.id`, the id matched nothing, the focus ring vanished with nothing to say why, and the dead id persisted into a saved or shared session. `takeOut` clears it now.</span> | [BaseSessionModel](../basesessionmodel#action-setfocusedviewid) |
| <span id="action-removeactivedialog">**removeActiveDialog**</span><br><code>() =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-removeactivedialog) |
| <span id="action-queuedialog">**queueDialog**</span><br><code>(doneCallback: DoneCallback) =&gt; void</code> |  | [BaseSessionModel](../basesessionmodel#action-queuedialog) |
| <span id="action-notify">**notify**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(message: string, level?: NotificationLevel &#124; undefined, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(message: string, level?: NotificationLevel &#124; undefined, action?: SnackAction &#124; SnackAction[] &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-notify) |
| <span id="action-notifyerror">**notifyError**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(errorMessage: string, error?: unknown, extra?: unknown, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(errorMessage: string, error?: unknown, extra?: unknown, action?: SnackAction &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-notifyerror) |
| <span id="action-seterrordialog">**setErrorDialog**</span><br><code>(state: ErrorDialogState &#124; undefined) =&gt; void</code> |  | [SnackbarModel](../snackbarmodel#action-seterrordialog) |
| <span id="action-pushsnackbarmessage">**pushSnackbarMessage**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(message: string, level?: NotificationLevel &#124; undefined, action…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(message: string, level?: NotificationLevel &#124; undefined, actions?: SnackAction[] &#124; undefined) =&gt; void</code></pre></dialog></span> |  | [SnackbarModel](../snackbarmodel#action-pushsnackbarmessage) |
| <span id="action-popsnackbarmessage">**popSnackbarMessage**</span><br><code>() =&gt; SnackbarMessage &#124; undefined</code> |  | [SnackbarModel](../snackbarmodel#action-popsnackbarmessage) |
| <span id="action-removesnackbarmessage">**removeSnackbarMessage**</span><br><code>(message: string) =&gt; void</code> |  | [SnackbarModel](../snackbarmodel#action-removesnackbarmessage) |
| <span id="action-setdrawerposition">**setDrawerPosition**</span><br><code>(arg: string) =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-setdrawerposition) |
| <span id="action-updatedrawerwidth">**updateDrawerWidth**</span><br><code>(drawerWidth: number) =&gt; number</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-updatedrawerwidth) |
| <span id="action-resizedrawer">**resizeDrawer**</span><br><code>(distance: number) =&gt; number</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-resizedrawer) |
| <span id="action-addwidget">**addWidget**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(typeName: string, id: string, initialState?: any, conf?: unkno…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(typeName: string, id: string, initialState?: any, conf?: unknown) =&gt; any</code></pre></dialog></span> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-addwidget) |
| <span id="action-showwidget">**showWidget**</span><br><code>(widget: any) =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-showwidget) |
| <span id="action-hidewidget">**hideWidget**</span><br><code>(widget: any) =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-hidewidget) |
| <span id="action-minimizewidgetdrawer">**minimizeWidgetDrawer**</span><br><code>() =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-minimizewidgetdrawer) |
| <span id="action-showwidgetdrawer">**showWidgetDrawer**</span><br><code>() =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-showwidgetdrawer) |
| <span id="action-popoutwidget">**popoutWidget**</span><br><code>() =&gt; void</code> | <span data-pagefind-ignore>show the visible widget in a modal dialog, freeing the drawer column</span> | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-popoutwidget) |
| <span id="action-returnwidgettodrawer">**returnWidgetToDrawer**</span><br><code>() =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-returnwidgettodrawer) |
| <span id="action-hideallwidgets">**hideAllWidgets**</span><br><code>() =&gt; void</code> |  | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-hideallwidgets) |
| <span id="action-editconfiguration">**editConfiguration**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(configuration: (ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNo…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(configuration: (ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;) &#124; { ...; }, opts?: { ...; } &#124; undefined) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>opens a configuration editor to configure the given thing, and sets the current task to be configuring it</span> | [DrawerWidgetSessionMixin](../drawerwidgetsessionmixin#action-editconfiguration) |
| <span id="action-makeconnection">**makeConnection**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNod…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;, initialSnapshot?: object) =&gt; any</code></pre></dialog></span> |  | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-makeconnection) |
| <span id="action-breakconnection">**breakConnection**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slot…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;…&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;…&gt;) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>Remove a live connection instance. Tolerant of an already-dormant connection (its instance is stripped from the session on reload). Leaves persisted open-track configs alone — the connect() error path calls this and the user's already-open tracks must survive a transient failure. Full removal goes through `deleteConnection`.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-breakconnection) |
| <span id="action-teardownconnection">**teardownConnection**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slot…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;…&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;…&gt;) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>Close every track a connection contributed — the live instance's tracks plus any persisted open-track configs (a dormant connection, never expanded this session, still renders its opened tracks from `connectionTrackConfigs`) — from all views/widgets, drop the live instance, and drop the persisted configs. The session is left as if the connection had never loaded.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-teardownconnection) |
| <span id="action-deleteconnection">**deleteConnection**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slot…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(configuration: ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;…&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;...&gt;) =&gt; any</code></pre></dialog></span> | <span data-pagefind-ignore>Fully remove a connection: tear down its tracks and live instance, then delete its config.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-deleteconnection) |
| <span id="action-addconnectionconf">**addConnectionConf**</span><br><code>(connectionConf: AnyConfiguration) =&gt; any</code> | <span data-pagefind-ignore>Adds to the **config**, not the session: `jbrowse.connections`, which every visitor to this instance loads. jbrowse-web overrides this so a non-admin's connection lands in `sessionConnections` instead — see WebSessionConnectionsMixin, whose `addSessionConnectionConf` is what to call when you mean the session specifically rather than "wherever this user's edits go".<br><br>Applications without that override (Desktop, the embedded products) have only this one destination, and it is the right one there: their config and session are saved as a single document.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-addconnectionconf) |
| <span id="action-clearconnections">**clearConnections**</span><br><code>() =&gt; void</code> |  | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-clearconnections) |
| <span id="action-captureconnectiontrack">**captureConnectionTrack**</span><br><code>(trackId: string) =&gt; void</code> | <span data-pagefind-ignore>Snapshot a just-opened connection track's config into `connectionTrackConfigs` so it survives session reload. No-op if the track isn't connection-provided or is already captured (edits go through `updateConnectionTrackConfig`).</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-captureconnectiontrack) |
| <span id="action-updateconnectiontrackconfig">**updateConnectionTrackConfig**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(trackConf: Record&lt;string, unknown&gt; &amp; { trackId: string; }) =&gt;…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(trackConf: Record&lt;string, unknown&gt; &amp; { trackId: string; }) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>Persist an edit to an opened connection track. The full config is stored (not a delta): the connection's fetched "base" isn't present at load, so only a complete config resolves synchronously.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-updateconnectiontrackconfig) |
| <span id="action-setconnectiontrackconfig">**setConnectionTrackConfig**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(trackId: string, connectionId: string, config: Record&lt;string,…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(trackId: string, connectionId: string, config: Record&lt;string, unknown&gt;) =&gt; void</code></pre></dialog></span> | <span data-pagefind-ignore>Upsert one opened connection track's persisted config.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-setconnectiontrackconfig) |
| <span id="action-pruneconnectiontrackconfig">**pruneConnectionTrackConfig**</span><br><code>(trackId: string) =&gt; void</code> | <span data-pagefind-ignore>Drop a connection track's persisted config once no open view still references it, so the session doesn't accumulate closed tracks.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-pruneconnectiontrackconfig) |
| <span id="action-hydrateconnection">**hydrateConnection**</span><br><code>(connectionId: string) =&gt; void</code> | <span data-pagefind-ignore>Lazily establish a single connection by id if it isn't already live — used when its category is expanded in the track selector. Fetches silently (no view launch / success snackbar); already-open tracks keep rendering from `connectionTrackConfigs` meanwhile. Idempotent.</span> | [ConnectionManagementSessionMixin](../connectionmanagementsessionmixin#action-hydrateconnection) |
| <span id="action-dereferencetrack">**dereferenceTrack**</span><br><code>(trackId: string, referring: ReferringNode[]) =&gt; void</code> | <span data-pagefind-ignore>Remove `trackId` from every view referring to it and close any config editor widget open on it. Runs immediately: the walk that produced `referring` has finished, so mutating those views here is safe.</span> | [ReferenceManagementSessionMixin](../referencemanagementsessionmixin#action-dereferencetrack) |
| <span id="action-setthememode">**setThemeMode**</span><br><code>(mode: "dark" &#124; "light") =&gt; void</code> | <span data-pagefind-ignore>Point the session at light or dark. One write, not two: the `theme` slot is what `themeOptions` ships to the renderer, so the labels baked in the worker follow it, and `palette` is derived from the same slot, so what React draws follows it too. An embedder who sets only a React-side palette leaves the baked labels behind.<br><br>Merges rather than replaces, at both levels. `theme` is a frozen slot, so a bare `setConf(session, 'theme', { palette: { mode } })` — the obvious form, and what the build-your-own examples each wrote — drops every other key in it. That silently discards whatever the host passed as `createViewState`'s `configuration.theme` (a brand `primary`, say) the first time their dark-mode toggle fires. `resolvePalette` spreads `configTheme.palette` over the preset shallowly, so `mode` and `primary` are siblings and both levels have to survive.</span> | [EmbeddedSessionThemeMixin](../embeddedsessionthememixin#action-setthememode) |

