chore(release): v1.5.0 manifest bump

Version strings bumped across all eight tracked surfaces:

- HellionChat/HellionChat.csproj   <Version>1.5.0</Version>
- repo.json                        AssemblyVersion + TestingAssemblyVersion = 1.5.0.0
- repo.json                        three DownloadLink* URLs -> /v1.5.0/latest.zip
- repo.json                        Changelog field synced with yaml
- HellionChat/HellionChat.yaml     new v1.5.0 changelog block on top; v1.4.7
                                   drops out per the four-block slim rule
- docs/CHANGELOG.md                v1.5.0 entry prepended
- docs/ROADMAP.md                  Next Cycle pointer moves to v1.5.1, v1.5.0
                                   joins the released-cycle archive block
- README.md                        three status surfaces (badge, header,
                                   Project Status long-form) on v1.5.0
- .github/forge-posts/v1.5.0.md    Discord announcement body (German)

Preflight blocks A-F all green. Changelog embed total 2050 / 5500 chars
(four subblocks), forge-post frontmatter inside the 60/40 char caps.

Tag, push, merge are reserved for Flo.
This commit is contained in:
2026-05-17 11:43:07 +02:00
parent fe84fd558e
commit 7d87f1c4fe
7 changed files with 177 additions and 75 deletions
+37
View File
@@ -0,0 +1,37 @@
---
subtitle: DI Foundation und Service-Refactor
versionsnatur: Architektur-Cycle
---
- **Architektur-Umbau ohne User-spürbare Verhaltens-Änderung:** der
Plugin-Bootstrap wechselt auf einen Generic-Host DI-Container
(`Microsoft.Extensions.Hosting` + `IServiceCollection`) nach dem
Lightless-Sync-Muster. 18 Service-Klassen wandern von einem
statischen `Plugin.LogProxy`-Locator auf typisierte
`ILogger<T>`-Constructor-Injection. `DalamudLogger` brückt
`Microsoft.Extensions.Logging` über auf Dalamuds `IPluginLog`
im xllog erscheinen jetzt Service-spezifische Spalten wie
`[ MessageManager]` und `[Honori...ervice]`.
- **Plugin.LogProxy bleibt für die acht Buckets erhalten,** die
Constructor-Injection nicht erreicht: Static-Helper (EmoteCache,
AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-Reflektion
(Configuration), Data-Class mit Massen-Instanziierung (Message)
und Instanz-Klassen die nur aus Static-Methods loggen (FontManager,
eine GameFunctions-Stelle).
- **Performance bestätigt durch Cross-Plugin-Baseline:** HellionChat
First-Frame-HITCH 77 ms Median, Chat 2 v1.40.2 74 ms Median — kein
DI-Penalty gegenüber dem Upstream-Fork-Origin. Lightless und
XIVInstantMessenger liegen bei ~7 ms weil sie ihren FontAtlas-Build
deferren; das wird das v1.5.1-Item.
- **User-sichtbarer Bug-Fix nebenbei:** Slash-Command-Einfügen in das
Chat-Eingabefeld (Friend-List "/tell"-Action plus Plugin-Inserts
von Artisan, AllaganTools und ähnlichen) ersetzt jetzt den
vorhandenen Input, statt anzukonkatenieren. Cherry-Pick aus ChatTwo
upstream `ee7768ac` mit Namespace-Anpassung.
- **Foundation für die Plugin-Integrations-Wave:** v1.5.7-11
(Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM
Quick-DM) werden ab jetzt strukturell handhabbar — neue Services
sind ein `services.AddSingleton<T>` plus ein paar Factory-Lambda-
Zeilen, kein Plugin.cs-Anflanschen mehr.
- Migration v17 unverändert: kein Schema-Bump, kein
Config-Migrations-Aufwand.
+1 -1
View File
@@ -1,7 +1,7 @@
<Project Sdk="Dalamud.NET.Sdk/15.0.0">
<PropertyGroup>
<!-- Independent versioning; see yaml changelog for upstream Chat 2 base -->
<Version>1.4.10</Version>
<Version>1.5.0</Version>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<!-- Use lock file to pin exact versions -->
+48 -43
View File
@@ -35,6 +35,54 @@ tags:
- Replacement
- Privacy
changelog: |-
**v1.5.0 — DI Foundation and Service Refactor (2026-05-17)**
Major architecture cycle. The plugin bootstrap moves to a
generic-host DI container (Microsoft.Extensions.Hosting +
IServiceCollection) modelled on Lightless Sync. Service logging
moves from a static Plugin.LogProxy locator to typed
Microsoft.Extensions.Logging.ILogger<T> via constructor injection,
bridged over Dalamud's IPluginLog by a custom DalamudLogger trio.
What changes under the hood:
- 18 instance-class services migrate to ILogger<T> via constructor
injection across four slices: data layer (MessageStore,
MessageManager, AutoTellTabsService), IPC and integrations
(HonorificService, IpcManager, TypingIpc, ExtraChat, the three
GameFunctions classes), UI window layer (ChatLogWindow,
DbViewer, Popout, three settings tabs), and root (Commands,
ThemeRegistry, PayloadHandler).
- Plugin.LogProxy stays in place for the eight buckets ctor
injection cannot reach: static helpers (EmoteCache,
AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-reflected
types (Configuration), the Message data class, and instance
classes that only log from static methods (FontManager, one
GameFunctions site).
- Plugin.cs finishes at 1012 lines — virtually identical to the
pre-cycle 1013. The new Phase-1 host build and Plugin.X bridge
wiring trade out exactly the service and window allocations
that previously lived in LoadAsync.
- Cross-plugin baseline confirms no performance penalty against
Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2
74 ms median. Lightless and XIVInstantMessenger sit around
7 ms by deferring their font-atlas build past Finished
loading — that pattern is the v1.5.1 follow-up.
User-visible:
- Slash-command insert fix: pasting a slash command into the
chat input (Friend List "/tell" action, plugin-driven inserts
from Artisan, AllaganTools etc.) now replaces the existing
input instead of concatenating. Cherry-picked from ChatTwo
upstream ee7768ac with namespace adaptation.
Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
**v1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)**
Eleventh and final sub-patch of the v1.4.x polish-sweep series.
@@ -151,47 +199,4 @@ changelog: |-
---
**v1.4.7 — Backlog Cleanup and Mid-Features (2026-05-13)**
Eighth sub-patch of the v1.4.x polish-sweep series. First
user-visible feature bundle since v1.4.5 — pinned tell tabs that
survive relog, opt-in Honorific glow rendering, and a configurable
sidebar.
- TempTell Pin: right-click a TempTell tab in the sidebar to pin
it. Pinned tabs survive relog, keep their conversation history
(loaded on demand from the message store), and stay bound to
the same /tell partner. Hard cap of 5 pinned tabs in a pool
separate from the 15-tab auto-tell pool — total ceiling is 20
tabs. New 'Pinned' section in the sidebar with its own divider
header
- Honorific Glow outline now renders when the title carries a
Glow colour. Opt-in via Settings → Integrations → 'Render glow
outlines (Honorific)' (default off, dodges the per-frame
DrawList overhead on low-end hardware). Gradient (Color3 /
GradientColourSet / Wave / Pulse) is parsed but rendered
statically — a later cycle will port the full animation
- Sidebar width is now configurable in Theme & Layout (range
44160 px). Default stays icon-only; widen to fit section
headers like 'Active Tells (3)' without truncation
- Settings Save no longer pops the chat input back to /tell with
a pinned partner — Configuration.UpdateFrom now preserves the
runtime CurrentChannel across the persistent-tab merge, and
TabSwitched deep-clones the seeded channel instead of sharing
the previous tab's UsedChannel
- Util/ImGuiUtil.cs DrawArrows IconButton id now uses
(id + 1).ToString() instead of the operator-precedence quirk
id + 1.ToString() — generated IDs stay numerically stable
- Internal: IPluginLogProxy indirection over Dalamud's IPluginLog
routes all ~91 Plugin.Log call sites through a testable proxy.
MessageStore.Migrate0 can now run in xUnit without loading
Dalamud.dll, closing the gap F12.1 left in v1.4.6
- Internal: TempTab counter switched from an Interlocked cached
field to a derived Tabs.Count(predicate) — pin-state transitions
are cold-path and don't need lock-free reads
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
Full history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases
+15 -19
View File
@@ -2,7 +2,7 @@
[![Build](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml/badge.svg?branch=main)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/actions/workflows/build.yml)
[![License: EUPL-1.2](https://img.shields.io/badge/License-EUPL--1.2-blue.svg)](LICENSE)
[![Latest release](https://img.shields.io/badge/release-v1.4.10-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[![Latest release](https://img.shields.io/badge/release-v1.5.0-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest)
[![Dalamud API](https://img.shields.io/badge/Dalamud-API_15-purple)](https://github.com/goatcorp/Dalamud)
[![.NET](https://img.shields.io/badge/.NET-10.0-512BD4)](https://dotnet.microsoft.com/)
[![FFXIV](https://img.shields.io/badge/FFXIV-Dawntrail-c3a37f)](https://www.finalfantasyxiv.com/)
@@ -11,7 +11,7 @@
<img src="docs/images/hellion-forge.png" alt="Hellion Forge" width="180" />
</p>
**Version 1.4.10** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
**Version 1.5.0** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on
[Chat 2](https://github.com/Infiziert90/ChatTwo) (EUPL-1.2).
Hellion Chat is a privacy-first plugin built on the Chat 2 foundation. The majority of the engine comes from Chat 2
@@ -286,23 +286,19 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo
## Project Status
**Version 1.4.10**Symbol-Picker and Tell-History Fix. Eleventh and final sub-patch of the v1.4.x polish sweep
series. A new symbol-picker popup hangs off a smile-icon button left of the channel indicator: tab one lists all
161 FFXIV PUA glyphs (Dalamud's `SeIconChar` enum); tab two carries 97 server-verified BMP symbols (latin marks,
currency, the full Greek alphabet, geometric shapes, suits, notes) — each one round-tripped through `/echo` and
`/say` in a four-round whitelist probe so the in-channel render matches what the picker shows. Click drops the
glyph at the caret, multi-insert keeps the popup open, recent-used strip floats the last sixteen picks across
both tabs. Toggle in Settings → Chat → Message behaviour, default on. Mid-cycle hotfix for pinned auto-tell tabs:
PreloadHistory had a hidden 500-row SQL scan cap that overrode the user-configurable `AutoTellTabsHistoryPreload`
setting — active users with many tell partners lost the backlog of less-frequent pinned partners. The cap is
removed; the `(Receiver, Date)` index keeps SQL fast, the client-side loop respects the user setting as the upper
bound. Slash-command teardown cleanup: `/hellion`, `/hellionView`, `/hellionDebugger` (and `#if DEBUG /hellionSeString`)
wrappers are cached as private fields so plugin teardown detaches the live registration instead of re-Register'ing
with identical args. The original Reserve-A `ImGuiListClipper` refactor for `DrawMessages` was cancelled after
cross-platform smoke showed the scroll rubber-band is a Wine/Linux render-pipeline quirk, not universal — Windows
users on v1.4.9 never saw it; the spike that targets the Wine path lives in a later patch. Migration v17 stays
(no schema bump). v1.4.x polish sweep wraps up here; next major cycle is v1.5.0 with the DI-container adoption
(`Microsoft.Extensions.Hosting` + `ILogger<T>`) modelled on Lightless (as of 2026-05-16).
**Version 1.5.0**DI Foundation and Service Refactor. Major architecture cycle: the plugin bootstrap moves to a
generic-host DI container (`Microsoft.Extensions.Hosting` + `IServiceCollection`) modelled on Lightless Sync. All
18 instance-class services migrate from a static `Plugin.LogProxy` locator to `Microsoft.Extensions.Logging.ILogger<T>`
via constructor injection, with a custom `DalamudLogger` bridging the framework over to Dalamud's `IPluginLog`. The
proxy stays for the eight buckets ctor-injection cannot reach (static helpers like `EmoteCache`, Dalamud-reflected
`Configuration`, the `Message` data class, and static methods inside `FontManager` / `GameFunctions`). Plugin.cs
finishes the cycle at 1012 lines — virtually identical to the pre-cycle 1013 — because the new Phase-1 host build
and Plugin.X bridge wiring trade out exactly the service and window allocations that left `LoadAsync`. Cross-plugin
baseline confirms no performance penalty vs Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2 74 ms.
Lightless and XIVInstantMessenger sit around 7 ms by deferring their font-atlas build past `Finished loading`
that pattern is the v1.5.1 follow-up item. One user-visible fix bundled in from upstream: pasting a slash command
into the chat input (Friend List "/tell" action, plugin-driven inserts) now replaces the existing input instead of
concatenating onto whatever the user was typing. Migration v17 stays (no schema bump).
Hellion Chat is a standalone plugin, no longer a fork in the repository sense. Fully completed:
+40
View File
@@ -10,6 +10,46 @@ to the release pages for details.
---
## Hellion Chat 1.5.0 — DI Foundation and Service Refactor (2026-05-17)
Major architecture cycle. The plugin bootstrap moves to a generic-host DI container
(`Microsoft.Extensions.Hosting` + `IServiceCollection`) modelled on Lightless Sync. Service
logging migrates from a static `Plugin.LogProxy` locator to typed
`Microsoft.Extensions.Logging.ILogger<T>` via constructor injection, bridged over Dalamud's
`IPluginLog` by a custom `DalamudLogger` trio.
### Under the hood
- 18 instance-class services migrate to `ILogger<T>` via constructor injection across four
slices: data layer (`MessageStore`, `MessageManager`, `AutoTellTabsService`), IPC and
integrations (`HonorificService`, `IpcManager`, `TypingIpc`, `ExtraChat`, three
`GameFunctions` classes), UI window layer (`ChatLogWindow`, `DbViewer`, `Popout`, three
settings tabs), and root (`Commands`, `ThemeRegistry`, `PayloadHandler`).
- `Plugin.LogProxy` stays in place for the eight buckets ctor injection cannot reach:
static helpers (`EmoteCache`, `AutoTranslate`, `MemoryUtil`, `WrapperUtil`),
Dalamud-reflected types (`Configuration`), the `Message` data class, and instance classes
that only log from static methods (`FontManager`, one `GameFunctions` site).
- Plugin.cs finishes at 1012 lines — virtually identical to the pre-cycle 1013. The new
Phase-1 host build and `Plugin.X` bridge wiring trade out exactly the service and window
allocations that previously lived in `LoadAsync`.
- Cross-plugin baseline confirms no performance penalty against Chat 2: HellionChat
first-frame HITCH 77 ms median, Chat 2 74 ms median. Lightless and XIVInstantMessenger sit
around 7 ms by deferring their font-atlas build past `Finished loading` — that pattern is
the v1.5.1 follow-up item.
### User-visible
- Slash-command insert fix: pasting a slash command into the chat input (Friend List
"/tell" action, plugin-driven inserts from Artisan, AllaganTools etc.) now replaces the
existing input instead of concatenating onto whatever the user was typing. Cherry-picked
from ChatTwo upstream `ee7768ac` with namespace adaptation.
Migration v17 stays (no schema bump).
Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).
---
## Hellion Chat 1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)
Eleventh and final sub-patch of the v1.4.x Polish-Sweep series. Symbol picker for the chat input, a tell-history reload fix
+30 -6
View File
@@ -10,13 +10,37 @@ the plugin's privacy-first scope during brainstorming.
---
## Next Cycle (v1.5.0)
## Next Cycle (v1.5.1)
**DI-container adoption.** Microsoft.Extensions.Hosting plus `ILogger<T>` modelled on Lightless's `PluginHostFactory`
pattern. The v1.4.x Polish-Sweep series is closed; v1.5.0 starts the structural cycle that the smaller F12.x indirection
shims (`IPluginLogProxy`, `IPlatformUtil`) were paving the way for. After that, the Wine/Linux scroll-rubber-band spike
deferred from v1.4.10 (Reserve-A cancelled — Windows users never saw it) plus the First-Run-Wizard rework that lets users
opt into the curated defaults instead of just picking a privacy profile.
**Honorific Full Gradient Port plus FontAtlas-Defer for a 10× HITCH cut.** v1.5.0 closed the DI-container cycle with
no performance penalty against Chat 2 (77 ms vs 74 ms median first-frame HITCH), but the cross-plugin baseline against
Lightless Sync and XIVInstantMessenger surfaced a clean optimisation: both plugins defer their font-atlas build until
after `Finished loading` and sit at 6-7 ms HITCH, an order of magnitude below the ~75 ms floor that Chat 2 and HellionChat
share. v1.5.1 ports that pattern. Plus the Honorific gradient render path — DTO is gradient-ready since v1.4.7, only the
Wave / Pulse animation port remains. After that, First-Run-Wizard rework with curated defaults beyond the three privacy
profiles, then FR localisation (Hezcal native-speaker review confirmed), then the Plugin Integrations Wave 2-6
(Context-Menu, NotificationMaster, Moodles, ExtraChat, XIVIM Quick-DM). Wine/Linux scroll-rubber-band spike sits as a
low-priority Linux-only investigation at the tail.
---
## v1.5.0 — DI Foundation and Service Refactor (released 2026-05-17)
Major architecture cycle. Plugin bootstrap moves to a generic-host DI container
(`Microsoft.Extensions.Hosting` + `IServiceCollection`) modelled on Lightless Sync's `PluginHostFactory`. Service
logging migrates from the static `Plugin.LogProxy` locator (the F12.2 shim from v1.4.7) to typed
`Microsoft.Extensions.Logging.ILogger<T>` via constructor injection, bridged over Dalamud's `IPluginLog` by a custom
`DalamudLogger` trio. 18 instance-class services move to ctor-injected loggers across four slices: data layer,
IPC/integrations, UI window layer, and root. `Plugin.LogProxy` stays for the eight buckets ctor injection cannot
reach — static helpers (`EmoteCache`, `AutoTranslate`, `MemoryUtil`, `WrapperUtil`), Dalamud-reflected types
(`Configuration`), the `Message` data class, and instance classes that only log from static methods (`FontManager`,
one `GameFunctions` site). Plugin.cs finishes at 1012 lines, virtually identical to the pre-cycle 1013 (-1 netto): the
new Phase-1 host build and `Plugin.X` bridge wiring trade out exactly the service and window allocations that previously
lived in `LoadAsync`. Cross-plugin baseline (10 reload-stress runs, 51 active plugins): HellionChat first-frame HITCH
77 ms median, Chat 2 v1.40.2 74 ms median — no DI penalty. The deferred-font-atlas pattern from Lightless and
XIVInstantMessenger is the v1.5.1 follow-up. User-visible: slash-command insert fix cherry-picked from ChatTwo upstream
`ee7768ac` — pasting a slash command into the chat input now replaces existing input instead of concatenating.
Migration v17 stays.
---
+6 -6
View File
File diff suppressed because one or more lines are too long