33.0.0 (2026-08-20)
- feat(client)!: fold the CNR session lifecycle onto CNR\Client (ec3e48d)
- feat(column)!: replace Column::$length with an interface-reachable getLength() (91e63ef)
- feat(response)!: extract Paginator (b84b7fb)
- feat(templates)!: split the Response factory off the template registry (22d65fb)
- fix(client)!: continue CNR pagination with the command that was sent (b50cd88)
- fix(response)!: stop treating pagination meta as column data (f86539c)
Bug Fixes
- translator: stop treating a literal "0" body as an empty response (af20745)
Features
- client: accept a pre-built SocketConfig at construction (31cc6f6)
- exception: give UnsupportedFeatureException structured context (53133d4)
BREAKING CHANGES
- CNR\Client::requestNextResponsePage() throws PaginationException when handed a Response it did not produce whose command carries a masked AUTH/PASSWORD, rather than putting the mask on the wire. A foreign Response with no sensitive command keys still continues as before.
See MIGRATION.md → v33.0.0
- CNIC\CNR\SessionClient and CNIC\CNR\SessionCapable are
removed, with no alias; ClientFactory::cnr() declares CNIC\CNR\Client as its
return type. Rename the type — the four session methods are unchanged in
signature and behaviour.
See MIGRATION.md → v33.0.0
- ResponseTemplateManagerInterface no longer declares
getTemplate(), getTemplates(), isTemplateMatchHash() or
isTemplateMatchPlain() — they moved to CNIC\ResponseTemplateFactoryInterface.
The concrete brand managers still answer all eight calls, so only
interface-typed handles are affected. The protected hook
AbstractResponseTemplateManager::createResponse() is renamed
createResponseFromTemplateId(), and getTemplates() resolves each entry by
id rather than by wire text.
See MIGRATION.md → v33.0.0
- Column::$length is removed; read the count through
ColumnInterface::getLength(). Anyone implementing ColumnInterface directly must
add the method.
See MIGRATION.md → v33.0.0
- getPagination() returns CNIC\Paginator, not
array<string,int|null> — call ->toArray() for the array. getCurrentPageNumber(),
getNextPageNumber(), getPreviousPageNumber(), getNumberOfPages(),
hasNextPage() and hasPreviousPage() are no longer on ResponseInterface or
AbstractResponse; reach them through getPagination().
See MIGRATION.md → v33.0.0
- getColumnKeys() no longer takes a bool; pagination and
status metadata is unreachable through getColumn()/getColumnIndex()/records;
the four pagination primitives answer null instead of standing in; an empty
list reports 0 records instead of 1, and IBS list rows no longer carry the
response status on row 0.
See MIGRATION.md → v33.0.0