# Changelog

All notable changes to this project will be documented in this file.

## 2026-06-03

### Added
- Added IDE feature flags for Object Browser, Property Browser, hover overlays, reference navigation, and scratch actions so deployments can disable unsupported MOO integrations.

### Changed
- Made dark mode the default for the IDE editor while preserving saved theme preferences.
- Closed the IDE window automatically when closing the last editable tab leaves only Object Browser or Property Browser tabs behind.
- Highlighted user-defined MOO access receivers with the object-receiver color while keeping built-in variables such as `this` and `player` visually consistent.
- Added distinct MOO verb editor highlighting for access receivers, cored/direct object receivers, and property names.
- Distinguished builtin functions from in-MOO verb calls and corified object references in the MOO verb editor highlighting, including separate call-name coloring for MOO verb invocations.
- Updated the MOO verb editor mode with ToastStunt error constants, booleans, object and core references, MOO operators, and keyword-block indentation while removing JavaScript-derived highlighting.
- Updated MOO builtin highlighting in the verb editor to match ToastStunt's builtin function list.
- Highlighted additional MOO type constants in the verb editor, including `MAP`, `WAIF`, `ANON`, and `BOOL`.
- Updated the verb editors to insert two spaces for tabs so indentation matches MOO-shipped source.
- Routed client-options commands, panel controls, imports, and resets through one controller so preference writes validate, persist, and apply live effects consistently.
- Refactored the browser-client health UI into a focused controller for status messages, socket errors, panel controls, graph updates, and polling.
- Clarified MUD/MOO terminology in the README while preserving legacy route, config, and documentation names.

### Fixed
- Hid the IDE reference-jump shortcut from the shortcuts overlay when ctrl/cmd-click navigation is disabled.
- Corrected setup and MOO integration documentation for local env defaults, IDE feature flags, SDWC request payloads, and MOO-side setup examples.
- Kept the IDE VMS note field visible while a cleared note input still has focus so notes can be fully replaced without collapsing the editor control.
- Fixed IDE editor MOO access highlighting so property names and cored/direct receivers use the same distinct colors as standalone editor windows.
- Fixed MOO verb editor access highlighting so property names and cored/direct object receivers remain visually distinct after Ace themes load.
- Fixed MOO verb editor outdent detection for typed closing block keywords such as `endfor`.

## 2026-06-02

### Added
- Added Knip dead-code analysis commands for finding unused files, exports, and dependencies.
- Added regression coverage to keep browser-client modules from reintroducing the legacy `dome` singleton.

### Changed
- Reduced client-options maintenance debt by rendering option rows from schema metadata and documenting intentional Knip suppressions.
- Reduced client options and connect-page debt by moving option storage keys and render defaults into schema helpers and extracting connect-page workflow binders.
- Replaced the internal browser-client `dome` singleton and shared socket state with explicit client runtime composition.
- Routed editor and IDE window coordination through injected client state and `postMessage` instead of browser-facing `window.dome` access.
- Removed legacy browser-client setup wrapper assignments now that startup and tests use explicit setup exports.
- Reduced legacy browser-client setup hook usage in reconnect, preferences, and socket-output flows.
- Split server listen, close, and bound-address helpers out of the server startup path.
- Split Socket.IO manager binding out of the server startup path.
- Split HTTP and HTTPS server creation out of the server startup path.
- Split Express app creation out of the server startup path while preserving route and middleware behavior.
- Wired socket lifecycle setup through explicit client composition exports.
- Wired health-check setup through explicit client composition exports.
- Wired input-reader and autocomplete setup through explicit client composition exports.
- Wired autoscroll and output parser setup through explicit client composition exports.
- Wired window-handler and editor-support setup through explicit client composition exports.
- Wired button and chevron setup through explicit client composition exports instead of standalone side-effect startup imports.
- Split button workflows for reconnect, log download, clear-buffer confirmation, overlays, and image preview into focused helpers.
- Extracted health status classification, connection-error diagnosis, detail rendering, and graph-series shaping from the health UI setup.
- Extracted connect-page saved-user storage and connection intent helpers so local profile persistence and player-client URL building are tested outside DOM setup.
- Removed obsolete connect-page migration for legacy `dc-username` and `dc-password` local profile keys.
- Split client options import/export helpers and schema-driven dropdown metadata out of the options DOM setup.
- Replaced the Editor IDE technical debt plan with a roadmap focused on tab planning, save flow, shortcuts, overlays, and orchestration cleanup.
- Refactored the Editor IDE internals into focused planning, save-flow, shortcut, overlay, browser command, recent-tab, and label helpers while preserving existing behavior.
- Centralized client option display names in the shared option schema so option UI labels stay aligned with command and preference metadata.
- Extracted client option preference parsing, command parsing, and validation into pure helpers to reduce client options side-effect coupling.
- Split socket output rendering from protocol side effects so buffer rendering, SDWC nowrap handling, IDE messages, alerts, and scrollback pruning are easier to maintain.
- Introduced an explicit client composition initializer so browser setup can be wired with injectable setup hooks while preserving existing startup behavior.
- Decomposed server socket handling into focused address resolution, MUD connection, data flow, and session event helpers while preserving connection behavior.

