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:
JonKazama-Hellion committed 2026-05-17 11:43:07 +02:00
1 parent fe84fd558e
commit 7d87f1c4fe
7 files changed
+177 -75

No files matched your search

+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
44–160 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
@@ -3,7 +3,7 @@
"Author": "Jon Kazama (Hellion Forge)",
"Name": "Hellion Chat",
"InternalName": "HellionChat",
"AssemblyVersion": "1.4.10.0",
"AssemblyVersion": "1.5.0.0",
"Description": "A Hellion Forge plugin — privacy-focused chat replacement for FINAL FANTASY XIV, built for EU, US and JP data rules.\n\nBy default only your own conversations are stored. Public chat, NPC dialogue, system messages and battle logs are discarded at the storage layer unless you opt in. Retention windows are configurable per channel, history can be wiped retroactively, and everything can be exported on demand.\n\nFeatures:\n- Channel whitelist with a Privacy-First default\n- Per-channel retention with a daily background sweep\n- Retroactive cleanup with preview and Ctrl+Shift confirm\n- Export to Markdown, JSON or CSV\n- First-run wizard with three profiles: Privacy-First, Casual, Full History\n- Bilingual UI (EN/DE) with live language switching\n- Own config and database — no shared state with other plugins\n\nBased on Chat 2 by Infi and Anna (EUPL-1.2).\nSupport: https://discord.gg/X9V7Kcv5gR",
"ApplicableVersion": "any",
"RepoUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat",
@@ -14,12 +14,12 @@
"CanUnloadAsync": false,
"LoadPriority": 0,
"Punchline": "A Hellion Forge plugin. Privacy-first chat for FFXIV, built to stay out of your way.",
"Changelog": "**v1.4.10 — Symbol-Picker and Tell-History Fix (2026-05-16)**\n\nEleventh and final sub-patch of the v1.4.x polish-sweep series. Symbol picker for the chat input, a tell-history reload fix for users with many active partners, and a closing cleanup sweep before v1.5.0 picks up the DI-container adoption.\n\n- Symbol picker: a small smile-icon button left of the channel indicator opens a popup with two tabs. The first lists all 161 FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second carries 97 server-verified BMP symbols (latin marks, currency, the full Greek alphabet, geometric shapes, suits, notes) — every one of them round-tripped through /echo and /say in a four-round probe so the in-channel render matches what the picker shows. Click drops the glyph at the caret, multi-insert keeps the popup open, and a recent-used strip floats the last sixteen picks across both tabs. Toggle in Settings → Chat → Message behaviour, default on.\n- Pinned auto-tell tabs reload their full history again: a hidden 500-row scan cap in PreloadHistory used to override the user-configurable AutoTellTabsHistoryPreload setting, so less-frequent pinned partners (rare /tell sessions in an otherwise busy week) lost their backlog. The cap is removed; the (Receiver, Date) index keeps SQL fast, the client-side loop still respects your setting as the upper bound.\n- Slash-command teardown: /hellion, /hellionView, /hellionDebugger (and #if DEBUG /hellionSeString) wrappers are now cached as private fields. Plugin teardown detaches the live registration instead of re-Register'ing with identical args — closes a latent maintenance hazard from v1.4.9.\n- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render refactor that was on the v1.4.10 reserve list got dropped after cross-platform smoke showed the scroll rubber-band is a Wine / Linux render-pipeline quirk, not universal — Windows users never saw it. It will get its own platform-targeted spike in a later patch. Next major cycle is v1.5.0 with the DI-container adoption (Microsoft.Extensions.Hosting + ILogger<T>) modelled on Lightless.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.9 — Plugin-Load Render Polish (2026-05-15)**\n\nTenth sub-patch of the v1.4.x polish-sweep series. First-frame render cost drops from ~127 ms median to ~76 ms median, comfortably under Dalamud's 100 ms HITCH warning threshold.\n\n- First-frame defer: six non-essential rendering sections inside ChatLogWindow skip their first Draw and run one frame later (bottom status bar, channel-name SeString chunks, window bounds check, v0.6.1 hint banner, autocomplete, input-preview calculation). User-visible delay is ~17 ms at 60 fps, hidden inside the post-reload font-atlas build window.\n- Slash-command centralisation: /hellion, /hellionView, /hellionSeString and /hellionDebugger are registered in LoadAsync instead of inside the corresponding window constructors. The plugin-manager Open and configuration buttons hang on the same path.\n- Plugin-load profiling logs stay on at Information level (MessageStore connect/migrate, FilterAllTabs, auto-translate warmup) as a regression tripwire — a future load past 100 ms will show up in /xllog without a Debug filter.\n- ChatTwo IPC compatibility layer: HellionChat now mirrors ChatTwo's full IPC surface (GetChatInputState, ChatInputStateChanged, Register, Unregister, Available, Invoke) under the ChatTwo.* namespace in addition to our existing HellionChat.* provider gates. Third-party integrations that historically only subscribe to ChatTwo's IPC — for example Artisan's and AllaganTools' context-menu hooks — keep working without requiring a code change on their side. Conflict detection prevents ChatTwo from loading in parallel with HellionChat, so there is no slot-collision risk at runtime.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.8 — Hook-Layer and Polish Quick-Wins (2026-05-14)**\n\nNinth sub-patch of the v1.4.x polish-sweep series. Hook-layer cluster (DbViewer FTS5 full-text search, ad-block foundation investigation) plus three polish quick-wins.\n\n- DbViewer full-text search: optional FTS5 index across the full chat history. Built asynchronously on first load after the update with a progress toast. The local page-filter remains available as the default mode. Queries match as exact phrases -- multi-word terms must appear together in order; advanced users can opt into raw FTS5 MATCH syntax by wrapping their own double-quotes.\n- Custom theme files now auto-reload when edited while the theme is active -- no need to re-click the theme in the picker.\n- Retention sweep no longer blocks the framework thread, removing the ~194ms mini-hitch per sweep.\n- Status bar renders correctly at Windows display scaling > 100%.\n- Receive-suppressed-tells routing investigated this cycLine truncated
"Changelog": "**v1.5.0 \u2014 DI Foundation and Service Refactor (2026-05-17)**\n\nMajor architecture cycle. The plugin bootstrap moves to a\ngeneric-host DI container (Microsoft.Extensions.Hosting +\nIServiceCollection) modelled on Lightless Sync. Service logging\nmoves from a static Plugin.LogProxy locator to typed\nMicrosoft.Extensions.Logging.ILogger<T> via constructor injection,\nbridged over Dalamud's IPluginLog by a custom DalamudLogger trio.\n\nWhat changes under the hood:\n\n- 18 instance-class services migrate to ILogger<T> via constructor\n injection across four slices: data layer (MessageStore,\n MessageManager, AutoTellTabsService), IPC and integrations\n (HonorificService, IpcManager, TypingIpc, ExtraChat, the three\n GameFunctions classes), UI window layer (ChatLogWindow,\n DbViewer, Popout, three settings tabs), and root (Commands,\n ThemeRegistry, PayloadHandler).\n- Plugin.LogProxy stays in place for the eight buckets ctor\n injection cannot reach: static helpers (EmoteCache,\n AutoTranslate, MemoryUtil, WrapperUtil), Dalamud-reflected\n types (Configuration), the Message data class, and instance\n classes that only log from static methods (FontManager, one\n GameFunctions site).\n- Plugin.cs finishes at 1012 lines \u2014 virtually identical to the\n pre-cycle 1013. The new Phase-1 host build and Plugin.X bridge\n wiring trade out exactly the service and window allocations\n that previously lived in LoadAsync.\n- Cross-plugin baseline confirms no performance penalty against\n Chat 2: HellionChat first-frame HITCH 77 ms median, Chat 2\n 74 ms median. Lightless and XIVInstantMessenger sit around\n 7 ms by deferring their font-atlas build past Finished\n loading \u2014 that pattern is the v1.5.1 follow-up.\n\nUser-visible:\n\n- Slash-command insert fix: pasting a slash command into the\n chat input (Friend List \"/tell\" action, plugin-driven inserts\n from Artisan, AllaganTools etc.) now replaces the existing\n input instead of concatenating. Cherry-picked from ChatTwo\n upstream ee7768ac with namespace adaptation.\n\nMigration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.10 \u2014 Symbol-Picker and Tell-History Fix (2026-05-16)**\n\nEleventh and final sub-patch of the v1.4.x polish-sweep series.\nSymbol picker for the chat input, a tell-history reload fix for\nusers with many active partners, and a closing cleanup sweep\nbefore v1.5.0 picks up the DI-container adoption.\n\n- Symbol picker: a small smile-icon button left of the channel\n indicator opens a popup with two tabs. The first lists all 161\n FFXIV PUA glyphs (Dalamud's SeIconChar enum); the second\n carries 97 server-verified BMP symbols (latin marks, currency,\n the full Greek alphabet, geometric shapes, suits, notes) \u2014\n every one of them round-tripped through /echo and /say in a\n four-round probe so the in-channel render matches what the\n picker shows. Click drops the glyph at the caret, multi-insert\n keeps the popup open, and a recent-used strip floats the last\n sixteen picks across both tabs. Toggle in Settings \u2192 Chat \u2192\n Message behaviour, default on.\n- Pinned auto-tell tabs reload their full history again: a\n hidden 500-row scan cap in PreloadHistory used to override the\n user-configurable AutoTellTabsHistoryPreload setting, so\n less-frequent pinned partners (rare /tell sessions in an\n otherwise busy week) lost their backlog. The cap is removed;\n the (Receiver, Date) index keeps SQL fast, the client-side\n loop still respects your setting as the upper bound.\n- Slash-command teardown: /hellion, /hellionView,\n /hellionDebugger (and #if DEBUG /hellionSeString) wrappers are\n now cached as private fields. Plugin teardown detaches the\n live registration instead of re-Register'ing with identical\n args \u2014 closes a latent maintenance hazard from v1.4.9.\n- v1.4.x polish-sweep wraps up here. The ImGuiListClipper render\n refactor that was on the v1.4.10 reserve list got dropped\n after cross-platform smoke showed the scroll rubber-band is a\n Wine / Linux render-pipeline quirk, not universal \u2014 Windows\n users never saw it. It will get its own platform-targeted\n spike in a later patch. Next major cycle is v1.5.0 with the\n DI-container adoption (Microsoft.Extensions.Hosting +\n ILogger<T>) modelled on Lightless.\n- Migration v17 stays (no schema bump).\n\nBased on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2).\n\n---\n\n**v1.4.9 \u2014 Plugin-Load Render Polish (2026-05-15)**\n\nTenth sub-patch of the v1.4.x polish-sweep series. First-frame\nrender cost drops from ~127 ms median to ~76 ms median,\ncomfortably under Dalamud's 100 ms HITCH warning threshold.\n\n- First-frame defer: six non-essential rendering sections inside\n ChatLogWindow skip their first Draw and run one frame later\n (bottom status bar, channel-name SeString chunks, window bounds\n check, v0.Line truncated
"AcceptsFeedback": true,
"DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.10/latest.zip",
"DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.10/latest.zip",
"DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.10/latest.zip",
"TestingAssemblyVersion": "1.4.10.0",
"DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
"DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
"DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.5.0/latest.zip",
"TestingAssemblyVersion": "1.5.0.0",
"IconUrl": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/icon.png",
"ImageUrls": [
"https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/raw/branch/main/HellionChat/images/chatWindow.png",