f519954911
Rebases the UI line onto the released mainline: feat/2.7-ui starts from origin/main (2.6.0 + hotfix1 + hotfix2) and takes in all the UI work that accumulated on feat/2.6.0-ui — which had already merged feat/2.6.0, so the 2.6 feature work rides along in the same merge. Both sides forked before hotfix2, so the twelve conflicts are the same "mainline fixed it / the UI line rewrote it" files. Resolution rule: mainline wins on logic, the UI line wins on presentation and design tokens. - chat_service.py: mainline's interrupted-stream persistence plus the UI line's classified error payload. - redis_callback.py: mainline — the UI line still referenced the outer `node_id` inside the closure instead of its `one_node_id` parameter. - chatApi.ts: all three error fields (errorText, errorType, errorDetail). - useAiChat.ts / useAiChatSSE.ts: the UI line's 3-arg onError and classification payload, with mainline's localized connection-lost copy. - AiMessageBubble.tsx: mainline's rule that a partially streamed answer still renders, with the UI line's rich ChatErrorCard below it. - ContextChips.tsx / SaveAsButton.tsx: mainline — it unified the uploading/uploaded chip lists and added download-without-preview. - PlusMenu.tsx / WorkspacePanel.tsx: the UI line's semantic color tokens, kept together with mainline's icon choice and its no-flex-1 layout fix. - Roles.tsx: the UI line's extracted roleMenuSelection module (constants verified identical to mainline's inline copy). Housekeeping: froze mainline's lint violations (its branch carries no suppressions file), added the missing 11059 error copy in zh-Hans/en/ja, and guarded one optional-typed artifact preview callback. Both apps lint clean; platform typecheck clean; i18n parity clean. The six remaining client typecheck errors are byte-identical to main and predate this merge.