### Fixed
- Suppressed intentional Knip export warnings for internal test seams and setup APIs while preserving file and dependency checks.
- Removed stale dead-code findings for unused replacement data and same-module-only helper exports.
- Fixed the dead-code dependency check by removing unused test helper packages and ignoring Stryker's built-in command runner false positive.
- Kept fallback autocomplete suggestions above the input buffer with a readable gap instead of overlapping typed commands.
- Fixed Enter-key command submission when the input buffer is initialized before the socket connection is assigned.
- Hardened the IDE editor against malformed window messages and unavailable socket, opener, root, or Ace editor APIs.

## 2026-06-01

### Added
- Added auth contract tests for malformed upstream payloads to lock expected login failure and user-sanitization behavior.
- Added status contract tests to verify malformed status-service payload schemas degrade to safe fallback state.
- Added integration config-matrix coverage for high-risk deployment modes (single vs multi-MUD and auth enabled vs disabled) with isolated per-case test processes to prevent module-cache cross-contamination.
- Added reusable HTML golden-snapshot integration coverage for key routes (`/`, `/player-client/`, and multi-MUD `/game-owner-questions/`) across high-value mode variants.
- Added a scoped mutation-testing profile (`npm run test:mutation`) for critical server modules with Stryker configuration and HTML reporting output.

### Changed
- Moved user-facing testing guidance out of `README.md` into a dedicated `docs/TESTING.md` guide.
- Added up-to-date test command coverage and coverage-threshold guidance in the new testing guide.
- Hardened status-service polling by validating required payload schema fields before accepting upstream status data.
- Hardened website-auth handling by validating upstream payload shape (`status`, `message`, and required `user` object for `status: "ok"`) before mutating session state.
- Updated lint configuration to exclude `.stryker-tmp/` mutation sandbox artifacts from repository-wide lint runs.
- Updated Stryker reporting to emit machine-readable JSON output while preserving live terminal progress.
- Added dedicated mutation scripts for warm-cache prep and hotspot-only runs to speed up mutation-testing iteration.

### Fixed
- Added a socket connect-timeout safeguard so stalled TCP connect attempts fail fast instead of hanging indefinitely.
- Restored the `npm run test:mutation` script and Stryker dev dependency so mutation testing works after clean installs.
- Fixed `npm run test:mutation:hot` to pass the dedicated Stryker config file using the CLI's positional config argument format.

## 2026-05-29

