Bring GET /api/assets into param-for-param parity with the projected
openapi.yaml listAssets contract for the three remaining fields:
- Add display_name to the Asset response schema (nullable, mirrors name)
and populate it from ref.name in _build_asset_response, covering list,
get, create, update, and upload responses uniformly.
- Add the hash query param to ListAssetsQuery (named hash per the spec,
not asset_hash) with before-validation strip/lower normalization, and
thread it through list_assets_page -> list_references_page, filtering
both the page and count statements on Asset.hash for consistency.
- Accept include_public (bool, default true) for contract parity; it is
inert in core (no public asset pool) and intentionally not passed to
the service layer.
Cursor pagination and size optionality are untouched.
Add integration tests covering display_name mirroring, exact hash match,
unknown-hash empty page, and include_public acceptance.