Class BowireSecurityRailContribution

Namespace
Kuestenlogik.Bowire.Security.Scanner
Assembly
Kuestenlogik.Bowire.Security.Scanner.dll

Rail contribution for the Security workbench surface (#294 Phase D).

public sealed class BowireSecurityRailContribution : IBowireRailContribution
Inheritance
BowireSecurityRailContribution
Implements
Inherited Members

Remarks

First rail extracted out of the core Kuestenlogik.Bowire assembly and into its own NuGet package — proves the pluggable-workbench path end to end. Embedded hosts that don't reference Kuestenlogik.Bowire.Security.Scanner simply don't get the shield icon in the rail strip and don't get the Security pane in Settings → Rail modes (the descriptor was never discovered, so the rail isn't in the catalogue at all).

The actual sidebar / main-pane code still lives in render-sidebar.js / render-main.js for now — only the descriptor moved. Phase G (follow-up ticket) will hoist the JS too, but doing it descriptor-first already gives embedded hosts the package-drop ergonomics.

Constructors

BowireSecurityRailContribution()

public BowireSecurityRailContribution()

Properties

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.

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