A kb.list row can arrive without a sensitivity (a claim/note, or older data);
SENSITIVITY[level] was then undefined and reading .tone crashed the whole
object list. Fall back to a neutral badge — never defaulting an unknown value
to "Open", which would misstate exposure. (Surfaced building the standalone
webapp against a real corpus.)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Both consumers (embedded + the coming standalone) need the same search UI and
paginated lists; keep them from diverging by owning both here.
- KnowledgeSearch (components-search.tsx): the search input + paginated results
panel, over an injected onSearch. Owns query/results/loading/error/clear and a
"Load more" for search results; renders the caller's `browse` content when
there is no active search. Replaces each app hand-rolling hit rendering.
- CollectionList: onLoadMore/hasMore/loadingMore (mirrors ObjectList), so a
paginated corpus list gets a load-more affordance.
Stacked on fix/kb-ui-p0 (ObjectList already gained load-more there). tsc clean.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>