88d07b5175
HandlePushToTalk and handleText hand-wrote the same eight-step turn sequence twice, comments in the latter saying "same as HandlePushToTalk" four times. Extract it into runTurn(ctx, text) string: the voice path wraps it in stt/tts, the text path returns it directly. The two had drifted. The text path was missing the quiet-hours toggle check entirely, so "тихий режим" over IPC/telegram fell through to the classifier; unifying gives it the check. It also logged the route result and applyAction return where the voice path did not — both logs are kept for both paths.