getKeywordColor() indexed KEYWORD_COLORS with indexOf() result, which
returns -1 for types not present in currentKeywords (e.g. the
server-generated '其他' aggregate in typeDistribution). KEYWORD_COLORS[-1]
is undefined, so reading .wrapBg threw a TypeError when enabling
multi-color mode. Fall back to a stable keyword hash for unknown types.
The CLI tsup build inlines @openchatlab/node-runtime into dist chunks.
Both sqlite-vec and @huggingface/transformers load platform-specific
native packages at runtime (sqlite-vec-linux-arm64, onnxruntime-node,
sharp), so inlining them breaks global/npm and Docker installs of
chatlab-cli: the bundled chunks reference native packages that were
never installed, and configuring the semantic index vector model fails
with HTTP 500 (Cannot find package 'sqlite-vec-linux-arm64').
Declare both packages as chatlab-cli dependencies and mark them as tsup
external so they are installed from npm with their native bindings,
matching how better-sqlite3 and @node-rs/jieba are already handled.