From cafb6faa3911a86acd63f8816a8d927cd04f1553 Mon Sep 17 00:00:00 2001 From: Jon Kazama Date: Tue, 12 May 2026 14:33:13 +0200 Subject: [PATCH] chore: bump version to 1.4.5 Manifest sync across csproj, yaml, repo.json, README, CHANGELOG, ROADMAP and the Plugin.cs schema-gate error message. ROADMAP also gets the v1.4.4 release block that was missed in that cycle's closure. Forge-post v1.4.5.md follows the established frontmatter + DE-body convention; the EN block is sourced from the yaml changelog by the forge-announce workflow. --- .github/forge-posts/v1.4.5.md | 29 +++++++++++++++++++++++++++++ HellionChat/HellionChat.csproj | 2 +- HellionChat/HellionChat.yaml | 23 +++++++++++++++++++++++ HellionChat/Plugin.cs | 4 ++-- README.md | 26 ++++++++++++++------------ docs/CHANGELOG.md | 29 +++++++++++++++++++++++++++++ docs/ROADMAP.md | 31 +++++++++++++++++++++++++++---- repo.json | 12 ++++++------ 8 files changed, 131 insertions(+), 25 deletions(-) create mode 100644 .github/forge-posts/v1.4.5.md diff --git a/.github/forge-posts/v1.4.5.md b/.github/forge-posts/v1.4.5.md new file mode 100644 index 0000000..2e75cfd --- /dev/null +++ b/.github/forge-posts/v1.4.5.md @@ -0,0 +1,29 @@ +--- +subtitle: UX und Robustheit +versionsnatur: UX-Polish-Cycle +--- + +**Hellion Chat 1.4.5 — UX und Robustheit** + +Sechster Sub-Patch der v1.4.x Polish-Sweep-Serie. Render-Fehler im Chat-Fenster werden jetzt sichtbar, der +First-Run-Wizard hat eine explizite Cancel-Schaltfläche, der Eingabe-Verlauf bleibt nicht mehr über Plugin-Reloads hinweg +liegen, und die Statusleiste klippt in schmalen Fenstern nicht mehr. + +- **Fehler-Benachrichtigung im Chat-Fenster.** Wenn ein Render-Fehler in `DrawChatLog` auftritt, zeigt das Plugin jetzt + eine einmalige Warning-Notification mit Verweis aufs `/xllog`, statt das Fenster stillschweigend leer zu lassen. Der + Stack-Trace selbst geht weiter via `Plugin.Log.Error` ins Logfile. De-Dup über Per-Session-Bool, damit ein + wiederkehrender Fehler die Notification-Stack nicht pro Frame neu vollkippt +- **First-Run-Wizard trennt Accept und Close.** `OnClose` setzt nicht mehr stillschweigend `FirstRunCompleted=true`, + also lässt das X den Wizard schwebend zurück und er kommt beim nächsten Plugin-Reload wieder. Eine neue + „Später — Defaults behalten"-Schaltfläche im Footer ist der explizite Weg, ohne Profil-Auswahl rauszukommen. Strings + bilingual EN+DE plus Tooltip +- **Eingabe-Verlauf wird beim Plugin-Reload geleert.** `InputHistoryService.Reset` hängt jetzt in `Plugin.DisposeAsync` + neben den anderen Pure-Memory-Cleanups, damit der statische Zustand aus der vorigen Session den nächsten Load nicht + mehr erbt +- **Statusleiste klippt nicht mehr.** Der rechtsbündige Versions-Slot wird ausgeblendet wenn die Chat-Window-Breite + abzüglich Versions-Text unter 200 px fällt — vorher überlappte er die vier linken Slots. Ab ausreichender Breite + taucht der Slot wieder auf +- **Intern:** `FontManager` fällt auf System-Font zurück wenn die eingebettete Hellion-Font-Resource fehlt + (Broken-csproj-Pfad, nie ein Produktions-Build), plus expliziter Session-Only-Invariant-Kommentar für + Auto-Tell-Tabs in `Plugin.cs:167-168` mit einem TempTabCounter-Init-Pin in der Build-Suite. Kein Schema-Bump, keine + Migration diff --git a/HellionChat/HellionChat.csproj b/HellionChat/HellionChat.csproj index 570db82..3c23b26 100644 --- a/HellionChat/HellionChat.csproj +++ b/HellionChat/HellionChat.csproj @@ -1,7 +1,7 @@ - 1.4.4 + 1.4.5 enable enable diff --git a/HellionChat/HellionChat.yaml b/HellionChat/HellionChat.yaml index 7fbb1f8..4868efb 100755 --- a/HellionChat/HellionChat.yaml +++ b/HellionChat/HellionChat.yaml @@ -35,6 +35,29 @@ tags: - Replacement - Privacy changelog: |- + **v1.4.5 — UX and Robustness (2026-05-12)** + + Sixth sub-patch of the v1.4.x polish-sweep series. Chat-log draw + failures surface as a notification, the first-run wizard has an + explicit "Later" option, the input history clears on plugin reload, + and the status bar version slot stops clipping in narrow windows. + + - Chat window draw errors now show a one-shot notification instead + of failing silently — stack trace stays in /xllog + - First-run wizard: explicit "Later — keep defaults" button. + Closing the X no longer silently accepts the defaults; the wizard + reopens on the next plugin load if nothing was picked + - InputHistoryService clears on plugin dispose so the previous + session's typed commands don't bleed into the next load + - Status bar hides the version slot when the chat window is too + narrow to fit all five slots without overlap + - Internal: explicit session-only Auto-Tell-Tab invariant in + Plugin.cs plus a pinning test in the Build-Suite + - Internal: FontManager falls back to the system font if the + embedded Hellion font resource is missing — logs a Warning + + --- + **v1.4.4 — Threading and IPC safety polish (2026-05-12)** Fifth sub-patch of the v1.4.x polish-sweep series. Threading diff --git a/HellionChat/Plugin.cs b/HellionChat/Plugin.cs index 8ef45b8..1909503 100755 --- a/HellionChat/Plugin.cs +++ b/HellionChat/Plugin.cs @@ -159,8 +159,8 @@ public sealed class Plugin : IAsyncDalamudPlugin if (Config.Version < 16) { throw new InvalidOperationException( - $"HellionChat v1.4.4 requires config schema v16, got v{Config.Version}. " - + "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.4." + $"HellionChat v1.4.5 requires config schema v16, got v{Config.Version}. " + + "Please install v1.4.2 first to migrate the configuration, then upgrade to v1.4.5." ); } diff --git a/README.md b/README.md index a4a23d0..dc0395e 100644 --- a/README.md +++ b/README.md @@ -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.4-brightgreen)](https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/latest) +[![Latest release](https://img.shields.io/badge/release-v1.4.5-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 @@ Hellion Forge

