Class BowireComposeRailContribution

Namespace
Kuestenlogik.Bowire.Compose
Assembly
Kuestenlogik.Bowire.Compose.dll

Compose rail contribution — home for the ad-hoc Request Builder (#306 Phase G).

public sealed class BowireComposeRailContribution : IBowireRailContribution
Inheritance
BowireComposeRailContribution
Implements
Inherited Members

Constructors

BowireComposeRailContribution()

public BowireComposeRailContribution()

Properties

AlwaysOn

Whether the rail is part of the locked always-on set. Differs from DefaultEnabled: an always-on rail also can't be disabled at all. Defaults to false; only the four core rails (Home, Discover, Compose, Workspaces) ship as always-on.

public bool AlwaysOn { get; }

Property Value

bool

DisplayName

Human-readable label shown in the rail tooltip + Settings.

public string DisplayName { get; }

Property Value

string

Group

Visual group the rail belongs to. Adjacent rails with different group values get a divider between them. Built-in groups: "work", "scenarios", "quality", "hardening". New groups land at the bottom of the rail by default.

public string Group { get; }

Property Value

string

IconKey

Icon key from the workbench's SVG-icon catalogue (e.g. "house", "discover", "shield"). Resolved JS-side via svgIcon(key). Unknown keys fall back to a generic square placeholder.

public string IconKey { get; }

Property Value

string

Id

Stable identifier (e.g. "discover", "recordings", "security"). Must match the rail-mode id the JS bundle uses for routing — operators' localStorage.bowire_rail_mode values + deep links key off this. Case-sensitive (snake-lower).

public string Id { get; }

Property Value

string

MainPaneRendererKey

Identifier of a JS-side function the rail package's JS fragment registers on window.__bowireRailRenderers at load time. The core renderMain dispatcher looks up the renderer by id and invokes it instead of hard-coding the per-rail branch. Empty / null means "no rail-owned renderer; fall back to the core dispatcher arm".

public string? MainPaneRendererKey { get; }

Property Value

string

Remarks

Convention: railId + 'Main' (e.g. "recordingsMain", "benchmarksMain"). The hosted JS fragment writes window.__bowireRailRenderers["recordingsMain"] = function () { ... }; inside the shared IIFE. The renderer takes no arguments and returns the DOM root for the main pane.

RequiresWorkspace

When true, the rail's view only makes sense inside an active workspace (Recordings / Mocks / Collections / Flows / Benchmarks / Compose — anything that persists artefacts to a workspace folder). The rail button stays clickable (so tour spotlighting + the rail strip's tab semantics keep working) but a click without an active workspace redirects the operator to the Home rail, where the "Create your first workspace" CTA lives, and fires an explanatory toast. Defaults to false — rails that work standalone (Home, Discover, Traffic, Workspaces, Security, Settings) stay reachable at all times.

public bool RequiresWorkspace { get; }

Property Value

bool

SidebarKind

Sidebar template the rail renders. Recognised values: "none", "services", "collections", "environments", "recordings", "mocks", "workspaces", "sources", "benchmarks", "flows", "proxy", "security", "library". Adding a new value requires a matching arm in render-sidebar.js's dispatcher — see the sidebar.kind comment block in that file.

public string SidebarKind { get; }

Property Value

string

SidebarRendererKey

Identifier of a JS-side function the rail package's JS fragment registers on window.__bowireRailRenderers at load time. The core renderSidebar dispatcher looks up the renderer by id and invokes it instead of hard-coding the per-rail branch. Empty / null means "no rail-owned renderer; fall back to the core dispatcher arm" — so the slice can be moved incrementally rail-by-rail without breaking the bundle.

public string? SidebarRendererKey { get; }

Property Value

string

Remarks

Convention: railId + 'Sidebar' (e.g. "recordingsSidebar", "proxySidebar"). The hosted JS fragment writes window.__bowireRailRenderers["recordingsSidebar"] = function () { ... }; inside the shared IIFE. The renderer takes no arguments and returns the DOM root to mount as the sidebar — same contract as the legacy renderRecordingsSidebar() &c. arms.

SortIndex

Sort priority. Lower values appear higher in the rail strip. The built-in catalogue uses 100-step intervals so third-party rails can wedge between two built-ins without re-numbering everything.

public int SortIndex { get; }

Property Value

int