|
1 | | -this update is mostly about migration tooling, better player resolution, and support/debug quality of life. |
2 | | -also had some internal cleanup and an important fix for velocity running in client mode. |
| 1 | +this update is the big architecture and API release. the entire codebase was modernized to java 21, |
| 2 | +a public developer API module was added, security was hardened, and the test suite was rebuilt from scratch. |
3 | 3 |
|
4 | 4 | so whats new: |
5 | 5 |
|
6 | | -- added `/cb dump` for support snapshots (sanitized upload + local file export) |
7 | | -- added `/cb migrate` to migrate script files to the current schema |
8 | | -- migration is script-only now. there was a short config migration path but that got reverted again |
9 | | -- added `player-arg` per command for `target-required` and `schedule-online` |
10 | | -- added remote uuid resolving between connected proxies (`RESOLVE_UUID`) + local `UserCache` + Mojang fallback |
11 | | -- added `OFFLINE_PLAYER` argument type with suggestions support |
12 | | -- reworked schedule-online / player tracking flow to be more reliable and added clearer warning logs when player resolution fails |
13 | | -- fixed double command descriptions in command registration output |
14 | | -- fixed velocity client mode startup crash (`ClassNotFoundException: org.bukkit.command.CommandSender`) |
| 6 | +**developer API** |
| 7 | + |
| 8 | +- added `api` module with a full public developer API for third-party plugins |
| 9 | +- typed message channels with target builder pattern, send, request, broadcast, and listen |
| 10 | +- delivery conditions on senders: `requirePlayer(UUID)` and `whenOnline(UUID)` for conditional and queued delivery |
| 11 | +- `whenOnline` queue with player join and disconnect lifecycle wiring on the proxy |
| 12 | +- server connect/disconnect event subscriptions via `onServerConnected` and `onServerDisconnected` |
| 13 | +- connection state tracking via `onConnectionStateChanged`, available on all platforms |
| 14 | +- player locator service for resolving which server a player is on (proxy only) |
| 15 | +- `CommandBridgeProvider.get()` and `CommandBridgeProvider.get(Class)` for obtaining the API instance |
| 16 | +- proxy-only methods return `Optional<Subscription>` instead of raw `Subscription`, returning `Optional.empty()` on backends |
| 17 | +- comprehensive JDK-style JavaDocs across all 13 API source files with usage examples, `@param`, `@return`, `@throws`, and cross-references |
| 18 | +- maven central publishing configuration |
| 19 | + |
| 20 | +**security** |
| 21 | + |
| 22 | +- hardened auth flow with constant-time HMAC comparison to prevent timing attacks |
| 23 | +- fixed `AUTH_OK` race condition where the server could send messages before the client processed auth success |
| 24 | +- added reconnect on failed server proof verification |
| 25 | +- removed wildcard permission grant in operator execution, only grants explicit permissions now |
| 26 | +- fixed concurrency issues in `CommandBridgeProvider`, `RateLimiter`, `InNode`, and `OutNode` |
| 27 | + |
| 28 | +**fixes** |
| 29 | + |
| 30 | +- fixed thread-safe script reload and session replacement notifications |
| 31 | +- fixed player join events firing for already-tracked players |
| 32 | +- fixed `WsEndpoint` send completion callback not propagating properly |
| 33 | +- fixed `ResponseAwaiter` to use UUID directly instead of string conversion |
| 34 | +- fixed cooldown being applied before dispatch instead of after |
| 35 | +- fixed MiniMessage tags in error messages not being escaped |
| 36 | +- fixed `PlaceholderStage` being recreated on every dispatch instead of reused |
| 37 | +- fixed polling not being reset on shutdown |
| 38 | +- fixed `serverId` overwrite guard missing in registration handler |
| 39 | +- fixed auth check missing on reload |
| 40 | +- fixed `Log` varargs handling for single-argument messages |
| 41 | +- fixed `UserCache` creating its own `ObjectMapper` instead of using `Envelope.MAPPER` |
| 42 | +- fixed `FoliaExecutor` duplicating logic from `PlatformExecutor` |
| 43 | +- fixed `RunAs.OPERATOR` resolution inconsistency across platform executors |
| 44 | +- fixed null guards missing in merge processor, command dispatcher, registration request, and player tracker |
| 45 | +- fixed config name not being passed to `ConfigManager` in the velocity backend adapter |
| 46 | +- left-aligned all Minecraft chat UI output and removed pixel-width centering |
| 47 | + |
| 48 | +**refactoring** |
| 49 | + |
| 50 | +- modernized entire codebase to java 21 idioms: records, sealed interfaces, pattern matching, switch expressions, `var`, `List.of()`, `Map.of()` |
| 51 | +- improved type safety across `OutNode`, `InNode`, and handler registration |
| 52 | +- redesigned public API from wrapper types to target builder pattern on `MessageChannel` |
| 53 | +- removed internal `RunAs` and `ConnectionState` duplicates in favor of the API types |
| 54 | +- deduplicated `FoliaExecutor` to inherit from `PlatformExecutor` |
| 55 | +- renamed `VelocityExecutor` to `LocalDispatcher` for clarity |
| 56 | +- extracted `ScheduleHandle` abstraction for platform adapters |
| 57 | +- added debug observability improvements throughout dispatch pipeline |
| 58 | + |
| 59 | +**testing** |
| 60 | + |
| 61 | +- deleted all existing AI-generated test files (22 files, ~233 methods) |
| 62 | +- rebuilt test suite from scratch with 136 tests across core (84), velocity (40), and backends (12) |
| 63 | +- added shared test fixtures: `TestEndpoint` and `ScriptFixtures` |
| 64 | +- covers: `AuthService`, `RateLimiter`, `CooldownManager`, `PlayerTracker`, `SessionHub`, `ConfigManager`, `SecretLoader`, `ResponseAwaiter`, `ProblemSink`, `PlaceholderExtractor`, `EnumAdapter`, `DurationAdapter`, validation processors, pipeline stages, command dispatcher, platform detection, and more |
| 65 | +- added `test.yml` CI workflow |
| 66 | +- added `TESTING.md` documentation |
15 | 67 |
|
16 | 68 | breaking changes: |
17 | | -- scripts now require `version: 4` |
18 | | -- older scripts must be migrated first |
19 | | -- internal runtime files moved into the `data/` subdirectory |
| 69 | +- the public API module is new and the channel/event interfaces may still evolve |
| 70 | +- internal `RunAs` and `ConnectionState` enums were removed, use the API types instead |
| 71 | +- `VelocityExecutor` was renamed to `LocalDispatcher` |
20 | 72 |
|
21 | | -latest commit: e951a9e |
| 73 | +latest commit: c624383 |
0 commit comments