What's Changed
- Add headless
s100 identifypick command; lift pick logic to Datasets.Pipelines (#480) by @philliphoff in #481 - Add S-101 overscale indication (status-bar pill + on-chart curtain) by @philliphoff in #484
- Depth assimilation across S-101/S-102/S-104 in the pick report (#479) by @philliphoff in #482
- Fix PerfRunner ctor probe to tolerate trailing optional parameters (#491) by @philliphoff in #492
- Add burst-render PerfRunner scenarios by @philliphoff in #499
- Add STR-packed R-tree spatial index for IVectorSource (fixes #490) by @philliphoff in #494
- Wire viewport-scoped sampling through the coverage pipeline (#487) by @philliphoff in #493
- Precomputed line LOD pyramid for vector rendering (#489) by @philliphoff in #500
- Coverage overview pyramid: shoal-biased mipmaps for S-102 (#486) by @philliphoff in #498
- PR-3: awaited open-time line LOD pre-build (#489) by @philliphoff in #501
- S-104: off-by-default gridded surface + S-102-style water-area clipping (#483) by @philliphoff in #485
- Add shoal-aware S-102 downsampling by @philliphoff in #506
- style: drop
s_static-field prefix to match encoded naming rules (#461) by @philliphoff in #471 - Add CLI version and update notifications by @philliphoff in #507
- Add comprehensive agent guidance to the s100 CLI by @philliphoff in #509
- Notify Viewer users when updates are available by @philliphoff in #510
- Support explicit viewports for single coverage renders by @philliphoff in #511
- Prepare Mapsui renderer for extraction by @philliphoff in #513
- Extract reusable Mapsui layer-band management by @philliphoff in #514
- Rename Mapsui dataset result by @philliphoff in #519
- Enforce S-100 Part 15 permit security by @philliphoff in #520
- Add captured Mapsui rendering options by @philliphoff in #521
- Add renderer-neutral map presentation state by @philliphoff in #522
- Support Part 15 data-status and chained signatures by @philliphoff in #524
- Add S-104 and S-111 DCF1 station-series support by @philliphoff in #523
- Add renderer-neutral map dataset state by @philliphoff in #525
- Project Viewer map state through neutral contracts by @philliphoff in #526
- Apply map presentation explicitly by @philliphoff in #527
- Split Viewer map host capabilities by @philliphoff in #528
- Add opt-in metatile raster jobs by @philliphoff in #529
- Add reusable Mapsui navigation by @philliphoff in #530
- Extract optional Avalonia Mapsui adapter by @philliphoff in #531
- Extract dataset processor ownership by @philliphoff in #532
- Retain fallback pattern clip cache across renders by @philliphoff in #533
- Extract reusable Mapsui map session by @philliphoff in #534
- Measure Mapsui paint cost by feature class by @philliphoff in #535
- Move S-98 composition into MapsuiMapSession by @philliphoff in #536
- Move time refresh into MapsuiMapSession by @philliphoff in #539
- Improve viewer rendering diagnostics and tile persistence by @philliphoff in #538
- Fix exchange-set load responsiveness by @philliphoff in #543
- Move render-context creation into MapPresentationState by @philliphoff in #540
- Expose structured session lifecycle/progress/error events by @philliphoff in #544
- Make Attach_requires_ui_thread deterministic by @philliphoff in #546
- Decompose LoadCoreAsync into named coordinator phases by @philliphoff in #547
- Speed up presentation changes over large S-57 exchange sets by @philliphoff in #549
- Add Map.AddS100 extension returning IS100MapSession by @philliphoff in #548
- Add Datasets.LoadAsync(path) to the reusable S-100 session by @philliphoff in #550
- Add DI registration helper for the reusable S-100 session by @philliphoff in #551
- Add a renderer-neutral geographic hit-test to IDatasetProcessor by @philliphoff in #552
- Fix flaky ActivityListener telemetry test race by @philliphoff in #553
- Add session.Query.PickAsync reusable geographic picking by @philliphoff in #554
- Add viewport-resolution scale filtering to session pick by @philliphoff in #557
- Add pointer-pick adapter over session pick by @philliphoff in #558
- Expose picked-feature geometry from the session pick by @philliphoff in #559
- Add reusable pick-highlight layer over the session pick by @philliphoff in #561
- Add headless stdio MCP host to the s100 CLI (mcp serve) by @philliphoff in #562
- Add reusable dataset extent-indicator layer over the session (#512) by @philliphoff in #563
- Add reusable overscale-curtain layer over the session (#512) by @philliphoff in #564
- Add reusable validation-findings layer over the session (#512) by @philliphoff in #565
- Add mutable MCP tool set; make
s100 mcp servestateful by default (#560) by @philliphoff in #570 - Move dynamic-source layer hosting into the reusable session (#512) by @philliphoff in #572
- Add non-Viewer Avalonia sample embedding Map.AddS100 (#512) by @philliphoff in #575
- Retire the Viewer's one-shot screenshot CLI flags in favour of MCP automation by @philliphoff in #574
- Split dataset-processing contracts into Core; invert factory to a product registry (#512) by @philliphoff in #576
- Decouple Renderers.Mapsui from S-100 products; add bundled factory convenience (#512) by @philliphoff in #577
- Add set_viewport to the CLI headless MCP session (#568) by @philliphoff in #579
- Make S-57 dataset detection a registry-aware, pluggable seam (#512) by @philliphoff in #580
- Honour ECDIS display settings in the headless composite render (#567) by @philliphoff in #581
- Make AddS100 collaborators injectable via options (#512) by @philliphoff in #582
- Unify the dual dataset parse in the CLI headless MCP session (#566) by @philliphoff in #583
- Share the presentation + time MCP tools with the Viewer (#569) by @philliphoff in #585
- Share the dataset-catalog MCP tools with the Viewer (#569) by @philliphoff in #586
- Share the render_to_image MCP tool with the Viewer (#569) by @philliphoff in #587
- Expose host layer bands on IS100MapSession (#512) by @philliphoff in #584
- Replace static redraw hooks with a per-session redraw seam (#512) by @philliphoff in #589
- Re-route the Viewer through the public AddS100 API (#512) by @philliphoff in #590
- Let AddS100 attach to any Mapsui MapControl, not just the capture subclass (#512) by @philliphoff in #591
- Record the shared vs host-specific MCP tool split; keep set_viewport host-specific (#569) by @philliphoff in #588
- Stop the Avalonia headless tests hanging CI for hours by @philliphoff in #594
- Fix flaky CachedVectorStyleRenderer pan test: serialize RenderingOptimizations tests by @philliphoff in #593
- Add S100MapControl: a one-call Avalonia control that owns its S-100 session (#512) by @philliphoff in #592
- Extract the neutral map-interaction vocabulary into Core (#595) by @philliphoff in #596
- Collapse IMapSnapshotRenderer into the Core .Maps IImageRenderer (#595) by @philliphoff in #597
- Make GML product detection data-driven per registration (#598 Chunk C) by @philliphoff in #599
- Retire the legacy "A" (Mapsui feature/style) render arm (#600) by @philliphoff in #602
- Retire the orphaned line-LOD pyramid producer (#489) after the "A" arm (#601) by @philliphoff in #605
- Rename MapsuiMapSession to MapsuiDatasetLayerSession (#598 Chunk B Q3) by @philliphoff in #606
- Add S-401 (IEHG inland ENC) support: bundled catalogues + content-based detection (#608) by @philliphoff in #609
- Update EncDotNet.Iso8211 and EncDotNet.S57 to 0.7.0 (#608, 1/6) by @philliphoff in #610
- Map S-57 CATBRG to the S-101 bridge category attributes by @philliphoff in #615
- Recognize the S-57 product specification an inland ENC declares (#608, 2/6) by @philliphoff in #611
- Let the S-57 translation target a chosen S-100 product (#608, 3/6) by @philliphoff in #612
- Add the S-401 translation target for inland S-57 cells (#608, 4/6) by @philliphoff in #613
- Portray inland S-57 cells with the S-401 catalogues (#608, 5/6) by @philliphoff in #614
- Translate the inland ENC object classes and attributes to S-401 (#608, 6/6) by @philliphoff in #616
- Decompose S-57 BRIDGE into S-101 Bridge + SpanFixed/SpanOpening (S-65 Annex B 4.8.10) by @philliphoff in #617
- Project S-57 cells correctly in the MCP dataset catalogs (#608) by @philliphoff in #619
- Derive the S-57 whole-cell window from SCAMIN, rank overlaps by CSCL by @philliphoff in #621
- Write inland S-57 cells as S-401 in s100 s57 convert by @philliphoff in #623
- Convert inland mooring areas and pushing-navigation anchorages to S-401 (#608) by @philliphoff in #622
- Convert IENC hunits to S-401 distanceUnitOfMeasurement (#608) by @philliphoff in #624
- Convert IENC time schedules to S-401 TimeScheduleInGeneral (#608) by @philliphoff in #628
- Convert M_NSYS with an ORIENT value to LocalDirectionOfBuoyage by @philliphoff in #632
- Convert IENC lock and dock dimensions to S-401 (#608) by @philliphoff in #625
- Assemble S-57 vertical clearances into their S-101/S-401 complexes (1/3) by @philliphoff in #629
- Assemble IENC shore power into S-401 powerCharacteristics (#608) by @philliphoff in #626
- Assemble S-57 ORIENT into the orientation complex where it binds only there (2/3, replaces #630) by @philliphoff in #634
- Drop S-57 attributes the resolved S-101/S-401 class does not bind (3/3) by @philliphoff in #631
- Convert S-57 directional lights to LightSectored with directionalCharacter (S-65 12.8.6.1) by @philliphoff in #633
- Link IENC bridge-arch spans with S-401 BridgeArchAssociation (#608) by @philliphoff in #627
- Convert CATBRG 13 (bridge arch) to bridgeConstruction (#608) by @philliphoff in #635
- Map IENC lc_csi to S-401 categoryOfShipIncluding (#608) by @philliphoff in #636
Full Changelog: v0.22.0...v0.23.0