### Added
- Added a dedicated `npm run test:integration` command to run app-level integration tests separately from the default test suite.
- Added server integration coverage for core HTTP route availability, Socket.IO connection startup, website-login flow, and status-service endpoint behavior with mocked upstream dependencies.
- Added integration coverage for auth session continuity, auth upstream network failure behavior, static asset serving contracts, security header baseline checks, and global route-error handling.
- Added integration coverage for log export endpoint behavior (`/save/:filename`) including attachment headers and filename sanitization.
- Added integration coverage for multi-MUD successful socket connections updating persisted connection metrics on disk and validating reload behavior.
- Added DOM-driven integration coverage for client options export/import controls, including JSON round-trip and legacy theme normalization on import.
- Added integration coverage for multi-MUD failed-connect metrics behavior, multi-MUD host/port fallback behavior, and status-service non-JSON/invalid-JSON degradation paths.
- Added integration coverage for per-agent session isolation, socket input lifecycle status/disconnect flow, shortener-failure passthrough behavior, and HTTPS startup binding metadata.
- Added integration coverage for website-login redirect variants (`gogogo` auto character redirect, safe `return` override, and unsafe `return` fallback to `/`).
- Added integration coverage for status-service transition behavior from healthy to degraded and back to healthy.
- Added integration coverage for connect-page user flow actions (`Connect as Guest`, `Connect Manually`, and `Connect Now`) validating local client state persistence behavior.
- Added integration coverage for log export edge cases including empty buffers, large buffers, Unicode payloads, and encoded download filenames.
- Added integration coverage for client options destructive-flow guardrails, including reset cancellation behavior and partial-invalid import reporting.

### Changed
- Updated server startup internals so `start()` accepts optional runtime overrides (for example ephemeral test ports) and returns bound runtime address metadata for integration harnesses.
- Improved status polling testability and test-runner shutdown behavior by adding an explicit status refresh hook and unref'ing background status timers.
- Updated server shutdown to remove its `uncaughtException` listener, preventing listener accumulation across repeated integration server boots.
- Added a test-only multi-MUD metrics reset hook to isolate integration runs from module-level in-memory state.

## 2026-05-28

### Added
- Added a multi-MUD connect-page `Game Owner? Got Questions?` box between the connect form and connection stats, linking to a new game-owner guide page.
- Added a multi-MUD-only `/game-owner-questions/` page explaining the `#$# dome-client-user` marker flow, the `@dome-client-user <hostname-or-ip>` response behavior, and where to find more details in the Dome Client GitHub repository.

### Fixed
- Removed the outdated Chrome performance warning from the connect splash page now that the prior Chrome-specific issue is no longer affecting users.
- Removed legacy Chrome `weak browser` detection for scrollback defaults and now default to unlimited scrollback (`performanceBuffer=0`) across browsers.
- Multi-MUD mode log downloads now use a consistent `dome-client` filename prefix instead of the configured game name.

## 2026-05-27

### Added
- Added `MULTI_MUD` mode (default off) to enable legacy-style host/port-first splash flow with multi-game connect support.
- Added persistent multi-MUD connection analytics storage (`data/multi-mud-metrics.json`) so game usage counts survive restarts.
- Added ANSI TrueColor rendering support for foreground/background sequences (`38;2;r;g;b` and `48;2;r;g;b`) using inline RGB styles in the line buffer and saved logs.
- Added a `Scroll Up to Pause` client option that pauses auto-scroll when you scroll up and resumes when you return to the bottom.
- Added `Input Font` and `Input Font Size (pt)` client options so command entry text can be customized independently from output/editor fonts.
- Added `Input Font Color` and `Input Background Color` options with mobile-friendly color pickers and hex inputs for precise command-entry styling.
- Added `Output Font Size (pt)` as a separate client option so output text size can be adjusted independently, defaulting to the legacy output size.
- Added an `Import/Export` Client Options tab for downloading all preferences as JSON and importing them locally without server upload.
- Added a `Reset to Defaults` action in Client Options Import/Export with a confirmation warning before overwriting current settings.

