# JBrowseReactCircularGenomeViewSessionModel

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.
[View source](https://github.com/GMOD/jbrowse-components/blob/main/products/jbrowse-react-circular-genome-view/src/createModel/createSessionModel.ts).

The shared EmbeddedSessionMixin plus this product's tracks mixin and its single
CircularView. Both are spelled out here rather than passed to a shared factory
because `types.compose` cannot infer through a generic — see
EmbeddedSessionMixin.

The tracks mixin is the session-tracks one, the same the linear embed uses. The
plainer `TracksManagerSessionMixin` sends `addTrackConf` on to
`jbrowse.addTrackConf`, which the embedded root config model does not have — so
a host adding a track after mount got a TypeError, and there was no other door:
this product's whole track set had to be decided at build time.

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-view">**view**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>view: pluginManager.getViewType('CircularView')! .stateModel as…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>view: pluginManager.getViewType('CircularView')!&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;.stateModel as CircularViewStateModel</code></pre></dialog></span> |  | JBrowseReactCircularGenomeViewSessionModel |
| <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) |
| <span id="property-sessiontracks">**sessionTracks**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>sessionTracks: types.stripDefault( types.array(pluginManager.pl…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>sessionTracks: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.array(pluginManager.pluggableConfigSchemaType('track')),&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;[],&#10;&#160;&#160;&#160;&#160;&#160;&#160;)</code></pre></dialog></span> | <span data-pagefind-ignore>User-added session tracks (no matching admin config track). A non-admin's *edits* to an existing config track are stored as deltas (trackConfigDeltas), not here.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#property-sessiontracks) |
| <span id="property-trackconfigdeltas">**trackConfigDeltas**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>trackConfigDeltas: types.stripDefault( types.frozen&lt;Record&lt;stri…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>trackConfigDeltas: types.stripDefault(&#10;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;types.frozen&lt;Record&lt;string, PlainTrackConfig&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>Per-track config overrides for a non-admin, keyed by trackId, stored as a *delta* against the admin-owned base config (jbrowse.tracks entry) rather than a full copy — so a later admin change to an untouched field still flows through (see trackConfigDelta.ts). Frozen (not a typed track array) on purpose: a typed create() would fill defaults, erasing the "unset vs default" distinction the delta merge relies on.<br><br>`stripDefault` for the reason every other persisted prop beside it has it: without it the empty map is written into every snapshot and every share link, so a session that never overrode a track still ships `"trackConfigDeltas":{}`. It was the one prop added since that convention without it.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#property-trackconfigdeltas) |

## 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) |
| <span id="volatile-editabletrackconfigs">**editableTrackConfigs**</span><br><code>editableTrackConfigs: new Map&lt;string, EditableTrackConfig&gt;()</code> | <span data-pagefind-ignore>Per-track private working copies (non-admin), keyed by trackId. A plain Map — not observable, not persisted — mirroring the pluginManager hydration cache: it holds the live MST config node a shown track's in-place quick-edits mutate, so the shared frozen base is never touched. See [ADR-032](https://github.com/GMOD/jbrowse-components/blob/main/agent-docs/architecture-decision-records/adr-032-track-config-nodes-are-throwaway-views.md).<br><br>Not evicted: it's a pure memoization cache, bounded by the count of distinct tracks shown this session (each entry a lazily-hydrated config node), holding no authoritative state — the persisted delta is the source of truth, and reset/programmatic edits keep a retained copy in sync. Retention is volatile RAM only (never serialized), so it's not worth a reference-counted prune at every track-removal path.<br><br>Each entry carries the delta it mirrors, so a delta replaced from outside this mixin invalidates it — see `getEditableTrackConfig`.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#volatile-editabletrackconfigs) |

## Getters

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="getter-views">**views**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(ModelInstanceTypeProps&lt;_OverrideProps&lt;{ id: IOptionalIType&lt;…&gt;;…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(ModelInstanceTypeProps&lt;_OverrideProps&lt;{ id: IOptionalIType&lt;…&gt;; displayName: IMaybe&lt;…&gt;; minimized: IOptionalIType&lt;…&gt;; }, { ...; }&gt;&gt; &amp; ... 10 more ... &amp; IStateTreeNode&lt;...&gt;)[]</code></pre></dialog></span> |  | JBrowseReactCircularGenomeViewSessionModel |
| <span id="getter-version">**version**</span><br><code>string</code> |  | [EmbeddedSessionMixin](../embeddedsessionmixin#getter-version) |
| <span id="getter-assemblynames">**assemblyNames**</span><br><code>string[]</code> |  | [EmbeddedSessionMixin](../embeddedsessionmixin#getter-assemblynames) |
| <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](../embeddedsessionmixin#getter-assemblymanager) |
| <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) |
| <span id="getter-tracks">**tracks**</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> | <span data-pagefind-ignore>User-added session tracks first, then each admin config track with its delta (trackConfigDeltas) merged over it. A base track without a delta is returned unchanged by identity to keep the hydration cache warm.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#getter-tracks) |

## 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) |
| <span id="method-gettrackconfigchanges">**getTrackConfigChanges**</span><br><code>(trackId: string) =&gt; TrackConfigChange[]</code> | <span data-pagefind-ignore>The overridden slots for `trackId` (empty when it has no delta): each changed setting's path, its base/default value and the edited value. Drives the "view changes" dialog opened from the edited badge.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#method-gettrackconfigchanges) |
| <span id="method-geteditabletrackconfig">**getEditableTrackConfig**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(trackId: string, frozenConfig: unknown, schemaType: IAnyType)…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(trackId: string, frozenConfig: unknown, schemaType: IAnyType) =&gt; IAnyStateTreeNode &#124; undefined</code></pre></dialog></span> | <span data-pagefind-ignore>A non-admin's private working copy of a track config, created on first access from the current frozen (base+delta) value and cached by trackId, so a shown track's in-place quick-edits (setSlot) mutate this copy and never the shared frozen base node (see ADR-032). Undefined in admin mode — there the base jbrowse.tracks entry is edited in place. Called by TrackConfigurationReference during lazy hydration.<br><br>Cached against the delta it was built from, not by trackId alone. A delta this mixin wrote re-stamps the entry, so the copy an edit is still being typed into is never swapped out mid-keystroke; a delta replaced from outside — an undo's `applySnapshot` on the session, a session restore — cannot, so the next read rebuilds the copy from the delta that now exists. Reading `trackConfigDeltas` here is also what makes an undo re-resolve the reference at all: the resolver's caller is already subscribed to it through `getTrackById`.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#method-geteditabletrackconfig) |
| <span id="method-gettrackbyid">**getTrackById**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(id: string) =&gt; (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>(id: string) =&gt; (ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;) &#124; undefined</code></pre></dialog></span> | <span data-pagefind-ignore>Config for one trackId — a track, assembly sequence, or connection track — or undefined. Per-id reactive: every display resolves its config through this (via TrackConfigurationReference) and subscribes only to its own id, so one track's settings edit doesn't re-render the others.</span> | [TracksManagerSessionMixin](../tracksmanagersessionmixin#method-gettrackbyid) |
| <span id="method-gettracksbyid">**getTracksById**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>() =&gt; Record&lt;string, ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>() =&gt; Record&lt;string, ModelInstanceTypeProps&lt;…&gt; &amp; { setSubschema(slotName: string, data: Record&lt;…&gt;): any; setSlot(slotName: string, value: unknown): void; } &amp; IStateTreeNode&lt;...&gt;&gt;</code></pre></dialog></span> | <span data-pagefind-ignore>Every track config the session can resolve, keyed by trackId. Prefer the per-id reactive `getTrackById(id)`: reading this whole map subscribes the caller to *every* track, so an edit to any one of them wakes it — the reason internal display config resolution moved off it. Kept for plugins that look up ids in a non-reactive context.</span> | [TracksManagerSessionMixin](../tracksmanagersessionmixin#method-gettracksbyid) |

## Actions

<!-- prettier-ignore -->
| Member | Description | Defined by |
| --- | --- | --- |
| <span id="action-addview">**addView**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(typeName: string, initialState?: any) =&gt; ModelInstanceTypeProp…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(typeName: string, initialState?: any) =&gt; ModelInstanceTypeProps&lt;_OverrideProps&lt;…&gt;&gt; &amp; ... 10 more ... &amp; IStateTreeNode&lt;...&gt;</code></pre></dialog></span> | replaces view in this case | JBrowseReactCircularGenomeViewSessionModel |
| <span id="action-removeview">**removeView**</span><br><code>() =&gt; void</code> | does nothing | JBrowseReactCircularGenomeViewSessionModel |
| <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) |
| <span id="action-addsessiontrackconf">**addSessionTrackConf**</span><br><code>(trackConf: AnyConfiguration) =&gt; any</code> | <span data-pagefind-ignore>Add a track config to *this session*: it lands in `sessionTracks`, travels with the session when it is saved or shared, and never reaches the config.json the server hands every visitor.<br><br>**The default destination.** Everything that is not an Add-track workflow wants this one, whoever is looking — a session spec's `sessionTracks`, a URL's `&sessionTracks=`, and every track a feature stands up on the user's behalf. Mirrors `addSessionConnectionConf` in the connections mixins.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-addsessiontrackconf) |
| <span id="action-publishtrackconf">**publishTrackConf**</span><br><code>(trackConf: AnyConfiguration) =&gt; any</code> | <span data-pagefind-ignore>Publish a track config to the shared catalog if this user can, and fall back to their session if they cannot: an admin's goes to `jbrowse.tracks`, which the admin server writes back into the config.json every visitor is served; everyone else's goes to `sessionTracks`.<br><br>**Only the "Add track" workflows.** Those are where an admin adding a track means to add it for the whole site. A track a feature stands up on the user's behalf — a search result, a computed consensus, a reconstruction's segment labels — is not a catalog entry, and one admin click on this publishes it to every visitor, again on the next click, with a per-launch trackId that defeats the dedupe. `addSessionTrackConf` above is the destination for those.<br><br>An admin's track still goes to the session when it names an assembly the config.json does not carry — a session spec's, a MAF sample's own genome, a comparative view's synthesized pair. The Add-track widget takes its assembly from the containing view, so an admin adding a track while looking at one of those arrives here with a name no visitor can resolve, and publishing it writes an entry the server hands everyone and nobody can draw. The session is the one destination where that track works, so the click keeps working and the dangling entry is never written; a snackbar says which assembly moved it.<br><br>**The snackbar names the assembly and not the track**, which is what lets a batch collapse to one message: `pushSnackbarMessage` dedupes on the exact text, and `BulkAddTracksWorkflow` publishes in a loop, so interpolating the track name stacked one identical-but-for-a-name toast per file over an admin adding thirty. The assembly is the whole of what an admin has to act on anyway.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-publishtrackconf) |
| <span id="action-addtrackconf">**addTrackConf**</span><br><code>(trackConf: AnyConfiguration) =&gt; any</code> | <span data-pagefind-ignore>Deprecated alias of `addSessionTrackConf`. Call that, or `publishTrackConf`.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-addtrackconf) |
| <span id="action-updatetrackconfiguration">**updateTrackConfiguration**</span><br><code>(trackConf: PlainTrackConfig) =&gt; void</code> | <span data-pagefind-ignore>Persist a non-admin's edited track config as a delta (trackConfigDeltas) against the admin-owned base — only the changed slots — so the edits persist and are shared while admin changes to untouched fields still flow through. A user-added session track (no base) is edited in place. Everything else (admin edits, opened connection tracks) defers to the base mixin, which routes connection tracks to connectionTrackConfigs and the rest to the jbrowse config.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-updatetrackconfiguration) |
| <span id="action-resettrackconfiguration">**resetTrackConfiguration**</span><br><code>(trackId: string) =&gt; void</code> | <span data-pagefind-ignore>Drop a non-admin's delta (trackConfigDeltas) so the track reverts to its admin config (jbrowse.tracks) default. Unlike deleteTrackConf this does not dereference the track from open views — the base config re-resolves in place, so an open track stays open and simply reverts.</span> | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-resettrackconfiguration) |
| <span id="action-deletetrackconf">**deleteTrackConf**</span><br><span class="cell-more"><button type="button" class="cell-more-trigger"><code>(trackConf: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;…</code></button><dialog class="cell-dialog"><form method="dialog"><button class="cell-dialog-close" aria-label="Close">✕</button></form><pre><code>(trackConf: ModelInstanceTypeProps&lt;…&gt; &amp; {…} &amp; IStateTreeNode&lt;…&gt;) =&gt; any[] &#124; undefined</code></pre></dialog></span> |  | [SessionTracksManagerSessionMixin](../sessiontracksmanagersessionmixin#action-deletetrackconf) |

