fix(#103,#104): allowlist -thinking inheritance + JSON cascade pollution (v2.0.43)
#103: isModelAllowed auto-inherits between a base model and its
-thinking sibling on both allowlist and blocklist. Dashboard surfaces
base names; users had no obvious way to discover the -thinking variant
existed, so a "model_blocked" 403 on a name they never saw was a UX
trap. Other suffixes (-fast/-1m/-low|medium|high|xhigh/-mini/-nano/
-codex/-max-*) intentionally do NOT inherit — distinct entitlements.
#104: applyJsonResponseHint no longer appends to user-message content.
Earlier behavior added a long "[You MUST respond with valid JSON only ...]"
suffix to the latest user turn, which cascade upstream stored in the
conversation trajectory. Subsequent turns reusing the same cascade saw
that instruction and answered in JSON even when the new turn was a plain
greeting (claude-opus-4-7 returning {"reply":"你好"} for "你好"). Inject
ONLY a system message — authoritative for routing, regenerated per
request, never persisted to trajectory.
Also drops the now-dead appendJsonHintToContent helper and the
extractRequestedJsonKeys split-off-old-suffix defense.
Tests: 466 (+9 / 0 fail), suites 96 -> 97. D
dwgx committed
b24272a772b74f795e611ce8229db0ddda662c4c
Parent: 99ccc85