Skip to content

v1.8.0 — AI workbench

Choose a tag to compare

@thomas-stegemann thomas-stegemann released this 06 Jun 00:06
· 681 commits to main since this release

Highlights

AI side-panel (#25 — Phase 1 + Phase 2)
The workbench learned to think. Phase 1 ships a deterministic hint engine that runs entirely without an LLM — fifteen rules that read live workbench state (selected method, last response, recordings, protocol, mock count) and surface contextual hints in a new side-panel slot. Phase 2 ships the optional Kuestenlogik.Bowire.Ai NuGet: a Microsoft.Extensions.AI IChatClient seam backed by OllamaSharp, auto-detect for Ollama on 127.0.0.1:11434 + LM Studio on :1234, three endpoints (GET /api/ai/probe-local, GET /api/ai/status, POST /api/ai/chat), and CLI flags --ai-provider / --ai-endpoint / --ai-model. The standalone bowire CLI bundles the package; embedded hosts opt in by adding it. AI Settings UI (#63) lands the in-workbench picker for provider / endpoint / model — switching providers no longer needs a restart, persistence rides on IBowireUserStore, and embedded hosts that supply their own IChatClient win cleanly with a "host-managed" status badge. Findings triage (#61) adds a ? button next to every Vulnerable row in the fuzz panel that asks the model "is this real, and how do I fix it?" — colour-coded confidence score, suggested fix, in-memory cache. Outbound calls stay opt-in (probe only touches loopback, chat only goes where you point it).

Workbench mocks (#56 + #57)
Mocks finally have a UI. The new MockRegistry + /api/mocks surface lets the workbench start mocks from any recording with one click, list them in the sidebar, and stop them without dropping to a terminal. #57 adds a per-mock request log: every inbound call lands in a bounded ring buffer that the workbench tails live, so you can see exactly which step matched which incoming request and which ones missed. Backed by an IMockRequestObserver SPI so external observers (metrics emitters, tracers) can plug in.

Auth seam (#28 Phase A + #28 Phase B + #31 + #32)
The first real multi-user foundation. #31 adds the IBowireAuthProvider SPI so plugins can wire authentication schemes + a default authorization policy, and adds a Configure(IApplicationBuilder) hook + the UseBowireAuth() middleware so providers can mount callback paths / claims-transformation. #32 ships the OIDC plugin's required-claim filter and session-token forwarding for downstream service calls. #28 Phase A + B introduce the IBowireUserStore seam and migrate every per-user store onto it (EnvironmentStore, RecordingStore, CollectionStore, FlowStore, PluginManager, PluginUpdateCheckService, schema-hints, the new AI config file) — single-user installs keep the legacy flat ~/.bowire/ layout, multi-tenant deployments swap in a per-identity resolver once SCIM lands.

Self-telemetry (#29 — Phase 1 + Phase 2)
Bowire can now observe itself. Phase 1 ships the BowireTelemetry seam — a canonical ActivitySource + Meter on Kuestenlogik.Bowire with pre-declared instruments (bowire.invoke.count, bowire.invoke.duration, bowire.discover.count, bowire.plugin.load, bowire.mock.requests) — plus an opt-in AddBowireTelemetry() that wires OpenTelemetry against them. Phase 2 plumbs the instruments through the discovery loop (per-protocol probe counts + outcomes), the plugin scan (loaded vs disabled), and the mock pipeline (per-request counter with method / outcome / status tags). Operators opt in via --telemetry / Bowire:Telemetry:Enabled=true; OTLP endpoint / headers come from standard OTEL_EXPORTER_OTLP_* env vars. Bowire.Samples ships a Grafana 11 dashboard (Bowire.Samples/dashboards/bowire-overview.json) that reads non-zero panels from day one.

Collections (#30)
Postman-style named groups of saved requests, sequenced against the active environment. Backend persistence routes through the new CollectionStore (single-user installs land at ~/.bowire/collections.json, multi-tenant routes per identity via IBowireUserStore), and the new flow-to-collection export turns any saved flow into a runnable test suite.

Plugin lifecycle in the workbench (#27)
The plugins panel got an Inspect button + modal so you can see version, metadata, and recent activity for any installed plugin from the workbench instead of running bowire plugin list in a terminal. Pre-release support flows through the daily update check + the install path.

Multi-repo release cascade
The release pipeline now discovers sibling repos dynamically by querying the Kuestenlogik org for repos carrying the bowire-cascade GitHub topic — adding a new sibling to the cascade is now opt-in via that repo's own Settings → Topics, no PR against the main release workflow required. Cascade templates live in .github/sibling-templates/. Auto-PR + auto-merge use the org's rebase-only convention.


Maintenance

  • New post-release-floor-bump.yml workflow auto-bumps Directory.Build.props to <just-released>-dev after every successful release, opens a PR, no hand edit required.
  • Coverlet runsettings extended with GeneratedRegex on ExcludeByAttribute so the source-generator-emitted Regex partials no longer drag the line-coverage denominator.
  • 1209 new unit + integration tests added across the v1.8 cycle: solution-wide line coverage at 92.7 %, branch 79.2 %, method 95.4 % (up from 90.9 / 78.1 / 93.2 at v1.7.0). Notable jumps: CollectionStore, MockRequestLog, MockRegistry, EnvironmentStore, AsyncApi binding resolvers, BowireAiRuntime — all now ≥ 95 % line.
  • CodeQL cs/log-forging alert closed (#40) — defensive CR/LF scrub before logging mock IDs / recording display names.
  • Marketing site (bowire.io): sharper headings across 5 solution pages, fixed an invisible <code> in the dev-loop-debugging hero, fixed the protocol-search input stacking the tag prefix, refreshed stale "planned" marks on the MCP comparison.
  • Roadmap-sync workflow consolidated onto BOWIRE_DISPATCH_TOKEN.

Full Changelog: v1.7.0...v1.8.0