### Changed
- Renamed the `SDWC No-Wrap Blocks` client option to `Mobile Friendly Text Wrap` for clearer user-facing wording.
- Renamed backend connection environment variables from `MOO_HOST`/`MOO_PORT` to `MUD_HOST`/`MUD_PORT` across app config, docs, examples, and tests.
- Renamed the game-name environment variable to `MUD_NAME` across env validation, config wiring, docs, and tests.
- Updated the main client command input to request plain text mobile keyboards without autocapitalize, autocomplete, or autocorrect.
- Organized Client Options into General, Presentation, and Local Editor tabs, renamed `Output Colors` to `Theme`, and removed admin-only wording from editor options.
- Tightened Client Options dropdown widths to a consistent medium size, widened option labels, and left-aligned Presentation color/size controls for cleaner mobile layout.
- Client options JSON import now applies recognized keys, skips unknown keys, and reports invalid JSON errors in the client output buffer.

### Fixed
- Fixed real-device mobile top control behavior by anchoring mini-controls to the client container on touch devices so output-area icons remain pinned while scrolling.
- Fixed very small-screen controls by converting mini-controls into an in-layout toolbar above the input buffer so actions remain accessible while output scrolls.
- Fixed shortcuts overlay positioning on mobile by centering the dialog within the viewport and constraining width/height to avoid left-edge clipping.
- Added a small-screen confirmation prompt before `Clear Buffer` clears output to reduce accidental buffer wipes on mobile.
- Improved small-screen mini-controls usability by switching to text-forward buttons (showing labels like Settings/Shortcuts/Clear Buffer/Log) with larger touch targets.
- Replaced browser-native small-screen clear-buffer confirmation with an in-app overlay dialog that includes explicit Cancel and Clear Buffer actions.
- Scoped small-screen text-heavy mini-controls to touch devices so narrow desktop windows keep compact icon controls and avoid clipping the Log button.
- Updated footer version/corporate/changelog link styling on the connect screen so those links render with clear link color and underlines.
- Simplified `MULTI_MUD` splash flow to host/port direct connect only (removed Next/back and character/password entry in that mode).
- Improved connect-page character picker sizing and dropdown width so the selector no longer appears undersized or cramped.
- Preserved existing xterm256 class-based color mapping behavior while adding TrueColor, so client color schemes continue overriding palette-based colors as before.
- Fixed ANSI rendering for SGR reset/toggle sequences (`22m`, `25m`, `7m`, `27m`) so bold/blink/inverse styles stop correctly and raw escape codes are no longer shown in output.
- Replaced regex ANSI rendering with a stateful stream parser so SGR resets, inverse fg/bg swapping, xterm256 themed colors, TrueColor, and split escape sequences render consistently with terminal behavior.
- Updated default-color inverse rendering to use explicit inverse foreground/background colors (instead of CSS filter inversion) for closer terminal visual parity.
- Fixed `Scroll Up to Pause` so enabling or disabling it from Client Options takes effect immediately without requiring a reload.
- Fixed the `Transparent Overlays` option so autocomplete overlays keep the selected transparency when toggled or rebuilt.
- Expanded `Transparent Overlays` so it now also affects shortcuts, history search, client options, and the MOO status detail overlay.
- Fixed duplicate Client Options initialization that could bind repeated Import/Export handlers, causing multi-download behavior.
- Fixed Import/Export theme compatibility by normalizing legacy editor theme values (`ambiance`/`tomorrow`) during import.
- Fixed Import/Export options panel stability by ignoring non-option rows in options refresh/binding logic.
- Enforced numeric validation and `8..24` range checks when writing `Output Font Size (pt)` and `Input Font Size (pt)` via client options/import/commands.
- Removed duplicate standalone Client Options script loading so the options UI uses the same runtime preference instance as the main client, restoring immediate live updates for input/output font family, size, and input colors.

### Changed
- Added Import/Export success/error toast messages in Client Options and a warning that import overwrites current settings, with guidance to export a backup first.
- Made Import File and Export File buttons the same width for a consistent layout.
- Renamed Import/Export action labels to `Export File` and `Import File`, moved feedback toast into the Import/Export panel, and changed Import/Reset confirmations to explicit destructive-action warnings.

## 2026-05-22

### Added
- Added a new client option, `SDWC No-Wrap Blocks` (default off), to enable horizontal-scroll rendering for explicit SDWC nowrap marker regions.

