|
| 1 | +# Changelog |
| 2 | + |
| 3 | +All notable changes to this project will be documented in this file. |
| 4 | + |
| 5 | +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), |
| 6 | +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). |
| 7 | + |
| 8 | +## [Unreleased] |
| 9 | + |
| 10 | +## [1.1.0] - 2026-03-08 |
| 11 | + |
| 12 | +### Added |
| 13 | + |
| 14 | +- `FlashForgeA3Client` — full Adventurer 3 TCP client aligned with the documented G-code protocol, exported from the package root |
| 15 | +- `A3GCodeController` — A3-specific G-code command controller with a dedicated instruction set |
| 16 | +- `A3BuildVolume`, `A3FileEntry`, `A3PrinterInfo`, `A3Thumbnail` types for typed Adventurer 3 responses |
| 17 | +- `GCodeClientCapabilities` interface for capability-based client selection across printer generations |
| 18 | +- `PrinterModel`, `DiscoveryProtocol`, `PrinterStatus` enums providing fully-typed discovery results |
| 19 | +- `DiscoveredPrinter` and `DiscoveryOptions` TypeScript interfaces replacing loosely-typed discovery objects |
| 20 | +- `DiscoveryErrors` — custom error class hierarchy for structured discovery error handling |
| 21 | +- PID-based legacy model fallback in `PrinterDiscovery`: known USB product IDs (`0x0008` Adventurer 3, `0x001e` Adventurer 4) are used as a secondary hint when name heuristics are inconclusive |
| 22 | +- `FlashForgeTcpClient.uploadFile()` — M28 / raw-binary / M29 file upload flow for legacy printers, with automatic filename normalization |
| 23 | +- `FiveMClientConnectionOptions` — optional HTTP port and TCP port overrides for `FiveMClient` construction |
| 24 | +- `FlashForgeTcpClientOptions` — optional TCP port override for `FlashForgeTcpClient` construction |
| 25 | +- Vitest test suite with unit coverage for discovery, client lifecycle, and response parsers |
| 26 | +- Biome linter and formatter configuration |
| 27 | + |
| 28 | +### Changed |
| 29 | + |
| 30 | +- `FlashForgePrinterDiscovery` renamed to `PrinterDiscovery`; a migration guide is available in `docs/MIGRATION_GUIDE.md` |
| 31 | +- Discovery multicast now joins each multicast group once per socket instead of once per port, eliminating duplicate `addMembership` calls |
| 32 | +- Legacy model detection upgraded: USB product ID hints are checked as a fallback after name-based matching |
| 33 | +- AD5X detection now uses the `hasMatlStation` capability flag and material-station slot data instead of relying solely on the model name string |
| 34 | +- M661 (list local files) command settle window increased from 500 ms to 1200 ms to correctly handle two-stage firmware responses |
| 35 | +- Package manager migrated from npm to pnpm |
| 36 | +- All `any` types eliminated; codebase is fully strict-TypeScript compliant |
| 37 | + |
| 38 | +### Fixed |
| 39 | + |
| 40 | +- Windows multicast `EINVAL` error (`addMembership EINVAL`) caused by calling `addMembership` on the same group multiple times on the same socket |
| 41 | +- Missing `client` property on `TempControl` class that caused runtime failures when calling temperature methods |
| 42 | +- Discovery monitor incorrectly re-entering active state after idle timeout; transport option semantics clarified |
| 43 | +- m661 file list response parsing race: wider settlement window prevents intermittent empty-list returns on real hardware and emulators |
| 44 | + |
| 45 | +## [1.0.0] - 2025-11-15 |
| 46 | + |
| 47 | +### Added |
| 48 | + |
| 49 | +- `FiveMClient` — modern HTTP/JSON API client for Adventurer 5M and Adventurer 5M Pro |
| 50 | +- `FlashForgeClient` / `FlashForgeTcpClient` — legacy TCP G-code client base |
| 51 | +- `FlashForgePrinterDiscovery` — UDP multicast and broadcast discovery covering all FlashForge models |
| 52 | +- `Control`, `Files`, `Info`, `JobControl`, `TempControl` — modern API action classes for printer control |
| 53 | +- `Filament` — filament data accessor for modern printers |
| 54 | +- `GCodeController` — G-code command controller for legacy TCP printers |
| 55 | +- `GCodes`, `Commands`, `Endpoints` — G-code and HTTP API constant tables |
| 56 | +- `EndstopStatus`, `LocationInfo`, `PrintStatus`, `TempInfo`, `ThumbnailInfo` — TCP response parsers and models |
| 57 | +- `MachineInfo` — unified machine state model with AD5X material station support |
| 58 | +- `FNetCode`, `NetworkUtils` — network response code constants and HTTP utility helpers |
| 59 | +- `FFMachineInfo`, `FFPrinterDetail`, `MatlStationInfo`, `SlotInfo` — typed models for printer detail responses |
| 60 | +- AD5X material station support: `AD5XLocalJobParams`, `AD5XSingleColorJobParams`, `AD5XUploadParams`, `AD5XMaterialMapping` |
| 61 | +- `Product` enum for modern printer model identification |
| 62 | +- LED control for legacy TCP clients |
| 63 | +- Thumbnail fetching for legacy TCP clients via `getThumbnail` |
| 64 | +- GitHub Actions CI/CD workflow for automated publish to GitHub Package Registry |
| 65 | + |
| 66 | +### Fixed |
| 67 | + |
| 68 | +- Homing command (`G28`) incorrectly triggering a short timeout — extended to 15 s |
| 69 | +- M661 local file list response parsing rewritten to handle varied firmware delimiter patterns |
| 70 | +- `Commands` / `Endpoints` constant lookup inconsistencies on initial port |
| 71 | +- `FlashForgeTcpClient` shutdown race condition |
| 72 | +- AD5X job info parsing returning incomplete data |
| 73 | +- `NetworkUtils.isOk` usage corrected across response handlers |
| 74 | + |
| 75 | +[Unreleased]: https://github.com/GhostTypes/ff-5mp-api-ts/compare/v1.1.0...HEAD |
| 76 | +[1.1.0]: https://github.com/GhostTypes/ff-5mp-api-ts/compare/v1.0.0...v1.1.0 |
| 77 | +[1.0.0]: https://github.com/GhostTypes/ff-5mp-api-ts/releases/tag/v1.0.0 |
0 commit comments