Commit c069aa7f5 for llama.cpp

commit c069aa7f5f2beeead1a3a8e9f71510f1b64d0725
Author: Pascal <admin@serveurperso.com>
Date:   Sat Sep 12 07:38:50 2026 +0200

    server: frame the router child state command as a whole line (#28747)

    The child writes its state commands on stdout while the logger writes
    on stderr, and both share a single pipe. The logger emits the trailing
    color reset after the newline of a debug, warn or error entry, so that
    escape sequence has no newline of its own and the router reads it glued
    in front of the next command. The line prefix check then fails and the
    command is forwarded as a log line instead of being handled, which
    leaves a finished download stuck in the downloading state.

    Writing the command with a leading newline closes the pending line so
    it always starts at a line boundary.

diff --git a/tools/server/server-models.cpp b/tools/server/server-models.cpp
index f1783c083..4984f1be6 100644
--- a/tools/server/server-models.cpp
+++ b/tools/server/server-models.cpp
@@ -1786,7 +1786,10 @@ void server_child::notify_to_router(const std::string & state, const json & payl
     std::lock_guard<std::mutex> lk(mtx_stdout);
     common_log_pause(common_log_main());
     fflush(stdout);
-    fprintf(stdout, "%s%s\n", CMD_CHILD_TO_ROUTER_STATE, safe_json_to_str(data).c_str());
+    // the router matches the command on a line prefix, so the leading newline
+    // closes whatever the logger left open on the shared pipe, down to the
+    // trailing color reset that carries no newline of its own
+    fprintf(stdout, "\n%s%s\n", CMD_CHILD_TO_ROUTER_STATE, safe_json_to_str(data).c_str());
     fflush(stdout);
     common_log_resume(common_log_main());
 }