### Changed
- Added support for server OOB markers `#$# SDWC-START-NOWRAP` and `#$# SDWC-END-NOWRAP` so marked output streams into a dedicated no-wrap horizontal-scroll block while preserving per-line styling.
- Updated log/export styling parity so SDWC nowrap blocks retain their horizontal-scroll presentation in rendered output.
## 2026-05-21

### Added
- Added local glyphicon sprite assets (`public/img/glyphicons-halflings.png` and `public/img/glyphicons-halflings-white.png`) to remove runtime dependency on remote icon images.
- Added a `Ctrl+R` command-history search overlay with live filtering, keyboard navigation, and click-to-select support that inserts the chosen command back into the input buffer.
- Added a new client option to choose log export style between default inline CSS and legacy linked `https://sindome.org/css/dome.css` output.

### Changed
- Migrated legacy dome utility/button/icon styles into the LESS source and bundled them in `/css/client.css`, replacing runtime dependency on remote `https://sindome.org/css/dome.css`.
- Updated HTML log export to inline the client stylesheet directly in downloaded log files so session logs no longer depend on Sindome-hosted CSS.
- Updated keyboard shortcut help to document `Ctrl+R` command-history search.
- Updated command-history search results so the active selection uses the client blue highlight with high-contrast white text, auto-scrolls into view during keyboard navigation, and expands to show full wrapped command text.

### Fixed
- Prevented mobile connect-page horizontal overflow so the main auth panel, Website Login box, guest actions, and footer no longer bleed off the screen on small viewports.
- Restored responsive visibility utility classes (`hidden-xs`/`hidden-sm`/`hidden-md`/`hidden-lg`) so player-client top controls collapse back to glyph-only labels on small screens.
- Fixed real-device mobile styling mismatch by serving local `client.css` for all device types and removing runtime dependency on external `dome.css`.
- Fixed exported HTML log typography fallback so buffer text stays monospace when `Source Code Pro` is unavailable offline.
- Restored base legacy UI styling (`.btn`, `.hidden`, `.close`) in bundled client styles so connect-page buttons and the Chrome performance warning render correctly without remote `dome.css`.
- Aligned extracted legacy global/link/button/title styles with Sindome’s `dome.css` so connect-page buttons, heading color, and version/changelog link colors match expected appearance more closely.
- Restored explicit terminal font styling for `#inputBuffer` so command entry text matches the expected in-game monospace appearance.
- Restored the input buffer top separator border to prevent visual clipping/offset at the bottom edge and match legacy `dome.css` behavior.
- Corrected input buffer edge styling by removing the thicker top separator and restoring bottom spacing so the bottom line remains visible without increasing top border thickness.
- Added mobile-only up/down history buttons beside the input box that trigger the same command-history navigation behavior as keyboard arrow keys.
- Fixed mobile history button behavior in multiline input so caret navigation now matches arrow-key behavior before history recall triggers.
- Increased small-screen input box height beside mobile history buttons so the textarea fills the control column height without leaving dead space.
- Filtered exact duplicate entries from command-history search results so repeated identical commands appear once.
- Corrected history-search overlay/input sizing so the search field no longer expands beyond modal edges on smaller screens.

### Removed
- Removed unused `WEBSITE_BASE` environment variable from env validation, app config wiring, server template locals, and env example files.

## 2026-05-19

### Changed
- Bumped displayed client version to `4.0.1` so the footer and server startup version match `package.json`.
- Updated app version wiring to use `APP_VERSION` first, then `package.json` version, with a final fallback to `0.0.0`.
- Unified client stylesheet loading to always use `/css/client.css` across desktop, phone, and tablet requests.