-**Version 1.4.4** — Privacy-first chat plugin for FINAL FANTASY XIV / Dalamud, built on +**Version 1.4.5** — 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,16 +286,18 @@ An optional submission to the Dalamud main plugin repo (in addition to the custo ## Project Status -**Version 1.4.4** — Threading and IPC safety polish on top of the v1.4.3 async-load foundation. The -`AutoTellTabsService` hot-path getter now reads from an `Interlocked` counter instead of taking a lock on every render -frame, with a resync hook for the snapshot-restore path in `SaveConfig` and a pure-helper test mirror in the Build-Suite -repo. The Honorific integration carries per-method threading banners so the framework-thread invariant is visible at the -call site, and an unsubscribe failure now logs at Warning instead of Debug — a leaked subscription across plugin reloads -is exactly the kind of thing that should not be silent. The AutoTranslate warmup thread is finally marked -`IsBackground = true`, matching the pattern used in `MessageManager` and `Plugin.RetentionSweep` since v1.4.0. The -privacy filter logs once per unknown ChatType so a future patch's added channel does not drop off the radar, and new -installs default `PrivacyPersistUnknownChannels` to `true` as a failsafe; existing configs keep their explicit choice. -No schema bump, no migration. Fifth sub-patch of the v1.4.x polish sweep series (as of 2026-05-12). +**Version 1.4.5** — User-visible robustness polish on top of the v1.4.4 threading work. The chat log no longer fails +silently: a draw-path exception now triggers a one-shot warning notification that points users at `/xllog`, while the +stack trace itself keeps going through `Plugin.Log.Error` as before. The first-run wizard splits accept from close — +`OnClose` no longer silently sets `FirstRunCompleted`, so closing the X leaves the wizard pending and it reopens on the +next plugin load; a new footer "Later — keep defaults" button is the explicit path to dismiss without picking a profile. +`InputHistoryService` clears on plugin dispose alongside the existing pure-memory cleanups, so the previous session's +typed commands don't bleed into the next load. `FontManager.GetHellionFontBytes` becomes a `Try`-variant that falls back +to the system-font path when the embedded resource is missing (broken csproj / dev build) instead of throwing through +the UiBuilder. The status bar drops the right-aligned version slot when the chat window is below the threshold needed +to fit all five slots without overlap. Internal: explicit session-only Auto-Tell-Tab invariant comment with a +`TempTabCounter.InitFromList` pin in the Build-Suite. No schema bump, no migration. Sixth sub-patch of the v1.4.x polish +sweep series (as of 2026-05-12). Hellion Chat is a standalone plugin, no longer a fork in the repository sense. Fully completed: diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 7754a78..273590b 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -10,6 +10,35 @@ to the release pages for details. --- +## Hellion Chat 1.4.5 — UX and Robustness (2026-05-12) + +Sixth sub-patch of the v1.4.x polish-sweep series. User-visible robustness fixes plus two doc/test polish items from the +audit backlog. No schema bump, no migration. + +- `ChatLogWindow.Draw` now surfaces a one-shot warning notification when the draw path throws. The stack trace still + goes to `/xllog` via `Plugin.Log.Error`; the notification is suppressed for the rest of the plugin session so a + recurring failure can't spam the notification stack frame-by-frame. Pattern-match to the existing + `Plugin.cs:505-516` migration-blocker notification +- `FirstRunWizard` splits accept from close. `OnClose` no longer silently sets `FirstRunCompleted`, so closing the X + leaves the wizard pending and it reopens on the next plugin load. A new footer "Later — keep defaults" button is the + explicit path to dismiss without picking a profile. Bilingual strings (EN + DE) plus a tooltip +- `InputHistoryService.Reset` is wired into `Plugin.DisposeAsync` alongside the existing pure-memory cleanups. Static + state used to survive a plugin reload — the next load now starts with an empty history +- `FontManager.GetHellionFontBytes` becomes `TryGetHellionFontBytes` with a nullable return. On miss (broken csproj, + hand-rolled dev build) the caller falls back to the system-font path that `UseHellionFont=false` already uses, plus a + `Plugin.Log.Warning`. The whole UiBuilder no longer throws if the embedded font resource is absent +- `Plugin.cs:167-168` gets a 4-line reasoning comment around the session-only `RemoveAll(IsTempTab)`: tells are usually + privacy-filtered, resurrecting an empty crashed-session tab would trigger DB reconstruction on the next load. + `TempTabCounter.InitFromList` mirrors the post-strip semantic in the Build-Suite with a pinning test +- `StatusBar.cs` drops the version slot when the chat window's content width minus the version text is below 200 px. + The right-aligned version used to clip into the four left-side slots in narrow windows + +Modding & support: join Hellion Forge — + +Based on Chat 2 1.35.3 (upstream Infiziert90/ChatTwo, EUPL-1.2). + +--- + ## Hellion Chat 1.4.4 — Threading and IPC Safety Polish (2026-05-12) Fifth sub-patch of the v1.4.x polish-sweep series. Threading assumptions are documented per-method, a hot-path lock diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index 0b9e66a..802353b 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -10,14 +10,37 @@ the plugin's privacy-first scope during brainstorming. --- -## Next Cycle (v1.4.4) +## Next Cycle (v1.4.6) -**Window-Lazy-Open + Render-Init-Cost Optimisation** — take the `IAsyncDalamudPlugin` foundation laid in v1.4.3 and turn -it into wins users can actually feel. Window construction deferred until first open, render-path init cost reduced in -the first frames. Concrete candidates and size estimates will be consolidated in the v1.4.4 brainstorm. +**Code-Hygiene + Refactor.** Build-side pre-commit hook with csharpier-check as a hard gate so format drift can't reach +a commit (~30 min). Plus the cycle absorbs whatever surfaces from v1.4.5 smoke that doesn't justify a hotfix. Concrete +scope is consolidated in the v1.4.6 brainstorm. --- +## v1.4.5 — UX and Robustness (released 2026-05-12) + +Sixth sub-patch of the v1.4.x Polish Sweep series. User-visible robustness polish plus two doc/test polish items from +the audit backlog. Chat-log draw failures now surface as a one-shot notification instead of failing silently. The +first-run wizard splits accept from close: `OnClose` no longer silently sets `FirstRunCompleted`, and a new footer +"Later — keep defaults" button is the explicit path to dismiss without picking a profile. `InputHistoryService` clears +on plugin dispose so the previous session's typed commands don't bleed into the next load. `FontManager` falls back to +the system font path if the embedded Hellion font resource is missing (broken-csproj / dev-build only). The status bar +hides the version slot when the chat window is too narrow to fit all five slots without overlap. Plus +`Plugin.cs:167-168` gains an explicit session-only Auto-Tell-Tab invariant comment with a `TempTabCounter.InitFromList` +pin in the Build-Suite. No schema bump, no migration. + +## v1.4.4 — Threading and IPC Safety Polish (released 2026-05-12) + +Fifth sub-patch of the v1.4.x Polish Sweep series. `AutoTellTabsService.ActiveTempTabCount` switches from a +lock-protected LINQ `Count` to an `Interlocked` counter kept in sync from inside the existing mutation paths; +`Initialize()` seeds from the persisted Tabs list and `SaveConfig`'s snapshot-restore path calls a new +`ResyncTempTabCounter()` after the mid-step `RemoveAll`. `HonorificService` carries per-method threading banners and +`TryUnsubscribe`'s log level moves from Debug to Warning. `AutoTranslate.PreloadCache` is marked `IsBackground = true` +so plugin unload no longer waits for it. `Configuration.IsAllowedForStorage` logs once per unknown ChatType via a +`NonSerialized` `HashSet`, and `PrivacyPersistUnknownChannels` default flips to `true` for new installs. No schema +bump, no migration. + ## v1.4.3 — Plugin-Load Async-Init + Repo-Cutover (released 2026-05-08) Fourth and largest sub-patch of the v1.4.x Polish Sweep series. Plugin migrated to Dalamud's `IAsyncDalamudPlugin` API: diff --git a/repo.json b/repo.json index bc26225..db924bb 100644 --- a/repo.json +++ b/repo.json @@ -3,7 +3,7 @@ "Author": "Jon Kazama (Hellion Forge)", "Name": "Hellion Chat", "InternalName": "HellionChat", - "AssemblyVersion": "1.4.4.0", + "AssemblyVersion": "1.4.5.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.4 — Threading and IPC safety polish (2026-05-12)**\n\nFifth sub-patch of the v1.4.x polish-sweep series. Threading assumptions are documented per-method, a hot-path lock falls away, and the privacy filter speaks up when an unknown ChatType shows up.\n\n- AutoTellTabs hot-path getter uses an Interlocked counter instead of taking the lock on every read\n- Honorific integration: per-method threading banners, plus Warning-level log on unsubscribe failure\n- AutoTranslate warmup thread marked IsBackground so plugin unload doesn't wait for it\n- PrivacyFilter logs once per unknown ChatType so a future patch's added channel doesn't drop off the radar\n- New installs persist unknown channels by default; existing configs keep their explicit choice\n\n---\n\n**v1.4.3 — Faster plugin load + new repo (2026-05-08)**\n\nHeavy startup work (migrations, hooks, windows) now runs async so Dalamud's UI stays responsive during load. Load time is comparable to v1.4.2 — this is the foundation for v1.4.4 optimisations.\n\n- Two-phase async load via IAsyncDalamudPlugin\n- Schema-gate replaces the v9→v16 migration chain; old configs require a v1.4.2 install first\n- AutoTranslate cache loads on first use instead of every startup\n- Custom font (Hellion-Exo2) appears with a brief pop after load\n- Repo moved to gitea.hellion-forge.cloud — update your custom-repo URL\n\n---\n\n**v1.4.2 — Smoother frames in the chat log**\n\nPer-frame allocations in the chat-log render path eliminated. 2–5% frame-time recovery in typical scenes, more on pop-out-heavy setups.\n\n- Card-mode: theme/border invariants hoisted out of the per-message loop\n- Auto-tell tab tint and icon cached per tab\n- Status bar aggregation runs on ~1% of frames instead of every frame\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases", + "Changelog": "**v1.4.5 — UX and Robustness (2026-05-12)**\n\nSixth sub-patch of the v1.4.x polish-sweep series. Chat-log draw failures surface as a notification, the first-run wizard has an explicit Later option, the input history clears on plugin reload, and the status bar version slot stops clipping in narrow windows.\n\n- Chat window draw errors now show a one-shot notification instead of failing silently — stack trace stays in /xllog\n- First-run wizard: explicit \"Later — keep defaults\" button. Closing the X no longer silently accepts the defaults; the wizard reopens on the next plugin load if nothing was picked\n- InputHistoryService clears on plugin dispose so the previous session's typed commands don't bleed into the next load\n- Status bar hides the version slot when the chat window is too narrow to fit all five slots without overlap\n- Internal: explicit session-only Auto-Tell-Tab invariant in Plugin.cs plus a pinning test in the Build-Suite\n- Internal: FontManager falls back to the system font if the embedded Hellion font resource is missing — logs a Warning\n\n---\n\n**v1.4.4 — Threading and IPC safety polish (2026-05-12)**\n\nFifth sub-patch of the v1.4.x polish-sweep series. Threading assumptions are documented per-method, a hot-path lock falls away, and the privacy filter speaks up when an unknown ChatType shows up.\n\n- AutoTellTabs hot-path getter uses an Interlocked counter instead of taking the lock on every read\n- Honorific integration: per-method threading banners, plus Warning-level log on unsubscribe failure\n- AutoTranslate warmup thread marked IsBackground so plugin unload doesn't wait for it\n- PrivacyFilter logs once per unknown ChatType so a future patch's added channel doesn't drop off the radar\n- New installs persist unknown channels by default; existing configs keep their explicit choice\n\n---\n\n**v1.4.3 — Faster plugin load + new repo (2026-05-08)**\n\nHeavy startup work (migrations, hooks, windows) now runs async so Dalamud's UI stays responsive during load. Load time is comparable to v1.4.2 — this is the foundation for v1.4.4 optimisations.\n\n- Two-phase async load via IAsyncDalamudPlugin\n- Schema-gate replaces the v9→v16 migration chain; old configs require a v1.4.2 install first\n- AutoTranslate cache loads on first use instead of every startup\n- Custom font (Hellion-Exo2) appears with a brief pop after load\n- Repo moved to gitea.hellion-forge.cloud — update your custom-repo URL\n\n---\n\n**v1.4.2 — Smoother frames in the chat log**\n\nPer-frame allocations in the chat-log render path eliminated. 2–5% frame-time recovery in typical scenes, more on pop-out-heavy setups.\n\n- Card-mode: theme/border invariants hoisted out of the per-message loop\n- Auto-tell tab tint and icon cached per tab\n- Status bar aggregation runs on ~1% of frames instead of every frame\n\n---\n\nFull history: https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases", "AcceptsFeedback": true, - "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.4/latest.zip", - "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.4/latest.zip", - "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.4/latest.zip", - "TestingAssemblyVersion": "1.4.4.0", + "DownloadLinkInstall": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.5/latest.zip", + "DownloadLinkUpdate": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.5/latest.zip", + "DownloadLinkTesting": "https://gitea.hellion-forge.cloud/JonKazama-Hellion/HellionChat/releases/download/v1.4.5/latest.zip", + "TestingAssemblyVersion": "1.4.5.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",