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
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
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
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
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
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
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
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; }