### Fixed
- Reduced IDE toolbar button sizing and enabled responsive wrapping so top-row controls and editor content remain visible at the default non-maximized window size.
- Restored `npm run build` behavior by making the build script execute the asset pipeline when run directly.
- Re-centered IDE tab close buttons so the `×` icon stays visually centered within each tab.
- Added a global `window.DomeBridge` ingress API so mobile native bridge integrations can route inbound game data through the standard client parser and retain color/format rendering.
- Enabled mobile native bridge log downloads by sending generated HTML logs through `window.DomeNative.downloadLog` when available, with browser download fallback retained.
- Added native-bridge socket shimming in the client bootstrap so mobile wrappers with `window.DomeNative` can run transport through the native bridge instead of initializing browser Socket.IO.
- Buffered native bridge startup events until `window.DomeBridge` is ready, then flushed queued data so initial MOO splash output is not dropped on app load.
- Added an explicit native `bridgeReady` handshake so Android can hold and replay pre-init socket payloads that arrive before page scripts are ready.

### Changed
- Switched IDE top-bar theme, wrap, and tab-orientation controls to compact icon/glyph buttons with tooltips to improve fit at smaller window sizes.
- Changed the IDE shortcuts control to a compact glyph button and reduced tab button padding so more tabs fit comfortably in the tab strip.
- Made the IDE shortcuts modal responsive at smaller/zoomed window sizes by reducing typography scale and adding internal scroll handling.
- Reworked IDE toolbar responsiveness so controls/status/save/close stay on the first row at smaller sizes, with the editing context line moved to a centered second row.
- Removed small-screen toolbar horizontal scrolling, tightened mobile control sizing, and shortened `View Saved Scratch` to `View Scratch` for better fit.
- Shifted IDE toolbar responsive breakpoint to `md` so 640px stays in two-row mode, keeping the editing label visible below controls while further reducing mobile button sizing.

## 2026-05-18

### Added
- Added global autocomplete feature toggle (`AUTOCOMPLETE_ENABLED`) with default-off behavior and dedicated setup documentation (`docs/AUTOCOMPLETE.md`).

### Changed
- Renamed IDE window title branding to `Dome-Client Developer IDE [tab-count]`.
- Updated runtime defaults to be more generic by setting `WEBSITE_BASE` and `SHORTEN_DOMAIN` defaults to empty values.
- Updated `.env` example files to reflect new defaults and include autocomplete toggle guidance.
- Expanded and aligned setup documentation across README and `docs/` for autocomplete, URL shortener, and website auth behavior.

### Fixed
- Prevented website-login crashes when remote auth returns null entries in `user.chars` by filtering invalid characters before session storage and rendering.
- Reduced excess empty space in the logged-in "Play As ..." panel by removing fixed desktop minimum height so the box fits its content.

### Removed
- Removed the non-functional lock/unlock toggle from the logged-in "Play As ..." section.
- Removed outdated internal UI polish scratch doc (`docs/UI-POLISH.md`) to keep release docs focused on active features and operator setup.

## 2026-02-17

### Added
- Added a configurable 20-line IDE limit for `@local-save-note`.

## 2026-01-08

### Added
- Configurable line limits for `@local-save-node` and `@local-save-node-admin` in the IDE editor.

## 2026-01-07

### Added
- Prompt before closing the tab or window when the socket is still connected.

## 2025-12-21

### Added
- Prime the alert tone on first interaction so autoplay restrictions don't block chimes.

### Fixed
- Treat mention chimes as case-insensitive.

## 2025-10-12

### Added
- SSL ACME check route.

## 2025-09-30

### Changed
- Updated health overlay timestamps to display in the browser's local time zone instead of UTC.
- Added an optional UTC mode to the client date formatter to keep tests deterministic while defaulting UI to local time.

## 2025-09-21
- Made log downloading a fully local thing, so that it doesn't hit the server (better if the server goes down, and won't overload the server on large logs)

## 2025-09-18
- Fixed double scrollbar issue in FireFox
- Added health check
  
## 2025-09-04
- Updated health check to have a higher ceiling for available ram
- Fixed bug with command suggestions being off causing console errors

## 2025-09-02
- Fixed a bug where you'd get reconnected while on the @quit disconnect screen
- Added a view saved scratch button to the admin editor

## 2025-08-31

### Added
- Configurable shorten request timeout.
- Changelog link on the client connect page.
- Ability to send empty input commands.
- Button and Ctrl+Shift+L shortcut to toggle word wrap across all IDE tabs.

### Changed
- Simplified connect flow by removing the options button and streamlining the URL.
- Updated ACE print margin to 120 characters.
- Silenced healthcheck logs.
- Added bottom padding to the buffer.
- Improved health overlay behavior to close on mouse exit, delay hiding, and prevent flicker.
- Documented sudo requirement for SSL key access.

### Fixed
- Preferences store initialization issue.
- Buffer parser now merges split tokens and UUID lines and treats color-only lines as blank.
- IDE windows now reuse existing window.
- Tab orientation controls remain visible on narrow screens.
- Word wrap toggle now keeps all IDE tabs in sync and refreshes inactive tabs immediately.
- Fixed double scrollbar
- Fixed text wrapping / new line issue due to TCP sockets

## 2025-08-30

### Added
- Scratch pad tab support in the IDE.

### Changed
- Refactored command utilities and labels, including @@set_note targets, upload command labels, and unique tab keys.
- Expanded IDE shortcuts overlay and table layout; increased column spacing and cell expansion.
- Log full editor and command context when opening the IDE.

### Fixed
- Handle `none` values and missing Ace workers.
- Notify users when switching to an existing IDE tab.

## 2025-08-29

### Added
- Basic editor for non-program commands with Ace text mode.
- IDE shortcuts overlay with slash toggle, bracket navigation, and tab-switching shortcuts.
- Configurable editor and output fonts, including Comic Mono.
- Close button and keyboard shortcuts for closing IDE tabs; vertical tab scrolling.
- Reuse existing IDE window and update IDE title with tab count.

### Changed
- Applied Ace theme colors and output font styling across editors.
- Bumped webclient version to 4.0.
- Reworked overlay placement and tab resizing; applied theme to basic editor.

### Fixed
- Prevent browser window from closing via Ctrl/Cmd+W and refine unsaved-change warning.
- Display save controls only when upload targets exist.
- Apply dark theme to document root and remove nested buttons in the IDE editor.

## 2025-08-28

### Changed
- Simplified reconnect button logic.
- Image preview toggle persists across sessions.

### Removed
- Unused "Close All Windows" button.

## 2025-08-27

### Added
- Integrated Ace editor into note editor and upgraded to v1.43.2.
- Introduced native command suggestions and expanded preference management with persistent font, theme, and color options.
- Replaced help menu with an options button and removed channel windows and god mode options.

### Changed
- Migrated dependencies to modern alternatives and bundled UI dependencies locally.
- Hardened path handling, WHO content-length calculation, and log filename sanitization.

### Fixed
- Fixed console.log errors when client loads in browser.
- Resolved echo/hide echo button sync issues.

## 2025-08-26

### Changed
- Replaced remaining jQuery and underscore usage with native DOM APIs.
- Removed obsolete script and stylesheet references from headers.
- Redesigned help menu and overlay toggles using custom JavaScript.
- Migrated animations to CSS/Web Animations and server calls to `fetch`.

### Fixed
- Fixed disconnect overlay class usage and other UI glitches.

## 2025-08-25

### Added
- In-app shortcuts overlay button.
- Browser logger to replace direct console calls.
- DNS error handler for socket utilities and `writeAsync` promise wrapper.

### Changed
- Updated command history behavior.
- Moved keybinding from End to Pause/Break.
- Modernized dependencies, build pipeline, and client module structure.
- Converted login and URL-shortening logic to async/await with `fetch`.
- Consolidated log-file naming and reduced extraneous status logs.

### Fixed
- Guest login no longer persists after manual reconnect.
- Corrected pause key mapping and up-arrow navigation glitches.
- Copying buffer window no longer adds extra line breaks.
- Localized preference variables to avoid global leaks.

### Removed
- Unused JavaScript dependencies and obsolete session keys, special options, and deprecated configuration flags.
- Legacy script tags (Backbone, CryptoJS, JSON2) and simplified environment setup.
